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:41:32 UTC

svn commit: r697796 - in /servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms: ./ src/main/java/org/apache/servicemix/jms/endpoints/ src/test/java/org/apache/servicemix/jms/

Author: lhein
Date: Mon Sep 22 05:41:31 2008
New Revision: 697796

URL: http://svn.apache.org/viewvc?rev=697796&view=rev
Log:
applied patch for SM-1586 provided by Łukasz Dywicki - many thanks to Łukasz

Added:
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/AbstractJmsMarshaler.java   (with props)
Modified:
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/pom.xml
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/pom.xml?rev=697796&r1=697795&r2=697796&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/pom.xml (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/pom.xml Mon Sep 22 05:41:31 2008
@@ -174,6 +174,12 @@
         <scope>provided</scope>
     </dependency>
     <dependency>
+        <groupId>bouncycastle</groupId>
+        <artifactId>bcprov-jdk15</artifactId>
+        <version>${bcprov-version}</version>
+        <scope>provided</scope>
+    </dependency>
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>${junit-version}</version>

Added: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/AbstractJmsMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/AbstractJmsMarshaler.java?rev=697796&view=auto
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/AbstractJmsMarshaler.java (added)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/AbstractJmsMarshaler.java Mon Sep 22 05:41:31 2008
@@ -0,0 +1,176 @@
+/*
+ * 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;
+
+    /**
+     * 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) && 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/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/AbstractJmsMarshaler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java?rev=697796&r1=697795&r2=697796&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java Mon Sep 22 05:41:31 2008
@@ -31,22 +31,22 @@
 import javax.jms.TextMessage;
 import javax.xml.transform.Source;
 
+import org.apache.servicemix.common.JbiConstants;
 import org.apache.servicemix.jbi.jaxp.SourceTransformer;
 import org.apache.servicemix.jbi.jaxp.StringSource;
-import org.apache.servicemix.jbi.messaging.MessageExchangeSupport;
 
-public class DefaultConsumerMarshaler implements JmsConsumerMarshaler {
-    
+public class DefaultConsumerMarshaler extends AbstractJmsMarshaler implements JmsConsumerMarshaler {
+
     private URI mep;
 
     public DefaultConsumerMarshaler() {
-        this.mep = MessageExchangeSupport.IN_ONLY;
+        this.mep = JbiConstants.IN_ONLY;
     }
-    
+
     public DefaultConsumerMarshaler(URI mep) {
         this.mep = mep;
     }
-    
+
     /**
      * @return the mep
      */
@@ -65,32 +65,44 @@
         return new Context(message);
     }
 
