[jboss-svn-commits] JBL Code SVN: r24654 - in labs/jbossesb/trunk/product: rosetta/src/org/jboss/soa/esb/util and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Jan 12 16:56:52 EST 2009


Author: beve
Date: 2009-01-12 16:56:52 -0500 (Mon, 12 Jan 2009)
New Revision: 24654

Added:
   labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/listeners/message/BeanConfigActionProcessorUnitTest.java
   labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/listeners/message/TestAction.java
   labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/listeners/message/TestAction2.java
Modified:
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/message/ActionBeanConfigurator.java
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/message/BeanConfigActionProcessor.java
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/util/BeanConfigurator.java
   labs/jbossesb/trunk/product/samples/quickstarts/custom_action/src/org/jboss/soa/esb/samples/quickstart/customaction/CustomBeanConfigAction.java
Log:
Work for https://jira.jboss.org/jira/browse/JBESB-2267 "Enable BeanConfiguredActions to have configuration information injected"


Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/message/ActionBeanConfigurator.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/message/ActionBeanConfigurator.java	2009-01-12 16:23:58 UTC (rev 24653)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/message/ActionBeanConfigurator.java	2009-01-12 21:56:52 UTC (rev 24654)
@@ -26,6 +26,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.jboss.internal.soa.esb.assertion.AssertArgument;
 import org.jboss.soa.esb.helpers.ConfigTree;
 import org.jboss.soa.esb.helpers.KeyValuePair;
 import org.jboss.soa.esb.listeners.ListenerTagNames;
@@ -48,15 +49,32 @@
 	private static final List<String> ignored = Arrays.asList("action",
 			ListenerTagNames.ACTION_ELEMENT_TAG,
 			ListenerTagNames.ACTION_CLASS_TAG,
+			ListenerTagNames.LISTENER_CLASS_TAG,
 			ListenerTagNames.PROCESS_METHOD_TAG);
-
+	
+	private static final Map<String, String> optionalFields = getOptionalFieldsMap();
+	
 	/**
 	 * @param config
 	 * @param bean
 	 */
 	ActionBeanConfigurator(ConfigTree config, Object bean) {
+	    AssertArgument.isNotNull(config, "config");
+	    
 		setBean(bean);
 		List<KeyValuePair> pairs = config.attributesAsList();
+		
+		ConfigTree parent = config.getParent();
+		if (parent != null)  {
+    		List<KeyValuePair> parentAttributes = parent.attributesAsList();
+    		for (KeyValuePair attr : parentAttributes)  {
+    		    String newKeyName = optionalFields.get(attr.getKey());
+    		    if (newKeyName != null) {
+    		        pairs.add(new KeyValuePair(newKeyName, attr.getValue()));
+    		    }
+            }
+		}
+		
 		Map<String, String> properties = new HashMap<String, String>();
 		for (KeyValuePair kvp : pairs) {
 			if (!ignored.contains(kvp.getKey())) {
@@ -68,5 +86,26 @@
 			properties.put(child.getName(), child.toXml());
 		}
 		setProperties(properties);
+		setOptionalFields(optionalFields.values());
 	}
+
+
+    /**
+     * Maps configuration tag names to java field names. Some of the configuration
+     * names have '-' in them. This map contains the configuration names as its 
+     * keys and the java field name as its value.
+     * 
+     * @return Map<String, String> Map of configuration names to java bean names(field names).
+     */
+    static Map<String, String> getOptionalFieldsMap()
+    {
+        Map<String, String> map = new HashMap<String, String>();
+        map.put(ListenerTagNames.SERVICE_CATEGORY_NAME_TAG, "serviceCategory");
+        map.put(ListenerTagNames.SERVICE_NAME_TAG, "serviceName");
+        map.put(ListenerTagNames.SERVICE_DESCRIPTION_TAG, "serviceDescription");
+        map.put(ListenerTagNames.MAX_THREADS_TAG, "maxThreads");
+        map.put(ListenerTagNames.MEP_ATTRIBUTE_TAG, "mep");
+        return map;
+    }
+	
 }

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/message/BeanConfigActionProcessor.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/message/BeanConfigActionProcessor.java	2009-01-12 16:23:58 UTC (rev 24653)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/message/BeanConfigActionProcessor.java	2009-01-12 21:56:52 UTC (rev 24654)
@@ -23,6 +23,7 @@
 
 import java.lang.reflect.Constructor;
 
