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/11/14 13:01:06 UTC

svn commit: r713983 - in /servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src: main/java/org/apache/servicemix/jms/ main/java/org/apache/servicemix/jms/multiplexing/ test/java/org/apache/servicemix/jms/

Author: gnodet
Date: Fri Nov 14 04:01:06 2008
New Revision: 713983

URL: http://svn.apache.org/viewvc?rev=713983&view=rev
Log:
SM-1679: smx-jms old, non-soap, in/out, provider/consumer endpoints do not pass JBI Faults correctly

Modified:
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/DefaultJmsMarshaler.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/multiplexing/MultiplexingProviderProcessor.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/AbstractJmsTestSupport.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JMSComponentTest.java

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/DefaultJmsMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/DefaultJmsMarshaler.java?rev=713983&r1=713982&r2=713983&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/DefaultJmsMarshaler.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/DefaultJmsMarshaler.java Fri Nov 14 04:01:06 2008
@@ -28,7 +28,10 @@
 import javax.jms.ObjectMessage;
 import javax.jms.Session;
 import javax.jms.TextMessage;
+import javax.xml.transform.Source;
 
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.soap.SoapFault;
 import org.apache.servicemix.soap.SoapHelper;
 import org.apache.servicemix.soap.marshalers.SoapMessage;
 import org.apache.servicemix.soap.marshalers.SoapWriter;
@@ -37,8 +40,15 @@
  * Encapsulates the conversion to and from JMS messages
  */
 public class DefaultJmsMarshaler implements JmsMarshaler {
+
     public static final String CONTENT_TYPE = "MimeContentType";
 
+    public static final String DONE_JMS_PROPERTY = "JBIDone";
+
+    public static final String FAULT_JMS_PROPERTY = "JBIFault";
+
+    public static final String ERROR_JMS_PROPERTY = "JBIError";
+
     private JmsEndpoint endpoint;
     
     public DefaultJmsMarshaler(JmsEndpoint endpoint) {
@@ -47,14 +57,14 @@
     
     /**
      * Converts an {@link Exception} into an JMS message. This method will be
-     * invoked when the {@link MessageExchange} contains an error.
+     * invoked when the {@link javax.jbi.messaging.MessageExchange} contains an error.
      * 
      * @param e
      *            Exception to convert
      * @param session
      *            JMS session used to create JMS messages
      * @return JMS message
-     * @see MessageExchange#getError()
+     * @see javax.jbi.messaging.MessageExchange#getError()
      */
     public Message toJMS(Exception e, Session session) throws Exception {
         return session.createObjectMessage(e);
@@ -68,7 +78,7 @@
      * @param session JMS session used to create JMS messages
      * @return JMS version of the specified source SOAP message
      * @throws Exception if an IO error occurs
-     * @throws JMSException if a JMS error occurs
+     * @throws javax.jms.JMSException if a JMS error occurs
      */
     protected Message toJMS(SoapMessage message, Session session) throws Exception {
         SoapHelper soapHelper = new SoapHelper(endpoint);
@@ -80,7 +90,7 @@
         
         // create text message
         TextMessage msg = session.createTextMessage();
-        msg.setText(baos.toString());
+        msg.setText(baos.toString(SourceTransformer.getDefaultCharset()));
         
         // overwrite whatever content-type was passed on to us with the one
         // the SoapWriter constructed
@@ -115,6 +125,10 @@
                 }
             }
         }
+
+        if (message.getFault() != null) {
+            msg.setBooleanProperty(FAULT_JMS_PROPERTY, true);
+        }
         
         return msg;
     }
@@ -130,7 +144,7 @@
      * @throws Exception
      *             if JMS message is an ObjectMessage containing an Exception
      *             (the containing exception is thrown.)
-     * @throws JMSException
+     * @throws javax.jms.JMSException
      *             if a JMS problem occurs
      * @throws UnsupportedOperationException
      *             if the JMS message is an ObjectMessage which contains
@@ -178,6 +192,11 @@
         String contentType = message.getStringProperty(CONTENT_TYPE);
         SoapMessage soap = soapHelper.getSoapMarshaler().createReader().read(is, contentType);
 
+        if (message.getBooleanProperty(FAULT_JMS_PROPERTY)) {
+            Source src = soap.getSource();
+            soap.setSource(null);
+            soap.setFault(new SoapFault(SoapFault.SENDER, null, null, null, src));
+        }
         return soap;
     }
 

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/multiplexing/MultiplexingProviderProcessor.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/multiplexing/MultiplexingProviderProcessor.java?rev=713983&r1=713982&r2=713983&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/multiplexing/MultiplexingProviderProcessor.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/multiplexing/MultiplexingProviderProcessor.java Fri Nov 14 04:01:06 2008
@@ -17,9 +17,11 @@
 package org.apache.servicemix.jms.multiplexing;
 
 import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.Fault;
 import javax.jbi.messaging.InOnly;
 import javax.jbi.messaging.InOut;
 import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
 import javax.jbi.messaging.NormalizedMessage;
 import javax.jbi.messaging.RobustInOnly;
 import javax.jms.Message;
