camel-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bvah...@apache.org
Subject svn commit: r1296787 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/processor/UnmarshalProcessor.java main/java/org/apache/camel/spi/DataFormat.java test/java/org/apache/camel/processor/UnmarshalProcessorTest.java
Date Sun, 04 Mar 2012 12:39:03 GMT
Author: bvahdat
Date: Sun Mar  4 12:39:03 2012
New Revision: 1296787

URL: http://svn.apache.org/viewvc?rev=1296787&view=rev
Log:
CAMEL-4797: DataFormat.unmarshal() should allow to return Message or Exchange to make it more
flexible.

Added:
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/UnmarshalProcessorTest.java
  (with props)
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/UnmarshalProcessor.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/spi/DataFormat.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/UnmarshalProcessor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/UnmarshalProcessor.java?rev=1296787&r1=1296786&r2=1296787&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/UnmarshalProcessor.java
(original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/UnmarshalProcessor.java
Sun Mar  4 12:39:03 2012
@@ -23,6 +23,7 @@ import org.apache.camel.CamelContextAwar
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
+import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.Traceable;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.support.ServiceSupport;
@@ -50,13 +51,28 @@ public class UnmarshalProcessor extends 
 
         InputStream stream = ExchangeHelper.getMandatoryInBody(exchange, InputStream.class);
         try {
-            // lets setup the out message before we invoke the dataFormat
-            // so that it can mutate it if necessary
+            // lets setup the out message before we invoke the dataFormat so that it can
mutate it if necessary
             Message out = exchange.getOut();
             out.copyFrom(exchange.getIn());
 
             Object result = dataFormat.unmarshal(exchange, stream);
-            out.setBody(result);
+            if (result instanceof Exchange) {
+                if (result != exchange) {
+                    // it's not allowed to return another exchange other than the one provided
to dataFormat
+                    throw new RuntimeCamelException("The returned exchange " + result + "
is not the same as " + exchange + " provided to the DataFormat");
+                }
+            } else if (result instanceof Message) {
+                Message message = (Message) result;
+
+                // message body should be already set properly by the dataFormat
+                ObjectHelper.notNull(message.getBody(), "body", message);
+
+                // the dataformat has probably set headers, attachments, etc. so let's use
it as the outbound payload
+                exchange.setOut((Message) result);
+            } else {
+                ObjectHelper.notNull(result, "result");
+                out.setBody(result);
+            }
         } catch (Exception e) {
             // remove OUT message, as an exception occurred
             exchange.setOut(null);

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/DataFormat.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/DataFormat.java?rev=1296787&r1=1296786&r2=1296787&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/DataFormat.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/DataFormat.java Sun Mar  4 12:39:03
2012
@@ -20,6 +20,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.Message;
 
 /**
  * Represents a
@@ -48,11 +49,14 @@ public interface DataFormat {
      * <b>Notice:</b> The result is set as body on the exchange OUT message.
      * It is possible to mutate the OUT message provided in the given exchange parameter.
      * For instance adding headers to the OUT message will be preserved.
+     * <p/>
+     * It's also legal to return the <b>same</b> passed <tt>exchange</tt>
as is but also a
+     * {@link Message} object as well which will be used as the OUT message of <tt>exchange</tt>.
      *
      * @param exchange    the current exchange
      * @param stream      the input stream with the object to be unmarshalled
      * @return            the unmarshalled object
-     * @throws Exception can be thrown
+     * @throws Exception can be thrown, for example when the body of the OUT message becomes
<tt>null</tt>
      */
     Object unmarshal(Exchange exchange, InputStream stream) throws Exception;
 }

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/UnmarshalProcessorTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/UnmarshalProcessorTest.java?rev=1296787&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/UnmarshalProcessorTest.java
(added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/UnmarshalProcessorTest.java
Sun Mar  4 12:39:03 2012
@@ -0,0 +1,101 @@
+/**
+ * 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.camel.processor;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.TestSupport;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultMessage;
+import org.apache.camel.spi.DataFormat;
+
+public class UnmarshalProcessorTest extends TestSupport {
+
+    public void testDataFormatReturnsSameExchange() throws Exception {
+        Exchange exchange = createExchangeWithBody(new DefaultCamelContext(), "body");
+        UnmarshalProcessor processor = new UnmarshalProcessor(new MyDataFormat(exchange));
+
+        processor.process(exchange);
+
+        // as the process method call above acts as noop there's nothing to assert on
+    }
+
+    public void testDataFormatReturnsAnotherExchange() throws Exception {
+        CamelContext context = new DefaultCamelContext();
+        Exchange exchange = createExchangeWithBody(context, "body");
+        Exchange exchange2 = createExchangeWithBody(context, "body2");
+        UnmarshalProcessor processor = new UnmarshalProcessor(new MyDataFormat(exchange2));
+
+        try {
+            processor.process(exchange);
+            fail("Should have thrown exception");
+        } catch (RuntimeCamelException e) {
+            assertEquals("The returned exchange " + exchange2 + " is not the same as " +
exchange + " provided to the DataFormat", e.getMessage());
+        }
+    }
+
+    public void testDataFormatReturnsMessage() throws Exception {
+        Exchange exchange = createExchangeWithBody(new DefaultCamelContext(), "body");
+        Message out = new DefaultMessage();
+        out.setBody(new Object());
+        UnmarshalProcessor processor = new UnmarshalProcessor(new MyDataFormat(out));
+
+        processor.process(exchange);
+        assertEquals(out, exchange.getOut());
+    }
+
+    public void testDataFormatReturnsBody() throws Exception {
+        Exchange exchange = createExchangeWithBody(new DefaultCamelContext(), "body");
+        Object unmarshalled = new Object();
+        UnmarshalProcessor processor = new UnmarshalProcessor(new MyDataFormat(unmarshalled));
+
+        processor.process(exchange);
+        assertEquals(unmarshalled, exchange.getOut().getBody());
+    }
+
+    private static class MyDataFormat implements DataFormat {
+
+        private final Object object;
+
+        MyDataFormat(Exchange exchange) {
+            object = exchange;
+        }
+
+        MyDataFormat(Message message) {
+            object = message;
+        }
+
+        MyDataFormat(Object unmarshalled) {
+            object = unmarshalled;
+        }
+
+        @Override
+        public void marshal(Exchange exchange, Object graph, OutputStream stream) throws
Exception {
+            throw new IllegalAccessException("This method is not expected to be used by UnmarshalProcessor");
+        }
+
+        @Override
+        public Object unmarshal(Exchange exchange, InputStream stream) throws Exception {
+            return object;
+        }
+    }
+}

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/UnmarshalProcessorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native



Mime
View raw message