You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2008/05/28 10:37:22 UTC

svn commit: r660859 - in /servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src: main/java/org/apache/servicemix/camel/ test/java/org/apache/servicemix/camel/ test/resources/org/apache/servicemix/camel/su5-src/

Author: gnodet
Date: Wed May 28 01:37:22 2008
New Revision: 660859

URL: http://svn.apache.org/viewvc?rev=660859&view=rev
Log:
SM-1373: Camel component does not forward out message correctly when used in a pipeline

Modified:
    servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/CamelJbiEndpoint.java
    servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/JbiExchange.java
    servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOutTest.java
    servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/MyEchoComponent.java
    servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/NonJbiCamelEndpointsIntegrationTest.java
    servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/resources/org/apache/servicemix/camel/su5-src/camel-context.xml

Modified: servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/CamelJbiEndpoint.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/CamelJbiEndpoint.java?rev=660859&r1=660858&r2=660859&view=diff
==============================================================================
--- servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/CamelJbiEndpoint.java (original)
+++ servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/CamelJbiEndpoint.java Wed May 28 01:37:22 2008
@@ -16,14 +16,17 @@
  */
 package org.apache.servicemix.camel;
 
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.InOnly;
 import javax.jbi.messaging.MessageExchange;
-import javax.jbi.messaging.NormalizedMessage;
+import javax.jbi.messaging.RobustInOnly;
 import javax.xml.namespace.QName;
 
 import org.apache.camel.Endpoint;
 import org.apache.camel.Processor;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.JbiConstants;
 import org.apache.servicemix.common.ServiceUnit;
 import org.apache.servicemix.common.endpoints.ProviderEndpoint;
 
@@ -56,20 +59,57 @@
     }
 
     @Override
-    protected void processInOnly(MessageExchange exchange, NormalizedMessage in) throws Exception {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Received exchange: " + exchange);
+    public void process(MessageExchange exchange) throws Exception {
+        // The component acts as a provider, this means that another component has requested our service
+        // As this exchange is active, this is either an in or a fault (out are sent by this component)
+        if (exchange.getRole() == MessageExchange.Role.PROVIDER) {
+            // Exchange is finished
+            if (exchange.getStatus() == ExchangeStatus.DONE) {
+                return;
+            // Exchange has been aborted with an exception
+            } else if (exchange.getStatus() == ExchangeStatus.ERROR) {
+                return;
+            // Exchange is active
+            } else {
+                handleActiveProviderExchange(exchange);
+
+            }
+        // Unsupported role: this should never happen has we never create exchanges
+        } else {
+            throw new IllegalStateException("Unsupported role: " + exchange.getRole());
         }
-        JbiExchange camelExchange = new JbiExchange(camelEndpoint.getContext(), binding, exchange);
-        camelProcessor.process(camelExchange);
     }
 
-    @Override
-    protected void processInOut(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws Exception {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Received exchange: " + exchange);
+    protected void handleActiveProviderExchange(MessageExchange exchange) throws Exception {
+        // Fault message
+        if (exchange.getFault() != null) {
+            done(exchange);
+        // In message
+        } else if (exchange.getMessage("in") != null) {
+            if (exchange instanceof InOnly || exchange instanceof RobustInOnly) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Received exchange: " + exchange);
+                }
+                JbiExchange camelExchange = new JbiExchange(camelEndpoint.getContext(), binding, exchange);
+                camelProcessor.process(camelExchange);
+                done(exchange);
+            } else {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Received exchange: " + exchange);
+                }
+                JbiExchange camelExchange = new JbiExchange(camelEndpoint.getContext(), binding, exchange);
+                camelProcessor.process(camelExchange);
+                boolean txSync = exchange.isTransacted() && Boolean.TRUE.equals(exchange.getProperty(JbiConstants.SEND_SYNC));
+                if (txSync) {
+                    sendSync(exchange);
+                } else {
+                    send(exchange);
+                }
+            }
+        // This is not compliant with the default MEPs
+        } else {
+            throw new IllegalStateException("Provider exchange is ACTIVE, but no in or fault is provided");
         }
-        JbiExchange camelExchange = new JbiExchange(camelEndpoint.getContext(), binding, exchange);
-        camelProcessor.process(camelExchange);
     }
+
 }

Modified: servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/JbiExchange.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/JbiExchange.java?rev=660859&r1=660858&r2=660859&view=diff
==============================================================================
--- servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/JbiExchange.java (original)
+++ servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/JbiExchange.java Wed May 28 01:37:22 2008
@@ -16,6 +16,7 @@
  */
 package org.apache.servicemix.camel;
 
