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 2020/10/02 05:08:07 UTC

[camel] branch master updated: [CAMEL-15610] avoid NPE in CamelXmlTreeParserHelper.parseCamelRouteTree (#4339)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new 01f7fae  [CAMEL-15610] avoid NPE in CamelXmlTreeParserHelper.parseCamelRouteTree (#4339)
01f7fae is described below

commit 01f7faec503e31a03ae905f256827001b830d7be
Author: Aurélien Pupier <ap...@redhat.com>
AuthorDate: Fri Oct 2 07:07:53 2020 +0200

    [CAMEL-15610] avoid NPE in CamelXmlTreeParserHelper.parseCamelRouteTree (#4339)
    
    when routes are empty
    
    Signed-off-by: Aurélien Pupier <ap...@redhat.com>
---
 .../parser/helper/CamelXmlTreeParserHelper.java    | 35 ++++++++++++----------
 .../camel/parser/model/CamelNodeDetails.java       |  4 +++
 .../apache/camel/parser/xml/XmlParseTreeTest.java  | 21 +++++++++++++
 3 files changed, 44 insertions(+), 16 deletions(-)

diff --git a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlTreeParserHelper.java b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlTreeParserHelper.java
index 34aaca8..382f950 100644
--- a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlTreeParserHelper.java
+++ b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlTreeParserHelper.java
@@ -44,22 +44,25 @@ public final class CamelXmlTreeParserHelper {
         // now parse the route node and build the correct model/tree structure of the EIPs
         // re-create factory as we rebuild the tree
         nodeFactory = CamelNodeDetailsFactory.newInstance();
-        CamelNodeDetails parent = route.getOutputs().get(0);
-
-        // we dont want the route element and only start with from
-        for (int i = 0; i < route.getOutputs().size(); i++) {
-            CamelNodeDetails node = route.getOutputs().get(i);
-            String name = node.getName();
-
-            if ("from".equals(name)) {
-                CamelNodeDetails from = nodeFactory.copyNode(null, "from", node);
-                from.setFileName(fullyQualifiedFileName);
-                answer.add(from);
-                parent = from;
-            } else {
-                // add straight to parent
-                parent.addOutput(node);
-                node.setFileName(fullyQualifiedFileName);
+        List<CamelNodeDetails> outputs = route.getOutputs();
+        if (outputs != null && !outputs.isEmpty()) {
+            CamelNodeDetails parent = outputs.get(0);
+
+            // we dont want the route element and only start with from
+            for (int i = 0; i < outputs.size(); i++) {
+                CamelNodeDetails node = outputs.get(i);
+                String name = node.getName();
+
+                if ("from".equals(name)) {
+                    CamelNodeDetails from = nodeFactory.copyNode(null, "from", node);
+                    from.setFileName(fullyQualifiedFileName);
+                    answer.add(from);
+                    parent = from;
+                } else {
+                    // add straight to parent
+                    parent.addOutput(node);
+                    node.setFileName(fullyQualifiedFileName);
+                }
             }
         }
 
diff --git a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetails.java b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetails.java
index ad98a57..2f5d8fa 100644
--- a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetails.java
+++ b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetails.java
@@ -17,6 +17,7 @@
 package org.apache.camel.parser.model;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 public class CamelNodeDetails {
@@ -84,6 +85,9 @@ public class CamelNodeDetails {
     }
 
     public List<CamelNodeDetails> getOutputs() {
+        if (outputs == null) {
+            return Collections.emptyList();
+        }
         return outputs;
     }
 
diff --git a/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlParseTreeTest.java b/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlParseTreeTest.java
index 904e4d1..62d0220 100644
--- a/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlParseTreeTest.java
+++ b/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlParseTreeTest.java
@@ -16,13 +16,17 @@
  */
 package org.apache.camel.parser.xml;
 
+import java.io.ByteArrayInputStream;
+import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
+import java.nio.file.Files;
 import java.util.List;
 
 import org.apache.camel.parser.XmlRouteParser;
 import org.apache.camel.parser.model.CamelNodeDetails;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,6 +37,9 @@ public class XmlParseTreeTest {
 
     private static final Logger LOG = LoggerFactory.getLogger(XmlParseTreeTest.class);
 
+    @TempDir
+    File tempDir;
+
     @Test
     void testXmlTree() throws Exception {
         InputStream is = new FileInputStream("src/test/resources/org/apache/camel/parser/xml/mycamel.xml");
@@ -55,4 +62,18 @@ public class XmlParseTreeTest {
         assertTrue(tree.contains("39\t  to"));
     }
 
+    @Test
+    void testXmlTreeWithEmptyRoute() throws Exception {
+        String textTotest = "<camelContext id=\"camel\" xmlns=\"http://camel.apache.org/schema/spring\">\r\n" +
+                            "    <route id=\"a route\">\r\n" +
+                            "    </route>\r\n" +
+                            "</camelContext>\n";
+        File camelFile = new File(tempDir, "testXmlTreeWithEmptyRoute.xml");
+        Files.copy(new ByteArrayInputStream(textTotest.getBytes()), camelFile.toPath());
+        List<CamelNodeDetails> list = XmlRouteParser.parseXmlRouteTree(new ByteArrayInputStream(textTotest.getBytes()), "",
+                camelFile.getAbsolutePath());
+
+        assertEquals(0, list.size());
+    }
+
 }