com.atlassian.confluence.content.render.xhtml.migration.exceptions.UnknownMacroMigrationException: The macro 'next_previous_links' is unknown.

Axis2 Message Formatter

The Axis2 Message Formatter is an extension point provided by Apache Axis2. It can be used to modify messages by serializing them into a different message format. For example, to JSON. Users need to implement the org.apache.axis2.transport.MessageFormatter interface. The axis2.xml file (located in the <PRODUCT_HOME>/repository/conf/axis2 directory) is used to register the message formatter along with the required content type.

The process of implementing a sample message formatter is as follows: 

Implementing a message formatter

The following Axis2 message formatter is written to change the content type of the messages to “application/format-x”. Additionally, there are two debug logs printed when the message is processed by the message formatter.

package org.wso2.carbon.extensions;

import org.apache.axiom.om.OMOutputFormat;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.MessageFormatter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.net.URL;

public class CustomMessageFormatter implements MessageFormatter {

   private static Log log = LogFactory.getLog(CustomMessageFormatter.class);

   public byte[] getBytes(MessageContext messageContext, OMOutputFormat omOutputFormat)
           throws AxisFault {
       ByteArrayOutputStream baos = new ByteArrayOutputStream();
       writeTo(messageContext, omOutputFormat, baos, true);
       return baos.toByteArray();
   }

   public void writeTo(MessageContext messageContext, OMOutputFormat omOutputFormat, OutputStream outputStream,
                       boolean b) throws AxisFault {
       if (log.isDebugEnabled()) {
           log.debug("Start of message modification");
       }

       // message modification logic goes here.

       if (log.isDebugEnabled()) {
           log.debug("End of message modification");
       }
   }
   public String getContentType(MessageContext messageContext, OMOutputFormat omOutputFormat, String s) {
       return "application/format-x";
   }
   public URL getTargetAddress(MessageContext messageContext, OMOutputFormat omOutputFormat, URL url)
           throws AxisFault {
       return null;
   
   public String formatSOAPAction(MessageContext messageContext, OMOutputFormat omOutputFormat, String s) {
       return null;
   }
}

Adding the JARs

The JAR containing the CustomMessageFormatter class needs to be placed in the <PRODUCT_HOME>/repository/components/lib directory of the Carbon server. 

Updating the configurations

 Update the axis2.xml file (located in the <PRODUCT_HOME>/repository/conf/axis2 directory) as shown below. This registers the message formatter against the “application/soap+xml” content type.

<messageFormatter contentType="application/soap+xml"
                     	class="org.wso2.carbon.extensions.CustomMessageFormatter"/>
com.atlassian.confluence.content.render.xhtml.migration.exceptions.UnknownMacroMigrationException: The macro 'next_previous_links2' is unknown.