Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Note

Content is work in progress!

...

Let's look at how to create a custom builder using an example scenario where you need to Base64 encode an XML entry field.

You will first need to write a class implementing  org.apache.axis2.builder.Builder  interface interface in the Axis2 Kernel module.When writing the custom Builder you need to implement theBuilderInterface and then override the processDocumentmethod. Within the processDocumentmethod, you can define your specific logic to process the content and accordingly convert it to the SOAP format.

In the below sample code snippet, you retrieve the text content from the payload and then Base64 encode the text. This is then converted to SOAP and then the content is processed in the ESB mediation flow.

 

Code Block
languagexml
package org.test.builder;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.OMNodeEx;
import org.apache.axiom.om.impl.builder.StAXBuilder;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axiom.om.util.StAXParserConfiguration;
import org.apache.axiom.om.util.StAXUtils;
import org.apache.axiom.soap.SOAPBody;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.builder.Builder;
import org.apache.axis2.context.MessageContext;
import org.apache.commons.codec.binary.Base64;

import javax.xml.stream.XMLStreamException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;

public class CustomBuilderForTextXml implements Builder{
    public OMElement processDocument(InputStream inputStream, String s, MessageContext messageContext) throws AxisFault {
        SOAPFactory soapFactory = OMAbstractFactory.getSOAP11Factory();
        SOAPEnvelope soapEnvelope = soapFactory.getDefaultEnvelope();

        PushbackInputStream pushbackInputStream = new PushbackInputStream(inputStream);

        try {
            int byteVal = pushbackInputStream.read();
            if (byteVal != -1) {
                pushbackInputStream.unread(byteVal);

                javax.xml.stream.XMLStreamReader xmlReader = StAXUtils.createXMLStreamReader(StAXParserConfiguration.SOAP,
                        pushbackInputStream, (String) messageContext.getProperty(Constants.Configuration.CHARACTER_SET_ENCODING));

                StAXBuilder builder = new StAXOMBuilder(xmlReader);
                OMNodeEx documentElement = (OMNodeEx) builder.getDocumentElement();
                documentElement.setParent(null);
                String elementVal = ((OMElement) documentElement).getText();
                byte[]   bytesEncoded = Base64.encodeBase64(elementVal.getBytes());
                ((OMElement) documentElement).setText(new String(bytesEncoded ));
                SOAPBody body = soapEnvelope.getBody();
                body.addChild(documentElement);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XMLStreamException e) {
            e.printStackTrace();
        }

        return soapEnvelope;
    }
}

 

Now, you need to make a jar out JAR file of this class and add it into the classpath of Axis2 installation i.e. <ESB_HOME>/repository/components/lib folder.

To enable you custom builder for content type text/xml, add the following line in the message buillders section in <ESB_HOME/repository/conf/axis2/axis2.xml> file:

Code Block
languagexml
<messageBuilder contentType="text/xml" class="org.apache.axis2.transport.http.CustomBuilderForTextXml"/>

Custom Formatters

Similarly you can write your own   Message Formatters   as well, in order to manipulate the outgoing payload from ESB.

When creating a custom Message Formatter, you will need to create a class implementing org.apache.axis2.transport.MessageFormatter Interface and then override the writeTo method

Ensure to add the following line in Message Formatters section in <ESB_HOME/repository/conf/axis2/axis2.xml> file:   

Code Block
languagexml
<messageFormatter

...

 contentType= "text/xml" class= "org.apache.axis2.transport.http.SOAPMessageFormatter" />