public AbstractMemberProducer(EnhancedAnnotatedMember<T, ? super X, ? extends Member> enhancedMember, DisposalMethod<?, ?> disposalMethod) { this.disposalMethod = disposalMethod; checkDeclaringBean(); checkProducerReturnType(enhancedMember); }
private void checkReturnTypeForWildcardsAndTypeVariables(EnhancedAnnotatedMember<T, ? super X, ? extends Member> enhancedMember, Type type, boolean isParameterizedType) { if (type instanceof TypeVariable<?>) { if (isParameterizedType) { if (!isDependent()) { throw producerWithParameterizedTypeWithTypeVariableBeanTypeMustBeDependent(enhancedMember); } } else { throw producerWithInvalidTypeVariable(enhancedMember); } } else if (type instanceof WildcardType) { throw producerWithInvalidWildcard(enhancedMember); } else if (type instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) type; for (Type parameterType : parameterizedType.getActualTypeArguments()) { checkReturnTypeForWildcardsAndTypeVariables(enhancedMember, parameterType, true); } } else if (type instanceof GenericArrayType) { GenericArrayType arrayType = (GenericArrayType) type; checkReturnTypeForWildcardsAndTypeVariables(enhancedMember, arrayType.getGenericComponentType(), false); } }
/** * Gets the receiver of the product. The two creational contexts need to be separated because the receiver only serves the product * creation (it is not a dependent instance of the created instance). * * @param productCreationalContext the creational context of the produced instance * @param receiverCreationalContext the creational context of the receiver * @return The receiver */ protected Object getReceiver(CreationalContext<?> productCreationalContext, CreationalContext<?> receiverCreationalContext) { // This is a bit dangerous, as it means that producer methods can end up // executing on partially constructed instances. Also, it's not required // by the spec... if (getAnnotated().isStatic()) { return null; } else { if (productCreationalContext instanceof WeldCreationalContext<?>) { WeldCreationalContext<?> creationalContextImpl = (WeldCreationalContext<?>) productCreationalContext; final Object incompleteInstance = creationalContextImpl.getIncompleteInstance(getDeclaringBean()); if (incompleteInstance != null) { BeanLogger.LOG.circularCall(getAnnotated(), getDeclaringBean()); return incompleteInstance; } } return getBeanManager().getReference(getDeclaringBean(), null, receiverCreationalContext, true); } }
protected void checkDeclaringBean() { if (getDeclaringBean() == null && !getAnnotated().isStatic()) { throw BeanLogger.LOG.declaringBeanMissing(getAnnotated()); } }
@Override public T produce(CreationalContext<T> ctx) { CreationalContext<X> receiverCreationalContext = getReceiverCreationalContext(ctx); Object receiver = getReceiver(ctx, receiverCreationalContext); try { return produce(receiver, ctx); } finally { receiverCreationalContext.release(); } }
private boolean isInjectedIntoDisposer(Bean<?> bean, Collection<Bean<?>> beans) { for (Bean<?> producerCandidate : beans) { if (producerCandidate instanceof AbstractProducerBean) { AbstractProducerBean<?, ?, ?> producerBean = cast(producerCandidate); if (producerBean.getProducer() instanceof AbstractMemberProducer<?, ?>) { AbstractMemberProducer<?, ?> producer = Reflections.<AbstractMemberProducer<?, ?>> cast(producerBean.getProducer()); if (producer.getDisposalMethod() != null) { BeanManager beanManager = getBeanManager(bean); for (InjectionPoint injectionPoint : producer.getDisposalMethod().getInjectionPoints()) { if (bean.equals(beanManager.resolve(beanManager.getBeans(injectionPoint.getType(), injectionPoint.getQualifiers().toArray(new Annotation[injectionPoint.getQualifiers().size()]))))) { return true; } } } } } } return false; }
public AnnotatedParameter<T> getAnnotatedDisposedParameter() { checkWithinObserverNotification(); if (getBean().getProducer() instanceof AbstractMemberProducer<?, ?>) { AbstractMemberProducer<?, ?> producer = (AbstractMemberProducer<?, ?>) getBean().getProducer(); if (producer.getDisposalMethod() != null) { return cast(producer.getDisposalMethod().getDisposesParameter()); } } return null; } }
public void dispose(T instance) { if (disposalMethod != null) { // CreationalContext is only created if we need it to obtain the receiver // MethodInvocationStrategy takes care of creating CC for parameters, if needed if (disposalMethod.getAnnotated().isStatic()) { disposalMethod.invokeDisposeMethod(null, instance, null); } else { WeldCreationalContext<X> ctx = null; try { Object receiver = ContextualInstance.getIfExists(getDeclaringBean(), getBeanManager()); if (receiver == null) { ctx = getBeanManager().createCreationalContext(null); // Create child CC so that a dependent reciever may be destroyed after the disposer method completes receiver = ContextualInstance.get(getDeclaringBean(), getBeanManager(), ctx.getCreationalContext(getDeclaringBean())); } if (receiver != null) { disposalMethod.invokeDisposeMethod(receiver, instance, ctx); } } finally { if (ctx != null) { ctx.release(); } } } } }
private CreationalContext<X> getReceiverCreationalContext(CreationalContext<T> ctx) { if(ctx instanceof WeldCreationalContext) { return ((WeldCreationalContext<?>)ctx).getProducerReceiverCreationalContext(getDeclaringBean()); } else { return getBeanManager().createCreationalContext(getDeclaringBean()); } }
@Override public String toString() { StringBuilder result = new StringBuilder("Producer for "); if (getDeclaringBean() == null) { result.append(getAnnotated()); } else { if (getBean() == null) { result.append(getAnnotated()); } else { result.append(getBean()); } result.append(" declared on ").append(getDeclaringBean()); } return result.toString(); } }
if (producerBean.getProducer() instanceof AbstractMemberProducer<?, ?>) { AbstractMemberProducer<?, ?> producer = (AbstractMemberProducer<?, ?>) producerBean.getProducer(); if (producer.getDisposalMethod() == null) {
protected void checkProducerReturnType(EnhancedAnnotatedMember<T, ? super X, ? extends Member> enhancedMember) { checkReturnTypeForWildcardsAndTypeVariables(enhancedMember, enhancedMember.getBaseType(), false); }
private boolean isInjectedIntoDisposer(Bean<?> bean, Collection<Bean<?>> beans) { for (Bean<?> producerCandidate : beans) { if (producerCandidate instanceof AbstractProducerBean) { AbstractProducerBean<?, ?, ?> producerBean = cast(producerCandidate); if (producerBean.getProducer() instanceof AbstractMemberProducer<?, ?>) { AbstractMemberProducer<?, ?> producer = Reflections.<AbstractMemberProducer<?, ?>> cast(producerBean.getProducer()); if (producer.getDisposalMethod() != null) { BeanManager beanManager = getBeanManager(bean); for (InjectionPoint injectionPoint : producer.getDisposalMethod().getInjectionPoints()) { if (bean.equals(beanManager.resolve(beanManager.getBeans(injectionPoint.getType(), injectionPoint.getQualifiers().toArray(new Annotation[injectionPoint.getQualifiers().size()]))))) { return true; } } } } } } return false; }
public AnnotatedParameter<T> getAnnotatedDisposedParameter() { checkWithinObserverNotification(); if (getBean().getProducer() instanceof AbstractMemberProducer<?, ?>) { AbstractMemberProducer<?, ?> producer = (AbstractMemberProducer<?, ?>) getBean().getProducer(); if (producer.getDisposalMethod() != null) { return cast(producer.getDisposalMethod().getDisposesParameter()); } } return null; } }
public void dispose(T instance) { if (disposalMethod != null) { // CreationalContext is only created if we need it to obtain the receiver // MethodInvocationStrategy takes care of creating CC for parameters, if needed if (disposalMethod.getAnnotated().isStatic()) { disposalMethod.invokeDisposeMethod(null, instance, null); } else { WeldCreationalContext<X> ctx = null; try { Object receiver = ContextualInstance.getIfExists(getDeclaringBean(), getBeanManager()); if (receiver == null) { ctx = getBeanManager().createCreationalContext(null); // Create child CC so that a dependent reciever may be destroyed after the disposer method completes receiver = ContextualInstance.get(getDeclaringBean(), getBeanManager(), ctx.getCreationalContext(getDeclaringBean())); } if (receiver != null) { disposalMethod.invokeDisposeMethod(receiver, instance, ctx); } } finally { if (ctx != null) { ctx.release(); } } } } }
protected void checkDeclaringBean() { if (getDeclaringBean() == null && !getAnnotated().isStatic()) { throw BeanLogger.LOG.declaringBeanMissing(getAnnotated()); } }
private CreationalContext<X> getReceiverCreationalContext(CreationalContext<T> ctx) { if(ctx instanceof WeldCreationalContext) { return ((WeldCreationalContext<?>)ctx).getProducerReceiverCreationalContext(getDeclaringBean()); } else { return getBeanManager().createCreationalContext(getDeclaringBean()); } }
@Override public T produce(CreationalContext<T> ctx) { CreationalContext<X> receiverCreationalContext = getReceiverCreationalContext(ctx); Object receiver = getReceiver(ctx, receiverCreationalContext); try { return produce(receiver, ctx); } finally { receiverCreationalContext.release(); } }
@Override public String toString() { StringBuilder result = new StringBuilder("Producer for "); if (getDeclaringBean() == null) { result.append(getAnnotated()); } else { if (getBean() == null) { result.append(getAnnotated()); } else { result.append(getBean()); } result.append(" declared on ").append(getDeclaringBean()); } return result.toString(); } }