/*
 * Copyright 1999,2005 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.log4j.chainsaw;

import java.net.InetAddress;
import java.net.UnknownHostException;

import org.apache.log4j.Appender;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.helpers.Constants;
import org.apache.log4j.helpers.OptionConverter;
import org.apache.log4j.spi.LoggingEvent;


/**
 * ChainsawAppender receives LoggingEvents from the local
 * Log4J environment, and appends them into a model that
 * can be used inside a Swing GUI
 * @author Paul Smith
 * @version 1.0
 */
public class ChainsawAppender
    extends AppenderSkeleton{

  private Appender appender;
  
  /**
   * The in-JVM singleton instance of the ChainsawAppender.
   *
   * If somehow Log4j initialises more than one, then the first one to
   * initialise wins!
   */
  private static ChainsawAppender sSharedAppender = null;

  /**
   * The classname of the viewer to create to view the events.
   */
  private String viewerClassname;
  private String hostname = "localhost";
  private String application = "app";

  /**
   * Constructor, initialises the singleton instance of the appender
   */
  public ChainsawAppender() {
    super(false);
    synchronized (ChainsawAppender.class) {
      if (sSharedAppender == null) {
        sSharedAppender = this;
      }
    }
  }

  /**
   * Return the singleton instance of the ChainsawAppender, it should only
   * be initialised once.
   * @return the One and only instance of the ChainsawAppender that is
   * allowed to be referenced by the GUI
   */
  static ChainsawAppender getInstance() {
    return sSharedAppender;
  }

  /**
   * This appender does not require layout and so return false
   * @return false and only false
   */
  public boolean requiresLayout() {
    return false;
  }
  
  public Appender getAppender() {
      return appender;
  } 

  public void setAppender(Appender appender) {
    this.appender = appender;
  }
  
  /**
   * Appends the event
   * @param aEvent the LoggingEvent to append
   */
  protected void append(LoggingEvent aEvent) {
      if (hostname != null) {
        aEvent.setProperty(Constants.HOSTNAME_KEY, hostname);
      }

      if (application != null) {
        aEvent.setProperty(Constants.APPLICATION_KEY, application);
      }

      appender.doAppend(aEvent);
  }

  /**
   * Instantiates and activates an instance of a ChainsawViewer
   * to view the contents of this appender.
   */
  public void activateOptions() {
    if (viewerClassname == null) {
      viewerClassname = "org.apache.log4j.chainsaw.DefaultViewer";
    }
      
    ChainsawViewer viewer = 
      (ChainsawViewer) OptionConverter.instantiateByClassName(viewerClassname, 
        ChainsawViewer.class, null);
        
    if (viewer != null) {
      viewer.activateViewer(this);
    }
    try {
      hostname = InetAddress.getLocalHost().getHostName();
    } catch (UnknownHostException uhe) {
      try {
        hostname = InetAddress.getLocalHost().getHostAddress();
      } catch (UnknownHostException uhe2) {
      }
    }
  }

  /**
   * Close does nothing
   */
  public void close() {
  }

  /**
   * Sets the viewer class to use to view the events.  The class must
   * implement the ChainsawViewer interface.
   *
   * @param classname The class name of the viewer class.
   */
  public void setViewerClass(String classname) {
    viewerClassname = classname;
  }

  /**
   * Gets the viewer class to use to view the events.
   *
   * @return The class name of the viewer class.
   */
  public String getViewerClass() {
    return viewerClassname;
  }

  /**
   * The <b>Application</b> option takes a string value which should be the
   * name of the application getting logged
   */
  public void setApplication(String lapp) {
    this.application = lapp;
  }

  /**
   *  Returns value of the <b>Application</b> option.
   */
  public String getApplication() {
    return application;
  }


}
