You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2008/02/10 20:18:14 UTC

svn commit: r620310 - in /incubator/abdera/java/trunk: dependencies/i18n/src/main/java/org/apache/abdera/i18n/templates/Route.java server/src/test/java/org/apache/abdera/protocol/server/test/route/RouteTest.java

Author: jmsnell
Date: Sun Feb 10 11:18:13 2008
New Revision: 620310

URL: http://svn.apache.org/viewvc?rev=620310&view=rev
Log:
Per https://issues.apache.org/jira/browse/ABDERA-111

Modified:
    incubator/abdera/java/trunk/dependencies/i18n/src/main/java/org/apache/abdera/i18n/templates/Route.java
    incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/test/route/RouteTest.java

Modified: incubator/abdera/java/trunk/dependencies/i18n/src/main/java/org/apache/abdera/i18n/templates/Route.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/dependencies/i18n/src/main/java/org/apache/abdera/i18n/templates/Route.java?rev=620310&r1=620309&r2=620310&view=diff
==============================================================================
--- incubator/abdera/java/trunk/dependencies/i18n/src/main/java/org/apache/abdera/i18n/templates/Route.java (original)
+++ incubator/abdera/java/trunk/dependencies/i18n/src/main/java/org/apache/abdera/i18n/templates/Route.java Sun Feb 10 11:18:13 2008
@@ -29,11 +29,14 @@
   
   private static final Evaluator EVALUATOR = new Evaluator();
   private static final Pattern VARIABLE = Pattern.compile("[\\*\\:](?:\\()?[0-9a-zA-Z]+(?:\\))?");
-  
+  private static final String VARIABLE_CONTENT_MATCH = "([^:/\\?#\\[\\]@!\\$&'\\(\\)\\*\\+,;\\=]+)";
+  private static final String VARIABLE_CONTENT_PARSE = "([^:/\\?#\\[\\]@!\\$&'\\(\\)\\*\\+,;\\=]*)";
   private final String name;
   private final String pattern;
   private final String[] tokens;
   private final String[] variables;
+  private final Pattern regexMatch;
+  private final Pattern regexParse;
 
   private Map<String, String> requirements;
 
@@ -50,6 +53,8 @@
     this.variables = initVariables();
     this.defaultValues = defaultValues;
     this.requirements = requirements;
+    this.regexMatch = initRegexMatch();
+    this.regexParse = initRegexParse();
   }
   
   private String[] initTokens() {
@@ -73,47 +78,36 @@
     Arrays.sort(vars);
     return vars;
   }