+import org.jboss.internal.soa.esb.assertion.AssertArgument;
 import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.soa.esb.actions.ActionLifecycleException;
 import org.jboss.soa.esb.actions.ActionPipelineProcessor;
@@ -49,8 +50,10 @@
 	 * @param actionClass The action class.
 	 * @throws ConfigurationException for errors during configuration.
 	 */
-	BeanConfigActionProcessor(final ConfigTree config, final Class actionClass)
-			throws ConfigurationException {
+	BeanConfigActionProcessor(final ConfigTree config, final Class actionClass) throws ConfigurationException {
+	    AssertArgument.isNotNull(config, "config");
+	    AssertArgument.isNotNull(actionClass, "actionClass");
+	    
 		this.config = config;
 		try {
 			this.constructor = actionClass.getConstructor();

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/util/BeanConfigurator.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/util/BeanConfigurator.java	2009-01-12 16:23:58 UTC (rev 24653)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/util/BeanConfigurator.java	2009-01-12 21:56:52 UTC (rev 24654)
@@ -28,6 +28,8 @@
 import java.beans.PropertyEditor;
 import java.beans.PropertyEditorManager;
 import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -57,6 +59,13 @@
 	private Object bean;
 
 	private Map<String, String> properties;
+	
+	/**
+	 * Optional fields that may be specified in the bean class but are
+	 * optional and will not cause an exception to be thrown if they 
+	 * don't exist in the bean class.
+	 */
+	private Collection<String> optionalFields = new ArrayList<String>();
 
 	public BeanConfigurator() {
 		super();
@@ -86,10 +95,15 @@
 			key = Introspector.decapitalize(key);
 			PropertyDescriptor descriptor = getPropertyDescriptor(key);
 			if (descriptor == null) {
-				throw new IllegalArgumentException("'" + key
-						+ "' property not found on " + beanClass.getName());
+			    if (optionalFields.contains(key)) {
+			        // just ignore optional fields.
+			        continue;
+			    }
+				throw new IllegalArgumentException("'" + key + "' property not found on " + beanClass.getName());
 			}
-			setProperty(descriptor, key, entry.getValue());
+			else {
+    			setProperty(descriptor, key, entry.getValue());
+			}
 		}
 	}
 
@@ -158,4 +172,16 @@
 	public void setProperties(Map<String, String> properties) {
 		this.properties = properties;
 	}
+	
+	/**
+	 * Fields that will not cause an exception to be thrown if 
+	 * they are missing in the bean class but exist in the configuration.
+	 * This was added to support fields like 'service-category' which can
+	 * now exist in a bean class.
+	 * 
+	 * @param optionalFields List of field names that can be specified in a bean class.
+	 */
+	public void setOptionalFields(Collection<String> optionalFields) {
+		this.optionalFields = optionalFields;
+	}
 }
\ No newline at end of file

Added: labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/listeners/message/BeanConfigActionProcessorUnitTest.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/listeners/message/BeanConfigActionProcessorUnitTest.java	                        (rev 0)
+++ labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/listeners/message/BeanConfigActionProcessorUnitTest.java	2009-01-12 21:56:52 UTC (rev 24654)
@@ -0,0 +1,116 @@
+/*
+ * JBoss, Home of Professional Open Source Copyright 2009, Red Hat Middleware
+ * LLC, and individual contributors 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.soa.esb.listeners.message;
+
+import static org.junit.Assert.*;
+import junit.framework.JUnit4TestAdapter;
+
+import org.jboss.soa.esb.ConfigurationException;
+import org.jboss.soa.esb.actions.ActionProcessingException;
+import org.jboss.soa.esb.helpers.ConfigTree;
+import org.jboss.soa.esb.message.Message;
+import org.jboss.soa.esb.message.format.MessageFactory;
+import org.junit.Test;
+
+/**
+ * Test for {@link BeanConfigActionProcessor}.
+ * 
+ * @author <a href="mailto:dbevenius at jboss.com">Daniel Bevenius</a>
+ *
+ */
+public class BeanConfigActionProcessorUnitTest
+{
+    @Test (expected = IllegalArgumentException.class)
+    public void constructorNullConfig() throws ConfigurationException
+    {
+        new BeanConfigActionProcessor(null, getClass());
+    }
+    
+    @Test (expected = IllegalArgumentException.class)
+    public void constructorNullActionClass() throws ConfigurationException
+    {
+        new BeanConfigActionProcessor(new ConfigTree("test"), null);
+    }
+    
+    @Test
+    public void processActionClass() throws ActionProcessingException, ConfigurationException
+    {
+        Class<?> actionClass = TestAction2.class;
+        ConfigTree actionConfig = createActionConfig(actionClass.getName());
+        Message processedMsg = process(actionConfig, actionClass);
+        
+        TestAction2 testAction = (TestAction2) processedMsg.getBody().get();
+        assertEquals("Daniel", testAction.getFirstName());
+    }
+    
+    @Test
+    public void processActionClassWithServiceInformation() throws ActionProcessingException, ConfigurationException
+    {
+        Class<?> actionClass = TestAction.class;
+        ConfigTree actionConfig = createConfig(actionClass.getName());
+        Message processedMsg = process(actionConfig, actionClass);
+        
+        TestAction testAction = (TestAction) processedMsg.getBody().get();
+        assertEquals("Daniel", testAction.getFirstName());
+        assertEquals("TestCategory", testAction.getServiceCategory());
+        assertEquals("TestService", testAction.getServiceName());
+    }
+    
+    private Message process(final ConfigTree config, final Class<?> actionClass) throws ConfigurationException, ActionProcessingException
+    {
+        BeanConfigActionProcessor processor = new BeanConfigActionProcessor(config, actionClass);
+        Message message = MessageFactory.getInstance().getMessage();
+        return processor.process(message);
+    }
+    
+    private ConfigTree createConfig(final String actionClass)
+    {
+        ConfigTree serviceConfig = new ConfigTree("listener");
+        serviceConfig.setAttribute("listener-class", "org.jboss.soa.esb.listeners.message.MessageAwareListener");
+        serviceConfig.setAttribute("max-threads", "1");
+        serviceConfig.setAttribute("mep", "OneWay");
+        serviceConfig.setAttribute("name", "JMS-ESBListener");
+        serviceConfig.setAttribute("service-category", "TestCategory");
+        serviceConfig.setAttribute("service-name", "TestService");
+        serviceConfig.setAttribute("service-description", "Some description of the service");
+        return createActionConfig(actionClass, serviceConfig);
+    }
+    
+    private ConfigTree createActionConfig(final String actionClass)
+    {
+        return createActionConfig(actionClass, null);
+    }
+    
+    private ConfigTree createActionConfig(final String actionClass, final ConfigTree parent)
+    {
+        ConfigTree actionConfig = parent == null ? new ConfigTree("action") : new ConfigTree("action", parent);
+        actionConfig.setAttribute("action", "testAction");
+        actionConfig.setAttribute("class", actionClass);
+        actionConfig.setAttribute("firstName", "Daniel");
+        return actionConfig;
+    }
+    
+    public static junit.framework.Test suite()
+    {
+        return new JUnit4TestAdapter(BeanConfigActionProcessorUnitTest.class);
+    }
+
+}

Added: labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/listeners/message/TestAction.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/listeners/message/TestAction.java	                        (rev 0)
+++ labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/listeners/message/TestAction.java	2009-01-12 21:56:52 UTC (rev 24654)
@@ -0,0 +1,60 @@
+package org.jboss.soa.esb.listeners.message;
+
+import org.jboss.soa.esb.actions.BeanConfiguredAction;
+import org.jboss.soa.esb.message.Message;
+
+public class TestAction implements BeanConfiguredAction
+{
+    private String firstName;
+    
+    private String serviceCategory;
+    
+    private String serviceName;
+    
+    public TestAction()
+    {
+    }
+    
+    public Message process(final Message message)
+    {
+        message.getBody().add(this);
+        return message;
+    }
+
+    public String getServiceName()
+    {
+        return serviceName;
+    }
+
+    public void setServiceName(String serviceName)
+    {
+        this.serviceName = serviceName;
+    }
+
+    public String getServiceCategory()
+    {
+        return serviceCategory;
+    }
+
+    public void setServiceCategory(String serviceCategory)
+    {
+        this.serviceCategory = serviceCategory;
+    }
+
+    public String getFirstName()
+    {
+        return firstName;
+    }
+
+    public void setFirstName(String name)
+    {
+        this.firstName = name;
+    }
+    
+    @Override
+    public String toString()
+    {
+        return "TestAction [firstName=" + firstName + ", serviceCategory=" + serviceCategory + ", serviceName=" + serviceName + "]";
+    }
+
+}

Added: labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/listeners/message/TestAction2.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/listeners/message/TestAction2.java	                        (rev 0)
+++ labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/listeners/message/TestAction2.java	2009-01-12 21:56:52 UTC (rev 24654)
@@ -0,0 +1,30 @@
+package org.jboss.soa.esb.listeners.message;
+
+import org.jboss.soa.esb.actions.BeanConfiguredAction;
+import org.jboss.soa.esb.message.Message;
+
+public class TestAction2 implements BeanConfiguredAction
+{
+    private String firstName;
+    
+    public TestAction2()
+    {
+    }
+    
+    public Message process(final Message message)
+    {
+        message.getBody().add(this);
+        return message;
+    }
+
+    public String getFirstName()
+    {
+        return firstName;
+    }
+
+    public void setFirstName(String name)
+    {
+        this.firstName = name;
+    }
+    
+}

Modified: labs/jbossesb/trunk/product/samples/quickstarts/custom_action/src/org/jboss/soa/esb/samples/quickstart/customaction/CustomBeanConfigAction.java
===================================================================
--- labs/jbossesb/trunk/product/samples/quickstarts/custom_action/src/org/jboss/soa/esb/samples/quickstart/customaction/CustomBeanConfigAction.java	2009-01-12 16:23:58 UTC (rev 24653)
+++ labs/jbossesb/trunk/product/samples/quickstarts/custom_action/src/org/jboss/soa/esb/samples/quickstart/customaction/CustomBeanConfigAction.java	2009-01-12 21:56:52 UTC (rev 24654)
@@ -33,6 +33,10 @@
     private String information;
 
 	private Integer repeatCount;
+
+	private String serviceCategory;
+
+	private String serviceName;
 
 	public void setInformation(String information) {
            this.information = information;
@@ -43,10 +47,21 @@
 	}
 	
 	public Message process(Message message) throws ActionProcessingException {
-	  System.out.println("Repeat message: " + information + " " + repeatCount + " times:");
+	  System.out.println("[" + serviceCategory + ":" + serviceName + "] Repeat message: " + information + " " + repeatCount + " times:");
       for (int i=0; i < repeatCount; i++) {
           System.out.println(information);
       } 
       return message;
 	}	
-}
\ No newline at end of file
+
+	public void setServiceCategory(final String serviceCategory)
+    {
+		this.serviceCategory = serviceCategory;
+	}
+
+	public void setServiceName(final String serviceName)
+    {
+		this.serviceName = serviceName;
+	}
+		
+}




More information about the jboss-svn-commits mailing list