Package org.apache.camel.language.xpath
Class XPathBuilder
java.lang.Object
org.apache.camel.support.service.BaseService
org.apache.camel.support.service.ServiceSupport
org.apache.camel.language.xpath.XPathBuilder
- All Implemented Interfaces:
AutoCloseable
,org.apache.camel.CamelContextAware
,org.apache.camel.Expression
,org.apache.camel.Predicate
,org.apache.camel.Service
,org.apache.camel.ShutdownableService
,org.apache.camel.spi.ExpressionResultTypeAware
,org.apache.camel.spi.HasCamelContext
,org.apache.camel.spi.NamespaceAware
,org.apache.camel.StatefulService
,org.apache.camel.SuspendableService
public class XPathBuilder
extends org.apache.camel.support.service.ServiceSupport
implements org.apache.camel.CamelContextAware, org.apache.camel.Expression, org.apache.camel.Predicate, org.apache.camel.spi.NamespaceAware, org.apache.camel.spi.ExpressionResultTypeAware
Creates an XPath expression builder which creates a nodeset result by default. If you want to evaluate a String
expression then call
stringResult()
An XPath object is not thread-safe and not reentrant. In other words, it is the application's responsibility to make
sure that one XPath object is not used from more than one thread at any given time, and while the evaluate method is
invoked, applications may not recursively call the evaluate method.
This implementation is thread safe by using thread locals and pooling to allow concurrency.
Important: After configuring the XPathBuilder
its advised to invoke BaseService.start()
to prepare the
builder before using; though the builder will auto-start on first use.- See Also:
-
Field Summary
Fields inherited from class org.apache.camel.support.service.BaseService
BUILT, FAILED, INITIALIZED, INITIALIZING, lock, NEW, SHUTDOWN, SHUTTING_DOWN, STARTED, STARTING, status, STOPPED, STOPPING, SUSPENDED, SUSPENDING
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionSets the expression result type toXPathConstants.BOOLEAN
protected XPathFunctionResolver
protected static XPathFactory
protected DefaultNamespaceContext
createNamespaceContext
(XPathFactory factory) protected XPathExpression
protected XPathExpression
Creates a new xpath expression as there we no available in the pool.protected XPathFactory
documentType
(Class<?> documentType) Configures the document type to use.protected Object
doGetDocument
(org.apache.camel.Exchange exchange, Object body) protected Object
doInEvaluateAs
(XPathExpression xpathExpression, org.apache.camel.Exchange exchange, QName resultQName) void
doStart()
void
doStop()
void
Enables Saxon on this particular XPath expression, assaxon()
sets the default static XPathFactory which may have already been initialised by previous XPath expressionsEvaluates the given xpath using the provided body as a String return type.<T> T
Evaluates the given xpath using the provided body.evaluate
(org.apache.camel.Exchange exchange) <T> T
protected Object
evaluateAs
(org.apache.camel.Exchange exchange, QName resultQName) Evaluates the expression as the given result typefactory
(XPathFactory xpathFactory) Configures to use the provided XPath factory.factoryClassName
(String factoryClassName) Sets the factory class name to usefunctionResolver
(XPathFunctionResolver functionResolver) Sets theXPathFunctionResolver
instance to use on these XPath expressionsGets theXPathFunction
for getting the input message body.org.apache.camel.CamelContext
protected Object
getDocument
(org.apache.camel.Exchange exchange, Object body) Strategy method to extract the document from the exchange.Class<?>
Gets theXPathFunction
for getting the input message header.Gets the namespace context, can be null if no custom context has been assigned.Gets theXPathFunction
for getting the output message body.Gets theXPathFunction
for getting the output message header.Gets theXPathFunction
for getting the exchange properties.Class<?>
Gets theXPathFunction
for executing simple language as xpath function.getText()
Gets the xpath factory, can be null if no custom factory has been assigned.void
init
(org.apache.camel.CamelContext context) protected boolean
isInputStreamNeeded
(org.apache.camel.Exchange exchange) Checks whether we need anInputStream
to access the message body.protected boolean
isInputStreamNeeded
(org.apache.camel.Exchange exchange, String headerName) Checks whether we need anInputStream
to access the message header.protected boolean
isInputStreamNeededForObject
(org.apache.camel.Exchange exchange, Object obj) Checks whether we need anInputStream
to access this objectprotected boolean
isInputStreamNeededForProperty
(org.apache.camel.Exchange exchange, String propertyName) Checks whether we need anInputStream
to access the exchange property.boolean
boolean
boolean
boolean
Activates trace logging of all discovered namespaces in the message - to simplify debugging namespace-related issuesboolean
Matches the given xpath using the provided body.boolean
matches
(org.apache.camel.Exchange exchange) Registers the namespace prefix and URI with the builder so that the prefix can be used in XPath expressionsnamespaces
(org.apache.camel.support.builder.Namespaces namespaces) Registers namespaces with the builder so that the registered prefixes can be used in XPath expressionsSets the expression result type toXPathConstants.NODE
Sets the expression result type toXPathConstants.NODESET
Sets the expression result type toXPathConstants.NUMBER
objectModel
(String uri) Sets the object model URI to useprotected void
Populate a number of standard prefixes if they are not already therepreCompile
(boolean preCompile) Whether to enable pre-compiling the xpath expression during initialization phase.resultType
(Class<?> resultType) Sets the expression result type to the givenresultType
saxon()
Configures to use Saxon as the XPathFactory which allows you to use XPath 2.0 functions which may not be part of the build in JDK XPath parser.void
setBodyFunction
(XPathFunction bodyFunction) void
setCamelContext
(org.apache.camel.CamelContext camelContext) void
setDocumentType
(Class<?> documentType) void
setFactoryClassName
(String factoryClassName) void
setFunctionResolver
(XPathFunctionResolver functionResolver) void
setHeaderFunction
(XPathFunction headerFunction) void
setHeaderName
(String headerName) void
setLogNamespaces
(boolean logNamespaces) void
setNamespaceContext
(DefaultNamespaceContext namespaceContext) protected void
setNamespaceIfNotPresent
(DefaultNamespaceContext context, String prefix, String uri) void
setNamespaces
(Map<String, String> namespaces) void
setObjectModelUri
(String objectModelUri) void
setOutBodyFunction
(XPathFunction outBodyFunction) void
setOutHeaderFunction
(XPathFunction outHeaderFunction) void
setPreCompile
(boolean preCompile) void
setPropertiesFunction
(XPathFunction propertiesFunction) void
setPropertyName
(String propertyName) void
setResultQName
(QName resultQName) void
setResultType
(Class<?> resultType) void
setSimpleFunction
(XPathFunction simpleFunction) void
setThreadSafety
(boolean threadSafety) void
setUseSaxon
(boolean useSaxon) Whether to enable Saxon on this particular XPath expression.void
setXPathFactory
(XPathFactory xpathFactory) Sets the expression result type toXPathConstants.STRING
threadSafety
(boolean threadSafety) Whether to enable thread-safety for the returned result of the xpath expression.toString()
Registers a variable (in the global namespace) which can be referred to from XPath expressionsstatic XPathBuilder
static XPathBuilder
Methods inherited from class org.apache.camel.support.service.BaseService
build, doBuild, doFail, doInit, doLifecycleChange, doResume, doShutdown, doSuspend, fail, getStatus, init, isBuild, isInit, isNew, isRunAllowed, isShutdown, isStarted, isStarting, isStartingOrStarted, isStopped, isStopping, isStoppingOrStopped, isSuspended, isSuspending, isSuspendingOrSuspended, resume, shutdown, start, stop, suspend
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Methods inherited from interface org.apache.camel.Predicate
initPredicate
Methods inherited from interface org.apache.camel.Service
build, close, init, start, stop
Methods inherited from interface org.apache.camel.ShutdownableService
shutdown
Methods inherited from interface org.apache.camel.StatefulService
getStatus, isRunAllowed, isStarted, isStarting, isStopped, isStopping, isSuspending
Methods inherited from interface org.apache.camel.SuspendableService
isSuspended, resume, suspend
-
Constructor Details
-
XPathBuilder
- Parameters:
text
- The XPath expression
-
-
Method Details
-
xpath
- Parameters:
text
- The XPath expression- Returns:
- A new XPathBuilder object
-
xpath
- Parameters:
text
- The XPath expressionresultType
- The result type that the XPath expression will return.- Returns:
- A new XPathBuilder object
-
init
public void init(org.apache.camel.CamelContext context) - Specified by:
init
in interfaceorg.apache.camel.Expression
- Specified by:
init
in interfaceorg.apache.camel.Predicate
-
toString
-
getCamelContext
public org.apache.camel.CamelContext getCamelContext()- Specified by:
getCamelContext
in interfaceorg.apache.camel.spi.HasCamelContext
-
setCamelContext
public void setCamelContext(org.apache.camel.CamelContext camelContext) - Specified by:
setCamelContext
in interfaceorg.apache.camel.CamelContextAware
-
matches
public boolean matches(org.apache.camel.Exchange exchange) - Specified by:
matches
in interfaceorg.apache.camel.Predicate
-
evaluate
- Specified by:
evaluate
in interfaceorg.apache.camel.Expression
-
matches
Matches the given xpath using the provided body.- Parameters:
context
- the camel contextbody
- the body- Returns:
- true if matches, false otherwise
-
evaluate
Evaluates the given xpath using the provided body. The evaluation uses by defaultXPathConstants.NODESET
as the type used during xpath evaluation. The output from xpath is then afterwards type converted using Camel's type converter to the given type. If you want to evaluate xpath using a different type, then callsetResultType(Class)
prior to calling this evaluate method.- Parameters:
context
- the camel contextbody
- the bodytype
- the type to return- Returns:
- result of the evaluation
-
evaluate
Evaluates the given xpath using the provided body as a String return type.- Parameters:
context
- the camel contextbody
- the body- Returns:
- result of the evaluation
-
booleanResult
Sets the expression result type toXPathConstants.BOOLEAN
- Returns:
- the current builder
-
nodeResult
Sets the expression result type toXPathConstants.NODE
- Returns:
- the current builder
-
nodeSetResult
Sets the expression result type toXPathConstants.NODESET
- Returns:
- the current builder
-
numberResult
Sets the expression result type toXPathConstants.NUMBER
- Returns:
- the current builder
-
stringResult
Sets the expression result type toXPathConstants.STRING
- Returns:
- the current builder
-
resultType
Sets the expression result type to the givenresultType
- Returns:
- the current builder
-
objectModel
Sets the object model URI to use- Returns:
- the current builder
-
factoryClassName
Sets the factory class name to use- Returns:
- the current builder
-
saxon
Configures to use Saxon as the XPathFactory which allows you to use XPath 2.0 functions which may not be part of the build in JDK XPath parser.- Returns:
- the current builder
-
functionResolver
Sets theXPathFunctionResolver
instance to use on these XPath expressions- Returns:
- the current builder
-
namespace
Registers the namespace prefix and URI with the builder so that the prefix can be used in XPath expressions- Parameters:
prefix
- is the namespace prefix that can be used in the XPath expressionsuri
- is the namespace URI to which the prefix refers- Returns:
- the current builder
-
namespaces
Registers namespaces with the builder so that the registered prefixes can be used in XPath expressions- Parameters:
namespaces
- is namespaces object that should be used in the XPath expression- Returns:
- the current builder
-
variable
Registers a variable (in the global namespace) which can be referred to from XPath expressions- Parameters:
name
- name of variablevalue
- value of variable- Returns:
- the current builder
-
documentType
Configures the document type to use. The document type controls which kind of Class Camel should convert the payload to before doing the xpath evaluation. For example you can set it toInputSource
to use SAX streams. By default Camel usesDocument
as the type.- Parameters:
documentType
- the document type- Returns:
- the current builder
-
factory
Configures to use the provided XPath factory. Can be used to use Saxon instead of the build in factory from the JDK.- Parameters:
xpathFactory
- the xpath factory to use- Returns:
- the current builder.
-
logNamespaces
Activates trace logging of all discovered namespaces in the message - to simplify debugging namespace-related issues Namespaces are printed in Hashmap style{xmlns:prefix=[namespaceURI], xmlns:prefix=[namespaceURI]}
. The implicit XML namespace is omitted (http://www.w3.org/XML/1998/namespace). XML allows for namespace prefixes to be redefined/overridden due to hierarchical scoping, i.e. prefix abc can be mapped to http://abc.com, and deeper in the document it can be mapped to http://def.com. When two prefixes are detected which are equal but are mapped to different namespace URIs, Camel will show all namespaces URIs it is mapped to in an array-style. This feature is disabled by default.- Returns:
- the current builder.
-
threadSafety
Whether to enable thread-safety for the returned result of the xpath expression. This applies to when using NODESET as the result type, and the returned set has multiple elements. In this situation there can be thread-safety issues if you process the NODESET concurrently such as from a Camel Splitter EIP in parallel processing mode. This option prevents concurrency issues by doing defensive copies of the nodes. It is recommended to turn this option on if you are using camel-saxon or Saxon in your application. Saxon has thread-safety issues which can be prevented by turning this option on. Thread-safety is disabled by default- Returns:
- the current builder.
-
preCompile
Whether to enable pre-compiling the xpath expression during initialization phase. pre-compile is enabled by default. This can be used to turn off, for example in cases the compilation phase is desired at the starting phase, such as if the application is ahead of time compiled (for example with camel-quarkus) which would then load the xpath factory of the built operating system, and not a JVM runtime.- Returns:
- the current builder.
-
getXPathFactory
Gets the xpath factory, can be null if no custom factory has been assigned. A default factory will be assigned (if no custom assigned) when either starting this builder or on first evaluation.- Returns:
- the factory, or null if this builder has not been started/used before.
-
setXPathFactory
-
getDocumentType
-
setDocumentType
-
getText
-
getResultQName
-
setResultQName
-
getHeaderName
-
setHeaderName
-
getPropertyName
-
setPropertyName
-
isThreadSafety
public boolean isThreadSafety() -
setThreadSafety
public void setThreadSafety(boolean threadSafety) -
isPreCompile
public boolean isPreCompile() -
setPreCompile
public void setPreCompile(boolean preCompile) -
getNamespaceContext
Gets the namespace context, can be null if no custom context has been assigned. A default context will be assigned (if no custom assigned) when either starting this builder or on first evaluation.- Returns:
- the context, or null if this builder has not been started/used before.
-
setNamespaceContext
-
getFunctionResolver
-
setFunctionResolver
-
setNamespaces
- Specified by:
setNamespaces
in interfaceorg.apache.camel.spi.NamespaceAware
-
getNamespaces
- Specified by:
getNamespaces
in interfaceorg.apache.camel.spi.NamespaceAware
-
getBodyFunction
Gets theXPathFunction
for getting the input message body. A default function will be assigned (if no custom assigned) when either starting this builder or on first evaluation.- Returns:
- the function, or null if this builder has not been started/used before.
-
setBodyFunction
-
getHeaderFunction
Gets theXPathFunction
for getting the input message header. A default function will be assigned (if no custom assigned) when either starting this builder or on first evaluation.- Returns:
- the function, or null if this builder has not been started/used before.
-
setHeaderFunction
-
getOutBodyFunction
Gets theXPathFunction
for getting the output message body. A default function will be assigned (if no custom assigned) when either starting this builder or on first evaluation.- Returns:
- the function, or null if this builder has not been started/used before.
-
setOutBodyFunction
-
getOutHeaderFunction
Gets theXPathFunction
for getting the output message header. A default function will be assigned (if no custom assigned) when either starting this builder or on first evaluation.- Returns:
- the function, or null if this builder has not been started/used before.
-
setOutHeaderFunction
-
getPropertiesFunction
Gets theXPathFunction
for getting the exchange properties. A default function will be assigned (if no custom assigned) when either starting this builder or on first evaluation.- Returns:
- the function, or null if this builder has not been started/used before.
-
setPropertiesFunction
-
getSimpleFunction
Gets theXPathFunction
for executing simple language as xpath function. A default function will be assigned (if no custom assigned) when either starting this builder or on first evaluation.- Returns:
- the function, or null if this builder has not been started/used before.
-
setSimpleFunction
-
getExpressionText
- Specified by:
getExpressionText
in interfaceorg.apache.camel.spi.ExpressionResultTypeAware
-
getResultType
- Specified by:
getResultType
in interfaceorg.apache.camel.spi.ExpressionResultTypeAware
-
setResultType
-
setLogNamespaces
public void setLogNamespaces(boolean logNamespaces) -
isLogNamespaces
public boolean isLogNamespaces() -
enableSaxon
public void enableSaxon()Enables Saxon on this particular XPath expression, assaxon()
sets the default static XPathFactory which may have already been initialised by previous XPath expressions -
setUseSaxon
public void setUseSaxon(boolean useSaxon) Whether to enable Saxon on this particular XPath expression. -
isUseSaxon
public boolean isUseSaxon() -
getObjectModelUri
-
setObjectModelUri
-
getFactoryClassName
-
setFactoryClassName
-
evaluate
-
evaluateAs
Evaluates the expression as the given result type -
doInEvaluateAs
protected Object doInEvaluateAs(XPathExpression xpathExpression, org.apache.camel.Exchange exchange, QName resultQName) -
createXPathExpression
Creates a new xpath expression as there we no available in the pool. This implementation must be synchronized to ensure thread safety, as this XPathBuilder instance may not have been started prior to being used.- Throws:
XPathExpressionException
-
createTraceNamespaceExpression
- Throws:
XPathExpressionException
-
createNamespaceContext
-
populateDefaultNamespaces
Populate a number of standard prefixes if they are not already there -
setNamespaceIfNotPresent
-
createDefaultFunctionResolver
-
isInputStreamNeeded
protected boolean isInputStreamNeeded(org.apache.camel.Exchange exchange) Checks whether we need anInputStream
to access the message body. Depending on the content in the message body, we may not need to convert toInputStream
.- Parameters:
exchange
- the current exchange- Returns:
- true to convert to
InputStream
beforehand converting afterwards.
-
isInputStreamNeeded
Checks whether we need anInputStream
to access the message header. Depending on the content in the message header, we may not need to convert toInputStream
.- Parameters:
exchange
- the current exchange- Returns:
- true to convert to
InputStream
beforehand converting afterwards.
-
isInputStreamNeededForProperty
protected boolean isInputStreamNeededForProperty(org.apache.camel.Exchange exchange, String propertyName) Checks whether we need anInputStream
to access the exchange property. Depending on the content in the exchange property, we may not need to convert toInputStream
.- Parameters:
exchange
- the current exchange- Returns:
- true to convert to
InputStream
beforehand converting afterwards.
-
isInputStreamNeededForObject
Checks whether we need anInputStream
to access this object Depending on the content in the object, we may not need to convert toInputStream
.- Parameters:
exchange
- the current exchange- Returns:
- true to convert to
InputStream
beforehand converting afterwards.
-
getDocument
Strategy method to extract the document from the exchange. -
doGetDocument
- Throws:
Exception
-
doStart
- Overrides:
doStart
in classorg.apache.camel.support.service.BaseService
- Throws:
Exception
-
doStop
- Overrides:
doStop
in classorg.apache.camel.support.service.BaseService
- Throws:
Exception
-
createXPathFactory
-
createDefaultXPathFactory
-