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 2021/02/08 08:29:42 UTC

[camel] 02/03: CAMEL-16163: RoutesBuilderLoader to be static service to be reused.

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

commit 2d041497d550feb6c477749136d8bee93231f39c
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Feb 8 07:52:42 2021 +0100

    CAMEL-16163: RoutesBuilderLoader to be static service to be reused.
---
 .../language/joor/JoorRoutesBuilderLoader.java     | 25 ++++++--------
 .../org/apache/camel/spi/RoutesBuilderLoader.java  |  5 ++-
 .../java/org/apache/camel/spi/RoutesLoader.java    |  1 +
 .../camel/impl/engine/DefaultRoutesLoader.java     | 29 +++++++++++-----
 .../camel/support/RoutesBuilderLoaderSupport.java  | 40 ++++++++++++++++++++++
 .../camel/xml/in/XmlRoutesBuilderLoader.java       | 22 ++++--------
 .../camel/xml/jaxb/JaxbXmlRoutesBuilderLoader.java | 26 +++++---------
 7 files changed, 92 insertions(+), 56 deletions(-)

diff --git a/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorRoutesBuilderLoader.java b/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorRoutesBuilderLoader.java
index 8e397b8..6cdcef5 100644
--- a/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorRoutesBuilderLoader.java
+++ b/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorRoutesBuilderLoader.java
@@ -20,38 +20,37 @@ import java.io.InputStream;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
 import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.StartupStep;
+import org.apache.camel.api.management.ManagedAttribute;
+import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.RoutesBuilderLoader;
 import org.apache.camel.spi.StartupStepRecorder;
 import org.apache.camel.spi.annotations.JdkService;
 import org.apache.camel.support.ResourceHelper;
+import org.apache.camel.support.RoutesBuilderLoaderSupport;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.IOHelper;
 import org.joor.Reflect;
 
+@ManagedResource(description = "Managed JavaRoutesBuilderLoader")
 @JdkService(RoutesBuilderLoader.FACTORY_GROUP + "/" + JoorRoutesBuilderLoader.EXTENSION)
