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;