
Author: seb Date: Wed Dec 20 10:34:41 2006 New Revision: 1134 Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/Configurator.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/ConfiguratorMBean.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/boolex/JaninoEventEvaluatorBase.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/BindDataSourceToJNDIAction.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/html/HTMLLayoutBase.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AbstractEventEvaluatorAction.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AbstractLayoutAction.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderAction.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComponentIA.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/SimpleRuleStore.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutBase.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Compiler.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Parser.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/FileNamePattern.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/Loader.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/OptionHelper.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/AbstractPatternLayoutBaseTest.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/CompilerTest.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/SamplePatternLayoutTest.java Log: Added a JMCConfigurator that allows reload and level setting (->Work in progress) Refactored the way that we load classes: we now use the context's classloader. Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java Wed Dec 20 10:34:41 2006 @@ -13,10 +13,21 @@ import org.slf4j.LoggerFactory; import ch.qos.logback.core.ConsoleAppender; +import ch.qos.logback.core.status.InfoStatus; +import ch.qos.logback.core.status.StatusManager; public class BasicConfigurator { + final static BasicConfigurator hiddenSingleton = new BasicConfigurator(); + + private BasicConfigurator() { + } + public static void configure(LoggerContext lc) { + StatusManager sm = lc.getStatusManager(); + if(sm != null) { + sm.add(new InfoStatus("Setting up default configuration.", hiddenSingleton)); + } ConsoleAppender ca = new ConsoleAppender(); ca.setContext(lc); ca.setName("console"); Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/Configurator.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/Configurator.java Wed Dec 20 10:34:41 2006 @@ -0,0 +1,56 @@ +package ch.qos.logback.classic.jmx; + +import java.net.URL; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.classic.util.ContextInitializer; +import ch.qos.logback.core.joran.spi.JoranException; +import ch.qos.logback.core.spi.ContextAwareBase; + +public class Configurator extends ContextAwareBase implements + ConfiguratorMBean { + + public Configurator(LoggerContext loggerContext) { + this.context = loggerContext; + } + + public void reload() { + LoggerContext lc = (LoggerContext) context; + addInfo("Shutting down context: " + lc.getName()); + lc.shutdownAndReset(); + ContextInitializer.autoConfig(lc, lc.getClass().getClassLoader()); + addInfo("Context: " + lc.getName() + " reloaded."); + } + + public void reload(String fileName) throws JoranException { + LoggerContext lc = (LoggerContext) context; + JoranConfigurator configurator = new JoranConfigurator(); + configurator.setContext(lc); + configurator.doConfigure(fileName); + } + + public void reload(URL url) throws JoranException { + LoggerContext lc = (LoggerContext) context; + addInfo("Shutting down context: " + lc.getName()); + lc.shutdownAndReset(); + ContextInitializer.configureByResource(lc, url); + addInfo("Context: " + lc.getName() + " reloaded."); + } + + public void setLoggerLevel(String loggerName, String levelStr) { + LoggerContext lc = (LoggerContext) context; + Logger logger = lc.getLogger(loggerName); + if ("null".equalsIgnoreCase(levelStr)) { + logger.setLevel(null); + } else { + Level level = Level.toLevel(levelStr, null); + if (level != null) { + logger.setLevel(level); + } + } + } + +} Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/ConfiguratorMBean.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/ConfiguratorMBean.java Wed Dec 20 10:34:41 2006 @@ -0,0 +1,17 @@ +package ch.qos.logback.classic.jmx; + +import java.net.URL; + +import ch.qos.logback.core.joran.spi.JoranException; + +public interface ConfiguratorMBean { + + public void reload(); + + public void reload(String fileName) throws JoranException; + + public void reload(URL url) throws JoranException; + + public void setLoggerLevel(String loggerName, String levelStr); + +} Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java Wed Dec 20 10:34:41 2006 @@ -12,6 +12,7 @@ import ch.qos.logback.classic.joran.action.ConfigurationAction; import ch.qos.logback.classic.joran.action.EvaluatorAction; +import ch.qos.logback.classic.joran.action.JMXConfiguratorAction; import ch.qos.logback.classic.joran.action.LayoutAction; import ch.qos.logback.classic.joran.action.LevelAction; import ch.qos.logback.classic.joran.action.LoggerAction; @@ -55,6 +56,8 @@ rs .addRule(new Pattern("configuration/appender/layout"), new LayoutAction()); + + rs.addRule(new Pattern("configuration/jmxConfigurator"), new JMXConfiguratorAction()); } } Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java Wed Dec 20 10:34:41 2006 @@ -0,0 +1,51 @@ +package ch.qos.logback.classic.joran.action; + +import java.lang.management.ManagementFactory; + +import javax.management.MBeanServer; +import javax.management.ObjectName; + +import org.xml.sax.Attributes; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.jmx.Configurator; +import ch.qos.logback.classic.jmx.ConfiguratorMBean; +import ch.qos.logback.core.joran.action.Action; +import ch.qos.logback.core.joran.spi.ActionException; +import ch.qos.logback.core.joran.spi.InterpretationContext; + +public class JMXConfiguratorAction extends Action { + + static final String DOMAIN = "ch.qos.logback.classic"; + + @Override + public void begin(InterpretationContext ec, String name, Attributes attributes) + throws ActionException { + register(); + } + + @Override + public void end(InterpretationContext ec, String name) throws ActionException { + + } + + public void register() { + ConfiguratorMBean configuratorMBean = new Configurator((LoggerContext) context); + + MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + try { + ObjectName on = new ObjectName(DOMAIN + ":Name=" + context.getName() + + ",Type=" + configuratorMBean.getClass().getName()); + + // StandardMBean mbean = new StandardMBean(configuratorMBean, + // ConfiguratorMBean.class); + if (mbs.isRegistered(on)) { + mbs.unregisterMBean(on); + } + mbs.registerMBean(configuratorMBean, on); + } catch (Exception e) { + addError("Failed to create mbean", e); + } + } + +} Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java Wed Dec 20 10:34:41 2006 @@ -28,7 +28,7 @@ public class PatternLayoutTest extends AbstractPatternLayoutBaseTest { - LoggerContext lc = new LoggerContext(); + LoggerContext lc = new LoggerContext(); Logger logger = lc.getLogger(ConverterTest.class); LoggingEvent le; List optionList = new ArrayList(); @@ -118,4 +118,9 @@ suite.addTestSuite(PatternLayoutTest.class); return suite; } + + @Override + public Context getContext() { + return lc; + } } Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/boolex/JaninoEventEvaluatorBase.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/boolex/JaninoEventEvaluatorBase.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/boolex/JaninoEventEvaluatorBase.java Wed Dec 20 10:34:41 2006 @@ -48,8 +48,10 @@ public void start() { try { + assert context != null; + ClassLoader cl = context.getClass().getClassLoader(); ee = new ExpressionEvaluator(getDecoratedExpression(), EXPRESSION_TYPE, - getParameterNames(), getParameterTypes(), THROWN_EXCEPTIONS, null); + getParameterNames(), getParameterTypes(), THROWN_EXCEPTIONS, cl); start = true; } catch (Exception e) { addError( Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/BindDataSourceToJNDIAction.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/BindDataSourceToJNDIAction.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/BindDataSourceToJNDIAction.java Wed Dec 20 10:34:41 2006 @@ -55,7 +55,7 @@ try { DataSource ds = - (DataSource) OptionHelper.instantiateByClassName(dsClassName, DataSource.class); + (DataSource) OptionHelper.instantiateByClassName(dsClassName, DataSource.class, context); PropertySetter setter = new PropertySetter(ds); Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/html/HTMLLayoutBase.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/html/HTMLLayoutBase.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/html/HTMLLayoutBase.java Wed Dec 20 10:34:41 2006 @@ -71,9 +71,7 @@ try { Parser p = new Parser(pattern); - if (getContext() != null) { - p.setStatusManager(getContext().getStatusManager()); - } + p.setContext(getContext()); Node t = p.parse(); this.head = p.compile(t, getDefaultConverterMap()); DynamicConverter.startConverters(this.head); Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AbstractEventEvaluatorAction.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AbstractEventEvaluatorAction.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AbstractEventEvaluatorAction.java Wed Dec 20 10:34:41 2006 @@ -59,7 +59,7 @@ try { evaluator = (EventEvaluator) OptionHelper.instantiateByClassName( - className, ch.qos.logback.core.boolex.EventEvaluator.class); + className, ch.qos.logback.core.boolex.EventEvaluator.class, context); if(isOfCorrectType(evaluator)) { evaluator.setContext(this.context); Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AbstractLayoutAction.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AbstractLayoutAction.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AbstractLayoutAction.java Wed Dec 20 10:34:41 2006 @@ -38,7 +38,7 @@ try { layout = (Layout) OptionHelper.instantiateByClassName( - className, ch.qos.logback.core.Layout.class); + className, ch.qos.logback.core.Layout.class, context); if(isOfCorrectType(layout)) { layout.setContext(this.context); Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderAction.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderAction.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderAction.java Wed Dec 20 10:34:41 2006 @@ -43,7 +43,7 @@ addInfo("About to instantiate appender of type ["+className+"]"); appender = (Appender) OptionHelper.instantiateByClassName( - className, ch.qos.logback.core.Appender.class); + className, ch.qos.logback.core.Appender.class, context); appender.setContext(context); Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComponentIA.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComponentIA.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComponentIA.java Wed Dec 20 10:34:41 2006 @@ -103,7 +103,8 @@ // className); // FIXME: Loading classes should be governed by config file rules. - actionData.nestedComponent = Loader.loadClass(className).newInstance(); + + actionData.nestedComponent = Loader.loadClass(className, context).newInstance(); // pass along the repository if (actionData.nestedComponent instanceof ContextAware) { Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/SimpleRuleStore.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/SimpleRuleStore.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/SimpleRuleStore.java Wed Dec 20 10:34:41 2006 @@ -57,7 +57,7 @@ try { action = (Action) OptionHelper.instantiateByClassName( - actionClassName, Action.class); + actionClassName, Action.class, context); } catch(Exception e) { addError("Could not instantiate class ["+actionClassName+"]", e); } Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutBase.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutBase.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutBase.java Wed Dec 20 10:34:41 2006 @@ -72,7 +72,7 @@ try { Parser p = new Parser(pattern); if (getContext() != null) { - p.setStatusManager(getContext().getStatusManager()); + p.setContext(getContext()); } Node t = p.parse(); this.head = p.compile(t, getEffectiveConverterMap()); Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Compiler.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Compiler.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Compiler.java Wed Dec 20 10:34:41 2006 @@ -15,19 +15,17 @@ import ch.qos.logback.core.pattern.Converter; import ch.qos.logback.core.pattern.DynamicConverter; import ch.qos.logback.core.pattern.LiteralConverter; +import ch.qos.logback.core.spi.ContextAwareBase; import ch.qos.logback.core.status.ErrorStatus; -import ch.qos.logback.core.status.Status; -import ch.qos.logback.core.status.StatusManager; import ch.qos.logback.core.util.OptionHelper; -class Compiler { +class Compiler extends ContextAwareBase { Converter head; Converter tail; final Node top; final Map converterMap; - StatusManager statusManager; Compiler(final Node top, final Map converterMap) { this.top = top; @@ -45,8 +43,9 @@ CompositeNode cn = (CompositeNode) n; CompositeConverter compositeConverter = new CompositeConverter(); compositeConverter.setFormattingInfo(cn.getFormatInfo()); - Converter childConverter = new Compiler(cn.getChildNode(), converterMap) - .compile(); + Compiler childCompiler = new Compiler(cn.getChildNode(), converterMap); + childCompiler.setContext(context); + Converter childConverter = childCompiler.compile(); compositeConverter.setChildConverter(childConverter); addToList(compositeConverter); break; @@ -94,7 +93,7 @@ if (converterClassStr != null) { try { return (DynamicConverter) OptionHelper.instantiateByClassName( - converterClassStr, DynamicConverter.class); + converterClassStr, DynamicConverter.class, context); } catch (Exception e) { return null; } @@ -103,13 +102,13 @@ } } - public void setStatusManager(StatusManager statusManager) { - this.statusManager = statusManager; - } - - void addStatus(Status status) { - if(statusManager != null) { - statusManager.add(status); - } - } +// public void setStatusManager(StatusManager statusManager) { +// this.statusManager = statusManager; +// } +// +// void addStatus(Status status) { +// if(statusManager != null) { +// statusManager.add(status); +// } +// } } \ No newline at end of file Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Parser.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Parser.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Parser.java Wed Dec 20 10:34:41 2006 @@ -5,12 +5,11 @@ import ch.qos.logback.core.pattern.Converter; import ch.qos.logback.core.pattern.FormatInfo; -import ch.qos.logback.core.status.StatusManager; +import ch.qos.logback.core.spi.ContextAwareBase; -public class Parser { +public class Parser extends ContextAwareBase { - StatusManager statusManager; final List tokenList; int pointer = 0; @@ -42,7 +41,8 @@ */ public Converter compile(final Node top, Map converterMap) { Compiler compiler = new Compiler(top, converterMap); - compiler.setStatusManager(statusManager); + compiler.setContext(context); + //compiler.setStatusManager(statusManager); return compiler.compile(); } @@ -185,7 +185,7 @@ } } - public void setStatusManager(StatusManager statusManager) { - this.statusManager = statusManager; - } +// public void setStatusManager(StatusManager statusManager) { +// this.statusManager = statusManager; +// } } \ No newline at end of file Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/FileNamePattern.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/FileNamePattern.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/FileNamePattern.java Wed Dec 20 10:34:41 2006 @@ -53,7 +53,7 @@ void parse() { try { Parser p = new Parser(pattern); - p.setStatusManager(getStatusManager()); + p.setContext(context); Node t = p.parse(); this.headTokenConverter = p.compile(t, CONVERTER_MAP); Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/Loader.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/Loader.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/Loader.java Wed Dec 20 10:34:41 2006 @@ -11,6 +11,8 @@ import java.net.URL; +import ch.qos.logback.core.Context; + /** * Load resources (or images) from various sources. * @@ -31,6 +33,7 @@ } } + /** * This method will search for <code>resource</code> in different places. * The search order is as follows: @@ -74,6 +77,10 @@ return Thread.currentThread().getContextClassLoader(); } + public static Class loadClass(String clazz, Context context) throws ClassNotFoundException { + ClassLoader cl = context.getClass().getClassLoader(); + return cl.loadClass(clazz); + } /** * If running under JDK 1.2 load the specified class using the * <code>Thread</code> <code>contextClassLoader</code> if that fails try Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/OptionHelper.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/OptionHelper.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/OptionHelper.java Wed Dec 20 10:34:41 2006 @@ -11,6 +11,7 @@ import java.util.Map; +import ch.qos.logback.core.Context; import ch.qos.logback.core.CoreGlobal; /** @@ -18,8 +19,15 @@ */ public class OptionHelper { + public static Object instantiateByClassName(String className, + Class superClass, Context context) throws IncompatibleClassException, DynamicClassLoadingException { + ClassLoader classLoader = context.getClass().getClassLoader(); + return instantiateByClassName(className, superClass, classLoader); + } + @SuppressWarnings("unchecked") - public static Object instantiateByClassName(String className, Class superClass) + public static Object instantiateByClassName(String className, + Class superClass, ClassLoader classLoader) throws IncompatibleClassException, DynamicClassLoadingException { if (className == null) { @@ -27,15 +35,8 @@ } try { - // FIXME This is temporary (really!). Class classObj = null; - try { - classObj = Class.forName(className); - } catch (ClassNotFoundException e) { - ClassLoader cccl = Thread.currentThread().getContextClassLoader(); - classObj = cccl.loadClass(className); - } - + classObj = classLoader.loadClass(className); if (!superClass.isAssignableFrom(classObj)) { throw new IncompatibleClassException(superClass, classObj); } @@ -43,7 +44,8 @@ } catch (IncompatibleClassException ice) { throw ice; } catch (Throwable t) { - throw new DynamicClassLoadingException("Failed to instantiate type "+className, t); + throw new DynamicClassLoadingException("Failed to instantiate type " + + className, t); } } Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/AbstractPatternLayoutBaseTest.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/AbstractPatternLayoutBaseTest.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/AbstractPatternLayoutBaseTest.java Wed Dec 20 10:34:41 2006 @@ -28,6 +28,7 @@ abstract public PatternLayoutBase getPatternLayoutBase(); abstract public Object getEventObject(); + abstract public Context getContext(); public void testUnStarted() { PatternLayoutBase plb = getPatternLayoutBase(); @@ -46,6 +47,7 @@ */ public void testConverterStart() { PatternLayoutBase plb = getPatternLayoutBase(); + plb.setContext(getContext()); plb.getInstanceConverterMap().put("EX", ExceptionalConverter.class.getName()); plb.setPattern("%EX"); plb.start(); Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/CompilerTest.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/CompilerTest.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/CompilerTest.java Wed Dec 20 10:34:41 2006 @@ -13,21 +13,20 @@ import java.util.Map; import junit.framework.TestCase; - -import ch.qos.logback.core.BasicStatusManager; +import ch.qos.logback.core.Context; +import ch.qos.logback.core.ContextBase; import ch.qos.logback.core.pattern.Converter; import ch.qos.logback.core.pattern.Converter123; import ch.qos.logback.core.pattern.ConverterHello; -import ch.qos.logback.core.pattern.parser.Node; -import ch.qos.logback.core.pattern.parser.Parser; import ch.qos.logback.core.status.StatusChecker; -import ch.qos.logback.core.status.StatusManager; +import ch.qos.logback.core.util.StatusPrinter; public class CompilerTest extends TestCase { Map<String, String> converterMap = new HashMap<String, String>(); - + Context context = new ContextBase(); + public CompilerTest(String arg0) { super(arg0); converterMap.put("OTT", Converter123.class.getName()); @@ -63,6 +62,7 @@ public void testBasic() throws Exception { { Parser p = new Parser("abc %hello"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -70,6 +70,7 @@ } { Parser p = new Parser("abc %hello %OTT"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -80,6 +81,7 @@ public void testFormat() throws Exception { { Parser p = new Parser("abc %7hello"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -88,6 +90,7 @@ { Parser p = new Parser("abc %-7hello"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -96,6 +99,7 @@ { Parser p = new Parser("abc %.3hello"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -104,6 +108,7 @@ { Parser p = new Parser("abc %.-3hello"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -112,6 +117,7 @@ { Parser p = new Parser("abc %4.5OTT"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -119,6 +125,7 @@ } { Parser p = new Parser("abc %-4.5OTT"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -126,6 +133,7 @@ } { Parser p = new Parser("abc %3.4hello"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -133,6 +141,7 @@ } { Parser p = new Parser("abc %-3.-4hello"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -141,22 +150,27 @@ } public void testComposite() throws Exception { +// { +// Parser p = new Parser("%(ABC)"); +// p.setContext(context); +// Node t = p.parse(); +// Converter head = p.compile(t, converterMap); +// String result = write(head, new Object()); +// assertEquals("ABC", result); +// } { - Parser p = new Parser("%(ABC)"); - Node t = p.parse(); - Converter head = p.compile(t, converterMap); - String result = write(head, new Object()); - assertEquals("ABC", result); - } - { + Context c = new ContextBase(); Parser p = new Parser("%(ABC %hello)"); + p.setContext(c); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); + StatusPrinter.print(c); assertEquals("ABC Hello", result); } { Parser p = new Parser("%(ABC %hello)"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -167,6 +181,7 @@ public void testCompositeFormatting() throws Exception { { Parser p = new Parser("xyz %4.10(ABC)"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -175,6 +190,7 @@ { Parser p = new Parser("xyz %-4.10(ABC)"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -183,6 +199,7 @@ { Parser p = new Parser("xyz %.2(ABC %hello)"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -191,6 +208,7 @@ { Parser p = new Parser("xyz %.-2(ABC)"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -199,6 +217,7 @@ { Parser p = new Parser("xyz %30.30(ABC %20hello)"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); @@ -208,11 +227,10 @@ public void testUnknownWord() throws Exception { Parser p = new Parser("%unknown"); - StatusManager sm = new BasicStatusManager(); - p.setStatusManager(sm); + p.setContext(context); Node t = p.parse(); p.compile(t, converterMap); - StatusChecker chercker = new StatusChecker(sm); + StatusChecker chercker = new StatusChecker(context.getStatusManager()); assertTrue(chercker .containsMatch("\\[unknown] is not a valid conversion word")); } @@ -220,6 +238,7 @@ public void testWithNopEscape() throws Exception { { Parser p = new Parser("xyz %hello\\_world"); + p.setContext(context); Node t = p.parse(); Converter head = p.compile(t, converterMap); String result = write(head, new Object()); Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/SamplePatternLayoutTest.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/SamplePatternLayoutTest.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/SamplePatternLayoutTest.java Wed Dec 20 10:34:41 2006 @@ -16,10 +16,12 @@ public class SamplePatternLayoutTest extends AbstractPatternLayoutBaseTest { + Context context = new ContextBase(); public SamplePatternLayoutTest(String arg) { super(arg); } + public PatternLayoutBase getPatternLayoutBase() { return new SamplePatternLayout(); } @@ -42,4 +44,9 @@ assertEquals("x123", s); } + + @Override + public Context getContext() { + return context; + } }