in webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java [262:406]
public void notify(EventContext<T> eventContext)
{
T event = eventContext.getEvent();
EventMetadata metadata = eventContext.getMetadata();
AbstractOwbBean<Object> component = (AbstractOwbBean<Object>) ownerBean;
if (!ownerBean.isEnabled())
{
return;
}
Object object = null;
List<ObserverParams> methodArgsMap = getMethodArguments(event, metadata);
BeanManagerImpl manager = ownerBean.getWebBeansContext().getBeanManagerImpl();
CreationalContextImpl<Object> creationalContext = manager.createCreationalContext(component);
if (metadata != null)
{
creationalContext.putInjectionPoint(metadata.getInjectionPoint());
creationalContext.putEventMetadata(metadata);
}
ObserverParams[] obargs = null;
try
{
Object[] args;
if (methodArgsMap == null)
{
args = new Object[]{event};
}
else
{
args = new Object[methodArgsMap.size()];
obargs = new ObserverParams[args.length];
obargs = methodArgsMap.toArray(obargs);
int i = 0;
for (ObserverParams param : obargs)
{
args[i++] = param.instance;
}
}
//Static or not
if (Modifier.isStatic(view.getModifiers()))
{
//Invoke Method
view.invoke(null, args);
}
else
{
Context context;
try
{
context = manager.getContext(component.getScope());
}
catch (ContextNotActiveException cnae)
{
if (ifExist)
{
return;
}
// this may happen if we try to e.g. send an event to a @ConversationScoped bean from a ServletListener
logger.log(Level.INFO, OWBLogConst.INFO_0010, ownerBean);
return;
}
// on Reception.IF_EXISTS: ignore this bean if a the contextual instance doesn't already exist
object = context.get(component);
if (ifExist && object == null)
{
return;
}
if (object == null)
{
object = context.get(component, creationalContext);
}
if (object == null)
{
// this might happen for EJB components.
Type t = component.getBeanClass();
// If the bean is an EJB, its beanClass may not be one of
// its types. Instead pick a local interface
if (component.getWebBeansType() == WebBeansType.ENTERPRISE)
{
t = (Type) component.getTypes().toArray()[0];
}
object = manager.getReference(component, t, creationalContext);
}
if (object != null)
{
if (Modifier.isPrivate(view.getModifiers()))
{
// since private methods cannot be intercepted, we have to unwrap any possible proxy
if (object instanceof OwbNormalScopeProxy)
{
object = getWebBeansContext().getInterceptorDecoratorProxyFactory().unwrapInstance(object);
}
}
//Invoke Method
invoke(object, args);
}
}
}
catch (InvocationTargetException ite)
{
throw new WebBeansException(ite.getCause());
}
catch (Exception e)
{
throw new WebBeansException(e);
}
finally
{
creationalContext.removeEventMetadata();
creationalContext.removeInjectionPoint();
//Destory bean instance
if (component.getScope().equals(Dependent.class) && object != null)
{
component.destroy(object, creationalContext);
}
//Destroy observer method dependent instances
if(methodArgsMap != null && obargs != null)
{
for(ObserverParams param : obargs)
{
if(param.isBean && param.bean.getScope().equals(Dependent.class))
{
param.bean.destroy(param.instance, param.creational);
}
}
}
}
}