[jboss-svn-commits] JBL Code SVN: r29511 - labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/config/mappers120.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Sep 30 05:44:27 EDT 2009


Author: kevin.conner at jboss.com
Date: 2009-09-30 05:44:26 -0400 (Wed, 30 Sep 2009)
New Revision: 29511

Modified:
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/config/mappers120/JmsListenerMapper.java
Log:
Add support for ActivationMapper: JBESB-2860

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/config/mappers120/JmsListenerMapper.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/config/mappers120/JmsListenerMapper.java	2009-09-30 08:42:09 UTC (rev 29510)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/config/mappers120/JmsListenerMapper.java	2009-09-30 09:44:26 UTC (rev 29511)
@@ -21,16 +21,16 @@
 
 package org.jboss.soa.esb.listeners.config.mappers120;
 
-import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
-import javax.jms.Queue;
-import javax.jms.Topic;
-
 import org.apache.log4j.Logger;
 import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.soa.esb.addressing.eprs.JMSEpr;
+import org.jboss.soa.esb.common.ModulePropertyManager;
 import org.jboss.soa.esb.dom.YADOMUtil;
 import org.jboss.soa.esb.listeners.ListenerTagNames;
 import org.jboss.soa.esb.listeners.config.xbeanmodel120.JmsProviderType;
@@ -43,14 +43,17 @@
 import org.jboss.soa.esb.listeners.config.xbeanmodel120.PropertyDocument.Property;
 import org.jboss.soa.esb.listeners.gateway.JmsGatewayListener;
 import org.jboss.soa.esb.listeners.gateway.PackageJmsMessageContents;
+import org.jboss.soa.esb.listeners.jca.ActivationMapper;
 import org.jboss.soa.esb.listeners.jca.JcaConstants;
 import org.jboss.soa.esb.listeners.jca.JcaGatewayListener;
 import org.jboss.soa.esb.listeners.jca.JcaJMSInflowMessageProcessorAdapter;
 import org.jboss.soa.esb.listeners.jca.JcaJMSMessageAwareComposer;
 import org.jboss.soa.esb.listeners.jca.JcaMessageAwareListener;
+import org.jboss.soa.esb.util.ClassUtil;
 import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
 
+import com.arjuna.common.util.propertyservice.PropertyManager;
+
 /**
  * Performs the mapping of a <jms-listener> XSD based configuration to the "ConfigTree"
  * style configuration, adding the "ConfigTree" listener config to the "root" node.
@@ -58,6 +61,8 @@
  * @author <a href="mailto:tom.fennelly at jboss.com">tom.fennelly at jboss.com</a>
  */
 public class JmsListenerMapper {
+	// The default JMS JCA adapter.
+	private static final String DEFAULT_JMS_ADAPTER = "jms-ra.rar" ;
 
 	@SuppressWarnings("unused")
 	private static Logger log = Logger.getLogger( JmsListenerMapper.class );
@@ -99,7 +104,7 @@
 		final Class<?> gatewayClass ;
 		if (provider instanceof JmsJcaProvider) {
 		    final JmsJcaProvider jmsJcaProvider = (JmsJcaProvider)provider ;
-                    mapJmsJcaAttributes(listener, listenerNode, jmsJcaProvider, messageFilter) ;
+                    mapJmsJcaAttributes(listener, listenerNode, bus, jmsJcaProvider, messageFilter) ;
 		    gatewayClass = JcaGatewayListener.class ;
 		} else {
 		    gatewayClass = JmsGatewayListener.class ;
@@ -158,20 +163,12 @@
 		toElement.setAttribute(JMSEpr.TRANSACTED_TAG, Boolean.toString( messageFilter.getTransacted()));
 	}
 
-    /*
-     * @throws ConfigurationException is one of the following activation-config
-     * properties are overridden:
-     * 	- destination
-     * 	- destinationType
-     * 	- messageSelector
-     * 	- maxMessages
-     */
     private static void mapJmsJcaAttributes(final JmsListener listener,
-        final Element listenerNode, final JmsJcaProvider jmsJcaProvider,
+        final Element listenerNode, final JmsBus bus, final JmsJcaProvider jmsJcaProvider,
         final JmsMessageFilter messageFilter)
         throws ConfigurationException {
         setAttribute(listenerNode, JcaConstants.ATTRIBUTE_ADAPTER,
-            jmsJcaProvider.getAdapter(), "jms-ra.rar") ;
+            jmsJcaProvider.getAdapter(), DEFAULT_JMS_ADAPTER) ;
         setAttribute(listenerNode, JcaConstants.ATTRIBUTE_ENDPOINT_CLASS,
             jmsJcaProvider.getEndpointClass(), JcaJMSInflowMessageProcessorAdapter.class.getName()) ;
         setAttribute(listenerNode, JcaConstants.ATTRIBUTE_MESSAGING_TYPE,
@@ -206,36 +203,35 @@
                 JcaJMSMessageAwareComposer.class.getName()) ;
         }
 
