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

Author: ceki Date: Sun Aug 9 13:54:23 2009 New Revision: 2426 Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/CaseCombinator.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/CaseCombinatorTest.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/SimpleRuleStoreTest.java - copied, changed from r2425, /logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/SimpleStoreTest.java Removed: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/SimpleStoreTest.java Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/Action.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/TimestampAction.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/Pattern.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/TrivialConfiguratorTest.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PackageTest.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PatternTest.java Log: - Explicit patterns in Joran are now case insensitive. The following config files will be interpreted identically: First config file: <configuration> <logger>...</logger> </configuration> Second config file: <CONFIGURAtion> <loGGer>...</loGGer> </CONFIGURAtion> This addresses http://jira.qos.ch/browse/LBCORE-76 Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java Sun Aug 9 13:54:23 2009 @@ -25,6 +25,7 @@ import ch.qos.logback.core.joran.action.ParamAction; import ch.qos.logback.core.joran.action.PropertyAction; import ch.qos.logback.core.joran.action.StatusListenerAction; +import ch.qos.logback.core.joran.action.TimestampAction; import ch.qos.logback.core.joran.spi.InterpretationContext; import ch.qos.logback.core.joran.spi.Interpreter; import ch.qos.logback.core.joran.spi.Pattern; @@ -59,6 +60,9 @@ rs.addRule(new Pattern("configuration/substitutionProperty"), new PropertyAction()); + rs.addRule(new Pattern("configuration/timestamp"), + new TimestampAction()); + // the contextProperty pattern is deprecated. It is undocumented // and will be dropped in future versions of logback rs.addRule(new Pattern("configuration/contextProperty"), Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/Action.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/Action.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/Action.java Sun Aug 9 13:54:23 2009 @@ -35,6 +35,7 @@ public abstract class Action extends ContextAwareBase { public static final String NAME_ATTRIBUTE = "name"; + public static final String KEY_ATTRIBUTE = "key"; public static final String VALUE_ATTRIBUTE = "value"; public static final String FILE_ATTRIBUTE = "file"; public static final String CLASS_ATTRIBUTE = "class"; Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/TimestampAction.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/TimestampAction.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/TimestampAction.java Sun Aug 9 13:54:23 2009 @@ -1,3 +1,12 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2009, 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.action; import java.text.SimpleDateFormat; @@ -9,32 +18,43 @@ import ch.qos.logback.core.joran.spi.InterpretationContext; import ch.qos.logback.core.util.OptionHelper; +/** + * Given a key and a date-and-time pattern, puts a property to the context, with + * the specified key and value equal to the current time in the format + * corresponding to the specified date-and-time pattern. + * + * @author Ceki Gülcü + * + */ public class TimestampAction extends Action { static String DATE_PATTERN_ATTRIBUTE = "datePattern"; - + boolean inError = false; - + @Override - public void begin(InterpretationContext ec, String name, Attributes attributes) throws ActionException { - String nameStr = attributes.getValue(NAME_ATTRIBUTE); - if(OptionHelper.isEmpty(nameStr)) { - addError("["+NAME_ATTRIBUTE+"] attribute cannot be empty"); + public void begin(InterpretationContext ec, String name, Attributes attributes) + throws ActionException { + String keyStr = attributes.getValue(KEY_ATTRIBUTE); + if (OptionHelper.isEmpty(keyStr)) { + addError("Attrubute named [" + KEY_ATTRIBUTE + "] cannot be empty"); inError = true; } String datePatternStr = attributes.getValue(DATE_PATTERN_ATTRIBUTE); - if(OptionHelper.isEmpty(datePatternStr)) { - addError("["+DATE_PATTERN_ATTRIBUTE+"] attribute cannot be empty"); + if (OptionHelper.isEmpty(datePatternStr)) { + addError("Attribute named [" + DATE_PATTERN_ATTRIBUTE + + "] cannot be empty"); inError = true; } - - if(inError) + + if (inError) return; - + SimpleDateFormat sdf = new SimpleDateFormat(datePatternStr); String val = sdf.format(new Date()); - addInfo("Adding property ["+nameStr+"] with value ["+val+"] to the context"); - context.putProperty(nameStr, val); + addInfo("Adding property to the context with key=\"" + keyStr + + "\" and value=\"" + val + "\" to the context"); + context.putProperty(keyStr, val); } @Override 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 Sun Aug 9 13:54:23 2009 @@ -15,8 +15,8 @@ /** * A pattern is used to designate XML elements in a document. * - * <p>For more information see - * http://logback.qos.ch/manual/onJoran.html#pattern + * <p>For more information see + * http://logback.qos.ch/manual/onJoran.html#pattern * * @author Ceki Gülcü */ @@ -127,7 +127,7 @@ String l = (String) this.partList.get(lSize - i); String r = (String) p.partList.get(rSize - i); - if (l.equals(r)) { + if (equalityCheck(l, r)) { match++; } else { break; @@ -162,8 +162,7 @@ String l = (String) this.partList.get(i); String r = (String) p.partList.get(i); - // if (l.equals(r) || "*".equals(l) || "*".equals(r)) { - if (l.equals(r)) { + if (equalityCheck(l, r)) { match++; } else { break; @@ -173,30 +172,31 @@ return match; } + private boolean equalityCheck(String x, String y) { + return x.equalsIgnoreCase(y); + } + @Override public boolean equals(Object o) { - // System.out.println("in equals:" +this+ " vs. " + o); if ((o == null) || !(o instanceof Pattern)) { return false; } - // System.out.println("both are Patterns"); Pattern r = (Pattern) o; if (r.size() != size()) { return false; } - // System.out.println("both are size compatible"); int len = size(); for (int i = 0; i < len; i++) { - if (!(get(i).equals(r.get(i)))) { + if (!equalityCheck(get(i), r.get(i))) { return false; } } - // if everything matches, then the twp patterns are equal + // if everything matches, then the two patterns are equal return true; } @@ -206,9 +206,9 @@ int len = size(); for (int i = 0; i < len; i++) { - hc ^= get(i).hashCode(); - - // System.out.println("i = "+i+", hc="+hc); + // make Pattern comparisons case insensitive + // http://jira.qos.ch/browse/LBCORE-76 + hc ^= get(i).toLowerCase().hashCode(); } return hc; Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/TrivialConfiguratorTest.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/TrivialConfiguratorTest.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/TrivialConfiguratorTest.java Sun Aug 9 13:54:23 2009 @@ -42,7 +42,8 @@ public void doTest(String filename) throws Exception { - rulesMap.put(new Pattern("x/inc"), new IncAction()); + // rule store is case insensitve + rulesMap.put(new Pattern("x/INC"), new IncAction()); TrivialConfigurator gc = new TrivialConfigurator(rulesMap); @@ -50,7 +51,7 @@ gc.doConfigure(CoreTestConstants.TEST_DIR_PREFIX + "input/joran/" + filename); } - + @Test public void smoke() throws Exception { int oldBeginCount = IncAction.beginCount; Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/CaseCombinator.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/CaseCombinator.java Sun Aug 9 13:54:23 2009 @@ -0,0 +1,99 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2009, 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.util.ArrayList; +import java.util.List; + +public class CaseCombinator { + + + List<String> combinations(String in) { + int length = in.length(); + List<String> permutationsList = new ArrayList<String>(); + + int totalCombinations = computeTotalNumerOfCombinations(in, length); + + for (int j = 0; j < totalCombinations; j++) { + StringBuilder newCombination = new StringBuilder(); + int pos = 0; + for (int i = 0; i < length; i++) { + char c = in.charAt(i); + if (isEnglishLetter(c)) { + c = permute(c, j, pos); + pos++; + } + newCombination.append(c); + } + permutationsList.add(newCombination.toString()); + } + return permutationsList; + + } + + private char permute(char c, int permutation, int position) { + int mask = 1 << position; + boolean shouldBeInUpperCase = (permutation & mask) != 0; + boolean isEffectivelyUpperCase = isUpperCase(c); + if (shouldBeInUpperCase && !isEffectivelyUpperCase) + return toUpperCase(c); + if (!shouldBeInUpperCase && isEffectivelyUpperCase) + return toLowerCase(c); + return c; + } + + private int computeTotalNumerOfCombinations(String in, int length) { + int count = 0; + for (int i = 0; i < length; i++) { + char c = in.charAt(i); + if (isEnglishLetter(c)) + count++; + } + // return 2^count (2 to the power of count) + return (1 << count); + } + + private char toUpperCase(char c) { + if ('A' <= c && c <= 'Z') { + return c; + } + if ('a' <= c && c <= 'z') { + int ci = c; + return (char) (ci + 'A' - 'a'); + } + // code should never reach this point + return c; + } + + private char toLowerCase(char c) { + if ('a' <= c && c <= 'z') { + return c; + } + if ('A' <= c && c <= 'Z') { + int ci = c; + return (char) (ci + 'a' - 'A'); + } + // code should never reach this point + return c; + } + + private boolean isEnglishLetter(char c) { + if ('a' <= c && c <= 'z') + return true; + + if ('A' <= c && c <= 'Z') + return true; + return false; + } + + private boolean isUpperCase(char c) { + return ('A' <= c && c <= 'Z'); + } +} Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/CaseCombinatorTest.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/CaseCombinatorTest.java Sun Aug 9 13:54:23 2009 @@ -0,0 +1,49 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2009, 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 static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.junit.Test; + + +public class CaseCombinatorTest { + + CaseCombinator p = new CaseCombinator(); + + + @Test + public void smoke() { + CaseCombinator p = new CaseCombinator(); + + List<String> result = p.combinations("a-B="); + + List<String> witness = new ArrayList<String>(); + witness.add("a-b="); + witness.add("A-b="); + witness.add("a-B="); + witness.add("A-B="); + assertEquals(witness, result); + } + + @Test + public void other() { + List<String> result = p.combinations("aBCd"); + assertEquals(16, result.size()); + Set<String> witness = new HashSet<String>(result); + // check that there are no duplicates + assertEquals(16, witness.size()); + } +} Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PackageTest.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PackageTest.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PackageTest.java Sun Aug 9 13:54:23 2009 @@ -14,8 +14,8 @@ import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) -@SuiteClasses( { PatternTest.class, SimpleStoreTest.class, +@SuiteClasses( { PatternTest.class, SimpleRuleStoreTest.class, PropertySetterTest.class, NoAutoStartUtilTest.class, - DefaultNestedComponentRegistryTest.class }) + DefaultNestedComponentRegistryTest.class, CaseCombinatorTest.class }) public class PackageTest { } 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 Sun Aug 9 13:54:23 2009 @@ -94,6 +94,19 @@ Pattern rulePattern = new Pattern("*/a"); assertEquals(1, p.getTailMatchLength(rulePattern)); } + + { + Pattern p = new Pattern("/A"); + Pattern rulePattern = new Pattern("*/a"); + assertEquals(1, p.getTailMatchLength(rulePattern)); + } + + { + Pattern p = new Pattern("/a"); + Pattern rulePattern = new Pattern("*/A"); + assertEquals(1, p.getTailMatchLength(rulePattern)); + } + { Pattern p = new Pattern("/a/b"); @@ -101,6 +114,11 @@ assertEquals(1, p.getTailMatchLength(rulePattern)); } + { + Pattern p = new Pattern("/a/B"); + Pattern rulePattern = new Pattern("*/b"); + assertEquals(1, p.getTailMatchLength(rulePattern)); + } { Pattern p = new Pattern("/a/b/c"); @@ -129,6 +147,18 @@ Pattern rulePattern = new Pattern("/a/*"); assertEquals(1, p.getPrefixMatchLength(rulePattern)); } + + { + Pattern p = new Pattern("/a/b"); + Pattern rulePattern = new Pattern("/A/*"); + assertEquals(1, p.getPrefixMatchLength(rulePattern)); + } + + { + Pattern p = new Pattern("/A/b"); + Pattern rulePattern = new Pattern("/a/*"); + assertEquals(1, p.getPrefixMatchLength(rulePattern)); + } { Pattern p = new Pattern("/a/b"); Copied: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/SimpleRuleStoreTest.java (from r2425, /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/SimpleRuleStoreTest.java Sun Aug 9 13:54:23 2009 @@ -1,7 +1,7 @@ /** * Logback: the generic, reliable, fast and flexible logging framework. * - * Copyright (C) 2000-2008, QOS.ch + * Copyright (C) 2000-2009, 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 @@ -24,186 +24,203 @@ import ch.qos.logback.core.joran.action.Action; /** + * Test SimpleRuleStore for various explicit rule combinations. * - * @author Ceki Gulcu + * We also test that explicit patterns are case sensitive. + * + * @author Ceki Gülcü */ -public class SimpleStoreTest { +public class SimpleRuleStoreTest { + SimpleRuleStore srs = new SimpleRuleStore(new ContextBase()); + CaseCombinator cc = new CaseCombinator(); + @Test - public void test1() throws Exception { - // Document doc = getW3Document("file:input/joran/parser1.xml"); - SimpleRuleStore srs = new SimpleRuleStore(new ContextBase()); + public void smoke() throws Exception { srs.addRule(new Pattern("a/b"), new XAction()); - List r = srs.matchActions(new Pattern("a/b")); - assertNotNull(r); - assertEquals(1, r.size()); - - if (!(r.get(0) instanceof XAction)) { - fail("Wrong type"); + // test for all possible case combinations of "a/b" + for (String s : cc.combinations("a/b")) { + List r = srs.matchActions(new Pattern(s)); + assertNotNull(r); + assertEquals(1, r.size()); + + if (!(r.get(0) instanceof XAction)) { + fail("Wrong type"); + } } + } - srs = new SimpleRuleStore(new ContextBase()); + @Test + public void smokeII() throws Exception { srs.addRule(new Pattern("a/b"), new XAction()); srs.addRule(new Pattern("a/b"), new YAction()); - r = srs.matchActions(new Pattern("a/b")); - assertNotNull(r); - assertEquals(2, r.size()); - - if (!(r.get(0) instanceof XAction)) { - fail("Wrong type"); - } - - if (!(r.get(1) instanceof YAction)) { - fail("Wrong type"); + for (String s : cc.combinations("a/b")) { + List r = srs.matchActions(new Pattern(s)); + assertNotNull(r); + assertEquals(2, r.size()); + + if (!(r.get(0) instanceof XAction)) { + fail("Wrong type"); + } + + if (!(r.get(1) instanceof YAction)) { + fail("Wrong type"); + } } - } @Test public void testSlashSuffix() throws Exception { - SimpleRuleStore srs = new SimpleRuleStore(new ContextBase()); Pattern pa = new Pattern("a/"); srs.addRule(pa, new XAction()); - - List r = srs.matchActions(new Pattern("a")); - assertNotNull(r); - assertEquals(1, r.size()); - if (!(r.get(0) instanceof XAction)) { - fail("Wrong type"); + for (String s : cc.combinations("a")) { + List r = srs.matchActions(new Pattern(s)); + assertNotNull(r); + assertEquals(1, r.size()); + + if (!(r.get(0) instanceof XAction)) { + fail("Wrong type"); + } } - } - + @Test 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); - - assertEquals(1, r.size()); - - if (!(r.get(0) instanceof XAction)) { - fail("Wrong type"); + for (String s : cc.combinations("a/b")) { + List r = srs.matchActions(new Pattern(s)); + assertNotNull(r); + + assertEquals(1, r.size()); + + if (!(r.get(0) instanceof XAction)) { + fail("Wrong type"); + } } } - @Test 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"); + for (String s : cc.combinations("a/b/c")) { + List r = srs.matchActions(new Pattern(s)); + assertNotNull(r); + + assertEquals(1, r.size()); + + if (!(r.get(0) instanceof XAction)) { + fail("Wrong type"); + } } } - + @Test 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()); - List r = srs.matchActions(new Pattern("a/b")); - assertNotNull(r); - - // System.out.println("restulg list is: "+r); - assertEquals(1, r.size()); - - if (!(r.get(0) instanceof YAction)) { - fail("Wrong type"); + for (String s : cc.combinations("a/b")) { + List r = srs.matchActions(new Pattern(s)); + assertNotNull(r); + assertEquals(1, r.size()); + + if (!(r.get(0) instanceof YAction)) { + fail("Wrong type"); + } } } @Test 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()); srs.addRule(new Pattern("a/b"), new ZAction()); - List r = srs.matchActions(new Pattern("a/b")); - assertNotNull(r); - - // System.out.println("result list is: "+r); - assertEquals(1, r.size()); - - if (!(r.get(0) instanceof ZAction)) { - fail("Wrong type"); + for (String s : cc.combinations("a/b")) { + List r = srs.matchActions(new Pattern(s)); + assertNotNull(r); + assertEquals(1, r.size()); + + if (!(r.get(0) instanceof ZAction)) { + fail("Wrong type"); + } } } - + @Test public void testSuffix() throws Exception { - SimpleRuleStore srs = new SimpleRuleStore(new ContextBase()); srs.addRule(new Pattern("a"), new XAction()); srs.addRule(new Pattern("a/*"), new YAction()); - List r = srs.matchActions(new Pattern("a/b")); - assertNotNull(r); - assertEquals(1, r.size()); - assertTrue(r.get(0) instanceof YAction); + for (String s : cc.combinations("a/b")) { + List r = srs.matchActions(new Pattern(s)); + assertNotNull(r); + assertEquals(1, r.size()); + assertTrue(r.get(0) instanceof YAction); + } } - + @Test 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); + for (String s : cc.combinations("a/other")) { + List r = srs.matchActions(new Pattern(s)); + assertNull(r); + } } @Test 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); + for (String s : cc.combinations("a/b")) { + List r = srs.matchActions(new Pattern(s)); + assertNotNull(r); + + assertEquals(1, r.size()); + + assertTrue(r.get(0) instanceof XAction); + XAction xaction = (XAction) r.get(0); + assertEquals(3, xaction.id); + } } @Test 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")); - assertNull(r); + srs.addRule(new Pattern("tG"), new XAction()); + srs.addRule(new Pattern("tG/tS"), new YAction()); + srs.addRule(new Pattern("tG/tS/test"), new ZAction()); + srs.addRule(new Pattern("tG/tS/test/*"), new XAction(9)); + + for (String s : cc.combinations("tG/tS/toto")) { + List r = srs.matchActions(new Pattern(s)); + 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) { + public void begin(InterpretationContext ec, String name, + Attributes attributes) { } public void end(InterpretationContext ec, String name) { @@ -211,14 +228,15 @@ public void finish(InterpretationContext ec) { } - + public String toString() { - return "XAction("+id+")"; - } + return "XAction(" + id + ")"; + } } class YAction extends Action { - public void begin(InterpretationContext ec, String name, Attributes attributes) { + public void begin(InterpretationContext ec, String name, + Attributes attributes) { } public void end(InterpretationContext ec, String name) { @@ -229,7 +247,8 @@ } class ZAction extends Action { - public void begin(InterpretationContext ec, String name, Attributes attributes) { + public void begin(InterpretationContext ec, String name, + Attributes attributes) { } public void end(InterpretationContext ec, String name) {
participants (1)
-
noreply.ceki@qos.ch