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 2022/01/03 17:23:59 UTC

[camel] branch main updated: CAMEL-17407: camel-core - Processor should support LineNumberAware

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 4a284c9  CAMEL-17407: camel-core - Processor should support LineNumberAware
4a284c9 is described below

commit 4a284c97c9b693d175ea9be1112585e5678cd62b
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Jan 3 18:23:14 2022 +0100

    CAMEL-17407: camel-core - Processor should support LineNumberAware
---
 .../camel/processor/DefaultProcessorFactory.java   | 17 +++++-
 .../org/apache/camel/reifier/ProcessReifier.java   |  7 +++
 .../camel/processor/LineNumberProcessorTest.java   | 71 ++++++++++++++++++++++
 .../camel/support/TypedProcessorFactory.java       | 17 +++++-
 4 files changed, 108 insertions(+), 4 deletions(-)

diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/DefaultProcessorFactory.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/DefaultProcessorFactory.java
index 8ffab7a..bab084b 100644
--- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/DefaultProcessorFactory.java
+++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/DefaultProcessorFactory.java
@@ -24,6 +24,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.ExchangePattern;
 import org.apache.camel.Expression;
 import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.LineNumberAware;
 import org.apache.camel.NamedNode;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.Processor;
@@ -71,7 +72,13 @@ public class DefaultProcessorFactory implements ProcessorFactory, BootstrapClose
             Object object = finder.newInstance(name).orElse(null);
             if (object instanceof ProcessorFactory) {
                 ProcessorFactory pc = (ProcessorFactory) object;
-                return pc.createChildProcessor(route, definition, mandatory);
+                Processor processor = pc.createChildProcessor(route, definition, mandatory);
+                if (processor instanceof LineNumberAware) {
+                    LineNumberAware lna = (LineNumberAware) processor;
+                    lna.setLineNumber(definition.getLineNumber());
+                    lna.setLocation(definition.getLocation());
+                }
+                return processor;
             }
         } catch (NoFactoryAvailableException e) {
             // ignore there is no custom factory
@@ -89,7 +96,13 @@ public class DefaultProcessorFactory implements ProcessorFactory, BootstrapClose
         }
         ProcessorFactory pc = finder.newInstance(name, ProcessorFactory.class).orElse(null);
         if (pc != null) {
-            return pc.createProcessor(route, definition);
+            Processor processor = pc.createProcessor(route, definition);
+            if (processor instanceof LineNumberAware) {
+                LineNumberAware lna = (LineNumberAware) processor;
+                lna.setLineNumber(definition.getLineNumber());
+                lna.setLocation(definition.getLocation());
+            }
+            return processor;
         }
 
         return null;
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessReifier.java
index b14a37f..94aa2bf 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessReifier.java
@@ -17,6 +17,7 @@
 package org.apache.camel.reifier;
 
 import org.apache.camel.AsyncProcessor;
+import org.apache.camel.LineNumberAware;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.Service;
@@ -40,6 +41,12 @@ public class ProcessReifier extends ProcessorReifier<ProcessDefinition> {
             answer = mandatoryLookup(definition.getRef(), Processor.class);
         }
 
+        if (answer instanceof LineNumberAware) {
+            LineNumberAware lna = (LineNumberAware) answer;
+            lna.setLineNumber(definition.getLineNumber());
+            lna.setLocation(definition.getLocation());
+        }
+
         // ensure its wrapped in a Service so we can manage it from eg. JMX
         // (a Processor must be a Service to be enlisted in JMX)
         if (!(answer instanceof Service)) {
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTest.java
new file mode 100644
index 0000000..8ce3d19
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTest.java
@@ -0,0 +1,71 @@
+package org.apache.camel.processor;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.LineNumberAware;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+
+public class LineNumberProcessorTest extends ContextTestSupport {
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        context.setTracing(true); // enables line numbering
+        return context;
+    }
+
+    @Test
+    public void testLineNumber() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("org.apache.camel.processor.LineNumberProcessorTest$1:35");
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .process(new MyProcessor())
+                        .to("mock:result");
+            }
+        };
+    }
+
+    private static class MyProcessor implements Processor, LineNumberAware {
+
+        private int lineNumber;
+        private String location;
+
+        @Override
+        public int getLineNumber() {
+            return lineNumber;
+        }
+
+        @Override
+        public void setLineNumber(int lineNumber) {
+            this.lineNumber = lineNumber;
+        }
+
+        @Override
+        public String getLocation() {
+            return location;
+        }
+
+        @Override
+        public void setLocation(String location) {
+            this.location = location;
+        }
+
+        @Override
+        public void process(Exchange exchange) throws Exception {
+            exchange.getMessage().setBody(location + ":" + lineNumber);
+        }
+    }
+}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/TypedProcessorFactory.java b/core/camel-support/src/main/java/org/apache/camel/support/TypedProcessorFactory.java
index 8fe5bac..765940d 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/TypedProcessorFactory.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/TypedProcessorFactory.java
@@ -17,6 +17,7 @@
 package org.apache.camel.support;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.LineNumberAware;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
@@ -32,7 +33,13 @@ public class TypedProcessorFactory<T extends NamedNode> implements ProcessorFact
     @Override
     public Processor createChildProcessor(Route route, NamedNode definition, boolean mandatory) throws Exception {
         if (type.isInstance(definition)) {
-            return doCreateChildProcessor(route, type.cast(definition), mandatory);
+            Processor processor = doCreateChildProcessor(route, type.cast(definition), mandatory);
+            if (processor instanceof LineNumberAware) {
+                LineNumberAware lna = (LineNumberAware) processor;
+                lna.setLineNumber(definition.getLineNumber());
+                lna.setLocation(definition.getLocation());
+            }
+            return processor;
         }
 
         return null;
@@ -41,7 +48,13 @@ public class TypedProcessorFactory<T extends NamedNode> implements ProcessorFact
     @Override
     public Processor createProcessor(Route route, NamedNode definition) throws Exception {
         if (type.isInstance(definition)) {
-            return doCreateProcessor(route, type.cast(definition));
+            Processor processor = doCreateProcessor(route, type.cast(definition));
+            if (processor instanceof LineNumberAware) {
+                LineNumberAware lna = (LineNumberAware) processor;
+                lna.setLineNumber(definition.getLineNumber());
+                lna.setLocation(definition.getLocation());
+            }
+            return processor;
         }
 
         return null;