You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by js...@apache.org on 2008/03/04 15:09:55 UTC

svn commit: r633479 - in /activemq/camel/trunk/camel-core/src: main/java/org/apache/camel/builder/xml/ main/java/org/apache/camel/component/dataset/ test/java/org/apache/camel/component/dataset/

Author: jstrachan
Date: Tue Mar  4 06:09:54 2008
New Revision: 633479

URL: http://svn.apache.org/viewvc?rev=633479&view=rev
Log:
improvements to the DataSet support so its easier to create your own custom DataSet

Added:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSetSupport.java   (with props)
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/dataset/CustomDataSetTest.java
      - copied, changed from r633440, activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/dataset/DataSetTest.java
Modified:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XPathBuilder.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSet.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSetEndpoint.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/SimpleDataSet.java

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XPathBuilder.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XPathBuilder.java?rev=633479&r1=633478&r2=633479&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XPathBuilder.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/XPathBuilder.java Tue Mar  4 06:09:54 2008
@@ -42,6 +42,8 @@
 import org.apache.camel.spi.NamespaceAware;
 import org.apache.camel.util.ExchangeHelper;
 import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 
 /**
@@ -160,6 +162,16 @@
     }
 
     /**
+     * Sets the expression result type to boolean
+     *
+     * @return the current builder
+     */
+    public XPathBuilder<E> resultType(Class resultType) {
+        setResultType(resultType);
+        return this;
+    }
+
+    /**
      * Sets the object model URI to use
      * 
      * @return the current builder
@@ -376,6 +388,21 @@
 
     public void setResultType(Class resultType) {
         this.resultType = resultType;
+        if (Number.class.isAssignableFrom(resultType)) {
+            numberResult();
+        }
+        else if (String.class.isAssignableFrom(resultType)) {
+            stringResult();
+        }
+        else if (Boolean.class.isAssignableFrom(resultType)) {
+            booleanResult();
+        }
+        else if (Node.class.isAssignableFrom(resultType)) {
+            nodeResult();
+        }
+        else if (NodeList.class.isAssignableFrom(resultType)) {
+            nodeSetResult();
+        }
     }
 
     // Implementation methods
@@ -518,5 +545,4 @@
         }
         return answer;
     }
-
 }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSet.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSet.java?rev=633479&r1=633478&r2=633479&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSet.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSet.java Tue Mar  4 06:09:54 2008
@@ -21,7 +21,7 @@
 
 /**
  * Represents a strategy for testing endpoints with canned data.
- * 
+ *
  * @version $Revision: 1.1 $
  */
 public interface DataSet {
@@ -29,13 +29,18 @@
 
     /**
      * Populates a message exchange when using the DataSet as a source of messages
-     * 
+     *
      * @param exchange
      */
-    public void populateMessage(Exchange exchange, long messageIndex) throws Exception;
+    void populateMessage(Exchange exchange, long messageIndex) throws Exception;
 
     /**
      * Returns the size of the dataset
      */
-    public long getSize();
+    long getSize();
+
+    /**
+     * Asserts that the expected message has been received for the given index
+     */
+    void assertMessageExpected(DataSetEndpoint dataSetEndpoint, Exchange expected, Exchange actual, long index) throws Exception;
 }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSetEndpoint.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSetEndpoint.java?rev=633479&r1=633478&r2=633479&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSetEndpoint.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSetEndpoint.java Tue Mar  4 06:09:54 2008
@@ -28,6 +28,7 @@
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.PollingConsumer;
+import org.apache.camel.Message;
 import org.apache.camel.impl.EventDrivenPollingConsumer;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.util.ExchangeHelper;
@@ -43,6 +44,12 @@
     private DataSet dataSet;
     private AtomicInteger receivedCounter = new AtomicInteger();
 
