From a39a2d18f94e9843893d0fedb2ac9536cb9952ed Mon Sep 17 00:00:00 2001 From: "Lincoln Baxter, III" Date: Tue, 11 Nov 2014 14:34:38 -0500 Subject: [PATCH] Refactor ParameterizedPatternParser to have a slightly nicer API --- .../ParameterizedPatternInterceptorTest.java | 17 +- .../param/ParameterizedPatternTest.java | 90 +-- .../java/org/ocpsoft/rewrite/config/And.java | 1 + .../config/DefaultConditionBuilder.java | 2 +- .../rewrite/param/DefaultParameterStore.java | 194 +++--- .../param/DefaultParameterValueStore.java | 184 ++++-- .../rewrite/param/ParameterValueStore.java | 18 +- .../param/ParameterizedPatternParser.java | 43 +- .../param/ParameterizedPatternResult.java | 32 + .../RegexParameterizedPatternParser.java | 568 +++++++++--------- .../ocpsoft/rewrite/util/ParameterUtils.java | 25 +- .../rewrite/servlet/config/DomainTest.java | 5 +- .../servlet/config/HeaderAndPathTest.java | 72 +-- .../rewrite/servlet/config/HeaderTest.java | 22 +- .../rewrite/servlet/config/PathTest.java | 15 +- .../servlet/config/QueryEncodingTest.java | 1 - .../servlet/config/RequestParameterTest.java | 66 +- .../rewrite/servlet/config/SchemeTest.java | 5 +- .../rewrite/servlet/config/URLTest.java | 19 +- .../rewrite/servlet/config/Domain.java | 2 +- .../rewrite/servlet/config/Header.java | 4 +- .../ocpsoft/rewrite/servlet/config/Path.java | 2 +- .../rewrite/servlet/config/PathAndQuery.java | 2 +- .../ocpsoft/rewrite/servlet/config/Query.java | 17 +- .../servlet/config/RequestParameter.java | 8 +- .../rewrite/servlet/config/Resource.java | 2 +- .../rewrite/servlet/config/Scheme.java | 2 +- .../ocpsoft/rewrite/servlet/config/URL.java | 2 +- .../rewrite/servlet/config/UserAgent.java | 2 +- .../rewrite/servlet/config/rule/Join.java | 2 +- .../impl/DefaultHttpRewriteProvider.java | 2 +- .../rewrite/mock/MockEvaluationContext.java | 10 + 32 files changed, 799 insertions(+), 637 deletions(-) create mode 100644 api/src/main/java/org/ocpsoft/rewrite/param/ParameterizedPatternResult.java diff --git a/api-tests/src/test/java/org/ocpsoft/rewrite/param/ParameterizedPatternInterceptorTest.java b/api-tests/src/test/java/org/ocpsoft/rewrite/param/ParameterizedPatternInterceptorTest.java index 3c3acd2d8..f420f21cb 100644 --- a/api-tests/src/test/java/org/ocpsoft/rewrite/param/ParameterizedPatternInterceptorTest.java +++ b/api-tests/src/test/java/org/ocpsoft/rewrite/param/ParameterizedPatternInterceptorTest.java @@ -19,11 +19,8 @@ import java.util.Map; import org.junit.Assert; -import org.junit.Before; import org.junit.Ignore; import org.junit.Test; -import org.ocpsoft.rewrite.mock.MockEvaluationContext; -import org.ocpsoft.rewrite.mock.MockRewrite; /** * This test case was intended to begin mocking out an i18n API. @@ -32,24 +29,14 @@ */ public class ParameterizedPatternInterceptorTest { - private MockEvaluationContext context; - private MockRewrite rewrite; - - @Before - public void before() - { - context = new MockEvaluationContext(); - rewrite = new MockRewrite(); - } - @Ignore @Test public void testMatchesWithParametersRespectsTrailingCharsWithWildcardParameter() { RegexParameterizedPatternParser path = new RegexParameterizedPatternParser("[^/]+", "/{i18n:customer}/{customer}/orders/{id}"); - Assert.assertTrue(path.matches(rewrite, context, "/cust/lincoln/orders/3")); - Assert.assertFalse(path.matches(rewrite, context, "/wrong/lincoln/orders/3")); + Assert.assertTrue(path.parse("/cust/lincoln/orders/3").matches()); + Assert.assertFalse(path.parse("/wrong/lincoln/orders/3").matches()); } @Ignore diff --git a/api-tests/src/test/java/org/ocpsoft/rewrite/param/ParameterizedPatternTest.java b/api-tests/src/test/java/org/ocpsoft/rewrite/param/ParameterizedPatternTest.java index 6e45f5f18..8abe2d650 100644 --- a/api-tests/src/test/java/org/ocpsoft/rewrite/param/ParameterizedPatternTest.java +++ b/api-tests/src/test/java/org/ocpsoft/rewrite/param/ParameterizedPatternTest.java @@ -18,11 +18,11 @@ import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; -import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import org.ocpsoft.rewrite.mock.MockEvaluationContext; import org.ocpsoft.rewrite.mock.MockRewrite; @@ -34,24 +34,27 @@ */ public class ParameterizedPatternTest { - private MockEvaluationContext context = new MockEvaluationContext(); - private MockRewrite rewrite = new MockRewrite(); + private MockRewrite event; + private MockEvaluationContext context; public static void initialize(ParameterStore store, Parameterized parameterized) { Set names = parameterized.getRequiredParameterNames(); - for (String name : names) { + for (String name : names) + { store.get(name, new DefaultParameter(name)); } parameterized.setParameterStore(store); } - @After - public void after() + @Before + public void before() { + event = new MockRewrite(); context = new MockEvaluationContext(); - rewrite = new MockRewrite(); + context.put(ParameterStore.class, new DefaultParameterStore()); + context.put(ParameterValueStore.class, new DefaultParameterValueStore()); } @Test @@ -62,7 +65,7 @@ public void testComplexMatchingWithMutipleAdjacentParameters() throws Exception ParameterizedPatternParser path = new RegexParameterizedPatternParser( "{prefix}/application/{seg}{suffix}"); - DefaultParameterStore store = new DefaultParameterStore(); + ParameterStore store = DefaultParameterStore.getInstance(context); initialize(store, path); ((ConfigurableParameter) store.get("prefix")).constrainedBy(new RegexConstraint(".*")); @@ -71,14 +74,14 @@ public void testComplexMatchingWithMutipleAdjacentParameters() throws Exception initialize(store, path); - Assert.assertTrue(path.matches(rewrite, new MockEvaluationContext(), url)); + Assert.assertTrue(path.parse(url).matches()); String[] expected = new String[] { "http://domain.com:8080/context", "pathy", "?foo=bar&baz=bazaar" }; - Map, String> parsed = path.parse(rewrite, - new MockEvaluationContext(), url); + Map, String> parsed = path.parse(url).getParameters(context); int index = 0; - for (Entry, String> entry : parsed.entrySet()) { + for (Entry, String> entry : parsed.entrySet()) + { String value = entry.getValue(); Assert.assertEquals(expected[index++], value); } @@ -90,7 +93,7 @@ public void testCannotUseRegularExpressionsWithoutParameter() ParameterizedPatternParser path = new RegexParameterizedPatternParser(CaptureType.BRACE, ".*"); Assert.assertEquals(0, path.getRequiredParameterNames().size()); - Assert.assertFalse(path.matches(rewrite, context, "/omg/doesnt/matter")); + Assert.assertFalse(path.parse("/omg/doesnt/matter").matches()); } @Test @@ -99,8 +102,8 @@ public void testMatchesEmptyPath() ParameterizedPatternParser path = new RegexParameterizedPatternParser(CaptureType.BRACE, ""); Assert.assertEquals(0, path.getRequiredParameterNames().size()); - Assert.assertTrue(path.matches(rewrite, context, "")); - Map, String> results = path.parse(rewrite, context, ""); + Assert.assertTrue(path.parse("").matches()); + Map, String> results = path.parse("").getParameters(context); Assert.assertNotNull(results); } @@ -110,8 +113,8 @@ public void testMatchesEmptyPathNoTransforms() ParameterizedPatternParser path = new RegexParameterizedPatternParser(CaptureType.BRACE, ""); Assert.assertEquals(0, path.getRequiredParameterNames().size()); - Assert.assertTrue(path.matches(rewrite, context, "")); - Map, String> results = path.parse(""); + Assert.assertTrue(path.parse("").matches()); + Map, String> results = path.parse("").getParameters(context); Assert.assertNotNull(results); } @@ -121,9 +124,9 @@ public void testMatchesBarePath() ParameterizedPatternParser path = new RegexParameterizedPatternParser("/"); Assert.assertEquals(0, path.getRequiredParameterNames().size()); - Assert.assertTrue(path.matches(rewrite, context, "/")); + Assert.assertTrue(path.parse("/").matches()); - Map, String> results = path.parse(rewrite, context, "/"); + Map, String> results = path.parse("/").getParameters(context); Assert.assertNotNull(results); } @@ -132,7 +135,7 @@ public void testMatchesWithParameters() { ParameterizedPatternParser path = new RegexParameterizedPatternParser("[^/]+", "/{customer}/orders/{id}"); - ParameterStore parameters = new DefaultParameterStore(); + ParameterStore parameters = DefaultParameterStore.getInstance(context); initialize(parameters, path); @@ -140,7 +143,7 @@ public void testMatchesWithParameters() Assert.assertEquals("customer", parameters.get("customer").getName()); Assert.assertEquals("id", parameters.get("id").getName()); - Map, String> results = path.parse(rewrite, context, "/lincoln/orders/24"); + Map, String> results = path.parse("/lincoln/orders/24").getParameters(context); Assert.assertEquals("lincoln", results.get(parameters.get("customer"))); Assert.assertEquals("24", results.get(parameters.get("id"))); } @@ -150,14 +153,14 @@ public void testMatchesWithParametersNoTransforms() { ParameterizedPatternParser path = new RegexParameterizedPatternParser("[^/]+", "/{customer}/orders/{id}"); - ParameterStore parameters = new DefaultParameterStore(); + ParameterStore parameters = DefaultParameterStore.getInstance(context); initialize(parameters, path); Assert.assertEquals(2, parameters.size()); Assert.assertEquals("customer", parameters.get("customer").getName()); Assert.assertEquals("id", parameters.get("id").getName()); - Map, String> results = path.parse("/lincoln/orders/24"); + Map, String> results = path.parse("/lincoln/orders/24").getParameters(context); Assert.assertEquals("lincoln", results.get(parameters.get("customer"))); Assert.assertEquals("24", results.get(parameters.get("id"))); } @@ -170,16 +173,16 @@ public void testMatchesWithParametersRespectsTrailingCharsWithWildcardParameter( ParameterStore parameters = new DefaultParameterStore(); initialize(parameters, path); - Assert.assertTrue(path.matches(rewrite, context, "/lincoln/")); - Assert.assertFalse(path.matches(rewrite, context, "/lincoln/foo")); + Assert.assertTrue(path.parse("/lincoln/").matches()); + Assert.assertFalse(path.parse("/lincoln/foo").matches()); } @Test public void testRegularExpressionsAreDisabled() { ParameterizedPatternParser path = new RegexParameterizedPatternParser("[^/]+", ".*/{customer}/"); - Assert.assertTrue(path.matches(rewrite, context, ".*/lincoln/")); - Assert.assertFalse(path.matches(rewrite, context, "foobar/lincoln/")); + Assert.assertTrue(path.parse(".*/lincoln/").matches()); + Assert.assertFalse(path.parse("foobar/lincoln/").matches()); } @Test @@ -215,8 +218,8 @@ public void testParametersUsedMultipleRequireSingleConfiguration() ((ConfigurableParameter) parameters.get("f")).constrainedBy(new RegexConstraint("foo")); - Assert.assertTrue(path.matches(rewrite, context, "/foo/foo/")); - Assert.assertFalse(path.matches(rewrite, context, "/foo/bar/")); + Assert.assertTrue(path.parse("/foo/foo/").matches()); + Assert.assertFalse(path.parse("/foo/bar/").matches()); } @Test @@ -224,30 +227,49 @@ public void testParsesWithParametersRespectsTrailingCharsWithWildcardParameter() { ParameterizedPatternParser path = new RegexParameterizedPatternParser(".*", "/{customer}/"); - ParameterStore parameters = new DefaultParameterStore(); + ParameterStore parameters = DefaultParameterStore.getInstance(context); initialize(parameters, path); Assert.assertEquals(1, parameters.size()); Assert.assertEquals("customer", parameters.get("customer").getName()); - Map, String> results = path.parse(rewrite, context, "/lincoln/"); + Map, String> results = path.parse("/lincoln/").getParameters(context); Assert.assertEquals("lincoln", results.get(parameters.get("customer"))); } + @Test + public void testParsesWithParametersEscapesTrailingChars() + { + ParameterizedPatternParser path = new RegexParameterizedPatternParser(".*", "/{customer}."); + + ParameterStore parameters = DefaultParameterStore.getInstance(context); + initialize(parameters, path); + + Assert.assertEquals(1, parameters.size()); + Assert.assertEquals("customer", parameters.get("customer").getName()); + + Assert.assertFalse(path.parse("/lincolnX").matches()); + Assert.assertFalse(path.parse("/lincoln/").matches()); + Assert.assertTrue(path.parse("/lincoln.").matches()); + } + @Test public void testMatchesWithParametersAndTrailingSlash() { ParameterizedPatternParser path = new RegexParameterizedPatternBuilder("[^/]+", "/{customer}/orders/{id}/") .getParser(); - ParameterStore parameters = new DefaultParameterStore(); + ParameterStore parameters = DefaultParameterStore.getInstance(context); initialize(parameters, path); Assert.assertEquals(2, parameters.size()); Assert.assertEquals("customer", parameters.get("customer").getName()); Assert.assertEquals("id", parameters.get("id").getName()); - Map, String> results = path.parse(rewrite, context, "/lincoln/orders/24/"); + ParameterizedPatternResult result = path.parse("/lincoln/orders/24/"); + Assert.assertTrue(result.matches()); + Assert.assertTrue(result.submit(event, context)); + Map, String> results = result.getParameters(context); Assert.assertEquals("lincoln", results.get(parameters.get("customer"))); Assert.assertEquals("24", results.get(parameters.get("id"))); } diff --git a/api/src/main/java/org/ocpsoft/rewrite/config/And.java b/api/src/main/java/org/ocpsoft/rewrite/config/And.java index e630bfbda..89b397990 100644 --- a/api/src/main/java/org/ocpsoft/rewrite/config/And.java +++ b/api/src/main/java/org/ocpsoft/rewrite/config/And.java @@ -78,6 +78,7 @@ public boolean evaluate(final Rewrite event, final EvaluationContext context) if (!conditions[i].evaluate(event, context)) { result = false; + break; } } return result; diff --git a/api/src/main/java/org/ocpsoft/rewrite/config/DefaultConditionBuilder.java b/api/src/main/java/org/ocpsoft/rewrite/config/DefaultConditionBuilder.java index dc1036a8e..8b54df09f 100644 --- a/api/src/main/java/org/ocpsoft/rewrite/config/DefaultConditionBuilder.java +++ b/api/src/main/java/org/ocpsoft/rewrite/config/DefaultConditionBuilder.java @@ -125,7 +125,7 @@ public String toString() }; } - public static abstract class DefaultConditionBuilderInternal extends DefaultConditionBuilder implements + static abstract class DefaultConditionBuilderInternal extends DefaultConditionBuilder implements CompositeCondition { private List conditions; diff --git a/api/src/main/java/org/ocpsoft/rewrite/param/DefaultParameterStore.java b/api/src/main/java/org/ocpsoft/rewrite/param/DefaultParameterStore.java index dbe035bc5..f8244ce3a 100644 --- a/api/src/main/java/org/ocpsoft/rewrite/param/DefaultParameterStore.java +++ b/api/src/main/java/org/ocpsoft/rewrite/param/DefaultParameterStore.java @@ -26,6 +26,7 @@ import org.ocpsoft.common.util.Assert; import org.ocpsoft.common.util.Iterators; import org.ocpsoft.logging.Logger; +import org.ocpsoft.rewrite.context.EvaluationContext; import org.ocpsoft.rewrite.spi.GlobalParameterProvider; import org.ocpsoft.rewrite.util.ServiceLogger; @@ -34,92 +35,109 @@ */ public class DefaultParameterStore implements ParameterStore { - private final Map> parameters = new LinkedHashMap>(); - private static List providers; - private static final Logger log = Logger.getLogger(DefaultParameterStore.class); - - @SuppressWarnings("unchecked") - public DefaultParameterStore() - { - if (providers == null) - { - providers = Iterators.asList(ServiceLoader.load(GlobalParameterProvider.class)); - ServiceLogger.logLoadedServices(log, GlobalParameterProvider.class, providers); - } - - for (GlobalParameterProvider provider : providers) - { - Set> params = provider.getParameters(); - if (params != null) - { - for (Parameter parameter : params) - store(parameter); - } - } - - } - - @Override - public Parameter get(final String name, Parameter deflt) - { - Parameter parameter = null; - if (parameters.get(name) != null) - { - parameter = parameters.get(name); - } - else - { - parameter = deflt; - parameters.put(name, parameter); - } - - if (parameter == null) - throw new IllegalArgumentException("No such parameter [" + name + "] exists in parameter store."); - - return parameter; - } - - @Override - public Parameter get(String name) - { - if (!parameters.containsKey(name)) - throw new IllegalArgumentException("No such parameter [" + name + "] exists in parameter store."); - return parameters.get(name); - } - - @Override - public boolean isEmpty() - { - return parameters.isEmpty(); - } - - public Parameter store(Parameter value) - { - Assert.notNull(value, "Parameter to store must not be null."); - return parameters.put(value.getName(), value); - } - - @Override - public int size() - { - return parameters.size() - 1; - } - - @Override - public Iterator>> iterator() - { - return parameters.entrySet().iterator(); - } - - @Override - public boolean contains(String name) - { - return parameters.containsKey(name); - } - - @Override - public String toString() - { - return parameters.keySet().toString(); - } + private final Map> parameters = new LinkedHashMap>(); + private static List providers; + private static final Logger log = Logger.getLogger(DefaultParameterStore.class); + + @SuppressWarnings("unchecked") + public DefaultParameterStore() + { + if (providers == null) + { + providers = Iterators.asList(ServiceLoader.load(GlobalParameterProvider.class)); + ServiceLogger.logLoadedServices(log, GlobalParameterProvider.class, providers); + } + + for (GlobalParameterProvider provider : providers) + { + Set> params = provider.getParameters(); + if (params != null) + { + for (Parameter parameter : params) + store(parameter); + } + } + + } + + @Override + public Parameter get(final String name, Parameter deflt) + { + Parameter parameter = null; + if (parameters.get(name) != null) + { + parameter = parameters.get(name); + } + else + { + parameter = deflt; + parameters.put(name, parameter); + } + + if (parameter == null) + throw new IllegalArgumentException("No such parameter [" + name + "] exists in parameter store."); + + return parameter; + } + + @Override + public Parameter get(String name) + { + if (!parameters.containsKey(name)) + throw new IllegalArgumentException("No such parameter [" + name + "] exists in parameter store."); + return parameters.get(name); + } + + @Override + public boolean isEmpty() + { + return parameters.isEmpty(); + } + + public Parameter store(Parameter value) + { + Assert.notNull(value, "Parameter to store must not be null."); + return parameters.put(value.getName(), value); + } + + @Override + public int size() + { + return parameters.size() - 1; + } + + @Override + public Iterator>> iterator() + { + return parameters.entrySet().iterator(); + } + + @Override + public boolean contains(String name) + { + return parameters.containsKey(name); + } + + @Override + public String toString() + { + return parameters.keySet().toString(); + } + + /** + * Retrieve the current {@link ParameterStore} from the given {@link EvaluationContext} instance. + * + * @throws IllegalStateException If the {@link ParameterValueStore} could not be located. + */ + public static ParameterStore getInstance(EvaluationContext context) throws IllegalStateException + { + ParameterStore store = (ParameterStore) context.get(ParameterStore.class); + if (store == null) + { + throw new IllegalStateException("Could not retrieve " + ParameterStore.class.getName() + " from " + + EvaluationContext.class.getName() + ". Has the " + EvaluationContext.class.getSimpleName() + + " been set up properly?"); + } + return store; + } } diff --git a/api/src/main/java/org/ocpsoft/rewrite/param/DefaultParameterValueStore.java b/api/src/main/java/org/ocpsoft/rewrite/param/DefaultParameterValueStore.java index 9eec263a6..c0cd1d0a3 100644 --- a/api/src/main/java/org/ocpsoft/rewrite/param/DefaultParameterValueStore.java +++ b/api/src/main/java/org/ocpsoft/rewrite/param/DefaultParameterValueStore.java @@ -15,8 +15,10 @@ */ package org.ocpsoft.rewrite.param; +import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -28,67 +30,135 @@ * * @author Lincoln Baxter, III */ -public class DefaultParameterValueStore implements ParameterValueStore, Iterable, String>> +public class DefaultParameterValueStore implements ParameterValueStore, Iterable, List>> { - Map, String> map = new LinkedHashMap, String>(); - - @Override - public String retrieve(Parameter parameter) - { - return map.get(parameter); - } - - @Override - public boolean submit(Rewrite event, EvaluationContext context, Parameter param, String value) - { - boolean result = false; - String stored = map.get(param); - - if ("*".equals(param.getName())) - { - result = true; - } - else if (stored == value || (stored != null && stored.equals(value))) - { - result = true; - } - else if (stored == null) - { - result = true; - for (Constraint constraint : param.getConstraints()) { + Map, List> map = new LinkedHashMap, List>(); + + /** + * Create a new, empty {@link DefaultParameterValueStore} instance. + */ + public DefaultParameterValueStore() + { + } + + /** + * Create a new {@link DefaultParameterValueStore} instance, copying all {@link Parameter} and value pairs from the + * given instance. + */ + public DefaultParameterValueStore(DefaultParameterValueStore instance) + { + for (Entry, List> entry : instance) + { + List values = new ArrayList(); + values.addAll(entry.getValue()); + map.put(entry.getKey(), values); + } + } + + @Override + public String retrieve(Parameter parameter) + { + List strings = map.get(parameter); + if (strings == null || strings.size() == 0) + return null; + if (strings.size() > 1) + throw new IllegalStateException("Parameter [" + parameter.getName() + + "] is not a singleton: more than one value exists."); + return strings.get(0); + } + + @Override + public boolean submit(Rewrite event, EvaluationContext context, Parameter param, String value) + { + boolean result = false; + List strings = map.get(param); + + String stored = null; + if (strings != null) + { + if (strings.size() > 0) + stored = strings.get(0); + + if (strings.size() > 1) + throw new IllegalStateException("Parameter [" + param.getName() + + "] is not a singleton: more than one value exists."); + } + + if ("*".equals(param.getName())) + { + result = true; + } + else if (stored == value || (stored != null && stored.equals(value))) + { + result = true; + } + else if (stored == null) + { + result = _submit(event, context, param, value); + } + + return result; + } + + private boolean _submit(Rewrite event, EvaluationContext context, Parameter param, String value) + { + boolean result = true; + for (Constraint constraint : param.getConstraints()) + { if (!constraint.isSatisfiedBy(event, context, value)) { - result = false; + result = false; } - } - // FIXME Transposition processing will break multi-conditional matching - if (result) - { - for (Transposition transposition : param.getTranspositions()) { - value = transposition.transpose(event, context, value); + } + + // FIXME Transposition processing will break multi-conditional matching + if (result) + { + for (Transposition transposition : param.getTranspositions()) + { + value = transposition.transpose(event, context, value); + } + + List values = map.get(param); + if (values == null) + { + values = new ArrayList(); + map.put(param, values); } - map.put(param, value); + + values.add(value); + result = true; - } - } - - return result; - } - - public String get(Parameter parameter) - { - return map.get(parameter); - } - - @Override - public Iterator, String>> iterator() - { - return map.entrySet().iterator(); - } - - @Override - public String toString() - { - return map.keySet().toString(); - } + } + return result; + } + + @Override + public Iterator, List>> iterator() + { + return map.entrySet().iterator(); + } + + @Override + public String toString() + { + return map.keySet().toString(); + } + + /** + * Retrieve the current {@link ParameterValueStore} from the given {@link EvaluationContext} instance. + * + * @throws IllegalStateException If the {@link ParameterValueStore} could not be located. + */ + public static ParameterValueStore getInstance(EvaluationContext context) throws IllegalStateException + { + ParameterValueStore valueStore = (ParameterValueStore) context.get(ParameterValueStore.class); + if (valueStore == null) + { + throw new IllegalStateException("Could not retrieve " + ParameterValueStore.class.getName() + " from " + + EvaluationContext.class.getName() + ". Has the " + EvaluationContext.class.getSimpleName() + + " been set up properly?"); + } + return valueStore; + } } diff --git a/api/src/main/java/org/ocpsoft/rewrite/param/ParameterValueStore.java b/api/src/main/java/org/ocpsoft/rewrite/param/ParameterValueStore.java index dbb39094c..e08afe6dc 100644 --- a/api/src/main/java/org/ocpsoft/rewrite/param/ParameterValueStore.java +++ b/api/src/main/java/org/ocpsoft/rewrite/param/ParameterValueStore.java @@ -27,14 +27,14 @@ */ public interface ParameterValueStore { - /** - * Submit the given {@link Parameter} and value. Return false if the value does not match configured - * {@link Constraint} instances, or does not match an already submitted value. - */ - boolean submit(Rewrite event, EvaluationContext context, Parameter param, String value); + /** + * Submit the given {@link Parameter} and value. Return false if the value does not match configured + * {@link Constraint} instances, or does not match an already submitted value. + */ + boolean submit(Rewrite event, EvaluationContext context, Parameter param, String value); - /** - * Retrieve the value for the given {@link Parameter} - */ - String retrieve(Parameter parameter); + /** + * Retrieve the value for the given {@link Parameter}. (May be null.) + */ + String retrieve(Parameter parameter); } diff --git a/api/src/main/java/org/ocpsoft/rewrite/param/ParameterizedPatternParser.java b/api/src/main/java/org/ocpsoft/rewrite/param/ParameterizedPatternParser.java index 7e6cac993..acdff7b56 100644 --- a/api/src/main/java/org/ocpsoft/rewrite/param/ParameterizedPatternParser.java +++ b/api/src/main/java/org/ocpsoft/rewrite/param/ParameterizedPatternParser.java @@ -15,12 +15,8 @@ */ package org.ocpsoft.rewrite.param; -import java.util.Map; import java.util.regex.Pattern; -import org.ocpsoft.rewrite.context.EvaluationContext; -import org.ocpsoft.rewrite.event.Rewrite; - /** * * A {@link Parameterized} regular expression {@link Pattern}. @@ -30,32 +26,15 @@ */ public interface ParameterizedPatternParser extends ParameterizedPattern { - /** - * Return the {@link ParameterizedPatternBuilder} corresponding to the pattern with which this - * {@link ParameterizedPatternParser} was constructed. - */ - ParameterizedPatternBuilder getBuilder(); - - /** - * Return true if this expression matches the given {@link String}. - */ - boolean matches(String name); - - /** - * Return true if this expression matches the given {@link String}. - */ - boolean matches(Rewrite rewrite, EvaluationContext context, String value); - - /** - * Parses the given string if it matches this expression. Returns a {@link org.ocpsoft.rewrite.param.Parameter}-value - * map of parsed values. This method does not apply any {@link Transposition} instances that may be registered. - */ - Map, String> parse(String value); - - /** - * Parses the given string if it matches this expression. Returns a {@link org.ocpsoft.rewrite.param.Parameter}-value - * map of parsed values. - */ - Map, String> parse(Rewrite rewrite, EvaluationContext context, String value); - + /** + * Return the {@link ParameterizedPatternBuilder} corresponding to the pattern with which this + * {@link ParameterizedPatternParser} was constructed. + */ + ParameterizedPatternBuilder getBuilder(); + + /** + * Return a {@link ParameterizedPatternResult} for the evaluation of this {@link ParameterizedPattern} against the + * given {@link String}. + */ + ParameterizedPatternResult parse(String name); } diff --git a/api/src/main/java/org/ocpsoft/rewrite/param/ParameterizedPatternResult.java b/api/src/main/java/org/ocpsoft/rewrite/param/ParameterizedPatternResult.java new file mode 100644 index 000000000..5a072e86c --- /dev/null +++ b/api/src/main/java/org/ocpsoft/rewrite/param/ParameterizedPatternResult.java @@ -0,0 +1,32 @@ +package org.ocpsoft.rewrite.param; + +import java.util.Map; + +import org.ocpsoft.rewrite.context.EvaluationContext; +import org.ocpsoft.rewrite.event.Rewrite; + +/** + * Stores the result of {@link ParameterizedPatternParser#matches(Rewrite, EvaluationContext, String)}. Provides methods + * for controlling parameter value submission. + * + * @author Lincoln Baxter, III + */ +public interface ParameterizedPatternResult +{ + /** + * Returns true if the {@link ParameterizedPattern} matched the input value, false if not. + */ + boolean matches(); + + /** + * Submit all {@link Parameter} values to the {@link ParameterValueStore}, only if the values are match a prior + * value or have not yet had a value set. Returns true if submission was successful, false + * if not. + */ + boolean submit(Rewrite event, EvaluationContext context); + + /** + * Get the {@link Map} of {@link Parameter} instances that were referenced in the {@link ParameterizedPattern}. + */ + Map, String> getParameters(EvaluationContext context); +} diff --git a/api/src/main/java/org/ocpsoft/rewrite/param/RegexParameterizedPatternParser.java b/api/src/main/java/org/ocpsoft/rewrite/param/RegexParameterizedPatternParser.java index 418c576ec..43335478a 100644 --- a/api/src/main/java/org/ocpsoft/rewrite/param/RegexParameterizedPatternParser.java +++ b/api/src/main/java/org/ocpsoft/rewrite/param/RegexParameterizedPatternParser.java @@ -40,304 +40,306 @@ */ public class RegexParameterizedPatternParser implements ParameterizedPatternParser { - private static final String DEFAULT_PARAMETER_PATTERN = ".*"; - private Pattern compiledPattern; - private final String pattern; - private final char[] chars; - private final List groups = new ArrayList(); - private RegexParameterizedPatternBuilder builder; - private String defaultParameterPattern; - private ParameterStore store; - - RegexParameterizedPatternParser(RegexParameterizedPatternBuilder builder, - String defaultParameterPattern, String pattern) - { - this(defaultParameterPattern, pattern); - this.builder = builder; - } - - /** - * Create a new {@link RegexParameterizedPatternParser} instance with the default - * {@link org.ocpsoft.rewrite.bind.parse.CaptureType#BRACE} and parameter pattern of ".*". - */ - public RegexParameterizedPatternParser(final String pattern) - { - this(CaptureType.BRACE, DEFAULT_PARAMETER_PATTERN, pattern); - } - - /** - * Create a new {@link RegexParameterizedPatternParser} instance with the default {@link CaptureType#BRACE}. - */ - public RegexParameterizedPatternParser(final String parameterPattern, final String pattern) - { - this(CaptureType.BRACE, parameterPattern, pattern); - } - - /** - * Create a new {@link RegexParameterizedPatternParser} instance with the default parameter regex of ".*". - */ - public RegexParameterizedPatternParser(final CaptureType type, final String pattern) - { - this(type, DEFAULT_PARAMETER_PATTERN, pattern); - } - - /** - * Create a new {@link RegexParameterizedPatternParser} instance. - */ - public RegexParameterizedPatternParser(final CaptureType type, final String defaultParameterPattern, - final String pattern) - { - Assert.notNull(pattern, "Pattern must not be null"); - - this.defaultParameterPattern = defaultParameterPattern; - this.pattern = pattern; - chars = pattern.toCharArray(); - - if (chars.length > 0) - { - int parameterIndex = 0; - int cursor = 0; - while (cursor < chars.length) - { - switch (chars[cursor]) + private static final String DEFAULT_PARAMETER_PATTERN = ".*"; + private Pattern compiledPattern; + private final String pattern; + private final char[] chars; + private final List groups = new ArrayList(); + private RegexParameterizedPatternBuilder builder; + private String defaultParameterPattern; + private ParameterStore store; + + RegexParameterizedPatternParser(RegexParameterizedPatternBuilder builder, + String defaultParameterPattern, String pattern) + { + this(defaultParameterPattern, pattern); + this.builder = builder; + } + + /** + * Create a new {@link RegexParameterizedPatternParser} instance with the default + * {@link org.ocpsoft.rewrite.bind.parse.CaptureType#BRACE} and parameter pattern of ".*". + */ + public RegexParameterizedPatternParser(final String pattern) + { + this(CaptureType.BRACE, DEFAULT_PARAMETER_PATTERN, pattern); + } + + /** + * Create a new {@link RegexParameterizedPatternParser} instance with the default {@link CaptureType#BRACE}. + */ + public RegexParameterizedPatternParser(final String parameterPattern, final String pattern) + { + this(CaptureType.BRACE, parameterPattern, pattern); + } + + /** + * Create a new {@link RegexParameterizedPatternParser} instance with the default parameter regex of ".*". + */ + public RegexParameterizedPatternParser(final CaptureType type, final String pattern) + { + this(type, DEFAULT_PARAMETER_PATTERN, pattern); + } + + /** + * Create a new {@link RegexParameterizedPatternParser} instance. + */ + public RegexParameterizedPatternParser(final CaptureType type, final String defaultParameterPattern, + final String pattern) + { + Assert.notNull(pattern, "Pattern must not be null"); + + this.defaultParameterPattern = defaultParameterPattern; + this.pattern = pattern; + chars = pattern.toCharArray(); + + if (chars.length > 0) + { + int parameterIndex = 0; + int cursor = 0; + while (cursor < chars.length) { - case '{': - int startPos = cursor; - CapturingGroup group = ParseTools.balancedCapture(chars, startPos, chars.length - 1, type); - cursor = group.getEnd(); + switch (chars[cursor]) + { + case '{': + int startPos = cursor; + CapturingGroup group = ParseTools.balancedCapture(chars, startPos, chars.length - 1, type); + cursor = group.getEnd(); - groups.add(new RegexGroup(group, parameterIndex++)); + groups.add(new RegexGroup(group, parameterIndex++)); - break; + break; - default: - break; - } + default: + break; + } - cursor++; - } - } - } - - @Override - public boolean matches(String value) - { - return getMatcher(store, value).matches(); - } - - @Override - public boolean matches(final Rewrite event, final EvaluationContext context, final String value) - { - Matcher matcher = getMatcher(store, value); - boolean result = matcher.matches(); - if (result == true) - { - ParameterValueStore valueStore = (ParameterValueStore) context.get(ParameterValueStore.class); - - if (valueStore != null) - { - int group = 1; - for (RegexGroup param : groups) + cursor++; + } + } + } + + @Override + public ParameterizedPatternResult parse(final String value) + { + return new RegexParameterizedPatternMatchResult(groups, getCompiledPattern(store).matcher(value)); + } + + public Pattern getCompiledPattern(ParameterStore store) + { + if (compiledPattern == null) + { + StringBuilder patternBuilder = new StringBuilder(); + + CapturingGroup last = null; + for (RegexGroup group : groups) { - String paramValue = matcher.group(group++); - - Parameter globalParam = store.get(param.getName()); - if (!valueStore.submit(event, context, globalParam, paramValue)) - { - result = false; - break; - } + CapturingGroup capture = group.getCapture(); + + if ((last != null) && (last.getEnd() < capture.getStart() - 1)) + { + patternBuilder.append(new char[] { '\\', 'Q' }); + patternBuilder.append(Arrays.copyOfRange(chars, last.getEnd() + 1, capture.getStart())); + patternBuilder.append(new char[] { '\\', 'E' }); + } + else if ((last == null) && (capture.getStart() > 0)) + { + patternBuilder.append(new char[] { '\\', 'Q' }); + patternBuilder.append(Arrays.copyOfRange(chars, 0, capture.getStart())); + patternBuilder.append(new char[] { '\\', 'E' }); + } + + patternBuilder.append('('); + + StringBuilder parameterPatternBuilder = new StringBuilder(); + if (store != null) + { + if (store.contains(group.getName())) + { + Iterator> iterator = store.get(group.getName()).getConstraints().iterator(); + while (iterator.hasNext()) + { + Constraint constraint = iterator.next(); + if (constraint instanceof RegexConstraint) + { + parameterPatternBuilder.append("(?:"); + parameterPatternBuilder.append(((RegexConstraint) constraint).getPattern()); + parameterPatternBuilder.append(")"); + + if (iterator.hasNext()) + parameterPatternBuilder.append("|"); + } + } + } + } + + if (parameterPatternBuilder.length() > 0) + patternBuilder.append(parameterPatternBuilder); + else + patternBuilder.append(defaultParameterPattern); + + patternBuilder.append(')'); + + last = capture; } - } - } - - /* - * N-conditions with N-values for same parameter. If they are different, evaluation fails. If they are equal, we - * must create only one single binding operation. - */ - - return result; - } - - private Matcher getMatcher(ParameterStore store, final String value) - { - if (compiledPattern == null) - { - StringBuilder patternBuilder = new StringBuilder(); - - CapturingGroup last = null; - for (RegexGroup group : groups) - { - CapturingGroup capture = group.getCapture(); - if ((last != null) && (last.getEnd() < capture.getStart() - 1)) + if ((last != null) && (last.getEnd() < chars.length)) { - patternBuilder.append(new char[] { '\\', 'Q' }); - patternBuilder.append(Arrays.copyOfRange(chars, last.getEnd() + 1, capture.getStart())); - patternBuilder.append(new char[] { '\\', 'E' }); + patternBuilder.append(new char[] { '\\', 'Q' }); + patternBuilder.append(Arrays.copyOfRange(chars, last.getEnd() + 1, chars.length)); + patternBuilder.append(new char[] { '\\', 'E' }); } - else if ((last == null) && (capture.getStart() > 0)) + else if (last == null) { - patternBuilder.append(new char[] { '\\', 'Q' }); - patternBuilder.append(Arrays.copyOfRange(chars, 0, capture.getStart())); - patternBuilder.append(new char[] { '\\', 'E' }); + patternBuilder.append(new char[] { '\\', 'Q' }); + patternBuilder.append(chars); + patternBuilder.append(new char[] { '\\', 'E' }); } - patternBuilder.append('('); + compiledPattern = Pattern.compile(patternBuilder.toString()); + } + return compiledPattern; + } + + @Override + public String toString() + { + return new String(chars); + } + + @Override + public String getPattern() + { + return pattern; + } + + @Override + public ParameterizedPatternBuilder getBuilder() + { + if (builder == null) + { + builder = new RegexParameterizedPatternBuilder(pattern, this); + builder.setParameterStore(store); + } + return builder; + } + + class RegexGroup + { + private final CapturingGroup capture; + private final int index; + + public RegexGroup(final CapturingGroup capture, int index) + { + this.capture = capture; + this.index = index; + } + + public int getIndex() + { + return index; + } + + public String getName() + { + return new String(capture.getCaptured()); + } + + public CapturingGroup getCapture() + { + return capture; + } + + @Override + public String toString() + { + return "RegexParameter [name=" + getName() + ", capture=" + capture + "]"; + } + } + + @Override + public Set getRequiredParameterNames() + { + Set result = new LinkedHashSet(); + for (RegexGroup group : groups) + { + result.add(group.getName()); + } + return result; + } + + @Override + public void setParameterStore(ParameterStore store) + { + this.store = store; + } + + private static class RegexParameterizedPatternMatchResult implements ParameterizedPatternResult + { + private Matcher matcher; + private List groups; + private Boolean matched; + + public RegexParameterizedPatternMatchResult(List groups, Matcher matcher) + { + this.groups = groups; + this.matcher = matcher; + } + + /** + * Returns true if the {@link ParameterizedPattern} matched the input value, false if + * not. + */ + @Override + public boolean matches() + { + if (matched == null) + { + matched = matcher.matches(); + } + return matched; + } + + @Override + public Map, String> getParameters(EvaluationContext context) + { + Map, String> values = new LinkedHashMap, String>(); + ParameterStore store = DefaultParameterStore.getInstance(context); + + if (matcher.matches()) + { + for (RegexGroup group : groups) + { + values.put(store.get(group.getName()), matcher.group(group.getIndex() + 1)); + } + } + return values; + } - StringBuilder parameterPatternBuilder = new StringBuilder(); - if (store != null) + @Override + public boolean submit(Rewrite event, EvaluationContext context) + { + if (matches()) { - if (store.contains(group.getName())) - { - Iterator> iterator = store.get(group.getName()).getConstraints().iterator(); - while (iterator.hasNext()) - { - Constraint constraint = iterator.next(); - if (constraint instanceof RegexConstraint) - { - parameterPatternBuilder.append("(?:"); - parameterPatternBuilder.append(((RegexConstraint) constraint).getPattern()); - parameterPatternBuilder.append(")"); - - if (iterator.hasNext()) - parameterPatternBuilder.append("|"); - } - } - } + ParameterStore store = DefaultParameterStore.getInstance(context); + + int index = 1; + for (RegexGroup group : groups) + { + String value = matcher.group(index++); + Parameter param = store.get(group.getName()); + + ParameterValueStore valueStore = DefaultParameterValueStore.getInstance(context); + if (!valueStore.submit(event, context, param, value)) + { + return false; + } + } + + return true; } + return false; + } - if (parameterPatternBuilder.length() > 0) - patternBuilder.append(parameterPatternBuilder); - else - patternBuilder.append(defaultParameterPattern); - - patternBuilder.append(')'); - - last = capture; - } - - if ((last != null) && (last.getEnd() < chars.length)) - { - patternBuilder.append(Arrays.copyOfRange(chars, last.getEnd() + 1, chars.length)); - } - else if (last == null) - { - patternBuilder.append(new char[] { '\\', 'Q' }); - patternBuilder.append(chars); - patternBuilder.append(new char[] { '\\', 'E' }); - } - - compiledPattern = Pattern.compile(patternBuilder.toString()); - } - Matcher matcher = compiledPattern.matcher(value); - return matcher; - } - - @Override - public Map, String> parse(String value) - { - Map, String> values = new LinkedHashMap, String>(); - - Matcher matcher = getMatcher(store, value); - if (matcher.matches()) - { - for (RegexGroup group : groups) - { - values.put(store.get(group.getName()), matcher.group(group.getIndex() + 1)); - } - } - return values; - } - - @Override - public Map, String> parse(final Rewrite event, - final EvaluationContext context, - final String value) - { - Map, String> values = new LinkedHashMap, String>(); - - Matcher matcher = getMatcher(store, value); - if (matcher.matches()) - { - for (RegexGroup group : groups) - { - values.put(store.get(group.getName()), matcher.group(group.getIndex() + 1)); - } - } - return values; - } - - @Override - public String toString() - { - return new String(chars); - } - - @Override - public String getPattern() - { - return pattern; - } - - @Override - public ParameterizedPatternBuilder getBuilder() - { - if (builder == null) - { - builder = new RegexParameterizedPatternBuilder(pattern, this); - builder.setParameterStore(store); - } - return builder; - } - - class RegexGroup - { - private final CapturingGroup capture; - private final int index; - - public RegexGroup(final CapturingGroup capture, int index) - { - this.capture = capture; - this.index = index; - } - - public int getIndex() - { - return index; - } - - public String getName() - { - return new String(capture.getCaptured()); - } - - public CapturingGroup getCapture() - { - return capture; - } - - @Override - public String toString() - { - return "RegexParameter [name=" + getName() + ", capture=" + capture + "]"; - } - } - - @Override - public Set getRequiredParameterNames() - { - Set result = new LinkedHashSet(); - for (RegexGroup group : groups) - { - result.add(group.getName()); - } - return result; - } - - @Override - public void setParameterStore(ParameterStore store) - { - this.store = store; - } + } } diff --git a/api/src/main/java/org/ocpsoft/rewrite/util/ParameterUtils.java b/api/src/main/java/org/ocpsoft/rewrite/util/ParameterUtils.java index 39998879b..fb0ef816b 100644 --- a/api/src/main/java/org/ocpsoft/rewrite/util/ParameterUtils.java +++ b/api/src/main/java/org/ocpsoft/rewrite/util/ParameterUtils.java @@ -27,6 +27,7 @@ import org.ocpsoft.rewrite.event.Rewrite; import org.ocpsoft.rewrite.exception.RewriteException; import org.ocpsoft.rewrite.param.DefaultParameter; +import org.ocpsoft.rewrite.param.DefaultParameterStore; import org.ocpsoft.rewrite.param.Parameter; import org.ocpsoft.rewrite.param.ParameterStore; import org.ocpsoft.rewrite.param.Parameterized; @@ -38,18 +39,30 @@ */ public class ParameterUtils { + /** + * Initialize the {@link Parameterized} instance with the {@link ParameterStore} from the given + * {@link EvaluationContext}, also record required parameter names in the {@link ParameterStore} and initialize with + * a new {@link Parameter} instance. + */ + public static void initialize(EvaluationContext context, Object parameterized) + { + initialize(DefaultParameterStore.getInstance(context), parameterized); + } + /** * Initialize the {@link Parameterized} instance with the given {@link ParameterStore}, also record required * parameter names in the {@link ParameterStore} and initialize with a new {@link Parameter} instance. */ - public static void initialize(ParameterStore store, Parameterized parameterized) + public static void initialize(ParameterStore store, Object parameterized) { - Set names = parameterized.getRequiredParameterNames(); - for (String name : names) { - store.get(name, new DefaultParameter(name)); + if (parameterized instanceof Parameterized) + { + Set names = ((Parameterized) parameterized).getRequiredParameterNames(); + for (String name : names) { + store.get(name, new DefaultParameter(name)); + } + ((Parameterized) parameterized).setParameterStore(store); } - - parameterized.setParameterStore(store); } /** diff --git a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/DomainTest.java b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/DomainTest.java index b442e3e6a..d3c153d09 100644 --- a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/DomainTest.java +++ b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/DomainTest.java @@ -23,8 +23,6 @@ import org.mockito.Mockito; import org.ocpsoft.rewrite.event.Rewrite; import org.ocpsoft.rewrite.mock.MockEvaluationContext; -import org.ocpsoft.rewrite.param.DefaultParameterStore; -import org.ocpsoft.rewrite.param.ParameterStore; import org.ocpsoft.rewrite.servlet.impl.HttpInboundRewriteImpl; import org.ocpsoft.rewrite.servlet.impl.HttpOutboundRewriteImpl; import org.ocpsoft.rewrite.util.ParameterUtils; @@ -64,8 +62,7 @@ public void testCanConvertAndValidateDomain() throws Exception MockEvaluationContext context = new MockEvaluationContext(); Domain hostname = Domain.matches("{p}.com"); - ParameterStore parameters = new DefaultParameterStore(); - ParameterUtils.initialize(parameters, hostname); + ParameterUtils.initialize(context, hostname); Assert.assertTrue(hostname.evaluate(inbound, context)); } diff --git a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/HeaderAndPathTest.java b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/HeaderAndPathTest.java index 52b933c2e..c107f74a8 100644 --- a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/HeaderAndPathTest.java +++ b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/HeaderAndPathTest.java @@ -27,6 +27,7 @@ import org.ocpsoft.rewrite.event.Rewrite; import org.ocpsoft.rewrite.mock.MockEvaluationContext; import org.ocpsoft.rewrite.servlet.impl.HttpInboundRewriteImpl; +import org.ocpsoft.rewrite.util.ParameterUtils; /** * @author Lincoln Baxter, III @@ -34,46 +35,49 @@ */ public class HeaderAndPathTest { - private Rewrite rewrite; - private HttpServletRequest request; + private Rewrite rewrite; + private HttpServletRequest request; - @Before - public void before() - { - request = Mockito.mock(HttpServletRequest.class); - Mockito.when(request.getHeaderNames()) - .thenReturn(Collections.enumeration(Arrays.asList("Accept-Charset", "Content-Length"))); + @Before + public void before() + { + request = Mockito.mock(HttpServletRequest.class); + Mockito.when(request.getHeaderNames()) + .thenReturn(Collections.enumeration(Arrays.asList("Accept-Charset", "Content-Length"))); - Mockito.when(request.getHeaders("Content-Length")) - .thenReturn(Collections.enumeration(Arrays.asList("06091984"))); + Mockito.when(request.getHeaders("Content-Length")) + .thenReturn(Collections.enumeration(Arrays.asList("06091984"))); - Mockito.when(request.getHeaders("Accept-Charset")) - .thenReturn(Collections.enumeration(Arrays.asList("ISO-9965", "UTF-8"))); + Mockito.when(request.getHeaders("Accept-Charset")) + .thenReturn(Collections.enumeration(Arrays.asList("ISO-9965", "UTF-8"))); - Mockito.when(request.getRequestURI()) - .thenReturn("/context/application/path"); + Mockito.when(request.getRequestURI()) + .thenReturn("/context/application/path"); - Mockito.when(request.getContextPath()) - .thenReturn("/context"); + Mockito.when(request.getContextPath()) + .thenReturn("/context"); - rewrite = new HttpInboundRewriteImpl(request, null, null); - } + rewrite = new HttpInboundRewriteImpl(request, null, null); + } - @Test - public void testHeaderAndPath() - { - Assert.assertTrue( - Path.matches("/application/{seg}").and( - Header.exists("Accept-{charset}")) - .evaluate(rewrite, new MockEvaluationContext())); - } + @Test + public void testHeaderAndPath() + { + MockEvaluationContext context = new MockEvaluationContext(); + Path path = Path.matches("/application/{seg}"); + ParameterUtils.initialize(context, path); + Header header = Header.exists("Accept-{charset}"); + ParameterUtils.initialize(context, header); - @Test - public void testHeaderAndPathDoNotMatch() - { - Assert.assertFalse( - Path.matches("/wrong-application/{path}").and( - Header.exists("Accept-{charset}") - ).evaluate(rewrite, new MockEvaluationContext())); - } + Assert.assertTrue(path.and(header).evaluate(rewrite, context)); + } + + @Test + public void testHeaderAndPathDoNotMatch() + { + Assert.assertFalse( + Path.matches("/wrong-application/{path}").and( + Header.exists("Accept-{charset}") + ).evaluate(rewrite, new MockEvaluationContext())); + } } diff --git a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/HeaderTest.java b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/HeaderTest.java index eefb2cc60..fe916c627 100644 --- a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/HeaderTest.java +++ b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/HeaderTest.java @@ -64,13 +64,19 @@ public void before() @Test public void testHeaderExists() { - Assert.assertTrue(Header.exists("Accept-{head}").evaluate(rewrite, new MockEvaluationContext())); + Header header = Header.exists("Accept-{head}"); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, header); + Assert.assertTrue(header.evaluate(rewrite, context)); } @Test public void testHeaderExists2() { - Assert.assertTrue(Header.exists("Content-Length").evaluate(rewrite, new MockEvaluationContext())); + Header header = Header.exists("Content-Length"); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, header); + Assert.assertTrue(header.evaluate(rewrite, context)); } @Test @@ -82,7 +88,10 @@ public void testHeaderExistsFalse() @Test public void testHeaderContains() { - Assert.assertTrue(Header.valueExists("UTF-{enc}").evaluate(rewrite, new MockEvaluationContext())); + Header header = Header.valueExists("UTF-{enc}"); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, header); + Assert.assertTrue(header.evaluate(rewrite, context)); } @Test @@ -90,14 +99,15 @@ public void testHeaderMatches() { Header header = Header.matches("Accept-Charset", "{enc}"); - ParameterStore parameters = new DefaultParameterStore(); - ParameterUtils.initialize(parameters, header); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, header); + ParameterStore parameters = DefaultParameterStore.getInstance(context); Parameter parameter = parameters.get("enc"); if (parameter instanceof ConfigurableParameter) ((ParameterConfiguration) parameter).constrainedBy(new RegexConstraint("(ISO|UTF)-\\d+")); - Assert.assertTrue(header.evaluate(rewrite, new MockEvaluationContext())); + Assert.assertTrue(header.evaluate(rewrite, context)); } @Test diff --git a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/PathTest.java b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/PathTest.java index 73dbe5b50..54a5063e5 100644 --- a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/PathTest.java +++ b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/PathTest.java @@ -65,7 +65,10 @@ public void testPathImplementsParameterized() throws Exception @Test public void testMatchesWithParameters() { - Assert.assertTrue(Path.matches("/application/{seg}").evaluate(rewrite, new MockEvaluationContext())); + Path path = Path.matches("/application/{seg}"); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, path); + Assert.assertTrue(path.evaluate(rewrite, context)); } @Test @@ -73,10 +76,9 @@ public void testAttemptsMatchesParameters() { Path path = Path.matches("/application/{seg}"); - ParameterStore store = new DefaultParameterStore(); - ParameterUtils.initialize(store, path); - MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, path); + Assert.assertTrue(path.evaluate(rewrite, context)); } @@ -90,7 +92,10 @@ public void testMatchesLiteral() @Test public void testMatchesPattern() { - Assert.assertTrue(Path.matches("/application/{param}").evaluate(rewrite, new MockEvaluationContext())); + Path path = Path.matches("/application/{param}"); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, path); + Assert.assertTrue(path.evaluate(rewrite, context)); } @Test diff --git a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/QueryEncodingTest.java b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/QueryEncodingTest.java index f1e30153d..b7c3671f4 100644 --- a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/QueryEncodingTest.java +++ b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/QueryEncodingTest.java @@ -102,7 +102,6 @@ public void testQueryStringBindsToEntireValue() query.setParameterStore(store); Assert.assertTrue(query.evaluate(rewrite, context)); - MockEvaluationContext context = new MockEvaluationContext(); Assert.assertTrue(query.evaluate(rewrite, context)); } diff --git a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/RequestParameterTest.java b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/RequestParameterTest.java index 94787c39b..1a2fc235d 100644 --- a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/RequestParameterTest.java +++ b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/RequestParameterTest.java @@ -69,13 +69,19 @@ public void before() @Test public void testRequestParameterExists() { - Assert.assertTrue(RequestParameter.exists("foo").evaluate(rewrite, new MockEvaluationContext())); + RequestParameter parameter = RequestParameter.exists("foo"); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, parameter); + Assert.assertTrue(parameter.evaluate(rewrite, context)); } @Test public void testRequestParameterExists2() { - Assert.assertTrue(RequestParameter.exists("baz").evaluate(rewrite, new MockEvaluationContext())); + RequestParameter parameter = RequestParameter.exists("baz"); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, parameter); + Assert.assertTrue(parameter.evaluate(rewrite, context)); } @Test @@ -87,59 +93,67 @@ public void testRequestParameterExistsFalse() @Test public void testRequestParameterContains() { - Assert.assertTrue(RequestParameter.valueExists("bar").evaluate(rewrite, new MockEvaluationContext())); + RequestParameter parameter = RequestParameter.valueExists("bar"); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, parameter); + Assert.assertTrue(parameter.evaluate(rewrite, context)); } @Test public void testRequestParameterMatches() { - RequestParameter requestParam = RequestParameter.matches("foo", "{value}"); + RequestParameter parameter = RequestParameter.matches("foo", "{value}"); - ParameterStore store = new DefaultParameterStore(); - ParameterUtils.initialize(store, requestParam); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, parameter); + Assert.assertTrue(parameter.evaluate(rewrite, context)); - Parameter parameter = store.get("value"); - ((ParameterConfiguration) parameter).constrainedBy(new RegexConstraint("(bar|baz)")); - Assert.assertTrue(requestParam.evaluate(rewrite, new MockEvaluationContext())); + ParameterStore store = DefaultParameterStore.getInstance(context); + Parameter p = store.get("value"); + ((ParameterConfiguration) p).constrainedBy(new RegexConstraint("(bar|baz)")); + Assert.assertFalse(parameter.evaluate(rewrite, context)); } @Test public void testRequestParameterMatchesAll() { - RequestParameter requestParam = RequestParameter.matchesAll("baz", "{value}"); + RequestParameter requestParam = RequestParameter.matchesAll("baz", "{*}"); - ParameterStore store = new DefaultParameterStore(); - ParameterUtils.initialize(store, requestParam); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, requestParam); - ((ParameterConfiguration) store.get("value")).constrainedBy(new RegexConstraint("(cab|caz)")); - Assert.assertTrue(requestParam.evaluate(rewrite, new MockEvaluationContext())); + Assert.assertTrue(requestParam.evaluate(rewrite, context)); } @Test public void testRequestParameterMatchesAllNamesAllValues() { - Assert.assertTrue(RequestParameter.matchesAll("{name}", "{value}") - .evaluate(rewrite, new MockEvaluationContext())); + RequestParameter parameter = RequestParameter.matchesAll("{name}", "{value}"); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, parameter); + Assert.assertTrue(parameter.evaluate(rewrite, context)); } @Test public void testRequestParameterMatchesAllNamesNotValues() { - RequestParameter requestParam = RequestParameter.matchesAll("{name}", "{value}"); - ParameterStore store = new DefaultParameterStore(); - ParameterUtils.initialize(store, requestParam); + RequestParameter parameter = RequestParameter.matchesAll("{name}", "{value}"); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, parameter); + ParameterStore store = DefaultParameterStore.getInstance(context); ((ParameterConfiguration) store.get("value")).constrainedBy(new RegexConstraint("nothing")); - Assert.assertFalse(requestParam.evaluate(rewrite, new MockEvaluationContext())); + Assert.assertFalse(parameter.evaluate(rewrite, context)); } @Test public void testRequestParameterMatchesAllNotName() { RequestParameter requestParam = RequestParameter.matchesAll("{name}", "{value}"); - ParameterStore store = new DefaultParameterStore(); - ParameterUtils.initialize(store, requestParam); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, requestParam); + ParameterStore store = DefaultParameterStore.getInstance(context); ((ParameterConfiguration) store.get("name")).constrainedBy(new RegexConstraint("nothing")); Assert.assertFalse(requestParam.evaluate(rewrite, new MockEvaluationContext())); } @@ -148,11 +162,13 @@ public void testRequestParameterMatchesAllNotName() public void testRequestParameterMatchesAllInvalid() { RequestParameter requestParam = RequestParameter.matchesAll("baz", "{value}"); - ParameterStore store = new DefaultParameterStore(); - ParameterUtils.initialize(store, requestParam); + + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, requestParam); + ParameterStore store = DefaultParameterStore.getInstance(context); ((ParameterConfiguration) store.get("value")).constrainedBy(new RegexConstraint("(cab|xxx)")); - Assert.assertFalse(requestParam.evaluate(rewrite, new MockEvaluationContext())); + Assert.assertFalse(requestParam.evaluate(rewrite, context)); } @Test diff --git a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/SchemeTest.java b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/SchemeTest.java index ab5669f11..72a65f3b1 100644 --- a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/SchemeTest.java +++ b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/SchemeTest.java @@ -23,8 +23,6 @@ import org.mockito.Mockito; import org.ocpsoft.rewrite.event.Rewrite; import org.ocpsoft.rewrite.mock.MockEvaluationContext; -import org.ocpsoft.rewrite.param.DefaultParameterStore; -import org.ocpsoft.rewrite.param.ParameterStore; import org.ocpsoft.rewrite.servlet.impl.HttpInboundRewriteImpl; import org.ocpsoft.rewrite.servlet.impl.HttpOutboundRewriteImpl; import org.ocpsoft.rewrite.util.ParameterUtils; @@ -64,8 +62,7 @@ public void testShemeMatchesInboundParameterized() MockEvaluationContext context = new MockEvaluationContext(); Scheme scheme = Scheme.matches("{scheme}"); - ParameterStore store = new DefaultParameterStore(); - ParameterUtils.initialize(store, scheme); + ParameterUtils.initialize(context, scheme); Assert.assertTrue(scheme.evaluate(inbound, context)); } diff --git a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/URLTest.java b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/URLTest.java index 9531ffa72..68b9011ab 100644 --- a/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/URLTest.java +++ b/config-servlet-tests/src/test/java/org/ocpsoft/rewrite/servlet/config/URLTest.java @@ -69,8 +69,10 @@ public void before() @Test public void testMatchesWithParameters() { - Assert.assertTrue(URL.matches("http://domain.com:8080/context/application/{seg}?foo=bar&baz=bazaar").evaluate( - rewrite, new MockEvaluationContext())); + MockEvaluationContext context = new MockEvaluationContext(); + URL url = URL.matches("http://domain.com:8080/context/application/{seg}?foo=bar&baz=bazaar"); + ParameterUtils.initialize(context, url); + Assert.assertTrue(url.evaluate(rewrite, context)); } @Test @@ -78,13 +80,13 @@ public void testUrlMatchesWithParameters() { URL url = URL.matches("{prefix}/application/{seg}{suffix}"); - ParameterStore store = new DefaultParameterStore(); - ParameterUtils.initialize(store, url); + MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, url); - ((ParameterConfiguration) store.get("prefix")).constrainedBy(new RegexConstraint(".*")); + ParameterStore store = DefaultParameterStore.getInstance(context); + ((ParameterConfiguration) store .get("prefix")).constrainedBy(new RegexConstraint(".*")); ((ParameterConfiguration) store.get("suffix")).constrainedBy(new RegexConstraint("\\?.*")); - MockEvaluationContext context = new MockEvaluationContext(); Assert.assertTrue(url.evaluate(rewrite, context)); } @@ -93,10 +95,9 @@ public void testCaptureMatches() { URL url = URL.captureIn("foo"); - ParameterStore store = new DefaultParameterStore(); - ParameterUtils.initialize(store, url); - MockEvaluationContext context = new MockEvaluationContext(); + ParameterUtils.initialize(context, url); + Assert.assertTrue(url.evaluate(rewrite, context)); } diff --git a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Domain.java b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Domain.java index 6c5ae14d5..eedc96a30 100644 --- a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Domain.java +++ b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Domain.java @@ -83,7 +83,7 @@ public boolean evaluateHttp(final HttpServletRewrite event, final EvaluationCont else hostName = event.getRequest().getServerName(); - return (hostName != null && expression.matches(event, context, hostName)); + return (hostName != null && expression.parse(hostName).submit(event, context)); } /** diff --git a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Header.java b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Header.java index c51822679..3098dbb5f 100644 --- a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Header.java +++ b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Header.java @@ -148,7 +148,7 @@ public boolean evaluateHttp(final HttpServletRewrite event, final EvaluationCont { for (String header : Collections.list(headerNames)) { - if (name.matches(event, context, header) && matchesValue(event, context, request, header)) + if (name.parse(header).submit(event, context) && matchesValue(event, context, request, header)) { return true; } @@ -166,7 +166,7 @@ private boolean matchesValue(Rewrite event, EvaluationContext context, final Htt { for (String contents : Collections.list(headers)) { - if (value.matches(event, context, contents)) + if (value.parse(contents).submit(event, context)) { return true; } diff --git a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Path.java b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Path.java index aba171c89..e8a78beee 100644 --- a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Path.java +++ b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Path.java @@ -135,7 +135,7 @@ public boolean evaluateHttp(final HttpServletRewrite event, final EvaluationCont if (!contextPath.equals("/") && url.startsWith(contextPath)) url = url.substring(contextPath.length()); - return (expression.matches(event, context, url)); + return expression.parse(url).submit(event, context); } /** diff --git a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/PathAndQuery.java b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/PathAndQuery.java index 8d9ba8a40..e4935ea98 100644 --- a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/PathAndQuery.java +++ b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/PathAndQuery.java @@ -138,7 +138,7 @@ public boolean evaluateHttp(final HttpServletRewrite event, final EvaluationCont if (!contextPath.equals("/") && url.startsWith(contextPath)) url = url.substring(contextPath.length()); - return (expression.matches(event, context, url)); + return (expression.parse(url).submit(event, context)); } /** diff --git a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Query.java b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Query.java index a6b9ac75b..0b950f31c 100644 --- a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Query.java +++ b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Query.java @@ -29,6 +29,7 @@ import org.ocpsoft.rewrite.param.Parameterized; import org.ocpsoft.rewrite.param.ParameterizedPattern; import org.ocpsoft.rewrite.param.ParameterizedPatternParser; +import org.ocpsoft.rewrite.param.ParameterizedPatternResult; import org.ocpsoft.rewrite.param.RegexParameterizedPatternParser; import org.ocpsoft.rewrite.servlet.http.event.HttpOutboundServletRewrite; import org.ocpsoft.rewrite.servlet.http.event.HttpServletRewrite; @@ -81,10 +82,10 @@ else if (event instanceof HttpOutboundServletRewrite) queryString = ((HttpOutboundServletRewrite) event).getOutboundAddress().getQuery(); } - if (pattern.matches(event, context, queryString == null ? "" : queryString)) + if (pattern.parse(queryString == null ? "" : queryString).submit(event, context)) { ParameterValueStore values = (ParameterValueStore) context.get(ParameterValueStore.class); - for (Entry, String> entry : pattern.parse(event, context, query).entrySet()) { + for (Entry, String> entry : pattern.parse(query).getParameters(context).entrySet()) { values.submit(event, context, store.get(entry.getKey().getName()), entry.getValue()); } return true; @@ -151,18 +152,16 @@ public boolean evaluateHttp(final HttpServletRewrite event, final EvaluationCont { if (parameterValues == null || (parameterValues.length == 0)) { - return pattern.matches(""); + return pattern.parse("").matches(); } else { for (String value : parameterValues) { - if (pattern.matches(value)) + ParameterizedPatternResult parseResult = pattern.parse(value); + if (parseResult.matches()) { - // FIXME this probably isn't required since .matches() does this. - ParameterStore store = (ParameterStore) context.get(ParameterStore.class); - ParameterValueStore values = (ParameterValueStore) context.get(ParameterValueStore.class); - return values.submit(event, context, store.get(parameterName), value); + return parseResult.submit(event, context); } } } @@ -217,7 +216,7 @@ public boolean evaluateHttp(final HttpServletRewrite event, final EvaluationCont for (String name : queryString.getParameterNames()) { for (String value : queryString.getParameterValues(name)) { - if (value != null && pattern.matches(event, context, value)) + if (value != null && pattern.parse(value).submit(event, context)) { return true; } diff --git a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/RequestParameter.java b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/RequestParameter.java index 134658ba0..9680f5877 100644 --- a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/RequestParameter.java +++ b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/RequestParameter.java @@ -152,7 +152,7 @@ public boolean evaluateHttp(final HttpServletRewrite event, final EvaluationCont while (parameterNames.hasMoreElements()) { String parameter = parameterNames.nextElement().toString(); - if (name.matches(event, context, parameter) && matchesValue(event, context, request, parameter)) + if (name.parse(parameter).submit(event, context) && matchesValue(event, context, request, parameter)) { return true; } @@ -165,7 +165,7 @@ private boolean matchesValue(Rewrite event, EvaluationContext context, final Htt { for (String contents : Arrays.asList(request.getParameterValues(parameterName))) { - if (value.matches(event, context, contents)) + if (value.parse(contents).submit(event, context)) { return true; } @@ -204,7 +204,7 @@ public boolean evaluateHttp(final HttpServletRewrite event, final EvaluationCont while (parameterNames.hasMoreElements()) { String name = parameterNames.nextElement().toString(); - if (getNameExpression().matches(event, context, name)) + if (getNameExpression().parse(name).submit(event, context)) { if (matchesValues(event, context, request, name)) { @@ -220,7 +220,7 @@ private boolean matchesValues(Rewrite event, EvaluationContext context, final Ht { for (String contents : Arrays.asList(request.getParameterValues(name))) { - if (!getValueExpression().matches(event, context, contents)) + if (!getValueExpression().parse(contents).submit(event, context)) { return false; } diff --git a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Resource.java b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Resource.java index 2ba6b91b4..7b4302562 100644 --- a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Resource.java +++ b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Resource.java @@ -78,7 +78,7 @@ public boolean evaluateHttp(final HttpServletRewrite event, final EvaluationCont Set paths = event.getServletContext().getResourcePaths("/"); for (String path : paths) { - if (resource.matches(path)) + if (resource.parse(path).matches()) { return true; } diff --git a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Scheme.java b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Scheme.java index 3d4d8a939..7b4a486d2 100644 --- a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Scheme.java +++ b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/Scheme.java @@ -90,7 +90,7 @@ public boolean evaluateHttp(final HttpServletRewrite event, final EvaluationCont else scheme = event.getRequest().getScheme(); - return (scheme != null && expression.matches(event, context, scheme)); + return (scheme != null && expression.parse(scheme).submit(event, context)); } /** diff --git a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/URL.java b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/URL.java index e20b83820..6c6d77156 100644 --- a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/URL.java +++ b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/URL.java @@ -139,7 +139,7 @@ public boolean evaluateHttp(final HttpServletRewrite event, final EvaluationCont requestURL = event.getAddress().toString(); } - return expression.matches(event, context, requestURL); + return expression.parse(requestURL).submit(event, context); } /** diff --git a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/UserAgent.java b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/UserAgent.java index 84909b4f8..db97eb378 100644 --- a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/UserAgent.java +++ b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/UserAgent.java @@ -150,7 +150,7 @@ private PatternUserAgent(final String pattern) public boolean evaluateHttp(final HttpServletRewrite event, final EvaluationContext context) { String agent = event.getRequest().getHeader("user-agent"); - return agent != null && expression.matches(event, context, agent); + return agent != null && expression.parse(agent).submit(event, context); } @Override diff --git a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/rule/Join.java b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/rule/Join.java index b89dec00f..3c12b4d14 100644 --- a/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/rule/Join.java +++ b/config-servlet/src/main/java/org/ocpsoft/rewrite/servlet/config/rule/Join.java @@ -298,7 +298,7 @@ else if (event instanceof HttpOutboundServletRewrite) rewrittenPath = rewrittenPath.substring(contextPath.length()); if (!outboundAddress.equals(rewrittenAddress) - && !requestPath.getExpression().matches(event, context, rewrittenPath)) + && !requestPath.getExpression().parse(rewrittenPath).submit(event, context)) { ((HttpOutboundServletRewrite) event).setOutboundAddress(rewrittenAddress); } diff --git a/impl-servlet/src/main/java/org/ocpsoft/rewrite/servlet/impl/DefaultHttpRewriteProvider.java b/impl-servlet/src/main/java/org/ocpsoft/rewrite/servlet/impl/DefaultHttpRewriteProvider.java index fd8bb7a56..d50f8961f 100644 --- a/impl-servlet/src/main/java/org/ocpsoft/rewrite/servlet/impl/DefaultHttpRewriteProvider.java +++ b/impl-servlet/src/main/java/org/ocpsoft/rewrite/servlet/impl/DefaultHttpRewriteProvider.java @@ -409,7 +409,7 @@ private boolean handleBindings(final HttpServletRewrite event, final EvaluationC for (Entry> entry : store) { Parameter parameter = entry.getValue(); - String value = values.get(parameter); + String value = values.retrieve(parameter); if (!ParameterUtils.enqueueSubmission(event, context, parameter, value)) { diff --git a/test-harness/src/main/java/org/ocpsoft/rewrite/mock/MockEvaluationContext.java b/test-harness/src/main/java/org/ocpsoft/rewrite/mock/MockEvaluationContext.java index 67f9cc2f4..953e2e5e1 100644 --- a/test-harness/src/main/java/org/ocpsoft/rewrite/mock/MockEvaluationContext.java +++ b/test-harness/src/main/java/org/ocpsoft/rewrite/mock/MockEvaluationContext.java @@ -23,6 +23,10 @@ import org.ocpsoft.rewrite.context.ContextBase; import org.ocpsoft.rewrite.context.EvaluationContext; import org.ocpsoft.rewrite.context.RewriteState; +import org.ocpsoft.rewrite.param.DefaultParameterStore; +import org.ocpsoft.rewrite.param.DefaultParameterValueStore; +import org.ocpsoft.rewrite.param.ParameterStore; +import org.ocpsoft.rewrite.param.ParameterValueStore; /** * @author Lincoln Baxter, III @@ -33,6 +37,12 @@ public class MockEvaluationContext extends ContextBase implements EvaluationCont private final List preOperations = new ArrayList(); private final List postOperations = new ArrayList(); + public MockEvaluationContext() + { + put(ParameterStore.class, new DefaultParameterStore()); + put(ParameterValueStore.class, new DefaultParameterValueStore()); + } + @Override public void addPreOperation(final Operation operation) {