You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2012/05/03 06:58:15 UTC

svn commit: r1333308 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/builder/ main/java/org/apache/camel/language/tokenizer/ test/java/org/apache/camel/processor/

Author: davsclaus
Date: Thu May  3 04:58:14 2012
New Revision: 1333308

URL: http://svn.apache.org/viewvc?rev=1333308&view=rev
Log:
CAMEL-5236: Added group option to tokenize xml to be able to splint into chunks of xml elements.

Added:
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitGroupMultiXmlTest.java
      - copied, changed from r1333072, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitGroupMultiLinesTest.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java?rev=1333308&r1=1333307&r2=1333308&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java Thu May  3 04:58:14 2012
@@ -500,6 +500,17 @@ public class ExpressionClause<T> extends
     }
 
     /**
+     * Evaluates a XML token expression on the message body with XML content
+     *
+     * @param tagName the the tag name of the child nodes to tokenize
+     * @param group to group by the given number
+     * @return the builder to continue processing the DSL
+     */
+    public T tokenizeXML(String tagName, int group) {
+        return tokenizeXML(tagName, null, group);
+    }
+
+    /**
      * Evaluates a token pair expression on the message body with XML content
      *
      * @param tagName the the tag name of the child nodes to tokenize
@@ -507,7 +518,19 @@ public class ExpressionClause<T> extends
      * @return the builder to continue processing the DSL
      */
     public T tokenizeXML(String tagName, String inheritNamespaceTagName) {
-        return delegate.tokenizeXMLPair(tagName, inheritNamespaceTagName);
+        return tokenizeXML(tagName, inheritNamespaceTagName, 0);
+    }
+
+    /**
+     * Evaluates a token pair expression on the message body with XML content
+     *
+     * @param tagName the the tag name of the child nodes to tokenize
+     * @param inheritNamespaceTagName  parent or root tag name that contains namespace(s) to inherit
+     * @param group to group by the given number
+     * @return the builder to continue processing the DSL
+     */
+    public T tokenizeXML(String tagName, String inheritNamespaceTagName, int group) {
+        return delegate.tokenizeXMLPair(tagName, inheritNamespaceTagName, group);
     }
 
     /**

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java?rev=1333308&r1=1333307&r2=1333308&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java Thu May  3 04:58:14 2012
@@ -547,13 +547,17 @@ public class ExpressionClauseSupport<T> 
      *
      * @param tagName the the tag name of the child nodes to tokenize
      * @param inheritNamespaceTagName  optional parent or root tag name that contains namespace(s) to inherit
+     * @param group to group by the given number
      * @return the builder to continue processing the DSL
      */
