This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit ce995a75b31b30f5b81d153814b46c87fc1b5e92 Author: Guillaume Nodet <gno...@gmail.com> AuthorDate: Mon Feb 10 21:49:20 2020 +0100 Add hand-written property configurers for languages --- .../apache/camel/language/bean/BeanLanguage.java | 20 ++++++++++++- .../apache/camel/jsonpath/JsonPathExpression.java | 29 ++++++++++++++++++- .../camel/component/xquery/XQueryBuilder.java | 19 +++++++++++-- .../apache/camel/language/xpath/XPathBuilder.java | 31 +++++++++++++++++++- .../camel/reifier/language/ExpressionReifier.java | 13 ++++++++- .../support/ExpressionToPredicateAdapter.java | 16 ++++++++++- .../xtokenizer/XMLTokenExpressionIterator.java | 33 +++++++++++++++++++--- .../language/xtokenizer/XMLTokenizeLanguage.java | 2 +- 8 files changed, 151 insertions(+), 12 deletions(-) diff --git a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java index a230806..93192a4 100644 --- a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java +++ b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java @@ -16,10 +16,13 @@ */ package org.apache.camel.language.bean; +import org.apache.camel.CamelContext; import org.apache.camel.Expression; import org.apache.camel.Predicate; +import org.apache.camel.spi.GeneratedPropertyConfigurer; import org.apache.camel.support.ExpressionToPredicateAdapter; import org.apache.camel.support.LanguageSupport; +import org.apache.camel.support.component.PropertyConfigurerSupport; import org.apache.camel.util.StringHelper; /** @@ -36,7 +39,7 @@ import org.apache.camel.util.StringHelper; * its classname or the bean itself. */ @org.apache.camel.spi.annotations.Language("bean") -public class BeanLanguage extends LanguageSupport { +public class BeanLanguage extends LanguageSupport implements GeneratedPropertyConfigurer { private Object bean; private Class<?> beanType; @@ -46,6 +49,21 @@ public class BeanLanguage extends LanguageSupport { public BeanLanguage() { } + @Override + public boolean configure(CamelContext camelContext, Object target, String name, Object value, boolean ignoreCase) { + if (target != this) { + throw new IllegalStateException("Can only configure our own instance !"); + } + switch (ignoreCase ? name.toLowerCase() : name) { + case "bean": setBean(PropertyConfigurerSupport.property(camelContext, Object.class, value)); return true; + case "beantype": + case "beanType": setBeanType(PropertyConfigurerSupport.property(camelContext, Class.class, value)); return true; + case "ref": setRef(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + case "method": setMethod(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + default: return false; + } + } + public Object getBean() { return bean; } diff --git a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java index e6c85a1..49e6fa6 100644 --- a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java +++ b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java @@ -26,11 +26,16 @@ import org.apache.camel.Exchange; import org.apache.camel.ExpressionEvaluationException; import org.apache.camel.ExpressionIllegalSyntaxException; import org.apache.camel.jsonpath.easypredicate.EasyPredicateParser; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.spi.Metadata; +import org.apache.camel.spi.PropertyConfigurer; +import org.apache.camel.spi.PropertyConfigurerAware; import org.apache.camel.support.ExpressionAdapter; +import org.apache.camel.support.component.PropertyConfigurerSupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class JsonPathExpression extends ExpressionAdapter implements AfterPropertiesConfigured { +public class JsonPathExpression extends ExpressionAdapter implements AfterPropertiesConfigured, GeneratedPropertyConfigurer { private static final Logger LOG = LoggerFactory.getLogger(JsonPathExpression.class); @@ -50,6 +55,28 @@ public class JsonPathExpression extends ExpressionAdapter implements AfterProper this.expression = expression; } + @Override + public boolean configure(CamelContext camelContext, Object target, String name, Object value, boolean ignoreCase) { + if (target != this) { + throw new IllegalStateException("Can only configure our own instance !"); + } + switch (ignoreCase ? name.toLowerCase() : name) { + case "resulttype": + case "resultType": setResultType(PropertyConfigurerSupport.property(camelContext, Class.class, value)); return true; + case "suppressexceptions": + case "suppressExceptions": setSuppressExceptions(PropertyConfigurerSupport.property(camelContext, Boolean.class, value)); return true; + case "allowsimple": + case "allowSimple": setAllowSimple(PropertyConfigurerSupport.property(camelContext, Boolean.class, value)); return true; + case "alloweasypredicate": + case "allowEasyPredicate": setAllowEasyPredicate(PropertyConfigurerSupport.property(camelContext, Boolean.class, value)); return true; + case "writeasstring": + case "writeAsString": setWriteAsString(PropertyConfigurerSupport.property(camelContext, Boolean.class, value)); return true; + case "headername": + case "headerName": setHeaderName(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + default: return false; + } + } + public boolean isPredicate() { return predicate; } diff --git a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java index 19dc3fe..5e95d06 100644 --- a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java +++ b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java @@ -45,7 +45,6 @@ import org.w3c.dom.Node; import net.sf.saxon.Configuration; import net.sf.saxon.lib.ModuleURIResolver; import net.sf.saxon.om.AllElementsSpaceStrippingRule; -import net.sf.saxon.om.DocumentInfo; import net.sf.saxon.om.IgnorableSpaceStrippingRule; import net.sf.saxon.om.Item; import net.sf.saxon.om.SequenceIterator; @@ -62,6 +61,7 @@ import net.sf.saxon.value.Int64Value; import net.sf.saxon.value.IntegerValue; import net.sf.saxon.value.ObjectValue; import net.sf.saxon.value.StringValue; +import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.Expression; import org.apache.camel.Message; @@ -69,8 +69,10 @@ import org.apache.camel.NoTypeConversionAvailableException; import org.apache.camel.Predicate; import org.apache.camel.Processor; import org.apache.camel.RuntimeExpressionException; +import org.apache.camel.spi.GeneratedPropertyConfigurer; import org.apache.camel.spi.NamespaceAware; import org.apache.camel.support.MessageHelper; +import org.apache.camel.support.component.PropertyConfigurerSupport; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.xml.BytesSource; @@ -83,7 +85,7 @@ import org.slf4j.LoggerFactory; * <p/> * The XQueryExpression, as you would expect, can be executed repeatedly, as often as you want, in the same or in different threads. */ -public abstract class XQueryBuilder implements Expression, Predicate, NamespaceAware, Processor { +public abstract class XQueryBuilder implements Expression, Predicate, NamespaceAware, Processor, GeneratedPropertyConfigurer { private static final Logger LOG = LoggerFactory.getLogger(XQueryBuilder.class); private Configuration configuration; private Map<String, Object> configurationProperties = new HashMap<>(); @@ -101,6 +103,19 @@ public abstract class XQueryBuilder implements Expression, Predicate, NamespaceA private String headerName; @Override + public boolean configure(CamelContext camelContext, Object target, String name, Object value, boolean ignoreCase) { + if (target != this) { + throw new IllegalStateException("Can only configure our own instance !"); + } + switch (ignoreCase ? name.toLowerCase() : name) { + case "resulttype": + case "resultType": setResultType(PropertyConfigurerSupport.property(camelContext, Class.class, value)); return true; + case "headername": + case "headerName": setHeaderName(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + default: return false; + } + } + @Override public String toString() { return "XQuery[" + expression + "]"; } diff --git a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathBuilder.java b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathBuilder.java index 080bfaa..2d21048 100644 --- a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathBuilder.java +++ b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathBuilder.java @@ -57,6 +57,7 @@ import org.apache.camel.RuntimeCamelException; import org.apache.camel.RuntimeExpressionException; import org.apache.camel.WrappedFile; import org.apache.camel.spi.ExpressionResultTypeAware; +import org.apache.camel.spi.GeneratedPropertyConfigurer; import org.apache.camel.spi.Language; import org.apache.camel.spi.NamespaceAware; import org.apache.camel.support.DefaultExchange; @@ -64,6 +65,7 @@ import org.apache.camel.support.ExchangeHelper; import org.apache.camel.support.MessageHelper; import org.apache.camel.support.builder.Namespaces; import org.apache.camel.support.builder.xml.XMLConverterHelper; +import org.apache.camel.support.component.PropertyConfigurerSupport; import org.apache.camel.support.service.ServiceSupport; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; @@ -96,7 +98,8 @@ import static org.apache.camel.support.builder.Namespaces.isMatchingNamespaceOrE * * @see XPathConstants#NODESET */ -public class XPathBuilder extends ServiceSupport implements CamelContextAware, Expression, Predicate, NamespaceAware, ExpressionResultTypeAware { +public class XPathBuilder extends ServiceSupport implements CamelContextAware, Expression, Predicate, + NamespaceAware, ExpressionResultTypeAware, GeneratedPropertyConfigurer { private static final Logger LOG = LoggerFactory.getLogger(XPathBuilder.class); private static final String SAXON_OBJECT_MODEL_URI = "http://saxon.sf.net/jaxp/xpath/om"; private static final String SAXON_FACTORY_CLASS_NAME = "net.sf.saxon.xpath.XPathFactoryImpl"; @@ -168,6 +171,32 @@ public class XPathBuilder extends ServiceSupport implements CamelContextAware, E } @Override + public boolean configure(CamelContext camelContext, Object target, String name, Object value, boolean ignoreCase) { + if (target != this) { + throw new IllegalStateException("Can only configure our own instance !"); + } + switch (ignoreCase ? name.toLowerCase() : name) { + case "documenttype": + case "documentType": setDocumentType(PropertyConfigurerSupport.property(camelContext, Class.class, value)); return true; + case "resulttype": + case "resultType": setResultType(PropertyConfigurerSupport.property(camelContext, Class.class, value)); return true; + case "usesaxon": + case "useSaxon": setUseSaxon(PropertyConfigurerSupport.property(camelContext, Boolean.class, value)); return true; + case "xpathfactory": + case "xPathFactory": setXPathFactory(PropertyConfigurerSupport.property(camelContext, XPathFactory.class, value)); return true; + case "objectmodeluri": + case "objectModelUri": setObjectModelUri(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + case "threadsafety": + case "threadSafety": setThreadSafety(PropertyConfigurerSupport.property(camelContext, Boolean.class, value)); return true; + case "lognamespaces": + case "logNamespaces": setLogNamespaces(PropertyConfigurerSupport.property(camelContext, Boolean.class, value)); return true; + case "headername": + case "headerName": setHeaderName(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + default: return false; + } + } + + @Override public String toString() { return "XPath: " + text; } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java index 3c905a2..3b63184 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java @@ -47,6 +47,8 @@ import org.apache.camel.model.language.XPathExpression; import org.apache.camel.model.language.XQueryExpression; import org.apache.camel.reifier.AbstractReifier; import org.apache.camel.spi.Language; +import org.apache.camel.spi.PropertyConfigurer; +import org.apache.camel.spi.PropertyConfigurerAware; import org.apache.camel.support.CamelContextHelper; import org.apache.camel.support.ExpressionToPredicateAdapter; import org.apache.camel.support.PropertyBindingSupport; @@ -186,7 +188,16 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR protected void setProperties(Object target, Map<String, Object> properties) { properties.entrySet().removeIf(e -> e.getValue() == null); - PropertyBindingSupport.build().bind(camelContext, target, properties); + + PropertyConfigurer configurer = null; + if (target instanceof PropertyConfigurerAware) { + configurer = ((PropertyConfigurerAware) target).getPropertyConfigurer(target); + } else if (target instanceof PropertyConfigurer) { + configurer = (PropertyConfigurer) target; + } + PropertyBindingSupport.build() + .withConfigurer(configurer) + .bind(camelContext, target, properties); } protected Object or(Object a, Object b) { diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ExpressionToPredicateAdapter.java b/core/camel-support/src/main/java/org/apache/camel/support/ExpressionToPredicateAdapter.java index 027a971..7ef3bca 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/ExpressionToPredicateAdapter.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/ExpressionToPredicateAdapter.java @@ -21,12 +21,15 @@ import org.apache.camel.CamelContextAware; import org.apache.camel.Exchange; import org.apache.camel.Expression; import org.apache.camel.Predicate; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.spi.PropertyConfigurer; +import org.apache.camel.spi.PropertyConfigurerAware; import org.apache.camel.util.ObjectHelper; /** * To adapt {@link org.apache.camel.Expression} as a {@link Predicate} */ -public final class ExpressionToPredicateAdapter implements Predicate, CamelContextAware { +public final class ExpressionToPredicateAdapter implements Predicate, CamelContextAware, PropertyConfigurerAware { private final Expression expression; public ExpressionToPredicateAdapter(Expression expression) { @@ -70,4 +73,15 @@ public final class ExpressionToPredicateAdapter implements Predicate, CamelConte return null; } } + + @Override + public PropertyConfigurer getPropertyConfigurer(Object instance) { + if (expression instanceof PropertyConfigurer) { + return (PropertyConfigurer) expression; + } else if (expression instanceof PropertyConfigurerAware) { + return ((PropertyConfigurerAware) expression).getPropertyConfigurer(expression); + } else { + return null; + } + } } \ No newline at end of file diff --git a/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java b/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java index a33b89c..36c830b 100644 --- a/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java +++ b/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java @@ -39,12 +39,15 @@ import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; +import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.InvalidPayloadException; import org.apache.camel.converter.jaxp.StaxConverter; +import org.apache.camel.spi.GeneratedPropertyConfigurer; import org.apache.camel.spi.NamespaceAware; import org.apache.camel.support.ExchangeHelper; import org.apache.camel.support.ExpressionAdapter; +import org.apache.camel.support.component.PropertyConfigurerSupport; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.StringHelper; @@ -54,18 +57,18 @@ import org.slf4j.LoggerFactory; /** * An {@link org.apache.camel.language.xtokenizer.XMLTokenizeLanguage} based iterator. */ -public class XMLTokenExpressionIterator extends ExpressionAdapter implements NamespaceAware { - protected final String headerName; +public class XMLTokenExpressionIterator extends ExpressionAdapter implements NamespaceAware, GeneratedPropertyConfigurer { protected final String path; protected char mode; protected int group; + protected String headerName; protected Map<String, String> nsmap; public XMLTokenExpressionIterator(String path, char mode) { - this(null, path, mode, 1); + this(path, mode, 1, null); } - public XMLTokenExpressionIterator(String headerName, String path, char mode, int group) { + public XMLTokenExpressionIterator(String path, char mode, int group, String headerName) { StringHelper.notEmpty(path, "path"); this.headerName = headerName; this.path = path; @@ -74,6 +77,20 @@ public class XMLTokenExpressionIterator extends ExpressionAdapter implements Nam } @Override + public boolean configure(CamelContext camelContext, Object target, String name, Object value, boolean ignoreCase) { + if (target != this) { + throw new IllegalStateException("Can only configure our own instance !"); + } + switch (ignoreCase ? name.toLowerCase() : name) { + case "headername": + case "headerName": setHeaderName(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + case "mode": setMode(PropertyConfigurerSupport.property(camelContext, String.class, value)); return true; + case "group": setGroup(PropertyConfigurerSupport.property(camelContext, Integer.class, value)); return true; + default: return false; + } + } + + @Override public void setNamespaces(Map<String, String> nsmap) { this.nsmap = nsmap; } @@ -99,6 +116,14 @@ public class XMLTokenExpressionIterator extends ExpressionAdapter implements Nam this.group = group; } + public String getHeaderName() { + return headerName; + } + + public void setHeaderName(String headerName) { + this.headerName = headerName; + } + protected Iterator<?> createIterator(InputStream in, String charset) throws XMLStreamException, UnsupportedEncodingException { return createIterator(new InputStreamReader(in, charset)); } diff --git a/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java b/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java index b57c952..e873eb2 100644 --- a/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java +++ b/core/camel-xml-jaxp/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java @@ -80,7 +80,7 @@ public class XMLTokenizeLanguage extends LanguageSupport { public Expression createExpression(String expression) { String path = expression != null ? expression : this.path; ObjectHelper.notNull(path, "path"); - XMLTokenExpressionIterator expr = new XMLTokenExpressionIterator(headerName, path, mode, group); + XMLTokenExpressionIterator expr = new XMLTokenExpressionIterator(path, mode, group, headerName); if (namespaces != null) { expr.setNamespaces(namespaces.getNamespaces()); }