view tango/tango/util/log/Appender.d @ 373:d1574e142e93 trunk

[svn r394] Fixed the new DtoNullValue function
author lindquist
date Tue, 15 Jul 2008 15:16:56 +0200
parents 1700239cab2e
children
line wrap: on
line source

/*******************************************************************************

        copyright:      Copyright (c) 2004 Kris Bell. All rights reserved

        license:        BSD style: $(LICENSE)
      
        version:        Initial release: May 2004
        
        author:         Kris

*******************************************************************************/

module tango.util.log.Appender;

public import  tango.core.Exception;

public import  tango.util.log.Event,
               tango.util.log.EventLayout;

/*******************************************************************************

        Base class for all Appenders. These objects are responsible for
        emitting messages sent to a particular logger. There may be more
        than one appender attached to any logger. The actual message is
        constructed by another class known as an EventLayout.
        
*******************************************************************************/

public class Appender
{
        typedef int Mask;

        private Appender        next;
        private EventLayout     layout;

        /***********************************************************************
                
                Return the mask used to identify this Appender. The mask
                is used to figure out whether an appender has already been 
                invoked for a particular logger.

        ***********************************************************************/

        abstract Mask getMask ();

        /***********************************************************************
                
                Return the name of this Appender.

        ***********************************************************************/

        abstract char[] getName ();
                
        /***********************************************************************
                
                Append a message to the output.

        ***********************************************************************/

        abstract void append (Event event);

        /***********************************************************************
              
              Create an Appender and default its layout to SimpleLayout.  

        ***********************************************************************/

        this ()
        {
                layout = new SimpleLayout;
        }

        /***********************************************************************
                
                Static method to return a mask for identifying the Appender.
                Each Appender class should have a unique fingerprint so that
                we can figure out which ones have been invoked for a given
                event. A bitmask is a simple an efficient way to do that.

        ***********************************************************************/

        protected Mask register (char[] tag)
        {
                static Mask mask = 1;
                static Mask[char[]] registry;

                Mask* p = tag in registry;
                if (p)
                    return *p;
                else
                   {
                   auto ret = mask;
                   registry [tag] = mask;

                   if (mask < 0)
                       throw new IllegalArgumentException ("too many unique registrations");

                   mask <<= 1;
                   return ret;
                   }
        }

        /***********************************************************************
                
                Set the current layout to be that of the argument.

        ***********************************************************************/

        void setLayout (EventLayout layout)
        {
                if (layout)
                    this.layout = layout;
        }

        /***********************************************************************
                
                Return the current Layout

        ***********************************************************************/

        EventLayout getLayout ()
        {
                return layout;
        }

        /***********************************************************************
                
                Attach another appender to this one

        ***********************************************************************/

        void setNext (Appender next)
        {
                this.next = next;
        }

        /***********************************************************************
                
                Return the next appender in the list

        ***********************************************************************/

        Appender getNext ()
        {
                return next;
        }

        /***********************************************************************
                
                Close this appender. This would be used for file, sockets, 
                and such like.

        ***********************************************************************/

        void close ()
        {
        }
}