Package org.jboss.ejb3.async.impl.interceptor

Source Code of org.jboss.ejb3.async.impl.interceptor.AsynchronousInterceptorFactory

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;
   }
}
TOP

Related Classes of org.jboss.ejb3.async.impl.interceptor.AsynchronousInterceptorFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.