-        final Element activationConfigElement = YADOMUtil.addElement(listenerNode, JcaConstants.ELEMENT_ACTIVATION_CONFIG) ;
-         addPropertyElement(activationConfigElement, "destination", messageFilter.getDestName()) ;
-        if (jmsJcaProvider.isSetProviderAdapterJNDI())
-        {
-            addPropertyElement(activationConfigElement, "providerAdapterJNDI", jmsJcaProvider.getProviderAdapterJNDI()) ;
-        }
+        final ActivationMapper activationMapper = getActivationMapper(listener, bus, jmsJcaProvider) ;
+        final Map<String, String> activationConfigValues = new HashMap<String, String>() ;
+        activationMapper.setDestination(activationConfigValues, messageFilter.getDestName()) ;
+        activationMapper.setProviderAdapterJNDI(activationConfigValues, jmsJcaProvider.getProviderAdapterJNDI()) ;
         final int destType = messageFilter.getDestType().intValue() ;
         if (destType == DestType.INT_QUEUE)
         {
-            addPropertyElement(activationConfigElement, "destinationType", Queue.class.getName()) ;
+            activationMapper.setDestinationType(activationConfigValues, true) ;
         }
         else if (destType == DestType.INT_TOPIC)
         {
-            addPropertyElement(activationConfigElement, "destinationType", Topic.class.getName()) ;
+            activationMapper.setDestinationType(activationConfigValues, false) ;
         }
         else
         {
             throw new ConfigurationException("Unknown destination type: " + messageFilter.getDestType()) ;
         }
 
-        if (messageFilter.getSelector() != null)
+        activationMapper.setMessageSelector(activationConfigValues, messageFilter.getSelector()) ;
+        final Integer maxThreads = (listener.isSetMaxThreads() ? new Integer(listener.getMaxThreads()) : null) ;
+        activationMapper.setMaxThreads(activationConfigValues, maxThreads) ;
+        
+        final Element activationConfigElement = YADOMUtil.addElement(listenerNode, JcaConstants.ELEMENT_ACTIVATION_CONFIG) ;
+        for(Map.Entry<String, String> entry: activationConfigValues.entrySet())
         {
-            addPropertyElement(activationConfigElement, "messageSelector", messageFilter.getSelector()) ;
+            addPropertyElement(activationConfigElement, entry.getKey(), entry.getValue()) ;
         }
-        if (listener.getMaxThreads() > 0)
-        {
-            addPropertyElement(activationConfigElement, "maxMessages", Integer.toString(listener.getMaxThreads())) ;
-        }
 