+    public static void assertEquals(String description, Object expected, Object actual, Exchange exchange) {
+        if (!ObjectHelper.equal(expected, actual)) {
+            throw new AssertionError(description + " does not match. Expected: " + expected + " but was: " + actual + " on  " + exchange);
+        }
+    }
+
     public DataSetEndpoint(String endpointUri, Component component, DataSet dataSet) {
         super(endpointUri, component);
         this.dataSet = dataSet;
@@ -72,10 +79,14 @@
     /**
      * Creates a message exchange for the given index in the {@link DataSet}
      */
-    public Exchange createExchange(long counter) throws Exception {
-        Exchange expected = createExchange();
-        getDataSet().populateMessage(expected, counter);
-        return expected;
+    public Exchange createExchange(long messageIndex) throws Exception {
+        Exchange exchange = createExchange();
+        getDataSet().populateMessage(exchange, messageIndex);
+
+        Message in = exchange.getIn();
+        in.setHeader(DataSet.INDEX_HEADER, messageIndex);
+
+        return exchange;
     }
 
 
@@ -90,31 +101,20 @@
     @Override
     protected void performAssertions(Exchange actual) throws Exception {
         int receivedCount = receivedCounter.incrementAndGet();
-        long counter = receivedCount - 1;
-        Exchange expected = createExchange(counter);
+        long index = receivedCount - 1;
+        Exchange expected = createExchange(index);
 
         // now lets assert that they are the same
-        LOG.debug("Received message: " + counter + " = " + actual);
-        assertMessageExpected(counter, expected, actual);
+        LOG.debug("Received message: " + index + " = " + actual);
+
+        assertMessageExpected(index, expected, actual);
     }
 
-    protected void assertMessageExpected(long counter, Exchange expected, Exchange actual) throws InvalidPayloadException, NoSuchHeaderException {
+    protected void assertMessageExpected(long index, Exchange expected, Exchange actual) throws Exception {
         long actualCounter = ExchangeHelper.getMandatoryHeader(actual, DataSet.INDEX_HEADER, Long.class);
-        assertEquals(DataSet.INDEX_HEADER, counter, actualCounter, actual);
-
-        Object expectedBody = expected.getIn().getBody();
-        Object actualBody = actual.getIn().getBody();
-        if (expectedBody != null) {
-            // lets coerce to the correct type
-            actualBody = ExchangeHelper.getMandatoryInBody(actual, expectedBody.getClass());
-        }
-        assertEquals("message body", expectedBody, actualBody, actual);
-    }
+        assertEquals(DataSet.INDEX_HEADER, index, actualCounter, actual);
 
-    protected void assertEquals(String description, Object expected, Object actual, Exchange exchange) {
-        if (!ObjectHelper.equal(expected, actual)) {
-            throw new AssertionError(description + " does not match. Expected: " + expected + " but was: " + actual + " on  " + exchange);
-        }
+        getDataSet().assertMessageExpected(this, expected, actual, index);
     }
 
     public void start() throws Exception {

Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSetSupport.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSetSupport.java?rev=633479&view=auto
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSetSupport.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSetSupport.java Tue Mar  4 06:09:54 2008
@@ -0,0 +1,105 @@
+/**
+ *
+ * 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.component.dataset;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.util.ExchangeHelper;
+
+/**
+ * @version $Revision: 1.1 $
+ */
+public abstract class DataSetSupport implements DataSet {
+    private Map<String, Object> defaultHeaders;
+    private Processor outputTransformer;
+    private long size = 10;
+
+    public DataSetSupport() {
+    }
+
+    public DataSetSupport(int size) {
+        setSize(size);
+    }
+
+    public void populateMessage(Exchange exchange, long messageIndex) throws Exception {
+        Message in = exchange.getIn();
+        in.setBody(createMessageBody(messageIndex));
+        in.setHeaders(getDefaultHeaders());
+        applyHeaders(exchange, messageIndex);
+
+        if (outputTransformer != null) {
+            outputTransformer.process(exchange);
+        }
+    }
+
+    public void assertMessageExpected(DataSetEndpoint dataSetEndpoint, Exchange expected, Exchange actual, long index) throws Exception {
+        Object expectedBody = expected.getIn().getBody();
+        Object actualBody = actual.getIn().getBody();
+        if (expectedBody != null) {
+            // lets coerce to the correct type
+            actualBody = ExchangeHelper.getMandatoryInBody(actual, expectedBody.getClass());
+        }
+        DataSetEndpoint.assertEquals("message body", expectedBody, actualBody, actual);
+    }
+
+    public long getSize() {
+        return size;
+    }
+
+    public void setSize(long size) {
+        this.size = size;
+    }
+
+    public Map<String, Object> getDefaultHeaders() {
+        if (defaultHeaders == null) {
+            defaultHeaders = new HashMap<String, Object>();
+            populateDefaultHeaders(defaultHeaders);
+        }
+        return defaultHeaders;
+    }
+
+    public void setDefaultHeaders(Map<String, Object> defaultHeaders) {
+        this.defaultHeaders = defaultHeaders;
+    }
+
+    public Processor getOutputTransformer() {
+        return outputTransformer;
+    }
+
+    public void setOutputTransformer(Processor outputTransformer) {
+        this.outputTransformer = outputTransformer;
+    }
+
+    protected abstract Object createMessageBody(long messageIndex);
+
+    /**
+     * Allows derived classes to add some custom headers for a given message
+     */
+    protected void applyHeaders(Exchange exchange, long messageIndex) {
+    }
+
+    /**
+     * Allows derived classes to customize a default set of properties
+     */
+    protected void populateDefaultHeaders(Map<String, Object> map) {
+    }
+}
\ No newline at end of file

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/DataSetSupport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/SimpleDataSet.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/SimpleDataSet.java?rev=633479&r1=633478&r2=633479&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/SimpleDataSet.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/dataset/SimpleDataSet.java Tue Mar  4 06:09:54 2008
@@ -17,11 +17,6 @@
  */
 package org.apache.camel.component.dataset;
 
-import java.util.Map;
-import java.util.HashMap;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.Message;
 import org.apache.camel.Processor;
 
 /**
@@ -30,42 +25,20 @@
  *
  * @version $Revision: 1.1 $
  */
-public class SimpleDataSet implements DataSet {
+public class SimpleDataSet extends DataSetSupport {
     private Object defaultBody = "<hello>world!</hello>";
-    private Map<String,Object> defaultHeaders;
-    private Processor outputTransformer;
     private Processor inputTransformer;
-    private long size = 10;
 
     public SimpleDataSet() {
     }
 
     public SimpleDataSet(int size) {
-        setSize(size);
-    }
-
-    public void populateMessage(Exchange exchange, long messageIndex) throws Exception {
-        Message in = exchange.getIn();
-        in.setBody(getDefaultBody());
-        in.setHeaders(getDefaultHeaders());
-        applyHeaders(exchange, messageIndex);
-
-        if (outputTransformer != null) {
-            outputTransformer.process(exchange);
-        }
+        super(size);
     }
 
     // Properties
     //-------------------------------------------------------------------------
 
-    public long getSize() {
-        return size;
-    }
-
-    public void setSize(long size) {
-        this.size = size;
-    }
-
     public Object getDefaultBody() {
         return defaultBody;
     }
@@ -74,18 +47,6 @@
         this.defaultBody = defaultBody;
     }
 
-    public Map<String, Object> getDefaultHeaders() {
-        if (defaultHeaders == null) {
-            defaultHeaders = new HashMap<String, Object>();
-            populateDefaultHeaders(defaultHeaders);
-        }
-        return defaultHeaders;
-    }
-
-    public void setDefaultHeaders(Map<String, Object> defaultHeaders) {
-        this.defaultHeaders = defaultHeaders;
-    }
-
     public Processor getInputTransformer() {
         return inputTransformer;
     }
@@ -94,21 +55,13 @@
         this.inputTransformer = inputTransformer;
     }
 
-    public Processor getOutputTransformer() {
-        return outputTransformer;
-    }
-
-    public void setOutputTransformer(Processor outputTransformer) {
-        this.outputTransformer = outputTransformer;
-    }
-
     // Implementation methods
     //-------------------------------------------------------------------------
-    protected void applyHeaders(Exchange exchange, long messageIndex) {
-        Message in = exchange.getIn();
-        in.setHeader(DataSet.INDEX_HEADER, messageIndex);
-    }
 
-    protected void populateDefaultHeaders(Map<String, Object> map) {
+    /**
+     * Creates the message body for a given message
+     */
+    protected Object createMessageBody(long messageIndex) {
+        return getDefaultBody();
     }
 }

Copied: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/dataset/CustomDataSetTest.java (from r633440, activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/dataset/DataSetTest.java)
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/dataset/CustomDataSetTest.java?p2=activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/dataset/CustomDataSetTest.java&p1=activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/dataset/DataSetTest.java&r1=633440&r2=633479&rev=633479&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/dataset/DataSetTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/dataset/CustomDataSetTest.java Tue Mar  4 06:09:54 2008
@@ -20,16 +20,36 @@
 import javax.naming.Context;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.Predicate;
+import org.apache.camel.Expression;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.builder.PredicateBuilder;
+import org.apache.camel.builder.ExpressionBuilder;
+import org.apache.camel.builder.xml.XPathBuilder;
 
 /**
  * @version $Revision: 1.1 $
  */
-public class DataSetTest extends ContextTestSupport {
-    protected SimpleDataSet dataSet = new SimpleDataSet(20);
+public class CustomDataSetTest extends ContextTestSupport {
+    protected DataSet dataSet = new DataSetSupport() {
+        Expression<Exchange> expression = new XPathBuilder<Exchange>("/message/@index").resultType(Long.class);
+
+        @Override
+        public void assertMessageExpected(DataSetEndpoint dataSetEndpoint, Exchange expected, Exchange actual, long index) throws Exception {
+            // lets compare the XPath result
+            Predicate<Exchange> predicate = PredicateBuilder.isEqualTo(expression, ExpressionBuilder.constantExpression(index));
+            System.out.println(">>>> evaluating predicate: " + predicate);
+            predicate.assertMatches("Actual: " + actual, actual);
+        }
+
+        protected Object createMessageBody(long messageIndex) {
+            return "<message index='" + messageIndex + "'>someBody" + messageIndex + "</message>";
+        }
+    };
 
-    public void test() throws Exception {
+    public void testUsingCustomDataSet() throws Exception {
         MockEndpoint endpoint = getMockEndpoint("mock:results");
         endpoint.expectedMessageCount((int) dataSet.getSize());
 
@@ -55,4 +75,4 @@
             }
         };
     }
-}
+}
\ No newline at end of file