-    public MessageExchange createExchange(JmsContext jmsContext, ComponentContext jbiContext) throws Exception {
-        Context ctx = (Context) jmsContext;
-        MessageExchange exchange = jbiContext.getDeliveryChannel().createExchangeFactory().createExchange(mep);
+    public MessageExchange createExchange(JmsContext jmsContext, ComponentContext jbiContext)
+        throws Exception {
+        Context ctx = (Context)jmsContext;
+        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 {
+    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 {
+    public Message createFault(MessageExchange exchange, Fault fault, Session session, JmsContext context)
+        throws Exception {
         String text = new SourceTransformer().contentToString(fault);
         return session.createTextMessage(text);
     }
 
-    public Message createError(MessageExchange exchange, Exception error, Session session, JmsContext context) throws Exception {
+    public Message createError(MessageExchange exchange, Exception error, Session session, JmsContext context)
+        throws Exception {
         throw error;
     }
 
     protected void populateMessage(Message message, NormalizedMessage normalizedMessage) throws Exception {
         if (message instanceof TextMessage) {
-            TextMessage textMessage = (TextMessage) message;
+            TextMessage textMessage = (TextMessage)message;
             Source source = new StringSource(textMessage.getText());
             normalizedMessage.setContent(source);
         } else {
@@ -100,17 +112,21 @@
 
     protected static class Context implements JmsContext, Serializable {
         Message message;
+
         Context(Message message) {
             this.message = message;
         }
+
         public Message getMessage() {
             return this.message;
         }
+
         private void writeObject(ObjectOutputStream out) throws IOException {
             out.writeObject(message);
         }
+
         private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-            message = (Message) in.readObject();
+            message = (Message)in.readObject();
         }
     }
 

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java?rev=697796&r1=697795&r2=697796&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java Mon Sep 22 05:41:31 2008
@@ -28,11 +28,11 @@
 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
      */
@@ -47,7 +47,8 @@
         this.jmsProperties = jmsProperties;
     }
 
-    public Message createMessage(MessageExchange exchange, NormalizedMessage in, Session session) throws Exception {
+    public Message createMessage(MessageExchange exchange, NormalizedMessage in, Session session)
+        throws Exception {
         TextMessage text = session.createTextMessage();
         text.setText(transformer.contentToString(in));
         if (jmsProperties != null) {
@@ -55,17 +56,27 @@
                 text.setObjectProperty(e.getKey(), e.getValue());
             }
         }
+
+        if (isCopyProperties()) {
+            copyPropertiesFromNM(in, text);
+        }
+
         return text;
     }
 
-    public void populateMessage(Message message, MessageExchange exchange, NormalizedMessage normalizedMessage) throws Exception {
+    public void populateMessage(Message message, MessageExchange exchange, NormalizedMessage normalizedMessage)
+        throws Exception {
         if (message instanceof TextMessage) {
-            TextMessage textMessage = (TextMessage) message;
+            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/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java?rev=697796&r1=697795&r2=697796&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java Mon Sep 22 05:41:31 2008
@@ -14,54 +14,95 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicemix.jms;  
+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;
 import org.apache.servicemix.components.util.EchoComponent;
 import org.apache.servicemix.components.util.MockServiceComponent;
 import org.apache.servicemix.jbi.jaxp.SourceTransformer;
 import org.apache.servicemix.jbi.jaxp.StringSource;
-import org.apache.servicemix.jbi.messaging.MessageExchangeSupport;
 import org.apache.servicemix.jbi.util.FileUtil;
 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.springframework.core.io.ClassPathResource;
+import org.springframework.jms.core.JmsTemplate;
+import org.springframework.jms.core.MessageCreator;
+import org.springframework.jms.listener.DefaultMessageListenerContainer;
 
 public class JmsConsumerEndpointTest extends AbstractJmsTestSupport {
 
-    private static Log logger =  LogFactory.getLog(JmsConsumerEndpointTest.class);
+    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();
-        
+
         ReceiverComponent rec = new ReceiverComponent();
         rec.setService(new QName("receiver"));
         rec.setEndpoint("endpoint");
         container.activateComponent(rec, "receiver");
         receiver = rec;
-        
+
         EchoComponent echo = new EchoComponent();
         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 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 {
         JmsComponent component = new JmsComponent();
         JmsConsumerEndpoint endpoint = new JmsConsumerEndpoint();
         endpoint.setService(new QName("jms"));
@@ -70,6 +111,7 @@
         endpoint.setListenerType("simple");
         endpoint.setConnectionFactory(connectionFactory);
         endpoint.setDestinationName("destination");
+        endpoint.setStateless(true);
         component.setEndpoints(new JmsConsumerEndpoint[] {endpoint});
         container.activateComponent(component, "servicemix-jms");
 
@@ -77,7 +119,7 @@
         receiver.getMessageList().assertMessagesReceived(1);
     }
 
-    public void testConsumerStateless() throws Exception {
+    public void testConsumerSimpleJmsTx() throws Exception {
         JmsComponent component = new JmsComponent();
         JmsConsumerEndpoint endpoint = new JmsConsumerEndpoint();
         endpoint.setService(new QName("jms"));
@@ -86,34 +128,36 @@
         endpoint.setListenerType("simple");
         endpoint.setConnectionFactory(connectionFactory);
         endpoint.setDestinationName("destination");
-        endpoint.setStateless(true);
+        endpoint.setTransacted("jms");
         component.setEndpoints(new JmsConsumerEndpoint[] {endpoint});
         container.activateComponent(component, "servicemix-jms");
 
+        container.start();
+
         jmsTemplate.convertAndSend("destination", "<hello>world</hello>");
         receiver.getMessageList().assertMessagesReceived(1);
     }
 
-    public void testConsumerSimpleJmsTx() throws Exception {
+    public void testConsumerDefault() 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.setListenerType("default");
         endpoint.setConnectionFactory(connectionFactory);
         endpoint.setDestinationName("destination");
-        endpoint.setTransacted("jms");
         component.setEndpoints(new JmsConsumerEndpoint[] {endpoint});
         container.activateComponent(component, "servicemix-jms");
-        
+
         container.start();
-        
+
         jmsTemplate.convertAndSend("destination", "<hello>world</hello>");
         receiver.getMessageList().assertMessagesReceived(1);
+        Thread.sleep(500);
     }
 
-    public void testConsumerDefault() throws Exception {
+    public void testDurableConsumerDefault() throws Exception {
         JmsComponent component = new JmsComponent();
         JmsConsumerEndpoint endpoint = new JmsConsumerEndpoint();
         endpoint.setService(new QName("jms"));
@@ -121,14 +165,23 @@
         endpoint.setTargetService(new QName("receiver"));
         endpoint.setListenerType("default");
         endpoint.setConnectionFactory(connectionFactory);
-        endpoint.setDestinationName("destination");
+        endpoint.setPubSubDomain(true);
+        endpoint.setSubscriptionDurable(true);
+        endpoint.setClientId("clientId");
+        endpoint.setDestinationName("destinationTopic");
+        endpoint.setCacheLevel(DefaultMessageListenerContainer.CACHE_CONNECTION);
         component.setEndpoints(new JmsConsumerEndpoint[] {endpoint});
         container.activateComponent(component, "servicemix-jms");
-        
+        Thread.sleep(500);
         container.start();
-        
-        jmsTemplate.convertAndSend("destination", "<hello>world</hello>");
+
+        JmsTemplate jmsTemplate = new JmsTemplate();
+        jmsTemplate.setConnectionFactory(new PooledConnectionFactory(connectionFactory));
+        jmsTemplate.setPubSubDomain(true);
+        jmsTemplate.afterPropertiesSet();
+        jmsTemplate.convertAndSend("destinationTopic", "<hello>world</hello>");
         receiver.getMessageList().assertMessagesReceived(1);
+        Thread.sleep(500);
     }
 
     public void testConsumerDefaultInOut() throws Exception {
@@ -141,15 +194,16 @@
         endpoint.setConnectionFactory(connectionFactory);
         endpoint.setDestinationName("destination");
         endpoint.setReplyDestinationName("replyDestination");
-        endpoint.setMarshaler(new DefaultConsumerMarshaler(MessageExchangeSupport.IN_OUT));
+        endpoint.setMarshaler(new DefaultConsumerMarshaler(JbiConstants.IN_OUT));
         component.setEndpoints(new JmsConsumerEndpoint[] {endpoint});
         container.activateComponent(component, "servicemix-jms");
 
         jmsTemplate.convertAndSend("destination", "<hello>world</hello>");
-        TextMessage msg = (TextMessage) jmsTemplate.receive("replyDestination");
+        TextMessage msg = (TextMessage)jmsTemplate.receive("replyDestination");
         Element e = sourceTransformer.toDOMElement(new StringSource(msg.getText()));
         assertEquals("hello", e.getTagName());
         assertEquals("world", e.getTextContent());
+        Thread.sleep(500);
     }
 
     public void testConsumerDefaultJmsTx() throws Exception {
@@ -167,6 +221,7 @@
 
         jmsTemplate.convertAndSend("destination", "<hello>world</hello>");
         receiver.getMessageList().assertMessagesReceived(1);
+        Thread.sleep(500);
     }
 
     public void testConsumerDefaultInOutJmsTx() throws Exception {
@@ -180,15 +235,16 @@
         endpoint.setDestinationName("destination");
         endpoint.setReplyDestinationName("replyDestination");
         endpoint.setTransacted("jms");
-        endpoint.setMarshaler(new DefaultConsumerMarshaler(MessageExchangeSupport.IN_OUT));
+        endpoint.setMarshaler(new DefaultConsumerMarshaler(JbiConstants.IN_OUT));
         component.setEndpoints(new JmsConsumerEndpoint[] {endpoint});
         container.activateComponent(component, "servicemix-jms");
 
         jmsTemplate.convertAndSend("destination", "<hello>world</hello>");
-        TextMessage msg = (TextMessage) jmsTemplate.receive("replyDestination");
+        TextMessage msg = (TextMessage)jmsTemplate.receive("replyDestination");
         Element e = sourceTransformer.toDOMElement(new StringSource(msg.getText()));
         assertEquals("hello", e.getTagName());
         assertEquals("world", e.getTextContent());
+        Thread.sleep(500);
     }
 
     public void testConsumerDefaultXaTx() throws Exception {
@@ -206,6 +262,7 @@
 
         jmsTemplate.convertAndSend("destination", "<hello>world</hello>");
         receiver.getMessageList().assertMessagesReceived(1);
+        Thread.sleep(500);
     }
 
     public void testConsumerServer() throws Exception {
@@ -219,7 +276,7 @@
         endpoint.setDestinationName("destination");
         component.setEndpoints(new JmsConsumerEndpoint[] {endpoint});
         container.activateComponent(component, "servicemix-jms");
-        
+
         jmsTemplate.convertAndSend("destination", "<hello>world</hello>");
         receiver.getMessageList().assertMessagesReceived(1);
     }
@@ -236,7 +293,7 @@
         endpoint.setTransacted("jms");
         component.setEndpoints(new JmsConsumerEndpoint[] {endpoint});
         container.activateComponent(component, "servicemix-jms");
-        
+
         jmsTemplate.convertAndSend("destination", "<hello>world</hello>");
         receiver.getMessageList().assertMessagesReceived(1);
     }
@@ -254,21 +311,55 @@
         endpoint.setWsdl(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC.wsdl"));
         component.setEndpoints(new JmsConsumerEndpoint[] {endpoint});
         container.activateComponent(component, "servicemix-jms");
-        
+
         MockServiceComponent mock = new MockServiceComponent();
         mock.setService(new QName("mock"));
         mock.setEndpoint("endpoint");
-        mock.setResponseXml(
-                "<jbi:message xmlns:jbi=\"http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper\"><jbi:part>hello</jbi:part></jbi:message>");
+        mock.setResponseXml("<jbi:message xmlns:jbi=\"http://java.sun.com/xml/ns/jbi/" 
+                            + "wsdl-11-wrapper\"><jbi:part>hello</jbi:part></jbi:message>");
         container.activateComponent(mock, "mock");
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        FileUtil.copyInputStream(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC-Input.xml").getInputStream(), baos);
+        FileUtil.copyInputStream(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC-Input.xml")
+            .getInputStream(), baos);
         jmsTemplate.convertAndSend("destination", baos.toString());
-        
+
         Message msg = jmsTemplate.receive("reply");
         assertNotNull(msg);
-        logger.info(((TextMessage) msg).getText());
+        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/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java?rev=697796&r1=697795&r2=697796&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java Mon Sep 22 05:41:31 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,29 +41,53 @@
 
 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);
     }
-    
+
     public void testSoapProviderInOnly() throws Exception {
         JmsComponent component = new JmsComponent();
-        
+
         JmsSoapProviderEndpoint endpoint = new JmsSoapProviderEndpoint();
         endpoint.setService(new QName("uri:HelloWorld", "HelloService"));
         endpoint.setEndpoint("HelloPort");
@@ -68,24 +96,29 @@
         endpoint.setWsdl(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC.wsdl"));
         component.setEndpoints(new JmsProviderEndpoint[] {endpoint});
         container.activateComponent(component, "servicemix-jms");
-        
+
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        FileUtil.copyInputStream(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC-Input-OneWay.xml").getInputStream(), baos);
+        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);
         assertEquals(ExchangeStatus.DONE, me.getStatus());
-        
+
         Message msg = jmsTemplate.receive("destination");
         assertNotNull(msg);
-        System.err.println(((TextMessage) msg).getText());
+        System.err.println(((TextMessage)msg).getText());
     }
-    
+
     public void testSoapProviderInOut() throws Exception {
         JmsComponent component = new JmsComponent();
-        
+
         JmsSoapProviderEndpoint endpoint = new JmsSoapProviderEndpoint();
         endpoint.setService(new QName("uri:HelloWorld", "HelloService"));
         endpoint.setEndpoint("HelloPort");
@@ -95,19 +128,23 @@
         endpoint.setWsdl(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC.wsdl"));
         component.setEndpoints(new JmsProviderEndpoint[] {endpoint});
         container.activateComponent(component, "servicemix-jms");
-        
+
         Thread th = new Thread() {
             public void run() {
                 try {
                     final Message msg = jmsTemplate.receive("destination");
                     assertNotNull(msg);
                     final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                    FileUtil.copyInputStream(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC-Output.xml")
-                                .getInputStream(), baos);
+                    FileUtil
+                        .copyInputStream(
+                                         new ClassPathResource(
+                                                               "org/apache/servicemix/jms/HelloWorld-RPC-Output.xml")
+                                             .getInputStream(), baos);
                     jmsTemplate.send("reply", new MessageCreator() {
                         public Message createMessage(Session session) throws JMSException {
                             TextMessage rep = session.createTextMessage(baos.toString());
-                            rep.setJMSCorrelationID(msg.getJMSMessageID());
+                            rep.setJMSCorrelationID(msg.getJMSCorrelationID() != null ? msg
+                                .getJMSCorrelationID() : msg.getJMSMessageID());
                             return rep;
                         }
                     });
@@ -117,9 +154,12 @@
             }
         };
         th.start();
-        
+
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        FileUtil.copyInputStream(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC-Input-Hello.xml").getInputStream(), baos);
+        FileUtil
+            .copyInputStream(
+                             new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC-Input-Hello.xml")
+                                 .getInputStream(), baos);
         InOut me = client.createInOutExchange();
         me.getInMessage().setContent(new StringSource(baos.toString()));
         me.setOperation(new QName("uri:HelloWorld", "Hello"));
@@ -130,7 +170,30 @@
         assertNotNull(me.getOutMessage().getContent());
         System.err.println(new SourceTransformer().contentToString(me.getOutMessage()));
         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;
     }
-    
 }