package com.psc.dsg.di.bemis.infrastructure.logger;

import java.util.StringTokenizer;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.xml.XMLLayout;


/**
 * This class is used to format the XML log data written in the Client Side.<p>
 *
 * Copyright: 2002<br>
 * Company  : HCL Perot Systems<br>
 * @author    Saurobh Kumar Roy
 * @version   2
 * <pre>
 * $Log :: /com/psc/dsg/di/bemis/infrastructure/logger/BEMISXMLLayout.java $
 *
 * 2   25/02/2002  Pradeep.P
 * Added documentation for all methods
 *
 * 1   05/02/2002  Saurobh Kumar Roy
 * BEMISXMLLayout Class
 * </pre>
 */

public class BEMISXMLLayout extends XMLLayout {

    private final int      DEFAULT_SIZE  = 256;
    private final int      UPPER_LIMIT   = 2048;
    private StringBuffer   oStringBuffer = new StringBuffer(DEFAULT_SIZE);


    /**
     * Formats a {@link LoggingEvent} in  conformance with the log4j.dtd.
     *
     * @param event   LoggingEvent
     * @return        String
     */

    public String format(LoggingEvent event) {
        if (oStringBuffer.capacity() > UPPER_LIMIT) {
            oStringBuffer = new StringBuffer(DEFAULT_SIZE);
        }
        else {
            oStringBuffer.setLength(0);
        }
        oStringBuffer.append("<" + event.priority + ">\r\n");
        oStringBuffer.append("<Description ");
        oStringBuffer.append(getDescInXMLFormat(event));
        oStringBuffer.append("/>\r\n");
        oStringBuffer.append("</" + event.priority + ">\r\n");

        return oStringBuffer.toString();
    }

    /**
     * Gets the message in XML format.
     *
     * @param event   LoggingEvent
     * @return        String
     */

    private String getDescInXMLFormat(LoggingEvent event) {

        StringBuffer     sXMLLogBuf         = new StringBuffer();
        StringBuffer     sstackTraceBuf     = new StringBuffer();
        String           sLoggingMessage    = event.getRenderedMessage();
        String[]         oString            = null;
        String           sLoggingStringUnit = null;
        StringTokenizer  oToken
                         = new StringTokenizer(sLoggingMessage, "^");

        while (oToken.hasMoreElements()) {
            sLoggingStringUnit = oToken.nextToken();

            if (sLoggingStringUnit.startsWith(ClientLogger.ERR_DESC)) {
                oString = event.getThrowableStrRep();

                if (oString != null) {
                    sstackTraceBuf.append("\r\n");

                    for (int i = 0; i < oString.length; i++) {
                        sstackTraceBuf.append(oString[i]);
                        sstackTraceBuf.append("\r\n");
                    }

                    sstackTraceBuf.append("\"");
                    sLoggingStringUnit = sLoggingStringUnit +
                        ClientLogger.encodeMessage(new String(sstackTraceBuf));
                }
            }
            sXMLLogBuf.append(" " + sLoggingStringUnit);
        }
        return new String(sXMLLogBuf);
    }
}