package org.jboss.ejb3.async.impl.interceptor;
import org.jboss.aop.Advisor;
import org.jboss.ejb3.EJBContainer;
import org.jboss.logging.Logger;
import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
import org.jboss.metadata.ejb.jboss.JBossSessionBean31MetaData;
import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
import org.jboss.metadata.ejb.jboss.jndipolicy.plugins.JBossSessionPolicyDecorator;
import org.jboss.metadata.ejb.spec.AsyncMethodsMetaData;
/**
* Factory to create instances of the {@link AsynchronousInterceptor}.
* Only to be used in scope PER_CLASS
*
* @author <a href="mailto:andrew.rubinger@jboss.org">ALR</a>
*/
public class AsynchronousInterceptorFactory extends CreatePerClassAspectFactory
{
// --------------------------------------------------------------------------------||
// Class Members ------------------------------------------------------------------||
// --------------------------------------------------------------------------------||
/**
* Logger
*/
private static final Logger log = Logger.getLogger(AsynchronousInterceptorFactory.class);
// --------------------------------------------------------------------------------||
// Required Implementations -------------------------------------------------------||
// --------------------------------------------------------------------------------||
/**
* {@inheritDoc}
* @see org.jboss.aop.advice.AspectFactory#createPerClass(org.jboss.aop.Advisor)
*/
public Object createPerClass(final Advisor advisor)
{
// Get the container
final EJBContainer container = EJBContainer.getEJBContainer(advisor);
// Get the metadata
final JBossEnterpriseBeanMetaData md = container.getXml();
// Create the interceptor instance
AsyncMethodsMetaData asyncMethods = this.getAsyncMethods(md);
if (asyncMethods == null)
{
asyncMethods = new AsyncMethodsMetaData();
}
final Object interceptor = new AsynchronousClientInterceptor(asyncMethods);
return interceptor;
}
/**
* Obtains the Asynchronous methods associated with this metadata, if any
* @param md
* @return
*/
private AsyncMethodsMetaData getAsyncMethods(final JBossEnterpriseBeanMetaData md)
{
// Declare async methods
AsyncMethodsMetaData asyncMethods = new AsyncMethodsMetaData();
// If not a Session Bean, no async methods
if (!md.isSession())
{
return asyncMethods;
}
// Get the SessionBean metadata
JBossSessionBeanMetaData session = (JBossSessionBeanMetaData) md;
if (md instanceof JBossSessionPolicyDecorator)
{
// We obtain these as wrapped in a JNDI Policy decorator, so unwrap 'em
// HACK, but this is going to be throwaway code anyway when we rework EJB3 Core.
@SuppressWarnings("unchecked")
final JBossSessionPolicyDecorator<JBossSessionBeanMetaData> policy = (JBossSessionPolicyDecorator<JBossSessionBeanMetaData>) md;
// Get the real Session Bean Metadata
session = policy.getDelegate();
}
// If EJB 3.1
if (session instanceof JBossSessionBean31MetaData)
{
final JBossSessionBean31MetaData session31 = (JBossSessionBean31MetaData) session;
asyncMethods = session31.getAsyncMethods();
if (asyncMethods == null)
{
asyncMethods = new AsyncMethodsMetaData();
}
}
// Return
return asyncMethods;
}
}