public class XpathDocumentCopier extends MessageCopier
Implementation of MessageSplitter
which creates multiple instances of the same XML document based on an XPath.
The split messages will always contain the entire document, the XPath evaluation simply provides information on how many documents to produce and should always return an integer.
Given the following input document
<envelope>
<document>one</document>
<document>two</document>
<document>three</document>
</envelope>
You could use the xpath count(/envelope/document)
to split into 3 documents; each of which contains the whole XML
document.
If the DocumentBuilderFactoryBuilder
has been explicitly set to be not namespace aware and the document does in fact
contain namespaces, then Saxon can cause merry havoc in the sense that //NonNamespaceXpath
doesn't work if the document
has namespaces in it. We have included a shim so that behaviour can be toggled based on what you have configured.
XPath.newXPathInstance(DocumentBuilderFactoryBuilder, NamespaceContext)
In the adapter configuration file this class is aliased as xpath-document-copier which is the preferred alternative to the fully qualified classname when building your configuration.
MessageCopier.MessageCallback, MessageCopier.MessageCopierIterator
MessageSplitterImp.SplitMessageIterator
logR
Constructor and Description |
---|
XpathDocumentCopier() |
XpathDocumentCopier(java.lang.String xpath) |
Modifier and Type | Method and Description |
---|---|
KeyValuePairSet |
getNamespaceContext() |
DocumentBuilderFactoryBuilder |
getXmlDocumentFactoryConfig() |
java.lang.String |
getXpath()
Get the XPath to use to extract the individual messages.
|
void |
setNamespaceContext(KeyValuePairSet kvps)
Set the namespace context for resolving namespaces.
|
void |
setXmlDocumentFactoryConfig(DocumentBuilderFactoryBuilder xml) |
void |
setXpath(java.lang.String xp)
Set the XPath to use to extract the individual messages
|
CloseableIterable<AdaptrisMessage> |
splitMessage(AdaptrisMessage msg)
Splits an
AdaptrisMessage into some number of AdaptrisMessage objects. |
duplicateWithPayload, toInteger
copyMetadata, getCopyMetadata, getCopyObjectMetadata, getMessageFactory, selectFactory, setCopyMetadata, setCopyObjectMetadata, setMessageFactory
public XpathDocumentCopier()
public XpathDocumentCopier(java.lang.String xpath)
public CloseableIterable<AdaptrisMessage> splitMessage(AdaptrisMessage msg) throws CoreException
MessageSplitter
Splits an AdaptrisMessage
into some number of AdaptrisMessage objects. Preservation of metadata is down to the
implementation.
If this method returns a CloseableIterable
, it must be closed by the caller! This contract cannot be clearly
expressed in Java code without breaking the API in uncomfortable ways for things just returning a List, which is why
this method is only declared to return Iterable.
msg
- the msg to splitIterable
of AdaptrisMessage
CoreException
- wrapping any other exceptionpublic void setXpath(java.lang.String xp)
xp
- the XPathpublic java.lang.String getXpath()
public KeyValuePairSet getNamespaceContext()
public void setNamespaceContext(KeyValuePairSet kvps)
kvps
- the namespace contextSimpleNamespaceContext.create(KeyValuePairSet)
public DocumentBuilderFactoryBuilder getXmlDocumentFactoryConfig()
public void setXmlDocumentFactoryConfig(DocumentBuilderFactoryBuilder xml)