Author: julien_viet
Date: 2010-11-09 11:28:48 -0500 (Tue, 09 Nov 2010)
New Revision: 4989
Modified:
portal/branches/navcontroller/component/web/controller/src/main/java/gatein_router_1_0.xsd
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/metadata/DescriptorBuilder.java
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/metadata/PathParamDescriptor.java
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/metadata/RouteDescriptor.java
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/router/PatternParam.java
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/TestDescriptorBuilder.java
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestLegacyPortal.java
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/TestPortalConfiguration.java
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestRender.java
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/router.xml
Log:
add required=true|false on a path param, need to impl it though
Modified:
portal/branches/navcontroller/component/web/controller/src/main/java/gatein_router_1_0.xsd
===================================================================
---
portal/branches/navcontroller/component/web/controller/src/main/java/gatein_router_1_0.xsd 2010-11-09
13:45:48 UTC (rev 4988)
+++
portal/branches/navcontroller/component/web/controller/src/main/java/gatein_router_1_0.xsd 2010-11-09
16:28:48 UTC (rev 4989)
@@ -64,6 +64,7 @@
</xs:restriction>
</xs:simpleType>
</xs:attribute>
+ <xs:attribute name="required" type="xs:boolean"
use="optional"/>
</xs:complexType>
<xs:complexType name="requestParamType">
Modified:
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/metadata/DescriptorBuilder.java
===================================================================
---
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/metadata/DescriptorBuilder.java 2010-11-09
13:45:48 UTC (rev 4988)
+++
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/metadata/DescriptorBuilder.java 2010-11-09
16:28:48 UTC (rev 4989)
@@ -110,8 +110,9 @@
String name = reader.getAttributeValue(null, "name");
String pattern = reader.getAttributeValue(null, "pattern");
String encoded = reader.getAttributeValue(null, "encoding");
+ String required = reader.getAttributeValue(null, "required");
EncodingMode encodingMode = "preserve-path".equals(encoded) ?
EncodingMode.PRESERVE_PATH : EncodingMode.DEFAULT_FORM;
- routeDesc.addPathParam(QualifiedName.parse(name), pattern, encodingMode);
+ routeDesc.addPathParam(QualifiedName.parse(name), pattern, encodingMode,
!"false".equals(required));
}
else if (routeQN.equals(reader.getName()))
{
Modified:
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/metadata/PathParamDescriptor.java
===================================================================
---
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/metadata/PathParamDescriptor.java 2010-11-09
13:45:48 UTC (rev 4988)
+++
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/metadata/PathParamDescriptor.java 2010-11-09
16:28:48 UTC (rev 4989)
@@ -38,21 +38,21 @@
/** . */
private final EncodingMode encodingMode;
- public PathParamDescriptor(QualifiedName name, String pattern, EncodingMode
encodingMode)
+ /** . */
+ private final boolean required;
+
+ public PathParamDescriptor(QualifiedName name, String pattern, EncodingMode
encodingMode, boolean required)
{
if (name == null)
{
throw new NullPointerException("No null name accepted");
}
- if (pattern == null)
- {
- throw new NullPointerException("No null pattern accepted");
- }
//
this.name = name;
this.pattern = pattern;
this.encodingMode = encodingMode;
+ this.required = required;
}
public QualifiedName getName()
@@ -69,4 +69,9 @@
{
return encodingMode;
}
+
+ public boolean isRequired()
+ {
+ return required;
+ }
}
Modified:
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/metadata/RouteDescriptor.java
===================================================================
---
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/metadata/RouteDescriptor.java 2010-11-09
13:45:48 UTC (rev 4988)
+++
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/metadata/RouteDescriptor.java 2010-11-09
16:28:48 UTC (rev 4989)
@@ -92,9 +92,9 @@
return this;
}
- public RouteDescriptor addPathParam(QualifiedName name, String pattern, EncodingMode
encodingMode)
+ public RouteDescriptor addPathParam(QualifiedName name, String pattern, EncodingMode
encodingMode, boolean required)
{
- return addRequestParam(new PathParamDescriptor(name, pattern, encodingMode));
+ return addRequestParam(new PathParamDescriptor(name, pattern, encodingMode,
required));
}
public RouteDescriptor addRequestParam(PathParamDescriptor requestParam)
Modified:
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/router/PatternParam.java
===================================================================
---
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/router/PatternParam.java 2010-11-09
13:45:48 UTC (rev 4988)
+++
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/router/PatternParam.java 2010-11-09
16:28:48 UTC (rev 4989)
@@ -39,10 +39,14 @@
/** . */
final Pattern pattern;
- PatternParam(QualifiedName name, EncodingMode encodingMode, Pattern pattern)
+ /** . */
+ final boolean required;
+
+ PatternParam(QualifiedName name, EncodingMode encodingMode, Pattern pattern, boolean
required)
{
this.name = name;
this.encodingMode = encodingMode;
this.pattern = pattern;
+ this.required = required;
}
}
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-11-09
13:45:48 UTC (rev 4988)
+++
portal/branches/navcontroller/component/web/controller/src/main/java/org/exoplatform/web/controller/router/Route.java 2010-11-09
16:28:48 UTC (rev 4989)
@@ -609,17 +609,23 @@
PathParamDescriptor parameterDescriptor =
pathParamDescriptors.get(parameterQName);
String regex = "[^/]+";
EncodingMode encodingMode = EncodingMode.DEFAULT_FORM;
+ boolean required = true;
if (parameterDescriptor != null)
{
regex = parameterDescriptor.getPattern();
encodingMode = parameterDescriptor.getEncodingMode();
+ required = parameterDescriptor.isRequired();
}
//
builder.expr("(");
builder.expr(regex);
builder.expr(")");
- parameterPatterns.add(new PatternParam(parameterQName, encodingMode,
Pattern.compile("^" + regex + "$")));
+ parameterPatterns.add(new PatternParam(
+ parameterQName,
+ encodingMode,
+ Pattern.compile("^" + regex + "$"),
+ required));
previous = end.get(i) + 1;
}
builder.litteral(path, previous, pos);
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-11-09
13:45:48 UTC (rev 4988)
+++
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestBuildRoute.java 2010-11-09
16:28:48 UTC (rev 4989)
@@ -112,7 +112,7 @@
for (String path : paths)
{
RouterDescriptor routerMD = new RouterDescriptor();
- routerMD.addRoute(new
RouteDescriptor(path).addPathParam(QualifiedName.parse("a"), ".*",
EncodingMode.DEFAULT_FORM));
+ routerMD.addRoute(new
RouteDescriptor(path).addPathParam(QualifiedName.parse("a"), ".*",
EncodingMode.DEFAULT_FORM, true));
Router router = new Router(routerMD);
//
Modified:
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestDescriptorBuilder.java
===================================================================
---
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestDescriptorBuilder.java 2010-11-09
13:45:48 UTC (rev 4988)
+++
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestDescriptorBuilder.java 2010-11-09
16:28:48 UTC (rev 4989)
@@ -59,6 +59,7 @@
assertEquals(QualifiedName.parse("gtn:path"),
route1.getPathParams().get(QualifiedName.parse("gtn:path")).getName());
assertEquals(".*",
route1.getPathParams().get(QualifiedName.parse("gtn:path")).getPattern());
assertEquals(EncodingMode.DEFAULT_FORM,
route1.getPathParams().get(QualifiedName.parse("gtn:path")).getEncodingMode());
+ assertEquals(true,
route1.getPathParams().get(QualifiedName.parse("gtn:path")).isRequired());
//
assertTrue(i.hasNext());
@@ -69,6 +70,7 @@
assertEquals(QualifiedName.parse("gtn:path"),
route2.getPathParams().get(QualifiedName.parse("gtn:path")).getName());
assertEquals(".*",
route2.getPathParams().get(QualifiedName.parse("gtn:path")).getPattern());
assertEquals(EncodingMode.PRESERVE_PATH,
route2.getPathParams().get(QualifiedName.parse("gtn:path")).getEncodingMode());
+ assertEquals(true,
route2.getPathParams().get(QualifiedName.parse("gtn:path")).isRequired());
//
assertTrue(i.hasNext());
@@ -109,5 +111,18 @@
assertEquals("juu",
route6.getRequestParams().get("juu").getMatchName());
assertEquals("juu",
route6.getRequestParams().get("juu").getMatchValue());
assertEquals(true, route6.getRequestParams().get("juu").isRequired());
+
+ //
+ assertTrue(i.hasNext());
+ RouteDescriptor route7 = i.next();
+ assertEquals("/{gtn:lang}", route7.getPath());
+ assertEquals(Collections.singleton(QualifiedName.parse("gtn:lang")),
route7.getPathParams().keySet());
+ assertEquals(QualifiedName.parse("gtn:lang"),
route7.getPathParams().get(QualifiedName.parse("gtn:lang")).getName());
+ assertEquals(null,
route7.getPathParams().get(QualifiedName.parse("gtn:lang")).getPattern());
+ assertEquals(EncodingMode.DEFAULT_FORM,
route7.getPathParams().get(QualifiedName.parse("gtn:lang")).getEncodingMode());
+ assertEquals(false,
route7.getPathParams().get(QualifiedName.parse("gtn:lang")).isRequired());
+
+ //
+ assertFalse(i.hasNext());
}
}
Modified:
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestLegacyPortal.java
===================================================================
---
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestLegacyPortal.java 2010-11-09
13:45:48 UTC (rev 4988)
+++
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestLegacyPortal.java 2010-11-09
16:28:48 UTC (rev 4989)
@@ -49,8 +49,8 @@
addRequestParam(QualifiedName.parse("gtn:action"),
"portal:action", null, false).
addRequestParam(QualifiedName.parse("gtn:objectid"),
"portal:objectId", null, false).
addRoute(new RouteDescriptor("/public/{gtn:sitename}{gtn:path}").
- addParam(QualifiedName.parse("gtn:access"),
"public")).addPathParam(QualifiedName.parse("gtn:path"),
".*", EncodingMode.PRESERVE_PATH).
- addRoute(new
RouteDescriptor("/private/{gtn:sitename}{gtn:path}").addPathParam(QualifiedName.parse("gtn:path"),
".*", EncodingMode.PRESERVE_PATH).
+ addParam(QualifiedName.parse("gtn:access"),
"public")).addPathParam(QualifiedName.parse("gtn:path"),
".*", EncodingMode.PRESERVE_PATH, true).
+ addRoute(new
RouteDescriptor("/private/{gtn:sitename}{gtn:path}").addPathParam(QualifiedName.parse("gtn:path"),
".*", EncodingMode.PRESERVE_PATH, true).
addParam(QualifiedName.parse("gtn:access"), "private"));
//
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-11-09
13:45:48 UTC (rev 4988)
+++
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestMatch.java 2010-11-09
16:28:48 UTC (rev 4989)
@@ -107,7 +107,7 @@
public void testWildcardPattern() throws Exception
{
RouterDescriptor routerMD = new RouterDescriptor();
- routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
".*", EncodingMode.PRESERVE_PATH));
+ routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
".*", EncodingMode.PRESERVE_PATH, true));
Router router = new Router(routerMD);
//
@@ -120,7 +120,7 @@
public void testDefaultForm() throws Exception
{
RouterDescriptor routerMD = new RouterDescriptor();
- routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
"[^/]+", EncodingMode.DEFAULT_FORM));
+ routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
"[^/]+", EncodingMode.DEFAULT_FORM, true));
Router router = new Router(routerMD);
//
@@ -130,7 +130,7 @@
public void testPreservePath() throws Exception
{
RouterDescriptor routerMD = new RouterDescriptor();
- routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
"[^/]+", EncodingMode.PRESERVE_PATH));
+ routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
"[^/]+", EncodingMode.PRESERVE_PATH, true));
Router router = new Router(routerMD);
//
@@ -141,7 +141,7 @@
public void testSimplePattern() throws Exception
{
RouterDescriptor routerMD = new RouterDescriptor();
- routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
"a", EncodingMode.DEFAULT_FORM));
+ routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
"a", EncodingMode.DEFAULT_FORM, true));
Router router = new Router(routerMD);
//
@@ -155,7 +155,7 @@
{
RouterDescriptor routerMD = new RouterDescriptor();
routerMD.addRoute(new RouteDescriptor("/a"));
- routerMD.addRoute(new
RouteDescriptor("/{p}/b").addPathParam(QualifiedName.parse("p"),
"a", EncodingMode.DEFAULT_FORM));
+ routerMD.addRoute(new
RouteDescriptor("/{p}/b").addPathParam(QualifiedName.parse("p"),
"a", EncodingMode.DEFAULT_FORM, true));
Router router = new Router(routerMD);
//
Modified:
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestPortalConfiguration.java
===================================================================
---
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestPortalConfiguration.java 2010-11-09
13:45:48 UTC (rev 4988)
+++
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestPortalConfiguration.java 2010-11-09
16:28:48 UTC (rev 4989)
@@ -46,25 +46,25 @@
RouteDescriptor portalRouteMD = new
RouteDescriptor("/private/{gtn:sitetype}/{gtn:sitename}{gtn:path}");
portalRouteMD.addParam(QualifiedName.create("gtn",
"controller"), "site");
portalRouteMD.addRequestParam(QualifiedName.create("gtn",
"componentid"), "portal:componentId", null, false);
- portalRouteMD.addPathParam(QualifiedName.create("gtn", "path"),
".*", EncodingMode.PRESERVE_PATH);
+ portalRouteMD.addPathParam(QualifiedName.create("gtn", "path"),
".*", EncodingMode.PRESERVE_PATH, true);
routerMD.addRoute(portalRouteMD);
//
RouteDescriptor portalRouteMD2 = new
RouteDescriptor("/private/{gtn:sitetype}/{gtn:sitename}{gtn:path}");
portalRouteMD2.addParam(QualifiedName.create("gtn",
"controller"), "site");
- portalRouteMD2.addPathParam(QualifiedName.create("gtn",
"path"), ".*", EncodingMode.PRESERVE_PATH);
+ portalRouteMD2.addPathParam(QualifiedName.create("gtn",
"path"), ".*", EncodingMode.PRESERVE_PATH, true);
routerMD.addRoute(portalRouteMD2);
//
RouteDescriptor groupRouteMD = new
RouteDescriptor("/groups/{gtn:sitetype}/{gtn:sitename}{gtn:path}");
groupRouteMD.addParam(QualifiedName.create("gtn",
"controller"), "site");
- groupRouteMD.addPathParam(QualifiedName.create("gtn", "path"),
".*", EncodingMode.PRESERVE_PATH);
+ groupRouteMD.addPathParam(QualifiedName.create("gtn", "path"),
".*", EncodingMode.PRESERVE_PATH, true);
routerMD.addRoute(groupRouteMD);
//
RouteDescriptor userRouteMD = new
RouteDescriptor("/users/{gtn:sitetype}/{gtn:sitename}{gtn:path}");
userRouteMD.addParam(QualifiedName.create("gtn", "controller"),
"site");
- userRouteMD.addPathParam(QualifiedName.create("gtn", "path"),
".*", EncodingMode.PRESERVE_PATH);
+ userRouteMD.addPathParam(QualifiedName.create("gtn", "path"),
".*", EncodingMode.PRESERVE_PATH, true);
routerMD.addRoute(userRouteMD);
//
Modified:
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestRender.java
===================================================================
---
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestRender.java 2010-11-09
13:45:48 UTC (rev 4988)
+++
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/TestRender.java 2010-11-09
16:28:48 UTC (rev 4989)
@@ -76,7 +76,7 @@
public void testSimplePatternPathParam() throws Exception
{
RouterDescriptor routerMD = new RouterDescriptor();
- routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
"a", EncodingMode.DEFAULT_FORM));
+ routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
"a", EncodingMode.DEFAULT_FORM, true));
Router router = new Router(routerMD);
//
@@ -87,7 +87,7 @@
public void testWildcardPathParam() throws Exception
{
RouterDescriptor routerMD = new RouterDescriptor();
- routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
".*", EncodingMode.PRESERVE_PATH));
+ routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
".*", EncodingMode.PRESERVE_PATH, true));
Router router = new Router(routerMD);
//
@@ -99,7 +99,7 @@
public void testFoo() throws Exception
{
RouterDescriptor routerMD = new RouterDescriptor();
- routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
"[^/]*", EncodingMode.PRESERVE_PATH));
+ routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
"[^/]*", EncodingMode.PRESERVE_PATH, true));
Router router = new Router(routerMD);
//
@@ -109,7 +109,7 @@
public void testBar() throws Exception
{
RouterDescriptor routerMD = new RouterDescriptor();
- routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
"[^/]*", EncodingMode.DEFAULT_FORM));
+ routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
"[^/]*", EncodingMode.DEFAULT_FORM, true));
Router router = new Router(routerMD);
//
@@ -119,7 +119,7 @@
public void testWildcardParamPathPreservePathEncoding() throws Exception
{
RouterDescriptor routerMD = new RouterDescriptor();
- routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
".*", EncodingMode.PRESERVE_PATH));
+ routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
".*", EncodingMode.PRESERVE_PATH, true));
Router router = new Router(routerMD);
//
@@ -129,7 +129,7 @@
public void testWildcardParamPathDefaultFormEncoded() throws Exception
{
RouterDescriptor routerMD = new RouterDescriptor();
- routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
".*", EncodingMode.DEFAULT_FORM));
+ routerMD.addRoute(new
RouteDescriptor("/{p}").addPathParam(QualifiedName.parse("p"),
".*", EncodingMode.DEFAULT_FORM, true));
Router router = new Router(routerMD);
//
@@ -140,7 +140,7 @@
{
RouterDescriptor routerMD = new RouterDescriptor();
routerMD.addRoute(new RouteDescriptor("/a"));
- routerMD.addRoute(new
RouteDescriptor("/{p}/b").addPathParam(QualifiedName.parse("p"),
"a", EncodingMode.DEFAULT_FORM));
+ routerMD.addRoute(new
RouteDescriptor("/{p}/b").addPathParam(QualifiedName.parse("p"),
"a", EncodingMode.DEFAULT_FORM, true));
Router router = new Router(routerMD);
//
Modified:
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/router.xml
===================================================================
---
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/router.xml 2010-11-09
13:45:48 UTC (rev 4988)
+++
portal/branches/navcontroller/component/web/controller/src/test/java/org/exoplatform/web/controller/router/router.xml 2010-11-09
16:28:48 UTC (rev 4989)
@@ -34,4 +34,8 @@
<request-param name="juu" matchName="juu"
matchValue="juu" required="true"/>
</route>
+ <route path="/{gtn:lang}">
+ <path-param name="gtn:lang" required="false"/>
+ </route>
+
</router>
\ No newline at end of file