[jboss-svn-commits] JBL Code SVN: r27112 - labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/src/org/jboss/internal/soa/esb/dependencies.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jun 24 07:24:53 EDT 2009


Author: kevin.conner at jboss.com
Date: 2009-06-24 07:24:53 -0400 (Wed, 24 Jun 2009)
New Revision: 27112

Added:
   labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/src/org/jboss/internal/soa/esb/dependencies/JCAInflowAdapter.java
   labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/src/org/jboss/internal/soa/esb/dependencies/JCAInflowAdapterMBean.java
Log:
Add support for generic JCA inflow: JBESB-2638

Copied: labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/src/org/jboss/internal/soa/esb/dependencies/JCAInflowAdapter.java (from rev 27070, labs/jbossesb/workspace/jbpm_inflow/product/rosetta/src/org/jboss/internal/soa/esb/dependencies/JCAInflowAdapter.java)
===================================================================
--- labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/src/org/jboss/internal/soa/esb/dependencies/JCAInflowAdapter.java	                        (rev 0)
+++ labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/src/org/jboss/internal/soa/esb/dependencies/JCAInflowAdapter.java	2009-06-24 11:24:53 UTC (rev 27112)
@@ -0,0 +1,373 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.internal.soa.esb.dependencies;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Map.Entry;
+
+import org.apache.log4j.Logger;
+import org.jboss.soa.esb.listeners.jca.ActivationBridge;
+import org.jboss.soa.esb.listeners.jca.EndpointContainer;
+import org.jboss.soa.esb.listeners.jca.EndpointFactory;
+import org.jboss.soa.esb.listeners.jca.JBoss42ActivationBridge;
+import org.jboss.system.ServiceMBeanSupport;
+
+/**
+ * Provide generic JCA inflow adapter functionality.
+ *
+ * Initialises a JCA inflow activation and adapts onto the required interface.
+ *
+ * @author <a href="kevin.conner at jboss.com">Kevin Conner</a>
+ */
+public class JCAInflowAdapter extends ServiceMBeanSupport implements JCAInflowAdapterMBean
+{
+    private static final Logger LOGGER = Logger.getLogger(JCAInflowAdapter.class) ;
+    
+    /**
+     * Optional messaging interface, will try to determine if not specified.
+     */
+    private String messagingInterface;
+    /**
+     * The name of the bean driven by the inflow.
+     */
+    private String beanType;
+    /**
+     * The name of the JCA resource adapter.
+     */
+    private String adapter;
+    /**
+     * Optional flag indicating whether deliver is transactional.
+     */
+    private boolean isTransacted = true;
+    /**
+     * Optional name of activation bridge, defaults to ESB JBoss42ActivationBridge.
+     */
+    private String activationBridge;
+    /**
+     * Activation specification properties.
+     */
+    private Properties activationSpec ;
+    /**
+     * Optional description for message inflow.
+     */
+    private String description ;
+    /**
+     * Activation bridge.
+     */
+    private ActivationBridge bridge ;
+    
+    /**
+     * Set the messaging interface.
+     * @param messagingInterface The name of the messaging interface.
+     */
+    public void setMessagingInterface(final String messagingInterface)
+    {
+        this.messagingInterface = messagingInterface ;
+    }
+    
+    /**
+     * Get the messaging interface.
+     * @return The name of the messaging interface or null if not set.
+     */
+    public String getMessagingInterface()
+    {
+        return messagingInterface ;
+    }
+    
+    /**
+     * Set the type of the inflow bean.
+     * @param beanType The type of the inflow bean.
+     */
+    public void setBeanType(final String beanType)
+    {
+        this.beanType = beanType ;
+    }
+    
+    /**
+     * Get the type of the inflow bean.
+     * @return The type of the inflow bean.
+     */
+    public String getBeanType()
+    {
+        return beanType ;
+    }
+    
+    /**
+     * Set the name of the JCA resource adapter.
+     * @param adapter The JCA resource adapter.
+     */
+    public void setAdapter(final String adapter)
+    {
+        this.adapter = adapter ;
+    }
+    
+    /**
+     * Get the name of the JCA resource adapter.
+     * @return The JCA resource adapter.
+     */
+    public String getAdapter()
+    {
+        return adapter ;
+    }
+    
+    /**
+     * Set the transacted flag.
+     * @param isTransacted true if the delivery is transacted, false otherwise.
+     */
+    public void setIsTransacted(final boolean isTransacted)
+    {
+        this.isTransacted = isTransacted ;
+    }
+    
+    /**
+     * Get the transacted flag.
+     * @return true if the delivery is transacted, false otherwise.
+     */
+    public boolean getIsTransacted()
+    {
+        return isTransacted ;
+    }
+    
+    /**
+     * Set the name of the activation bridge.
+     * @param activationBridge The name of the activation bridge.
+     */
+    public void setActivationBridge(final String activationBridge)
+    {
+        this.activationBridge = activationBridge ;
+    }
+    
+    /**
+     * Get the name of the activation bridge.
+     * @return The name of the activation bridge or null if not set.
+     */
+    public String getActivationBridge()
+    {
+        return activationBridge ;
+    }
+    
+    /**
+     * Set the activation specification properties.
+     * @param activationSpec The activation specification properties.
+     */
+    public void setActivationSpec(final Properties activationSpec)
+    {
+        this.activationSpec = activationSpec ;
+    }
+    
+    /**
+     * Get the activation specification properties.
+     * @return The activation specification properties.
+     */
+    public Properties getActivationSpec()
+    {
+        return activationSpec ;
+    }
+    
+    /**
+     * Set the description for the message inflow.
+     * @param description The description for the message inflow.
+     */
+    public void setDescription(final String description)
+    {
+        this.description = description ;
+    }
+    
+    /**
+     * Get the description for the message inflow.
+     * @return The description for the message inflow or null if not set.
+     */
+    public String getDescription()
+    {
+        return description ;
+    }
+    
+    /**
+     * Create the inflow service.
+     */
+    @Override
+    protected void createService()
+        throws Exception
+    {
+        final ClassLoader classLoader = Thread.currentThread().getContextClassLoader() ;
+        
+        if (beanType == null)
+        {
+            throw new IllegalArgumentException("BeanType must be specified") ;
+        }
+        if (adapter == null)
+        {
+            throw new IllegalArgumentException("Adapter name must be specified") ;
+        }
+        if (activationSpec == null)
+        {
+            throw new IllegalArgumentException("Activation specification properties must be specified") ;
+        }
+        
+        final Class<?> beanClass = classLoader.loadClass(beanType) ;
+        final Class<?> messagingClass ;
+        if (messagingInterface != null)
+        {
+            messagingClass = classLoader.loadClass(messagingInterface) ;
+        }
+        else
+        {
+            messagingClass = findMessagingClass(beanClass) ;
+        }
+        
+        if (activationBridge != null)
+        {
+            bridge = (ActivationBridge)classLoader.loadClass(activationBridge).newInstance() ;
+        }
+        else
+        {
+            bridge = new JBoss42ActivationBridge() ;
+        }
+        
+        final Object bean = beanClass.newInstance() ;
+        
+        final String inflowDescription ;
+        if (description != null)
+        {
+            inflowDescription = description ;
+        }
+        else
+        {
+            inflowDescription = "Message Inflow" ;
+        }
+        
+        final String inflowAdapter = adapter ;
+        final boolean transacted = isTransacted ;
+        
+        final EndpointContainer container = new EndpointContainer() {
+           public String getDescription()
+           {
+              return inflowDescription + " jca adapter: " + inflowAdapter;
+           }
+           
+           public Object invoke(final Method method, final Object[] args)
+               throws Throwable
+           {
+              try
+              {
+                 return method.invoke(bean, args);
+              }
+              catch (final IllegalAccessException iae)
+              {
+                 throw new RuntimeException(iae) ;
+              }
+              catch (final InvocationTargetException ite)
+              {
+                 throw ite.getTargetException() ;
+              }
+           }
+           
+           public boolean isDeliveryTransacted(final Method method)
+               throws NoSuchMethodException
+           {
+              return transacted ;
+           }
+        };
+        
+        final Map<String, String> activationProperties = getActivationProperties() ;
+        
+        final EndpointFactory mef = new EndpointFactory();
+        mef.setContainer(container);
+        mef.setLoader(classLoader);
+        mef.setMessagingType(messagingClass);
+        mef.start();
+        bridge.setActivationProperties(activationProperties);
+        bridge.setAdapter(adapter);
+        bridge.setMessageEndpointFactory(mef);
+        bridge.setMessagingTypeClass(messagingClass);
+        
+        if (LOGGER.isDebugEnabled())
+        {
+            LOGGER.debug("Created JCA Inflow bridge " + getServiceName() +  ", messagingClass: " + messagingClass + ", bean: " + bean + ", activationProperties: " + activationProperties) ;
+        }
+    }
+
+    /**
+     * Start the inflow service.
+     */
+    @Override
+    protected void startService()
+        throws Exception
+    {
+        bridge.activate() ;
+    }
+    
+    /**
+     * Stop the inflow service.
+     */
+    @Override
+    protected void stopService()
+        throws Exception
+    {
+        bridge.deactivate() ;
+    }
+    
+    /**
+     * Try to guess the type of the inflow messaging class.
+     * @param clazz The class type of the bean.
+     * @return the messaging type or null if unable to determin.
+     * @throws IllegalArgumentException if bean type has multiple interfaces.
+     */
+    private Class<?> findMessagingClass(final Class<?> clazz)
+    {
+       if (clazz.equals(Object.class))
+       {
+           throw new IllegalArgumentException("Unable to guess MessagingClass interface, specify this explicity") ;
+       }
+       
+       final Class<?>[] interfaces = clazz.getInterfaces() ;
+       Class<?> type = null ;
+       for (Class<?> intf : interfaces)
+       {
+          if (type != null)
+          {
+             throw new IllegalArgumentException("Unable to guess MessagingClass interface as the base class implements too many interfaces, specify this explicity") ;
+          }
+          type = intf ;
+       }
+       if (type == null)
+       {
+           type = findMessagingClass(clazz.getSuperclass()) ;
+       }
+       return type ;
+    }
+    
+    private Map<String, String> getActivationProperties()
+    {
+        final Map<String, String> activationProperties = new HashMap<String, String>() ;
+        for (Entry<Object, Object> entry : activationSpec.entrySet())
+        {
+            activationProperties.put(entry.getKey().toString(), entry.getValue().toString()) ;
+        }
+        
+        return activationProperties ;
+    }
+}

