LogProcessor – custom metadata processor for Swiz 1.0.0

2009 December 16
by Piotr Walczyszyn

Just recently Swiz 1.0.0 alpha was released. Essentially it is rewrite of Swiz itself but it also brings new cool features. One of the features that I really like the most is the ability to define Custom Metadata Processors. It allows you to define your own metadata and have it wired into your code with the same mechanism that [Autowire] and [Mediate] are implemented by Swiz. I decided to give it a try by building a very simple LogProcessor that injects preconfigured ILogger from Flex API based on [Log] metadata.

The usage of this custom metadata looks like this:

[Log]
public var log:ILogger;
 
private function someFunction():void
{
    log.debug("someFunction was called!");
}

Here is the code of my LogProcessor. The addMetadata function actually does the job:

package processors
{
  import mx.logging.Log;
  import mx.logging.LogEventLevel;
  import mx.logging.targets.TraceTarget;
 
  import org.swizframework.core.Bean;
  import org.swizframework.processors.MetadataProcessor;
  import org.swizframework.reflection.IMetadataTag;
 
  public class LogProcessor extends MetadataProcessor
  {
 
    private static var traceTarget:TraceTarget;
 
    public function LogProcessor(level:int = LogEventLevel.ALL, filters:Array = null, includeDate:Boolean = true, includeTime:Boolean = true, includeCategory:Boolean = true, includeLevel:Boolean = true)
    {
      super("Log");
 
      if (LogProcessor.traceTarget == null)
      {
        LogProcessor.traceTarget = new TraceTarget();
 
        LogProcessor.traceTarget.level = level;
        LogProcessor.traceTarget.filters=filters;
        LogProcessor.traceTarget.includeDate = includeDate;
        LogProcessor.traceTarget.includeTime = includeTime;
        LogProcessor.traceTarget.includeCategory = includeCategory;
        LogProcessor.traceTarget.includeLevel = includeLevel;
 
        Log.addTarget(LogProcessor.traceTarget);
      }      
 
    }
 
    /**
     * Assign ILogger instance
     */
    override public function addMetadata(bean:Bean, metadata:IMetadataTag):void
    {
      // bean.typeDescriptor.className returns class name in packages::ClassName notation
      // that is not accepted by Log.getLogger function, returning only ClassName string 
      var className:String = bean.typeDescriptor.className;
      className = className.substr(className.lastIndexOf(":") + 1);
 
      // Setting Logger
      bean.source[ metadata.host.name ] = Log.getLogger(className);
    }
 
    /**
     * Remove ILogger instance
     */
    override public function removeMetadata(bean:Bean, metadata:IMetadataTag):void
    {
      bean.source[ metadata.host.name ] = null;
    }
 
    public function set level(value:int):void
    {
      LogProcessor.traceTarget.level = value;
    }
 
    public function set filters(value:Array):void
    {
      LogProcessor.traceTarget.filters = value;
    }
 
    public function set includeDate(value:Boolean):void
    {
      LogProcessor.traceTarget.includeDate = value;
    }
 
    public function set includeTime(value:Boolean):void
    {
      LogProcessor.traceTarget.includeTime = value;
    }
 
    public function set includeCategory(value:Boolean):void
    {
      LogProcessor.traceTarget.includeCategory = value;
    }
 
    public function set includeLevel(value:Boolean):void
    {
      LogProcessor.traceTarget.includeLevel = value;
    }
 
  }
}
One Response leave one →
  1. 2009 December 16

    Thank you for the news Piotr, I’ve missed that.

Leave a Reply

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS