Repository: camel Updated Branches: refs/heads/master 96ee31409 -> dce92c8d7
CAMEL-10698: Add information in DSL whether an expression is to be used as expression or predicate. This allows us to understand this for eg the validate goal of camel-maven-plugin or others. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/dce92c8d Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/dce92c8d Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/dce92c8d Branch: refs/heads/master Commit: dce92c8d77dc098cbf879efaa5e290a5cb5e2470 Parents: 96ee314 Author: Claus Ibsen <davscl...@apache.org> Authored: Wed Jan 11 22:09:44 2017 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Jan 11 22:09:44 2017 +0100 ---------------------------------------------------------------------- .../apache/camel/model/AggregateDefinition.java | 4 ++ .../org/apache/camel/model/CatchDefinition.java | 5 ++ .../apache/camel/model/ChoiceDefinition.java | 3 ++ .../apache/camel/model/FilterDefinition.java | 2 +- .../InterceptSendToEndpointDefinition.java | 1 + .../camel/model/OnCompletionDefinition.java | 2 + .../camel/model/OnExceptionDefinition.java | 11 +++++ .../apache/camel/model/ProcessorDefinition.java | 9 ++++ .../org/apache/camel/model/TryDefinition.java | 3 ++ .../apache/camel/model/ValidateDefinition.java | 2 +- .../org/apache/camel/model/WhenDefinition.java | 2 +- .../model/WhenSkipSendToEndpointDefinition.java | 2 +- .../org/apache/camel/parser/ParserResult.java | 12 +++++ .../apache/camel/parser/RouteBuilderParser.java | 19 ++++--- .../parser/helper/CamelJavaParserHelper.java | 52 +++++++++++++++++++- .../RoasterSimpleRouteBuilderConfigureTest.java | 2 + .../org/apache/camel/maven/ValidateMojo.java | 11 ++++- .../java/org/apache/camel/spi/Metadata.java | 17 +++++++ 18 files changed, 145 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/camel-core/src/main/java/org/apache/camel/model/AggregateDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/AggregateDefinition.java b/camel-core/src/main/java/org/apache/camel/model/AggregateDefinition.java index 2b5b97c..f97a459 100644 --- a/camel-core/src/main/java/org/apache/camel/model/AggregateDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/AggregateDefinition.java @@ -61,6 +61,7 @@ public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition @XmlElement(name = "correlationExpression", required = true) private ExpressionSubElementDefinition correlationExpression; @XmlElement(name = "completionPredicate") + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) private ExpressionSubElementDefinition completionPredicate; @XmlElement(name = "completionTimeout") private ExpressionSubElementDefinition completionTimeoutExpression; @@ -889,6 +890,7 @@ public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition /** * Sets the predicate used to determine if the aggregation is completed */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public AggregateDefinition completionPredicate(Predicate predicate) { checkNoCompletedPredicate(); setCompletionPredicate(new ExpressionSubElementDefinition(predicate)); @@ -901,6 +903,7 @@ public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition * * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public PredicateClause<AggregateDefinition> completionPredicate() { PredicateClause<AggregateDefinition> clause = new PredicateClause<>(this); completionPredicate(clause); @@ -913,6 +916,7 @@ public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition * * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public PredicateClause<AggregateDefinition> completion() { return completionPredicate(); } http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/camel-core/src/main/java/org/apache/camel/model/CatchDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/CatchDefinition.java b/camel-core/src/main/java/org/apache/camel/model/CatchDefinition.java index 92837a0..96b849a 100644 --- a/camel-core/src/main/java/org/apache/camel/model/CatchDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/CatchDefinition.java @@ -47,8 +47,10 @@ public class CatchDefinition extends ProcessorDefinition<CatchDefinition> { @XmlElement(name = "exception") private List<String> exceptions = new ArrayList<String>(); @XmlElement(name = "onWhen") + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) private WhenDefinition onWhen; @XmlElement(name = "handled") + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) private ExpressionSubElementDefinition handled; @XmlElementRef private List<ProcessorDefinition<?>> outputs = new ArrayList<ProcessorDefinition<?>>(); @@ -173,6 +175,7 @@ public class CatchDefinition extends ProcessorDefinition<CatchDefinition> { * @param predicate predicate that determines true or false * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public CatchDefinition onWhen(Predicate predicate) { setOnWhen(new WhenDefinition(predicate)); return this; @@ -201,6 +204,7 @@ public class CatchDefinition extends ProcessorDefinition<CatchDefinition> { * from a {@link Processor} or use the {@link ProcessorDefinition#throwException(Exception)} */ @Deprecated + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public CatchDefinition handled(Predicate handled) { setHandledPolicy(handled); return this; @@ -215,6 +219,7 @@ public class CatchDefinition extends ProcessorDefinition<CatchDefinition> { * from a {@link Processor} or use the {@link ProcessorDefinition#throwException(Exception)} */ @Deprecated + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public CatchDefinition handled(Expression handled) { setHandledPolicy(ExpressionToPredicateAdapter.toPredicate(handled)); return this; http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java b/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java index 60370cc..ef7f1f0 100644 --- a/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java @@ -45,6 +45,7 @@ import org.apache.camel.util.ObjectHelper; @XmlAccessorType(XmlAccessType.FIELD) public class ChoiceDefinition extends ProcessorDefinition<ChoiceDefinition> { @XmlElementRef + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) private List<WhenDefinition> whenClauses = new ArrayList<WhenDefinition>(); @XmlElement private OtherwiseDefinition otherwise; @@ -179,6 +180,7 @@ public class ChoiceDefinition extends ProcessorDefinition<ChoiceDefinition> { * @param predicate the predicate * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public ChoiceDefinition when(Predicate predicate) { addClause(new WhenDefinition(predicate)); return this; @@ -189,6 +191,7 @@ public class ChoiceDefinition extends ProcessorDefinition<ChoiceDefinition> { * * @return expression to be used as builder to configure the when node */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public ExpressionClause<ChoiceDefinition> when() { ExpressionClause<ChoiceDefinition> clause = new ExpressionClause<ChoiceDefinition>(this); addClause(new WhenDefinition(clause)); http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/camel-core/src/main/java/org/apache/camel/model/FilterDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/FilterDefinition.java b/camel-core/src/main/java/org/apache/camel/model/FilterDefinition.java index 01bcdce..e5a18fd 100644 --- a/camel-core/src/main/java/org/apache/camel/model/FilterDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/FilterDefinition.java @@ -32,7 +32,7 @@ import org.apache.camel.spi.RouteContext; * * @version */ -@Metadata(label = "eip,routing") +@Metadata(label = "eip,routing", expressionMode = Metadata.ExpressionMode.predicate) @XmlRootElement(name = "filter") @XmlAccessorType(XmlAccessType.FIELD) public class FilterDefinition extends ExpressionNode { http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/camel-core/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java b/camel-core/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java index a79401d..e751182 100644 --- a/camel-core/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java @@ -149,6 +149,7 @@ public class InterceptSendToEndpointDefinition extends OutputDefinition<Intercep * @param predicate the predicate * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public InterceptSendToEndpointDefinition when(Predicate predicate) { WhenDefinition when = new WhenDefinition(predicate); addOutput(when); http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java b/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java index a37e912..cf8f104 100644 --- a/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java @@ -54,6 +54,7 @@ public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefi @XmlAttribute private Boolean onFailureOnly; @XmlElement(name = "onWhen") + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) private WhenDefinition onWhen; @XmlAttribute private Boolean parallelProcessing; @@ -249,6 +250,7 @@ public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefi * @param predicate predicate that determines true or false * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public OnCompletionDefinition onWhen(Predicate predicate) { setOnWhen(new WhenDefinition(predicate)); return this; http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java b/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java index 9ed6ebe..d8d0de8 100644 --- a/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java @@ -59,16 +59,20 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini @XmlElement(name = "exception", required = true) private List<String> exceptions = new ArrayList<String>(); @XmlElement(name = "onWhen") + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) private WhenDefinition onWhen; @XmlElement(name = "retryWhile") + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) private ExpressionSubElementDefinition retryWhile; @XmlElement(name = "redeliveryPolicy") private RedeliveryPolicyDefinition redeliveryPolicyType; @XmlAttribute(name = "redeliveryPolicyRef") private String redeliveryPolicyRef; @XmlElement(name = "handled") + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) private ExpressionSubElementDefinition handled; @XmlElement(name = "continued") + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) private ExpressionSubElementDefinition continued; @XmlAttribute(name = "onRedeliveryRef") private String onRedeliveryRef; @@ -295,6 +299,7 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini * @param handled predicate that determines true or false * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public OnExceptionDefinition handled(Predicate handled) { setHandledPolicy(handled); return this; @@ -306,6 +311,7 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini * @param handled expression that determines true or false * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public OnExceptionDefinition handled(Expression handled) { setHandledPolicy(ExpressionToPredicateAdapter.toPredicate(handled)); return this; @@ -319,6 +325,7 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini * @param continued continued or not * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public OnExceptionDefinition continued(boolean continued) { Expression expression = ExpressionBuilder.constantExpression(Boolean.toString(continued)); return continued(expression); @@ -332,6 +339,7 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini * @param continued predicate that determines true or false * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public OnExceptionDefinition continued(Predicate continued) { setContinuedPolicy(continued); return this; @@ -345,6 +353,7 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini * @param continued expression that determines true or false * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public OnExceptionDefinition continued(Expression continued) { setContinuedPolicy(ExpressionToPredicateAdapter.toPredicate(continued)); return this; @@ -359,6 +368,7 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini * @param predicate predicate that determines true or false * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public OnExceptionDefinition onWhen(Predicate predicate) { setOnWhen(new WhenDefinition(predicate)); return this; @@ -372,6 +382,7 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini * @param retryWhile predicate that determines when to stop retrying * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public OnExceptionDefinition retryWhile(Predicate retryWhile) { setRetryWhilePolicy(retryWhile); return this; http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java b/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java index bf2b315..641d3fd 100644 --- a/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java @@ -70,6 +70,7 @@ import org.apache.camel.spi.IdAware; import org.apache.camel.spi.IdempotentRepository; import org.apache.camel.spi.InterceptStrategy; import org.apache.camel.spi.LifecycleStrategy; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.Policy; import org.apache.camel.spi.RouteContext; import org.slf4j.Logger; @@ -1460,6 +1461,7 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type> * * @return the clause used to create the filter expression */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public ExpressionClause<? extends FilterDefinition> filter() { FilterDefinition filter = new FilterDefinition(); addOutput(filter); @@ -1474,6 +1476,7 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type> * @param predicate predicate to use * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public FilterDefinition filter(Predicate predicate) { FilterDefinition filter = new FilterDefinition(predicate); addOutput(filter); @@ -1488,6 +1491,7 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type> * @param expression the predicate expression to use * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public FilterDefinition filter(ExpressionDefinition expression) { FilterDefinition filter = new FilterDefinition(expression); addOutput(filter); @@ -1503,6 +1507,7 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type> * @param expression the expression * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public FilterDefinition filter(String language, String expression) { return filter(new LanguageExpression(language, expression)); } @@ -1515,6 +1520,7 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type> * @param expression the expression * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public ValidateDefinition validate(Expression expression) { ValidateDefinition answer = new ValidateDefinition(expression); addOutput(answer); @@ -1529,6 +1535,7 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type> * @param predicate the predicate * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public ValidateDefinition validate(Predicate predicate) { ValidateDefinition answer = new ValidateDefinition(predicate); addOutput(answer); @@ -1542,6 +1549,7 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type> * * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public ExpressionClause<ValidateDefinition> validate() { ValidateDefinition answer = new ValidateDefinition(); addOutput(answer); @@ -2236,6 +2244,7 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type> * @param predicate the while loop predicate * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public LoopDefinition loopDoWhile(Predicate predicate) { LoopDefinition loop = new LoopDefinition(predicate); addOutput(loop); http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/camel-core/src/main/java/org/apache/camel/model/TryDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/TryDefinition.java b/camel-core/src/main/java/org/apache/camel/model/TryDefinition.java index 3b9158b..b34b190 100644 --- a/camel-core/src/main/java/org/apache/camel/model/TryDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/TryDefinition.java @@ -148,6 +148,7 @@ public class TryDefinition extends OutputDefinition<TryDefinition> { * @param predicate predicate that determines true or false * @return the builder */ + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public TryDefinition onWhen(Predicate predicate) { // we must use a delegate so we can use the fluent builder based on TryDefinition // to configure all with try .. catch .. finally @@ -183,6 +184,7 @@ public class TryDefinition extends OutputDefinition<TryDefinition> { * from a {@link Processor} or use the {@link ProcessorDefinition#throwException(Exception)} */ @Deprecated + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public TryDefinition handled(Predicate handled) { // we must use a delegate so we can use the fluent builder based on TryDefinition // to configure all with try .. catch .. finally @@ -204,6 +206,7 @@ public class TryDefinition extends OutputDefinition<TryDefinition> { * from a {@link Processor} or use the {@link ProcessorDefinition#throwException(Exception)} */ @Deprecated + @Metadata(expressionMode = Metadata.ExpressionMode.predicate) public TryDefinition handled(Expression handled) { return handled(ExpressionToPredicateAdapter.toPredicate(handled)); } http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/camel-core/src/main/java/org/apache/camel/model/ValidateDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/ValidateDefinition.java b/camel-core/src/main/java/org/apache/camel/model/ValidateDefinition.java index 532e9c6..5ac9924 100644 --- a/camel-core/src/main/java/org/apache/camel/model/ValidateDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/ValidateDefinition.java @@ -32,7 +32,7 @@ import org.apache.camel.spi.RouteContext; * * @version */ -@Metadata(label = "eip,transformation") +@Metadata(label = "eip,transformation", expressionMode = Metadata.ExpressionMode.predicate) @XmlRootElement(name = "validate") @XmlAccessorType(XmlAccessType.FIELD) public class ValidateDefinition extends NoOutputExpressionNode { http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/camel-core/src/main/java/org/apache/camel/model/WhenDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/WhenDefinition.java b/camel-core/src/main/java/org/apache/camel/model/WhenDefinition.java index e0f1494..aca3933 100644 --- a/camel-core/src/main/java/org/apache/camel/model/WhenDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/WhenDefinition.java @@ -29,7 +29,7 @@ import org.apache.camel.spi.RouteContext; * * @version */ -@Metadata(label = "eip,routing") +@Metadata(label = "eip,routing", expressionMode = Metadata.ExpressionMode.predicate) @XmlRootElement(name = "when") public class WhenDefinition extends ExpressionNode { http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/camel-core/src/main/java/org/apache/camel/model/WhenSkipSendToEndpointDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/WhenSkipSendToEndpointDefinition.java b/camel-core/src/main/java/org/apache/camel/model/WhenSkipSendToEndpointDefinition.java index b607da2..ff124f7 100644 --- a/camel-core/src/main/java/org/apache/camel/model/WhenSkipSendToEndpointDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/WhenSkipSendToEndpointDefinition.java @@ -27,7 +27,7 @@ import org.apache.camel.spi.RouteContext; /** * Predicate to determine if the message should be sent or not to the endpoint, when using interceptSentToEndpoint. */ -@Metadata(label = "configuration") +@Metadata(label = "configuration", expressionMode = Metadata.ExpressionMode.predicate) @XmlRootElement(name = "whenSkipSendToEndpoint") public class WhenSkipSendToEndpointDefinition extends WhenDefinition { http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/ParserResult.java ---------------------------------------------------------------------- diff --git a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/ParserResult.java b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/ParserResult.java index 4ef2fc4..71088d2 100644 --- a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/ParserResult.java +++ b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/ParserResult.java @@ -25,6 +25,7 @@ public class ParserResult { private boolean parsed; private int position; private String element; + private Boolean predicate; public ParserResult(String node, int position, String element) { this(node, position, element, true); @@ -66,6 +67,17 @@ public class ParserResult { return node; } + public Boolean getPredicate() { + return predicate; + } + + /** + * Tells if it was an expression which is intended to be used as a predicate (determined from camel-core mode) + */ + public void setPredicate(Boolean predicate) { + this.predicate = predicate; + } + public String toString() { return element; } http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java ---------------------------------------------------------------------- diff --git a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java index 36fc443..dd15697 100644 --- a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java +++ b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java @@ -249,17 +249,22 @@ public final class RouteBuilderParser { fileName = fileName.substring(baseDir.length() + 1); } - CamelSimpleExpressionDetails details = new CamelSimpleExpressionDetails(); - details.setFileName(fileName); - details.setClassName(clazz.getQualifiedName()); - details.setMethodName("configure"); + CamelSimpleExpressionDetails detail = new CamelSimpleExpressionDetails(); + detail.setFileName(fileName); + detail.setClassName(clazz.getQualifiedName()); + detail.setMethodName("configure"); int line = findLineNumber(fullyQualifiedFileName, result.getPosition()); if (line > -1) { - details.setLineNumber("" + line); + detail.setLineNumber("" + line); } - details.setSimple(result.getElement()); + detail.setSimple(result.getElement()); + + boolean predicate = result.getPredicate() != null ? result.getPredicate() : false; + boolean expression = !predicate; + detail.setPredicate(predicate); + detail.setExpression(expression); - simpleExpressions.add(details); + simpleExpressions.add(detail); } } } http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaParserHelper.java ---------------------------------------------------------------------- diff --git a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaParserHelper.java b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaParserHelper.java index 92452b6..a1f7b59 100644 --- a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaParserHelper.java +++ b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaParserHelper.java @@ -32,6 +32,8 @@ import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.ClassInstanceCrea import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.Expression; import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.ExpressionStatement; import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.FieldDeclaration; +import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.IAnnotationBinding; +import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.ITypeBinding; import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.InfixExpression; import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.MemberValuePair; import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.MethodDeclaration; @@ -429,8 +431,37 @@ public final class CamelJavaParserHelper { Object arg = args.get(0); String simple = getLiteralValue(clazz, block, (Expression) arg); if (!Strings.isBlank(simple)) { + // is this a simple expression that is called as a predicate or expression + boolean predicate = false; + Expression parent = mi.getExpression(); + if (parent == null) { + // maybe its an argument + // simple maybe be passed in as an argument + List list = mi.arguments(); + // must be a single argument + if (list != null && list.size() == 1) { + ASTNode o = (ASTNode) list.get(0); + ASTNode p = o.getParent(); + if (p instanceof MethodInvocation) { + // this is simple + String pName = ((MethodInvocation) p).getName().getIdentifier(); + if ("simple".equals(pName)) { + // okay find the parent of simple which is the method that uses simple + parent = (Expression) p.getParent(); + } + } + } + } + if (parent != null && parent instanceof MethodInvocation) { + MethodInvocation emi = (MethodInvocation) parent; + String parentName = emi.getName().getIdentifier(); + predicate = isSimplePredicate(parentName); + } + int position = ((Expression) arg).getStartPosition(); - expressions.add(new ParserResult(node, position, simple)); + ParserResult result = new ParserResult(node, position, simple); + result.setPredicate(predicate); + expressions.add(result); } } } @@ -447,6 +478,25 @@ public final class CamelJavaParserHelper { } } + /** + * Using simple expressions in the Java DSL may be used in certain places as predicate only + */ + private static boolean isSimplePredicate(String name) { + if (name == null) { + return false; + } + if (name.equals("completionPredicate") || name.equals("completion")) { + return true; + } + if (name.equals("onWhen") || name.equals("when") || name.equals("handled") || name.equals("continued")) { + return true; + } + if (name.equals("retryWhile") || name.equals("filter") || name.equals("validate") || name.equals("loopDoWhile")) { + return true; + } + return false; + } + @SuppressWarnings("unchecked") private static FieldSource<JavaClassSource> getField(JavaClassSource clazz, Block block, SimpleName ref) { String fieldName = ref.getIdentifier(); http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterSimpleRouteBuilderConfigureTest.java ---------------------------------------------------------------------- diff --git a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterSimpleRouteBuilderConfigureTest.java b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterSimpleRouteBuilderConfigureTest.java index 14d63af..a3f6f55 100644 --- a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterSimpleRouteBuilderConfigureTest.java +++ b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterSimpleRouteBuilderConfigureTest.java @@ -46,8 +46,10 @@ public class RoasterSimpleRouteBuilderConfigureTest { LOG.info(" Line: " + findLineNumber(simple.getPosition())); } Assert.assertEquals("${body} > 100", list.get(0).getElement()); + Assert.assertEquals(true, list.get(0).getPredicate()); Assert.assertEquals(27, findLineNumber(list.get(0).getPosition())); Assert.assertEquals("${body} > 200", list.get(1).getElement()); + Assert.assertEquals(true, list.get(1).getPredicate()); Assert.assertEquals(30, findLineNumber(list.get(1).getPosition())); } http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/ValidateMojo.java ---------------------------------------------------------------------- diff --git a/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/ValidateMojo.java b/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/ValidateMojo.java index 9d41a9d..3c8eca2 100644 --- a/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/ValidateMojo.java +++ b/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/ValidateMojo.java @@ -400,8 +400,15 @@ public class ValidateMojo extends AbstractExecMojo { int simpleErrors = 0; for (CamelSimpleExpressionDetails detail : simpleExpressions) { - getLog().debug("Validating simple expression: " + detail.getSimple()); - SimpleValidationResult result = catalog.validateSimpleExpression(detail.getSimple()); + SimpleValidationResult result; + boolean predicate = detail.isPredicate(); + if (predicate) { + getLog().debug("Validating simple predicate: " + detail.getSimple()); + result = catalog.validateSimplePredicate(detail.getSimple()); + } else { + getLog().debug("Validating simple expression: " + detail.getSimple()); + result = catalog.validateSimpleExpression(detail.getSimple()); + } if (!result.isSuccess()) { simpleErrors++; http://git-wip-us.apache.org/repos/asf/camel/blob/dce92c8d/tooling/spi-annotations/src/main/java/org/apache/camel/spi/Metadata.java ---------------------------------------------------------------------- diff --git a/tooling/spi-annotations/src/main/java/org/apache/camel/spi/Metadata.java b/tooling/spi-annotations/src/main/java/org/apache/camel/spi/Metadata.java index 241361e..03efe2a 100644 --- a/tooling/spi-annotations/src/main/java/org/apache/camel/spi/Metadata.java +++ b/tooling/spi-annotations/src/main/java/org/apache/camel/spi/Metadata.java @@ -33,6 +33,15 @@ import java.lang.annotation.Target; public @interface Metadata { /** + * The expression mode to use as either expression or predicate. + */ + enum ExpressionMode { + + expression, predicate; + + } + + /** * To define one or more labels. * <p/> * Multiple labels can be defined as a comma separated value. @@ -76,4 +85,12 @@ public @interface Metadata { */ boolean secret() default false; + /** + * Used by EIPs to mark whether an expression is used as expression or predicate. + * <p/> + * For example a message transformer uses the {@link ExpressionMode#expression} mode, + * while a content based router uses {@link ExpressionMode#predicate}. + */ + ExpressionMode expressionMode() default ExpressionMode.expression; + }