use of org.jboss.weld.interceptor.proxy.InterceptorMethodInvocation in project core by weld.
the class InterceptorImpl method intercept.
@Override
public Object intercept(InterceptionType type, T instance, final InvocationContext ctx) {
final org.jboss.weld.interceptor.spi.model.InterceptionType interceptionType = org.jboss.weld.interceptor.spi.model.InterceptionType.valueOf(type.name());
final List<InterceptorMethodInvocation> methodInvocations = interceptorMetadata.getInterceptorInvocation(instance, interceptionType).getInterceptorMethodInvocations();
Set<Annotation> interceptorBindings = null;
if (ctx instanceof org.jboss.weld.interceptor.WeldInvocationContext) {
interceptorBindings = Reflections.<org.jboss.weld.interceptor.WeldInvocationContext>cast(ctx).getInterceptorBindings();
}
try {
/*
* Calling Interceptor.intercept() may result in multiple interceptor method invocations (provided the interceptor class interceptor methods on
* superclasses). This requires cooperation with InvocationContext.
*
* We use a wrapper InvocationContext for the purpose of executing the chain of interceptor methods of this interceptor.
*/
return new WeldInvocationContextImpl(ctx, methodInvocations, interceptorBindings, null).proceed();
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new WeldException(e);
}
}
use of org.jboss.weld.interceptor.proxy.InterceptorMethodInvocation 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);
}
Aggregations