package com.frontiers.server.mail;

import org.apache.log4j.*;
import org.apache.log4j.spi.*;
import org.apache.log4j.helpers.*;

/**
 * Log4j appender class used to send e-mail messages
 * of events recieved. This appender should always be added
 * to the log4j provided AsynchronousAppender becuase of the
 * overhead involved in sending e-mail messages.
 *
 * Sample log4j xml configuration: <code>
 *     <appender name="MAIL" class="com.frontiers.server.mail.MailAppender">
 *               <param name="Threshold" value="ERROR" />
 *		
 *		<param name="To" value="jkuhnert@ekosystems.com" />
 *              <param name="Subject" value="Error from CaseServer!!" />
 *		<param name="From" value="caseserver@inovafairfax.com" />
 *		<param name="Location" value="CaseServer at Inova Fairfax. I.P. address: 10.1.1.44" />
 *		
 *               <layout class="org.apache.log4j.PatternLayout">
 *                   <param name="ConversionPattern" value="%d{ISO8601} %-5p %c{1} - %m%n"/>
 *               </layout>
 *       </appender> </code>
 *
 * @author Jesse Kuhnert, Copyright 2001 eko systems Inc.
 */
public class MailAppender extends AppenderSkeleton {
    
    /** From */
    protected String _from;
    /** Message recipients. Comma separated list. */
    protected String _to;
    /** E-mail subject to use */
    protected String _subject;
    /** Location of originating service */
    protected String _location;
    
    /** Default constructor. Does nothing. */
    public MailAppender() {}
    
    /** 
     * Instantiates with layout to use for formatting
     * messages.
     *
     * @param Layout - Layout to use
     */
    public MailAppender(Layout layout)
    {
	this.layout = layout;
    }
    
    public void setFrom(String from) { _from = from; }
    public String getFrom() { return _from; }
    
    public void setTo(String to) { _to = to; }
    public String getTo() { return _to; }
    
    public void setSubject(String subject) { _subject = subject; }
    public String getSubject() { return _subject; }
    
    public void setLocation(String loc) { _location = loc; }
    public String getLocation() { return _location; }
    
    /**
     * Implementation of message appends. These
     * mesages will be e-mail to recipients.
     *
     * @param LoggingEvent - Event to log
     */
    public void append(LoggingEvent event)
    {
	try {
	    //If we have a throwable string, capture and print it
	    if (event.getThrowableStrRep() != null && event.getThrowableStrRep().length > 0) {
		StringBuffer str = new StringBuffer();
		String[] s = event.getThrowableStrRep();
		
		for (int i=0; i < s.length; i++) {
		    str.append(s[i]).append(Layout.LINE_SEP);
		}
		
		SendMail.sendMessage(_to, _subject , _from, 
				     this.layout.format(event), _location,
				     str.toString());
	    } else {
		//Regular generic message
		SendMail.sendMessage(_to, _subject , 
				     _from, this.layout.format(event), _location );
	    }
	} catch (Throwable t) {	    
	    System.out.println("MailAppender: Caught exception:" + t.getMessage());
	    t.printStackTrace();
	}
    }
    
    public void close(){}   
    
    public boolean requiresLayout()
    {
	return true;
    }

}

