package jpos.util.tracing;

///////////////////////////////////////////////////////////////////////////////
//
// This software is provided "AS IS".  The JavaPOS working group (including
// each of the Corporate members, contributors and individuals)  MAKES NO
// REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE SOFTWARE,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED 
// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
// NON-INFRINGEMENT. The JavaPOS working group shall not be liable for
// any damages suffered as a result of using, modifying or distributing this
// software or its derivatives. Permission to use, copy, modify, and distribute
// the software and its documentation for any purpose is hereby granted. 
//
// The JavaPOS Config/Loader (aka JCL) is now under the CPL license, which 
// is an OSS Apache-like license.  The complete license is located at:
//    http://oss.software.ibm.com/developerworks/opensource/license-cpl.html
//
///////////////////////////////////////////////////////////////////////////////

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;

import jpos.util.*;

/**
 * This is a singleton factory used to create Tracer objects and access the
 * global tracer.  This implementation has the following semantics:
 * <ol>
 * <li>Its a Singleton class but can be subclassed if necessary</li>
 * <li>It caches the default no-named Tracer.  This is the global Tracer</li>
 * <li>
 * It caches the Tracer objects according to name and any access for the 
 * same named Tracer will return the same Tracer object
 * </li>
 * </ol>
 * @see com.ibm.jutil.tracing.Tracer#getInstance
 * @author E. Michael Maximilien
 * @since 2.1.0
 */
public class TracerFactory extends Object
{
    //-------------------------------------------------------------------------
    // Ctor
    //

    /** Make ctor protected to avoid construction (this is a Singleton class) */
    protected TracerFactory() {}

    //-------------------------------------------------------------------------
    // Public class methods
    //

    /** @return the sole instance of this class (creating it if necessary) */
    public static TracerFactory getInstance()
    {
        if( instance == null )
        {
            instance = new TracerFactory();
            instance.init();
        }

        return instance;
    }
    
    //-------------------------------------------------------------------------
    // Public methods
    //
    
    /** 
     * Sets the File that all subsequently created Tracer objects will print to
     * if these Tracer objects are turned on.  Successfully calling this method
     * overrides the current setting for TracerOutput to files
     * @throws java.io.IOException if a PrintStream could not be created from File
     */
    public void setOutputFile( File file ) throws IOException
    {
    	//<todo/>
    }
    
    /** 
     * @return the global no named Tracer object -- creates it if necessary
     * Its state is determined by the jutil.properties value
     */
    public Tracer createGlobalTracer() { return globalTracer; }

    /** 
     * @return the global no named Tracer object -- creates it if necessary
     * Its state is determined by the jutil.properties value
     * @param b the boolean parameter for the initial state of the tracer
     */
    public Tracer createGlobalTracer( boolean b ) 
    { 
    	globalTracer.setOn( b );
    	return globalTracer;
    }

    /** 
     * @return creates (if necessary) and return the Tracer with named specified
     * Its state is determined by the jutil.properties value
     * @param name the Tracer name
     */
    public Tracer createTracer( String name ) 
    { 
    	if( tracerMap.containsKey( name ) )
    		return (Tracer)tracerMap.get( name );
    		
    	Tracer tracer = new Tracer( name );
    	
    	if( namedTracerState.containsKey( name ) )
    		tracer.setOn( ( (Boolean)namedTracerState.get( name ) ).booleanValue() );
    	else
    		tracer.setOn( false );
    		
		if( turnOnAllNamedTracers ) tracer.setOn( true );
    	
    	tracerMap.put( name, tracer );
    	
    	return tracer;
    }

    /** 
     * @return creates (if necessary) and return the Tracer with named specified
     * Its state is determined by the jutil.properties value
     * @param name the Tracer name
     * @param b the boolean parameter for the initial state of the tracer
     */
    public Tracer createTracer( String name, boolean b ) 
    { 
    	Tracer tracer = createTracer( name );
    	tracer.setOn( b );
    	
    	return tracer;
    }

    //-------------------------------------------------------------------------
    // Protected methods
    //
    
    /** 
     * Finalizes this Tracer by closing the TracerOutput.  This is useful
     * if the TracerOutput is printing to a file.  This method would then
     * close that file
     * @throws java.lang.Thowable any exception occuring while finalizing
     */
    protected void finalize()
    {
    	if( printStream != null ) printStream.close();
    }
     
    //-------------------------------------------------------------------------
    // Private methods
    //
    
    /**
     * @return true if the propertyValue passed is valid and is equals (ignoring
     * case) to TRUE or YES
     * @param propValue the property value to check
     */
    private boolean isPropertyTrue( String propValue )
    {
    	if( propValue == null ) return false;
    	
        if( propValue.
            equalsIgnoreCase( JposProperties.TRACING_ON_PROP_VALUE ) ||
            propValue.
            equalsIgnoreCase( JposProperties.TRACING_TRUE_PROP_VALUE ) )
			return true;
			
		return false;
    }