+
+  private Pattern initRegexMatch() {
+    StringBuffer match = new StringBuffer();
+    int cnt = 0;
+    for (String part : VARIABLE.split(pattern)) {
+      match.append(Pattern.quote(part));
+      if (cnt++ < tokens.length) {
+        match.append(VARIABLE_CONTENT_MATCH);
+      }
+    }
+    return Pattern.compile(match.toString());
+  }
+  private Pattern initRegexParse() {
+    StringBuffer parse = new StringBuffer();
+    int cnt = 0;
+    for (String part : VARIABLE.split(pattern)) {
+      parse.append(Pattern.quote(part));
+      if (cnt++ < tokens.length) {
+        parse.append(VARIABLE_CONTENT_PARSE);
+      }
+    }
+    return Pattern.compile(parse.toString());
+  }
+
   
   /**
    * Returns true if the given uri matches the route pattern
    */
   public boolean match(String uri) {
-    Matcher matcher = VARIABLE.matcher(pattern);
-    int uriStart = 0;
-    int prevPatternEnd = 0;
-    while (matcher.find()) {
-      int patternStart = matcher.start();
-      
-      String nonVariablePattern = pattern.substring(prevPatternEnd, patternStart);
-      if (prevPatternEnd == 0 && nonVariablePattern.length() == 0) {
-        prevPatternEnd = matcher.end();
-        continue;
-      }
-      
-      int idx = uri.indexOf(nonVariablePattern, uriStart);
-      if ((idx == -1 || idx+1 == uri.length()) && (defaultValues == null || !defaultValues.containsKey(var(matcher.group())))) {
-        return false;
-      } else {
-        uriStart = idx + 1 + nonVariablePattern.length();
-      }
-      
-      // TODO: ensure requirements are met
-      
-      prevPatternEnd = matcher.end();
-    }
-    
-    // Check if the non variable, end segment matches
-    if (prevPatternEnd != pattern.length()) {
-      if (!uri.endsWith(pattern.substring(prevPatternEnd))) {
-        return false;
-      } else {
-        return true;
-      }
-    } else if (uriStart > uri.length()) {
-      return false;
-    }
-    
-    return uri.indexOf('/', uriStart) == -1;
+    return regexMatch.matcher(uri).matches();
   }
   
   /**
@@ -121,50 +115,11 @@
    */
   public Map<String,String> parse(String uri) {
     HashMap<String, String> vars = new HashMap<String, String>();
-    Matcher matcher = VARIABLE.matcher(pattern);
-    int uriStart = 0;
-    int prevPatternEnd = 0;
-    int valueStart = -1;
-    int nonVarIdx = -1; 
-    String prevVar = null;
-    while (matcher.find()) {
-      int patternStart = matcher.start();
-      String varName = var(matcher.group());
-      
-      String nonVariableSection = pattern.substring(prevPatternEnd, patternStart);
-      if (prevPatternEnd == 0 && nonVariableSection.length() == 0) {
-        prevPatternEnd = matcher.end();
-        valueStart = 0;
-        continue;
+    Matcher matcher = regexParse.matcher(uri);
+    if (matcher.matches()) {
+      for (int i = 0; i < matcher.groupCount(); i++) {
+        vars.put(var(tokens[i]), matcher.group(i+1).length() > 0 ? matcher.group(i+1) : null);
       }
-
-      nonVarIdx = uri.indexOf(nonVariableSection, uriStart);
-      
-      if (valueStart != -1) {
-        vars.put(prevVar, uri.substring(valueStart, nonVarIdx));
-      }
-      
-      if ((nonVarIdx == -1 || nonVarIdx+1 == uri.length()) && (defaultValues == null || !defaultValues.containsKey(varName))) {
-        valueStart = -1;
-        break;
-      }
-
-      // TODO: ensure requirements are met
-      
-      valueStart = nonVarIdx + nonVariableSection.length();
-      
-      uriStart = valueStart + 1;
-      prevVar = varName;
-      prevPatternEnd = matcher.end();
-    }
-    
-    int tailEnd = uri.length();
-    if (prevPatternEnd != pattern.length() && uri.endsWith(pattern.substring(prevPatternEnd))) {
-      tailEnd = tailEnd - (pattern.length() - prevPatternEnd);
-    }
-    
-    if (valueStart != uri.length() && valueStart != -1) {
-      vars.put(prevVar, uri.substring(valueStart, tailEnd));
     }
     
     return vars;

Modified: incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/test/route/RouteTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/test/route/RouteTest.java?rev=620310&r1=620309&r2=620310&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/test/route/RouteTest.java (original)
+++ incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/test/route/RouteTest.java Sun Feb 10 11:18:13 2008
@@ -3,12 +3,12 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import junit.framework.Assert;
+
 import org.apache.abdera.i18n.templates.HashMapContext;
 import org.apache.abdera.i18n.templates.Route;
 import org.junit.Test;
 
-import junit.framework.Assert;
-
 public class RouteTest extends Assert {
   @Test
   public void testSimpleRoute() throws Exception {
@@ -52,6 +52,7 @@
     assertFalse(route.match("/foo"));
     assertTrue(route.match("/foo/test"));
     assertFalse(route.match("foo"));
+    assertFalse(route.match("/foo/test/bar"));
 
     Map<String, String> vars = route.parse("/1/2");
     assertEquals("1", vars.get("collection"));
@@ -129,4 +130,26 @@
     assertEquals("1", vars.get("collection"));
     assertEquals("2", vars.get("entry"));
   }
+  @Test
+  public void testSubDelims() throws Exception {
+    Route route = new Route("entry", "/base/:collection/:entry");
+
+    assertTrue(route.match("/base/test/123"));
+    assertFalse(route.match("/base/test/123;categories"));
+    
+    Map<String, String> vars = route.parse("/base/test/123");
+    assertEquals("test", vars.get("collection"));
+    assertEquals("123", vars.get("entry"));
+  }
+  @Test
+  public void testGenDelims() throws Exception {
+    Route route = new Route("entry", "/base/:collection/");
+
+    assertTrue(route.match("/base/test/"));
+    assertFalse(route.match("/base/test/123/"));
+    
+    Map<String, String> vars = route.parse("/base/test/");
+    assertEquals("test", vars.get("collection"));
+  }
+
 }