Search in sources :

Example 1 with AroundConstructCallback

use of org.jboss.weld.construction.api.AroundConstructCallback in project core by weld.

the class ConstructorInterceptionInstantiator method registerAroundConstructCallback.

private void registerAroundConstructCallback(CreationalContextImpl<T> ctx, BeanManagerImpl manager) {
    final InterceptionContext interceptionContext = InterceptionContext.forConstructorInterception(model, ctx, manager, annotatedType);
    AroundConstructCallback<T> callback = new AroundConstructCallback<T>() {

        @Override
        public T aroundConstruct(final ConstructionHandle<T> handle, AnnotatedConstructor<T> constructor, Object[] parameters, Map<String, Object> data) {
            /*
                 * The AroundConstruct interceptor method can access the constructed instance using InvocationContext.getTarget
                 * method after the InvocationContext.proceed completes.
                 */
            final AtomicReference<T> target = new AtomicReference<T>();
            List<InterceptorMethodInvocation> chain = interceptionContext.buildInterceptorMethodInvocationsForConstructorInterception();
            InvocationContext invocationContext = new WeldInvocationContextImpl(constructor.getJavaMember(), parameters, data, chain, model.getMemberInterceptorBindings(getConstructor())) {

                @Override
                protected Object interceptorChainCompleted() throws Exception {
                    // all the interceptors were invoked, call the constructor now
                    T instance = handle.proceed(getParameters(), getContextData());
                    target.set(instance);
                    return null;
                }

                @Override
                public Object getTarget() {
                    return target.get();
                }
            };
            try {
                invocationContext.proceed();
            } catch (RuntimeException e) {
                throw e;
            } catch (Exception e) {
                throw new WeldException(e);
            }
            T instance = target.get();
            if (instance == null) {
                // CDI-598
                throw InterceptorLogger.LOG.targetInstanceNotCreated(constructor);
            }
            return instance;
        }
    };
    ctx.registerAroundConstructCallback(callback);
    ctx.setAroundConstructInterceptionContext(interceptionContext);
}
Also used : InterceptionContext(org.jboss.weld.interceptor.proxy.InterceptionContext) WeldException(org.jboss.weld.exceptions.WeldException) ConstructionHandle(org.jboss.weld.construction.api.ConstructionHandle) AtomicReference(java.util.concurrent.atomic.AtomicReference) WeldException(org.jboss.weld.exceptions.WeldException) AroundConstructCallback(org.jboss.weld.construction.api.AroundConstructCallback) AnnotatedConstructor(javax.enterprise.inject.spi.AnnotatedConstructor) InvocationContext(javax.interceptor.InvocationContext) WeldInvocationContextImpl(org.jboss.weld.interceptor.proxy.WeldInvocationContextImpl) Map(java.util.Map) InterceptorMethodInvocation(org.jboss.weld.interceptor.proxy.InterceptorMethodInvocation)

Aggregations

Map (java.util.Map)1 AtomicReference (java.util.concurrent.atomic.AtomicReference)1 AnnotatedConstructor (javax.enterprise.inject.spi.AnnotatedConstructor)1 InvocationContext (javax.interceptor.InvocationContext)1 AroundConstructCallback (org.jboss.weld.construction.api.AroundConstructCallback)1 ConstructionHandle (org.jboss.weld.construction.api.ConstructionHandle)1 WeldException (org.jboss.weld.exceptions.WeldException)1 InterceptionContext (org.jboss.weld.interceptor.proxy.InterceptionContext)1 InterceptorMethodInvocation (org.jboss.weld.interceptor.proxy.InterceptorMethodInvocation)1 WeldInvocationContextImpl (org.jboss.weld.interceptor.proxy.WeldInvocationContextImpl)1