/*
 * Copyright 1999,2004 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() {
    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 activate() {
    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;
  }


}
