This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch mock in repository https://gitbox.apache.org/repos/asf/camel.git
commit 31b7d364bd54eb8f73703d8d7ff1009053dfdd6a Author: Claus Ibsen <[email protected]> AuthorDate: Mon Apr 15 13:15:19 2019 +0200 Move mock component out of camel-core. Work in progress. --- .../blueprint/handler/CamelNamespaceHandler.java | 2 +- .../spring/handler/CamelNamespaceHandler.java | 2 +- .../org/apache/camel/builder/ExpressionClause.java | 32 ++++++++++++++-------- .../camel/builder/ExpressionClauseSupport.java | 17 ++++++++---- .../org/apache/camel/builder/ValueBuilder.java | 7 +++-- .../camel/component/mock/AssertionClause.java | 10 +++---- .../apache/camel/model/AggregateDefinition.java | 24 +++++++++++----- .../org/apache/camel/model/ChoiceDefinition.java | 16 +++++++++-- .../org/apache/camel/model/ExpressionNode.java | 10 ++++++- .../apache/camel/model/ResequenceDefinition.java | 7 +++++ .../camel/model/language/ExpressionDefinition.java | 14 ++++++---- .../util/DumpModelAsXmlChoiceFilterRouteTest.java | 2 ++ .../camel/support/language/ExpressionModel.java | 29 ++++++++++++++++++++ 13 files changed, 129 insertions(+), 43 deletions(-) diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java index 57a85de..330823e 100644 --- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java +++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java @@ -62,7 +62,6 @@ import org.apache.camel.blueprint.CamelContextFactoryBean; import org.apache.camel.blueprint.CamelEndpointFactoryBean; import org.apache.camel.blueprint.CamelRestContextFactoryBean; import org.apache.camel.blueprint.CamelRouteContextFactoryBean; -import org.apache.camel.builder.xml.Namespaces; import org.apache.camel.core.xml.AbstractCamelFactoryBean; import org.apache.camel.impl.CamelPostProcessorHelper; import org.apache.camel.impl.DefaultCamelContextNameStrategy; @@ -88,6 +87,7 @@ import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.model.rest.RestBindingMode; import org.apache.camel.model.rest.RestDefinition; import org.apache.camel.model.rest.VerbDefinition; +import org.apache.camel.support.builder.xml.Namespaces; import org.apache.camel.spi.CamelContextNameStrategy; import org.apache.camel.spi.ComponentResolver; import org.apache.camel.spi.DataFormatResolver; diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java b/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java index 05bbf72..5acdf03 100644 --- a/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java +++ b/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java @@ -32,11 +32,11 @@ import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import org.apache.camel.builder.xml.Namespaces; import org.apache.camel.core.xml.CamelJMXAgentDefinition; import org.apache.camel.core.xml.CamelPropertyPlaceholderDefinition; import org.apache.camel.core.xml.CamelStreamCachingStrategyDefinition; import org.apache.camel.impl.DefaultCamelContextNameStrategy; +import org.apache.camel.support.builder.xml.Namespaces; import org.apache.camel.spi.CamelContextNameStrategy; import org.apache.camel.spi.NamespaceAware; import org.apache.camel.spring.CamelBeanPostProcessor; diff --git a/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java b/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java index 7b89cab..eed851f 100644 --- a/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java +++ b/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java @@ -24,16 +24,18 @@ import java.util.function.Supplier; import org.apache.camel.Exchange; import org.apache.camel.Expression; import org.apache.camel.Message; -import org.apache.camel.support.builder.xml.Namespaces; +import org.apache.camel.Predicate; import org.apache.camel.model.ExpressionNode; -import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.support.ExpressionAdapter; +import org.apache.camel.support.ExpressionToPredicateAdapter; +import org.apache.camel.support.builder.xml.Namespaces; +import org.apache.camel.support.language.ExpressionModel; /** * Represents an expression clause within the DSL which when the expression is * complete the clause continues to another part of the DSL */ -public class ExpressionClause<T> extends ExpressionDefinition { +public class ExpressionClause<T> implements Expression, Predicate { private ExpressionClauseSupport<T> delegate; public ExpressionClause(T result) { @@ -1062,23 +1064,31 @@ public class ExpressionClause<T> extends ExpressionDefinition { // Properties // ------------------------------------------------------------------------- - @Override public Expression getExpressionValue() { return delegate.getExpressionValue(); } - @Override - protected void setExpressionValue(Expression expressionValue) { - delegate.setExpressionValue(expressionValue); + public ExpressionModel getExpressionType() { + return delegate.getExpressionType(); } @Override - public ExpressionDefinition getExpressionType() { - return delegate.getExpressionType(); + public <T> T evaluate(Exchange exchange, Class<T> type) { + if (getExpressionValue() != null) { + return getExpressionValue().evaluate(exchange, type); + } else { + Expression exp = delegate.getExpressionType().createExpression(exchange.getContext()); + return exp.evaluate(exchange, type); + } } @Override - protected void setExpressionType(ExpressionDefinition expressionType) { - delegate.setExpressionType(expressionType); + public boolean matches(Exchange exchange) { + if (getExpressionValue() != null) { + return new ExpressionToPredicateAdapter(getExpressionValue()).matches(exchange); + } else { + Expression exp = delegate.getExpressionType().createExpression(exchange.getContext()); + return new ExpressionToPredicateAdapter(exp).matches(exchange); + } } } diff --git a/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java b/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java index fa515c4..ddfd467 100644 --- a/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java +++ b/core/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java @@ -23,7 +23,6 @@ import org.apache.camel.Expression; import org.apache.camel.support.builder.xml.Namespaces; import org.apache.camel.model.language.ConstantExpression; import org.apache.camel.model.language.ExchangePropertyExpression; -import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.model.language.GroovyExpression; import org.apache.camel.model.language.HeaderExpression; import org.apache.camel.model.language.Hl7TerserExpression; @@ -40,6 +39,7 @@ import org.apache.camel.model.language.TokenizerExpression; import org.apache.camel.model.language.XMLTokenizerExpression; import org.apache.camel.model.language.XPathExpression; import org.apache.camel.model.language.XQueryExpression; +import org.apache.camel.support.language.ExpressionModel; /** * A support class for building expression clauses. @@ -51,7 +51,7 @@ public class ExpressionClauseSupport<T> { private T result; private Expression expressionValue; - private ExpressionDefinition expressionType; + private ExpressionModel expressionType; public ExpressionClauseSupport(T result) { this.result = result; @@ -65,10 +65,16 @@ public class ExpressionClauseSupport<T> { */ public T expression(Expression expression) { setExpressionValue(expression); + if (expression instanceof ExpressionModel) { + setExpressionType((ExpressionModel) expression); + } return result; } - public T expression(ExpressionDefinition expression) { + /** + * Specify an {@link ExpressionModel} instance + */ + public T language(ExpressionModel expression) { setExpressionType(expression); return result; } @@ -1081,11 +1087,11 @@ public class ExpressionClauseSupport<T> { this.expressionValue = expressionValue; } - public ExpressionDefinition getExpressionType() { + public ExpressionModel getExpressionType() { return expressionType; } - public void setExpressionType(ExpressionDefinition expressionType) { + public void setExpressionType(ExpressionModel expressionType) { this.expressionType = expressionType; } @@ -1101,6 +1107,7 @@ public class ExpressionClauseSupport<T> { } protected void configureExpression(CamelContext camelContext, Expression expression) { + // noop } } diff --git a/core/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java b/core/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java index dc50ec4..a37d742 100644 --- a/core/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java +++ b/core/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java @@ -24,10 +24,10 @@ import java.util.concurrent.atomic.AtomicReference; import org.apache.camel.Exchange; import org.apache.camel.Expression; import org.apache.camel.Predicate; -import org.apache.camel.support.builder.xml.Namespaces; import org.apache.camel.spi.NamespaceAware; import org.apache.camel.support.ExpressionAdapter; import org.apache.camel.support.ExpressionToPredicateAdapter; +import org.apache.camel.support.builder.xml.Namespaces; /** * A builder of expressions or predicates based on values. @@ -92,11 +92,12 @@ public class ValueBuilder implements Expression, Predicate { final Expression right = new ExpressionAdapter() { @Override public Object evaluate(Exchange exchange) { - if (answer.getExpressionValue() != null) { + return answer.evaluate(exchange, Object.class); + /*if (answer.getExpressionValue() != null) { return answer.getExpressionValue().evaluate(exchange, Object.class); } else { return answer.getExpressionType().evaluate(exchange); - } + }*/ } }; // okay now we can set the reference to the right-hand-side diff --git a/core/camel-core/src/main/java/org/apache/camel/component/mock/AssertionClause.java b/core/camel-core/src/main/java/org/apache/camel/component/mock/AssertionClause.java index b6f0a75..795f7d5 100644 --- a/core/camel-core/src/main/java/org/apache/camel/component/mock/AssertionClause.java +++ b/core/camel-core/src/main/java/org/apache/camel/component/mock/AssertionClause.java @@ -27,8 +27,8 @@ import org.apache.camel.StreamCache; import org.apache.camel.builder.ExpressionClause; import org.apache.camel.builder.ExpressionClauseSupport; import org.apache.camel.builder.ValueBuilder; -import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.support.PredicateAssertHelper; +import org.apache.camel.support.language.ExpressionModel; /** * A builder of assertions on message exchanges @@ -52,13 +52,13 @@ public abstract class AssertionClause extends ExpressionClauseSupport<ValueBuild public ValueBuilder expression(Expression expression) { // must override this method as we provide null in the constructor super.expression(expression); - return new PredicateValueBuilder(getExpressionValue()); + return new PredicateValueBuilder(expression); } - public ValueBuilder expression(ExpressionDefinition expression) { + public ValueBuilder language(ExpressionModel expression) { // must override this method as we provide null in the constructor - super.expression(expression); - return new PredicateValueBuilder(expression.createExpression(mock.getCamelContext())); + super.expression(expression.createExpression(mock.getCamelContext())); + return new PredicateValueBuilder(getExpressionValue()); } /** diff --git a/core/camel-core/src/main/java/org/apache/camel/model/AggregateDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/AggregateDefinition.java index ff3af9e..a81e290 100644 --- a/core/camel-core/src/main/java/org/apache/camel/model/AggregateDefinition.java +++ b/core/camel-core/src/main/java/org/apache/camel/model/AggregateDefinition.java @@ -41,6 +41,7 @@ import org.apache.camel.processor.aggregate.OptimisticLockRetryPolicy; import org.apache.camel.spi.AggregationRepository; import org.apache.camel.spi.AsPredicate; import org.apache.camel.spi.Metadata; +import org.apache.camel.support.language.ExpressionModel; /** * Aggregates many messages into a single message @@ -163,18 +164,23 @@ public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition @Override public void configureChild(ProcessorDefinition<?> output) { - if (expression instanceof ExpressionClause) { - ExpressionClause<?> clause = (ExpressionClause<?>) expression; + Expression exp = getExpression(); + if (getExpression() != null && getExpression().getExpressionValue() != null) { + exp = getExpression().getExpressionValue(); + } + + if (exp instanceof ExpressionClause) { + ExpressionClause<?> clause = (ExpressionClause<?>) exp; if (clause.getExpressionType() != null) { // if using the Java DSL then the expression may have been set using the // ExpressionClause which is a fancy builder to define expressions and predicates // using fluent builders in the DSL. However we need afterwards a callback to // reset the expression to the expression type the ExpressionClause did build for us - expression = clause.getExpressionType(); - // set the correlation expression from the expression type, as the model definition - // would then be accurate - correlationExpression = new ExpressionSubElementDefinition(); - correlationExpression.setExpressionType(clause.getExpressionType()); + ExpressionModel model = clause.getExpressionType(); + if (model instanceof ExpressionDefinition) { + correlationExpression = new ExpressionSubElementDefinition(); + correlationExpression.setExpressionType((ExpressionDefinition) model); + } } } } @@ -922,6 +928,10 @@ public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition this.expression = expression; } + public void setExpression(Expression expression) { + setExpression(new ExpressionDefinition(expression)); + } + protected void checkNoCompletedPredicate() { if (getCompletionPredicate() != null) { throw new IllegalArgumentException("There is already a completionPredicate defined for this aggregator: " + this); diff --git a/core/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java index a926bd0..a782d5e 100644 --- a/core/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java +++ b/core/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java @@ -28,8 +28,10 @@ import javax.xml.bind.annotation.XmlRootElement; import org.apache.camel.Predicate; import org.apache.camel.builder.ExpressionClause; +import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.spi.AsPredicate; import org.apache.camel.spi.Metadata; +import org.apache.camel.support.language.ExpressionModel; import org.apache.camel.util.CollectionStringBuffer; import org.apache.camel.util.ObjectHelper; @@ -253,14 +255,22 @@ public class ChoiceDefinition extends ProcessorDefinition<ChoiceDefinition> { return; } for (WhenDefinition when : whenClauses) { - if (when.getExpression() instanceof ExpressionClause) { - ExpressionClause<?> clause = (ExpressionClause<?>) when.getExpression(); + ExpressionDefinition exp = when.getExpression(); + if (exp.getExpressionType() != null) { + exp = exp.getExpressionType(); + } + Predicate pre = exp.getPredicate(); + if (pre instanceof ExpressionClause) { + ExpressionClause<?> clause = (ExpressionClause<?>) pre; if (clause.getExpressionType() != null) { // if using the Java DSL then the expression may have been set using the // ExpressionClause which is a fancy builder to define expressions and predicates // using fluent builders in the DSL. However we need afterwards a callback to // reset the expression to the expression type the ExpressionClause did build for us - when.setExpression(clause.getExpressionType()); + ExpressionModel model = clause.getExpressionType(); + if (model instanceof ExpressionDefinition) { + when.setExpression((ExpressionDefinition) model); + } } } } diff --git a/core/camel-core/src/main/java/org/apache/camel/model/ExpressionNode.java b/core/camel-core/src/main/java/org/apache/camel/model/ExpressionNode.java index 2286858..7372044 100644 --- a/core/camel-core/src/main/java/org/apache/camel/model/ExpressionNode.java +++ b/core/camel-core/src/main/java/org/apache/camel/model/ExpressionNode.java @@ -28,6 +28,7 @@ import org.apache.camel.Expression; import org.apache.camel.Predicate; import org.apache.camel.builder.ExpressionClause; import org.apache.camel.model.language.ExpressionDefinition; +import org.apache.camel.support.language.ExpressionModel; /** * A base class for nodes which contain an expression and a number of outputs @@ -63,6 +64,10 @@ public abstract class ExpressionNode extends ProcessorDefinition<ExpressionNode> return expression; } + public void setExpression(Expression expression) { + setExpression(new ExpressionDefinition(expression)); + } + public void setExpression(ExpressionDefinition expression) { // favour using the helper to set the expression as it can unwrap some unwanted builders when using Java DSL this.expression = expression; @@ -110,7 +115,10 @@ public abstract class ExpressionNode extends ProcessorDefinition<ExpressionNode> // ExpressionClause which is a fancy builder to define expressions and predicates // using fluent builders in the DSL. However we need afterwards a callback to // reset the expression to the expression type the ExpressionClause did build for us - setExpression(clause.getExpressionType()); + ExpressionModel model = clause.getExpressionType(); + if (model instanceof ExpressionDefinition) { + setExpression((ExpressionDefinition) model); + } } } diff --git a/core/camel-core/src/main/java/org/apache/camel/model/ResequenceDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/ResequenceDefinition.java index a463b3f..5285f3e 100644 --- a/core/camel-core/src/main/java/org/apache/camel/model/ResequenceDefinition.java +++ b/core/camel-core/src/main/java/org/apache/camel/model/ResequenceDefinition.java @@ -331,4 +331,11 @@ public class ResequenceDefinition extends ProcessorDefinition<ResequenceDefiniti this.expression = expression; } + /** + * Expression to use for re-ordering the messages, such as a header with a sequence number + */ + public void setExpression(Expression expression) { + setExpression(new ExpressionDefinition(expression)); + } + } diff --git a/core/camel-core/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java index 6e56a0b..7eb9a4c 100644 --- a/core/camel-core/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java +++ b/core/camel-core/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java @@ -44,6 +44,7 @@ import org.apache.camel.spi.Metadata; import org.apache.camel.spi.RouteContext; import org.apache.camel.support.ExpressionToPredicateAdapter; import org.apache.camel.support.IntrospectionSupport; +import org.apache.camel.support.language.ExpressionModel; import org.apache.camel.util.CollectionStringBuffer; import org.apache.camel.util.ObjectHelper; @@ -54,7 +55,7 @@ import org.apache.camel.util.ObjectHelper; @XmlRootElement @XmlType(name = "expression") // must be named expression @XmlAccessorType(XmlAccessType.FIELD) -public class ExpressionDefinition implements Expression, Predicate, OtherAttributesAware { +public class ExpressionDefinition implements Expression, Predicate, OtherAttributesAware, ExpressionModel { @XmlAttribute @XmlID private String id; @@ -97,17 +98,18 @@ public class ExpressionDefinition implements Expression, Predicate, OtherAttribu @Override public String toString() { + // favour using the output from expression value + if (getExpressionValue() != null) { + return getExpressionValue().toString(); + } + StringBuilder sb = new StringBuilder(); if (getLanguage() != null) { sb.append(getLanguage()).append("{"); } if (getPredicate() != null) { sb.append(getPredicate().toString()); - } - if (getExpressionValue() != null) { - sb.append(getExpressionValue().toString()); - } - if (getPredicate() == null && getExpressionValue() == null && getExpression() != null) { + } else if (getExpression() != null) { sb.append(getExpression()); } if (getLanguage() != null) { diff --git a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlChoiceFilterRouteTest.java b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlChoiceFilterRouteTest.java index 7205913..1f8ba3f 100644 --- a/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlChoiceFilterRouteTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlChoiceFilterRouteTest.java @@ -32,6 +32,7 @@ public class DumpModelAsXmlChoiceFilterRouteTest extends ContextTestSupport { assertNotNull(xml); log.info(xml); + assertTrue(xml.contains("<header>dude</header>")); assertTrue(xml.contains("<header>gold</header>")); assertTrue(xml.contains("<header>extra-gold</header>")); assertTrue(xml.contains("<simple>${body} contains 'Camel'</simple>")); @@ -54,6 +55,7 @@ public class DumpModelAsXmlChoiceFilterRouteTest extends ContextTestSupport { public void configure() throws Exception { from("direct:start").routeId("myRoute") .to("log:input") + .transform().header("dude") .choice() .when().header("gold") .to("mock:gold") diff --git a/core/camel-support/src/main/java/org/apache/camel/support/language/ExpressionModel.java b/core/camel-support/src/main/java/org/apache/camel/support/language/ExpressionModel.java new file mode 100644 index 0000000..9b812f1 --- /dev/null +++ b/core/camel-support/src/main/java/org/apache/camel/support/language/ExpressionModel.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.support.language; + +import org.apache.camel.CamelContext; +import org.apache.camel.Expression; + +public interface ExpressionModel { + + // TODO: move to api, and maybe have a @FunctionalInterface + + Expression createExpression(CamelContext camelContext); + + +}
