You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by lh...@apache.org on 2008/09/22 14:42:33 UTC
svn commit: r697797 - in
/servicemix/components/bindings/servicemix-jms/trunk/src:
main/java/org/apache/servicemix/jms/endpoints/
test/java/org/apache/servicemix/jms/
Author: lhein
Date: Mon Sep 22 05:42:33 2008
New Revision: 697797
URL: http://svn.apache.org/viewvc?rev=697797&view=rev
Log:
applied patch for SM-1586 provided by Łukasz Dywicki - many thanks to Łukasz
Added:
servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/AbstractJmsMarshaler.java (with props)
Modified:
servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java
servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java
servicemix/components/bindings/servicemix-jms/trunk/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java
servicemix/components/bindings/servicemix-jms/trunk/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java
Added: servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/AbstractJmsMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/AbstractJmsMarshaler.java?rev=697797&view=auto
==============================================================================
--- servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/AbstractJmsMarshaler.java (added)
+++ servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/AbstractJmsMarshaler.java Mon Sep 22 05:42:33 2008
@@ -0,0 +1,178 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.jms.endpoints;
+
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Set;
+
+import javax.jbi.messaging.NormalizedMessage;
+import javax.jms.JMSException;
+import javax.jms.Message;
+
+/**
+ * A usefull base class for marshalers.
+ *
+ * @author Åukasz Dywicki <a href="ldywicki@pocztowy.pl">email</a> $Id$
+ * @author lhein
+ */
+public abstract class AbstractJmsMarshaler {
+
+ /**
+ * Should marshaler copy properties set in messages?
+ */
+ private boolean copyProperties = true;
+
+ private boolean needJavaIdentifiers;
+
+ /**
+ * a blacklist for properties which shouldn't be copied
+ */
+ private List<String> propertyBlackList = null;
+
+ /**
+ * Get value from field copyProperties.
+ *
+ * @return The copyProperties field value.
+ */
+ public boolean isCopyProperties() {
+ return copyProperties;
+ }
+
+ /**
+ * Set value from copyProperties field.
+ *
+ * @param copyProperties New value for copyProperties field.
+ */
+ public void setCopyProperties(boolean copyProperties) {
+ this.copyProperties = copyProperties;
+ }
+
+ /**
+ * Copy properties from JMS message to JBI message.
+ *
+ * @param message Received JMS message.
+ * @param inMessage Created JBI message.
+ * @throws JMSException If there is any problems with accessing to message
+ * properties.
+ */
+ @SuppressWarnings("unchecked")
+ protected void copyPropertiesFromJMS(Message message, NormalizedMessage inMessage) throws JMSException {
+ Enumeration<String> names = message.getPropertyNames();
+ while (names.hasMoreElements()) {
+ String name = names.nextElement();
+ Object value = message.getObjectProperty(name);
+ if (!isBlackListed(name)) {
+ inMessage.setProperty(name, value);
+ }
+ }
+ }
+
+ /**
+ * Copy properties from JBI message to JMS message.
+ *
+ * @param outMessage Received JBI message.
+ * @param message Created JMS message.
+ * @throws JMSException If there is any problems with saving JMS message
+ * properties.
+ */
+ @SuppressWarnings("unchecked")
+ protected void copyPropertiesFromNM(NormalizedMessage outMessage, Message message) throws JMSException {
+ Set<String> names = outMessage.getPropertyNames();
+ for (String name : names) {
+ Object value = outMessage.getProperty(name);
+ if (!isBlackListed(name)) {
+ if (shouldIncludeHeader(name, value)) {
+ message.setObjectProperty(name, value);
+ }
+ }
+ }
+ }
+
+ /**
+ * checks whether the header property should be included or not
+ *
+ * @param name the property name
+ * @param value the property value
+ * @return true if it should be copied
+ */
+ private boolean shouldIncludeHeader(String name, Object value) {
+ return (value instanceof String || value instanceof Number || value instanceof Date)
+ && (!isNeedJavaIdentifiers() || isJavaIdentifier(name));
+ }
+
+ /**
+ * checks if a property is on black list
+ *
+ * @param name the property
+ * @return true if on black list
+ */
+ public boolean isBlackListed(String name) {
+ return (this.propertyBlackList != null && this.propertyBlackList.contains(name));
+ }
+
+ /**
+ * checks if a property is a java identifier
+ *
+ * @param s the property name
+ * @return true if java identifier
+ */
+ private static boolean isJavaIdentifier(String s) {
+ int n = s.length();
+ if (n == 0) {
+ return false;
+ }
+ if (!Character.isJavaIdentifierStart(s.charAt(0))) {
+ return false;
+ }
+ for (int i = 1; i < n; i++) {
+ if (!Character.isJavaIdentifierPart(s.charAt(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * @return Returns the propertyBlackList.
+ */
+ public List<String> getPropertyBlackList() {
+ return this.propertyBlackList;
+ }
+
+ /**
+ * @param propertyBlackList The propertyBlackList to set.
+ */
+ public void setPropertyBlackList(List<String> propertyBlackList) {
+ this.propertyBlackList = propertyBlackList;
+ }
+
+ /**
+ * @return Returns the needJavaIdentifiers.
+ */
+ public boolean isNeedJavaIdentifiers() {
+ return this.needJavaIdentifiers;
+ }
+
+ /**
+ * @param needJavaIdentifiers The needJavaIdentifiers to set.
+ */
+ public void setNeedJavaIdentifiers(boolean needJavaIdentifiers) {
+ this.needJavaIdentifiers = needJavaIdentifiers;
+ }
+}
Propchange: servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/AbstractJmsMarshaler.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java?rev=697797&r1=697796&r2=697797&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java (original)
+++ servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java Mon Sep 22 05:42:33 2008
@@ -35,7 +35,7 @@
import org.apache.servicemix.jbi.jaxp.SourceTransformer;
import org.apache.servicemix.jbi.jaxp.StringSource;
-public class DefaultConsumerMarshaler implements JmsConsumerMarshaler {
+public class DefaultConsumerMarshaler extends AbstractJmsMarshaler implements JmsConsumerMarshaler {
private URI mep;
@@ -70,13 +70,20 @@
MessageExchange exchange = jbiContext.getDeliveryChannel().createExchangeFactory().createExchange(mep);
NormalizedMessage inMessage = exchange.createMessage();
populateMessage(ctx.message, inMessage);
+ if (isCopyProperties()) {
+ copyPropertiesFromJMS(ctx.message, inMessage);
+ }
exchange.setMessage(inMessage, "in");
return exchange;
}
public Message createOut(MessageExchange exchange, NormalizedMessage outMsg, Session session, JmsContext context) throws Exception {
String text = new SourceTransformer().contentToString(outMsg);
- return session.createTextMessage(text);
+ TextMessage textMessage = session.createTextMessage(text);
+ if (isCopyProperties()) {
+ copyPropertiesFromNM(outMsg, textMessage);
+ }
+ return textMessage;
}
public Message createFault(MessageExchange exchange, Fault fault, Session session, JmsContext context) throws Exception {
Modified: servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java?rev=697797&r1=697796&r2=697797&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java (original)
+++ servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java Mon Sep 22 05:42:33 2008
@@ -28,11 +28,12 @@
import org.apache.servicemix.jbi.jaxp.SourceTransformer;
import org.apache.servicemix.jbi.jaxp.StringSource;
-public class DefaultProviderMarshaler implements JmsProviderMarshaler {
+public class DefaultProviderMarshaler extends AbstractJmsMarshaler implements
+ JmsProviderMarshaler {
private Map<String, Object> jmsProperties;
private SourceTransformer transformer = new SourceTransformer();
-
+
/**
* @return the jmsProperties
*/
@@ -55,6 +56,11 @@
text.setObjectProperty(e.getKey(), e.getValue());
}
}
+
+ if (isCopyProperties()) {
+ copyPropertiesFromNM(in, text);
+ }
+
return text;
}
@@ -63,9 +69,13 @@
TextMessage textMessage = (TextMessage) message;
Source source = new StringSource(textMessage.getText());
normalizedMessage.setContent(source);
+
+ if (isCopyProperties()) {
+ copyPropertiesFromJMS(textMessage, normalizedMessage);
+ }
} else {
throw new UnsupportedOperationException("JMS message is not a TextMessage");
}
}
-
+
}
Modified: servicemix/components/bindings/servicemix-jms/trunk/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-jms/trunk/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java?rev=697797&r1=697796&r2=697797&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-jms/trunk/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java (original)
+++ servicemix/components/bindings/servicemix-jms/trunk/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java Mon Sep 22 05:42:33 2008
@@ -17,13 +17,17 @@
package org.apache.servicemix.jms;
import java.io.ByteArrayOutputStream;
+import java.util.LinkedList;
+import java.util.List;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.jms.JMSException;
import javax.jms.Message;
+import javax.jms.Session;
import javax.jms.TextMessage;
import javax.xml.namespace.QName;
-import org.w3c.dom.Element;
-
+import org.apache.activemq.pool.PooledConnectionFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.servicemix.common.JbiConstants;
@@ -35,19 +39,29 @@
import org.apache.servicemix.jms.endpoints.DefaultConsumerMarshaler;
import org.apache.servicemix.jms.endpoints.JmsConsumerEndpoint;
import org.apache.servicemix.jms.endpoints.JmsSoapConsumerEndpoint;
+import org.apache.servicemix.tck.MessageList;
import org.apache.servicemix.tck.Receiver;
import org.apache.servicemix.tck.ReceiverComponent;
-import org.apache.activemq.pool.PooledConnectionFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jms.core.JmsTemplate;
+import org.springframework.jms.core.MessageCreator;
import org.springframework.jms.listener.DefaultMessageListenerContainer;
+import org.w3c.dom.Element;
+
public class JmsConsumerEndpointTest extends AbstractJmsTestSupport {
private static Log logger = LogFactory.getLog(JmsConsumerEndpointTest.class);
+ /**
+ * Test property name.
+ */
+ private static final String MSG_PROPERTY = "PropertyTest";
+ private static final String MSG_PROPERTY_BLACKLISTED = "BadPropertyTest";
+
protected Receiver receiver;
protected SourceTransformer sourceTransformer = new SourceTransformer();
+ protected List<String> blackList;
protected void setUp() throws Exception {
super.setUp();
@@ -62,22 +76,30 @@
echo.setService(new QName("echo"));
echo.setEndpoint("endpoint");
container.activateComponent(echo, "echo");
+
+ // initialize the black list
+ blackList = new LinkedList<String>();
+ blackList.add(MSG_PROPERTY_BLACKLISTED);
}
-
- public void testConsumerSimple() throws Exception {
- JmsComponent component = new JmsComponent();
- JmsConsumerEndpoint endpoint = new JmsConsumerEndpoint();
- endpoint.setService(new QName("jms"));
- endpoint.setEndpoint("endpoint");
- endpoint.setTargetService(new QName("receiver"));
- endpoint.setListenerType("simple");
- endpoint.setConnectionFactory(connectionFactory);
- endpoint.setDestinationName("destination");
- component.setEndpoints(new JmsConsumerEndpoint[] {endpoint});
- container.activateComponent(component, "servicemix-jms");
- jmsTemplate.convertAndSend("destination", "<hello>world</hello>");
- receiver.getMessageList().assertMessagesReceived(1);
+ public void testWithoutProperties() throws Exception {
+ container.activateComponent(createEndpoint(false), "servicemix-jms");
+ jmsTemplate.send("destination", new InternalCreator());
+ MessageList messageList = receiver.getMessageList();
+ messageList.assertMessagesReceived(1);
+ NormalizedMessage message = (NormalizedMessage) messageList.getMessages().get(0);
+ assertNull("Not expected property found", message.getProperty(MSG_PROPERTY));
+ assertNull("Not expected property found", message.getProperty(MSG_PROPERTY_BLACKLISTED));
+ }
+
+ public void testConsumerSimple() throws Exception {
+ container.activateComponent(createEndpoint(), "servicemix-jms");
+ jmsTemplate.send("destination", new InternalCreator());
+ MessageList messageList = receiver.getMessageList();
+ messageList.assertMessagesReceived(1);
+ NormalizedMessage message = (NormalizedMessage) messageList.getMessages().get(0);
+ assertNotNull("Expected property not found", message.getProperty(MSG_PROPERTY));
+ assertNull("Black listed property found", message.getProperty(MSG_PROPERTY_BLACKLISTED));
}
public void testConsumerStateless() throws Exception {
@@ -306,4 +328,37 @@
logger.info(((TextMessage) msg).getText());
}
+ // Helper methods
+ private JmsComponent createEndpoint() {
+ return createEndpoint(true);
+ }
+
+ private JmsComponent createEndpoint(boolean copyProperties) {
+ JmsComponent component = new JmsComponent();
+ JmsConsumerEndpoint endpoint = new JmsConsumerEndpoint();
+ endpoint.setService(new QName("jms"));
+ endpoint.setEndpoint("endpoint");
+ DefaultConsumerMarshaler marshaler = new DefaultConsumerMarshaler();
+ marshaler.setCopyProperties(copyProperties);
+ marshaler.setPropertyBlackList(blackList);
+ endpoint.setMarshaler(marshaler);
+ endpoint.setTargetService(new QName("receiver"));
+ endpoint.setListenerType("simple");
+ endpoint.setConnectionFactory(connectionFactory);
+ endpoint.setDestinationName("destination");
+ component.setEndpoints(new JmsConsumerEndpoint[] {endpoint});
+ return component;
+ }
+
+ /**
+ * Simple interface implementation - sets message body and one property.
+ */
+ protected static class InternalCreator implements MessageCreator {
+ public Message createMessage(Session session) throws JMSException {
+ TextMessage message = session.createTextMessage("<hello>world</hello>");
+ message.setStringProperty(MSG_PROPERTY, "test");
+ message.setObjectProperty(MSG_PROPERTY_BLACKLISTED, new String("unwanted property"));
+ return message;
+ }
+ }
}
Modified: servicemix/components/bindings/servicemix-jms/trunk/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-jms/trunk/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java?rev=697797&r1=697796&r2=697797&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-jms/trunk/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java (original)
+++ servicemix/components/bindings/servicemix-jms/trunk/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java Mon Sep 22 05:42:33 2008
@@ -17,10 +17,13 @@
package org.apache.servicemix.jms;
import java.io.ByteArrayOutputStream;
+import java.util.LinkedList;
+import java.util.List;
import javax.jbi.messaging.ExchangeStatus;
import javax.jbi.messaging.InOnly;
import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.NormalizedMessage;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
@@ -30,6 +33,7 @@
import org.apache.servicemix.jbi.jaxp.SourceTransformer;
import org.apache.servicemix.jbi.jaxp.StringSource;
import org.apache.servicemix.jbi.util.FileUtil;
+import org.apache.servicemix.jms.endpoints.DefaultProviderMarshaler;
import org.apache.servicemix.jms.endpoints.JmsProviderEndpoint;
import org.apache.servicemix.jms.endpoints.JmsSoapProviderEndpoint;
import org.springframework.core.io.ClassPathResource;
@@ -37,23 +41,51 @@
public class JmsProviderEndpointTest extends AbstractJmsTestSupport {
+ /**
+ * Test property name.
+ */
+ private static final String MSG_PROPERTY = "PropertyTest";
+ private static final String MSG_PROPERTY_BLACKLISTED = "BadPropertyTest";
+
+ protected List<String> blackList;
+
+ public void testSendWithoutProperties() throws Exception {
+ container.activateComponent(createEndpoint(false), "servicemix-jms");
+
+ InOnly me = client.createInOnlyExchange();
+ NormalizedMessage inMessage = me.getInMessage();
+ inMessage.setProperty(MSG_PROPERTY, "Test-Value");
+ inMessage.setProperty(MSG_PROPERTY_BLACKLISTED, "Unwanted value");
+ inMessage.setContent(new StringSource("<hello>world</hello>"));
+ me.setService(new QName("jms"));
+ client.sendSync(me);
+ assertEquals(ExchangeStatus.DONE, me.getStatus());
+
+ Message msg = jmsTemplate.receive("destination");
+ assertNull("Found not expected property", msg
+ .getStringProperty(MSG_PROPERTY));
+ assertNull("Found blacklisted property", msg
+ .getStringProperty(MSG_PROPERTY_BLACKLISTED));
+ assertNotNull(msg);
+ }
+
public void testSendSimple() throws Exception {
- JmsComponent component = new JmsComponent();
- JmsProviderEndpoint endpoint = new JmsProviderEndpoint();
- endpoint.setService(new QName("jms"));
- endpoint.setEndpoint("endpoint");
- endpoint.setConnectionFactory(connectionFactory);
- endpoint.setDestinationName("destination");
- component.setEndpoints(new JmsProviderEndpoint[] {endpoint});
- container.activateComponent(component, "servicemix-jms");
+ container.activateComponent(createEndpoint(), "servicemix-jms");
InOnly me = client.createInOnlyExchange();
- me.getInMessage().setContent(new StringSource("<hello>world</hello>"));
+ NormalizedMessage inMessage = me.getInMessage();
+ inMessage.setProperty(MSG_PROPERTY, "Test-Value");
+ inMessage.setProperty(MSG_PROPERTY_BLACKLISTED, "Unwanted value");
+ inMessage.setContent(new StringSource("<hello>world</hello>"));
me.setService(new QName("jms"));
client.sendSync(me);
assertEquals(ExchangeStatus.DONE, me.getStatus());
Message msg = jmsTemplate.receive("destination");
+ assertNotNull("Expected property not found", msg
+ .getStringProperty(MSG_PROPERTY));
+ assertNull("Found blacklisted property", msg
+ .getStringProperty(MSG_PROPERTY_BLACKLISTED));
assertNotNull(msg);
}
@@ -73,6 +105,7 @@
FileUtil.copyInputStream(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC-Input-OneWay.xml").getInputStream(), baos);
InOnly me = client.createInOnlyExchange();
me.getInMessage().setContent(new StringSource(baos.toString()));
+
me.setOperation(new QName("uri:HelloWorld", "OneWay"));
me.setService(new QName("uri:HelloWorld", "HelloService"));
client.sendSync(me);
@@ -132,5 +165,29 @@
client.done(me);
}
-
+
+
+ // Helper methods
+ private JmsComponent createEndpoint() {
+ return createEndpoint(true);
+ }
+
+ private JmsComponent createEndpoint(boolean copyProperties) {
+ // initialize the black list
+ blackList = new LinkedList<String>();
+ blackList.add(MSG_PROPERTY_BLACKLISTED);
+
+ JmsComponent component = new JmsComponent();
+ JmsProviderEndpoint endpoint = new JmsProviderEndpoint();
+ endpoint.setService(new QName("jms"));
+ DefaultProviderMarshaler marshaler = new DefaultProviderMarshaler();
+ marshaler.setCopyProperties(copyProperties);
+ marshaler.setPropertyBlackList(blackList);
+ endpoint.setMarshaler(marshaler);
+ endpoint.setEndpoint("endpoint");
+ endpoint.setConnectionFactory(connectionFactory);
+ endpoint.setDestinationName("destination");
+ component.setEndpoints(new JmsProviderEndpoint[] {endpoint});
+ return component;
+ }
}