LogProcessor – custom metadata processor for Swiz 1.0.0
2009 December 16
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; } } }





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