Versions Compared

Key

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

Content is work in progress!

 

Apart from using the default message builders and formatters that are shipped with WSO2 ESB, you have the flexibility to use your own custom message builder and formatter. 

...

Let's look at how to create a custom builder using an example a sample scenario where you need to Base64 encode an XML entry field. In this  sample, you retrieve the text content from the payload and then Base64 encode the text. This is then converted to SOAP and the content is then processed in the ESB mediation flow.

  1. You will first need to write a class

...

  1. implementing org.apache.axis2.builder.Builder interface in the Axis2 Kernel module

...

  1. and then override the

...

  1. processDocument method.

...

  1.  Within the

...

  1. processDocument method, you can define your specific logic to process the payload content as required and

...

  1. then convert it to

...

  1. SOAP format.

...

  1. Code Block

...

 

...

  1. 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;
        }
    }

 

...

  1. Create a JAR file of this class and add it into the classpath of the Axis2 installation i.e. <ESB_HOME>/repository/components/lib folder.
  2. To enable you custom builder for content type text/xml, add the following line in the

...

  1. 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"/>

...

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. Similar to the Builder, you can implement your logic within 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" /> 

...

Note

The class name used in the above line should be the name used for the class when writing the formatter.