Copied: labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/src/org/jboss/internal/soa/esb/dependencies/JCAInflowAdapterMBean.java (from rev 27070, labs/jbossesb/workspace/jbpm_inflow/product/rosetta/src/org/jboss/internal/soa/esb/dependencies/JCAInflowAdapterMBean.java)
===================================================================
--- labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/src/org/jboss/internal/soa/esb/dependencies/JCAInflowAdapterMBean.java	                        (rev 0)
+++ labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/src/org/jboss/internal/soa/esb/dependencies/JCAInflowAdapterMBean.java	2009-06-24 11:24:53 UTC (rev 27112)
@@ -0,0 +1,120 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.internal.soa.esb.dependencies;
+
+import java.util.Properties;
+
+import org.jboss.system.ServiceMBean;
+
+/**
+ * Provide generic JCA inflow adapter functionality.
+ *
+ * Initialises a JCA inflow activation and adapts onto the required interface.
+ *
+ * @author <a href="kevin.conner at jboss.com">Kevin Conner</a>
+ */
+public interface JCAInflowAdapterMBean extends ServiceMBean
+{
+    /**
+     * Set the messaging interface.
+     * @param messagingInterface The name of the messaging interface.
+     */
+    public void setMessagingInterface(final String messagingInterface) ;
+    
+    /**
+     * Get the messaging interface.
+     * @return The name of the messaging interface or null if not set.
+     */
+    public String getMessagingInterface() ;
+    
+    /**
+     * Set the type of the inflow bean.
+     * @param beanType The type of the inflow bean.
+     */
+    public void setBeanType(final String beanType) ;
+    
+    /**
+     * Get the type of the inflow bean.
+     * @return The type of the inflow bean.
+     */
+    public String getBeanType() ;
+    
+    /**
+     * Set the name of the JCA resource adapter.
+     * @param adapter The JCA resource adapter.
+     */
+    public void setAdapter(final String adapter) ;
+    
+    /**
+     * Get the name of the JCA resource adapter.
+     * @return The JCA resource adapter.
+     */
+    public String getAdapter() ;
+    
+    /**
+     * Set the transacted flag.
+     * @param isTransacted true if the delivery is transacted, false otherwise.
+     */
+    public void setIsTransacted(final boolean isTransacted) ;
+    
+    /**
+     * Get the transacted flag.
+     * @return true if the delivery is transacted, false otherwise.
+     */
+    public boolean getIsTransacted() ;
+    
+    /**
+     * Set the name of the activation bridge.
+     * @param activationBridge The name of the activation bridge.
+     */
+    public void setActivationBridge(final String activationBridge) ;
+    
+    /**
+     * Get the name of the activation bridge.
+     * @return The name of the activation bridge or null if not set.
+     */
+    public String getActivationBridge() ;
+    
+    /**
+     * Set the activation specification properties.
+     * @param activationSpec The activation specification properties.
+     */
+    public void setActivationSpec(final Properties properties) ;
+    
+    /**
+     * Get the activation specification properties.
+     * @return The activation specification properties.
+     */
+    public Properties getActivationSpec() ;
+    
+    /**
+     * Set the description for the message inflow.
+     * @param description The description for the message inflow.
+     */
+    public void setDescription(final String description) ;
+    
+    /**
+     * Get the description for the message inflow.
+     * @return The description for the message inflow or null if not set.
+     */
+    public String getDescription() ;
+}




More information about the jboss-svn-commits mailing list