@@ -75,25 +77,38 @@
         endpoint.getServiceUnit().getComponent().getExecutor().execute(new Runnable() {
             public void run() {
                 InOut exchange = null;
+                if (log.isDebugEnabled()) {
+                    log.debug("Handling jms message " + message);
+                }
+                String correlationID = null;
                 try {
-                    if (log.isDebugEnabled()) {
-                        log.debug("Handling jms message " + message);
-                    }
-                    exchange = (InOut) store.load(message.getJMSCorrelationID());
+                    correlationID = message.getJMSCorrelationID();
+                    exchange = (InOut) store.load(correlationID);
                     if (exchange == null) {
-                        throw new IllegalStateException("Could not find exchange " + message.getJMSCorrelationID());
+                        throw new IllegalStateException();
                     }
+                } catch (Exception e) {
+                    log.error("Could not find exchange " + (correlationID == null ? "" : correlationID), e);
+                    return;
+                }
+                try {
                     SoapMessage soap = endpoint.getMarshaler().toSOAP(message);
-                    NormalizedMessage out = exchange.createMessage();
-                    soapHelper.getJBIMarshaler().toNMS(out, soap);
-                    ((InOut) exchange).setOutMessage(out);
-                    channel.send(exchange);
+                    if (soap.getFault() != null) {
+                        Fault fault = exchange.createFault();
+                        fault.setContent(soap.getSource());
+                        exchange.setFault(fault);
+                    } else {
+                        NormalizedMessage msg = exchange.createMessage();
+                        soapHelper.getJBIMarshaler().toNMS(msg, soap);
+                        ((InOut) exchange).setOutMessage(msg);
+                    }
                 } catch (Exception e) {
                     log.error("Error while handling jms message", e);
-                    if (exchange != null) {
-                        exchange.setError(e);
-                    }                    
-                } catch (Throwable e) {
+                    exchange.setError(e);
+                }
+                try {
+                    channel.send(exchange);
+                } catch (MessagingException e) {
                     log.error("Error while handling jms message", e);
                 }
             }

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/AbstractJmsTestSupport.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/AbstractJmsTestSupport.java?rev=713983&r1=713982&r2=713983&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/AbstractJmsTestSupport.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/AbstractJmsTestSupport.java Fri Nov 14 04:01:06 2008
@@ -16,6 +16,10 @@
  */
 package org.apache.servicemix.jms;
 
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.Fault;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 
@@ -26,9 +30,12 @@
 import org.apache.activemq.jndi.ActiveMQInitialContextFactory;
 import org.apache.activemq.pool.PooledConnectionFactory;
 import org.apache.activemq.xbean.BrokerFactoryBean;
+import org.apache.servicemix.MessageExchangeListener;
 import org.apache.servicemix.client.DefaultServiceMixClient;
 import org.apache.servicemix.client.ServiceMixClient;
+import org.apache.servicemix.components.util.ComponentSupport;
 import org.apache.servicemix.jbi.container.JBIContainer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
 import org.jencks.GeronimoPlatformTransactionManager;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.jms.core.JmsTemplate;
@@ -106,4 +113,29 @@
     protected void configureJmsBroker() throws Exception {
         
     }
+
+    protected static class ReturnErrorComponent extends ComponentSupport implements MessageExchangeListener {
+        private Exception exception;
+     
+        public ReturnErrorComponent(Exception exception) {
+            this.exception = exception;
+        }
+     
+        public void onMessageExchange(MessageExchange exchange) throws MessagingException {
+            if (exchange.getStatus() == ExchangeStatus.ACTIVE) {
+                fail(exchange, exception);
+            }
+        }
+    }
+ 
+    protected static class ReturnFaultComponent extends ComponentSupport implements MessageExchangeListener {
+        public void onMessageExchange(MessageExchange exchange) throws MessagingException {
+            if (exchange.getStatus() == ExchangeStatus.ACTIVE) {
+                Fault fault = exchange.createFault();
+                fault.setContent(new StringSource("<fault/>"));
+                fail(exchange, fault);
+            }
+        }
+    }
+     
 }

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JMSComponentTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JMSComponentTest.java?rev=713983&r1=713982&r2=713983&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JMSComponentTest.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JMSComponentTest.java Fri Nov 14 04:01:06 2008
@@ -20,6 +20,8 @@
 import java.net.URI;
 import java.net.URL;
 
+import javax.activation.DataHandler;
+import javax.jbi.messaging.ExchangeStatus;
 import javax.jbi.messaging.InOnly;
 import javax.jbi.messaging.InOut;
 import javax.jbi.messaging.NormalizedMessage;
@@ -27,6 +29,7 @@
 import javax.jms.Message;
 import javax.jms.Session;
 import javax.jms.TextMessage;
+import javax.mail.util.ByteArrayDataSource;
 import javax.xml.namespace.QName;
 import javax.xml.transform.Source;
 
@@ -71,6 +74,7 @@
         File path = new File(new URI(url.toString()));
         path = path.getParentFile();
         component.getServiceUnitManager().deploy("provider", path.getAbsolutePath());
+        component.getServiceUnitManager().init("provider", path.getAbsolutePath());
         component.getServiceUnitManager().start("provider");
 
         // Call it
@@ -108,6 +112,7 @@
         File path = new File(new URI(url.toString()));
         path = path.getParentFile();
         component.getServiceUnitManager().deploy("provider", path.getAbsolutePath());
+        component.getServiceUnitManager().init("provider", path.getAbsolutePath());
         component.getServiceUnitManager().start("provider");
 
         // Call it
@@ -139,6 +144,7 @@
         File path = new File(new URI(url.toString()));
         path = path.getParentFile();
         component.getServiceUnitManager().deploy("consumer", path.getAbsolutePath());
+        component.getServiceUnitManager().init("consumer", path.getAbsolutePath());
         component.getServiceUnitManager().start("consumer");
 
         // Send test message
@@ -175,6 +181,7 @@
         File path = new File(new URI(url.toString()));
         path = path.getParentFile();
         component.getServiceUnitManager().deploy("provider", path.getAbsolutePath());
+        component.getServiceUnitManager().init("provider", path.getAbsolutePath());
         component.getServiceUnitManager().start("provider");
 
         // Deploy Consumer SU
@@ -183,19 +190,59 @@
         path = new File(new URI(url.toString()));
         path = path.getParentFile();
         component.getServiceUnitManager().deploy("consumer", path.getAbsolutePath());
+        component.getServiceUnitManager().init("consumer", path.getAbsolutePath());
         component.getServiceUnitManager().start("consumer");
 
-        // Call it
-        InOut inout = client.createInOutExchange();
+        InOut inout = null;
+        boolean result = false;
+        DataHandler dh = null;
+        
+        // Test successful return
+        inout = client.createInOutExchange();
         inout.setInterfaceName(new QName("http://jms.servicemix.org/Test", "ProviderInterface"));
         inout.getInMessage().setContent(new StringSource("<hello>world</hello>"));
-        boolean result = client.sendSync(inout);
+        dh = new DataHandler(new ByteArrayDataSource("myImage", "application/octet-stream"));
+        inout.getInMessage().addAttachment("myImage", dh);
+        result = client.sendSync(inout);
         assertTrue(result);
         NormalizedMessage out = inout.getOutMessage();
         assertNotNull(out);
         Source src = out.getContent();
         assertNotNull(src);
+        dh = out.getAttachment("myImage");
+        assertNotNull(dh);
+        
         logger.info(new SourceTransformer().toString(src));
+
+        // Test fault return 
+        container.deactivateComponent("receiver");
+        ReturnFaultComponent fault = new ReturnFaultComponent();
+        ActivationSpec asFault = new ActivationSpec("receiver", fault);
+        asFault.setService(new QName("http://jms.servicemix.org/Test", "Echo"));
+        container.activateComponent(asFault);
+
+        inout = client.createInOutExchange();
+        inout.setInterfaceName(new QName("http://jms.servicemix.org/Test", "ProviderInterface"));
+        inout.getInMessage().setContent(new StringSource("<hello>world</hello>"));
+        result = client.sendSync(inout);
+        assertTrue(result);
+        assertNotNull(inout.getFault());
+        client.done(inout);
+
+        // Test error return
+        container.deactivateComponent("receiver");
+        ReturnErrorComponent error = new ReturnErrorComponent(new IllegalArgumentException());
+        ActivationSpec asError = new ActivationSpec("receiver", error);
+        asError.setService(new QName("http://jms.servicemix.org/Test", "Echo"));
+        container.activateComponent(asError);
+
+        inout = client.createInOutExchange();
+        inout.setInterfaceName(new QName("http://jms.servicemix.org/Test", "ProviderInterface"));
+        inout.getInMessage().setContent(new StringSource("<hello>world</hello>"));
+        client.sendSync(inout);
+        assertEquals(ExchangeStatus.ERROR, inout.getStatus());
+        assertTrue("An IllegalArgumentException was expected", inout.getError() instanceof IllegalArgumentException);
+
     }
 
 }