Author: julien_viet
Date: 2010-09-12 17:51:02 -0400 (Sun, 12 Sep 2010)
New Revision: 4156
Modified:
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/router/Route.java
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestBuildRoute.java
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestMatch.java
Log:
allow two scope different parameter set for a segment route
Modified:
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/router/Route.java
===================================================================
---
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/router/Route.java 2010-09-12
13:57:47 UTC (rev 4155)
+++
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/router/Route.java 2010-09-12
21:51:02 UTC (rev 4156)
@@ -45,7 +45,7 @@
boolean terminal;
/** . */
- final Map<String, SimpleRoute> simpleRoutes;
+ final Map<String, List<SimpleRoute>> simpleRoutes;
/** . */
final List<PatternRoute> patternRoutes;
@@ -63,7 +63,7 @@
//
this.parent = parent;
this.terminal = false;
- this.simpleRoutes = new LinkedHashMap<String, SimpleRoute>();
+ this.simpleRoutes = new LinkedHashMap<String, List<SimpleRoute>>();
this.patternRoutes = new ArrayList<PatternRoute>();
this.routeParameters = new HashMap<QualifiedName, String>();
}
@@ -72,7 +72,7 @@
{
this.parent = null;
this.terminal = false;
- this.simpleRoutes = new LinkedHashMap<String, SimpleRoute>();
+ this.simpleRoutes = new LinkedHashMap<String, List<SimpleRoute>>();
this.patternRoutes = new ArrayList<PatternRoute>();
this.routeParameters = new HashMap<QualifiedName, String>();
}
@@ -178,12 +178,15 @@
}
//
- for (SimpleRoute route : simpleRoutes.values())
+ for (List<SimpleRoute> routes : simpleRoutes.values())
{
- Route a = route.find(abc);
- if (a != null)
+ for (SimpleRoute route : routes)
{
- return a;
+ Route a = route.find(abc);
+ if (a != null)
+ {
+ return a;
+ }
}
}
for (PatternRoute route : patternRoutes)
@@ -237,8 +240,8 @@
String segment = path.substring(1, pos);
// Try to find a route for the segment
- Route route = simpleRoutes.get(segment);
- if (route != null)
+ List<SimpleRoute> routes = simpleRoutes.get(segment);
+ if (routes != null)
{
// Determine next path
String nextPath;
@@ -251,13 +254,18 @@
nextPath = path.substring(pos);
}
- // Delegate the process to the next route
- Map<QualifiedName, String> response = route.route(nextPath,
parameters);
+ //
+ for (SimpleRoute route : routes)
+ {
+ // Delegate the process to the next route
+ Map<QualifiedName, String> response = route.route(nextPath,
parameters);
- // If we do have a response we return it
- if (response != null)
- {
- ret = response;
+ // If we do have a response we return it
+ if (response != null)
+ {
+ ret = response;
+ break;
+ }
}
}
}
@@ -387,12 +395,14 @@
else
{
String segment = path.substring(0, pos);
- SimpleRoute route = simpleRoutes.get(segment);
- if (route == null)
+ List<SimpleRoute> routes = simpleRoutes.get(segment);
+ if (routes == null)
{
- route = new SimpleRoute(this, segment);
- simpleRoutes.put(route.value, route);
+ routes = new ArrayList<SimpleRoute>();
+ simpleRoutes.put(segment, routes);
}
+ SimpleRoute route = new SimpleRoute(this, segment);
+ routes.add(route);
next = route;
}
}
Modified:
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestBuildRoute.java
===================================================================
---
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestBuildRoute.java 2010-09-12
13:57:47 UTC (rev 4155)
+++
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestBuildRoute.java 2010-09-12
21:51:02 UTC (rev 4156)
@@ -24,7 +24,9 @@
import org.exoplatform.web.controller.metadata.RouteDescriptor;
import org.exoplatform.web.controller.metadata.RouterDescriptor;
+import java.util.Arrays;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
/**
@@ -57,7 +59,7 @@
Router router = new Router(routerMD);
Route expectedRoute = new Route();
SimpleRoute a = new SimpleRoute(expectedRoute, "a");
- expectedRoute.simpleRoutes.put("a", a);
+ expectedRoute.simpleRoutes.put("a", Arrays.asList(a));
assertEquals(expectedRoute, router.root);
}
}
@@ -139,16 +141,18 @@
//
Router router = new Router(routerMD);
- Route publicRoute = router.root.simpleRoutes.get("public");
- assertNotNull(publicRoute.simpleRoutes.get("foo"));
- assertNotNull(publicRoute.simpleRoutes.get("bar"));
+ assertEquals(2, router.root.simpleRoutes.get("public").size());
+ Route publicRoute1 = router.root.simpleRoutes.get("public").get(0);
+ assertEquals(1, publicRoute1.simpleRoutes.get("foo").size());
+ Route publicRoute2 = router.root.simpleRoutes.get("public").get(1);
+ assertEquals(1, publicRoute2.simpleRoutes.get("bar").size());
}
private void assertEquals(Route expectedRoute, Route route)
{
assertEquals(expectedRoute.getClass(), route.getClass());
assertEquals(expectedRoute.simpleRoutes.keySet(), route.simpleRoutes.keySet());
- for (Map.Entry<String, SimpleRoute> entry :
expectedRoute.simpleRoutes.entrySet())
+ for (Map.Entry<String, List<SimpleRoute>> entry :
expectedRoute.simpleRoutes.entrySet())
{
assertEquals(entry.getValue(), expectedRoute.simpleRoutes.get(entry.getKey()));
}
Modified:
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestMatch.java
===================================================================
---
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestMatch.java 2010-09-12
13:57:47 UTC (rev 4155)
+++
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestMatch.java 2010-09-12
21:51:02 UTC (rev 4156)
@@ -24,6 +24,8 @@
import org.exoplatform.web.controller.metadata.RouterDescriptor;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a>
@@ -193,4 +195,31 @@
//
assertEquals(Collections.singletonMap(new QualifiedName("p"),
"a"), router.process("/a/b"));
}
+
+ public void testTwoRules1() throws Exception
+ {
+ RouterDescriptor routerMD = new RouterDescriptor();
+ routerMD.addRoute(new RouteDescriptor("/a").addParameter("b",
"b"));
+ routerMD.addRoute(new RouteDescriptor("/a/b"));
+ Router router = new Router(routerMD);
+
+ //
+ assertEquals(Collections.singletonMap(new QualifiedName("b"),
"b"), router.process("/a"));
+ assertEquals(Collections.<QualifiedName, String>emptyMap(),
router.process("/a/b"));
+ }
+
+ public void testTwoRules2() throws Exception
+ {
+ RouterDescriptor routerMD = new RouterDescriptor();
+ routerMD.addRoute(new RouteDescriptor("/{a}").addParameter("b",
"b"));
+ routerMD.addRoute(new RouteDescriptor("/{a}/b"));
+ Router router = new Router(routerMD);
+
+ //
+ Map<QualifiedName, String> expectedParameters = new HashMap<QualifiedName,
String>();
+ expectedParameters.put(new QualifiedName("a"), "a");
+ expectedParameters.put(new QualifiedName("b"), "b");
+ assertEquals(expectedParameters, router.process("/a"));
+ assertEquals(Collections.singletonMap(new QualifiedName("a"),
"a"), router.process("/a/b"));
+ }
}