use of org.jdbi.v3.core.argument.ObjectMethodArguments in project jdbi by jdbi.
the class ObjectMethodArguments method load.
private static Map<String, Function<Object, TypedValue>> load(ConfigRegistry config, Class<?> type) {
final HashMap<String, Function<Object, TypedValue>> methodMap = new HashMap<>();
if (Modifier.isPublic(type.getModifiers())) {
Arrays.stream(type.getMethods()).filter(m -> m.getParameterCount() == 0).collect(Collectors.toMap(Method::getName, Function.identity(), ObjectMethodArguments::bridgeMethodMerge)).forEach((name, method) -> {
QualifiedType<?> qualifiedType = QualifiedType.of(method.getGenericReturnType()).withAnnotations(config.get(Qualifiers.class).findFor(method));
MethodHandle mh = Unchecked.function(MethodHandles.lookup()::unreflect).apply(method);
methodMap.put(name, Unchecked.function(value -> new TypedValue(qualifiedType, mh.invoke(value))));
});
} else {
Optional.ofNullable(type.getSuperclass()).ifPresent(superclass -> methodMap.putAll(load(config, superclass)));
Arrays.stream(type.getInterfaces()).forEach(interfaceClass -> methodMap.putAll(load(config, interfaceClass)));
}
return methodMap;
}
use of org.jdbi.v3.core.argument.ObjectMethodArguments in project jdbi by jdbi.
the class SqlStatement method bindMethodsList.
/**
* For each value given, create a tuple by invoking each given method in order, and bind the tuple into
* a {@code VALUES (...)} format insert clause.
* @param key attribute name
* @param values list of values that will be comma-spliced into the defined attribute value
* @param methodNames list of methods that will be invoked on the values
* @return this
* @throws IllegalArgumentException if the list of values or properties is empty.
* @throws UnableToCreateStatementException if the method cannot be found
*/
public final This bindMethodsList(String key, Iterable<?> values, List<String> methodNames) {
final Iterator<?> valueIter = values.iterator();
if (!valueIter.hasNext()) {
throw new IllegalArgumentException(getClass().getSimpleName() + ".bindMethodsList was called with no values.");
}
if (methodNames.isEmpty()) {
throw new IllegalArgumentException(getClass().getSimpleName() + ".bindMethodsList was called with no values.");
}
final StringBuilder names = new StringBuilder();
final StatementContext ctx = getContext();
for (int valueIndex = 0; valueIter.hasNext(); valueIndex++) {
if (valueIndex > 0) {
names.append(',');
}
final Object bean = valueIter.next();
final ObjectMethodArguments beanMethods = new ObjectMethodArguments(null, bean);
names.append('(');
for (int methodIndex = 0; methodIndex < methodNames.size(); methodIndex++) {
if (methodIndex > 0) {
names.append(',');
}
final String methodName = methodNames.get(methodIndex);
final String name = key + valueIndex + '.' + methodName;
names.append(':').append(name);
final Argument argument = beanMethods.find(methodName, ctx).orElseThrow(() -> new UnableToCreateStatementException("Unable to get " + methodName + " argument for " + bean, ctx));
bind(name, argument);
}
names.append(')');
}
return define(key, names.toString());
}
Aggregations