You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2019/04/17 09:41:40 UTC
[camel] 23/38: Move mock component out of camel-core. Work in
progress.
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 28bb7dc7acc46dde39297930134ce496ce0115d4
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Apr 16 15:20:25 2019 +0200
Move mock component out of camel-core. Work in progress.
---
.../camel/component/mock/AssertionClause.java | 13 +-
.../camel/component/mock/MockValueBuilder.java | 378 +++++++++++++++++++++
2 files changed, 383 insertions(+), 8 deletions(-)
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 53e5d40..beb0d18 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
@@ -25,16 +25,13 @@ import org.apache.camel.Expression;
import org.apache.camel.Predicate;
import org.apache.camel.StreamCache;
import org.apache.camel.builder.ExpressionClause;
-import org.apache.camel.builder.ValueBuilder;
import org.apache.camel.support.PredicateAssertHelper;
import org.apache.camel.support.language.ExpressionModel;
/**
* A builder of assertions on message exchanges
*/
-public abstract class AssertionClause extends MockExpressionClauseSupport<ValueBuilder> implements Runnable {
-
- // TODO: MockValueBuilder
+public abstract class AssertionClause extends MockExpressionClauseSupport<MockValueBuilder> implements Runnable {
protected final MockEndpoint mock;
protected volatile int currentIndex;
@@ -50,13 +47,13 @@ public abstract class AssertionClause extends MockExpressionClauseSupport<ValueB
// Builder methods
// -------------------------------------------------------------------------
- public ValueBuilder expression(Expression expression) {
+ public MockValueBuilder expression(Expression expression) {
// must override this method as we provide null in the constructor
super.expression(expression);
return new PredicateValueBuilder(expression);
}
- public ValueBuilder language(ExpressionModel expression) {
+ public MockValueBuilder language(ExpressionModel expression) {
// must override this method as we provide null in the constructor
super.expression(expression.createExpression(mock.getCamelContext()));
return new PredicateValueBuilder(getExpressionValue());
@@ -144,7 +141,7 @@ public abstract class AssertionClause extends MockExpressionClauseSupport<ValueB
/**
* Public class needed for fluent builders
*/
- public final class PredicateValueBuilder extends ValueBuilder {
+ public final class PredicateValueBuilder extends MockValueBuilder {
public PredicateValueBuilder(Expression expression) {
super(expression);
@@ -158,7 +155,7 @@ public abstract class AssertionClause extends MockExpressionClauseSupport<ValueB
}
@Override
- protected ValueBuilder onNewValueBuilder(Expression exp) {
+ protected MockValueBuilder onNewValueBuilder(Expression exp) {
return new PredicateValueBuilder(exp);
}
}
diff --git a/core/camel-core/src/main/java/org/apache/camel/component/mock/MockValueBuilder.java b/core/camel-core/src/main/java/org/apache/camel/component/mock/MockValueBuilder.java
new file mode 100644
index 0000000..188bbc6
--- /dev/null
+++ b/core/camel-core/src/main/java/org/apache/camel/component/mock/MockValueBuilder.java
@@ -0,0 +1,378 @@
+/*
+ * 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.component.mock;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+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.builder.ExpressionBuilder;
+import org.apache.camel.builder.ExpressionClause;
+import org.apache.camel.builder.PredicateBuilder;
+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.
+ */
+public class MockValueBuilder implements Expression, Predicate {
+ private Expression expression;
+ private boolean not;
+
+ public MockValueBuilder(Expression expression) {
+ this.expression = expression;
+ }
+
+ @Override
+ public <T> T evaluate(Exchange exchange, Class<T> type) {
+ return expression.evaluate(exchange, type);
+ }
+
+ @Override
+ public boolean matches(Exchange exchange) {
+ return PredicateBuilder.toPredicate(getExpression()).matches(exchange);
+ }
+
+ public Expression getExpression() {
+ return expression;
+ }
+
+ @Override
+ public String toString() {
+ return expression.toString();
+ }
+
+ // Predicate builders
+ // -------------------------------------------------------------------------
+
+ public Predicate matches(Expression expression) {
+ return onNewPredicate(ExpressionToPredicateAdapter.toPredicate(expression));
+ }
+
+ public ExpressionClause<Predicate> matches() {
+ // chicken-and-egg situation as we need to return an ExpressionClause
+ // which needs a right-hand side that is being built via the fluent
+ // builder that is returned, and therefore we need to use a ref
+ // to the expression (right hand side) that will be used below
+ // in the onNewPredicate where the actual matching is executed
+ final AtomicReference<Expression> ref = new AtomicReference<>();
+
+ final ExpressionClause<Predicate> answer = new ExpressionClause<>(
+ onNewPredicate(new Predicate() {
+ @Override
+ public boolean matches(Exchange exchange) {
+ Expression left = expression;
+ Expression right = ref.get();
+ return PredicateBuilder.isEqualTo(left, right).matches(exchange);
+ }
+
+ @Override
+ public String toString() {
+ return expression + " == " + ref.get();
+ }
+ }));
+
+ final Expression right = new ExpressionAdapter() {
+ @Override
+ public Object evaluate(Exchange exchange) {
+ 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
+ ref.set(right);
+
+ return answer;
+ }
+
+ public Predicate isNotEqualTo(Object value) {
+ Expression right = asExpression(value);
+ return onNewPredicate(PredicateBuilder.isNotEqualTo(expression, right));
+ }
+
+ public Predicate isEqualTo(Object value) {
+ Expression right = asExpression(value);
+ return onNewPredicate(PredicateBuilder.isEqualTo(expression, right));
+ }
+
+ public Predicate isEqualToIgnoreCase(Object value) {
+ Expression right = asExpression(value);
+ return onNewPredicate(PredicateBuilder.isEqualToIgnoreCase(expression, right));
+ }
+
+ public Predicate isLessThan(Object value) {
+ Expression right = asExpression(value);
+ return onNewPredicate(PredicateBuilder.isLessThan(expression, right));
+ }
+
+ public Predicate isLessThanOrEqualTo(Object value) {
+ Expression right = asExpression(value);
+ return onNewPredicate(PredicateBuilder.isLessThanOrEqualTo(expression, right));
+ }
+
+ public Predicate isGreaterThan(Object value) {
+ Expression right = asExpression(value);
+ return onNewPredicate(PredicateBuilder.isGreaterThan(expression, right));
+ }
+
+ public Predicate isGreaterThanOrEqualTo(Object value) {
+ Expression right = asExpression(value);
+ return onNewPredicate(PredicateBuilder.isGreaterThanOrEqualTo(expression, right));
+ }
+
+ public Predicate isInstanceOf(Class<?> type) {
+ return onNewPredicate(PredicateBuilder.isInstanceOf(expression, type));
+ }
+
+ public Predicate isNull() {
+ return onNewPredicate(PredicateBuilder.isNull(expression));
+ }
+
+ public Predicate isNotNull() {
+ return onNewPredicate(PredicateBuilder.isNotNull(expression));
+ }
+
+ public Predicate not(Predicate predicate) {
+ return onNewPredicate(PredicateBuilder.not(predicate));
+ }
+
+ public Predicate in(Object... values) {
+ List<Predicate> predicates = new ArrayList<>();
+ for (Object value : values) {
+ Expression right = asExpression(value);
+ right = ExpressionBuilder.convertToExpression(right, expression);
+ Predicate predicate = onNewPredicate(PredicateBuilder.isEqualTo(expression, right));
+ predicates.add(predicate);
+ }
+ return in(predicates.toArray(new Predicate[predicates.size()]));
+ }
+
+ public Predicate in(Predicate... predicates) {
+ return onNewPredicate(PredicateBuilder.in(predicates));
+ }
+
+ public Predicate startsWith(Object value) {
+ Expression right = asExpression(value);
+ return onNewPredicate(PredicateBuilder.startsWith(expression, right));
+ }
+
+ public Predicate endsWith(Object value) {
+ Expression right = asExpression(value);
+ return onNewPredicate(PredicateBuilder.endsWith(expression, right));
+ }
+
+ /**
+ * Create a predicate that the left hand expression contains the value of
+ * the right hand expression
+ *
+ * @param value the element which is compared to be contained within this
+ * expression
+ * @return a predicate which evaluates to true if the given value expression
+ * is contained within this expression value
+ */
+ public Predicate contains(Object value) {
+ Expression right = asExpression(value);
+ return onNewPredicate(PredicateBuilder.contains(expression, right));
+ }
+
+ /**
+ * Creates a predicate which is true if this expression matches the given
+ * regular expression
+ *
+ * @param regex the regular expression to match
+ * @return a predicate which evaluates to true if the expression matches the
+ * regex
+ */
+ public Predicate regex(String regex) {
+ return onNewPredicate(PredicateBuilder.regex(expression, regex));
+ }
+
+ // Expression builders
+ // -------------------------------------------------------------------------
+
+ public MockValueBuilder tokenize() {
+ return tokenize("\n");
+ }
+
+ public MockValueBuilder tokenize(String token) {
+ Expression newExp = ExpressionBuilder.tokenizeExpression(expression, token);
+ return onNewValueBuilder(newExp);
+ }
+
+ public MockValueBuilder tokenize(String token, int group, boolean skipFirst) {
+ return tokenize(token, "" + group, skipFirst);
+ }
+
+ public MockValueBuilder tokenize(String token, String group, boolean skipFirst) {
+ Expression newExp = ExpressionBuilder.tokenizeExpression(expression, token);
+ if (group == null && skipFirst) {
+ // wrap in skip first (if group then it has its own skip first logic)
+ newExp = ExpressionBuilder.skipFirstExpression(newExp);
+ }
+ newExp = ExpressionBuilder.groupIteratorExpression(newExp, token, group, skipFirst);
+ return onNewValueBuilder(newExp);
+ }
+
+ public MockValueBuilder tokenizeXML(String tagName, String inheritNamespaceTagName) {
+ Expression newExp = ExpressionBuilder.tokenizeXMLExpression(tagName, inheritNamespaceTagName);
+ return onNewValueBuilder(newExp);
+ }
+
+ public MockValueBuilder xtokenize(String path, Namespaces namespaces) {
+ return xtokenize(path, 'i', namespaces);
+ }
+
+ public MockValueBuilder xtokenize(String path, char mode, Namespaces namespaces) {
+ Expression newExp = ExpressionBuilder.tokenizeXMLAwareExpression(path, mode);
+ ((NamespaceAware)newExp).setNamespaces(namespaces.getNamespaces());
+ return onNewValueBuilder(newExp);
+ }
+
+ public MockValueBuilder tokenizePair(String startToken, String endToken, boolean includeTokens) {
+ Expression newExp = ExpressionBuilder.tokenizePairExpression(startToken, endToken, includeTokens);
+ return onNewValueBuilder(newExp);
+ }
+
+ /**
+ * Tokenizes the string conversion of this expression using the given
+ * regular expression
+ */
+ public MockValueBuilder regexTokenize(String regex) {
+ Expression newExp = ExpressionBuilder.regexTokenizeExpression(expression, regex);
+ return onNewValueBuilder(newExp);
+ }
+
+ /**
+ * Replaces all occurrences of the regular expression with the given
+ * replacement
+ */
+ public MockValueBuilder regexReplaceAll(String regex, String replacement) {
+ Expression newExp = ExpressionBuilder.regexReplaceAll(expression, regex, replacement);
+ return onNewValueBuilder(newExp);
+ }
+
+ /**
+ * Replaces all occurrences of the regular expression with the given
+ * replacement
+ */
+ public MockValueBuilder regexReplaceAll(String regex, Expression replacement) {
+ Expression newExp = ExpressionBuilder.regexReplaceAll(expression, regex, replacement);
+ return onNewValueBuilder(newExp);
+ }
+
+ /**
+ * Converts the current value to the given type using the registered type
+ * converters
+ *
+ * @param type the type to convert the value to
+ * @return the current builder
+ */
+ public MockValueBuilder convertTo(Class<?> type) {
+ Expression newExp = ExpressionBuilder.convertToExpression(expression, type);
+ return onNewValueBuilder(newExp);
+ }
+
+ /**
+ * Converts the current value to a String using the registered type converters
+ *
+ * @return the current builder
+ */
+ public MockValueBuilder convertToString() {
+ return convertTo(String.class);
+ }
+
+ /**
+ * Appends the string evaluation of this expression with the given value
+ *
+ * @param value the value or expression to append
+ * @return the current builder
+ */
+ public MockValueBuilder append(Object value) {
+ Expression newExp = ExpressionBuilder.append(expression, asExpression(value));
+ return onNewValueBuilder(newExp);
+ }
+
+ /**
+ * Prepends the string evaluation of this expression with the given value
+ *
+ * @param value the value or expression to prepend
+ * @return the current builder
+ */
+ public MockValueBuilder prepend(Object value) {
+ Expression newExp = ExpressionBuilder.prepend(expression, asExpression(value));
+ return onNewValueBuilder(newExp);
+ }
+
+ /**
+ * Sorts the current value using the given comparator. The current value must be convertable
+ * to a {@link List} to allow sorting using the comparator.
+ *
+ * @param comparator the comparator used by sorting
+ * @return the current builder
+ */
+ public MockValueBuilder sort(Comparator<?> comparator) {
+ Expression newExp = ExpressionBuilder.sortExpression(expression, comparator);
+ return onNewValueBuilder(newExp);
+ }
+
+ /**
+ * Negates the built expression.
+ *
+ * @return the current builder
+ */
+ public MockValueBuilder not() {
+ not = true;
+ return this;
+ }
+
+ // Implementation methods
+ // -------------------------------------------------------------------------
+
+ /**
+ * A strategy method to allow derived classes to deal with the newly created
+ * predicate in different ways
+ */
+ protected Predicate onNewPredicate(Predicate predicate) {
+ if (not) {
+ return PredicateBuilder.not(predicate);
+ } else {
+ return predicate;
+ }
+ }
+
+ protected Expression asExpression(Object value) {
+ if (value instanceof Expression) {
+ return (Expression)value;
+ } else {
+ return ExpressionBuilder.constantExpression(value);
+ }
+ }
+
+ protected MockValueBuilder onNewValueBuilder(Expression exp) {
+ return new MockValueBuilder(exp);
+ }
+}