    /** Intialize the current instance using the DefaultProperties class */
    private void init()
    {
        JposProperties props = new DefaultProperties();
        props.loadJposProperties();
        
		initGlobalTracer( props );
		initTurnedOnTracers( props );
		initNamedTracers( props );
		initTracerOutput();
    }

	/**
	 * Initializes the state of the globalTracer -not named
	 * @param props the JposProperties instance
	 */
	private void initGlobalTracer( JposProperties props )
	{
        if( !props.isPropertyDefined( TRACING_PROP_NAME ) )
            globalTracer.setOn( false );
        else
        {
            String tracingPropValue = 
                   props.getPropertyString( TRACING_PROP_NAME );

            if( isPropertyTrue( tracingPropValue ) )
                globalTracer.setOn( true );
        }
	}

	/**
	 * Sets to on all named tracers listed in the value of the... 
	 * TurnOnNamedTracers property
	 * @param props the JposProperties instance
	 */
	private void initTurnedOnTracers( JposProperties props )
	{
		if( props.isPropertyDefined( TURN_ON_ALL_NAMED_TRACERS_PROP_NAME ) )
		{
			String turnOnAllNamedTracersValue = props.
			getPropertyString( TURN_ON_ALL_NAMED_TRACERS_PROP_NAME );
			
			if( isPropertyTrue( turnOnAllNamedTracersValue ) )
				turnOnAllNamedTracers = true;
			else
				turnOnAllNamedTracers = false;
		}
		else		
		if( props.isPropertyDefined( TURN_ON_NAMED_TRACERS_PROP_NAME ) )
		{			
			List turnOnNamedTracersList = 
			     props.getStringListProperty( TURN_ON_NAMED_TRACERS_PROP_NAME );
			
			for( int i = 0; i < turnOnNamedTracersList.size(); ++i )
			{
				String tracerName = turnOnNamedTracersList.get( i ).toString();
                namedTracerState.put( tracerName, Boolean.TRUE );
			}			
		}
	}

	/**
	 * Initializes the state of all named Tracer objects
	 * @param props the JposProperties instance
	 */
	private void initNamedTracers( JposProperties props )
	{
		Enumeration propNames = props.getPropertyNames();
		
		while( propNames.hasMoreElements() )
		{
			String propName = (String)propNames.nextElement();
						
			if( propName.startsWith( TRACER_PROP_NAME ) )
			{
				String name = propName.
				              substring( ( TRACER_PROP_NAME + "." ).length(),
				                         propName.length() );
				
				if( props.isPropertyDefined( propName ) )
				{
					String propValue = (String)props.
					                   getPropertyString( propName );
					
		            if( propValue.equalsIgnoreCase( JposProperties.
		                                            TRACING_ON_PROP_VALUE ) ||
                		propValue.equalsIgnoreCase( JposProperties.
                		                            TRACING_TRUE_PROP_VALUE ) )
		                namedTracerState.put( name, Boolean.TRUE );
		            else
		            	namedTracerState.put( name, Boolean.FALSE );
				}
			}
		}
	}

	/**
	 * Initializes whether TracerOutput will be to a file or System.err and
	 * if to a file its location and name.  By default TracerOutput is to
	 * System.err for all tracers that are turned on
	 */
	private void initTracerOutput()
	{
		//<todo/>
	}
    
    //-------------------------------------------------------------------------
    // Private instance variables
    //
    
    private HashMap tracerMap = new HashMap();
    private HashMap namedTracerState = new HashMap();

	private Tracer globalTracer = Tracer.getInstance();

	private PrintStream printStream = null;
	
	private boolean turnOnAllNamedTracers = false;

    //-------------------------------------------------------------------------
    // Private class variables
    //

    private static TracerFactory instance = null;

    //-------------------------------------------------------------------------
    // Class constants
    //
    
    public static final String TRACING_PROP_NAME = "jpos.tracing";
    
    public static final String TRACER_PROP_NAME = 
                                 "jpos.util.tracing.Tracer";
                               
    public static final String TURN_ON_NAMED_TRACERS_PROP_NAME = 
                                 "jpos.util.tracing.TurnOnNamedTracers";

    public static final String TURN_ON_ALL_NAMED_TRACERS_PROP_NAME = 
                                 "jpos.util.tracing.TurnOnAllNamedTracers";
                               
    public static final String TRACER_OUTPUT_TO_FILE_PROP_NAME =
    						     "jpos.util.tracing.TracerOutputToFile";

	public static final String TRACER_OUTPUT_FILE_NAME_PROP_NAME =
							     "jpos.util.tracing.TracerOutputFileName";
	
	public static final String TRACER_OUTPUT_FILE_LOCATION =
							     "jpos.util.tracing.TracerOutputFileLocation";
							   
	public static final String USER_HOME_LOCATION_VALUE = "<user.home>";					
}