-    public T tokenizeXMLPair(String tagName, String inheritNamespaceTagName) {
+    public T tokenizeXMLPair(String tagName, String inheritNamespaceTagName, int group) {
         TokenizerExpression expression = new TokenizerExpression();
         expression.setToken(tagName);
         expression.setInheritNamespaceTagName(inheritNamespaceTagName);
         expression.setXml(true);
+        if (group > 0) {
+            expression.setGroup(group);
+        }
         setExpressionType(expression);
         return result;
     }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java?rev=1333308&r1=1333307&r2=1333308&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java Thu May  3 04:58:14 2012
@@ -98,24 +98,28 @@ public class TokenizeLanguage implements
     public Expression createExpression() {
         ObjectHelper.notNull(token, "token");
 
+        Expression answer = null;
         if (isXml()) {
-            return ExpressionBuilder.tokenizeXMLExpression(token, inheritNamespaceTagName);
+            answer = ExpressionBuilder.tokenizeXMLExpression(token, inheritNamespaceTagName);
         } else if (endToken != null) {
-            return ExpressionBuilder.tokenizePairExpression(token, endToken, includeTokens);
+            answer = ExpressionBuilder.tokenizePairExpression(token, endToken, includeTokens);
         }
 
-        // use the regular tokenizer
-        Expression answer;
-        Expression exp = headerName == null ? ExpressionBuilder.bodyExpression() : ExpressionBuilder.headerExpression(headerName);
-        if (regex) {
-            answer = ExpressionBuilder.regexTokenizeExpression(exp, token);
-        } else {
-            answer = ExpressionBuilder.tokenizeExpression(exp, token);
+        if (answer == null) {
+            // use the regular tokenizer
+            Expression exp = headerName == null ? ExpressionBuilder.bodyExpression() : ExpressionBuilder.headerExpression(headerName);
+            if (regex) {
+                answer = ExpressionBuilder.regexTokenizeExpression(exp, token);
+            } else {
+                answer = ExpressionBuilder.tokenizeExpression(exp, token);
+            }
         }
 
         // if group then wrap answer in group expression
         if (group > 0) {
-            answer = ExpressionBuilder.groupIteratorExpression(answer, token, group);
+            // only include group token if not xml
+            String groupToken = isXml() ? null : token;
+            answer = ExpressionBuilder.groupIteratorExpression(answer, groupToken, group);
         }
 
         return answer;

Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitGroupMultiXmlTest.java (from r1333072, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitGroupMultiLinesTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitGroupMultiXmlTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitGroupMultiXmlTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitGroupMultiLinesTest.java&r1=1333072&r2=1333308&rev=1333308&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitGroupMultiLinesTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitGroupMultiXmlTest.java Thu May  3 04:58:14 2012
@@ -17,31 +17,57 @@
 package org.apache.camel.processor;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
 
 /**
  *
  */
-public class SplitGroupMultiLinesTest extends ContextTestSupport {
+public class SplitGroupMultiXmlTest extends ContextTestSupport {
 
-    public void testSplitMultiLines() throws Exception {
-        getMockEndpoint("mock:group").expectedBodiesReceived("ABC\nDEF\nGHI", "JKL\nMN");
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/pair");
+        super.setUp();
+    }
+
+    public void testTokenXMLPairGroup() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:split");
+        mock.expectedMessageCount(3);
+        mock.message(0).body().isEqualTo("<order id=\"1\" xmlns=\"http:acme.com\">Camel in Action</order><order id=\"2\" xmlns=\"http:acme.com\">ActiveMQ in Action</order>");
+        mock.message(1).body().isEqualTo("<order id=\"3\" xmlns=\"http:acme.com\">Spring in Action</order><order id=\"4\" xmlns=\"http:acme.com\">Scala in Action</order>");
+        mock.message(2).body().isEqualTo("<order id=\"5\" xmlns=\"http:acme.com\">Groovy in Action</order>");
 
-        template.sendBody("direct:start", "ABC\nDEF\nGHI\nJKL\nMN");
+        String body = createBody();
+        template.sendBodyAndHeader("file:target/pair", body, Exchange.FILE_NAME, "orders.xml");
 
         assertMockEndpointsSatisfied();
     }
 
+    protected String createBody() {
+        StringBuilder sb = new StringBuilder("<?xml version=\"1.0\"?>\n");
+        sb.append("<orders xmlns=\"http:acme.com\">\n");
+        sb.append("  <order id=\"1\">Camel in Action</order>\n");
+        sb.append("  <order id=\"2\">ActiveMQ in Action</order>\n");
+        sb.append("  <order id=\"3\">Spring in Action</order>\n");
+        sb.append("  <order id=\"4\">Scala in Action</order>\n");
+        sb.append("  <order id=\"5\">Groovy in Action</order>\n");
+        sb.append("</orders>");
+        return sb.toString();
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
                 // START SNIPPET: e1
-                from("direct:start")
-                    // split by new line and group by 3
-                    .split().tokenize("\n", 3).streaming()
-                        .to("mock:group");
+                from("file:target/pair")
+                        // split the order child tags, and inherit namespaces from the orders root tag
+                        .split().tokenizeXML("order", "orders", 2)
+                        .to("log:split")
+                        .to("mock:split");
                 // END SNIPPET: e1
             }
         };