Class XpathMessageSplitter

  • All Implemented Interfaces:
    MessageSplitter

    public class XpathMessageSplitter
    extends MessageSplitterImp

    Implementation of MessageSplitter which splits an XML document based on an XPath.

    TheMessage must be an XML document and split is specified by an XPath which returns a repeating subset of the document.

    Given the following input document:

     
     <envelope>
       <document>one</document>
       <document>two</document>
       <document>three</document>
     </envelope>
     
     
    then the following XPath: /envelope/document will create 3 documents each of which will only contain the element.

    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.

    See Also:
    XPath.newXPathInstance(DocumentBuilderFactoryBuilder, NamespaceContext)

    In the adapter configuration file this class is aliased as xpath-message-splitter which is the preferred alternative to the fully qualified classname when building your configuration.

    • Constructor Detail

      • XpathMessageSplitter

        public XpathMessageSplitter()
      • XpathMessageSplitter

        public XpathMessageSplitter​(java.lang.String xpath)
      • XpathMessageSplitter

        public XpathMessageSplitter​(java.lang.String xpath,
                                    java.lang.String encoding)
    • Method Detail

      • splitMessage

        public CloseableIterable<AdaptrisMessage> splitMessage​(AdaptrisMessage msg)
                                                        throws CoreException
        Description copied from interface: 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.

        Parameters:
        msg - the msg to split
        Returns:
        an Iterable of AdaptrisMessage
        Throws:
        CoreException - wrapping any other exception
      • setXpath

        public void setXpath​(java.lang.String xp)
        Set the XPath to use to extract the individual messages
        Parameters:
        xp - the XPath
      • getXpath

        public java.lang.String getXpath()
        Get the XPath to use to extract the individual messages.
        Returns:
        the XPath as a String
      • setEncoding

        public void setEncoding​(java.lang.String charSet)
        Sets the encoding to use on the output XML docs.
        Parameters:
        charSet - the encoding, defaults to ISO-8859-1
      • getEncoding

        public java.lang.String getEncoding()
        Gets the encoding used by this splitter
        Returns:
        the encoding.
      • getNamespaceContext

        public KeyValuePairSet getNamespaceContext()
        Returns:
        the namespaceContext