Search in sources :

Example 1 with ObjectMethodArguments

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;
}
Also used : ObjectPropertyNamedArgumentFinder(org.jdbi.v3.core.argument.internal.ObjectPropertyNamedArgumentFinder) MethodHandle(java.lang.invoke.MethodHandle) Arrays(java.util.Arrays) JdbiCaches(org.jdbi.v3.core.config.JdbiCaches) MethodHandles(java.lang.invoke.MethodHandles) HashMap(java.util.HashMap) JdbiCache(org.jdbi.v3.core.config.JdbiCache) Function(java.util.function.Function) Collectors(java.util.stream.Collectors) ConfigRegistry(org.jdbi.v3.core.config.ConfigRegistry) StatementContext(org.jdbi.v3.core.statement.StatementContext) Unchecked(org.jdbi.v3.core.internal.exceptions.Unchecked) Modifier(java.lang.reflect.Modifier) Map(java.util.Map) Optional(java.util.Optional) Qualifiers(org.jdbi.v3.core.qualifier.Qualifiers) QualifiedType(org.jdbi.v3.core.qualifier.QualifiedType) Method(java.lang.reflect.Method) TypedValue(org.jdbi.v3.core.argument.internal.TypedValue) Function(java.util.function.Function) HashMap(java.util.HashMap) Method(java.lang.reflect.Method) MethodHandle(java.lang.invoke.MethodHandle) TypedValue(org.jdbi.v3.core.argument.internal.TypedValue)

Example 2 with ObjectMethodArguments

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());
}
Also used : InputStreamArgument(org.jdbi.v3.core.argument.InputStreamArgument) NullArgument(org.jdbi.v3.core.argument.NullArgument) ObjectArgument(org.jdbi.v3.core.argument.ObjectArgument) Argument(org.jdbi.v3.core.argument.Argument) CharacterStreamArgument(org.jdbi.v3.core.argument.CharacterStreamArgument) ObjectMethodArguments(org.jdbi.v3.core.argument.ObjectMethodArguments)

Aggregations

MethodHandle (java.lang.invoke.MethodHandle)1 MethodHandles (java.lang.invoke.MethodHandles)1 Method (java.lang.reflect.Method)1 Modifier (java.lang.reflect.Modifier)1 Arrays (java.util.Arrays)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 Optional (java.util.Optional)1 Function (java.util.function.Function)1 Collectors (java.util.stream.Collectors)1 Argument (org.jdbi.v3.core.argument.Argument)1 CharacterStreamArgument (org.jdbi.v3.core.argument.CharacterStreamArgument)1 InputStreamArgument (org.jdbi.v3.core.argument.InputStreamArgument)1 NullArgument (org.jdbi.v3.core.argument.NullArgument)1 ObjectArgument (org.jdbi.v3.core.argument.ObjectArgument)1 ObjectMethodArguments (org.jdbi.v3.core.argument.ObjectMethodArguments)1 ObjectPropertyNamedArgumentFinder (org.jdbi.v3.core.argument.internal.ObjectPropertyNamedArgumentFinder)1 TypedValue (org.jdbi.v3.core.argument.internal.TypedValue)1 ConfigRegistry (org.jdbi.v3.core.config.ConfigRegistry)1 JdbiCache (org.jdbi.v3.core.config.JdbiCache)1