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 09663a95a91b6b244d25929354f102627bb33f1e Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Tue Nov 3 20:23:21 2020 +0100 CAMEL-15796: camel-core - Optimize reifier to not use lambda classes and reduce memory by not using map as registry. --- .../camel/reifier/CircuitBreakerReifier.java | 3 +- .../org/apache/camel/reifier/ProcessorReifier.java | 225 ++++++++++++++------- .../reifier/dataformat/DataFormatReifier.java | 156 +++++++++----- .../reifier/errorhandler/ErrorHandlerReifier.java | 52 ++--- .../camel/reifier/language/ExpressionReifier.java | 87 +++++--- .../reifier/loadbalancer/LoadBalancerReifier.java | 52 +++-- .../reifier/transformer/TransformerReifier.java | 39 +++- .../camel/reifier/validator/ValidatorReifier.java | 39 +++- .../apache/camel/reifier/ProcessorReifierTest.java | 17 +- .../{ => dataformat}/DataFormatReifierTest.java | 19 +- 10 files changed, 461 insertions(+), 228 deletions(-) diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/CircuitBreakerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/CircuitBreakerReifier.java index 2b454d4..14ba51f9 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/CircuitBreakerReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/CircuitBreakerReifier.java @@ -29,7 +29,8 @@ public class CircuitBreakerReifier extends ProcessorReifier<CircuitBreakerDefini @Override public Processor createProcessor() throws Exception { - throw new IllegalStateException("Cannot find camel-hystrix or camel-microprofile-fault-tolerance on the classpath."); + throw new IllegalStateException( + "Cannot find camel-hystrix, camel-resilience4j or camel-microprofile-fault-tolerance on the classpath."); } } diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java index f7a0546..72df0e05 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java @@ -118,74 +118,9 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> extends private static final Map<Class<?>, BiFunction<Route, ProcessorDefinition<?>, ProcessorReifier<? extends ProcessorDefinition<?>>>> PROCESSORS; static { - // NOTE: if adding a new class then update the initial capacity of the - // HashMap + // for custom reifiers Map<Class<?>, BiFunction<Route, ProcessorDefinition<?>, ProcessorReifier<? extends ProcessorDefinition<?>>>> map - = new HashMap<>(65); - map.put(AggregateDefinition.class, AggregateReifier::new); - map.put(BeanDefinition.class, BeanReifier::new); - map.put(CatchDefinition.class, CatchReifier::new); - map.put(ChoiceDefinition.class, ChoiceReifier::new); - map.put(CircuitBreakerDefinition.class, CircuitBreakerReifier::new); - map.put(ClaimCheckDefinition.class, ClaimCheckReifier::new); - map.put(ConvertBodyDefinition.class, ConvertBodyReifier::new); - map.put(DelayDefinition.class, DelayReifier::new); - map.put(DynamicRouterDefinition.class, DynamicRouterReifier::new); - map.put(EnrichDefinition.class, EnrichReifier::new); - map.put(FilterDefinition.class, FilterReifier::new); - map.put(FinallyDefinition.class, FinallyReifier::new); - map.put(IdempotentConsumerDefinition.class, IdempotentConsumerReifier::new); - map.put(InOnlyDefinition.class, SendReifier::new); - map.put(InOutDefinition.class, SendReifier::new); - map.put(InterceptDefinition.class, InterceptReifier::new); - map.put(InterceptFromDefinition.class, InterceptFromReifier::new); - map.put(InterceptSendToEndpointDefinition.class, InterceptSendToEndpointReifier::new); - map.put(LoadBalanceDefinition.class, LoadBalanceReifier::new); - map.put(LogDefinition.class, LogReifier::new); - map.put(LoopDefinition.class, LoopReifier::new); - map.put(MarshalDefinition.class, MarshalReifier::new); - map.put(MulticastDefinition.class, MulticastReifier::new); - map.put(OnCompletionDefinition.class, OnCompletionReifier::new); - map.put(OnExceptionDefinition.class, OnExceptionReifier::new); - map.put(OnFallbackDefinition.class, OnFallbackReifier::new); - map.put(OtherwiseDefinition.class, OtherwiseReifier::new); - map.put(PipelineDefinition.class, PipelineReifier::new); - map.put(PolicyDefinition.class, PolicyReifier::new); - map.put(PollEnrichDefinition.class, PollEnrichReifier::new); - map.put(ProcessDefinition.class, ProcessReifier::new); - map.put(RecipientListDefinition.class, RecipientListReifier::new); - map.put(RemoveHeaderDefinition.class, RemoveHeaderReifier::new); - map.put(RemoveHeadersDefinition.class, RemoveHeadersReifier::new); - map.put(RemovePropertiesDefinition.class, RemovePropertiesReifier::new); - map.put(RemovePropertyDefinition.class, RemovePropertyReifier::new); - map.put(ResequenceDefinition.class, ResequenceReifier::new); - map.put(RollbackDefinition.class, RollbackReifier::new); - map.put(RoutingSlipDefinition.class, RoutingSlipReifier::new); - map.put(SagaDefinition.class, SagaReifier::new); - map.put(SamplingDefinition.class, SamplingReifier::new); - map.put(ScriptDefinition.class, ScriptReifier::new); - map.put(ServiceCallDefinition.class, ServiceCallReifier::new); - map.put(SetBodyDefinition.class, SetBodyReifier::new); - map.put(SetExchangePatternDefinition.class, SetExchangePatternReifier::new); - map.put(SetHeaderDefinition.class, SetHeaderReifier::new); - map.put(SetPropertyDefinition.class, SetPropertyReifier::new); - map.put(SortDefinition.class, SortReifier::new); - map.put(SplitDefinition.class, SplitReifier::new); - map.put(StepDefinition.class, StepReifier::new); - map.put(StopDefinition.class, StopReifier::new); - map.put(ThreadsDefinition.class, ThreadsReifier::new); - map.put(ThrottleDefinition.class, ThrottleReifier::new); - map.put(ThrowExceptionDefinition.class, ThrowExceptionReifier::new); - map.put(ToDefinition.class, SendReifier::new); - map.put(ToDynamicDefinition.class, ToDynamicReifier::new); - map.put(TransactedDefinition.class, TransactedReifier::new); - map.put(TransformDefinition.class, TransformReifier::new); - map.put(TryDefinition.class, TryReifier::new); - map.put(UnmarshalDefinition.class, UnmarshalReifier::new); - map.put(ValidateDefinition.class, ValidateReifier::new); - map.put(WireTapDefinition.class, WireTapReifier::new); - map.put(WhenSkipSendToEndpointDefinition.class, WhenSkipSendToEndpointReifier::new); - map.put(WhenDefinition.class, WhenReifier::new); + = new HashMap<>(0); PROCESSORS = map; ReifierStrategy.addReifierClearer(ProcessorReifier::clearReifiers); } @@ -214,12 +149,158 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> extends } public static ProcessorReifier<? extends ProcessorDefinition<?>> reifier(Route route, ProcessorDefinition<?> definition) { - BiFunction<Route, ProcessorDefinition<?>, ProcessorReifier<? extends ProcessorDefinition<?>>> reifier - = PROCESSORS.get(definition.getClass()); - if (reifier != null) { - return reifier.apply(route, definition); + ProcessorReifier<? extends ProcessorDefinition<?>> answer = null; + if (!PROCESSORS.isEmpty()) { + // custom take precedence + BiFunction<Route, ProcessorDefinition<?>, ProcessorReifier<? extends ProcessorDefinition<?>>> reifier + = PROCESSORS.get(definition.getClass()); + if (reifier != null) { + answer = reifier.apply(route, definition); + } + } + if (answer == null) { + answer = coreReifier(route, definition); + } + if (answer == null) { + throw new IllegalStateException("Unsupported definition: " + definition); + } + return answer; + } + + public static ProcessorReifier<? extends ProcessorDefinition<?>> coreReifier( + Route route, ProcessorDefinition<?> definition) { + + if (definition instanceof AggregateDefinition) { + return new AggregateReifier(route, definition); + } else if (definition instanceof BeanDefinition) { + return new BeanReifier(route, definition); + } else if (definition instanceof CatchDefinition) { + return new CatchReifier(route, definition); + } else if (definition instanceof ChoiceDefinition) { + return new ChoiceReifier(route, definition); + } else if (definition instanceof CircuitBreakerDefinition) { + return new CircuitBreakerReifier(route, definition); + } else if (definition instanceof ClaimCheckDefinition) { + return new ClaimCheckReifier(route, definition); + } else if (definition instanceof ConvertBodyDefinition) { + return new ConvertBodyReifier(route, definition); + } else if (definition instanceof DelayDefinition) { + return new DelayReifier(route, definition); + } else if (definition instanceof DynamicRouterDefinition) { + return new DynamicRouterReifier(route, definition); + } else if (definition instanceof EnrichDefinition) { + return new EnrichReifier(route, definition); + } else if (definition instanceof FilterDefinition) { + return new FilterReifier(route, definition); + } else if (definition instanceof FinallyDefinition) { + return new FinallyReifier(route, definition); + } else if (definition instanceof IdempotentConsumerDefinition) { + return new IdempotentConsumerReifier(route, definition); + } else if (definition instanceof InOnlyDefinition) { + return new SendReifier(route, definition); + } else if (definition instanceof InOutDefinition) { + return new SendReifier(route, definition); + } else if (definition instanceof InterceptFromDefinition) { + return new InterceptFromReifier(route, definition); + } else if (definition instanceof InterceptDefinition) { + return new InterceptReifier<>(route, definition); + } else if (definition instanceof InterceptSendToEndpointDefinition) { + return new InterceptSendToEndpointReifier(route, definition); + } else if (definition instanceof LoadBalanceDefinition) { + return new LoadBalanceReifier(route, definition); + } else if (definition instanceof LogDefinition) { + return new LogReifier(route, definition); + } else if (definition instanceof LoopDefinition) { + return new LoopReifier(route, definition); + } else if (definition instanceof MarshalDefinition) { + return new MarshalReifier(route, definition); + } else if (definition instanceof MulticastDefinition) { + return new MulticastReifier(route, definition); + } else if (definition instanceof OnCompletionDefinition) { + return new OnCompletionReifier(route, definition); + } else if (definition instanceof OnExceptionDefinition) { + return new OnExceptionReifier(route, definition); + } else if (definition instanceof OnFallbackDefinition) { + return new OnFallbackReifier(route, definition); + } else if (definition instanceof OtherwiseDefinition) { + return new OtherwiseReifier(route, definition); + } else if (definition instanceof PipelineDefinition) { + return new PipelineReifier(route, definition); + } else if (definition instanceof PolicyDefinition) { + return new PolicyReifier(route, definition); + } else if (definition instanceof PollEnrichDefinition) { + return new PollEnrichReifier(route, definition); + } else if (definition instanceof ProcessDefinition) { + return new ProcessReifier(route, definition); + } else if (definition instanceof RecipientListDefinition) { + return new RecipientListReifier(route, definition); + } else if (definition instanceof RemoveHeaderDefinition) { + return new RemoveHeaderReifier(route, definition); + } else if (definition instanceof RemoveHeadersDefinition) { + return new RemoveHeadersReifier(route, definition); + } else if (definition instanceof RemovePropertyDefinition) { + return new RemovePropertyReifier(route, definition); + } else if (definition instanceof RemovePropertiesDefinition) { + return new RemovePropertiesReifier(route, definition); + } else if (definition instanceof ResequenceDefinition) { + return new ResequenceReifier(route, definition); + } else if (definition instanceof RollbackDefinition) { + return new RollbackReifier(route, definition); + } else if (definition instanceof RoutingSlipDefinition) { + return new RoutingSlipReifier(route, definition); + } else if (definition instanceof SagaDefinition) { + return new SagaReifier(route, definition); + } else if (definition instanceof SamplingDefinition) { + return new SamplingReifier(route, definition); + } else if (definition instanceof ScriptDefinition) { + return new ScriptReifier(route, definition); + } else if (definition instanceof ServiceCallDefinition) { + return new ServiceCallReifier(route, definition); + } else if (definition instanceof SetBodyDefinition) { + return new SetBodyReifier(route, definition); + } else if (definition instanceof SetExchangePatternDefinition) { + return new SetExchangePatternReifier(route, definition); + } else if (definition instanceof SetHeaderDefinition) { + return new SetHeaderReifier(route, definition); + } else if (definition instanceof SetPropertyDefinition) { + return new SetPropertyReifier(route, definition); + } else if (definition instanceof SortDefinition) { + return new SortReifier<>(route, definition); + } else if (definition instanceof SplitDefinition) { + return new SplitReifier(route, definition); + } else if (definition instanceof StepDefinition) { + return new StepReifier(route, definition); + } else if (definition instanceof StopDefinition) { + return new StopReifier(route, definition); + } else if (definition instanceof ThreadsDefinition) { + return new ThreadsReifier(route, definition); + } else if (definition instanceof ThrottleDefinition) { + return new ThrottleReifier(route, definition); + } else if (definition instanceof ThrowExceptionDefinition) { + return new ThrowExceptionReifier(route, definition); + } else if (definition instanceof ToDefinition) { + return new SendReifier(route, definition); + } else if (definition instanceof WireTapDefinition) { + return new WireTapReifier(route, definition); + } else if (definition instanceof ToDynamicDefinition) { + return new ToDynamicReifier<>(route, definition); + } else if (definition instanceof TransactedDefinition) { + return new TransactedReifier(route, definition); + } else if (definition instanceof TransformDefinition) { + return new TransformReifier(route, definition); + } else if (definition instanceof TryDefinition) { + return new TryReifier(route, definition); + } else if (definition instanceof UnmarshalDefinition) { + return new UnmarshalReifier(route, definition); + } else if (definition instanceof ValidateDefinition) { + return new ValidateReifier(route, definition); + } else if (definition instanceof WhenSkipSendToEndpointDefinition) { + return new WhenSkipSendToEndpointReifier(route, definition); + } else if (definition instanceof WhenDefinition) { + return new WhenReifier(route, definition); } - throw new IllegalStateException("Unsupported definition: " + definition); + + return null; } /** diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/DataFormatReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/DataFormatReifier.java index 72e0cb8..6ffc2ce86 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/DataFormatReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/DataFormatReifier.java @@ -85,50 +85,9 @@ public abstract class DataFormatReifier<T extends DataFormatDefinition> extends private static final Map<Class<? extends DataFormatDefinition>, BiFunction<CamelContext, DataFormatDefinition, DataFormatReifier<? extends DataFormatDefinition>>> DATAFORMATS; static { + // for custom reifiers Map<Class<? extends DataFormatDefinition>, BiFunction<CamelContext, DataFormatDefinition, DataFormatReifier<? extends DataFormatDefinition>>> map - = new HashMap<>(); - map.put(Any23DataFormat.class, Any23DataFormatReifier::new); - map.put(ASN1DataFormat.class, ASN1DataFormatReifier::new); - map.put(AvroDataFormat.class, AvroDataFormatReifier::new); - map.put(BarcodeDataFormat.class, BarcodeDataFormatReifier::new); - map.put(Base64DataFormat.class, Base64DataFormatReifier::new); - map.put(BeanioDataFormat.class, BeanioDataFormatReifier::new); - map.put(BindyDataFormat.class, BindyDataFormatReifier::new); - map.put(CBORDataFormat.class, CBORDataFormatReifier::new); - map.put(CryptoDataFormat.class, CryptoDataFormatReifier::new); - map.put(CsvDataFormat.class, CsvDataFormatReifier::new); - map.put(CustomDataFormat.class, CustomDataFormatReifier::new); - map.put(FhirDataformat.class, FhirDataFormatReifier::new); - map.put(FhirJsonDataFormat.class, FhirJsonDataFormatReifier::new); - map.put(FhirXmlDataFormat.class, FhirXmlDataFormatReifier::new); - map.put(FlatpackDataFormat.class, FlatpackDataFormatReifier::new); - map.put(GrokDataFormat.class, GrokDataFormatReifier::new); - map.put(GzipDataFormat.class, GzipDataFormatReifier::new); - map.put(HL7DataFormat.class, HL7DataFormatReifier::new); - map.put(IcalDataFormat.class, IcalDataFormatReifier::new); - map.put(JacksonXMLDataFormat.class, JacksonXMLDataFormatReifier::new); - map.put(JaxbDataFormat.class, JaxbDataFormatReifier::new); - map.put(JsonApiDataFormat.class, JsonApiDataFormatReifier::new); - map.put(JsonDataFormat.class, JsonDataFormatReifier::new); - map.put(LZFDataFormat.class, LZFDataFormatReifier::new); - map.put(MimeMultipartDataFormat.class, MimeMultipartDataFormatReifier::new); - map.put(PGPDataFormat.class, PGPDataFormatReifier::new); - map.put(ProtobufDataFormat.class, ProtobufDataFormatReifier::new); - map.put(RssDataFormat.class, RssDataFormatReifier::new); - map.put(SoapJaxbDataFormat.class, SoapJaxbDataFormatReifier::new); - map.put(SyslogDataFormat.class, SyslogDataFormatReifier::new); - map.put(TarFileDataFormat.class, TarFileDataFormatReifier::new); - map.put(ThriftDataFormat.class, ThriftDataFormatReifier::new); - map.put(TidyMarkupDataFormat.class, TidyMarkupDataFormatReifier::new); - map.put(UniVocityCsvDataFormat.class, UniVocityCsvDataFormatReifier::new); - map.put(UniVocityFixedWidthDataFormat.class, UniVocityFixedWidthDataFormatReifier::new); - map.put(UniVocityTsvDataFormat.class, UniVocityTsvDataFormatReifier::new); - map.put(XmlRpcDataFormat.class, XmlRpcDataFormatReifier::new); - map.put(XMLSecurityDataFormat.class, XMLSecurityDataFormatReifier::new); - map.put(XStreamDataFormat.class, XStreamDataFormatReifier::new); - map.put(YAMLDataFormat.class, YAMLDataFormatReifier::new); - map.put(ZipDeflaterDataFormat.class, ZipDataFormatReifier::new); - map.put(ZipFileDataFormat.class, ZipFileDataFormatReifier::new); + = new HashMap<>(0); DATAFORMATS = map; ReifierStrategy.addReifierClearer(DataFormatReifier::clearReifiers); } @@ -196,12 +155,113 @@ public abstract class DataFormatReifier<T extends DataFormatDefinition> extends public static DataFormatReifier<? extends DataFormatDefinition> reifier( CamelContext camelContext, DataFormatDefinition definition) { - BiFunction<CamelContext, DataFormatDefinition, DataFormatReifier<? extends DataFormatDefinition>> reifier - = DATAFORMATS.get(definition.getClass()); - if (reifier != null) { - return reifier.apply(camelContext, definition); + + DataFormatReifier<? extends DataFormatDefinition> answer = null; + if (!DATAFORMATS.isEmpty()) { + // custom take precedence + BiFunction<CamelContext, DataFormatDefinition, DataFormatReifier<? extends DataFormatDefinition>> reifier + = DATAFORMATS.get(definition.getClass()); + if (reifier != null) { + answer = reifier.apply(camelContext, definition); + } + } + if (answer == null) { + answer = coreReifier(camelContext, definition); } - throw new IllegalStateException("Unsupported definition: " + definition); + if (answer == null) { + throw new IllegalStateException("Unsupported definition: " + definition); + } + return answer; + } + + private static DataFormatReifier<? extends DataFormatDefinition> coreReifier( + CamelContext camelContext, DataFormatDefinition definition) { + if (definition instanceof Any23DataFormat) { + return new Any23DataFormatReifier(camelContext, definition); + } else if (definition instanceof ASN1DataFormat) { + return new ASN1DataFormatReifier(camelContext, definition); + } else if (definition instanceof AvroDataFormat) { + return new AvroDataFormatReifier(camelContext, definition); + } else if (definition instanceof BarcodeDataFormat) { + return new BarcodeDataFormatReifier(camelContext, definition); + } else if (definition instanceof Base64DataFormat) { + return new Base64DataFormatReifier(camelContext, definition); + } else if (definition instanceof BeanioDataFormat) { + return new BeanioDataFormatReifier(camelContext, definition); + } else if (definition instanceof BindyDataFormat) { + return new BindyDataFormatReifier(camelContext, definition); + } else if (definition instanceof CBORDataFormat) { + return new CBORDataFormatReifier(camelContext, definition); + } else if (definition instanceof CryptoDataFormat) { + return new CryptoDataFormatReifier(camelContext, definition); + } else if (definition instanceof CsvDataFormat) { + return new CsvDataFormatReifier(camelContext, definition); + } else if (definition instanceof CustomDataFormat) { + return new CustomDataFormatReifier(camelContext, definition); + } else if (definition instanceof FhirJsonDataFormat) { + return new FhirJsonDataFormatReifier(camelContext, definition); + } else if (definition instanceof FhirXmlDataFormat) { + return new FhirXmlDataFormatReifier(camelContext, definition); + } else if (definition instanceof FhirDataformat) { + return new FhirDataFormatReifier<>(camelContext, definition); + } else if (definition instanceof FlatpackDataFormat) { + return new FlatpackDataFormatReifier(camelContext, definition); + } else if (definition instanceof GrokDataFormat) { + return new GrokDataFormatReifier(camelContext, definition); + } else if (definition instanceof GzipDataFormat) { + return new GzipDataFormatReifier(camelContext, definition); + } else if (definition instanceof HL7DataFormat) { + return new HL7DataFormatReifier(camelContext, definition); + } else if (definition instanceof IcalDataFormat) { + return new IcalDataFormatReifier(camelContext, definition); + } else if (definition instanceof JacksonXMLDataFormat) { + return new JacksonXMLDataFormatReifier(camelContext, definition); + } else if (definition instanceof JaxbDataFormat) { + return new JaxbDataFormatReifier(camelContext, definition); + } else if (definition instanceof JsonApiDataFormat) { + return new JsonApiDataFormatReifier(camelContext, definition); + } else if (definition instanceof JsonDataFormat) { + return new JsonDataFormatReifier(camelContext, definition); + } else if (definition instanceof LZFDataFormat) { + return new LZFDataFormatReifier(camelContext, definition); + } else if (definition instanceof MimeMultipartDataFormat) { + return new MimeMultipartDataFormatReifier(camelContext, definition); + } else if (definition instanceof PGPDataFormat) { + return new PGPDataFormatReifier(camelContext, definition); + } else if (definition instanceof ProtobufDataFormat) { + return new ProtobufDataFormatReifier(camelContext, definition); + } else if (definition instanceof RssDataFormat) { + return new RssDataFormatReifier(camelContext, definition); + } else if (definition instanceof SoapJaxbDataFormat) { + return new SoapJaxbDataFormatReifier(camelContext, definition); + } else if (definition instanceof SyslogDataFormat) { + return new SyslogDataFormatReifier(camelContext, definition); + } else if (definition instanceof TarFileDataFormat) { + return new TarFileDataFormatReifier(camelContext, definition); + } else if (definition instanceof ThriftDataFormat) { + return new ThriftDataFormatReifier(camelContext, definition); + } else if (definition instanceof TidyMarkupDataFormat) { + return new TidyMarkupDataFormatReifier(camelContext, definition); + } else if (definition instanceof UniVocityCsvDataFormat) { + return new UniVocityCsvDataFormatReifier(camelContext, definition); + } else if (definition instanceof UniVocityFixedWidthDataFormat) { + return new UniVocityFixedWidthDataFormatReifier(camelContext, definition); + } else if (definition instanceof UniVocityTsvDataFormat) { + return new UniVocityTsvDataFormatReifier(camelContext, definition); + } else if (definition instanceof XmlRpcDataFormat) { + return new XmlRpcDataFormatReifier(camelContext, definition); + } else if (definition instanceof XMLSecurityDataFormat) { + return new XMLSecurityDataFormatReifier(camelContext, definition); + } else if (definition instanceof XStreamDataFormat) { + return new XStreamDataFormatReifier(camelContext, definition); + } else if (definition instanceof YAMLDataFormat) { + return new YAMLDataFormatReifier(camelContext, definition); + } else if (definition instanceof ZipDeflaterDataFormat) { + return new ZipDataFormatReifier(camelContext, definition); + } else if (definition instanceof ZipFileDataFormat) { + return new ZipFileDataFormatReifier(camelContext, definition); + } + return null; } public DataFormat createDataFormat() { diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java index fb0b83b..2c0e0e9 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java @@ -52,13 +52,11 @@ import org.apache.camel.util.ObjectHelper; public abstract class ErrorHandlerReifier<T extends ErrorHandlerFactory> extends AbstractReifier { private static final Map<Class<?>, BiFunction<Route, ErrorHandlerFactory, ErrorHandlerReifier<? extends ErrorHandlerFactory>>> ERROR_HANDLERS; + static { + // for custom reifiers Map<Class<?>, BiFunction<Route, ErrorHandlerFactory, ErrorHandlerReifier<? extends ErrorHandlerFactory>>> map - = new HashMap<>(); - map.put(DeadLetterChannelConfiguration.class, DeadLetterChannelReifier::new); - map.put(DefaultErrorHandlerConfiguration.class, DefaultErrorHandlerReifier::new); - map.put(ErrorHandlerRefConfiguration.class, ErrorHandlerRefReifier::new); - map.put(NoErrorHandlerConfiguraiton.class, NoErrorHandlerReifier::new); + = new HashMap<>(0); ERROR_HANDLERS = map; } @@ -79,27 +77,35 @@ public abstract class ErrorHandlerReifier<T extends ErrorHandlerFactory> extends } public static ErrorHandlerReifier<? extends ErrorHandlerFactory> reifier(Route route, ErrorHandlerFactory definition) { - BiFunction<Route, ErrorHandlerFactory, ErrorHandlerReifier<? extends ErrorHandlerFactory>> reifier = null; - - // custom error handlers is registered by class - reifier = ERROR_HANDLERS.get(definition.getClass()); - - if (reifier == null) { - // out of the box error handlers from camel-core - if (definition instanceof DeadLetterChannelConfiguration) { - reifier = ERROR_HANDLERS.get(DeadLetterChannelConfiguration.class); - } else if (definition instanceof DefaultErrorHandlerConfiguration) { - reifier = ERROR_HANDLERS.get(DefaultErrorHandlerConfiguration.class); - } else if (definition instanceof ErrorHandlerRefConfiguration) { - reifier = ERROR_HANDLERS.get(ErrorHandlerRefConfiguration.class); - } else if (definition instanceof NoErrorHandlerConfiguraiton) { - reifier = ERROR_HANDLERS.get(NoErrorHandlerConfiguraiton.class); + ErrorHandlerReifier<? extends ErrorHandlerFactory> answer = null; + if (!ERROR_HANDLERS.isEmpty()) { + // custom take precedence + BiFunction<Route, ErrorHandlerFactory, ErrorHandlerReifier<? extends ErrorHandlerFactory>> reifier + = ERROR_HANDLERS.get(definition.getClass()); + if (reifier != null) { + answer = reifier.apply(route, definition); } } - if (reifier != null) { - return reifier.apply(route, definition); + if (answer == null) { + answer = coreReifier(route, definition); + } + if (answer == null) { + throw new IllegalStateException("Unsupported definition: " + definition); + } + return answer; + } + + private static ErrorHandlerReifier<? extends ErrorHandlerFactory> coreReifier(Route route, ErrorHandlerFactory definition) { + if (definition instanceof DeadLetterChannelConfiguration) { + return new DeadLetterChannelReifier(route, definition); + } else if (definition instanceof DefaultErrorHandlerConfiguration) { + return new DefaultErrorHandlerReifier<>(route, definition); + } else if (definition instanceof ErrorHandlerRefConfiguration) { + return new ErrorHandlerRefReifier(route, definition); + } else if (definition instanceof NoErrorHandlerConfiguraiton) { + return new NoErrorHandlerReifier(route, definition); } - throw new IllegalStateException("Unsupported definition: " + definition); + return null; } public ExceptionPolicy createExceptionPolicy(OnExceptionDefinition def) { diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java index 38d08f6..a60d840 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java @@ -61,27 +61,9 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR private static final Map<Class<?>, BiFunction<CamelContext, ExpressionDefinition, ExpressionReifier<? extends ExpressionDefinition>>> EXPRESSIONS; static { + // for custom reifiers Map<Class<?>, BiFunction<CamelContext, ExpressionDefinition, ExpressionReifier<? extends ExpressionDefinition>>> map - = new LinkedHashMap<>(18); - map.put(ConstantExpression.class, ExpressionReifier::new); - map.put(ExchangePropertyExpression.class, ExpressionReifier::new); - map.put(ExpressionDefinition.class, ExpressionReifier::new); - map.put(GroovyExpression.class, ExpressionReifier::new); - map.put(HeaderExpression.class, ExpressionReifier::new); - map.put(Hl7TerserExpression.class, ExpressionReifier::new); - map.put(JoorExpression.class, JoorExpressionReifier::new); - map.put(JsonPathExpression.class, JsonPathExpressionReifier::new); - map.put(LanguageExpression.class, ExpressionReifier::new); - map.put(MethodCallExpression.class, MethodCallExpressionReifier::new); - map.put(MvelExpression.class, ExpressionReifier::new); - map.put(OgnlExpression.class, ExpressionReifier::new); - map.put(RefExpression.class, ExpressionReifier::new); - map.put(SimpleExpression.class, SimpleExpressionReifier::new); - map.put(SpELExpression.class, ExpressionReifier::new); - map.put(TokenizerExpression.class, TokenizerExpressionReifier::new); - map.put(XMLTokenizerExpression.class, XMLTokenizerExpressionReifier::new); - map.put(XPathExpression.class, XPathExpressionReifier::new); - map.put(XQueryExpression.class, XQueryExpressionReifier::new); + = new LinkedHashMap<>(0); EXPRESSIONS = map; ReifierStrategy.addReifierClearer(ExpressionReifier::clearReifiers); } @@ -100,12 +82,67 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR public static ExpressionReifier<? extends ExpressionDefinition> reifier( CamelContext camelContext, ExpressionDefinition definition) { - BiFunction<CamelContext, ExpressionDefinition, ExpressionReifier<? extends ExpressionDefinition>> reifier - = EXPRESSIONS.get(definition.getClass()); - if (reifier != null) { - return reifier.apply(camelContext, definition); + + ExpressionReifier<? extends ExpressionDefinition> answer = null; + if (!EXPRESSIONS.isEmpty()) { + // custom take precedence + BiFunction<CamelContext, ExpressionDefinition, ExpressionReifier<? extends ExpressionDefinition>> reifier + = EXPRESSIONS.get(definition.getClass()); + if (reifier != null) { + answer = reifier.apply(camelContext, definition); + } + } + if (answer == null) { + answer = coreReifier(camelContext, definition); + } + if (answer == null) { + throw new IllegalStateException("Unsupported definition: " + definition); + } + return answer; + } + + private static ExpressionReifier<? extends ExpressionDefinition> coreReifier( + CamelContext camelContext, ExpressionDefinition definition) { + if (definition instanceof ConstantExpression) { + return new ExpressionReifier<>(camelContext, definition); + } else if (definition instanceof ExchangePropertyExpression) { + return new ExpressionReifier<>(camelContext, definition); + } else if (definition instanceof GroovyExpression) { + return new ExpressionReifier<>(camelContext, definition); + } else if (definition instanceof HeaderExpression) { + return new ExpressionReifier<>(camelContext, definition); + } else if (definition instanceof Hl7TerserExpression) { + return new ExpressionReifier<>(camelContext, definition); + } else if (definition instanceof JoorExpression) { + return new JoorExpressionReifier(camelContext, definition); + } else if (definition instanceof JsonPathExpression) { + return new JsonPathExpressionReifier(camelContext, definition); + } else if (definition instanceof LanguageExpression) { + return new ExpressionReifier<>(camelContext, definition); + } else if (definition instanceof MethodCallExpression) { + return new MethodCallExpressionReifier(camelContext, definition); + } else if (definition instanceof MvelExpression) { + return new ExpressionReifier<>(camelContext, definition); + } else if (definition instanceof OgnlExpression) { + return new ExpressionReifier<>(camelContext, definition); + } else if (definition instanceof RefExpression) { + return new ExpressionReifier<>(camelContext, definition); + } else if (definition instanceof SimpleExpression) { + return new SimpleExpressionReifier(camelContext, definition); + } else if (definition instanceof SpELExpression) { + return new ExpressionReifier<>(camelContext, definition); + } else if (definition instanceof TokenizerExpression) { + return new TokenizerExpressionReifier(camelContext, definition); + } else if (definition instanceof XMLTokenizerExpression) { + return new XMLTokenizerExpressionReifier(camelContext, definition); + } else if (definition instanceof XPathExpression) { + return new XPathExpressionReifier(camelContext, definition); + } else if (definition instanceof XQueryExpression) { + return new XQueryExpressionReifier(camelContext, definition); + } else if (definition instanceof ExpressionDefinition) { + return new ExpressionReifier<>(camelContext, definition); } - throw new IllegalStateException("Unsupported definition: " + definition); + return null; } public static void clearReifiers() { diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/loadbalancer/LoadBalancerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/loadbalancer/LoadBalancerReifier.java index da04db9..2cd27a1 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/loadbalancer/LoadBalancerReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/loadbalancer/LoadBalancerReifier.java @@ -38,16 +38,9 @@ public class LoadBalancerReifier<T extends LoadBalancerDefinition> extends Abstr private static final Map<Class<?>, BiFunction<Route, LoadBalancerDefinition, LoadBalancerReifier<? extends LoadBalancerDefinition>>> LOAD_BALANCERS; static { + // for custom reifiers Map<Class<?>, BiFunction<Route, LoadBalancerDefinition, LoadBalancerReifier<? extends LoadBalancerDefinition>>> map - = new HashMap<>(); - map.put(LoadBalancerDefinition.class, LoadBalancerReifier::new); - map.put(CustomLoadBalancerDefinition.class, CustomLoadBalancerReifier::new); - map.put(FailoverLoadBalancerDefinition.class, FailoverLoadBalancerReifier::new); - map.put(RandomLoadBalancerDefinition.class, RandomLoadBalancerReifier::new); - map.put(RoundRobinLoadBalancerDefinition.class, RoundRobinLoadBalancerReifier::new); - map.put(StickyLoadBalancerDefinition.class, StickyLoadBalancerReifier::new); - map.put(TopicLoadBalancerDefinition.class, TopicLoadBalancerReifier::new); - map.put(WeightedLoadBalancerDefinition.class, WeightedLoadBalancerReifier::new); + = new HashMap<>(0); LOAD_BALANCERS = map; ReifierStrategy.addReifierClearer(LoadBalancerReifier::clearReifiers); } @@ -61,12 +54,43 @@ public class LoadBalancerReifier<T extends LoadBalancerDefinition> extends Abstr public static LoadBalancerReifier<? extends LoadBalancerDefinition> reifier( Route route, LoadBalancerDefinition definition) { - BiFunction<Route, LoadBalancerDefinition, LoadBalancerReifier<? extends LoadBalancerDefinition>> reifier - = LOAD_BALANCERS.get(definition.getClass()); - if (reifier != null) { - return reifier.apply(route, definition); + + LoadBalancerReifier<? extends LoadBalancerDefinition> answer = null; + if (!LOAD_BALANCERS.isEmpty()) { + // custom take precedence + BiFunction<Route, LoadBalancerDefinition, LoadBalancerReifier<? extends LoadBalancerDefinition>> reifier + = LOAD_BALANCERS.get(definition.getClass()); + if (reifier != null) { + answer = reifier.apply(route, definition); + } + } + if (answer == null) { + answer = coreReifier(route, definition); + } + if (answer == null) { + throw new IllegalStateException("Unsupported definition: " + definition); + } + return answer; + } + + private static LoadBalancerReifier<? extends LoadBalancerDefinition> coreReifier( + Route route, LoadBalancerDefinition definition) { + if (definition instanceof CustomLoadBalancerDefinition) { + return new CustomLoadBalancerReifier(route, definition); + } else if (definition instanceof FailoverLoadBalancerDefinition) { + return new FailoverLoadBalancerReifier(route, definition); + } else if (definition instanceof RandomLoadBalancerDefinition) { + return new RandomLoadBalancerReifier(route, definition); + } else if (definition instanceof RoundRobinLoadBalancerDefinition) { + return new RoundRobinLoadBalancerReifier(route, definition); + } else if (definition instanceof StickyLoadBalancerDefinition) { + return new StickyLoadBalancerReifier(route, definition); + } else if (definition instanceof TopicLoadBalancerDefinition) { + return new TopicLoadBalancerReifier(route, definition); + } else if (definition instanceof WeightedLoadBalancerDefinition) { + return new WeightedLoadBalancerReifier(route, definition); } - throw new IllegalStateException("Unsupported definition: " + definition); + return null; } public static void clearReifiers() { diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/transformer/TransformerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/transformer/TransformerReifier.java index 8b9531e..6776783 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/transformer/TransformerReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/transformer/TransformerReifier.java @@ -33,11 +33,9 @@ public abstract class TransformerReifier<T> extends AbstractReifier { private static final Map<Class<?>, BiFunction<CamelContext, TransformerDefinition, TransformerReifier<? extends TransformerDefinition>>> TRANSFORMERS; static { + // for custom reifiers Map<Class<?>, BiFunction<CamelContext, TransformerDefinition, TransformerReifier<? extends TransformerDefinition>>> map - = new HashMap<>(); - map.put(CustomTransformerDefinition.class, CustomTransformeReifier::new); - map.put(DataFormatTransformerDefinition.class, DataFormatTransformerReifier::new); - map.put(EndpointTransformerDefinition.class, EndpointTransformeReifier::new); + = new HashMap<>(0); TRANSFORMERS = map; ReifierStrategy.addReifierClearer(TransformerReifier::clearReifiers); } @@ -51,12 +49,35 @@ public abstract class TransformerReifier<T> extends AbstractReifier { public static TransformerReifier<? extends TransformerDefinition> reifier( CamelContext camelContext, TransformerDefinition definition) { - BiFunction<CamelContext, TransformerDefinition, TransformerReifier<? extends TransformerDefinition>> reifier - = TRANSFORMERS.get(definition.getClass()); - if (reifier != null) { - return reifier.apply(camelContext, definition); + + TransformerReifier<? extends TransformerDefinition> answer = null; + if (!TRANSFORMERS.isEmpty()) { + // custom take precedence + BiFunction<CamelContext, TransformerDefinition, TransformerReifier<? extends TransformerDefinition>> reifier + = TRANSFORMERS.get(definition.getClass()); + if (reifier != null) { + answer = reifier.apply(camelContext, definition); + } + } + if (answer == null) { + answer = coreReifier(camelContext, definition); + } + if (answer == null) { + throw new IllegalStateException("Unsupported definition: " + definition); + } + return answer; + } + + private static TransformerReifier<? extends TransformerDefinition> coreReifier( + CamelContext camelContext, TransformerDefinition definition) { + if (definition instanceof CustomTransformerDefinition) { + return new CustomTransformeReifier(camelContext, definition); + } else if (definition instanceof DataFormatTransformerDefinition) { + return new DataFormatTransformerReifier(camelContext, definition); + } else if (definition instanceof EndpointTransformerDefinition) { + return new EndpointTransformeReifier(camelContext, definition); } - throw new IllegalStateException("Unsupported definition: " + definition); + return null; } public static void clearReifiers() { diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/validator/ValidatorReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/validator/ValidatorReifier.java index da0d1d4..04a469e 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/validator/ValidatorReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/validator/ValidatorReifier.java @@ -33,11 +33,9 @@ public abstract class ValidatorReifier<T> extends AbstractReifier { private static final Map<Class<?>, BiFunction<CamelContext, ValidatorDefinition, ValidatorReifier<? extends ValidatorDefinition>>> VALIDATORS; static { + // for custom reifiers Map<Class<?>, BiFunction<CamelContext, ValidatorDefinition, ValidatorReifier<? extends ValidatorDefinition>>> map - = new HashMap<>(); - map.put(CustomValidatorDefinition.class, CustomValidatorReifier::new); - map.put(EndpointValidatorDefinition.class, EndpointValidatorReifier::new); - map.put(PredicateValidatorDefinition.class, PredicateValidatorReifier::new); + = new HashMap<>(0); VALIDATORS = map; ReifierStrategy.addReifierClearer(ValidatorReifier::clearReifiers); } @@ -57,12 +55,35 @@ public abstract class ValidatorReifier<T> extends AbstractReifier { public static ValidatorReifier<? extends ValidatorDefinition> reifier( CamelContext camelContext, ValidatorDefinition definition) { - BiFunction<CamelContext, ValidatorDefinition, ValidatorReifier<? extends ValidatorDefinition>> reifier - = VALIDATORS.get(definition.getClass()); - if (reifier != null) { - return reifier.apply(camelContext, definition); + + ValidatorReifier<? extends ValidatorDefinition> answer = null; + if (!VALIDATORS.isEmpty()) { + // custom take precedence + BiFunction<CamelContext, ValidatorDefinition, ValidatorReifier<? extends ValidatorDefinition>> reifier + = VALIDATORS.get(definition.getClass()); + if (reifier != null) { + answer = reifier.apply(camelContext, definition); + } + } + if (answer == null) { + answer = coreReifier(camelContext, definition); + } + if (answer == null) { + throw new IllegalStateException("Unsupported definition: " + definition); + } + return answer; + } + + private static ValidatorReifier<? extends ValidatorDefinition> coreReifier( + CamelContext camelContext, ValidatorDefinition definition) { + if (definition instanceof CustomValidatorDefinition) { + return new CustomValidatorReifier(camelContext, definition); + } else if (definition instanceof EndpointValidatorDefinition) { + return new EndpointValidatorReifier(camelContext, definition); + } else if (definition instanceof PredicateValidatorDefinition) { + return new PredicateValidatorReifier(camelContext, definition); } - throw new IllegalStateException("Unsupported definition: " + definition); + return null; } public static void clearReifiers() { diff --git a/core/camel-core/src/test/java/org/apache/camel/reifier/ProcessorReifierTest.java b/core/camel-core/src/test/java/org/apache/camel/reifier/ProcessorReifierTest.java index c13b9fe..22f8af0 100644 --- a/core/camel-core/src/test/java/org/apache/camel/reifier/ProcessorReifierTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/reifier/ProcessorReifierTest.java @@ -19,25 +19,18 @@ package org.apache.camel.reifier; import org.apache.camel.Route; import org.apache.camel.impl.engine.DefaultRoute; import org.apache.camel.model.ProcessDefinition; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.fail; - public class ProcessorReifierTest { @Test public void testHandleCustomProcessorDefinition() { Route ctx = new DefaultRoute(null, null, null, null, null); - try { - ProcessorReifier.reifier(ctx, new MyProcessor()); - - fail("Should throw IllegalStateException instead"); - } catch (IllegalStateException e) { - } - - ProcessorReifier.registerReifier(MyProcessor.class, ProcessReifier::new); - ProcessorReifier.reifier(ctx, new ProcessDefinition()); + ProcessorReifier.registerReifier(MyProcessorDefinition.class, ProcessReifier::new); + ProcessReifier ref = (ProcessReifier) ProcessorReifier.reifier(ctx, new MyProcessorDefinition()); + Assertions.assertTrue(ref.definition instanceof MyProcessorDefinition); } - public static class MyProcessor extends ProcessDefinition { + public static class MyProcessorDefinition extends ProcessDefinition { } } diff --git a/core/camel-core/src/test/java/org/apache/camel/reifier/DataFormatReifierTest.java b/core/camel-core/src/test/java/org/apache/camel/reifier/dataformat/DataFormatReifierTest.java similarity index 67% rename from core/camel-core/src/test/java/org/apache/camel/reifier/DataFormatReifierTest.java rename to core/camel-core/src/test/java/org/apache/camel/reifier/dataformat/DataFormatReifierTest.java index f02f533..3e7f074 100644 --- a/core/camel-core/src/test/java/org/apache/camel/reifier/DataFormatReifierTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/reifier/dataformat/DataFormatReifierTest.java @@ -14,32 +14,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.reifier; +package org.apache.camel.reifier.dataformat; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.model.dataformat.CustomDataFormat; -import org.apache.camel.reifier.dataformat.CustomDataFormatReifier; -import org.apache.camel.reifier.dataformat.DataFormatReifier; -import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import static org.junit.jupiter.api.Assertions.fail; - -@TestMethodOrder(MethodOrderer.Alphanumeric.class) public class DataFormatReifierTest { @Test public void testHandleCustomDataFormat() { DefaultCamelContext context = new DefaultCamelContext(); - try { - DataFormatReifier.reifier(context, new MyDataFormat()); - fail("Should throw IllegalStateException instead"); - } catch (IllegalStateException e) { - } - DataFormatReifier.registerReifier(MyDataFormat.class, CustomDataFormatReifier::new); - DataFormatReifier.reifier(context, new MyDataFormat()); + DataFormatReifier<?> ref = DataFormatReifier.reifier(context, new MyDataFormat()); + Assertions.assertTrue(ref.definition instanceof MyDataFormat); } public static class MyDataFormat extends CustomDataFormat {