
import com.audium.server.global.LoggerApplicationAPI;
import com.audium.server.logger.ApplicationLoggerBase;
import com.audium.server.logger.LoggerPlugin;
import com.audium.server.logger.events.ActivityEvent;
import com.audium.server.logger.events.ApplicationAdminErrorEvent;
import com.audium.server.logger.events.ApplicationErrorEvent;
import com.audium.server.logger.events.ApplicationEvent;
import com.audium.server.logger.events.EventException;
import com.audium.server.logger.events.IEventIDs;
import com.audium.server.logger.events.JavaAPIErrorEvent;
import com.audium.server.logger.events.SystemErrorEvent;
import com.audium.server.logger.events.VoiceXMLErrorEvent;
import com.audium.server.logger.events.XMLAPIErrorEvent;
import java.io.File;

public class MyCustomErrorLogger extends ApplicationLoggerBase
  implements LoggerPlugin
{
  private static final String NEWLINE = System.getProperty("line.separator");

  public void initialize(File configFile, LoggerApplicationAPI api)
    throws EventException
  {
	//register the events to listen for
    this.eventsToListenFor.add(IEventIDs.SYSTEM_ERROR_EVENT_ID);
    this.eventsToListenFor.add(IEventIDs.JAVA_API_ERROR_EVENT_ID);
    this.eventsToListenFor.add(IEventIDs.XML_API_ERROR_EVENT_ID);
    this.eventsToListenFor.add(IEventIDs.VXML_ERROR_EVENT_ID);
    this.eventsToListenFor.add(IEventIDs.APPLICATION_ADMINISTRATION_ERROR_EVENT_ID);
    
  }

  public void destroy(LoggerApplicationAPI api)
  {
  }

  public void log(ApplicationEvent event)
    throws EventException
  {
	  
	    StringBuffer content = new StringBuffer(5000);
	  
	    String eventID = event.getID();
	
	    if (IEventIDs.JAVA_API_ERROR_EVENT_ID.equals(eventID)) 
	    {
	      JavaAPIErrorEvent javaEvent = (JavaAPIErrorEvent) event;
	      handleJavaActivityError(content, (ActivityEvent) event, javaEvent.getErrorMessage(), javaEvent.getException());
	    } 
	    else if (IEventIDs.SYSTEM_ERROR_EVENT_ID.equals(eventID)) 
	    {
	      SystemErrorEvent sysEvent = (SystemErrorEvent) event;
	      handleJavaActivityError(content, (ActivityEvent) event, sysEvent.getErrorMessage(), sysEvent.getException());
	    } 
	    else if (IEventIDs.VXML_ERROR_EVENT_ID.equals(eventID)) 
	    {
	      handleVXMLError(content, (VoiceXMLErrorEvent) event);
	    } 
	    else if (IEventIDs.XML_API_ERROR_EVENT_ID.equals(eventID)) 
	    {
	      handleXMLAPIError(content, (XMLAPIErrorEvent) event);
	    } 
	    else 
	    {
	      handleApplicationAdminError(content, (ApplicationAdminErrorEvent) event);
	    }
	
	    if (content.length() > 0)
	    {
	      try 
	      {
	        /*
	         * Now, do with the content in the string buffer as you like. Write to file, send an email.. 
	         */
	      }
	      catch (Exception e) 
	      {
	        throw new EventException("There was an error performing an IO operation while logging an application error.", e);
	  }
	}
  }

  protected void handleJavaActivityError(StringBuffer toReturn, ActivityEvent event, String errorMessage, Throwable exception)
  {
    /*
     * This is where to get the information from the Event, format it into a string and appended the message into the StringBuffer
     * You can call things like event.getLoggerAPI().XXX  to access sessionAPI data like element data, session ID, etc...   
     * event.Timestamp() to get the time of the event and 
     * If you want the stack trace use this: ApplicationErrorEvent.getStackTrace(exception)
     * For example:
     */
	  
	  //TODO formatHeader(toReturn, event)
	  toReturn.append("Error:" + errorMessage + ". Occurred at " + event.getTimestamp().toString());
	  toReturn.append(NEWLINE);
	  toReturn.append((ApplicationErrorEvent.getStackTrace(exception)));
      toReturn.append(NEWLINE);
    
  }

  protected void handleApplicationAdminError(StringBuffer toReturn, ApplicationAdminErrorEvent event) 
  {
    //TODO formatHeader(toReturn, event); 
	toReturn.append((ApplicationErrorEvent.getStackTrace(event.getException())));
    toReturn.append(NEWLINE);
  }

  protected void handleVXMLError(StringBuffer toReturn, VoiceXMLErrorEvent event) 
  {
	//TODO formatHeader(toReturn, event);
   
    toReturn.append("A Voice XML Error occured. " + event.getVoiceXMLEvent() + " with message " +  event.getErrorMessage());
  }

  protected void handleXMLAPIError(StringBuffer toReturn, XMLAPIErrorEvent event) 
  {
    //TODO
  }
  
  private void formatHeader(StringBuffer toReturn, ApplicationEvent event)
  {
	  //TODO log common event traits here
  }
  
}