
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Logback: the generic, reliable, fast and flexible logging framework.". The branch, master has been updated via c9f58e8f6a1372a08fef830ac1c3e8faa38c5abf (commit) from 199e8d6d8218c1bf526c224e867891110ac0ecbb (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=c9f58e8f6a1372a08fef830ac... http://github.com/ceki/logback/commit/c9f58e8f6a1372a08fef830ac1c3e8faa38c5a... commit c9f58e8f6a1372a08fef830ac1c3e8faa38c5abf Author: Ceki Gulcu <ceki@qos.ch> Date: Tue Mar 30 14:33:46 2010 +0200 all tests pass diff --git a/logback-classic/src/test/input/joran/conditional/conditionalConsoleApp_ELSE.xml b/logback-classic/src/test/input/joran/conditional/conditionalConsoleApp_ELSE.xml new file mode 100644 index 0000000..426fc24 --- /dev/null +++ b/logback-classic/src/test/input/joran/conditional/conditionalConsoleApp_ELSE.xml @@ -0,0 +1,41 @@ + +<configuration> + + <if condition='property("HOSTNAME").equals("XYZ87")'> + <then> + + <appender name="CON" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>%d %-5level %logger{35} - %msg %n</pattern> + </encoder> + </appender> + <root> + <appender-ref ref="CON" /> + </root> + + </then> + <else> + + <appender name="LIST" class="ch.qos.logback.core.read.ListAppender"/> + <root> + <appender-ref ref="LIST" /> + </root> + + </else> + </if> + + <appender name="FILE" class="ch.qos.logback.core.FileAppender"> + <file>${randomOutputDir}/conditional.log</file> + <encoder> + <pattern>%d %-5level %logger{35} - %msg %n</pattern> + </encoder> + </appender> + + <root level="ERROR"> + <appender-ref ref="FILE" /> + </root> + + + + +</configuration> \ No newline at end of file diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.java index 5b4b8c7..e9d6a07 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.java @@ -110,7 +110,7 @@ public class JaninoEventEvaluatorTest { String k = "key"+diff; MDC.put("key"+diff, "value"+diff); - jee.setExpression("mdc.get(\""+k+"\").contains(\"alue\")"); + jee.setExpression("((String) mdc.get(\""+k+"\")).contains(\"alue\")"); jee.start(); StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext); diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/joran/PackageTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/joran/PackageTest.java index 5ece151..8235d72 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/joran/PackageTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/joran/PackageTest.java @@ -17,8 +17,8 @@ import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; - @RunWith(Suite.class) -@SuiteClasses( { JoranConfiguratorTest.class, EvaluatorJoranTest.class}) +@SuiteClasses( { JoranConfiguratorTest.class, EvaluatorJoranTest.class, + ch.qos.logback.classic.joran.conditional.PackageTest.class }) public class PackageTest { } \ No newline at end of file diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/joran/conditional/ConditionalTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/joran/conditional/ConditionalTest.java index 0c1329c..be99ad2 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/joran/conditional/ConditionalTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/joran/conditional/ConditionalTest.java @@ -14,6 +14,8 @@ package ch.qos.logback.classic.joran.conditional; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import java.io.IOException; import java.net.InetAddress; @@ -29,6 +31,8 @@ import ch.qos.logback.classic.joran.JoranConfigurator; import ch.qos.logback.core.ConsoleAppender; import ch.qos.logback.core.FileAppender; import ch.qos.logback.core.joran.spi.JoranException; +import ch.qos.logback.core.read.ListAppender; +import ch.qos.logback.core.status.StatusChecker; import ch.qos.logback.core.testUtil.RandomUtil; import ch.qos.logback.core.util.CoreTestConstants; import ch.qos.logback.core.util.StatusPrinter; @@ -59,7 +63,7 @@ public class ConditionalTest { } @Test - public void conditionalConsoleApp() throws JoranException, IOException, + public void conditionalConsoleApp_THEN() throws JoranException, IOException, InterruptedException { String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX @@ -71,7 +75,33 @@ public class ConditionalTest { ConsoleAppender consoleAppender = (ConsoleAppender) root.getAppender("CON"); assertNotNull(consoleAppender); StatusPrinter.printIfErrorsOccured(context); + StatusChecker checker = new StatusChecker(context); + assertTrue(checker.isErrorFree()); + } + + @Test + public void conditionalConsoleApp_ELSE() throws JoranException, IOException, + InterruptedException { - + String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX + + "conditional/conditionalConsoleApp_ELSE.xml"; + configure(configFileAsStr); + + StatusPrinter.print(context); + + + FileAppender fileAppender = (FileAppender) root.getAppender("FILE"); + assertNotNull(fileAppender); + + ConsoleAppender consoleAppender = (ConsoleAppender) root.getAppender("CON"); + assertNull(consoleAppender); + + ListAppender listAppender = (ListAppender) root.getAppender("LIST"); + assertNotNull(listAppender); + + //StatusPrinter.printIfErrorsOccured(context); + StatusChecker checker = new StatusChecker(context); + assertTrue(checker.isErrorFree()); } + } diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/joran/PackageTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/joran/conditional/PackageTest.java similarity index 85% copy from logback-classic/src/test/java/ch/qos/logback/classic/joran/PackageTest.java copy to logback-classic/src/test/java/ch/qos/logback/classic/joran/conditional/PackageTest.java index 5ece151..3e1ecce 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/joran/PackageTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/joran/conditional/PackageTest.java @@ -11,7 +11,7 @@ * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ -package ch.qos.logback.classic.joran; +package ch.qos.logback.classic.joran.conditional; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -19,6 +19,6 @@ import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) -@SuiteClasses( { JoranConfiguratorTest.class, EvaluatorJoranTest.class}) +@SuiteClasses( { ConditionalTest.class}) public class PackageTest { } \ No newline at end of file diff --git a/logback-core/src/main/java/ch/qos/logback/core/joran/action/IncludeAction.java b/logback-core/src/main/java/ch/qos/logback/core/joran/action/IncludeAction.java index 51aa4df..befbdc3 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/joran/action/IncludeAction.java +++ b/logback-core/src/main/java/ch/qos/logback/core/joran/action/IncludeAction.java @@ -65,7 +65,8 @@ public class IncludeAction extends Action { // remove the <included> tag from the beginning and </included> from the end trimHeadAndTail(recorder); - ec.getJoranInterpreter().addEventsDynamically(recorder.saxEventList); + // offset = 2, because we need to get past this element as well as the end element + ec.getJoranInterpreter().addEventsDynamically(recorder.saxEventList, 2); } void close(InputStream in) { diff --git a/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/IfAction.java b/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/IfAction.java index 513d350..2c35649 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/IfAction.java +++ b/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/IfAction.java @@ -73,14 +73,12 @@ public class IfAction extends Action { listToPlay = elseSaxEventList; } - if (interpreter.pattern.peekLast().equals("if")) { - interpreter.pattern.pop(); - interpreter.play(listToPlay); - interpreter.pattern.push("if"); - } + // insert past this event + interpreter.addEventsDynamically(listToPlay, 1); } + public void setThenSaxEventList(List<SaxEvent> thenSaxEventList) { this.thenSaxEventList = thenSaxEventList; } diff --git a/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/PropertyEvalScriptBuilder.java b/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/PropertyEvalScriptBuilder.java index e29c414..64f7716 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/PropertyEvalScriptBuilder.java +++ b/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/PropertyEvalScriptBuilder.java @@ -9,7 +9,6 @@ import org.codehaus.janino.ClassBodyEvaluator; import org.codehaus.janino.CompileException; import org.codehaus.janino.Parser.ParseException; import org.codehaus.janino.Scanner.ScanException; -import org.junit.Before; import ch.qos.logback.core.spi.ContextAwareBase; @@ -24,7 +23,6 @@ public class PropertyEvalScriptBuilder extends ContextAwareBase { Map<String, String> map = new HashMap<String, String>(); - @Before public Condition build(String script) throws IllegalAccessException, CompileException, ParseException, ScanException, InstantiationException, SecurityException, NoSuchMethodException, IllegalArgumentException, diff --git a/logback-core/src/main/java/ch/qos/logback/core/joran/spi/EventPlayer.java b/logback-core/src/main/java/ch/qos/logback/core/joran/spi/EventPlayer.java index 7f383f6..528e4fd 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/joran/spi/EventPlayer.java +++ b/logback-core/src/main/java/ch/qos/logback/core/joran/spi/EventPlayer.java @@ -55,7 +55,7 @@ public class EventPlayer { } } - public void addEventsDynamically(List<SaxEvent> eventList) { - this.eventList.addAll(currentIndex+2, eventList); + public void addEventsDynamically(List<SaxEvent> eventList, int offset) { + this.eventList.addAll(currentIndex+offset, eventList); } } diff --git a/logback-core/src/main/java/ch/qos/logback/core/joran/spi/Interpreter.java b/logback-core/src/main/java/ch/qos/logback/core/joran/spi/Interpreter.java index a19603b..b720312 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/joran/spi/Interpreter.java +++ b/logback-core/src/main/java/ch/qos/logback/core/joran/spi/Interpreter.java @@ -72,7 +72,7 @@ public class Interpreter { final private InterpretationContext interpretationContext; final private ArrayList<ImplicitAction> implicitActions; final private CAI_WithLocatorSupport cai; - public Pattern pattern; + private Pattern pattern; Locator locator; EventPlayer player; @@ -102,17 +102,19 @@ public class Interpreter { actionListStack = new Stack<List>(); player = new EventPlayer(this); } - - public void setInterpretationContextPropertiesMap(Map<String, String> propertiesMap) { + + public void setInterpretationContextPropertiesMap( + Map<String, String> propertiesMap) { interpretationContext.setPropertiesMap(propertiesMap); } + /** * @deprecated replaced by {@link #getInterpretationContext()} */ public InterpretationContext getExecutionContext() { return getInterpretationContext(); } - + public InterpretationContext getInterpretationContext() { return interpretationContext; } @@ -149,9 +151,9 @@ public class Interpreter { cai.addError(errMsg); } } - + /** - * This method is used to + * This method is used to */ private void pushEmptyActionList() { actionListStack.add(EMPTY_LIST); @@ -179,10 +181,11 @@ public class Interpreter { } private void endElement(String namespaceURI, String localName, String qName) { - // given that an action list is always pushed for every startElement, we need + // given that an action list is always pushed for every startElement, we + // need // to always pop for every endElement List applicableActionList = (List) actionListStack.pop(); - + if (skip != null) { if (skip.equals(pattern)) { skip = null; @@ -248,7 +251,8 @@ public class Interpreter { // logger.debug("set of applicable patterns: " + applicableActionList); if (applicableActionList == null) { - applicableActionList = lookupImplicitAction(pattern, attributes, interpretationContext); + applicableActionList = lookupImplicitAction(pattern, attributes, + interpretationContext); } return applicableActionList; @@ -328,10 +332,33 @@ public class Interpreter { player.play(eventList); } - public void addEventsDynamically(List<SaxEvent> eventList) { + public void addEventsDynamically(List<SaxEvent> eventList, int offset) { if (player != null) { - player.addEventsDynamically(eventList); + player.addEventsDynamically(eventList, offset); + } + } + + /** + * Pop from the stack if the top most element matches 'name'. Returns whether + * the top most element matched. + * + * @param name + * @return whether the top most element matched 'name' + */ + public boolean popIfMatch(String name) { + boolean match = pattern.peekLast().equals(name); + if (match) { + pattern.pop(); } + return match; + } + + /** + * Intended for internal use. + * @param name + */ + public void patternPush(String name) { + pattern.push(name); } } ----------------------------------------------------------------------- Summary of changes: ...nsoleApp.xml => conditionalConsoleApp_ELSE.xml} | 36 ++++++++++----- .../classic/boolex/JaninoEventEvaluatorTest.java | 2 +- .../ch/qos/logback/classic/joran/PackageTest.java | 4 +- .../classic/joran/conditional/ConditionalTest.java | 34 +++++++++++++- .../classic/joran/conditional}/PackageTest.java | 8 ++-- .../logback/core/joran/action/IncludeAction.java | 3 +- .../logback/core/joran/conditional/IfAction.java | 8 +-- .../conditional/PropertyEvalScriptBuilder.java | 2 - .../ch/qos/logback/core/joran/spi/EventPlayer.java | 4 +- .../ch/qos/logback/core/joran/spi/Interpreter.java | 49 +++++++++++++++---- 10 files changed, 108 insertions(+), 42 deletions(-) copy logback-classic/src/test/input/joran/conditional/{conditionalConsoleApp.xml => conditionalConsoleApp_ELSE.xml} (71%) copy {logback-core/src/test/java/ch/qos/logback/core/helpers => logback-classic/src/test/java/ch/qos/logback/classic/joran/conditional}/PackageTest.java (87%) hooks/post-receive -- Logback: the generic, reliable, fast and flexible logging framework.