svn commit: r2095 - in logback/trunk: logback-access/src/main/java/ch/qos/logback/access/sift logback-access/src/test/input/jetty logback-access/src/test/java/ch/qos/logback/access/sift logback-classic/src/main/java/ch/qos/logback/classic/sift logback-classic/src/test/input/joran/sift logback-classic/src/test/java/ch/qos/logback/classic/sift logback-core/src/main/java/ch/qos/logback/core/joran/action logback-core/src/main/java/ch/qos/logback/core/joran/spi logback-core/src/main/java/ch/qos/log

Author: ceki Date: Mon Dec 22 23:18:36 2008 New Revision: 2095 Added: logback/trunk/logback-access/src/test/input/jetty/siftingFile.xml logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/DefaultClass.java Modified: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/AccessEventDiscriminator.java logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/SiftAction.java logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/SiftingAppender.java logback/trunk/logback-access/src/test/input/jetty/sifting.xml logback/trunk/logback-access/src/test/java/ch/qos/logback/access/sift/SiftingAppenderTest.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/MDCBasedDiscriminator.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftAction.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingAppender.java logback/trunk/logback-classic/src/test/input/joran/sift/completeCycle.xml logback/trunk/logback-classic/src/test/input/joran/sift/smoke.xml logback/trunk/logback-classic/src/test/input/joran/sift/unsetDefaultValueProperty.xml logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/PropertySetter.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/sift/Discriminator.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingAppenderBase.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PropertySetterTest.java Log: - It is now possible to declare a default class for a sub-component as an @annotation. Thus, it is no longer necessary to specify the class name as an xml attribute for sub-components - refactoring of sibling appender Modified: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/AccessEventDiscriminator.java ============================================================================== --- logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/AccessEventDiscriminator.java (original) +++ logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/AccessEventDiscriminator.java Mon Dec 22 23:18:36 2008 @@ -32,6 +32,7 @@ } String defaultValue; + String key; FieldName fieldName; String optionalKey; @@ -156,5 +157,13 @@ this.defaultValue = defaultValue; } + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + } Modified: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/SiftAction.java ============================================================================== --- logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/SiftAction.java (original) +++ logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/SiftAction.java Mon Dec 22 23:18:36 2008 @@ -36,7 +36,7 @@ Object o = ec.peekObject(); if (o instanceof SiftingAppender) { SiftingAppender siftingAppender = (SiftingAppender) o; - AppenderFactory appenderFactory = new AppenderFactory(context, seList, siftingAppender.getKeyName()); + AppenderFactory appenderFactory = new AppenderFactory(context, seList, siftingAppender.getDiscriminatorKey()); siftingAppender.setAppenderFactory(appenderFactory); } } Modified: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/SiftingAppender.java ============================================================================== --- logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/SiftingAppender.java (original) +++ logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/SiftingAppender.java Mon Dec 22 23:18:36 2008 @@ -10,9 +10,10 @@ package ch.qos.logback.access.sift; import ch.qos.logback.access.spi.AccessEvent; +import ch.qos.logback.core.joran.spi.DefaultClass; import ch.qos.logback.core.sift.AppenderTracker; +import ch.qos.logback.core.sift.Discriminator; import ch.qos.logback.core.sift.SiftingAppenderBase; -import ch.qos.logback.core.util.OptionHelper; /** * This appender can contains other appenders which it can build dynamically @@ -26,18 +27,9 @@ */ public class SiftingAppender extends SiftingAppenderBase<AccessEvent> { - String keyName; - @Override public void start() { - int errors = 0; - if (OptionHelper.isEmpty(keyName)) { - errors++; - addError("The \"keyName\" property must be set"); - } - if (errors == 0) { - super.start(); - } + super.start(); } AppenderTracker<AccessEvent> getAppenderTracker() { @@ -49,12 +41,9 @@ return event.getTimeStamp(); } - public String getKeyName() { - return keyName; - } - - public void setKeyName(String keyName) { - this.keyName = keyName; + @Override + @DefaultClass(AccessEventDiscriminator.class) + public void setDiscriminator(Discriminator<AccessEvent> discriminator) { + super.setDiscriminator(discriminator); } - } Modified: logback/trunk/logback-access/src/test/input/jetty/sifting.xml ============================================================================== --- logback/trunk/logback-access/src/test/input/jetty/sifting.xml (original) +++ logback/trunk/logback-access/src/test/input/jetty/sifting.xml Mon Dec 22 23:18:36 2008 @@ -1,13 +1,15 @@ <configuration> - <appender name="SIFTING" class="ch.qos.logback.access.sift.SiftingAppender"> - <KeyName>uri</KeyName> - <Discriminator class="ch.qos.logback.access.sift.AccessEventDiscriminator"> + <appender name="SIFTING" + class="ch.qos.logback.access.sift.SiftingAppender"> + + <Discriminator> + <Key>uri</Key> <FieldName>REQUEST_URI</FieldName> <DefaultValue>NA</DefaultValue> </Discriminator> <sift> - <appender name="${uri}" class="ch.qos.logback.core.read.ListAppender"/> + <appender name="${uri}" class="ch.qos.logback.core.read.ListAppender" /> </sift> </appender> Added: logback/trunk/logback-access/src/test/input/jetty/siftingFile.xml ============================================================================== --- (empty file) +++ logback/trunk/logback-access/src/test/input/jetty/siftingFile.xml Mon Dec 22 23:18:36 2008 @@ -0,0 +1,16 @@ +<configuration> + + <appender name="SIFTING" class="ch.qos.logback.access.sift.SiftingAppender"> + <KeyName>client</KeyName> + <Discriminator class="ch.qos.logback.access.sift.AccessEventDiscriminator"> + <DefaultValue>NA</DefaultValue> + <FieldName>REQUEST_URI</FieldName> + </Discriminator> + <sift> + <appender name="file-${client}" + class="ch.qos.logback.core.read.ListAppender" /> + </sift> + </appender> + + <appender-ref ref="SIFTING" /> +</configuration> \ No newline at end of file Modified: logback/trunk/logback-access/src/test/java/ch/qos/logback/access/sift/SiftingAppenderTest.java ============================================================================== --- logback/trunk/logback-access/src/test/java/ch/qos/logback/access/sift/SiftingAppenderTest.java (original) +++ logback/trunk/logback-access/src/test/java/ch/qos/logback/access/sift/SiftingAppenderTest.java Mon Dec 22 23:18:36 2008 @@ -25,6 +25,7 @@ import ch.qos.logback.access.spi.Util; import ch.qos.logback.core.read.ListAppender; import ch.qos.logback.core.testUtil.RandomUtil; +import ch.qos.logback.core.util.StatusPrinter; public class SiftingAppenderTest { static final String PREFIX = "src/test/input/jetty/"; @@ -51,11 +52,14 @@ rli.setFileName(PREFIX + "sifting.xml"); jettyFixture.start(); + + StatusPrinter.print(rli); invokeServer("/"); invokeServer("/x"); invokeServer("/x"); invokeServer("/y"); + SiftingAppender siftingAppender = (SiftingAppender) rli .getAppender("SIFTING"); List<String> keyList = siftingAppender.getAppenderTracker().keyList(); Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/MDCBasedDiscriminator.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/MDCBasedDiscriminator.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/MDCBasedDiscriminator.java Mon Dec 22 23:18:36 2008 @@ -13,21 +13,21 @@ import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.sift.Discriminator; +import ch.qos.logback.core.spi.ContextAwareBase; +import ch.qos.logback.core.util.OptionHelper; -public class MDCBasedDiscriminator implements Discriminator<LoggingEvent> { +public class MDCBasedDiscriminator extends ContextAwareBase implements Discriminator<LoggingEvent> { - final String mdcKey; - final String defaultValue; + String key; + String defaultValue; - boolean started = true; + boolean started = false; - MDCBasedDiscriminator(String mdcKey, String defaultValue) { - this.mdcKey = mdcKey; - this.defaultValue = defaultValue; + public MDCBasedDiscriminator() { } public String getDiscriminatingValue(LoggingEvent event) { - String mdcValue = MDC.get(mdcKey); + String mdcValue = MDC.get(key); if (mdcValue == null) { return defaultValue; } else { @@ -40,11 +40,54 @@ } public void start() { - started = true; + int errors = 0; + if (OptionHelper.isEmpty(key)) { + errors++; + addError("The \"Key\" property must be set"); + } + if (OptionHelper.isEmpty(defaultValue)) { + errors++; + addError("The \"DefaultValue\" property must be set"); + } + if (errors == 0) { + started = true; + } } public void stop() { started = false; } + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + /** + * @see #setDefaultValue(String) + * @return + */ + public String getDefaultValue() { + return defaultValue; + } + + /** + * The default MDC value in case the MDC is not set for + * {@link #setMdcKey(String) mdcKey}. + * + * <p> For example, if {@link #setMdcKey(String) mdcKey} is set to the value + * "someKey", and the MDC is not set for "someKey", then this appender will + * use the default value, which you can set with the help of method. + * + * @param defaultValue + */ + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + + + } Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftAction.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftAction.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftAction.java Mon Dec 22 23:18:36 2008 @@ -11,9 +11,9 @@ import ch.qos.logback.core.joran.spi.ActionException; import ch.qos.logback.core.joran.spi.InterpretationContext; -public class SiftAction extends Action implements InPlayListener { +public class SiftAction extends Action implements InPlayListener { List<SaxEvent> seList; - + @Override public void begin(InterpretationContext ec, String name, Attributes attributes) throws ActionException { @@ -26,22 +26,19 @@ ec.removeInPlayListener(this); Object o = ec.peekObject(); if (o instanceof SiftingAppender) { - SiftingAppender ha = (SiftingAppender) o; - AppenderFactory appenderFactory = new AppenderFactory(context, seList, ha.getMdcKey()); - ha.setAppenderFactory(appenderFactory); + SiftingAppender sa = (SiftingAppender) o; + AppenderFactory appenderFactory = new AppenderFactory(context, seList, sa + .getDiscriminatorKey()); + sa.setAppenderFactory(appenderFactory); } } public void inPlay(SaxEvent event) { seList.add(event); - System.out.println(event); } public List<SaxEvent> getSeList() { return seList; } - - - } Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingAppender.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingAppender.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingAppender.java Mon Dec 22 23:18:36 2008 @@ -10,9 +10,10 @@ package ch.qos.logback.classic.sift; import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.core.joran.spi.DefaultClass; import ch.qos.logback.core.sift.AppenderTracker; +import ch.qos.logback.core.sift.Discriminator; import ch.qos.logback.core.sift.SiftingAppenderBase; -import ch.qos.logback.core.util.OptionHelper; /** * This appender can contains other appenders which it can build dynamically @@ -26,71 +27,20 @@ */ public class SiftingAppender extends SiftingAppenderBase<LoggingEvent> { - - String mdcKey; - String defaultValue; - - - @Override - public void start() { - int errors = 0; - if (OptionHelper.isEmpty(mdcKey)) { - errors++; - addError("The \"mdcKey\" property must be set"); - } - if (OptionHelper.isEmpty(defaultValue)) { - errors++; - addError("The \"defaultValue\" property must be set"); - } - setDiscriminator(new MDCBasedDiscriminator(mdcKey, defaultValue)); - if (errors == 0) { - super.start(); - } - } - AppenderTracker<LoggingEvent> getAppenderTracker() { return appenderTracker; } - @Override protected long getTimestamp(LoggingEvent event) { return event.getTimeStamp(); } - - public String getMdcKey() { - return mdcKey; - } - - public void setMdcKey(String mdcKey) { - this.mdcKey = mdcKey; - } - - /** - * @see #setDefaultValue(String) - * @return - */ - public String getDefaultValue() { - return defaultValue; - } - /** - * The default MDC value in case the MDC is not set for - * {@link #setMdcKey(String) mdcKey}. - * - * <p> For example, if {@link #setMdcKey(String) mdcKey} is set to the value - * "someKey", and the MDC is not set for "someKey", then this appender will - * use the default value, which you can set with the help of method. - * - * <p>The "defaultValue" property is set to the value "DEFAULT" by default. - * - * @param defaultValue - */ - public void setDefaultValue(String defaultValue) { - this.defaultValue = defaultValue; + @Override + @DefaultClass(MDCBasedDiscriminator.class) + public void setDiscriminator(Discriminator<LoggingEvent> discriminator) { + super.setDiscriminator(discriminator); } - - } Modified: logback/trunk/logback-classic/src/test/input/joran/sift/completeCycle.xml ============================================================================== --- logback/trunk/logback-classic/src/test/input/joran/sift/completeCycle.xml (original) +++ logback/trunk/logback-classic/src/test/input/joran/sift/completeCycle.xml Mon Dec 22 23:18:36 2008 @@ -3,13 +3,15 @@ <configuration debug="true"> - <appender name="SIFT" - class="ch.qos.logback.classic.sift.SiftingAppender"> + <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> - <mdcKey>cycle</mdcKey> - <defaultValue>cycleDefault</defaultValue> + <discriminator> + <Key>cycle</Key> + <defaultValue>cycleDefault</defaultValue> + </discriminator> <sift> - <appender name="list-${cycle}" class="ch.qos.logback.core.read.ListAppender"/> + <appender name="list-${cycle}" + class="ch.qos.logback.core.read.ListAppender" /> </sift> </appender> Modified: logback/trunk/logback-classic/src/test/input/joran/sift/smoke.xml ============================================================================== --- logback/trunk/logback-classic/src/test/input/joran/sift/smoke.xml (original) +++ logback/trunk/logback-classic/src/test/input/joran/sift/smoke.xml Mon Dec 22 23:18:36 2008 @@ -3,13 +3,15 @@ <configuration debug="true"> - <appender name="SIFT" - class="ch.qos.logback.classic.sift.SiftingAppender"> + <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> - <mdcKey>userid</mdcKey> - <defaultValue>smoke</defaultValue> + <discriminator> + <Key>userid</Key> + <defaultValue>smoke</defaultValue> + </discriminator> <sift> - <appender name="list-${userid}" class="ch.qos.logback.core.read.ListAppender"/> + <appender name="list-${userid}" + class="ch.qos.logback.core.read.ListAppender" /> </sift> </appender> Modified: logback/trunk/logback-classic/src/test/input/joran/sift/unsetDefaultValueProperty.xml ============================================================================== --- logback/trunk/logback-classic/src/test/input/joran/sift/unsetDefaultValueProperty.xml (original) +++ logback/trunk/logback-classic/src/test/input/joran/sift/unsetDefaultValueProperty.xml Mon Dec 22 23:18:36 2008 @@ -3,12 +3,14 @@ <configuration debug="true"> - <appender name="SIFT" - class="ch.qos.logback.classic.sift.SiftingAppender"> + <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> - <mdcKey>userid</mdcKey> + <discriminator> + <Key>userid</Key> + </discriminator> <sift> - <appender name="list-${userid}" class="ch.qos.logback.core.read.ListAppender"/> + <appender name="list-${userid}" + class="ch.qos.logback.core.read.ListAppender" /> </sift> </appender> Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java Mon Dec 22 23:18:36 2008 @@ -47,9 +47,8 @@ public void unsetDefaultValueProperty() throws JoranException { configure(PREFIX + "unsetDefaultValueProperty.xml"); logger.debug("hello"); - SiftingAppender ha = (SiftingAppender) root.getAppender("SIFT"); - assertFalse(ha.isStarted()); - + SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT"); + assertFalse(sa.isStarted()); } @Test Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.java Mon Dec 22 23:18:36 2008 @@ -74,7 +74,7 @@ return true; default: - addError("PropertySetter.canContainComponent returned " + aggregationType); + addError("PropertySetter.computeAggregationType returned " + aggregationType); return false; } } @@ -87,9 +87,13 @@ .peek(); String className = attributes.getValue(CLASS_ATTRIBUTE); - // perform variable name substitution className = ec.subst(className); + if (className == null) { + PropertySetter parentBean = actionData.parentBean; + className = parentBean.getDefaultClassNameByAnnonation(actionData + .getComplexPropertyName(), actionData.getAggregationType()); + } if (OptionHelper.isEmpty(className)) { Class clazz = actionData.parentBean Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/DefaultClass.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/DefaultClass.java Mon Dec 22 23:18:36 2008 @@ -0,0 +1,21 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2008, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ +package ch.qos.logback.core.joran.spi; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface DefaultClass { + Class value(); +} Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/PropertySetter.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/PropertySetter.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/PropertySetter.java Mon Dec 22 23:18:36 2008 @@ -22,6 +22,7 @@ import java.beans.Introspector; import java.beans.MethodDescriptor; import java.beans.PropertyDescriptor; +import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -37,8 +38,7 @@ * the Object specified in the constructor. This class relies on the JavaBeans * {@link Introspector} to analyze the given Object Class using reflection. * - * <p> - * Usage: + * <p> Usage: * * <pre> * PropertySetter ps = new PropertySetter(anObject); @@ -97,11 +97,10 @@ * setter argument type and partly from the value specified in the call to * this method. * - * <p> - * If the setter expects a String no conversion is necessary. If it expects an - * int, then an attempt is made to convert 'value' to an int using new - * Integer(value). If the setter expects a boolean, the conversion is by new - * Boolean(value). + * <p> If the setter expects a String no conversion is necessary. If it + * expects an int, then an attempt is made to convert 'value' to an int using + * new Integer(value). If the setter expects a boolean, the conversion is by + * new Boolean(value). * * @param name * name of the property @@ -530,4 +529,36 @@ public Object getObj() { return obj; } + + public <T extends Annotation> T getAnnotation(String name, + Class<T> annonationClass, AggregationType aggregationType) { + String cName = capitalizeFirstLetter(name); + Method relevantMethod; + if (aggregationType == AggregationType.AS_COMPLEX_PROPERTY_COLLECTION) { + relevantMethod = getMethod("add" + cName); + } else if (aggregationType == AggregationType.AS_COMPLEX_PROPERTY) { + relevantMethod = findSetterMethod(cName); + } else { + throw new IllegalStateException(aggregationType + " not allowed here"); + } + if (relevantMethod != null) { + return relevantMethod.getAnnotation(annonationClass); + } else { + return null; + } + } + + public String getDefaultClassNameByAnnonation(String name, + AggregationType aggregationType) { + + DefaultClass defaultClassAnnon = getAnnotation(name, DefaultClass.class, + aggregationType); + if (defaultClassAnnon != null) { + Class defaultClass = defaultClassAnnon.value(); + if (defaultClass != null) { + return defaultClass.getName(); + } + } + return null; + } } Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/sift/Discriminator.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/sift/Discriminator.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/sift/Discriminator.java Mon Dec 22 23:18:36 2008 @@ -14,4 +14,5 @@ public interface Discriminator<E> extends LifeCycle { String getDiscriminatingValue(E e); + String getKey(); } Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingAppenderBase.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingAppenderBase.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingAppenderBase.java Mon Dec 22 23:18:36 2008 @@ -14,12 +14,11 @@ import ch.qos.logback.core.joran.spi.JoranException; /** - * This appender can contains other appenders which it can build dynamically - * depending on MDC values. The built appender is specified as part of a - * configuration file. - * - * <p>See the logback manual for further details. - * + * This appender serves as the base class for actual SiftingAppenders + * implemented by the logback-classic and logback-access modules. In a nutshell, + * a SiftingAppender contains other appenders which it can build dynamically + * depending on discriminating values supplied by event currently being + * processed. The built appender is specified as part of a configuration file. * * @author Ceki Gulcu */ @@ -28,23 +27,27 @@ protected AppenderTracker<E> appenderTracker = new AppenderTrackerImpl<E>(); AppenderFactoryBase<E> appenderFactory; - + Discriminator<E> discriminator; - + public void setAppenderFactory(AppenderFactoryBase<E> appenderFactory) { this.appenderFactory = appenderFactory; } @Override public void start() { - if(discriminator == null) { + int errors = 0; + if (discriminator == null) { addError("Missing discriminator. Aborting"); - return; + errors++; } - if(!discriminator.isStarted()) { + if (!discriminator.isStarted()) { addError("Discriminator has not started successfully. Aborting"); + errors++; + } + if (errors == 0) { + super.start(); } - super.start(); } @Override @@ -90,4 +93,12 @@ this.discriminator = discriminator; } + + public String getDiscriminatorKey() { + if(discriminator != null) { + return discriminator.getKey(); + } else { + return null; + } + } } Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PropertySetterTest.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PropertySetterTest.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PropertySetterTest.java Mon Dec 22 23:18:36 2008 @@ -180,6 +180,15 @@ setter.setProperty("houseColor", "BLUE"); assertEquals(HouseColor.BLUE, house.getHouseColor()); } + + + @Test + public void testDefaultClassAnnonation() { + House house = new House(); + PropertySetter setter = new PropertySetter(house); + String spClassName = setter.getDefaultClassNameByAnnonation("SwimmingPool", AggregationType.AS_COMPLEX_PROPERTY); + assertEquals(SwimmingPool.class.getName(), spClassName); + } } class House { @@ -237,6 +246,7 @@ this.open = open; } + @DefaultClass(SwimmingPool.class) public void setSwimmingPool(SwimmingPool pool) { this.pool = pool; }
participants (1)
-
noreply.ceki@qos.ch