-		final List<String> defaultPropertyNames = getDefaultActivationConfigNames( activationConfigElement );
+		final Set<String> defaultPropertyNames = activationConfigValues.keySet() ;
 		log.debug("Default activation-config properties :" + defaultPropertyNames );
 
 		/*
@@ -256,16 +252,6 @@
         }
     }
 
-    private static List<String> getDefaultActivationConfigNames(final Element activationConfigElement )
-    {
-		NodeList defaultActivationProperties = activationConfigElement.getElementsByTagName( "property" );
-		final List<String> defaultPropertyNames = new ArrayList<String>(5);
-		for (int i = defaultActivationProperties.getLength() ; i-->0 ; )
-			defaultPropertyNames.add(defaultActivationProperties.item( i ).getAttributes().getNamedItem( "name" ).getNodeValue() );
-
-		return defaultPropertyNames;
-    }
-
     private static void setAttribute(final Element listenerNode,
         final String name, final String value)
     {
@@ -296,4 +282,85 @@
         propertyElement.setAttribute("name", name) ;
         propertyElement.setAttribute("value", value) ;
     }
+
+    private static ActivationMapper getActivationMapper(final JmsListener listener,
+        final JmsBus bus, final JmsJcaProvider jmsJcaProvider)
+        throws ConfigurationException
+    {
+        final String activationMapper = getActivationMapperClass(listener, bus, jmsJcaProvider); ;
+        if (activationMapper == null)
+        {
+            throw new ConfigurationException("Could not locate ActivationMapper for adapter " + jmsJcaProvider.getAdapter()) ;
+        }
+        final Class activationMapperClass ;
+        try
+        {
+            activationMapperClass = ClassUtil.forName(activationMapper.trim(), JmsListenerMapper.class) ;
+        }
+        catch (final ClassNotFoundException cnfe)
+        {
+            throw new ConfigurationException("Could not locate activation mapper class " + activationMapper, cnfe) ;
+        }
+        
+        if (!ActivationMapper.class.isAssignableFrom(activationMapperClass))
+        {
+            throw new ConfigurationException("Activation mapper class " + activationMapper + " does not implement ActivationMapper interface") ;
+        }
+        try
+        {
+            return (ActivationMapper)(activationMapperClass.newInstance()) ;
+        }
+        catch (final Throwable th)
+        {
+            throw new ConfigurationException("Failed to instantiate activation mapper class " + activationMapper, th) ;
+        }
+    }
+    
+    private static String getActivationMapperClass(final JmsListener listener,
+        final JmsBus bus, final JmsJcaProvider jmsJcaProvider)
+        throws ConfigurationException
+    {
+        final String listenerActivationMapper = findProperty(listener.getPropertyList(), ListenerTagNames.JCA_ACTIVATION_MAPPER) ;
+        if (listenerActivationMapper != null)
+        {
+            return listenerActivationMapper ;
+        }
+        
+        final String busActivationMapper = findProperty(bus.getPropertyList(), ListenerTagNames.JCA_ACTIVATION_MAPPER) ;
+        if (busActivationMapper != null)
+        {
+            return busActivationMapper ;
+        }
+        
+        final String providerActivationMapper = findProperty(jmsJcaProvider.getPropertyList(), ListenerTagNames.JCA_ACTIVATION_MAPPER) ;
+        if (providerActivationMapper != null)
+        {
+            return providerActivationMapper ;
+        }
+        
+        final String adapter = (jmsJcaProvider.getAdapter() == null ? DEFAULT_JMS_ADAPTER : jmsJcaProvider.getAdapter()) ;
+        
+        final PropertyManager propertyManager = ModulePropertyManager.getPropertyManager(ModulePropertyManager.JCA_MODULE);
+        final String activationMapper = propertyManager.getProperty("org.jboss.soa.esb.jca.activation.mapper." + adapter) ;
+        if (activationMapper == null)
+        {
+            throw new ConfigurationException("Could not locate activation mapper for adapter " + adapter) ;
+        }
+        return activationMapper ;
+    }
+    
+    private static String findProperty(final List<Property> properties, final String name)
+    {
+        if ((properties != null) && (name != null))
+        {
+            for(Property property: properties)
+            {
+                if (name.equals(property.getName()))
+                {
+                    return property.getValue() ;
+                }
+            }
+        }
+        return null ;
+    }
 }
\ No newline at end of file



More information about the jboss-svn-commits mailing list