/*
 * Copyright (C) The Apache Software Foundation. All rights reserved.
 *
 * This software is published under the terms of the Apache Software License
 * version 1.1, a copy of which has been included with this distribution in
 * the LICENSE file.
 */
package org.apache.log.output.jms;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.log.LogEvent;
import org.apache.log.ContextMap;
import org.apache.log.Logger;
import org.apache.log.util.StackIntrospector;
import java.io.StringWriter;
import java.io.PrintWriter;

/**
 * Basic message factory that stores LogEvent in Message.
 *
 * @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
 */
public class XMLMessageBuilder extends TextMessageBuilder
{

    private final static String  TYPE_LOGEVENT_STR = "log-event";    
    
    public Message buildMessage( Session session, LogEvent event )
        throws JMSException
    {
        synchronized( session )
        {
            final TextMessage message = session.createTextMessage();
            final StringBuffer xml = new StringBuffer();

            setStartTag( xml, TYPE_LOGEVENT_STR );
            
            setStartTag( xml, TYPE_MESSAGE_STR );
            xml.append( event.getMessage() );
            setEndTag( xml, TYPE_MESSAGE_STR );
            
            setStartTag( xml, TYPE_PRIORITY_STR );
            xml.append( event.getPriority().getName() );            
            setEndTag( xml, TYPE_PRIORITY_STR );
            
            setStartTag( xml, TYPE_CATEGORY_STR );
            xml.append( event.getCategory() );            
            setEndTag( xml, TYPE_CATEGORY_STR );

            setStartTag( xml, TYPE_TIME_STR );
            xml.append( event.getTime() );            
            setEndTag( xml, TYPE_TIME_STR );

            setStartTag( xml, TYPE_RELATIVE_TIME_STR );
            xml.append( event.getRelativeTime() );            
            setEndTag( xml, TYPE_RELATIVE_TIME_STR );

            setStartTag( xml, TYPE_METHOD_STR );
            xml.append( getMethod( event ) );            
            setEndTag( xml, TYPE_METHOD_STR );

            setStartTag( xml, TYPE_THREAD_STR );
            xml.append( getThread( event ) );            
            setEndTag( xml, TYPE_THREAD_STR );
            
            setStartTag( xml, TYPE_THROWABLE_STR );
            setCData( xml, getStackTrace( event ) );            
            setEndTag( xml, TYPE_THROWABLE_STR );
            
            setEndTag( xml, TYPE_LOGEVENT_STR );
            
            message.setText( xml.toString() );

            return message;
        }
    }    
    
    private void setStartTag( StringBuffer buffer, final String tag )
    {
        buffer.append("<");
        buffer.append( tag );
        buffer.append(">");        
    }

    private void setEndTag( StringBuffer buffer, final String tag )
    {
        buffer.append("</");
        buffer.append( tag );
        buffer.append(">");        
    }
    
    private void setCData( StringBuffer buffer, final String content )
    {
        buffer.append("<![CDATA[");
        buffer.append(content);
        buffer.append("]]>");
    }
}

