svn commit: r754 - in logback/trunk/logback-core/src: main/java/ch/qos/logback/core/joran/action main/java/ch/qos/logback/core/joran/spi test/java/ch/qos/logback/core/joran/replay test/java/ch/qos/logback/core/joran/spi

Author: ceki Date: Tue Oct 24 15:16:58 2006 New Revision: 754 Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedSimplePropertyIA.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/InterpretationContext.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/Pattern.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/SimpleRuleStore.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/replay/FruitConfigurationTest.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PatternTest.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/SimpleStoreTest.java Log: - fixed bug where the pattern "a/b/*" incorrectly matched "a/other". - also fixed bug whereby if there was no object at the top of the stack, NestedComponentIA and NestedSimplePropertyIA would barf with an EmptryStackException Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedSimplePropertyIA.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedSimplePropertyIA.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedSimplePropertyIA.java Tue Oct 24 15:16:58 2006 @@ -45,6 +45,11 @@ //LogLog.debug("in NestComponentIA.isApplicable <" + pattern + ">"); String nestedElementTagName = pattern.peekLast(); + // no point in attempting if there is no parent object + if(ec.isEmpty()) { + return false; + } + Object o = ec.peekObject(); PropertySetter parentBean = new PropertySetter(o); Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/InterpretationContext.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/InterpretationContext.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/InterpretationContext.java Tue Oct 24 15:16:58 2006 @@ -71,6 +71,10 @@ return objectStack; } + public boolean isEmpty() { + return objectStack.isEmpty(); + } + public Object peekObject() { return objectStack.peek(); } Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/Pattern.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/Pattern.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/Pattern.java Tue Oct 24 15:16:58 2006 @@ -154,7 +154,8 @@ String l = (String) this.components.get(i); String r = (String) p.components.get(i); - if (l.equals(r) || "*".equals(l) || "*".equals(r)) { + //if (l.equals(r) || "*".equals(l) || "*".equals(r)) { + if (l.equals(r)) { match++; } else { break; 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 Tue Oct 24 15:16:58 2006 @@ -82,6 +82,7 @@ } else if ( (actionList = tailMatch(currentPattern)) != null){ return actionList; } else if ((actionList = prefixMatch(currentPattern)) != null) { + //System.out.println(currentPattern + " prefixMatches "+actionList); return actionList; } else { return null; @@ -121,9 +122,11 @@ String last = p.peekLast(); if("*".equals(last)) { int r = currentPattern.getPrefixMatchLength(p); - - //System.out.println("prefixMatch " +r); - if (r > max) { + + //System.out.println("r = "+ r + ", p= "+p); + + // to qualify the match length must equal p's size omitting the '*' + if ((r == p.size()-1) && (r > max)) { //System.out.println("New longest prefixMatch "+p); max = r; longestMatchingPattern = p; Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/replay/FruitConfigurationTest.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/replay/FruitConfigurationTest.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/replay/FruitConfigurationTest.java Tue Oct 24 15:16:58 2006 @@ -8,6 +8,7 @@ import junit.framework.TestSuite; import ch.qos.logback.core.joran.action.Action; import ch.qos.logback.core.joran.action.NOPAction; +import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.joran.spi.Pattern; import ch.qos.logback.core.util.Constants; import ch.qos.logback.core.util.StatusPrinter; @@ -30,19 +31,24 @@ public List<FruitShell> doFirstPart(String filename) throws Exception { - HashMap<Pattern, Action> rulesMap = new HashMap<Pattern, Action>(); - rulesMap.put(new Pattern("group/fruitShell"), new FruitShellAction()); - rulesMap.put(new Pattern("group/fruitShell/fruit"), new FruitFactoryAction()); - rulesMap.put(new Pattern("group/fruitShell/fruit/*"), new NOPAction()); - SimpleConfigurator simpleConfigurator = new SimpleConfigurator(rulesMap); - - simpleConfigurator.setContext(fruitContext); - - simpleConfigurator.doConfigure(Constants.TEST_DIR_PREFIX + "input/joran/" + filename); - - StatusPrinter.print(fruitContext); - return fruitContext.getFruitShellList(); - + try { + HashMap<Pattern, Action> rulesMap = new HashMap<Pattern, Action>(); + rulesMap.put(new Pattern("group/fruitShell"), new FruitShellAction()); + rulesMap.put(new Pattern("group/fruitShell/fruit"), + new FruitFactoryAction()); + rulesMap.put(new Pattern("group/fruitShell/fruit/*"), new NOPAction()); + SimpleConfigurator simpleConfigurator = new SimpleConfigurator(rulesMap); + + simpleConfigurator.setContext(fruitContext); + + simpleConfigurator.doConfigure(Constants.TEST_DIR_PREFIX + "input/joran/" + + filename); + + return fruitContext.getFruitShellList(); + } catch (Exception je) { + StatusPrinter.print(fruitContext); + throw je; + } } public void test1() throws Exception { @@ -69,7 +75,7 @@ Fruit fruit0 = fs0.fruitFactory.buildFruit(); assertTrue(fruit0 instanceof Fruit); assertEquals("blue", fruit0.getName()); - + FruitShell fs1 = fsList.get(1); assertNotNull(fs1); assertEquals("fs1", fs1.getName()); @@ -78,7 +84,7 @@ assertEquals("orange", fruit1.getName()); assertEquals(1.2, ((WeightytFruit) fruit1).getWeight()); } - + public void testWithSubst() throws Exception { List<FruitShell> fsList = doFirstPart("fruitWithSubst.xml"); assertNotNull(fsList); @@ -90,13 +96,13 @@ int oldCount = FruitFactory.count; Fruit fruit0 = fs0.fruitFactory.buildFruit(); assertTrue(fruit0 instanceof WeightytFruit); - assertEquals("orange-"+oldCount, fruit0.getName()); + assertEquals("orange-" + oldCount, fruit0.getName()); assertEquals(1.2, ((WeightytFruit) fruit0).getWeight()); } - + public static Test suite() { TestSuite suite = new TestSuite(); - //suite.addTest(new FruitConfigurationTest("testWithSubst")); + // suite.addTest(new FruitConfigurationTest("testWithSubst")); suite.addTestSuite(FruitConfigurationTest.class); return suite; } Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PatternTest.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PatternTest.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PatternTest.java Tue Oct 24 15:16:58 2006 @@ -132,7 +132,7 @@ { Pattern p = new Pattern("/a/b"); Pattern rulePattern = new Pattern("/a/*"); - assertEquals(2, p.getPrefixMatchLength(rulePattern)); + assertEquals(1, p.getPrefixMatchLength(rulePattern)); } { @@ -144,7 +144,7 @@ { Pattern p = new Pattern("/a/b"); Pattern rulePattern = new Pattern("/*"); - assertEquals(1, p.getPrefixMatchLength(rulePattern)); + assertEquals(0, p.getPrefixMatchLength(rulePattern)); } } Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/SimpleStoreTest.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/SimpleStoreTest.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/SimpleStoreTest.java Tue Oct 24 15:16:58 2006 @@ -72,14 +72,13 @@ // jp.parse(doc); } - public void test2() throws Exception { + public void testTail1() throws Exception { SimpleRuleStore srs = new SimpleRuleStore(new ContextBase()); srs.addRule(new Pattern("*/b"), new XAction()); List r = srs.matchActions(new Pattern("a/b")); assertNotNull(r); - // System.out.println(r); assertEquals(1, r.size()); if (!(r.get(0) instanceof XAction)) { @@ -87,7 +86,22 @@ } } - public void test3() throws Exception { + + public void testTail2() throws Exception { + SimpleRuleStore srs = new SimpleRuleStore(new ContextBase()); + srs.addRule(new Pattern("*/c"), new XAction()); + + List r = srs.matchActions(new Pattern("a/b/c")); + assertNotNull(r); + + assertEquals(1, r.size()); + + if (!(r.get(0) instanceof XAction)) { + fail("Wrong type"); + } + } + + public void testTail3() throws Exception { SimpleRuleStore srs = new SimpleRuleStore(new ContextBase()); srs.addRule(new Pattern("*/b"), new XAction()); srs.addRule(new Pattern("*/a/b"), new YAction()); @@ -103,7 +117,7 @@ } } - public void test4() throws Exception { + public void testTail4() throws Exception { SimpleRuleStore srs = new SimpleRuleStore(new ContextBase()); srs.addRule(new Pattern("*/b"), new XAction()); srs.addRule(new Pattern("*/a/b"), new YAction()); @@ -127,16 +141,55 @@ List r = srs.matchActions(new Pattern("a/b")); assertNotNull(r); + assertEquals(1, r.size()); + assertTrue(r.get(0) instanceof YAction); + } + + public void testDeepSuffix() throws Exception { + SimpleRuleStore srs = new SimpleRuleStore(new ContextBase()); + srs.addRule(new Pattern("a"), new XAction(1)); + srs.addRule(new Pattern("a/b/*"), new XAction(2)); + + List r = srs.matchActions(new Pattern("a/other")); + assertNull(r); + } + + public void testPrefixSuffixInteraction1() throws Exception { + SimpleRuleStore srs = new SimpleRuleStore(new ContextBase()); + srs.addRule(new Pattern("a"), new ZAction()); + srs.addRule(new Pattern("a/*"), new YAction()); + srs.addRule(new Pattern("*/a/b"), new XAction(3)); + + List r = srs.matchActions(new Pattern("a/b")); + assertNotNull(r); assertEquals(1, r.size()); + + assertTrue(r.get(0) instanceof XAction); + XAction xaction = (XAction) r.get(0); + assertEquals(3, xaction.id); + } - if (!(r.get(0) instanceof YAction)) { - fail("Wrong type"); - } + public void testPrefixSuffixInteraction2() throws Exception { + SimpleRuleStore srs = new SimpleRuleStore(new ContextBase()); + srs.addRule(new Pattern("testGroup"), new XAction()); + srs.addRule(new Pattern("testGroup/testShell"), new YAction()); + srs.addRule(new Pattern("testGroup/testShell/test"), new ZAction()); + srs.addRule(new Pattern("testGroup/testShell/test/*"), new XAction(9)); + + List r = srs.matchActions(new Pattern("testGroup/testShell/toto")); + System.out.println(r); + assertNull(r); } - class XAction extends Action { + int id = 0; + XAction() { + } + XAction(int id) { + this.id = id; + } + public void begin(InterpretationContext ec, String name, Attributes attributes) { } @@ -145,6 +198,10 @@ public void finish(InterpretationContext ec) { } + + public String toString() { + return "XAction("+id+")"; + } } class YAction extends Action { @@ -168,4 +225,5 @@ public void finish(InterpretationContext ec) { } } + }
participants (1)
-
noreply.ceki@qos.ch