+import javax.jbi.JBIException;
 import javax.jbi.messaging.MessageExchange;
 import javax.jbi.messaging.NormalizedMessage;
 
@@ -49,11 +50,6 @@
         this.messageExchange = messageExchange;
 
         setPattern(ExchangePattern.fromWsdlUri(messageExchange.getPattern().toString()));
-        // TODO we could maybe use the typesafe APIs of different derived APIs
-        // from JBI
-        setIn(new JbiMessage(messageExchange.getMessage("in")));
-        setOut(new JbiMessage(messageExchange.getMessage("out")));
-        setFault(new JbiMessage(messageExchange.getMessage("fault")));
         populateProperties();
     }
 
@@ -139,17 +135,34 @@
 
     @Override
     protected JbiMessage createInMessage() {
-        return new JbiMessage();
+        return createMessage("in");
     }
 
     @Override
     protected JbiMessage createOutMessage() {
-        return new JbiMessage();
+        return createMessage("out");
     }
 
     @Override
     protected JbiMessage createFaultMessage() {
-        return new JbiMessage();
+        return createMessage("fault");
+    }
+
+    private JbiMessage createMessage(String name) {
+        if (messageExchange != null) {
+            try {
+                NormalizedMessage msg = messageExchange.getMessage(name);
+                if (msg == null) {
+                    msg = messageExchange.createMessage();
+                    messageExchange.setMessage(msg, name);
+                }
+                return new JbiMessage(msg);
+            } catch (JBIException e) {
+                throw new RuntimeException(e);
+            }
+        } else {
+            return new JbiMessage();
+        }
     }
 
     private void populateProperties() {

Modified: servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOutTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOutTest.java?rev=660859&r1=660858&r2=660859&view=diff
==============================================================================
--- servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOutTest.java (original)
+++ servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOutTest.java Wed May 28 01:37:22 2008
@@ -49,4 +49,11 @@
         assertNotNull("Should have a Camel endpoint exposed in JBI!", endpoint);
         exchange.setEndpoint(endpoint);
     }
+
+    @Override
+    protected void checkResult(MessageExchange exchange) {
+        assertNotNull(exchange.getMessage("out"));
+        assertNotNull(exchange.getMessage("out").getContent());
+    }
+
 }

Modified: servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/MyEchoComponent.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/MyEchoComponent.java?rev=660859&r1=660858&r2=660859&view=diff
==============================================================================
--- servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/MyEchoComponent.java (original)
+++ servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/MyEchoComponent.java Wed May 28 01:37:22 2008
@@ -21,10 +21,13 @@
 import javax.jbi.messaging.NormalizedMessage;
 import javax.xml.namespace.QName;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.servicemix.components.util.EchoComponent;
 
 public class MyEchoComponent extends EchoComponent {
 
+    private static final Log LOG = LogFactory.getLog(MyEchoComponent.class);
 
     public MyEchoComponent() {
     }
@@ -34,10 +37,12 @@
     }
 
     protected boolean transform(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws MessagingException {
+        getMessageTransformer().transform(exchange, in, out);
         // Put the operation information back to the out message
         if (exchange.getOperation() != null) {
             out.setProperty("operation", exchange.getOperation());
         }
+        LOG.info("Echoed back message: " + out);
         return true;
     }
 

Modified: servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/NonJbiCamelEndpointsIntegrationTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/NonJbiCamelEndpointsIntegrationTest.java?rev=660859&r1=660858&r2=660859&view=diff
==============================================================================
--- servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/NonJbiCamelEndpointsIntegrationTest.java (original)
+++ servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/NonJbiCamelEndpointsIntegrationTest.java Wed May 28 01:37:22 2008
@@ -104,7 +104,6 @@
     }
 
     protected void checkResult(MessageExchange exchange) {
-        assertNotNull(exchange.getMessage("out"));
     }
 
     /*

Modified: servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/resources/org/apache/servicemix/camel/su5-src/camel-context.xml
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/resources/org/apache/servicemix/camel/su5-src/camel-context.xml?rev=660859&r1=660858&r2=660859&view=diff
==============================================================================
--- servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/resources/org/apache/servicemix/camel/su5-src/camel-context.xml (original)
+++ servicemix/smx3/trunk/deployables/serviceengines/servicemix-camel/src/test/resources/org/apache/servicemix/camel/su5-src/camel-context.xml Wed May 28 01:37:22 2008
@@ -28,6 +28,7 @@
   <camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
     <route>
       <from uri="jbi:name:cheese"/>
+      <to uri="log:Su5Log" />
       <to uri="jbi:service:namespace:echo?mep=in-out"/>
     </route>
   </camelContext>