This is an automated email from the ASF dual-hosted git repository. lburgazzoli 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 04ba30c CAMEL-16136: replace BaseServiceResolver with a static helper method 04ba30c is described below commit 04ba30cc74304d7ff219051faa1fac4f13c49adc Author: Luca Burgazzoli <lburgazz...@gmail.com> AuthorDate: Wed Feb 3 12:57:16 2021 +0100 CAMEL-16136: replace BaseServiceResolver with a static helper method --- .../apache/camel/openapi/RestOpenApiSupport.java | 365 +++++++++++---------- .../services/org/apache/camel/routes-loader | 2 - .../impl/engine/BaseExecutorServiceManager.java | 16 +- .../camel/impl/engine/BaseServiceResolver.java | 67 ---- .../camel/impl/engine/DefaultRoutesLoader.java | 16 +- .../camel/impl/engine/SimpleCamelContext.java | 178 +++++----- .../org/apache/camel/support/ResolverHelper.java | 86 ++++- 7 files changed, 383 insertions(+), 347 deletions(-) diff --git a/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiSupport.java b/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiSupport.java index ed779ce..97ed492 100644 --- a/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiSupport.java +++ b/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiSupport.java @@ -44,11 +44,11 @@ import io.apicurio.datamodels.openapi.v3.models.Oas30Server; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.ExtendedCamelContext; -import org.apache.camel.impl.engine.BaseServiceResolver; import org.apache.camel.model.rest.RestDefinition; import org.apache.camel.spi.ClassResolver; import org.apache.camel.spi.RestConfiguration; import org.apache.camel.support.PatternHelper; +import org.apache.camel.support.ResolverHelper; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.URISupport; import org.slf4j.Logger; @@ -74,6 +74,181 @@ public class RestOpenApiSupport { private volatile RestDefinitionsResolver jmxRestDefinitionResolver; private boolean cors; + private static void setupCorsHeaders(RestApiResponseAdapter response, Map<String, String> corsHeaders) { + // use default value if none has been configured + String allowOrigin = corsHeaders != null ? corsHeaders.get("Access-Control-Allow-Origin") : null; + if (allowOrigin == null) { + allowOrigin = RestConfiguration.CORS_ACCESS_CONTROL_ALLOW_ORIGIN; + } + String allowMethods = corsHeaders != null ? corsHeaders.get("Access-Control-Allow-Methods") : null; + if (allowMethods == null) { + allowMethods = RestConfiguration.CORS_ACCESS_CONTROL_ALLOW_METHODS; + } + String allowHeaders = corsHeaders != null ? corsHeaders.get("Access-Control-Allow-Headers") : null; + if (allowHeaders == null) { + allowHeaders = RestConfiguration.CORS_ACCESS_CONTROL_ALLOW_HEADERS; + } + String maxAge = corsHeaders != null ? corsHeaders.get("Access-Control-Max-Age") : null; + if (maxAge == null) { + maxAge = RestConfiguration.CORS_ACCESS_CONTROL_MAX_AGE; + } + + if (LOG.isTraceEnabled()) { + LOG.trace("Using CORS headers["); + LOG.trace(" Access-Control-Allow-Origin={}", allowOrigin); + LOG.trace(" Access-Control-Allow-Methods={}", allowMethods); + LOG.trace(" Access-Control-Allow-Headers={}", allowHeaders); + LOG.trace(" Access-Control-Max-Age={}", maxAge); + LOG.trace("]"); + } + response.setHeader("Access-Control-Allow-Origin", allowOrigin); + response.setHeader("Access-Control-Allow-Methods", allowMethods); + response.setHeader("Access-Control-Allow-Headers", allowHeaders); + response.setHeader("Access-Control-Max-Age", maxAge); + } + + static void setupXForwardedHeaders(OasDocument openApi, Map<String, Object> headers) { + + String basePath = getBasePathFromOasDocument(openApi); + + if (openApi instanceof Oas20Document) { + String host = (String) headers.get(HEADER_HOST); + if (ObjectHelper.isNotEmpty(host)) { + ((Oas20Document) openApi).host = host; + } + + String forwardedPrefix = (String) headers.get(HEADER_X_FORWARDED_PREFIX); + if (ObjectHelper.isNotEmpty(forwardedPrefix)) { + ((Oas20Document) openApi).basePath = URISupport.joinPaths(forwardedPrefix, basePath); + } + + String forwardedHost = (String) headers.get(HEADER_X_FORWARDED_HOST); + if (ObjectHelper.isNotEmpty(forwardedHost)) { + ((Oas20Document) openApi).host = forwardedHost; + } + + String proto = (String) headers.get(HEADER_X_FORWARDED_PROTO); + if (ObjectHelper.isNotEmpty(proto)) { + String[] schemes = proto.split(","); + for (String scheme : schemes) { + String trimmedScheme = scheme.trim(); + if (ObjectHelper.isNotEmpty(trimmedScheme)) { + if (((Oas20Document) openApi).schemes == null) { + ((Oas20Document) openApi).schemes = new ArrayList(); + } + ((Oas20Document) openApi).schemes.add(trimmedScheme.toLowerCase()); + } + } + } + } else if (openApi instanceof Oas30Document) { + + String host = (String) headers.get(HEADER_HOST); + + String forwardedPrefix = (String) headers.get(HEADER_X_FORWARDED_PREFIX); + + if (ObjectHelper.isNotEmpty(forwardedPrefix)) { + basePath = URISupport.joinPaths(forwardedPrefix, basePath); + } + + String forwardedHost = (String) headers.get(HEADER_X_FORWARDED_HOST); + if (ObjectHelper.isNotEmpty(forwardedHost)) { + host = forwardedHost; + } + + String proto = (String) headers.get(HEADER_X_FORWARDED_PROTO); + if (((Oas30Document) openApi).getServers() != null) { + ((Oas30Document) openApi).getServers().clear(); + } + if (ObjectHelper.isNotEmpty(proto)) { + String[] schemes = proto.split(","); + for (String schema : schemes) { + String trimmedScheme = schema.trim(); + String serverUrl = new StringBuilder().append(trimmedScheme.toLowerCase()).append("://").append(host) + .append(basePath).toString(); + ((Oas30Document) openApi).addServer(serverUrl, null); + + } + } else { + ((Oas30Document) openApi).addServer(basePath, null); + } + + } + } + + public static String getHostFromOasDocument(final OasDocument openapi) { + String host = null; + if (openapi instanceof Oas20Document) { + host = ((Oas20Document) openapi).host; + } else if (openapi instanceof Oas30Document) { + if (((Oas30Document) openapi).getServers() != null + && ((Oas30Document) openapi).getServers().get(0) != null) { + try { + URL serverUrl = new URL( + parseVariables(((Oas30Document) openapi).getServers().get(0).url, + (Oas30Server) ((Oas30Document) openapi).getServers().get(0))); + host = serverUrl.getHost(); + + } catch (MalformedURLException e) { + LOG.info("error when parsing OpenApi 3.0 doc server url", e); + } + } + } + return host; + + } + + public static String getBasePathFromOasDocument(final OasDocument openapi) { + String basePath = null; + if (openapi instanceof Oas20Document) { + basePath = ((Oas20Document) openapi).basePath; + } else if (openapi instanceof Oas30Document) { + if (((Oas30Document) openapi).getServers() != null + && ((Oas30Document) openapi).getServers().get(0) != null) { + try { + Oas30Server server = (Oas30Server) ((Oas30Document) openapi).getServers().get(0); + if (server.variables != null && server.variables.get("basePath") != null) { + basePath = server.variables.get("basePath").default_; + } + if (basePath == null) { + // parse server url as fallback + URL serverUrl = new URL( + parseVariables(((Oas30Document) openapi).getServers().get(0).url, + (Oas30Server) ((Oas30Document) openapi).getServers().get(0))); + basePath = serverUrl.getPath(); + if (basePath.indexOf("//") == 0) { + // strip off the first "/" if double "/" exists + basePath = basePath.substring(1); + } + if ("/".equals(basePath)) { + basePath = ""; + } + } + + } catch (MalformedURLException e) { + //not a valid whole url, just the basePath + basePath = ((Oas30Document) openapi).getServers().get(0).url; + } + } + + } + return basePath; + + } + + public static String parseVariables(String url, Oas30Server server) { + Pattern p = Pattern.compile("\\{(.*?)\\}"); + Matcher m = p.matcher(url); + while (m.find()) { + + String var = m.group(1); + if (server != null && server.variables != null && server.variables.get(var) != null) { + String varValue = server.variables.get(var).default_; + url = url.replace("{" + var + "}", varValue); + } + } + return url; + } + public void initOpenApi(BeanConfig openApiConfig, Map<String, Object> config) { // configure openApi options String s = (String) config.get("openapi.version"); @@ -194,12 +369,13 @@ public class RestOpenApiSupport { } protected RestDefinitionsResolver createJmxRestDefinitionsResolver(CamelContext camelContext) { - return new BaseServiceResolver<>( - JMX_REST_DEFINITION_RESOLVER, RestDefinitionsResolver.class, - camelContext.adapt(ExtendedCamelContext.class).getBootstrapFactoryFinder()) - .resolve(camelContext) - .orElseThrow( - () -> new IllegalArgumentException("Cannot find camel-openapi-java on classpath.")); + return ResolverHelper.resolveService( + camelContext, + camelContext.adapt(ExtendedCamelContext.class).getBootstrapFactoryFinder(), + JMX_REST_DEFINITION_RESOLVER, + RestDefinitionsResolver.class) + .orElseThrow( + () -> new IllegalArgumentException("Cannot find camel-openapi-java on classpath.")); } public void renderResourceListing( @@ -348,179 +524,4 @@ public class RestOpenApiSupport { } return jmxRestDefinitionResolver.findCamelContexts(); } - - private static void setupCorsHeaders(RestApiResponseAdapter response, Map<String, String> corsHeaders) { - // use default value if none has been configured - String allowOrigin = corsHeaders != null ? corsHeaders.get("Access-Control-Allow-Origin") : null; - if (allowOrigin == null) { - allowOrigin = RestConfiguration.CORS_ACCESS_CONTROL_ALLOW_ORIGIN; - } - String allowMethods = corsHeaders != null ? corsHeaders.get("Access-Control-Allow-Methods") : null; - if (allowMethods == null) { - allowMethods = RestConfiguration.CORS_ACCESS_CONTROL_ALLOW_METHODS; - } - String allowHeaders = corsHeaders != null ? corsHeaders.get("Access-Control-Allow-Headers") : null; - if (allowHeaders == null) { - allowHeaders = RestConfiguration.CORS_ACCESS_CONTROL_ALLOW_HEADERS; - } - String maxAge = corsHeaders != null ? corsHeaders.get("Access-Control-Max-Age") : null; - if (maxAge == null) { - maxAge = RestConfiguration.CORS_ACCESS_CONTROL_MAX_AGE; - } - - if (LOG.isTraceEnabled()) { - LOG.trace("Using CORS headers["); - LOG.trace(" Access-Control-Allow-Origin={}", allowOrigin); - LOG.trace(" Access-Control-Allow-Methods={}", allowMethods); - LOG.trace(" Access-Control-Allow-Headers={}", allowHeaders); - LOG.trace(" Access-Control-Max-Age={}", maxAge); - LOG.trace("]"); - } - response.setHeader("Access-Control-Allow-Origin", allowOrigin); - response.setHeader("Access-Control-Allow-Methods", allowMethods); - response.setHeader("Access-Control-Allow-Headers", allowHeaders); - response.setHeader("Access-Control-Max-Age", maxAge); - } - - static void setupXForwardedHeaders(OasDocument openApi, Map<String, Object> headers) { - - String basePath = getBasePathFromOasDocument(openApi); - - if (openApi instanceof Oas20Document) { - String host = (String) headers.get(HEADER_HOST); - if (ObjectHelper.isNotEmpty(host)) { - ((Oas20Document) openApi).host = host; - } - - String forwardedPrefix = (String) headers.get(HEADER_X_FORWARDED_PREFIX); - if (ObjectHelper.isNotEmpty(forwardedPrefix)) { - ((Oas20Document) openApi).basePath = URISupport.joinPaths(forwardedPrefix, basePath); - } - - String forwardedHost = (String) headers.get(HEADER_X_FORWARDED_HOST); - if (ObjectHelper.isNotEmpty(forwardedHost)) { - ((Oas20Document) openApi).host = forwardedHost; - } - - String proto = (String) headers.get(HEADER_X_FORWARDED_PROTO); - if (ObjectHelper.isNotEmpty(proto)) { - String[] schemes = proto.split(","); - for (String scheme : schemes) { - String trimmedScheme = scheme.trim(); - if (ObjectHelper.isNotEmpty(trimmedScheme)) { - if (((Oas20Document) openApi).schemes == null) { - ((Oas20Document) openApi).schemes = new ArrayList(); - } - ((Oas20Document) openApi).schemes.add(trimmedScheme.toLowerCase()); - } - } - } - } else if (openApi instanceof Oas30Document) { - - String host = (String) headers.get(HEADER_HOST); - - String forwardedPrefix = (String) headers.get(HEADER_X_FORWARDED_PREFIX); - - if (ObjectHelper.isNotEmpty(forwardedPrefix)) { - basePath = URISupport.joinPaths(forwardedPrefix, basePath); - } - - String forwardedHost = (String) headers.get(HEADER_X_FORWARDED_HOST); - if (ObjectHelper.isNotEmpty(forwardedHost)) { - host = forwardedHost; - } - - String proto = (String) headers.get(HEADER_X_FORWARDED_PROTO); - if (((Oas30Document) openApi).getServers() != null) { - ((Oas30Document) openApi).getServers().clear(); - } - if (ObjectHelper.isNotEmpty(proto)) { - String[] schemes = proto.split(","); - for (String schema : schemes) { - String trimmedScheme = schema.trim(); - String serverUrl = new StringBuilder().append(trimmedScheme.toLowerCase()).append("://").append(host) - .append(basePath).toString(); - ((Oas30Document) openApi).addServer(serverUrl, null); - - } - } else { - ((Oas30Document) openApi).addServer(basePath, null); - } - - } - } - - public static String getHostFromOasDocument(final OasDocument openapi) { - String host = null; - if (openapi instanceof Oas20Document) { - host = ((Oas20Document) openapi).host; - } else if (openapi instanceof Oas30Document) { - if (((Oas30Document) openapi).getServers() != null - && ((Oas30Document) openapi).getServers().get(0) != null) { - try { - URL serverUrl = new URL( - parseVariables(((Oas30Document) openapi).getServers().get(0).url, - (Oas30Server) ((Oas30Document) openapi).getServers().get(0))); - host = serverUrl.getHost(); - - } catch (MalformedURLException e) { - LOG.info("error when parsing OpenApi 3.0 doc server url", e); - } - } - } - return host; - - } - - public static String getBasePathFromOasDocument(final OasDocument openapi) { - String basePath = null; - if (openapi instanceof Oas20Document) { - basePath = ((Oas20Document) openapi).basePath; - } else if (openapi instanceof Oas30Document) { - if (((Oas30Document) openapi).getServers() != null - && ((Oas30Document) openapi).getServers().get(0) != null) { - try { - Oas30Server server = (Oas30Server) ((Oas30Document) openapi).getServers().get(0); - if (server.variables != null && server.variables.get("basePath") != null) { - basePath = server.variables.get("basePath").default_; - } - if (basePath == null) { - // parse server url as fallback - URL serverUrl = new URL( - parseVariables(((Oas30Document) openapi).getServers().get(0).url, - (Oas30Server) ((Oas30Document) openapi).getServers().get(0))); - basePath = serverUrl.getPath(); - if (basePath.indexOf("//") == 0) { - // strip off the first "/" if double "/" exists - basePath = basePath.substring(1); - } - if ("/".equals(basePath)) { - basePath = ""; - } - } - - } catch (MalformedURLException e) { - //not a valid whole url, just the basePath - basePath = ((Oas30Document) openapi).getServers().get(0).url; - } - } - - } - return basePath; - - } - - public static String parseVariables(String url, Oas30Server server) { - Pattern p = Pattern.compile("\\{(.*?)\\}"); - Matcher m = p.matcher(url); - while (m.find()) { - - String var = m.group(1); - if (server != null && server.variables != null && server.variables.get(var) != null) { - String varValue = server.variables.get(var).default_; - url = url.replace("{" + var + "}", varValue); - } - } - return url; - } } diff --git a/core/camel-base-engine/src/generated/resources/META-INF/services/org/apache/camel/routes-loader b/core/camel-base-engine/src/generated/resources/META-INF/services/org/apache/camel/routes-loader deleted file mode 100644 index ce58158..0000000 --- a/core/camel-base-engine/src/generated/resources/META-INF/services/org/apache/camel/routes-loader +++ /dev/null @@ -1,2 +0,0 @@ -# Generated by camel build tools - do NOT edit this file! -class=org.apache.camel.impl.engine.DefaultRoutesLoader diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java index 40ab6a8..43cdd96 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java @@ -40,6 +40,7 @@ import org.apache.camel.spi.ThreadPoolFactory; import org.apache.camel.spi.ThreadPoolProfile; import org.apache.camel.support.CamelContextHelper; import org.apache.camel.support.DefaultThreadPoolFactory; +import org.apache.camel.support.ResolverHelper; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.support.service.ServiceSupport; import org.apache.camel.util.ObjectHelper; @@ -61,12 +62,12 @@ public class BaseExecutorServiceManager extends ServiceSupport implements Execut private static final Logger LOG = LoggerFactory.getLogger(BaseExecutorServiceManager.class); private final CamelContext camelContext; - private ThreadPoolFactory threadPoolFactory; private final List<ExecutorService> executorServices = new CopyOnWriteArrayList<>(); + private final Map<String, ThreadPoolProfile> threadPoolProfiles = new ConcurrentHashMap<>(); + private ThreadPoolFactory threadPoolFactory; private String threadNamePattern; private long shutdownAwaitTermination = 10000; private String defaultThreadPoolProfileId = "defaultThreadPoolProfile"; - private final Map<String, ThreadPoolProfile> threadPoolProfiles = new ConcurrentHashMap<>(); private ThreadPoolProfile defaultProfile; public BaseExecutorServiceManager(CamelContext camelContext) { @@ -447,11 +448,12 @@ public class BaseExecutorServiceManager extends ServiceSupport implements Execut // discover thread pool factory if (threadPoolFactory == null) { - threadPoolFactory = new BaseServiceResolver<>( - ThreadPoolFactory.FACTORY, ThreadPoolFactory.class, - camelContext.adapt(ExtendedCamelContext.class).getBootstrapFactoryFinder()) - .resolve(camelContext) - .orElseGet(DefaultThreadPoolFactory::new); + threadPoolFactory = ResolverHelper.resolveService( + camelContext, + camelContext.adapt(ExtendedCamelContext.class).getBootstrapFactoryFinder(), + ThreadPoolFactory.FACTORY, + ThreadPoolFactory.class) + .orElseGet(DefaultThreadPoolFactory::new); } if (threadPoolFactory instanceof CamelContextAware) { ((CamelContextAware) threadPoolFactory).setCamelContext(camelContext); diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BaseServiceResolver.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BaseServiceResolver.java deleted file mode 100644 index 73b0fe5..0000000 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BaseServiceResolver.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.impl.engine; - -import java.util.Optional; - -import org.apache.camel.CamelContext; -import org.apache.camel.spi.FactoryFinder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class BaseServiceResolver<T> { - - protected final Logger log = LoggerFactory.getLogger(getClass()); - - protected final String factoryKey; - protected final Class<T> factoryClass; - protected final FactoryFinder factoryFinder; - - public BaseServiceResolver(String factoryKey, Class<T> factoryClass, FactoryFinder factoryFinder) { - this.factoryKey = factoryKey; - this.factoryClass = factoryClass; - this.factoryFinder = factoryFinder; - } - - public Optional<T> resolve(CamelContext context) { - // use factory finder to find a custom implementations - Class<?> type = null; - - try { - type = factoryFinder.findClass(factoryKey).orElse(null); - } catch (Exception e) { - // ignore - } - - if (type != null) { - if (log.isDebugEnabled()) { - log.debug("Found {}: {} via: {}{}", factoryClass.getSimpleName(), type.getName(), FactoryFinder.DEFAULT_PATH, - factoryKey); - } - if (factoryClass.isAssignableFrom(type)) { - T answer = factoryClass.cast(context.getInjector().newInstance(type, false)); - log.debug("Detected and using {}: {}", factoryClass.getSimpleName(), answer); - return Optional.of(answer); - } else { - throw new IllegalArgumentException( - "Type is not a " + factoryClass.getSimpleName() + " implementation. Found: " + type.getName()); - } - } - return Optional.empty(); - } - -} 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 e0ff2e9..7f7f1b0 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 @@ -19,7 +19,6 @@ package org.apache.camel.impl.engine; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Optional; import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; @@ -29,11 +28,10 @@ import org.apache.camel.spi.FactoryFinder; import org.apache.camel.spi.Resource; import org.apache.camel.spi.RoutesBuilderLoader; import org.apache.camel.spi.RoutesLoader; -import org.apache.camel.spi.annotations.JdkService; +import org.apache.camel.support.ResolverHelper; import org.apache.camel.util.FileUtil; import org.apache.camel.util.ObjectHelper; -@JdkService(RoutesLoader.FACTORY) public class DefaultRoutesLoader implements RoutesLoader { private CamelContext camelContext; @@ -87,21 +85,13 @@ public class DefaultRoutesLoader implements RoutesLoader { final ExtendedCamelContext ecc = getCamelContext().adapt(ExtendedCamelContext.class); final FactoryFinder finder = ecc.getBootstrapFactoryFinder(RoutesBuilderLoader.FACTORY_PATH); - final BaseServiceResolver<RoutesBuilderLoader> resolver - = new BaseServiceResolver<>(extension, RoutesBuilderLoader.class, finder); - final Optional<RoutesBuilderLoader> loader - = resolver.resolve(ecc); - - if (loader.isPresent()) { - return CamelContextAware.trySetCamelContext(loader.get(), ecc); - } + 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); } - return answer; + return CamelContextAware.trySetCamelContext(answer, getCamelContext()); } } diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java index 9ca22de..92b95f7 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java @@ -78,6 +78,7 @@ import org.apache.camel.spi.ValidatorRegistry; import org.apache.camel.spi.XMLRoutesDefinitionLoader; import org.apache.camel.support.DefaultRegistry; import org.apache.camel.support.DefaultUuidGenerator; +import org.apache.camel.support.ResolverHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -116,9 +117,12 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected HealthCheckRegistry createHealthCheckRegistry() { - BaseServiceResolver<HealthCheckRegistry> resolver = new BaseServiceResolver<>( - HealthCheckRegistry.FACTORY, HealthCheckRegistry.class, getBootstrapFactoryFinder()); - Optional<HealthCheckRegistry> result = resolver.resolve(getCamelContextReference()); + Optional<HealthCheckRegistry> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + HealthCheckRegistry.FACTORY, + HealthCheckRegistry.class); + return result.orElse(null); } @@ -155,14 +159,13 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected PropertiesComponent createPropertiesComponent() { - BaseServiceResolver<PropertiesComponent> resolver = new BaseServiceResolver<>( - PropertiesComponent.FACTORY, PropertiesComponent.class, getBootstrapFactoryFinder()); - Optional<PropertiesComponent> result = resolver.resolve(getCamelContextReference()); - if (result.isPresent()) { - return result.get(); - } else { - return new org.apache.camel.component.properties.PropertiesComponent(); - } + Optional<PropertiesComponent> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + PropertiesComponent.FACTORY, + PropertiesComponent.class); + + return result.orElseGet(org.apache.camel.component.properties.PropertiesComponent::new); } @Override @@ -192,9 +195,12 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected ModelJAXBContextFactory createModelJAXBContextFactory() { - BaseServiceResolver<ModelJAXBContextFactory> resolver = new BaseServiceResolver<>( - ModelJAXBContextFactory.FACTORY, ModelJAXBContextFactory.class, getBootstrapFactoryFinder()); - Optional<ModelJAXBContextFactory> result = resolver.resolve(getCamelContextReference()); + Optional<ModelJAXBContextFactory> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + ModelJAXBContextFactory.FACTORY, + ModelJAXBContextFactory.class); + if (result.isPresent()) { return result.get(); } else { @@ -220,9 +226,12 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected ProcessorFactory createProcessorFactory() { - BaseServiceResolver<ProcessorFactory> resolver - = new BaseServiceResolver<>(ProcessorFactory.FACTORY, ProcessorFactory.class, getBootstrapFactoryFinder()); - Optional<ProcessorFactory> result = resolver.resolve(getCamelContextReference()); + Optional<ProcessorFactory> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + ProcessorFactory.FACTORY, + ProcessorFactory.class); + if (result.isPresent()) { return result.get(); } else { @@ -233,9 +242,12 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected InternalProcessorFactory createInternalProcessorFactory() { - BaseServiceResolver<InternalProcessorFactory> resolver = new BaseServiceResolver<>( - InternalProcessorFactory.FACTORY, InternalProcessorFactory.class, getBootstrapFactoryFinder()); - Optional<InternalProcessorFactory> result = resolver.resolve(getCamelContextReference()); + Optional<InternalProcessorFactory> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + InternalProcessorFactory.FACTORY, + InternalProcessorFactory.class); + if (result.isPresent()) { return result.get(); } else { @@ -310,9 +322,12 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected RuntimeCamelCatalog createRuntimeCamelCatalog() { - BaseServiceResolver<RuntimeCamelCatalog> resolver = new BaseServiceResolver<>( - RuntimeCamelCatalog.FACTORY, RuntimeCamelCatalog.class, getBootstrapFactoryFinder()); - Optional<RuntimeCamelCatalog> result = resolver.resolve(getCamelContextReference()); + Optional<RuntimeCamelCatalog> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + RuntimeCamelCatalog.FACTORY, + RuntimeCamelCatalog.class); + if (result.isPresent()) { return result.get(); } else { @@ -333,21 +348,23 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected HeadersMapFactory createHeadersMapFactory() { - BaseServiceResolver<HeadersMapFactory> resolver - = new BaseServiceResolver<>(HeadersMapFactory.FACTORY, HeadersMapFactory.class, getBootstrapFactoryFinder()); - Optional<HeadersMapFactory> result = resolver.resolve(getCamelContextReference()); - if (result.isPresent()) { - return result.get(); - } else { - return new DefaultHeadersMapFactory(); - } + Optional<HeadersMapFactory> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + HeadersMapFactory.FACTORY, + HeadersMapFactory.class); + + return result.orElseGet(DefaultHeadersMapFactory::new); } @Override protected BeanProxyFactory createBeanProxyFactory() { - BaseServiceResolver<BeanProxyFactory> resolver - = new BaseServiceResolver<>(BeanProxyFactory.FACTORY, BeanProxyFactory.class, getBootstrapFactoryFinder()); - Optional<BeanProxyFactory> result = resolver.resolve(getCamelContextReference()); + Optional<BeanProxyFactory> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + BeanProxyFactory.FACTORY, + BeanProxyFactory.class); + if (result.isPresent()) { return result.get(); } else { @@ -357,9 +374,12 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected AnnotationBasedProcessorFactory createAnnotationBasedProcessorFactory() { - BaseServiceResolver<AnnotationBasedProcessorFactory> resolver = new BaseServiceResolver<>( - AnnotationBasedProcessorFactory.FACTORY, AnnotationBasedProcessorFactory.class, getBootstrapFactoryFinder()); - Optional<AnnotationBasedProcessorFactory> result = resolver.resolve(getCamelContextReference()); + Optional<AnnotationBasedProcessorFactory> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + AnnotationBasedProcessorFactory.FACTORY, + AnnotationBasedProcessorFactory.class); + if (result.isPresent()) { return result.get(); } else { @@ -370,9 +390,12 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected DeferServiceFactory createDeferServiceFactory() { - BaseServiceResolver<DeferServiceFactory> resolver = new BaseServiceResolver<>( - DeferServiceFactory.FACTORY, DeferServiceFactory.class, getBootstrapFactoryFinder()); - Optional<DeferServiceFactory> result = resolver.resolve(getCamelContextReference()); + Optional<DeferServiceFactory> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + DeferServiceFactory.FACTORY, + DeferServiceFactory.class); + if (result.isPresent()) { return result.get(); } else { @@ -383,9 +406,12 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected BeanProcessorFactory createBeanProcessorFactory() { - BaseServiceResolver<BeanProcessorFactory> resolver = new BaseServiceResolver<>( - BeanProcessorFactory.FACTORY, BeanProcessorFactory.class, getBootstrapFactoryFinder()); - Optional<BeanProcessorFactory> result = resolver.resolve(getCamelContextReference()); + Optional<BeanProcessorFactory> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + BeanProcessorFactory.FACTORY, + BeanProcessorFactory.class); + if (result.isPresent()) { return result.get(); } else { @@ -400,9 +426,12 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected XMLRoutesDefinitionLoader createXMLRoutesDefinitionLoader() { - BaseServiceResolver<XMLRoutesDefinitionLoader> resolver = new BaseServiceResolver<>( - XMLRoutesDefinitionLoader.FACTORY, XMLRoutesDefinitionLoader.class, getBootstrapFactoryFinder()); - Optional<XMLRoutesDefinitionLoader> result = resolver.resolve(getCamelContextReference()); + Optional<XMLRoutesDefinitionLoader> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + XMLRoutesDefinitionLoader.FACTORY, + XMLRoutesDefinitionLoader.class); + if (result.isPresent()) { return result.get(); } else { @@ -413,25 +442,23 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected RoutesLoader createRoutesLoader() { - BaseServiceResolver<RoutesLoader> resolver = new BaseServiceResolver<>( + Optional<RoutesLoader> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), RoutesLoader.FACTORY, - RoutesLoader.class, - getBootstrapFactoryFinder()); + RoutesLoader.class); - Optional<RoutesLoader> result = resolver.resolve(getCamelContextReference()); - if (result.isPresent()) { - return result.get(); - } else { - throw new IllegalArgumentException( - "Cannot find RoutesLoader on classpath."); - } + return result.orElseGet(DefaultRoutesLoader::new); } @Override protected ModelToXMLDumper createModelToXMLDumper() { - BaseServiceResolver<ModelToXMLDumper> resolver - = new BaseServiceResolver<>(ModelToXMLDumper.FACTORY, ModelToXMLDumper.class, getBootstrapFactoryFinder()); - Optional<ModelToXMLDumper> result = resolver.resolve(getCamelContextReference()); + Optional<ModelToXMLDumper> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + ModelToXMLDumper.FACTORY, + ModelToXMLDumper.class); + if (result.isPresent()) { return result.get(); } else { @@ -441,9 +468,12 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected RestBindingJaxbDataFormatFactory createRestBindingJaxbDataFormatFactory() { - BaseServiceResolver<RestBindingJaxbDataFormatFactory> resolver = new BaseServiceResolver<>( - RestBindingJaxbDataFormatFactory.FACTORY, RestBindingJaxbDataFormatFactory.class, getBootstrapFactoryFinder()); - Optional<RestBindingJaxbDataFormatFactory> result = resolver.resolve(getCamelContextReference()); + Optional<RestBindingJaxbDataFormatFactory> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + RestBindingJaxbDataFormatFactory.FACTORY, + RestBindingJaxbDataFormatFactory.class); + if (result.isPresent()) { return result.get(); } else { @@ -489,9 +519,12 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected RestRegistryFactory createRestRegistryFactory() { - BaseServiceResolver<RestRegistryFactory> resolver = new BaseServiceResolver<>( - RestRegistryFactory.FACTORY, RestRegistryFactory.class, getBootstrapFactoryFinder()); - Optional<RestRegistryFactory> result = resolver.resolve(getCamelContextReference()); + Optional<RestRegistryFactory> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + RestRegistryFactory.FACTORY, + RestRegistryFactory.class); + if (result.isPresent()) { return result.get(); } else { @@ -511,14 +544,13 @@ public class SimpleCamelContext extends AbstractCamelContext { @Override protected ReactiveExecutor createReactiveExecutor() { - BaseServiceResolver<ReactiveExecutor> resolver - = new BaseServiceResolver<>(ReactiveExecutor.FACTORY, ReactiveExecutor.class, getBootstrapFactoryFinder()); - Optional<ReactiveExecutor> result = resolver.resolve(getCamelContextReference()); - if (result.isPresent()) { - return result.get(); - } else { - return new DefaultReactiveExecutor(); - } + Optional<ReactiveExecutor> result = ResolverHelper.resolveService( + getCamelContextReference(), + getBootstrapFactoryFinder(), + ReactiveExecutor.FACTORY, + ReactiveExecutor.class); + + return result.orElseGet(DefaultReactiveExecutor::new); } @Override diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ResolverHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/ResolverHelper.java index 3ca4ccc..5557c73 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/ResolverHelper.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/ResolverHelper.java @@ -16,10 +16,14 @@ */ package org.apache.camel.support; +import java.util.Optional; + import org.apache.camel.CamelContext; import org.apache.camel.Component; +import org.apache.camel.ExtendedCamelContext; import org.apache.camel.spi.DataFormat; import org.apache.camel.spi.DataFormatFactory; +import org.apache.camel.spi.FactoryFinder; import org.apache.camel.spi.Language; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -128,12 +132,80 @@ public final class ResolverHelper { return null; } - public static class LookupExceptionHandler { + /** + * Create an instance of the given factory. + * + * @param camelContext the {@link CamelContext} + * @param factoryPath the path of the factory file + * @param factoryKey the key used top lookup the factory class + * @param factoryClass the type of the class + * @return an instance fo the given factory + */ + public static <T> Optional<T> resolveService( + CamelContext camelContext, String factoryPath, String factoryKey, Class<T> factoryClass) { + return resolveService( + camelContext, + camelContext.adapt(ExtendedCamelContext.class).getFactoryFinder(factoryPath), + factoryKey, factoryClass); + } - public void handleException(Exception e, Logger log, String name) { - log.debug("Ignored error looking up bean: {}", name, e); + /** + * Create an instance of the given factory using the default factory finder + * + * @param camelContext the {@link CamelContext} + * @param factoryKey the key used top lookup the factory class + * @param factoryClass the type of the class + * @return an instance fo the given factory + */ + public static <T> Optional<T> resolveService( + CamelContext camelContext, String factoryKey, Class<T> factoryClass) { + return resolveService( + camelContext, + camelContext.adapt(ExtendedCamelContext.class).getDefaultFactoryFinder(), + factoryKey, factoryClass); + } + + /** + * Create an instance of the given factory. + * + * @param camelContext the {@link CamelContext} + * @param factoryFinder the {@link FactoryFinder} to use + * @param factoryKey the key used top lookup the factory class + * @param factoryClass the type of the class + * @return an instance fo the given factory + */ + public static <T> Optional<T> resolveService( + CamelContext camelContext, FactoryFinder factoryFinder, String factoryKey, Class<T> factoryClass) { + + // use factory finder to find a custom implementations + Class<?> type = null; + + try { + type = factoryFinder.findClass(factoryKey).orElse(null); + } catch (Exception e) { + // ignore } + if (type != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("Found {}: {} via: {}{}", factoryClass.getSimpleName(), type.getName(), FactoryFinder.DEFAULT_PATH, + factoryKey); + } + if (factoryClass.isAssignableFrom(type)) { + final Object instance = camelContext.getInjector().newInstance(type, false); + final T answer = factoryClass.cast(instance); + + if (LOG.isDebugEnabled()) { + LOG.debug("Detected and using {}: {}", factoryClass.getSimpleName(), answer); + } + + return Optional.of(answer); + } else { + throw new IllegalArgumentException( + "Type is not a " + factoryClass.getSimpleName() + " implementation. Found: " + type.getName()); + } + } + return Optional.empty(); } private static Object lookupInRegistry( @@ -159,4 +231,12 @@ public final class ResolverHelper { return null; } + public static class LookupExceptionHandler { + + public void handleException(Exception e, Logger log, String name) { + log.debug("Ignored error looking up bean: {}", name, e); + } + + } + }