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;
+    }
 }