Search in sources :

Example 1 with Handlers

use of org.jdbi.v3.sqlobject.Handlers in project jdbi by jdbi.

the class SqlObjectFactory method attach.

/**
 * Create a sql object of the specified type bound to this handle. Any state changes to the handle, or the sql
 * object, such as transaction status, closing it, etc, will apply to both the object and the handle.
 *
 * @param extensionType the type of sql object to create
 * @param handle the Handle instance to attach ths sql object to
 * @return the new sql object bound to this handle
 */
@Override
public <E> E attach(Class<E> extensionType, HandleSupplier handle) {
    Map<Method, Handler> handlers = methodHandlersFor(extensionType, handle.getConfig(Handlers.class), handle.getConfig(HandlerDecorators.class));
    ConfigRegistry instanceConfig = handle.getConfig().createCopy();
    for (Class<?> iface : extensionType.getInterfaces()) {
        forEachConfigurer(iface, (configurer, annotation) -> configurer.configureForType(instanceConfig, annotation, extensionType));
    }
    forEachConfigurer(extensionType, (configurer, annotation) -> configurer.configureForType(instanceConfig, annotation, extensionType));
    InvocationHandler invocationHandler = createInvocationHandler(extensionType, instanceConfig, handlers, handle);
    return extensionType.cast(Proxy.newProxyInstance(extensionType.getClassLoader(), new Class[] { extensionType }, invocationHandler));
}
Also used : ConfigRegistry(org.jdbi.v3.core.config.ConfigRegistry) InvocationHandler(java.lang.reflect.InvocationHandler) ExtensionMethod(org.jdbi.v3.core.extension.ExtensionMethod) Method(java.lang.reflect.Method) InvocationHandler(java.lang.reflect.InvocationHandler)

Example 2 with Handlers

use of org.jdbi.v3.sqlobject.Handlers in project jdbi by jdbi.

the class SqlObjectFactory method methodHandlersFor.

private Map<Method, Handler> methodHandlersFor(Class<?> sqlObjectType, Handlers registry, HandlerDecorators decorators) {
    return handlersCache.computeIfAbsent(sqlObjectType, type -> {
        final Map<Method, Handler> handlers = new HashMap<>();
        handlers.putAll(handlerEntry((t, a, h) -> sqlObjectType.getName() + '@' + Integer.toHexString(t.hashCode()), Object.class, "toString"));
        handlers.putAll(handlerEntry((t, a, h) -> t == a[0], Object.class, "equals", Object.class));
        handlers.putAll(handlerEntry((t, a, h) -> System.identityHashCode(t), Object.class, "hashCode"));
        handlers.putAll(handlerEntry((t, a, h) -> h.getHandle(), SqlObject.class, "getHandle"));
        try {
            handlers.putAll(handlerEntry((t, a, h) -> null, sqlObjectType, "finalize"));
        }// optional implementation
         catch (IllegalStateException expected) {
        }
        for (Method method : sqlObjectType.getMethods()) {
            handlers.computeIfAbsent(method, m -> buildMethodHandler(sqlObjectType, m, registry, decorators));
        }
        return handlers;
    });
}
Also used : ExtensionMethod(org.jdbi.v3.core.extension.ExtensionMethod) HandleSupplier(org.jdbi.v3.core.extension.HandleSupplier) Arrays(java.util.Arrays) Proxy(java.lang.reflect.Proxy) ConfiguringAnnotation(org.jdbi.v3.sqlobject.config.ConfiguringAnnotation) HashMap(java.util.HashMap) ConfigRegistry(org.jdbi.v3.core.config.ConfigRegistry) Stream(java.util.stream.Stream) Collections.synchronizedMap(java.util.Collections.synchronizedMap) Map(java.util.Map) Annotation(java.lang.annotation.Annotation) BiConsumer(java.util.function.BiConsumer) ExtensionFactory(org.jdbi.v3.core.extension.ExtensionFactory) InvocationHandler(java.lang.reflect.InvocationHandler) Configurer(org.jdbi.v3.sqlobject.config.Configurer) Method(java.lang.reflect.Method) Collections(java.util.Collections) WeakHashMap(java.util.WeakHashMap) AnnotatedElement(java.lang.reflect.AnnotatedElement) HashMap(java.util.HashMap) WeakHashMap(java.util.WeakHashMap) InvocationHandler(java.lang.reflect.InvocationHandler) ExtensionMethod(org.jdbi.v3.core.extension.ExtensionMethod) Method(java.lang.reflect.Method)

Aggregations

InvocationHandler (java.lang.reflect.InvocationHandler)2 Method (java.lang.reflect.Method)2 ConfigRegistry (org.jdbi.v3.core.config.ConfigRegistry)2 ExtensionMethod (org.jdbi.v3.core.extension.ExtensionMethod)2 Annotation (java.lang.annotation.Annotation)1 AnnotatedElement (java.lang.reflect.AnnotatedElement)1 Proxy (java.lang.reflect.Proxy)1 Arrays (java.util.Arrays)1 Collections (java.util.Collections)1 Collections.synchronizedMap (java.util.Collections.synchronizedMap)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 WeakHashMap (java.util.WeakHashMap)1 BiConsumer (java.util.function.BiConsumer)1 Stream (java.util.stream.Stream)1 ExtensionFactory (org.jdbi.v3.core.extension.ExtensionFactory)1 HandleSupplier (org.jdbi.v3.core.extension.HandleSupplier)1 Configurer (org.jdbi.v3.sqlobject.config.Configurer)1 ConfiguringAnnotation (org.jdbi.v3.sqlobject.config.ConfiguringAnnotation)1