ceki 2004/12/28 15:08:12 Modified: src/java/org/apache/log4j/spi LoggerRepository.java src/java/org/apache/log4j Hierarchy.java Layout.java AppenderSkeleton.java PatternLayout.java src/java/org/apache/log4j/joran/action ConversionRuleAction.java AppenderAction.java LayoutAction.java src/java/org/apache/joran ExecutionContext.java tests/src/java/org/apache/joran InterpreterTest.java tests/input/joran conversionRule.xml tests/src/java/org/apache/log4j PatternLayoutTest.java src/java/org/apache/log4j/joran JoranConfigurator.java Added: examples/src/pattern LearnNewWord.java log4j-config.xml Removed: tests/input/pattern patternLayout14.properties examples/src/pattern MyPatternLayout.java Log: - New conversion words can be easily added to PatternLayout using configuration files. - These conversion words will be shared by all instances of PatternLayout (work in progress.) Revision Changes Path 1.22 +17 -0 logging-log4j/src/java/org/apache/log4j/spi/LoggerRepository.java Index: LoggerRepository.java =================================================================== RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/spi/LoggerRepository.java,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- LoggerRepository.java 24 Nov 2004 08:17:01 -0000 1.21 +++ LoggerRepository.java 28 Dec 2004 23:08:11 -0000 1.22 @@ -209,4 +209,21 @@ * @return List */ public void addErrorItem(ErrorItem errorItem); + + /** + * A LoggerRepository can also act as a store for various objects used + * by log4j components. + * + * @return The object stored under 'key'. + * @since 1.3 + */ + public Object getObject(String key); + + /** + * Store an object under 'key'. If no object can be found, null is returned. + * + * @param key + * @param value + */ + public void putObject(String key, Object value); } 1.59 +15 -1 logging-log4j/src/java/org/apache/log4j/Hierarchy.java Index: Hierarchy.java =================================================================== RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/Hierarchy.java,v retrieving revision 1.58 retrieving revision 1.59 diff -u -r1.58 -r1.59 --- Hierarchy.java 4 Dec 2004 07:47:04 -0000 1.58 +++ Hierarchy.java 28 Dec 2004 23:08:12 -0000 1.59 @@ -36,6 +36,7 @@ import java.util.ArrayList; import java.util.Enumeration; +import java.util.HashMap; import java.util.Hashtable; import java.util.List; import java.util.Map; @@ -84,6 +85,10 @@ Map properties; private Scheduler scheduler; + // The repository can also be used as an object store for various objects used + // by log4j components + private Map objectMap; + // the internal logger used by this instance of Hierarchy for its own reporting private Logger myLogger; @@ -104,7 +109,7 @@ repositoryEventListeners = new ArrayList(1); loggerEventListeners = new ArrayList(1); this.root = root; - + this.objectMap = new HashMap(); // Enable all level levels by default. setThreshold(Level.ALL); this.root.setHierarchy(this); @@ -791,4 +796,13 @@ } return scheduler; } + + public void putObject(String key, Object value) { + objectMap.put(key, value); + } + + public Object getObject(String key) { + return objectMap.get(key); + } + } 1.13 +1 -1 logging-log4j/src/java/org/apache/log4j/Layout.java Index: Layout.java =================================================================== RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/Layout.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- Layout.java 28 Dec 2004 18:25:57 -0000 1.12 +++ Layout.java 28 Dec 2004 23:08:12 -0000 1.13 @@ -166,7 +166,7 @@ if(repository == null) { throw new IllegalArgumentException("repository argument cannot be null"); } - if(this.repository != null) { + if(this.repository == null) { this.repository = repository; } else { throw new IllegalStateException("Repository has been already set"); 1.32 +1 -1 logging-log4j/src/java/org/apache/log4j/AppenderSkeleton.java Index: AppenderSkeleton.java =================================================================== RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/AppenderSkeleton.java,v retrieving revision 1.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- AppenderSkeleton.java 28 Dec 2004 18:25:57 -0000 1.31 +++ AppenderSkeleton.java 28 Dec 2004 23:08:12 -0000 1.32 @@ -334,7 +334,7 @@ if(repository == null) { throw new IllegalArgumentException("repository argument cannot be null"); } - if(this.repository != null) { + if(this.repository == null) { this.repository = repository; } else { throw new IllegalStateException("Repository has been already set"); 1.34 +11 -27 logging-log4j/src/java/org/apache/log4j/PatternLayout.java Index: PatternLayout.java =================================================================== RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/PatternLayout.java,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- PatternLayout.java 21 Dec 2004 04:19:46 -0000 1.33 +++ PatternLayout.java 28 Dec 2004 23:08:12 -0000 1.34 @@ -18,7 +18,7 @@ import java.io.IOException; import java.io.Writer; -import java.util.HashMap; +import java.util.Map; import org.apache.log4j.pattern.PatternConverter; import org.apache.log4j.pattern.PatternParser; @@ -415,10 +415,16 @@ public static final String TTCC_CONVERSION_PATTERN = "%r [%t] %p %c %x - %m%n"; + /** + * Customized pattern conversion rules are stored under this key in the + * [EMAIL PROTECTED] LoggerRepository} object store. + */ + public static final String PATTERN_RULE_REGISTRY = "PATTERN_RULE_REGISTRY"; + private String conversionPattern; private PatternConverter head; - private HashMap ruleRegistry = null; + private boolean handlesExceptions; /** @@ -437,30 +443,6 @@ this.conversionPattern = pattern; activateOptions(); } - - /** - * - * Add a new conversion word and associate it with a - * [EMAIL PROTECTED] org.apache.log4j.pattern.PatternConverter PatternConverter} class. - * - * @param conversionWord New conversion word to accept in conversion patterns - * @param converterClass The class name associated with the conversion word - * @since 1.3 - */ - public void addConversionRule(String conversionWord, String converterClass) { - if(ruleRegistry == null) { - ruleRegistry = new HashMap(5); - } - ruleRegistry.put(conversionWord, converterClass); - } - - /** - * Returns the rule registry specific for this PatternLayout instance. - * @since 1.3 - */ - public HashMap getRuleRegistry() { - return ruleRegistry; - } /** Set the <b>ConversionPattern</b> option. This is the string which @@ -484,7 +466,9 @@ */ public void activateOptions() { PatternParser patternParser = new PatternParser(conversionPattern); - patternParser.setConverterRegistry(ruleRegistry); + if(this.repository != null) { + patternParser.setConverterRegistry((Map) this.repository.getObject(PATTERN_RULE_REGISTRY)); + } head = patternParser.parse(); handlesExceptions = PatternConverter.chainHandlesThrowable(head); } 1.1 logging-log4j/examples/src/pattern/LearnNewWord.java Index: LearnNewWord.java =================================================================== /* * Copyright 1999,2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package pattern; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.apache.log4j.joran.JoranConfigurator; /** * * Example showing how to extend PatternLayout to recognize additional * conversion words without through a configuration file. * * <p>In this case have PatternLayout recognize %counter conversion word. * It outputs the value of an internal counter which is also incremented at * each call. * * @author Ceki Gülcü */ public class LearnNewWord { public static void main(String[] args) { if (args.length != 1) { System.err.println("Usage: java " + LearnNewWord.class.getName() + " configFile"); } JoranConfigurator joran = new JoranConfigurator(); joran.doConfigure(args[0], LogManager.getLoggerRepository()); joran.dumpErrors(); Logger logger = Logger.getLogger("some.cat"); logger.debug("Hello, log"); logger.info("Hello again..."); } } 1.1 logging-log4j/examples/src/pattern/log4j-config.xml Index: log4j-config.xml =================================================================== <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration> <configuration xmlns="http://logging.apache.org/"> <!-- teach log4j a new conversion word --> <conversionRule conversionWord="counter" converterClass="pattern.CountingPatternConverter"/> <!-- the new conversion word is available for immediate use --> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%3.10counter] - %m%n"/> </layout> </appender> <root> <appender-ref ref="CONSOLE"/> </root> </configuration> 1.12 +13 -6 logging-log4j/src/java/org/apache/log4j/joran/action/ConversionRuleAction.java Index: ConversionRuleAction.java =================================================================== RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/joran/action/ConversionRuleAction.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- ConversionRuleAction.java 28 Dec 2004 16:33:57 -0000 1.11 +++ ConversionRuleAction.java 28 Dec 2004 23:08:12 -0000 1.12 @@ -16,6 +16,9 @@ package org.apache.log4j.joran.action; +import java.util.HashMap; +import java.util.Map; + import org.apache.joran.ExecutionContext; import org.apache.joran.action.Action; import org.apache.joran.helper.Option; @@ -23,6 +26,7 @@ import org.apache.log4j.Layout; import org.apache.log4j.PatternLayout; import org.apache.log4j.spi.ErrorItem; +import org.apache.log4j.spi.LoggerRepository; import org.xml.sax.Attributes; @@ -66,15 +70,18 @@ try { getLogger().debug( - "About to add conversion rule [" + conversionWord + ", " - + converterClass + "] to layout"); + "About to add conversion rule [{}, {}] to layout", conversionWord, converterClass); - Object o = ec.peekObject(); + LoggerRepository repository = (LoggerRepository) ec.getObjectStack().get(0); - if (o instanceof PatternLayout) { - PatternLayout patternLayout = (PatternLayout) o; - patternLayout.addConversionRule(conversionWord, converterClass); + Map ruleRegistry = (Map) repository.getObject(PatternLayout.PATTERN_RULE_REGISTRY); + if(ruleRegistry == null) { + ruleRegistry = new HashMap(); + repository.putObject(PatternLayout.PATTERN_RULE_REGISTRY, ruleRegistry); } + // put the new rule into the rule registry + ruleRegistry.put(conversionWord, converterClass); + } catch (Exception oops) { inError = true; errorMsg = "Could not add conversion rule to PatternLayout."; 1.14 +4 -0 logging-log4j/src/java/org/apache/log4j/joran/action/AppenderAction.java Index: AppenderAction.java =================================================================== RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/joran/action/AppenderAction.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- AppenderAction.java 28 Dec 2004 16:33:57 -0000 1.13 +++ AppenderAction.java 28 Dec 2004 23:08:12 -0000 1.14 @@ -22,6 +22,7 @@ import org.apache.log4j.Appender; import org.apache.log4j.helpers.OptionConverter; import org.apache.log4j.spi.ErrorItem; +import org.apache.log4j.spi.LoggerRepository; import org.apache.log4j.spi.OptionHandler; import org.xml.sax.Attributes; @@ -53,6 +54,9 @@ className, org.apache.log4j.Appender.class, null); appender = (Appender) instance; + LoggerRepository repo = (LoggerRepository) ec.getObjectStack().get(0); + appender.setLoggerRepository(repo); + String appenderName = attributes.getValue(NAME_ATTRIBUTE); if (Option.isEmpty(appenderName)) { 1.13 +5 -1 logging-log4j/src/java/org/apache/log4j/joran/action/LayoutAction.java Index: LayoutAction.java =================================================================== RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/joran/action/LayoutAction.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- LayoutAction.java 28 Dec 2004 16:33:57 -0000 1.12 +++ LayoutAction.java 28 Dec 2004 23:08:12 -0000 1.13 @@ -23,6 +23,7 @@ import org.apache.log4j.Layout; import org.apache.log4j.helpers.OptionConverter; import org.apache.log4j.spi.ErrorItem; +import org.apache.log4j.spi.LoggerRepository; import org.apache.log4j.spi.OptionHandler; import org.xml.sax.Attributes; @@ -49,7 +50,10 @@ OptionConverter.instantiateByClassName( className, org.apache.log4j.Layout.class, null); layout = (Layout) instance; - + + LoggerRepository repo = (LoggerRepository) ec.getObjectStack().get(0); + layout.setLoggerRepository(repo); + getLogger().debug("Pushing layout on top of the object stack."); ec.pushObject(layout); } catch (Exception oops) { 1.15 +3 -2 logging-log4j/src/java/org/apache/joran/ExecutionContext.java Index: ExecutionContext.java =================================================================== RCS file: /home/cvs/logging-log4j/src/java/org/apache/joran/ExecutionContext.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- ExecutionContext.java 22 Nov 2004 20:21:01 -0000 1.14 +++ ExecutionContext.java 28 Dec 2004 23:08:12 -0000 1.15 @@ -25,6 +25,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.Stack; import java.util.Vector; @@ -40,7 +41,7 @@ */ public class ExecutionContext { Stack objectStack; - HashMap objectMap; + Map objectMap; Vector errorList; Properties substitutionProperties; Interpreter joranInterpreter; @@ -107,7 +108,7 @@ return objectStack.get(i); } - public HashMap getObjectMap() { + public Map getObjectMap() { return objectMap; } 1.13 +12 -7 logging-log4j/tests/src/java/org/apache/joran/InterpreterTest.java Index: InterpreterTest.java =================================================================== RCS file: /home/cvs/logging-log4j/tests/src/java/org/apache/joran/InterpreterTest.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- InterpreterTest.java 8 Dec 2004 15:58:18 -0000 1.12 +++ InterpreterTest.java 28 Dec 2004 23:08:12 -0000 1.13 @@ -52,9 +52,11 @@ import org.apache.log4j.rolling.SizeBasedTriggeringPolicy; import org.apache.log4j.rolling.FixedWindowRollingPolicy; import org.apache.log4j.spi.ErrorItem; +import org.apache.log4j.spi.LoggerRepository; import org.xml.sax.SAXParseException; import java.util.HashMap; +import java.util.Map; import java.util.Stack; import javax.xml.parsers.SAXParser; @@ -175,7 +177,7 @@ Interpreter jp = new Interpreter(rs); ExecutionContext ec = jp.getExecutionContext(); - HashMap omap = ec.getObjectMap(); + Map omap = ec.getObjectMap(); omap.put(ActionConst.APPENDER_BAG, new HashMap()); ec.pushObject(LogManager.getLoggerRepository()); SAXParser saxParser = createParser(); @@ -231,7 +233,7 @@ Interpreter jp = new Interpreter(rs); ExecutionContext ec = jp.getExecutionContext(); - HashMap omap = ec.getObjectMap(); + Map omap = ec.getObjectMap(); omap.put(ActionConst.APPENDER_BAG, new HashMap()); ec.pushObject(LogManager.getLoggerRepository()); SAXParser saxParser = createParser(); @@ -295,7 +297,7 @@ jp.addImplicitAction(new NestComponentIA()); ExecutionContext ec = jp.getExecutionContext(); - HashMap omap = ec.getObjectMap(); + Map omap = ec.getObjectMap(); omap.put(ActionConst.APPENDER_BAG, new HashMap()); ec.pushObject(LogManager.getLoggerRepository()); logger.debug("About to parse doc"); @@ -340,9 +342,10 @@ jp.addImplicitAction(new NestComponentIA()); ExecutionContext ec = jp.getExecutionContext(); - HashMap omap = ec.getObjectMap(); + Map omap = ec.getObjectMap(); omap.put(ActionConst.APPENDER_BAG, new HashMap()); - ec.pushObject(LogManager.getLoggerRepository()); + LoggerRepository repository = LogManager.getLoggerRepository(); + ec.pushObject(repository); SAXParser saxParser = createParser(); saxParser.parse("file:input/joran/conversionRule.xml", jp); @@ -351,7 +354,9 @@ (HashMap) ec.getObjectMap().get(ActionConst.APPENDER_BAG); Appender appender = (Appender) appenderBag.get("A1"); PatternLayout pl = (PatternLayout) appender.getLayout(); - assertEquals("org.apache.log4j.toto", pl.getRuleRegistry().get("toto")); + + Map ruleRegistry = (Map) repository.getObject(PatternLayout.PATTERN_RULE_REGISTRY); + assertEquals("org.apache.log4j.toto", ruleRegistry.get("toto")); } @@ -367,7 +372,7 @@ Interpreter jp = new Interpreter(rs); ExecutionContext ec = jp.getExecutionContext(); - HashMap omap = ec.getObjectMap(); + Map omap = ec.getObjectMap(); SAXParser saxParser = createParser(); saxParser.parse("file:input/joran/newRule1.xml", jp); 1.3 +3 -1 logging-log4j/tests/input/joran/conversionRule.xml Index: conversionRule.xml =================================================================== RCS file: /home/cvs/logging-log4j/tests/input/joran/conversionRule.xml,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- conversionRule.xml 8 Dec 2004 18:49:24 -0000 1.2 +++ conversionRule.xml 28 Dec 2004 23:08:12 -0000 1.3 @@ -2,6 +2,9 @@ <!DOCTYPE log4j:configuration> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> + + <conversionRule conversionWord="toto" converterClass="org.apache.log4j.toto"/> + <appender name="A1" class="org.apache.log4j.rolling.RollingFileAppender"> <param name="File" value="output/temp.A1" /> <param name="Append" value="false" /> @@ -14,7 +17,6 @@ </triggeringPolicy> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %c{2} - %m%n"/> - <conversionRule conversionWord="toto" converterClass="org.apache.log4j.toto"/> </layout> </appender> </log4j:configuration> 1.8 +0 -16 logging-log4j/tests/src/java/org/apache/log4j/PatternLayoutTest.java Index: PatternLayoutTest.java =================================================================== RCS file: /home/cvs/logging-log4j/tests/src/java/org/apache/log4j/PatternLayoutTest.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- PatternLayoutTest.java 20 Nov 2004 12:59:51 -0000 1.7 +++ PatternLayoutTest.java 28 Dec 2004 23:08:12 -0000 1.8 @@ -287,22 +287,6 @@ assertTrue(Compare.compare(FILTERED, "witness/pattern/patternLayout.13")); } - public void test14() throws Exception { - PropertyConfigurator.configure("input/pattern/patternLayout14.properties"); - common(); - - ControlFilter cf1 = - new ControlFilter( - new String[] { PAT14, EXCEPTION1, EXCEPTION2, EXCEPTION3 }); - Transformer.transform( - TEMP, FILTERED, - new Filter[] { - cf1, new LineNumberFilter(), new SunReflectFilter(), - new JunitTestRunnerFilter() - }); - assertTrue(Compare.compare(FILTERED, "witness/pattern/patternLayout.14")); - } - public void testMDC1() throws Exception { PropertyConfigurator.configure("input/pattern/patternLayout.mdc.1.properties"); MDC.put("key1", "va11"); 1.30 +5 -4 logging-log4j/src/java/org/apache/log4j/joran/JoranConfigurator.java Index: JoranConfigurator.java =================================================================== RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/joran/JoranConfigurator.java,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- JoranConfigurator.java 17 Dec 2004 19:58:58 -0000 1.29 +++ JoranConfigurator.java 28 Dec 2004 23:08:12 -0000 1.30 @@ -56,6 +56,7 @@ import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; @@ -194,6 +195,9 @@ rs.addRule( new Pattern("configuration/repositoryProperty"), new RepositoryPropertyAction()); + rs.addRule( + new Pattern("configuration/conversionRule"), + new ConversionRuleAction()); rs.addRule(new Pattern("configuration/plugin"), new PluginAction()); rs.addRule(new Pattern("configuration/logger"), new LoggerAction()); rs.addRule( @@ -218,9 +222,6 @@ new AppenderRefAction()); rs.addRule( new Pattern("configuration/appender/layout"), new LayoutAction()); - rs.addRule( - new Pattern("configuration/appender/layout/conversionRule"), - new ConversionRuleAction()); rs.addRule( new Pattern("configuration/jndiSubstitutionProperty"), new JndiSubstitutionPropertyAction()); @@ -234,7 +235,7 @@ joranInterpreter.addImplicitAction(new NestComponentIA()); ExecutionContext ec = joranInterpreter.getExecutionContext(); - HashMap omap = ec.getObjectMap(); + Map omap = ec.getObjectMap(); omap.put(ActionConst.APPENDER_BAG, new HashMap()); }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]