You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gn...@apache.org on 2019/05/28 21:56:56 UTC
[camel] 03/07: [CAMEL-13564] Move more methods to
ErrorHandlerReifier
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
commit eccc13cf676fe823522b7590087d3eae648873d1
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Mon May 27 22:40:31 2019 +0200
[CAMEL-13564] Move more methods to ErrorHandlerReifier
---
.../cdi/transaction/JtaTransactionPolicy.java | 4 +-
.../camel/spring/spi/SpringTransactionPolicy.java | 4 +-
.../camel/builder/ErrorHandlerBuilderRef.java | 101 +--------------------
.../org/apache/camel/model/RouteDefinition.java | 3 +-
.../reifier/errorhandler/ErrorHandlerReifier.java | 99 ++++++++++++++++++++
.../DefaultManagementObjectNameStrategy.java | 7 +-
6 files changed, 110 insertions(+), 108 deletions(-)
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/JtaTransactionPolicy.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/JtaTransactionPolicy.java
index d2dd5ebe..e0e6c46 100644
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/JtaTransactionPolicy.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/JtaTransactionPolicy.java
@@ -87,9 +87,9 @@ public abstract class JtaTransactionPolicy implements TransactedPolicy {
// only lookup if there was explicit an error handler builder configured
// otherwise its just the "default" that has not explicit been configured
// and if so then we can safely replace that with our transacted error handler
- if (ErrorHandlerBuilderRef.isErrorHandlerFactoryConfigured(ref)) {
+ if (ErrorHandlerReifier.isErrorHandlerFactoryConfigured(ref)) {
LOG.debug("Looking up ErrorHandlerBuilder with ref: {}", ref);
- builder = (ErrorHandlerBuilder) ErrorHandlerBuilderRef.lookupErrorHandlerFactory(routeContext, ref);
+ builder = (ErrorHandlerBuilder) ErrorHandlerReifier.lookupErrorHandlerFactory(routeContext, ref);
}
}
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java
index a67b4f3..a35f9b2 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java
@@ -80,9 +80,9 @@ public class SpringTransactionPolicy implements TransactedPolicy {
// only lookup if there was explicit an error handler builder configured
// otherwise its just the "default" that has not explicit been configured
// and if so then we can safely replace that with our transacted error handler
- if (ErrorHandlerBuilderRef.isErrorHandlerFactoryConfigured(ref)) {
+ if (ErrorHandlerReifier.isErrorHandlerFactoryConfigured(ref)) {
LOG.debug("Looking up ErrorHandlerBuilder with ref: {}", ref);
- builder = (ErrorHandlerBuilder)ErrorHandlerBuilderRef.lookupErrorHandlerFactory(routeContext, ref);
+ builder = (ErrorHandlerBuilder) ErrorHandlerReifier.lookupErrorHandlerFactory(routeContext, ref);
}
}
diff --git a/core/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java b/core/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
index 27e4c42..2d854e3 100644
--- a/core/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
+++ b/core/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
@@ -20,12 +20,9 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.apache.camel.CamelContext;
import org.apache.camel.ErrorHandlerFactory;
-import org.apache.camel.ExtendedCamelContext;
import org.apache.camel.Processor;
import org.apache.camel.model.OnExceptionDefinition;
-import org.apache.camel.model.RouteDefinition;
import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
import org.apache.camel.spi.RouteContext;
import org.apache.camel.util.ObjectHelper;
@@ -34,7 +31,6 @@ import org.apache.camel.util.ObjectHelper;
* Represents a proxy to an error handler builder which is resolved by named reference
*/
public class ErrorHandlerBuilderRef extends ErrorHandlerBuilderSupport {
- public static final String DEFAULT_ERROR_HANDLER_BUILDER = "CamelDefaultErrorHandlerBuilder";
private final String ref;
private final Map<RouteContext, ErrorHandlerBuilder> handlers = new HashMap<>();
private boolean supportTransacted;
@@ -88,107 +84,12 @@ public class ErrorHandlerBuilderRef extends ErrorHandlerBuilderSupport {
other.supportTransacted = supportTransacted;
}
- /**
- * Lookup the error handler by the given ref
- *
- * @param routeContext the route context
- * @param ref reference id for the error handler
- * @return the error handler
- */
- public static ErrorHandlerFactory lookupErrorHandlerFactory(RouteContext routeContext, String ref) {
- return lookupErrorHandlerFactory(routeContext, ref, true);
- }
-
- /**
- * Lookup the error handler by the given ref
- *
- * @param routeContext the route context
- * @param ref reference id for the error handler
- * @param mandatory whether the error handler must exists, if not a {@link org.apache.camel.NoSuchBeanException} is thrown
- * @return the error handler
- */
- public static ErrorHandlerFactory lookupErrorHandlerFactory(RouteContext routeContext, String ref, boolean mandatory) {
- ErrorHandlerFactory answer;
-
- // if the ref is the default then we do not have any explicit error handler configured
- // if that is the case then use error handlers configured on the route, as for instance
- // the transacted error handler could have been configured on the route so we should use that one
- if (!isErrorHandlerFactoryConfigured(ref)) {
- // see if there has been configured a route builder on the route
- RouteDefinition route = (RouteDefinition) routeContext.getRoute();
- answer = route.getErrorHandlerFactory();
- if (answer == null && route.getErrorHandlerRef() != null) {
- answer = routeContext.lookup(route.getErrorHandlerRef(), ErrorHandlerBuilder.class);
- }
- if (answer == null) {
- // fallback to the default error handler if none configured on the route
- answer = new DefaultErrorHandlerBuilder();
- }
- // check if its also a ref with no error handler configuration like me
- if (answer instanceof ErrorHandlerBuilderRef) {
- ErrorHandlerBuilderRef other = (ErrorHandlerBuilderRef) answer;
- String otherRef = other.getRef();
- if (!isErrorHandlerFactoryConfigured(otherRef)) {
- // the other has also no explicit error handler configured then fallback to the handler
- // configured on the parent camel context
- answer = lookupErrorHandlerFactory(routeContext.getCamelContext());
- }
- if (answer == null) {
- // the other has also no explicit error handler configured then fallback to the default error handler
- // otherwise we could recursive loop forever (triggered by createErrorHandler method)
- answer = new DefaultErrorHandlerBuilder();
- }
- // inherit the error handlers from the other as they are to be shared
- // this is needed by camel-spring when none error handler has been explicit configured
- ((ErrorHandlerBuilder)answer).setErrorHandlers(routeContext, other.getErrorHandlers(routeContext));
- }
- } else {
- // use specific configured error handler
- if (mandatory) {
- answer = routeContext.mandatoryLookup(ref, ErrorHandlerBuilder.class);
- } else {
- answer = routeContext.lookup(ref, ErrorHandlerBuilder.class);
- }
- }
-
- return answer;
- }
-
- protected static ErrorHandlerFactory lookupErrorHandlerFactory(CamelContext camelContext) {
- ErrorHandlerFactory answer = camelContext.adapt(ExtendedCamelContext.class).getErrorHandlerFactory();
- if (answer instanceof ErrorHandlerBuilderRef) {
- ErrorHandlerBuilderRef other = (ErrorHandlerBuilderRef) answer;
- String otherRef = other.getRef();
- if (isErrorHandlerFactoryConfigured(otherRef)) {
- answer = camelContext.getRegistry().lookupByNameAndType(otherRef, ErrorHandlerBuilder.class);
- if (answer == null) {
- throw new IllegalArgumentException("ErrorHandlerBuilder with id " + otherRef + " not found in registry.");
- }
- }
- }
-
- return answer;
- }
-
- /**
- * Returns whether a specific error handler builder has been configured or not.
- * <p/>
- * Can be used to test if none has been configured and then install a custom error handler builder
- * replacing the default error handler (that would have been used as fallback otherwise).
- * <br/>
- * This is for instance used by the transacted policy to setup a TransactedErrorHandlerBuilder
- * in camel-spring.
- */
- public static boolean isErrorHandlerFactoryConfigured(String ref) {
- return !DEFAULT_ERROR_HANDLER_BUILDER.equals(ref);
- }
-
public String getRef() {
return ref;
}
private ErrorHandlerBuilder createErrorHandler(RouteContext routeContext) {
- ErrorHandlerBuilder handler = (ErrorHandlerBuilder) lookupErrorHandlerFactory(routeContext, getRef());
+ ErrorHandlerBuilder handler = (ErrorHandlerBuilder) ErrorHandlerReifier.lookupErrorHandlerFactory(routeContext, getRef());
ObjectHelper.notNull(handler, "error handler '" + ref + "'");
// configure if the handler support transacted
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java
index dcc96ac..c1b4305 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java
@@ -36,6 +36,7 @@ import org.apache.camel.ShutdownRunningTask;
import org.apache.camel.builder.ErrorHandlerBuilderRef;
import org.apache.camel.model.rest.RestBindingDefinition;
import org.apache.camel.model.rest.RestDefinition;
+import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
import org.apache.camel.spi.AsEndpointUri;
import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.RoutePolicy;
@@ -909,7 +910,7 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> {
}
// return a reference to the default error handler
- return new ErrorHandlerBuilderRef(ErrorHandlerBuilderRef.DEFAULT_ERROR_HANDLER_BUILDER);
+ return new ErrorHandlerBuilderRef(ErrorHandlerReifier.DEFAULT_ERROR_HANDLER_BUILDER);
}
@XmlTransient
diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
index ca15e64..a7649ca 100644
--- a/core/camel-core/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
+++ b/core/camel-core/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
@@ -23,15 +23,18 @@ import java.util.function.Function;
import org.apache.camel.CamelContext;
import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.ExtendedCamelContext;
import org.apache.camel.Processor;
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.builder.DeadLetterChannelBuilder;
import org.apache.camel.builder.DefaultErrorHandlerBuilder;
+import org.apache.camel.builder.ErrorHandlerBuilder;
import org.apache.camel.builder.ErrorHandlerBuilderRef;
import org.apache.camel.builder.ErrorHandlerBuilderSupport;
import org.apache.camel.builder.NoErrorHandlerBuilder;
import org.apache.camel.model.OnExceptionDefinition;
import org.apache.camel.model.RedeliveryPolicyDefinition;
+import org.apache.camel.model.RouteDefinition;
import org.apache.camel.processor.ErrorHandler;
import org.apache.camel.processor.errorhandler.ExceptionPolicy;
import org.apache.camel.processor.errorhandler.ExceptionPolicy.RedeliveryOption;
@@ -44,6 +47,7 @@ import org.apache.camel.util.ObjectHelper;
public abstract class ErrorHandlerReifier<T extends ErrorHandlerBuilderSupport> {
+ public static final String DEFAULT_ERROR_HANDLER_BUILDER = "CamelDefaultErrorHandlerBuilder";
private static final Map<Class<?>, Function<ErrorHandlerFactory, ErrorHandlerReifier<? extends ErrorHandlerFactory>>> ERROR_HANDLERS;
static {
Map<Class<?>, Function<ErrorHandlerFactory, ErrorHandlerReifier<? extends ErrorHandlerFactory>>> map = new HashMap<>();
@@ -138,6 +142,101 @@ public abstract class ErrorHandlerReifier<T extends ErrorHandlerBuilderSupport>
}
/**
+ * Lookup the error handler by the given ref
+ *
+ * @param routeContext the route context
+ * @param ref reference id for the error handler
+ * @return the error handler
+ */
+ public static ErrorHandlerFactory lookupErrorHandlerFactory(RouteContext routeContext, String ref) {
+ return lookupErrorHandlerFactory(routeContext, ref, true);
+ }
+
+ /**
+ * Lookup the error handler by the given ref
+ *
+ * @param routeContext the route context
+ * @param ref reference id for the error handler
+ * @param mandatory whether the error handler must exists, if not a {@link org.apache.camel.NoSuchBeanException} is thrown
+ * @return the error handler
+ */
+ public static ErrorHandlerFactory lookupErrorHandlerFactory(RouteContext routeContext, String ref, boolean mandatory) {
+ ErrorHandlerFactory answer;
+
+ // if the ref is the default then we do not have any explicit error handler configured
+ // if that is the case then use error handlers configured on the route, as for instance
+ // the transacted error handler could have been configured on the route so we should use that one
+ if (!isErrorHandlerFactoryConfigured(ref)) {
+ // see if there has been configured a route builder on the route
+ RouteDefinition route = (RouteDefinition) routeContext.getRoute();
+ answer = route.getErrorHandlerFactory();
+ if (answer == null && route.getErrorHandlerRef() != null) {
+ answer = routeContext.lookup(route.getErrorHandlerRef(), ErrorHandlerBuilder.class);
+ }
+ if (answer == null) {
+ // fallback to the default error handler if none configured on the route
+ answer = new DefaultErrorHandlerBuilder();
+ }
+ // check if its also a ref with no error handler configuration like me
+ if (answer instanceof ErrorHandlerBuilderRef) {
+ ErrorHandlerBuilderRef other = (ErrorHandlerBuilderRef) answer;
+ String otherRef = other.getRef();
+ if (!isErrorHandlerFactoryConfigured(otherRef)) {
+ // the other has also no explicit error handler configured then fallback to the handler
+ // configured on the parent camel context
+ answer = lookupErrorHandlerFactory(routeContext.getCamelContext());
+ }
+ if (answer == null) {
+ // the other has also no explicit error handler configured then fallback to the default error handler
+ // otherwise we could recursive loop forever (triggered by createErrorHandler method)
+ answer = new DefaultErrorHandlerBuilder();
+ }
+ // inherit the error handlers from the other as they are to be shared
+ // this is needed by camel-spring when none error handler has been explicit configured
+ ((ErrorHandlerBuilderSupport) answer).setErrorHandlers(routeContext, other.getErrorHandlers(routeContext));
+ }
+ } else {
+ // use specific configured error handler
+ if (mandatory) {
+ answer = routeContext.mandatoryLookup(ref, ErrorHandlerBuilder.class);
+ } else {
+ answer = routeContext.lookup(ref, ErrorHandlerBuilder.class);
+ }
+ }
+
+ return answer;
+ }
+
+ protected static ErrorHandlerFactory lookupErrorHandlerFactory(CamelContext camelContext) {
+ ErrorHandlerFactory answer = camelContext.adapt(ExtendedCamelContext.class).getErrorHandlerFactory();
+ if (answer instanceof ErrorHandlerBuilderRef) {
+ ErrorHandlerBuilderRef other = (ErrorHandlerBuilderRef) answer;
+ String otherRef = other.getRef();
+ if (isErrorHandlerFactoryConfigured(otherRef)) {
+ answer = camelContext.getRegistry().lookupByNameAndType(otherRef, ErrorHandlerBuilder.class);
+ if (answer == null) {
+ throw new IllegalArgumentException("ErrorHandlerBuilder with id " + otherRef + " not found in registry.");
+ }
+ }
+ }
+
+ return answer;
+ }
+
+ /**
+ * Returns whether a specific error handler builder has been configured or not.
+ * <p/>
+ * Can be used to test if none has been configured and then install a custom error handler builder
+ * replacing the default error handler (that would have been used as fallback otherwise).
+ * <br/>
+ * This is for instance used by the transacted policy to setup a TransactedErrorHandlerBuilder
+ * in camel-spring.
+ */
+ public static boolean isErrorHandlerFactoryConfigured(String ref) {
+ return !DEFAULT_ERROR_HANDLER_BUILDER.equals(ref);
+ }
+
+ /**
* Creates the error handler
*
* @param routeContext the route context
diff --git a/core/camel-management-impl/src/main/java/org/apache/camel/management/DefaultManagementObjectNameStrategy.java b/core/camel-management-impl/src/main/java/org/apache/camel/management/DefaultManagementObjectNameStrategy.java
index ad49c11..8122534 100644
--- a/core/camel-management-impl/src/main/java/org/apache/camel/management/DefaultManagementObjectNameStrategy.java
+++ b/core/camel-management-impl/src/main/java/org/apache/camel/management/DefaultManagementObjectNameStrategy.java
@@ -54,6 +54,7 @@ import org.apache.camel.management.mbean.ManagedRouteController;
import org.apache.camel.management.mbean.ManagedService;
import org.apache.camel.management.mbean.ManagedStep;
import org.apache.camel.management.mbean.ManagedThreadPool;
+import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
import org.apache.camel.spi.DataFormat;
import org.apache.camel.spi.EventNotifier;
import org.apache.camel.spi.ManagementObjectNameStrategy;
@@ -300,7 +301,7 @@ public class DefaultManagementObjectNameStrategy implements ManagementObjectName
// it has not then its an indirection and we should do some work to lookup the real builder
ref = builderRef.getRef();
- ErrorHandlerFactory refBuilder = ErrorHandlerBuilderRef.lookupErrorHandlerFactory(routeContext, builderRef.getRef(), false);
+ ErrorHandlerFactory refBuilder = ErrorHandlerReifier.lookupErrorHandlerFactory(routeContext, builderRef.getRef(), false);
if (refBuilder != null) {
builder = refBuilder;
}
@@ -311,8 +312,8 @@ public class DefaultManagementObjectNameStrategy implements ManagementObjectName
if (builder instanceof ErrorHandlerBuilderRef) {
builderRef = (ErrorHandlerBuilderRef) builder;
// does it refer to a non default error handler then do a 2nd lookup
- if (!builderRef.getRef().equals(ErrorHandlerBuilderRef.DEFAULT_ERROR_HANDLER_BUILDER)) {
- refBuilder = ErrorHandlerBuilderRef.lookupErrorHandlerFactory(routeContext, builderRef.getRef(), false);
+ if (!builderRef.getRef().equals(ErrorHandlerReifier.DEFAULT_ERROR_HANDLER_BUILDER)) {
+ refBuilder = ErrorHandlerReifier.lookupErrorHandlerFactory(routeContext, builderRef.getRef(), false);
if (refBuilder != null) {
ref = builderRef.getRef();
builder = refBuilder;