-public class JoorRoutesBuilderLoader implements RoutesBuilderLoader, CamelContextAware {
+public class JoorRoutesBuilderLoader extends RoutesBuilderLoaderSupport {
     public static final String EXTENSION = "java";
     public static final Pattern PACKAGE_PATTERN = Pattern.compile(
             "^\\s*package\\s+([a-zA-Z][\\.\\w]*)\\s*;.*$", Pattern.MULTILINE);
 
-    private CamelContext camelContext;
+    private StartupStepRecorder recorder;
 
     @Override
-    public CamelContext getCamelContext() {
-        return camelContext;
-    }
-
-    @Override
-    public void setCamelContext(CamelContext camelContext) {
-        this.camelContext = camelContext;
+    protected void doBuild() throws Exception {
+        super.doBuild();
+        recorder = getCamelContext().adapt(ExtendedCamelContext.class).getStartupStepRecorder();
     }
 
+    @ManagedAttribute(description = "Supported file extension")
     @Override
     public String getSupportedExtension() {
         return EXTENSION;
@@ -59,8 +58,6 @@ public class JoorRoutesBuilderLoader implements RoutesBuilderLoader, CamelContex
 
     @Override
     public RoutesBuilder loadRoutesBuilder(Resource resource) throws Exception {
-        StartupStepRecorder recorder = camelContext.adapt(ExtendedCamelContext.class).getStartupStepRecorder();
-
         try (InputStream is = resource.getInputStream()) {
             final String content = IOHelper.loadText(is);
             final String name = determineName(resource, content);
@@ -75,7 +72,7 @@ public class JoorRoutesBuilderLoader implements RoutesBuilderLoader, CamelContex
         }
     }
 
-    private String determineName(Resource resource, String content) {
+    private static String determineName(Resource resource, String content) {
         String loc = resource.getLocation();
         // strip scheme to compute the name
         String scheme = ResourceHelper.getScheme(loc);
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/RoutesBuilderLoader.java b/core/camel-api/src/main/java/org/apache/camel/spi/RoutesBuilderLoader.java
index c43c74f..f55da10 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/RoutesBuilderLoader.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/RoutesBuilderLoader.java
@@ -16,12 +16,15 @@
  */
 package org.apache.camel.spi;
 
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.RoutesBuilder;
+import org.apache.camel.StaticService;
 
 /**
  * SPI for loading {@link RoutesBuilder} from a {@link Resource}.
  */
-public interface RoutesBuilderLoader {
+public interface RoutesBuilderLoader extends StaticService, CamelContextAware {
+
     /**
      * Service factory base path for language specific loaders.
      */
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/RoutesLoader.java b/core/camel-api/src/main/java/org/apache/camel/spi/RoutesLoader.java
index 3c564c0..1c64dff 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/RoutesLoader.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/RoutesLoader.java
@@ -26,6 +26,7 @@ import org.apache.camel.RoutesBuilder;
  * SPI for loading {@link RoutesBuilder} from a list of {@link Resource}.
  */
 public interface RoutesLoader extends CamelContextAware {
+
     /**
      * Service factory key.
      */
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java
index 7f7f1b0..b7edaae 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java
@@ -21,7 +21,6 @@ import java.util.Collection;
 import java.util.List;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
 import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.spi.FactoryFinder;
@@ -32,7 +31,16 @@ import org.apache.camel.support.ResolverHelper;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.ObjectHelper;
 
+/**
+ * Default {@link RoutesLoader}.
+ */
 public class DefaultRoutesLoader implements RoutesLoader {
+
+    /**
+     * Prefix to use for looking up existing {@link RoutesLoader} from the {@link org.apache.camel.spi.Registry}.
+     */
+    public static final String ROUTES_LOADER_KEY_PREFIX = "routes-builder-loader-";
+
     private CamelContext camelContext;
 
     public DefaultRoutesLoader() {
@@ -78,20 +86,25 @@ public class DefaultRoutesLoader implements RoutesLoader {
      * @return                          a {@link RoutesBuilderLoader}
      * @throws IllegalArgumentException if no {@link RoutesBuilderLoader} can be found for the given file extension
      */
-    private RoutesBuilderLoader getRoutesLoader(String extension) {
-        RoutesBuilderLoader answer = getCamelContext().getRegistry().lookupByNameAndType(extension, RoutesBuilderLoader.class);
+    private RoutesBuilderLoader getRoutesLoader(String extension) throws Exception {
+        RoutesBuilderLoader answer = getCamelContext().getRegistry().lookupByNameAndType(ROUTES_LOADER_KEY_PREFIX + extension,
+                RoutesBuilderLoader.class);
 
         if (answer == null) {
             final ExtendedCamelContext ecc = getCamelContext().adapt(ExtendedCamelContext.class);
             final FactoryFinder finder = ecc.getBootstrapFactoryFinder(RoutesBuilderLoader.FACTORY_PATH);
 
             answer = ResolverHelper.resolveService(ecc, finder, extension, RoutesBuilderLoader.class).orElse(null);
-        }
-        if (answer == null) {
-            throw new IllegalArgumentException(
-                    "Unable to fina a RoutesBuilderLoader for resource with file extension: " + extension);
+            if (answer == null) {
+                throw new IllegalArgumentException(
+                        "Cannot find RoutesBuilderLoader in classpath supporting file extension: " + extension);
+            }
+            // add as service so its lifecycle is managed
+            getCamelContext().addService(answer);
+            // store loader so we can reuse it
+            getCamelContext().getRegistry().bind(ROUTES_LOADER_KEY_PREFIX + extension, answer);
         }
 
-        return CamelContextAware.trySetCamelContext(answer, getCamelContext());
+        return answer;
     }
 }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/RoutesBuilderLoaderSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/RoutesBuilderLoaderSupport.java
new file mode 100644
index 0000000..3a854d7
--- /dev/null
+++ b/core/camel-support/src/main/java/org/apache/camel/support/RoutesBuilderLoaderSupport.java
@@ -0,0 +1,40 @@
+/*
+ * 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.support;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.RoutesBuilderLoader;
+import org.apache.camel.support.service.ServiceSupport;
+
+/**
+ * Base class for {@link RoutesBuilderLoader} implementations.
+ */
+public abstract class RoutesBuilderLoaderSupport extends ServiceSupport implements RoutesBuilderLoader {
+
+    private CamelContext camelContext;
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+}
diff --git a/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/XmlRoutesBuilderLoader.java b/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/XmlRoutesBuilderLoader.java
index c9fe030..3547736 100644
--- a/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/XmlRoutesBuilderLoader.java
+++ b/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/XmlRoutesBuilderLoader.java
@@ -18,31 +18,23 @@ package org.apache.camel.xml.in;
 
 import java.io.InputStream;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
 import org.apache.camel.RoutesBuilder;
+import org.apache.camel.api.management.ManagedAttribute;
+import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.RoutesBuilderLoader;
 import org.apache.camel.spi.annotations.JdkService;
+import org.apache.camel.support.RoutesBuilderLoaderSupport;
 
+@ManagedResource(description = "Managed XML RoutesBuilderLoader")
 @JdkService(RoutesBuilderLoader.FACTORY_GROUP + "/" + XmlRoutesBuilderLoader.EXTENSION)
-public class XmlRoutesBuilderLoader implements RoutesBuilderLoader, CamelContextAware {
+public class XmlRoutesBuilderLoader extends RoutesBuilderLoaderSupport {
+
     public static final String EXTENSION = "xml";
     public static final String NAMESPACE = "http://camel.apache.org/schema/spring";
 
-    private CamelContext camelContext;
-
-    @Override
-    public CamelContext getCamelContext() {
-        return camelContext;
-    }
-
-    @Override
-    public void setCamelContext(CamelContext camelContext) {
-        this.camelContext = camelContext;
-    }
-
+    @ManagedAttribute(description = "Supported file extension")
     @Override
     public String getSupportedExtension() {
         return EXTENSION;
diff --git a/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbXmlRoutesBuilderLoader.java b/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbXmlRoutesBuilderLoader.java
index e17037b..bf4f3a8 100644
--- a/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbXmlRoutesBuilderLoader.java
+++ b/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbXmlRoutesBuilderLoader.java
@@ -18,9 +18,9 @@ package org.apache.camel.xml.jaxb;
 
 import java.io.InputStream;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
 import org.apache.camel.RoutesBuilder;
+import org.apache.camel.api.management.ManagedAttribute;
+import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.model.RouteTemplatesDefinition;
 import org.apache.camel.model.RoutesDefinition;
@@ -28,27 +28,17 @@ import org.apache.camel.model.rest.RestsDefinition;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.RoutesBuilderLoader;
 import org.apache.camel.spi.annotations.JdkService;
+import org.apache.camel.support.RoutesBuilderLoaderSupport;
 
-import static org.apache.camel.xml.jaxb.JaxbHelper.loadRestsDefinition;
-import static org.apache.camel.xml.jaxb.JaxbHelper.loadRouteTemplatesDefinition;
-import static org.apache.camel.xml.jaxb.JaxbHelper.loadRoutesDefinition;
+import static org.apache.camel.xml.jaxb.JaxbHelper.*;
 
+@ManagedResource(description = "Managed JAXB XML RoutesBuilderLoader")
 @JdkService(RoutesBuilderLoader.FACTORY_GROUP + "/" + JaxbXmlRoutesBuilderLoader.EXTENSION)
-public class JaxbXmlRoutesBuilderLoader implements RoutesBuilderLoader, CamelContextAware {
-    public static final String EXTENSION = "xml";
-
-    private CamelContext camelContext;
-
-    @Override
-    public CamelContext getCamelContext() {
-        return camelContext;
-    }
+public class JaxbXmlRoutesBuilderLoader extends RoutesBuilderLoaderSupport {
 
-    @Override
-    public void setCamelContext(CamelContext camelContext) {
-        this.camelContext = camelContext;
-    }
+    public static final String EXTENSION = "xml";
 
+    @ManagedAttribute(description = "Supported file extension")
     @Override
     public String getSupportedExtension() {
         return EXTENSION;