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
Constructors -
Method Summary
Modifier and TypeMethodDescriptionSets the expression result type toXPathConstants.BOOLEANprotected XPathFunctionResolverprotected static XPathFactoryprotected DefaultNamespaceContextcreateNamespaceContext(XPathFactory factory) protected XPathExpressionprotected XPathExpressionCreates a new xpath expression as there we no available in the pool.protected XPathFactorydocumentType(Class<?> documentType) Configures the document type to use.protected ObjectdoGetDocument(org.apache.camel.Exchange exchange, Object body) protected ObjectdoInEvaluateAs(XPathExpression xpathExpression, org.apache.camel.Exchange exchange, QName resultQName) voiddoStart()voiddoStop()voidEnables 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> TEvaluates the given xpath using the provided body.evaluate(org.apache.camel.Exchange exchange) <T> Tprotected ObjectevaluateAs(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 theXPathFunctionResolverinstance to use on these XPath expressionsGets theXPathFunctionfor getting the input message body.org.apache.camel.CamelContextprotected ObjectgetDocument(org.apache.camel.Exchange exchange, Object body) Strategy method to extract the document from the exchange.Class<?> Gets theXPathFunctionfor getting the input message header.Gets the namespace context, can be null if no custom context has been assigned.Gets theXPathFunctionfor getting the output message body.Gets theXPathFunctionfor getting the output message header.Gets theXPathFunctionfor getting the exchange properties.Class<?> Gets theXPathFunctionfor executing simple language as xpath function.org.apache.camel.ExpressiongetText()Gets the xpath factory, can be null if no custom factory has been assigned.voidinit(org.apache.camel.CamelContext context) protected booleanisInputStreamNeeded(org.apache.camel.Exchange exchange) Checks whether we need anInputStreamto access the message body.protected booleanChecks whether we need anInputStreamto access this objectbooleanbooleanbooleanbooleanActivates trace logging of all discovered namespaces in the message - to simplify debugging namespace-related issuesbooleanMatches the given xpath using the provided body.booleanmatches(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.NODESets the expression result type toXPathConstants.NODESETSets the expression result type toXPathConstants.NUMBERobjectModel(String uri) Sets the object model URI to useprotected voidPopulate 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 givenresultTypesaxon()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.voidsetBodyFunction(XPathFunction bodyFunction) voidsetCamelContext(org.apache.camel.CamelContext camelContext) voidsetDocumentType(Class<?> documentType) voidsetFactoryClassName(String factoryClassName) voidsetFunctionResolver(XPathFunctionResolver functionResolver) voidsetHeaderFunction(XPathFunction headerFunction) voidsetLogNamespaces(boolean logNamespaces) voidsetNamespaceContext(DefaultNamespaceContext namespaceContext) protected voidsetNamespaceIfNotPresent(DefaultNamespaceContext context, String prefix, String uri) voidsetNamespaces(Map<String, String> namespaces) voidsetObjectModelUri(String objectModelUri) voidsetOutBodyFunction(XPathFunction outBodyFunction) voidsetOutHeaderFunction(XPathFunction outHeaderFunction) voidsetPreCompile(boolean preCompile) voidsetPropertiesFunction(XPathFunction propertiesFunction) voidsetResultQName(QName resultQName) voidsetResultType(Class<?> resultType) voidsetSimpleFunction(XPathFunction simpleFunction) voidsetSource(org.apache.camel.Expression source) voidsetThreadSafety(boolean threadSafety) voidsetUseSaxon(boolean useSaxon) Whether to enable Saxon on this particular XPath expression.voidsetXPathFactory(XPathFactory xpathFactory) Sets the expression result type toXPathConstants.STRINGthreadSafety(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 XPathBuilderstatic XPathBuilderMethods 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, suspendMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface org.apache.camel.Predicate
initPredicateMethods inherited from interface org.apache.camel.Service
build, close, init, start, stopMethods inherited from interface org.apache.camel.ShutdownableService
shutdownMethods inherited from interface org.apache.camel.StatefulService
getStatus, isRunAllowed, isStarted, isStarting, isStopped, isStopping, isSuspendingMethods 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:
initin interfaceorg.apache.camel.Expression- Specified by:
initin interfaceorg.apache.camel.Predicate
-
toString
-
getCamelContext
public org.apache.camel.CamelContext getCamelContext()- Specified by:
getCamelContextin interfaceorg.apache.camel.spi.HasCamelContext
-
setCamelContext
public void setCamelContext(org.apache.camel.CamelContext camelContext) - Specified by:
setCamelContextin interfaceorg.apache.camel.CamelContextAware
-
matches
public boolean matches(org.apache.camel.Exchange exchange) - Specified by:
matchesin interfaceorg.apache.camel.Predicate
-
evaluate
- Specified by:
evaluatein 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.NODESETas 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 theXPathFunctionResolverinstance 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 toInputSourceto use SAX streams. By default Camel usesDocumentas 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
-
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:
setNamespacesin interfaceorg.apache.camel.spi.NamespaceAware
-
getNamespaces
- Specified by:
getNamespacesin interfaceorg.apache.camel.spi.NamespaceAware
-
getBodyFunction
Gets theXPathFunctionfor 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 theXPathFunctionfor 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 theXPathFunctionfor 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 theXPathFunctionfor 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 theXPathFunctionfor 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 theXPathFunctionfor 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
-
getSource
public org.apache.camel.Expression getSource() -
setSource
public void setSource(org.apache.camel.Expression source) -
getExpressionText
- Specified by:
getExpressionTextin interfaceorg.apache.camel.spi.ExpressionResultTypeAware
-
getResultType
- Specified by:
getResultTypein 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 anInputStreamto 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
InputStreambeforehand converting afterwards.
-
isInputStreamNeededForObject
Checks whether we need anInputStreamto access this object Depending on the content in the object, we may not need to convert toInputStream.- Parameters:
obj- the object- Returns:
- true to convert to
InputStreambeforehand converting afterwards.
-
getDocument
Strategy method to extract the document from the exchange. -
doGetDocument
- Throws:
Exception
-
doStart
- Overrides:
doStartin classorg.apache.camel.support.service.BaseService- Throws:
Exception
-
doStop
- Overrides:
doStopin classorg.apache.camel.support.service.BaseService- Throws:
Exception
-
createXPathFactory
-
createDefaultXPathFactory
-