[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