You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by km...@apache.org on 2015/11/03 05:52:01 UTC

[1/3] knox git commit: KNOX-394: Request and response URLs must be parsed as literals not templates

Repository: knox
Updated Branches:
  refs/heads/master 1755fdfa0 -> 33bb1ce57


http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ParserTest.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ParserTest.java b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ParserTest.java
index 8e14f1f..f6d1ab2 100644
--- a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ParserTest.java
+++ b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ParserTest.java
@@ -130,40 +130,40 @@ public class ParserTest {
     Template template;
 
     text = "{path}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 1, 0 );
     assertPath( template, 0, "path", "**" );
     assertThat( template.toString(), is( text ) );
 
     text = "{pathA}/{pathB}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 2, 0 );
     assertPath( template, 0, "pathA", "**" );
     assertPath( template, 1, "pathB", "**" );
     assertThat( template.toString(), is( text ) );
 
     text = "?paramA={valueA}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 1 );
     assertQuery( template, "paramA", "valueA", "**" );
     assertThat( template.toString(), is( text ) );
 
     text = "?paramA={valueA}&paramB={valueB}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 2 );
     assertQuery( template, "paramA", "valueA", "**" );
     assertQuery( template, "paramB", "valueB", "**" );
     assertThat( template.toString(), is( text ) );
 
     text = "?paramA={valueA}?paramB={valueB}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 2 );
     assertQuery( template, "paramA", "valueA", "**" );
     assertQuery( template, "paramB", "valueB", "**" );
     //assertThat( template.toString(), is( text ) );
 
     text = "{pathA}?paramA={valueA}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 1, 1 );
     assertPath( template, 0, "pathA", "**" );
     assertQuery( template, "paramA", "valueA", "**" );
@@ -349,31 +349,31 @@ public class ParserTest {
     Template template;
 
     text = "{path}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 1, 0 );
     assertPath( template, 0, "path", "**", Segment.GLOB, 1, 1 );
     assertThat( template.toString(), is( text ) );
 
     text = "{path=static}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 1, 0 );
     assertPath( template, 0, "path", "static", Segment.STATIC, 1, 1 );
     assertThat( template.toString(), is( text ) );
 
     text = "{path=*}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 1, 0 );
     assertPath( template, 0, "path", "*", Segment.STAR, 1, 1 );
     assertThat( template.toString(), is( text ) );
 
     text = "{path=**}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 1, 0 );
     assertPath( template, 0, "path", "**", Segment.GLOB, 0, Integer.MAX_VALUE );
     assertThat( template.toString(), is( text ) );
 
     text = "{path=wild*card}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 1, 0 );
     assertPath( template, 0, "path", "wild*card", Segment.REGEX, 1, 1 );
     assertThat( template.toString(), is( text ) );
@@ -385,31 +385,31 @@ public class ParserTest {
     Template template;
 
     text = "?query={queryParam}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 1 );
     assertQuery( template, "query", "queryParam", "**", Segment.GLOB, 1, 1 );
     assertThat( template.toString(), is( text ) );
 
     text = "?query={queryParam=static}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 1 );
     assertQuery( template, "query", "queryParam", "static", Segment.STATIC, 1, 1 );
     assertThat( template.toString(), is( text ) );
 
     text = "?query={queryParam=*}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 1 );
     assertQuery( template, "query", "queryParam", "*", Segment.STAR, 1, 1 );
     assertThat( template.toString(), is( text ) );
 
     text = "?query={queryParam=**}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 1 );
     assertQuery( template, "query", "queryParam", "**", Segment.GLOB, 0, Integer.MAX_VALUE );
     assertThat( template.toString(), is( text ) );
 
     text = "?query={queryParam=wild*card}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 1 );
     assertQuery( template, "query", "queryParam", "wild*card", Segment.REGEX, 1, 1 );
     assertThat( template.toString(), is( text ) );
@@ -421,27 +421,27 @@ public class ParserTest {
     Template template;
 
     text = "**";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 1, 0 );
     assertThat( template.toString(), is( text ) );
 
     text = "/**";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, true, false, false, 1, 0 );
     assertThat( template.toString(), is( text ) );
 
     text = "**/";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, true, false, 1, 0 );
     assertThat( template.toString(), is( text ) );
 
     text = "/**/";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, true, true, false, 1, 0 );
     assertThat( template.toString(), is( text ) );
 
     text = "/**/path";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, true, false, false, 2, 0 );
     assertThat( template.toString(), is( text ) );
   }
@@ -513,7 +513,7 @@ public class ParserTest {
     String image;
 
     text = "//";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getUsername(), nullValue() );
     assertThat( template.getPassword(), nullValue() );
@@ -522,7 +522,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "//:@:";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getUsername(), nullValue() );
     assertThat( template.getPassword(), nullValue() );
@@ -532,7 +532,7 @@ public class ParserTest {
     assertThat( template.getPattern(), is( text ) );
 
     text = "//host";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getUsername(), nullValue() );
     assertThat( template.getPassword(), nullValue() );
@@ -542,7 +542,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "//@host";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getUsername(), nullValue() );
     assertThat( template.getPassword(), nullValue() );
@@ -553,7 +553,7 @@ public class ParserTest {
     assertThat( template.getPattern(), is( text ) );
 
     text = "//@:80";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getUsername(), nullValue() );
     assertThat( template.getPassword(), nullValue() );
@@ -564,7 +564,7 @@ public class ParserTest {
     assertThat( template.getPattern(), is( text ) );
 
     text = "//username@";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getUsername().getFirstValue().getOriginalPattern(), is( "username" ) );
     assertThat( template.getUsername().getFirstValue().getEffectivePattern(), is( "username" ) );
@@ -574,7 +574,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "//:password@";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getUsername(), nullValue() );
     assertThat( template.getPassword().getFirstValue().getOriginalPattern(), is( "password" ) );
@@ -584,7 +584,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "//{host}:{port}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getUsername(), nullValue() );
     assertThat( template.getPassword(), nullValue() );
@@ -599,7 +599,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "{host}:{port}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getUsername(), nullValue() );
     assertThat( template.getPassword(), nullValue() );
@@ -623,7 +623,7 @@ public class ParserTest {
     Segment.Value value;
 
     text = "?queryName";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 1 );
     query = template.getQuery().get( "queryName" );
     assertThat( query, notNullValue() );
@@ -633,7 +633,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "?query=value1&query=value2";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 1 );
     query = template.getQuery().get( "query" );
     assertThat( query, notNullValue() );
@@ -656,7 +656,7 @@ public class ParserTest {
     Template template;
 
     text = "#fragment";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 0, 0 );
     assertThat( template.hasFragment(), is( true ) );
     assertThat( template.getFragment().getFirstValue().getEffectivePattern(), is( "fragment" ) );
@@ -670,33 +670,33 @@ public class ParserTest {
     Template template;
 
     text = "//";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 0, 0 );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.toString(), is( text ) );
 
     text = "??";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 0 );
     //IMPROVE assertThat( template.toString(), is( text ) );
     assertThat( template.getPattern(), is( text ) );
 
     text = "##";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 0, 0 );
     assertThat( template.hasFragment(), is( true ) );
     assertThat( template.getFragment().getFirstValue().getEffectivePattern(), is( "#" ) );
     assertThat( template.toString(), is( text ) );
 
     text = "??name=value";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 1 );
     assertQuery( template, "name", "", "value" );
     //IMPROVE assertThat( template.toString(), is( text ) );
     assertThat( template.getPattern(), is( text ) );
 
     text = "//?";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 0 );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getUsername(), nullValue() );
@@ -706,7 +706,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "//#";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 0, 0 );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getUsername(), nullValue() );
@@ -729,7 +729,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = ":?";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 1, 0 );
     assertThat( template.hasScheme(), is( false ) );
     assertThat( template.getScheme(), nullValue() );
@@ -739,7 +739,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = ":#";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 1, 0 );
     assertThat( template.hasScheme(), is( false ) );
     assertThat( template.getScheme(), nullValue() );
@@ -750,7 +750,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "http:?";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 0 );
     assertThat( template.hasScheme(), is( true ) );
     assertThat( template.getScheme().getFirstValue().getOriginalPattern(), is( "http" ) );
@@ -759,7 +759,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "http:#";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 0, 0 );
     assertThat( template.hasScheme(), is( true ) );
     assertThat( template.getScheme().getFirstValue().getOriginalPattern(), is( "http" ) );
@@ -769,19 +769,19 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "scheme:path?";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 1, 0 );
     assertThat( template.toString(), is( text ) );
 
     text = "scheme:path#";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 1, 0 );
     assertThat( template.hasFragment(), is( true ) );
     assertThat( template.getFragment(), nullValue() );
     assertThat( template.toString(), is( text ) );
 
     text = "//host/";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, true, true, false, 0, 0 );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getHost().getFirstValue().getOriginalPattern(), is( "host" ) );
@@ -789,7 +789,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "//host?";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 0 );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getHost().getFirstValue().getOriginalPattern(), is( "host" ) );
@@ -797,7 +797,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "//host#";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 0, 0 );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.hasFragment(), is( true ) );
@@ -807,26 +807,26 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "///";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, true, true, false, 0, 0 );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.toString(), is( text ) );
 
     text = "//:";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 0, 0 );
     assertThat( template.hasAuthority(), is( true ) );
     //IMPROVE assertThat( template.toString(), is( text ) );
     assertThat( template.getPattern(), is( text ) );
 
     text = "//?";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 0 );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.toString(), is( text ) );
 
     text = "//#";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 0, 0 );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.hasFragment(), is( true ) );
@@ -834,7 +834,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "//:/";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, true, true, false, 0, 0 );
     assertThat( template.hasAuthority(), is( true ) );
     assertThat( template.getHost(), nullValue() );
@@ -842,14 +842,14 @@ public class ParserTest {
     assertThat( template.getPattern(), is( text ) );
 
     text = "//:?";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 0 );
     assertThat( template.getHost(), nullValue() );
     //IMPROVE assertThat( template.toString(), is( text ) );
     assertThat( template.getPattern(), is( text ) );
 
     text = "//:#";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, false, 0, 0 );
     assertThat( template.hasFragment(), is( true ) );
     assertThat( template.getHost(), nullValue() );
@@ -857,7 +857,7 @@ public class ParserTest {
     assertThat( template.getPattern(), is( text ) );
 
     text = "///#";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, true, true, false, 0, 0 );
     assertThat( template.hasFragment(), is( true ) );
     assertThat( template.getHost(), nullValue() );
@@ -865,7 +865,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "///path#";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, true, false, false, 1, 0 );
     assertThat( template.hasFragment(), is( true ) );
     assertThat( template.getHost(), nullValue() );
@@ -873,14 +873,14 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "///?";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, true, true, true, 0, 0 );
     assertThat( template.getHost(), nullValue() );
     assertThat( template.getFragment(), nullValue() );
     assertThat( template.toString(), is( text ) );
 
     text = "///path?";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, true, false, true, 1, 0 );
     assertThat( template.getHost(), nullValue() );
     assertThat( template.getFragment(), nullValue() );
@@ -894,7 +894,7 @@ public class ParserTest {
     Query query;
 
     text = "?*";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 0 );
     query = template.getExtra();
     assertThat( query, notNullValue() );
@@ -905,7 +905,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "?**";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 0 );
     query = template.getExtra();
     assertThat( query, notNullValue() );
@@ -916,7 +916,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "?{*}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 0 );
     query = template.getExtra();
     assertThat( query, notNullValue() );
@@ -927,7 +927,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "?{**}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 0 );
     query = template.getExtra();
     assertThat( query, notNullValue() );
@@ -938,7 +938,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "?*={*}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 0 );
     query = template.getExtra();
     assertThat( query, notNullValue() );
@@ -950,7 +950,7 @@ public class ParserTest {
     assertThat( template.getPattern(), is( text ) );
 
     text = "?**={**}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 0 );
     query = template.getExtra();
     assertThat( query, notNullValue() );
@@ -962,7 +962,7 @@ public class ParserTest {
     assertThat( template.getPattern(), is( text ) );
 
     text = "?**={**=**}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 0 );
     query = template.getExtra();
     assertThat( query, notNullValue() );
@@ -981,7 +981,7 @@ public class ParserTest {
     Query query;
 
     text = "?{queryParam}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 1 );
     query = template.getQuery().get( "queryParam" );
     assertThat( query, notNullValue() );
@@ -993,7 +993,7 @@ public class ParserTest {
     assertThat( template.getPattern(), is( text ) );
 
     text = "?{queryParam=value}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertBasics( template, false, false, true, 0, 1 );
     query = template.getQuery().get( "queryParam" );
     assertThat( query, notNullValue() );
@@ -1011,17 +1011,17 @@ public class ParserTest {
     Template template;
 
     text = "*://*:*/**?**";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template, notNullValue() );
     assertThat( template.toString(), is( text ) );
 
     text = "*://*:*/**/path?{**}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template, notNullValue() );
     assertThat( template.toString(), is( text ) );
 
     text = "*://*:*/**/webhdfs/v1/?{**}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template, notNullValue() );
     assertThat( template.toString(), is( text ) );
   }
@@ -1058,7 +1058,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "*://*:*/**?X=";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template, notNullValue() );
     assertThat( template.getQuery().get( "X" ), notNullValue() );
     string = expander.expandToString( template, null, null );
@@ -1067,7 +1067,7 @@ public class ParserTest {
     assertThat( template.getPattern(), is( text ) );
 
     text = "http://localhost:62142/gateway/cluster/webhdfs/data/v1/tmp/GatewayWebHdfsFuncTest/testBasicHdfsUseCase/dir/file?aG9zdD1sb2NhbGhvc3QmcG9ydD02MjEzOSZvcD1DUkVBVEUmdXNlci5uYW1lPWhkZnM";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template, notNullValue() );
     assertThat( template.getQuery().get( "aG9zdD1sb2NhbGhvc3QmcG9ydD02MjEzOSZvcD1DUkVBVEUmdXNlci5uYW1lPWhkZnM" ), notNullValue() );
     string = expander.expandToString( template, null, null );
@@ -1075,7 +1075,7 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "http://localhost:62142/gateway/cluster/webhdfs/data/v1/tmp/GatewayWebHdfsFuncTest/testBasicHdfsUseCase/dir/file?aG9zdD1sb2NhbGhvc3QmcG9ydD02MjEzOSZvcD1DUkVBVEUmdXNlci5uYW1lPWhkZnM=";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template, notNullValue() );
     assertThat( template.getQuery().get( "aG9zdD1sb2NhbGhvc3QmcG9ydD02MjEzOSZvcD1DUkVBVEUmdXNlci5uYW1lPWhkZnM" ), notNullValue() );
     string = expander.expandToString( template, null, null );
@@ -1183,7 +1183,7 @@ public class ParserTest {
     Template template;
 
     text = "*://*:*/";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template.getHost().getFirstValue().getOriginalPattern(), is( "*" ) );
     assertThat( template.getHost().getFirstValue().getEffectivePattern(), is( "*" ) );
     assertThat( template.getPort().getFirstValue().getOriginalPattern(), is( "*" ) );
@@ -1191,21 +1191,21 @@ public class ParserTest {
     assertThat( template.toString(), is( text ) );
 
     text = "*://**/";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template.getHost().getFirstValue().getOriginalPattern(), is( "**" ) );
     assertThat( template.getHost().getFirstValue().getEffectivePattern(), is( "*" ) );
     assertThat( template.getPort(), nullValue() );
     assertThat( template.toString(), is( text ) );
 
     text = "*://*/";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template.getHost().getFirstValue().getOriginalPattern(), is( "*" ) );
     assertThat( template.getHost().getFirstValue().getEffectivePattern(), is( "*" ) );
     assertThat( template.getPort(), nullValue() );
     assertThat( template.toString(), is( text ) );
 
     text = "*://**:**/";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     assertThat( template.getHost().getFirstValue().getOriginalPattern(), is( "**" ) );
     assertThat( template.getHost().getFirstValue().getEffectivePattern(), is( "*" ) );
     assertThat( template.getPort().getFirstValue().getOriginalPattern(), is( "**" ) );
@@ -1215,47 +1215,50 @@ public class ParserTest {
 
   @Test
   public void testParseTemplateToken() {
+    Builder builder;
     String input;
     Token output;
 
+    builder = new Builder( "" );
+
     input = "{";
-    output = Parser.parseTemplateToken( input, "~" );
+    output = Parser.parseTemplateToken( builder, input, "~" );
     assertThat( output.getParameterName(), is( "" ) );
     assertThat( output.getOriginalPattern(), is( "{" ) );
     assertThat( output.getEffectivePattern(), is( "{" ) );
 
     input = "}";
-    output = Parser.parseTemplateToken( input, "~" );
+    output = Parser.parseTemplateToken( builder, input, "~" );
     assertThat( output.getParameterName(), is( "" ) );
     assertThat( output.getOriginalPattern(), is( "}" ) );
     assertThat( output.getEffectivePattern(), is( "}" ) );
 
     input = "{X";
-    output = Parser.parseTemplateToken( input, "~" );
+    output = Parser.parseTemplateToken( builder, input, "~" );
     assertThat( output.getParameterName(), is( "" ) );
     assertThat( output.getOriginalPattern(), is( "{X" ) );
     assertThat( output.getEffectivePattern(), is( "{X" ) );
 
     input = "X}";
-    output = Parser.parseTemplateToken( input, "~" );
+    output = Parser.parseTemplateToken( builder, input, "~" );
     assertThat( output.getParameterName(), is( "" ) );
     assertThat( output.getOriginalPattern(), is( "X}" ) );
     assertThat( output.getEffectivePattern(), is( "X}" ) );
 
     input = "X";
-    output = Parser.parseTemplateToken( input, "~" );
+    output = Parser.parseTemplateToken( builder, input, "~" );
     assertThat( output.getParameterName(), is( "" ) );
     assertThat( output.getOriginalPattern(), is( "X" ) );
     assertThat( output.getEffectivePattern(), is( "X" ) );
 
     input = "$";
-    output = Parser.parseTemplateToken( input, "~" );
+    output = Parser.parseTemplateToken( builder, input, "~" );
     assertThat( output.getParameterName(), is( "" ) );
     assertThat( output.getOriginalPattern(), is( "$" ) );
     assertThat( output.getEffectivePattern(), is( "$" ) );
 
     input = "";
-    output = Parser.parseTemplateToken( input, Segment.GLOB_PATTERN );
+    output = Parser.parseTemplateToken( builder, input, Segment.GLOB_PATTERN );
     assertThat( output.getParameterName(), is( "" ) );
     assertThat( output.getOriginalPattern(), is( "" ) );
     assertThat( output.getEffectivePattern(), is( "" ) );
@@ -1268,16 +1271,35 @@ public class ParserTest {
     Matcher<String> matcher;
 
     matcher = new Matcher<String>();
-    template = Parser.parse( "*://*:*/**/webhdfs/v1/{path=**}?{**}" );
+    template = Parser.parseTemplate( "*://*:*/**/webhdfs/v1/{path=**}?{**}" );
     matcher.add( template, "test-value" );
 
-    input = Parser.parse( "http://kminder-os-u14-23-knoxha-150922-1352-2.novalocal:1022/gateway/sandbox/webhdfs/v1/user/hrt_qa/knox-ha/knox_webhdfs_client_dir/test_file?op=CREATE&delegation=XXX&namenoderpcaddress=nameservice&createflag=&createparent=true&overwrite=true" );
+    input = Parser.parseTemplate( "http://kminder-os-u14-23-knoxha-150922-1352-2.novalocal:1022/gateway/sandbox/webhdfs/v1/user/hrt_qa/knox-ha/knox_webhdfs_client_dir/test_file?op=CREATE&delegation=XXX&namenoderpcaddress=nameservice&createflag=&createparent=true&overwrite=true" );
 
     assertThat( input.getQuery().get( "createflag" ).getFirstValue().getPattern(), is( "" ) );
 
-    input = Parser.parse( "http://kminder-os-u14-23-knoxha-150922-1352-2.novalocal:1022/gateway/sandbox/webhdfs/v1/user/hrt_qa/knox-ha/knox_webhdfs_client_dir/test_file?op=CREATE&delegation=XXX&namenoderpcaddress=nameservice&createflag&createparent=true&overwrite=true" );
+    input = Parser.parseTemplate( "http://kminder-os-u14-23-knoxha-150922-1352-2.novalocal:1022/gateway/sandbox/webhdfs/v1/user/hrt_qa/knox-ha/knox_webhdfs_client_dir/test_file?op=CREATE&delegation=XXX&namenoderpcaddress=nameservice&createflag&createparent=true&overwrite=true" );
 
     assertThat( input.getQuery().get( "createflag" ).getFirstValue().getPattern(), nullValue() );
   }
 
+  @Test
+  public void testParserLiteralsWithReservedCharactersBugKnox394() throws Exception {
+    Template template;
+    String image;
+
+    template = Parser.parseLiteral( "{}" );
+    image = template.toString();
+    assertThat( image, is( "{}" ) );
+
+    template = Parser.parseLiteral( "{app.path}/child/path" );
+    image = template.toString();
+    assertThat( image, is( "{app.path}/child/path" ) );
+
+    template = Parser.parseLiteral( "${app.path}/child/path" );
+    image = template.toString();
+    assertThat( image, is( "${app.path}/child/path" ) );
+
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/RewriterTest.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/RewriterTest.java b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/RewriterTest.java
index 3cdda85..645ffd5 100644
--- a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/RewriterTest.java
+++ b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/RewriterTest.java
@@ -60,9 +60,9 @@ public class RewriterTest {
     // This is the URI like we would get from say a Location HTTP header.
     inputUri = new URI( "http://some-host:80" );
     // This will be used to extract the three values from input URI: scheme='http', host='some-known-host', port='80'
-    inputTemplate = Parser.parse( "{scheme}://{host}:{port}" );
+    inputTemplate = Parser.parseTemplate( "{scheme}://{host}:{port}" );
     // The template to build a new URI.  The match those in the input template.
-    outputTemplate = Parser.parse( "{scheme}://{host}:{port}" );
+    outputTemplate = Parser.parseTemplate( "{scheme}://{host}:{port}" );
     // Copies the values extracted from the input URI via the inputTemplate and inserts them into the outputTemplate.
     // The resolver isn't used in this case.
     outputUri = Rewriter.rewrite( inputUri, inputTemplate, outputTemplate, resolver, null );
@@ -76,8 +76,8 @@ public class RewriterTest {
     // I want to discuss the '$' syntax hoping you have a better suggestion.
     // IMPORTANT: The $ ended up being used for function so the syntax below cannot be used.  Consider ^ or something else.
     inputUri = new URI( "http://some-known-host:80" );
-    inputTemplate = Parser.parse( "{scheme}://{host}:{port}" );
-    outputTemplate = Parser.parse( "{scheme}://{$host}:{port}" );
+    inputTemplate = Parser.parseTemplate( "{scheme}://{host}:{port}" );
+    outputTemplate = Parser.parseTemplate( "{scheme}://{$host}:{port}" );
     outputUri = Rewriter.rewrite( inputUri, inputTemplate, outputTemplate, resolver, null );
     assertThat( outputUri.toString(), equalTo( "http://some-other-host:80" ) );
 
@@ -85,8 +85,8 @@ public class RewriterTest {
     // Right now it uses the empty string.
     // IMPORTANT: The $ ended up being used for function so the syntax below cannot be used.  Consider ^ or something else.
     inputUri = new URI( "http://some-unknown-host:80" );
-    inputTemplate = Parser.parse( "{scheme}://{host}:{port}" );
-    outputTemplate = Parser.parse( "{scheme}://{$host}:{port}" );
+    inputTemplate = Parser.parseTemplate( "{scheme}://{host}:{port}" );
+    outputTemplate = Parser.parseTemplate( "{scheme}://{$host}:{port}" );
     outputUri = Rewriter.rewrite( inputUri, inputTemplate, outputTemplate, resolver, null );
     assertThat( outputUri.toString(), equalTo( "http://:80" ) );
 
@@ -94,8 +94,8 @@ public class RewriterTest {
     // Should this be the default and only behavior?
     // See the '?' in the output template below.
     inputUri = new URI( "http://some-unknown-host:80" );
-    inputTemplate = Parser.parse( "{scheme}://{host}:{port}" );
-    outputTemplate = Parser.parse( "{scheme}://{?host}:{port}" );
+    inputTemplate = Parser.parseTemplate( "{scheme}://{host}:{port}" );
+    outputTemplate = Parser.parseTemplate( "{scheme}://{?host}:{port}" );
     outputUri = Rewriter.rewrite( inputUri, inputTemplate, outputTemplate, resolver, null );
     assertThat( outputUri.toString(), equalTo( "http://some-unknown-host:80" ) );
   }
@@ -111,8 +111,8 @@ public class RewriterTest {
     EasyMock.replay( resolver, evaluator );
 
     URI inputUri = new URI( "scheme://internal-host:777/path" );
-    Template inputMatch = Parser.parse( "{scheme}://{host}:{port}/{path=**}?{**}" );
-    Template outputTemplate = Parser.parse( "{scheme}://{$hostmap(host)}:{port}/{path=**}?&{**}" );
+    Template inputMatch = Parser.parseTemplate( "{scheme}://{host}:{port}/{path=**}?{**}" );
+    Template outputTemplate = Parser.parseTemplate( "{scheme}://{$hostmap(host)}:{port}/{path=**}?&{**}" );
 
     URI outputUri = Rewriter.rewrite( inputUri, inputMatch, outputTemplate, resolver, evaluator );
 
@@ -126,20 +126,20 @@ public class RewriterTest {
     MockParams resolver = new MockParams();
 
     inputUri = new URI( "path-1/path-2" );
-    inputTemplate = Parser.parse( "{path-1-name}/{path-2-name}" );
-    outputTemplate = Parser.parse( "{path-2-name}/{path-1-name}" );
+    inputTemplate = Parser.parseTemplate( "{path-1-name}/{path-2-name}" );
+    outputTemplate = Parser.parseTemplate( "{path-2-name}/{path-1-name}" );
     outputUri = Rewriter.rewrite( inputUri, inputTemplate, outputTemplate, resolver, null );
     assertThat( outputUri.toString(), equalTo( "path-2/path-1" ) );
 
     inputUri = new URI( "path-1/path-2/path-3/path-4" );
-    inputTemplate = Parser.parse( "path-1/{path=**}/path-4" ); // Need the ** to allow the expansion to include all path values.
-    outputTemplate = Parser.parse( "new-path-1/{path=**}/new-path-4" );
+    inputTemplate = Parser.parseTemplate( "path-1/{path=**}/path-4" ); // Need the ** to allow the expansion to include all path values.
+    outputTemplate = Parser.parseTemplate( "new-path-1/{path=**}/new-path-4" );
     outputUri = Rewriter.rewrite( inputUri, inputTemplate, outputTemplate, resolver, null );
     assertThat( outputUri.toString(), equalTo( "new-path-1/path-2/path-3/new-path-4" ) );
 
     inputUri = new URI( "some-path?query-name=some-queryParam-value" );
-    inputTemplate = Parser.parse( "{path-name}?query-name={queryParam-value}" );
-    outputTemplate = Parser.parse( "{queryParam-value}/{path-name}" );
+    inputTemplate = Parser.parseTemplate( "{path-name}?query-name={queryParam-value}" );
+    outputTemplate = Parser.parseTemplate( "{queryParam-value}/{path-name}" );
     outputUri = Rewriter.rewrite( inputUri, inputTemplate, outputTemplate, resolver, null );
     assertThat( outputUri.toString(), equalTo( "some-queryParam-value/some-path" ) );
   }
@@ -151,15 +151,15 @@ public class RewriterTest {
     MockParams params = new MockParams();
 
     inputUri = new URI( "path?query=value" );
-    inputTemplate = Parser.parse( "path?{**}" );
-    outputTemplate = Parser.parse( "path?{**}" );
+    inputTemplate = Parser.parseTemplate( "path?{**}" );
+    outputTemplate = Parser.parseTemplate( "path?{**}" );
 
     outputUri = Rewriter.rewrite( inputUri, inputTemplate, outputTemplate, params, null );
     assertThat( outputUri.toString(), equalTo( "path?query=value" ) );
 
     inputUri = new URI( "path?query=value" );
-    inputTemplate = Parser.parse( "path?{*}" );
-    outputTemplate = Parser.parse( "path?{*}" );
+    inputTemplate = Parser.parseTemplate( "path?{*}" );
+    outputTemplate = Parser.parseTemplate( "path?{*}" );
     outputUri = Rewriter.rewrite( inputUri, inputTemplate, outputTemplate, params, null );
     assertThat( outputUri.toString(), equalTo( "path?query=value" ) );
   }
@@ -180,79 +180,79 @@ public class RewriterTest {
 
     actualInput = new URI( "http://some-host:0/some-path" );
 //    sourcePattern = Parser.parse( "**" );
-    sourcePattern = Parser.parse( "*://*:*/**" );
-    targetPattern = Parser.parse( "should-not-change" );
+    sourcePattern = Parser.parseTemplate( "*://*:*/**" );
+    targetPattern = Parser.parseTemplate( "should-not-change" );
     actualOutput = Rewriter.rewrite( actualInput, sourcePattern, targetPattern, new TestResolver( config, request ), null );
     expectOutput = new URI( "should-not-change" );
     assertThat( actualOutput, equalTo( expectOutput ) );
 
     actualInput = new URI( "http://some-host:0/some-path" );
-    sourcePattern = Parser.parse( "*://*:*/{0=**}" );
-    targetPattern = Parser.parse( "{0}" );
+    sourcePattern = Parser.parseTemplate( "*://*:*/{0=**}" );
+    targetPattern = Parser.parseTemplate( "{0}" );
     actualOutput = Rewriter.rewrite( actualInput, sourcePattern, targetPattern, new TestResolver( config, request ), null );
     expectOutput = new URI( "some-path" );
     assertThat( actualOutput, equalTo( expectOutput ) );
 
     actualInput = new URI( "http://some-host:0/pathA/pathB/pathC" );
-    sourcePattern = Parser.parse( "*://*:*/pathA/{1=*}/{2=*}" );
-    targetPattern = Parser.parse( "http://some-other-host/{2}/{1}" );
+    sourcePattern = Parser.parseTemplate( "*://*:*/pathA/{1=*}/{2=*}" );
+    targetPattern = Parser.parseTemplate( "http://some-other-host/{2}/{1}" );
     actualOutput = Rewriter.rewrite( actualInput, sourcePattern, targetPattern, new TestResolver( config, request ), null );
     expectOutput = new URI( "http://some-other-host/pathC/pathB" );
     assertThat( actualOutput, equalTo( expectOutput ) );
 
     actualInput = new URI( "http://some-host:0/some-path" );
-    sourcePattern = Parser.parse( "*://*:*/**" );
-    targetPattern = Parser.parse( "{filter-queryParam-name}" );
+    sourcePattern = Parser.parseTemplate( "*://*:*/**" );
+    targetPattern = Parser.parseTemplate( "{filter-queryParam-name}" );
     actualOutput = Rewriter.rewrite( actualInput, sourcePattern, targetPattern, new TestResolver( config, request ), null );
     expectOutput = new URI( "filter-queryParam-value" );
     assertThat( actualOutput, equalTo( expectOutput ) );
 
     actualInput = new URI( "http://some-host:0/some-path" );
-    sourcePattern = Parser.parse( "*://*:*/**" );
-    targetPattern = Parser.parse( "{expect-queryParam-name}" );
+    sourcePattern = Parser.parseTemplate( "*://*:*/**" );
+    targetPattern = Parser.parseTemplate( "{expect-queryParam-name}" );
     actualOutput = Rewriter.rewrite( actualInput, sourcePattern, targetPattern, new TestResolver( config, request ), null );
     expectOutput = new URI( "expect-queryParam-value" );
     assertThat( actualOutput, equalTo( expectOutput ) );
 
     actualInput = new URI( "http://some-host:0/some-path" );
-    sourcePattern = Parser.parse( "*://*:*/**" );
-    targetPattern = Parser.parse( "http://some-other-host/{filter-queryParam-name}/{expect-queryParam-name}" );
+    sourcePattern = Parser.parseTemplate( "*://*:*/**" );
+    targetPattern = Parser.parseTemplate( "http://some-other-host/{filter-queryParam-name}/{expect-queryParam-name}" );
     actualOutput = Rewriter.rewrite( actualInput, sourcePattern, targetPattern, new TestResolver( config, request ), null );
     expectOutput = new URI( "http://some-other-host/filter-queryParam-value/expect-queryParam-value" );
     assertThat( actualOutput, equalTo( expectOutput ) );
 
     actualInput = new URI( "http://some-host:0/pathA/pathB/pathC" );
-    sourcePattern = Parser.parse( "*://*:*/pathA/{1=*}/{2=*}" );
-    targetPattern = Parser.parse( "http://some-other-host/{2}/{1}/{filter-queryParam-name}/{expect-queryParam-name}" );
+    sourcePattern = Parser.parseTemplate( "*://*:*/pathA/{1=*}/{2=*}" );
+    targetPattern = Parser.parseTemplate( "http://some-other-host/{2}/{1}/{filter-queryParam-name}/{expect-queryParam-name}" );
     actualOutput = Rewriter.rewrite( actualInput, sourcePattern, targetPattern, new TestResolver( config, request ), null );
     expectOutput = new URI( "http://some-other-host/pathC/pathB/filter-queryParam-value/expect-queryParam-value" );
     assertThat( actualOutput, equalTo( expectOutput ) );
 
     actualInput = new URI( "/webhdfs/v1/test" );
-    sourcePattern = Parser.parse( "/webhdfs/v1/{0=**}" );
-    targetPattern = Parser.parse( "http://{filter-queryParam-name}/webhdfs/v1/{0}" );
+    sourcePattern = Parser.parseTemplate( "/webhdfs/v1/{0=**}" );
+    targetPattern = Parser.parseTemplate( "http://{filter-queryParam-name}/webhdfs/v1/{0}" );
     actualOutput = Rewriter.rewrite( actualInput, sourcePattern, targetPattern, new TestResolver( config, request ), null );
     expectOutput = new URI( "http://filter-queryParam-value/webhdfs/v1/test" );
     assertThat( actualOutput, equalTo( expectOutput ) );
 
     actualInput = new URI( "/webhdfs/v1/test" );
-    sourcePattern = Parser.parse( "/webhdfs/v1/{0=**}" );
-    targetPattern = Parser.parse( "http://{filter-queryParam-name}/webhdfs/v1/{0}" );
+    sourcePattern = Parser.parseTemplate( "/webhdfs/v1/{0=**}" );
+    targetPattern = Parser.parseTemplate( "http://{filter-queryParam-name}/webhdfs/v1/{0}" );
     actualOutput = Rewriter.rewrite( actualInput, sourcePattern, targetPattern, new TestResolver( config, request ), null );
     expectOutput = new URI( "http://filter-queryParam-value/webhdfs/v1/test" );
     assertThat( actualOutput, equalTo( expectOutput ) );
 
     actualInput = new URI( "http://vm.home:50075/webhdfs/v1/test/file?op=CREATE&user.name=hdfs&overwrite=false" );
     expectOutput = new URI( "http://filter-queryParam-value/gatewaycluster/webhdfs/v1/test/file?op=CREATE&user.name=hdfs&overwrite=false" );
-    sourcePattern = Parser.parse( "*://*:*/webhdfs/v1/{path=**}?op={op=*}&user.name={username=*}&overwrite={overwrite=*}" );
-    targetPattern = Parser.parse( "http://{filter-queryParam-name}/gatewaycluster/webhdfs/v1/{path=**}?op={op}&user.name={username}&overwrite={overwrite}" );
+    sourcePattern = Parser.parseTemplate( "*://*:*/webhdfs/v1/{path=**}?op={op=*}&user.name={username=*}&overwrite={overwrite=*}" );
+    targetPattern = Parser.parseTemplate( "http://{filter-queryParam-name}/gatewaycluster/webhdfs/v1/{path=**}?op={op}&user.name={username}&overwrite={overwrite}" );
     actualOutput = Rewriter.rewrite( actualInput, sourcePattern, targetPattern, new TestResolver( config, request ), null );
     assertThat( actualOutput, equalTo( expectOutput ) );
 
     actualInput = new URI( "/webhdfs/data/v1/test?user.name=hdfs&op=CREATE&overwrite=false&host=vm.home&port=50075" );
     expectOutput = new URI( "http://vm.home:50075/webhdfs/v1/test?op=CREATE&user.name=hdfs&overwrite=false" );
-    sourcePattern = Parser.parse( "/webhdfs/data/v1/{path=**}?{host}&{port}&{**}" );
-    targetPattern = Parser.parse( "http://{host}:{port}/webhdfs/v1/{path=**}?{**}" );
+    sourcePattern = Parser.parseTemplate( "/webhdfs/data/v1/{path=**}?{host}&{port}&{**}" );
+    targetPattern = Parser.parseTemplate( "http://{host}:{port}/webhdfs/v1/{path=**}?{**}" );
     actualOutput = Rewriter.rewrite( actualInput, sourcePattern, targetPattern, new TestResolver( config, request ), null );
     // Note: Had to change the order of the expected query params to match.
     // This is probably dependent upon iterator ordering and therefore might be a test issue.
@@ -289,8 +289,8 @@ public class RewriterTest {
     URI actualInput, actualOutput;
     String actualString;
 
-    sourcePattern = Parser.parse( "*://{host}:{port}/webhdfs/v1/{path=**}?{**}" );
-    targetPattern = Parser.parse( "{gateway.url}/webhdfs/data/v1/{path=**}?{host}&{port}&{**}" );
+    sourcePattern = Parser.parseTemplate( "*://{host}:{port}/webhdfs/v1/{path=**}?{**}" );
+    targetPattern = Parser.parseTemplate( "{gateway.url}/webhdfs/data/v1/{path=**}?{host}&{port}&{**}" );
 
     actualInput = new URI( "http://vm.local:50075/webhdfs/v1/tmp/GatewayWebHdfsFuncTest/dirA700/fileA700?op=CREATE&user.name=hdfs&overwrite=false&permission=700" );
     actualOutput = Rewriter.rewrite( actualInput, sourcePattern, targetPattern, new TestResolver( config, request ), null );
@@ -318,8 +318,8 @@ public class RewriterTest {
     URI actualInput, actualOutput;
     String actualString;
 
-    sourcePattern = Parser.parse( "/webhdfs/data/v1/{path=**}?{host}&{port}&{**}" );
-    targetPattern = Parser.parse( "http://{host}:{port}/webhdfs/v1/{path=**}?{**}" );
+    sourcePattern = Parser.parseTemplate( "/webhdfs/data/v1/{path=**}?{host}&{port}&{**}" );
+    targetPattern = Parser.parseTemplate( "http://{host}:{port}/webhdfs/v1/{path=**}?{**}" );
 
     actualInput = new URI( "/webhdfs/data/v1/tmp/GatewayWebHdfsFuncTest/dirA700/fileA700?host=vm.local&port=50075&op=CREATE&user.name=hdfs&overwrite=false&permission=700" );
     actualOutput = Rewriter.rewrite( actualInput, sourcePattern, targetPattern, new TestResolver( config, request ), null );
@@ -337,8 +337,8 @@ public class RewriterTest {
     Template inputTemplate, outputTemplate;
     URI actualInput, actualOutput, expectOutput;
 
-    inputTemplate = Parser.parse( "{scheme}://{host}:*/{path=**}?{**}" );
-    outputTemplate = Parser.parse( "{scheme}://{host}:777/test-output/{path=**}?{**}" );
+    inputTemplate = Parser.parseTemplate( "{scheme}://{host}:*/{path=**}?{**}" );
+    outputTemplate = Parser.parseTemplate( "{scheme}://{host}:777/test-output/{path=**}?{**}" );
 
     actualInput = new URI( "http://host:42/pathA/pathB" );
     expectOutput = new URI( "http://host:777/test-output/pathA/pathB" );
@@ -353,8 +353,8 @@ public class RewriterTest {
     Template inputTemplate, outputTemplate;
     URI actualInput, actualOutput;
 
-    inputTemplate = Parser.parse( "*://*:*/**/oozie/{**}?{**}");
-    outputTemplate = Parser.parse( "http://localhost:11000/oozie/{**}?{**}");
+    inputTemplate = Parser.parseTemplate( "*://*:*/**/oozie/{**}?{**}" );
+    outputTemplate = Parser.parseTemplate( "http://localhost:11000/oozie/{**}?{**}");
 
     actualInput = new URI("https://localhost:8443/gateway/oozieui/oozie/v2/jobs?_dc=1438899557070&filter=&timezone=GMT");
     actualOutput = Rewriter.rewrite( actualInput, inputTemplate, outputTemplate, null, null );

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/SegmentTest.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/SegmentTest.java b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/SegmentTest.java
index b5c9840..b2f2881 100644
--- a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/SegmentTest.java
+++ b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/SegmentTest.java
@@ -32,42 +32,42 @@ public class SegmentTest {
   @Test
   public void testEquals() throws Exception {
     Object o = new Object();
-    TestSegment s1 = new TestSegment( "p", "v" );
+    TestSegment s1 = new TestSegment( "p", "v", true );
     assertThat( s1.equals( o ), equalTo( false ) );
     assertThat( s1.equals( s1 ), equalTo( true ) );
 
-    TestSegment s2 = new TestSegment( "p", "v" );
+    TestSegment s2 = new TestSegment( "p", "v", true );
     assertThat( s1.equals( s2 ), equalTo( true ) );
 
-    TestSegment s3 = new TestSegment( "p2", "v" );
+    TestSegment s3 = new TestSegment( "p2", "v", true );
     assertThat( s2.equals( s3 ), equalTo( false ) );
 
-    TestSegment s4 = new TestSegment( "p2", "v2" );
+    TestSegment s4 = new TestSegment( "p2", "v2", true );
     assertThat( s3.equals( s4 ), equalTo( false ) );
 
-    TestSegment s5 = new TestSegment( "p", "*" );
+    TestSegment s5 = new TestSegment( "p", "*", false );
     assertThat( s1.equals( s5 ), equalTo( false ) );
 
   }
 
   @Test
   public void testMatches() throws Exception {
-    TestSegment s1 = new TestSegment( "p", "v" );
-    TestSegment s2 = new TestSegment( "p", "v" );
+    TestSegment s1 = new TestSegment( "p", "v", true );
+    TestSegment s2 = new TestSegment( "p", "v", true );
 
     assertThat( s1.matches( s1 ), equalTo( true ) );
     assertThat( s1.matches( s2 ), equalTo( true ) );
 
-    TestSegment s3 = new TestSegment( "p", "*" );
+    TestSegment s3 = new TestSegment( "p", "*", false );
     assertThat( s3.matches( s1 ), equalTo( true ) );
     assertThat( s1.matches( s3 ), equalTo( false ) ); // Because wildecards no longer supported in "that" segment.
 
-    TestSegment s4 = new TestSegment( "p", "**" );
+    TestSegment s4 = new TestSegment( "p", "**", false );
     assertThat( s4.matches( s1 ), equalTo( true ) );
     assertThat( s1.matches( s4 ), equalTo( false ) ); // Because wildecards no longer supported in "that" segment.
 
-    TestSegment s5 = new TestSegment( "p", "*.ext" );
-    TestSegment s6 = new TestSegment( "p", "file.ext" );
+    TestSegment s5 = new TestSegment( "p", "*.ext", false );
+    TestSegment s6 = new TestSegment( "p", "file.ext", false );
     assertThat( s5.matches( s5 ), equalTo( true ) );
     assertThat( s5.matches( s6 ), equalTo( true ) );
     assertThat( s6.matches( s5 ), equalTo( false ) ); // Because wildecards no longer supported in "that" segment.
@@ -128,8 +128,8 @@ public class SegmentTest {
 
   private class TestSegment extends Segment {
 
-    public TestSegment( String paramName, String valuePattern ) {
-      super( new Token( paramName, valuePattern ) );
+    public TestSegment( String paramName, String valuePattern, boolean literal ) {
+      super( new Token( paramName, valuePattern, literal ) );
     }
 
   }

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/TemplateTest.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/TemplateTest.java b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/TemplateTest.java
index cc0e720..c99421c 100644
--- a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/TemplateTest.java
+++ b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/TemplateTest.java
@@ -41,12 +41,12 @@ public class TemplateTest {
     Template template;
 
     input = "{X}";
-    template = Parser.parse( input );
+    template = Parser.parseTemplate( input );
     output = template.toString();
     assertThat( output, is( input ) );
 
     input = "{}";
-    template = Parser.parse( input );
+    template = Parser.parseTemplate( input );
     output = template.toString();
     assertThat( output, is( input ) );
 
@@ -57,52 +57,52 @@ public class TemplateTest {
     // {**}
 
     input = "*,${";
-    template = Parser.parse( input );
+    template = Parser.parseTemplate( input );
     output = template.toString();
     assertThat( output, is( input ) );
 
     input = "$";
-    template = Parser.parse( input );
+    template = Parser.parseTemplate( input );
     output = template.toString();
     assertThat( output, is( input ) );
 
     input = "$$";
-    template = Parser.parse( input );
+    template = Parser.parseTemplate( input );
     output = template.toString();
     assertThat( output, is( input ) );
 
     input = "*,$";
-    template = Parser.parse( input );
+    template = Parser.parseTemplate( input );
     output = template.toString();
     assertThat( output, is( input ) );
 
     input = "*.,${";
-    template = Parser.parse( input );
+    template = Parser.parseTemplate( input );
     output = template.toString();
     assertThat( output, is( input ) );
 
     input = "{";
-    template = Parser.parse( input );
+    template = Parser.parseTemplate( input );
     output = template.toString();
     assertThat( output, is( input ) );
 
     input = "}";
-    template = Parser.parse( input );
+    template = Parser.parseTemplate( input );
     output = template.toString();
     assertThat( output, is( input ) );
 
     input = "${X}";
-    template = Parser.parse( input );
+    template = Parser.parseTemplate( input );
     output = template.toString();
     assertThat( output, is( input ) );
 
     input = "{$X}";
-    template = Parser.parse( input );
+    template = Parser.parseTemplate( input );
     output = template.toString();
     assertThat( output, is( input ) );
 
     input = "/var/lib/oozie/*.jar,/usr/lib/hadoop/client/*.jar,/usr/lib/oozie/libserver/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar";
-    template = Parser.parse( input );
+    template = Parser.parseTemplate( input );
     output = template.toString();
     assertThat( output, is( input ) );
 
@@ -111,12 +111,17 @@ public class TemplateTest {
   @Test
   public void testToString() throws Exception {
     String text = "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment";
-    Template template = Parser.parse( text );
+    Template template = Parser.parseTemplate( text );
     String actual = template.toString();
     assertThat( actual, equalTo( text ) );
 
+    text = "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment";
+    template = Parser.parseLiteral( text );
+    actual = template.toString();
+    assertThat( actual, equalTo( text ) );
+
     text = "{*}://{host}:{*}/{**}?{**}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     actual = template.toString();
     assertThat( template.getScheme().getParamName(), is( "*" ) );
     assertThat( template.getScheme().getFirstValue().getOriginalPattern(), nullValue() );
@@ -139,21 +144,21 @@ public class TemplateTest {
     assertThat( actual, is( text ) );
 
     text = "/path/**?**";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     actual = template.toString();
     assertThat( actual, is( text ) );
 
     text = "host:42";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     actual = template.toString();
     assertThat( actual, is( text ) );
   }
 
   @Test
   public void testHashCode() throws Exception {
-    Template t1 = Parser.parse( "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment1" );
-    Template t2 = Parser.parse( "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment1" );
-    Template t3 = Parser.parse( "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment2" );
+    Template t1 = Parser.parseTemplate( "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment1" );
+    Template t2 = Parser.parseTemplate( "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment1" );
+    Template t3 = Parser.parseTemplate( "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment2" );
 
     assertThat( t1.hashCode(), equalTo( t2.hashCode() ) );
     assertThat( t1.hashCode(), not( equalTo( t3.hashCode() ) ) );
@@ -161,9 +166,9 @@ public class TemplateTest {
 
   @Test
   public void testEquals() throws Exception {
-    Template t1 = Parser.parse( "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment1" );
-    Template t2 = Parser.parse( "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment1" );
-    Template t3 = Parser.parse( "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment2" );
+    Template t1 = Parser.parseTemplate( "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment1" );
+    Template t2 = Parser.parseTemplate( "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment1" );
+    Template t3 = Parser.parseTemplate( "scheme://username:password@host:port/top/mid/bot/file?query=value#fragment2" );
 
     assertThat( t1.equals( t2 ), equalTo( true ) );
     assertThat( t1.equals( t3 ), equalTo( false ) );

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/TokenTest.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/TokenTest.java b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/TokenTest.java
index a713fb8..0aec102 100644
--- a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/TokenTest.java
+++ b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/TokenTest.java
@@ -27,7 +27,7 @@ public class TokenTest {
   @Test
   public void testConstructorAndGetters() throws Exception {
 
-    Token token = new Token( "test-parameter-name", "test-original-value", "test-effective-value" );
+    Token token = new Token( "test-parameter-name", "test-original-value", "test-effective-value", true );
 
     assertThat( token.parameterName, is( "test-parameter-name" ) );
     assertThat( token.originalPattern, is( "test-original-value" ) );


[3/3] knox git commit: KNOX-394: Request and response URLs must be parsed as literals not templates

Posted by km...@apache.org.
KNOX-394: Request and response URLs must be parsed as literals not templates


Project: http://git-wip-us.apache.org/repos/asf/knox/repo
Commit: http://git-wip-us.apache.org/repos/asf/knox/commit/33bb1ce5
Tree: http://git-wip-us.apache.org/repos/asf/knox/tree/33bb1ce5
Diff: http://git-wip-us.apache.org/repos/asf/knox/diff/33bb1ce5

Branch: refs/heads/master
Commit: 33bb1ce5727a54721baec0125dd1254d275160ac
Parents: 1755fdf
Author: Kevin Minder <ke...@hortonworks.com>
Authored: Mon Nov 2 23:46:52 2015 -0500
Committer: Kevin Minder <ke...@hortonworks.com>
Committed: Mon Nov 2 23:46:52 2015 -0500

----------------------------------------------------------------------
 .../function/UsernameFunctionProcessorTest.java |   2 +-
 .../impl/HostmapFunctionProcessorTest.java      |  14 +-
 .../impl/ServiceAddressFunctionProcessor.java   |   2 +-
 .../impl/ServiceHostFunctionProcessor.java      |   2 +-
 .../ServiceMappedAddressFunctionProcessor.java  |   2 +-
 .../ServiceMappedHostFunctionProcessor.java     |   2 +-
 .../impl/ServicePathFunctionProcessor.java      |   2 +-
 .../impl/ServicePortFunctionProcessor.java      |   2 +-
 .../impl/ServiceSchemeFunctionProcessor.java    |   2 +-
 .../impl/ServiceRegistryFunctionsTest.java      |   2 +-
 .../encrypturi/impl/DecryptUriProcessor.java    |   2 +-
 .../encrypturi/impl/EncryptUriProcessor.java    |   2 +-
 .../securequery/SecureQueryDecodeProcessor.java |   4 +-
 .../SecureQueryDecryptProcessor.java            |   4 +-
 .../securequery/SecureQueryEncodeProcessor.java |   2 +-
 .../SecureQueryEncryptProcessor.java            |   2 +-
 .../SecureQueryDecodeProcessorTest.java         |   4 +-
 .../SecureQueryEncodeProcessorTest.java         |   2 +-
 .../SecureQueryEncryptDecryptProcessorTest.java |   2 +-
 .../UrlRewriteActionRewriteProcessorExt.java    |   4 +-
 .../ext/UrlRewriteMatchDescriptorExt.java       |   2 +-
 .../filter/rewrite/impl/UrlRewriteRequest.java  |   4 +-
 .../filter/rewrite/impl/UrlRewriteResponse.java |   2 +-
 .../impl/UrlRewriteRuleDescriptorImpl.java      |   2 +-
 .../impl/form/FormUrlRewriteFilterReader.java   |   2 +-
 .../impl/html/HtmlUrlRewriteFilterReader.java   |   2 +-
 .../JavaScriptUrlRewriteFilterReader.java       |   2 +-
 .../impl/json/JsonUrlRewriteFilterReader.java   |   2 +-
 .../impl/xml/XmlUrlRewriteFilterReader.java     |   2 +-
 .../rewrite/api/UrlRewriteProcessorTest.java    |  16 +-
 .../api/UrlRewriteServletFilterTest.java        |   2 +-
 .../impl/FrontendFunctionProcessorTest.java     |   2 +-
 .../rewrite/impl/UrlRewriteContextImplTest.java |   2 +-
 .../rewrite/impl/xml/XmlFilterReaderTest.java   |  11 +
 .../apache/hadoop/gateway/GatewayFilter.java    |   6 +-
 .../gateway/dispatch/UrlConnectionDispatch.java |   4 +-
 .../resources/services/oozie/4.0.0/rewrite.xml  |   5 +-
 .../java/org/apache/hadoop/test/TestUtils.java  |  48 +++
 .../gateway/OozieServiceDefinitionTest.java     | 148 +++++++++
 .../oozie-request-relative.xml                  |  14 +
 .../oozie-request-with-var.xml                  |  14 +
 .../gateway/util/urltemplate/Builder.java       |  50 +--
 .../gateway/util/urltemplate/Expander.java      |   2 +-
 .../gateway/util/urltemplate/Fragment.java      |   4 +-
 .../hadoop/gateway/util/urltemplate/Host.java   |   4 +-
 .../hadoop/gateway/util/urltemplate/Parser.java | 114 ++++---
 .../gateway/util/urltemplate/Password.java      |   4 +-
 .../hadoop/gateway/util/urltemplate/Path.java   |   4 +-
 .../hadoop/gateway/util/urltemplate/Port.java   |   4 +-
 .../hadoop/gateway/util/urltemplate/Query.java  |   4 +-
 .../gateway/util/urltemplate/Rewriter.java      |   2 +-
 .../hadoop/gateway/util/urltemplate/Scheme.java |   4 +-
 .../gateway/util/urltemplate/Segment.java       |   4 +-
 .../hadoop/gateway/util/urltemplate/Token.java  |  12 +-
 .../gateway/util/urltemplate/Username.java      |   4 +-
 .../gateway/util/urltemplate/ExpanderTest.java  | 162 +++++++---
 .../gateway/util/urltemplate/MatcherTest.java   | 320 +++++++++----------
 .../gateway/util/urltemplate/ParserTest.java    | 198 +++++++-----
 .../gateway/util/urltemplate/RewriterTest.java  | 100 +++---
 .../gateway/util/urltemplate/SegmentTest.java   |  26 +-
 .../gateway/util/urltemplate/TemplateTest.java  |  49 +--
 .../gateway/util/urltemplate/TokenTest.java     |   2 +-
 62 files changed, 897 insertions(+), 528 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-identity-assertion-common/src/test/java/org/apache/hadoop/gateway/identityasserter/function/UsernameFunctionProcessorTest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-identity-assertion-common/src/test/java/org/apache/hadoop/gateway/identityasserter/function/UsernameFunctionProcessorTest.java b/gateway-provider-identity-assertion-common/src/test/java/org/apache/hadoop/gateway/identityasserter/function/UsernameFunctionProcessorTest.java
index ebbe6ec..3cc81a8 100644
--- a/gateway-provider-identity-assertion-common/src/test/java/org/apache/hadoop/gateway/identityasserter/function/UsernameFunctionProcessorTest.java
+++ b/gateway-provider-identity-assertion-common/src/test/java/org/apache/hadoop/gateway/identityasserter/function/UsernameFunctionProcessorTest.java
@@ -223,7 +223,7 @@ public class UsernameFunctionProcessorTest {
       try {
         request.setAttribute(
             AbstractGatewayFilter.SOURCE_REQUEST_URL_ATTRIBUTE_NAME,
-            Parser.parse( sourceUrl.toString() ) );
+            Parser.parseLiteral( sourceUrl.toString() ) );
       } catch( URISyntaxException e ) {
         throw new ServletException( e );
       }

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-func-hostmap-static/src/test/java/org/apache/hadoop/gateway/hostmap/impl/HostmapFunctionProcessorTest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-func-hostmap-static/src/test/java/org/apache/hadoop/gateway/hostmap/impl/HostmapFunctionProcessorTest.java b/gateway-provider-rewrite-func-hostmap-static/src/test/java/org/apache/hadoop/gateway/hostmap/impl/HostmapFunctionProcessorTest.java
index be738e9..67290fb 100644
--- a/gateway-provider-rewrite-func-hostmap-static/src/test/java/org/apache/hadoop/gateway/hostmap/impl/HostmapFunctionProcessorTest.java
+++ b/gateway-provider-rewrite-func-hostmap-static/src/test/java/org/apache/hadoop/gateway/hostmap/impl/HostmapFunctionProcessorTest.java
@@ -91,7 +91,7 @@ public class HostmapFunctionProcessorTest {
     UrlRewriteProcessor rewriter = new UrlRewriteProcessor();
     rewriter.initialize( environment, descriptor );
 
-    Template input = Parser.parse( "test-scheme://test-inbound-host:42/test-path/test-file?test-name=test-value" );
+    Template input = Parser.parseLiteral( "test-scheme://test-inbound-host:42/test-path/test-file?test-name=test-value" );
     Template output = rewriter.rewrite( resolver, input, UrlRewriter.Direction.IN, null );
     //System.out.println( output );
     assertThat( output, notNullValue() );
@@ -117,7 +117,7 @@ public class HostmapFunctionProcessorTest {
     UrlRewriteProcessor rewriter = new UrlRewriteProcessor();
     rewriter.initialize( environment, descriptor );
 
-    Template input = Parser.parse(
+    Template input = Parser.parseLiteral(
         "test-scheme://test-external-host:42/test-path/test-file?test-name-1=test-value-1&test-name-2=test-value-2" );
     Template output = rewriter.rewrite( resolver, input, UrlRewriter.Direction.OUT, "test-rule" );
     //System.out.println( output );
@@ -151,7 +151,7 @@ public class HostmapFunctionProcessorTest {
     UrlRewriteProcessor rewriter = new UrlRewriteProcessor();
     rewriter.initialize( environment, descriptor );
 
-    Template input = Parser.parse(
+    Template input = Parser.parseLiteral(
         "test-scheme://test-external-host:42/test-path/test-file?qp1=qp1-val&qp2=qp2-val&test-name-1=test-value-1&test-name-2=test-value-2" );
     Template output = rewriter.rewrite( resolver, input, UrlRewriter.Direction.OUT, "test-rule" );
     //System.out.println( output );
@@ -185,7 +185,7 @@ public class HostmapFunctionProcessorTest {
     UrlRewriteProcessor rewriter = new UrlRewriteProcessor();
     rewriter.initialize( environment, descriptor );
 
-    Template input = Parser.parse(
+    Template input = Parser.parseLiteral(
         "test-scheme://test-inbound-unmapped-host:42/test-path/test-file?test-name-1=test-value-1&test-name-2=test-value-2" );
     Template output = rewriter.rewrite( resolver, input, UrlRewriter.Direction.IN, null );
     //System.out.println( output );
@@ -212,7 +212,7 @@ public class HostmapFunctionProcessorTest {
     UrlRewriteProcessor rewriter = new UrlRewriteProcessor();
     rewriter.initialize( environment, descriptor );
 
-    Template input = Parser.parse( "test-scheme://test-inbound-host:42/test-path/test-file?test-name=test-value" );
+    Template input = Parser.parseLiteral( "test-scheme://test-inbound-host:42/test-path/test-file?test-name=test-value" );
     Template output = rewriter.rewrite( resolver, input, UrlRewriter.Direction.IN, null );
     //System.out.println( output );
     assertThat( output, notNullValue() );
@@ -238,7 +238,7 @@ public class HostmapFunctionProcessorTest {
     UrlRewriteProcessor rewriter = new UrlRewriteProcessor();
     rewriter.initialize( environment, descriptor );
 
-    Template input = Parser.parse( "test-scheme://test-inbound-host:42/test-path/test-file?test-name=test-value" );
+    Template input = Parser.parseLiteral( "test-scheme://test-inbound-host:42/test-path/test-file?test-name=test-value" );
     Template output = rewriter.rewrite( resolver, input, UrlRewriter.Direction.IN, null );
     //System.out.println( output );
     assertThat( output, notNullValue() );
@@ -264,7 +264,7 @@ public class HostmapFunctionProcessorTest {
     UrlRewriteProcessor rewriter = new UrlRewriteProcessor();
     rewriter.initialize( environment, descriptor );
 
-    Template input = Parser.parse( "test-scheme://test-inbound-host:42/test-path/test-file?test-name=test-value" );
+    Template input = Parser.parseLiteral( "test-scheme://test-inbound-host:42/test-path/test-file?test-name=test-value" );
     Template output = rewriter.rewrite( resolver, input, UrlRewriter.Direction.IN, null );
     //System.out.println( output );
     assertThat( output, notNullValue() );

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceAddressFunctionProcessor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceAddressFunctionProcessor.java b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceAddressFunctionProcessor.java
index c8b53a3..e7bafae 100644
--- a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceAddressFunctionProcessor.java
+++ b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceAddressFunctionProcessor.java
@@ -56,7 +56,7 @@ public class ServiceAddressFunctionProcessor
     String addr = parameter;
     String url = lookupServiceUrl( parameter );
     if( url != null ) {
-      Template template = Parser.parse( url );
+      Template template = Parser.parseLiteral( url );
       Host host = template.getHost();
       String hostStr = null;
       if( host != null ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceHostFunctionProcessor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceHostFunctionProcessor.java b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceHostFunctionProcessor.java
index c9e7f9b..7448d12 100644
--- a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceHostFunctionProcessor.java
+++ b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceHostFunctionProcessor.java
@@ -44,7 +44,7 @@ public class ServiceHostFunctionProcessor
       for( String parameter : parameters ) {
         String url = lookupServiceUrl( parameter );
         if( url != null ) {
-          Template template = Parser.parse( url );
+          Template template = Parser.parseLiteral( url );
           Host host = template.getHost();
           if( host != null ) {
             parameter = host.getFirstValue().getPattern();

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceMappedAddressFunctionProcessor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceMappedAddressFunctionProcessor.java b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceMappedAddressFunctionProcessor.java
index 5809eb8..c5c8116 100644
--- a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceMappedAddressFunctionProcessor.java
+++ b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceMappedAddressFunctionProcessor.java
@@ -72,7 +72,7 @@ public class ServiceMappedAddressFunctionProcessor
     String addr = parameter;
     String url = lookupServiceUrl( parameter );
     if( url != null ) {
-      Template template = Parser.parse( url );
+      Template template = Parser.parseLiteral( url );
       Host host = template.getHost();
       String hostStr = null;
       if( host != null ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceMappedHostFunctionProcessor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceMappedHostFunctionProcessor.java b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceMappedHostFunctionProcessor.java
index d7ab283..770aecd 100644
--- a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceMappedHostFunctionProcessor.java
+++ b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceMappedHostFunctionProcessor.java
@@ -59,7 +59,7 @@ public class ServiceMappedHostFunctionProcessor
       for( String parameter : parameters ) {
         String url = lookupServiceUrl( parameter );
         if( url != null ) {
-          Template template = Parser.parse( url );
+          Template template = Parser.parseLiteral( url );
           Host host = template.getHost();
           if( host != null ) {
             String hostStr = host.getFirstValue().getPattern();

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServicePathFunctionProcessor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServicePathFunctionProcessor.java b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServicePathFunctionProcessor.java
index d3a1229..1269ca9 100644
--- a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServicePathFunctionProcessor.java
+++ b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServicePathFunctionProcessor.java
@@ -44,7 +44,7 @@ public class ServicePathFunctionProcessor
       for( String parameter : parameters ) {
         String url = lookupServiceUrl( parameter );
         if( url != null ) {
-          Template template = Parser.parse( url );
+          Template template = Parser.parseLiteral( url );
           List<Path> path = template.getPath();
           if( path != null ) {
             parameter = toString( path );

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServicePortFunctionProcessor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServicePortFunctionProcessor.java b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServicePortFunctionProcessor.java
index 7226922..d05620c 100644
--- a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServicePortFunctionProcessor.java
+++ b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServicePortFunctionProcessor.java
@@ -44,7 +44,7 @@ public class ServicePortFunctionProcessor
       for( String parameter : parameters ) {
         String url = lookupServiceUrl( parameter );
         if( url != null ) {
-          Template template = Parser.parse( url );
+          Template template = Parser.parseLiteral( url );
           Port port = template.getPort();
           if( port != null ) {
             parameter = port.getFirstValue().getPattern();

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceSchemeFunctionProcessor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceSchemeFunctionProcessor.java b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceSchemeFunctionProcessor.java
index 919f5c4..4c5f03b 100644
--- a/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceSchemeFunctionProcessor.java
+++ b/gateway-provider-rewrite-func-service-registry/src/main/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceSchemeFunctionProcessor.java
@@ -44,7 +44,7 @@ public class ServiceSchemeFunctionProcessor
       for( String parameter : parameters ) {
         String url = lookupServiceUrl( parameter );
         if( url != null && !url.equals( parameter ) ) {
-          Template template = Parser.parse( url );
+          Template template = Parser.parseLiteral( url );
           Scheme scheme = template.getScheme();
           if( scheme != null ) {
             parameter = scheme.getFirstValue().getPattern();

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-func-service-registry/src/test/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceRegistryFunctionsTest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-func-service-registry/src/test/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceRegistryFunctionsTest.java b/gateway-provider-rewrite-func-service-registry/src/test/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceRegistryFunctionsTest.java
index d7c2ba3..4f57f0f 100644
--- a/gateway-provider-rewrite-func-service-registry/src/test/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceRegistryFunctionsTest.java
+++ b/gateway-provider-rewrite-func-service-registry/src/test/java/org/apache/hadoop/gateway/svcregfunc/impl/ServiceRegistryFunctionsTest.java
@@ -200,7 +200,7 @@ public class ServiceRegistryFunctionsTest {
       try {
         request.setAttribute(
             AbstractGatewayFilter.SOURCE_REQUEST_URL_ATTRIBUTE_NAME,
-            Parser.parse( sourceUrl.toString() ) );
+            Parser.parseLiteral( sourceUrl.toString() ) );
       } catch( URISyntaxException e ) {
         throw new ServletException( e );
       }

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-step-encrypt-uri/src/main/java/org/apache/hadoop/gateway/encrypturi/impl/DecryptUriProcessor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-step-encrypt-uri/src/main/java/org/apache/hadoop/gateway/encrypturi/impl/DecryptUriProcessor.java b/gateway-provider-rewrite-step-encrypt-uri/src/main/java/org/apache/hadoop/gateway/encrypturi/impl/DecryptUriProcessor.java
index cbd26b7..9a9d0c7 100644
--- a/gateway-provider-rewrite-step-encrypt-uri/src/main/java/org/apache/hadoop/gateway/encrypturi/impl/DecryptUriProcessor.java
+++ b/gateway-provider-rewrite-step-encrypt-uri/src/main/java/org/apache/hadoop/gateway/encrypturi/impl/DecryptUriProcessor.java
@@ -58,7 +58,7 @@ public class DecryptUriProcessor
   @Override
   public UrlRewriteStepStatus process( UrlRewriteContext context ) throws Exception {
     if( param != null && !param.isEmpty() ) {
-      Template template = Parser.parse( "{" + param + "}" );
+      Template template = Parser.parseTemplate( "{" + param + "}" );
       String resolvedTemplate = Expander.expandToString( template, context.getParameters(), context.getEvaluator() );
       String url = decode( resolvedTemplate );
       EncryptStepContextParams params = new EncryptStepContextParams();

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-step-encrypt-uri/src/main/java/org/apache/hadoop/gateway/encrypturi/impl/EncryptUriProcessor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-step-encrypt-uri/src/main/java/org/apache/hadoop/gateway/encrypturi/impl/EncryptUriProcessor.java b/gateway-provider-rewrite-step-encrypt-uri/src/main/java/org/apache/hadoop/gateway/encrypturi/impl/EncryptUriProcessor.java
index d9cfd13..2b0554e 100644
--- a/gateway-provider-rewrite-step-encrypt-uri/src/main/java/org/apache/hadoop/gateway/encrypturi/impl/EncryptUriProcessor.java
+++ b/gateway-provider-rewrite-step-encrypt-uri/src/main/java/org/apache/hadoop/gateway/encrypturi/impl/EncryptUriProcessor.java
@@ -59,7 +59,7 @@ public class EncryptUriProcessor
   @Override
   public UrlRewriteStepStatus process( UrlRewriteContext context ) throws Exception {
     if( param != null && !param.isEmpty() && template != null && !template.isEmpty() ) {
-      Template uri = Parser.parse( template );
+      Template uri = Parser.parseTemplate( template );
       String resolvedTemplate = Expander.expandToString( uri, context.getParameters(), context.getEvaluator() );
       if( resolvedTemplate != null && !resolvedTemplate.isEmpty() ) {
         String endcoedUrl = encode( resolvedTemplate );

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryDecodeProcessor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryDecodeProcessor.java b/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryDecodeProcessor.java
index 37eec1c..c42233a 100644
--- a/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryDecodeProcessor.java
+++ b/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryDecodeProcessor.java
@@ -64,9 +64,9 @@ public class SecureQueryDecodeProcessor implements UrlRewriteStepProcessor<Secur
             // Need to take out any existing query param.
             // If we don't then someone could override something in the encoded param.
             map.remove( paramName );
-            newUrl.addQuery( paramName, "", paramValue );
+            newUrl.addQuery( paramName, "", paramValue, true );
           } else {
-            newUrl.addQuery( paramName, "", null );
+            newUrl.addQuery( paramName, "", null, true );
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryDecryptProcessor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryDecryptProcessor.java b/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryDecryptProcessor.java
index 7cae01b..1e20ad1 100644
--- a/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryDecryptProcessor.java
+++ b/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryDecryptProcessor.java
@@ -74,9 +74,9 @@ public class SecureQueryDecryptProcessor implements UrlRewriteStepProcessor<Secu
             // Need to remove from the clear parameters any param name in the encoded params.
             // If we don't then someone could override something in the encoded param.
             map.remove( paramName );
-            newUrl.addQuery( paramName, "", paramValue );
+            newUrl.addQuery( paramName, "", paramValue, true );
           } else {
-            newUrl.addQuery( paramName, "", null );
+            newUrl.addQuery( paramName, "", null, true );
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryEncodeProcessor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryEncodeProcessor.java b/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryEncodeProcessor.java
index eff1908..0b32c05 100644
--- a/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryEncodeProcessor.java
+++ b/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryEncodeProcessor.java
@@ -56,7 +56,7 @@ public class SecureQueryEncodeProcessor
     if( query != null ) {
       query = Base64.encodeBase64String( query.getBytes( "UTF-8" ) );
       query = removeTrailingEquals( query );
-      url = Parser.parse( path + "?" + ENCODED_PARAMETER_NAME +"=" + query );
+      url = Parser.parseLiteral( path + "?" + ENCODED_PARAMETER_NAME +"=" + query );
       context.setCurrentUrl( url );
     }
     return UrlRewriteStepStatus.SUCCESS;

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryEncryptProcessor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryEncryptProcessor.java b/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryEncryptProcessor.java
index 081978d..fe587ba 100644
--- a/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryEncryptProcessor.java
+++ b/gateway-provider-rewrite-step-secure-query/src/main/java/org/apache/hadoop/gateway/securequery/SecureQueryEncryptProcessor.java
@@ -66,7 +66,7 @@ public class SecureQueryEncryptProcessor
     }
     if( query != null ) {
       query = encode( query );
-      url = Parser.parse( path + "?" + ENCRYPTED_PARAMETER_NAME +"=" + query );
+      url = Parser.parseLiteral( path + "?" + ENCRYPTED_PARAMETER_NAME +"=" + query );
       context.setCurrentUrl( url );
     }
     return UrlRewriteStepStatus.SUCCESS;

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryDecodeProcessorTest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryDecodeProcessorTest.java b/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryDecodeProcessorTest.java
index e8af9ce..b6a7c5c 100644
--- a/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryDecodeProcessorTest.java
+++ b/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryDecodeProcessorTest.java
@@ -60,7 +60,7 @@ public class SecureQueryDecodeProcessorTest {
     String encQuery = encoder.encode( "test-query".getBytes("utf-8" ) );
     encQuery = encQuery.replaceAll( "\\=", "" );
     String inString = "http://host:0/root/path?_=" + encQuery;
-    Template inTemplate = Parser.parse( inString );
+    Template inTemplate = Parser.parseLiteral( inString );
 
     UrlRewriteContext context = EasyMock.createNiceMock( UrlRewriteContext.class );
     EasyMock.expect( context.getCurrentUrl() ).andReturn( inTemplate );
@@ -101,7 +101,7 @@ public class SecureQueryDecodeProcessorTest {
     String encQuery = encoder.encode( inQuery.getBytes( "utf-8" ) );
     encQuery = encQuery.replaceAll( "\\=", "" );
     String inString = "http://host:0/root/path?_=" + encQuery + "&clear-param=clear-value";
-    Template inTemplate = Parser.parse( inString );
+    Template inTemplate = Parser.parseLiteral( inString );
 
     UrlRewriteContext context = EasyMock.createNiceMock( UrlRewriteContext.class );
     EasyMock.expect( context.getCurrentUrl() ).andReturn( inTemplate );

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryEncodeProcessorTest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryEncodeProcessorTest.java b/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryEncodeProcessorTest.java
index 3a9fe73..0b72e91 100644
--- a/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryEncodeProcessorTest.java
+++ b/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryEncodeProcessorTest.java
@@ -51,7 +51,7 @@ public class SecureQueryEncodeProcessorTest {
     EasyMock.expect( environment.getAttribute( GatewayServices.GATEWAY_SERVICES_ATTRIBUTE ) ).andReturn( gatewayServices ).anyTimes();    
     EasyMock.expect( environment.getAttribute( GatewayServices.GATEWAY_CLUSTER_ATTRIBUTE ) ).andReturn( Arrays.asList( "test-cluster-name" ) ).anyTimes();
 
-    Template inTemplate = Parser.parse( "http://host:0/root/path?query" );
+    Template inTemplate = Parser.parseLiteral( "http://host:0/root/path?query" );
     UrlRewriteContext context = EasyMock.createNiceMock( UrlRewriteContext.class );
     EasyMock.expect( context.getCurrentUrl() ).andReturn( inTemplate );
     Capture<Template> outTemplate = new Capture<Template>();

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryEncryptDecryptProcessorTest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryEncryptDecryptProcessorTest.java b/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryEncryptDecryptProcessorTest.java
index b2e6044..ddc2782 100644
--- a/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryEncryptDecryptProcessorTest.java
+++ b/gateway-provider-rewrite-step-secure-query/src/test/java/org/apache/hadoop/gateway/securequery/SecureQueryEncryptDecryptProcessorTest.java
@@ -44,7 +44,7 @@ public class SecureQueryEncryptDecryptProcessorTest {
   @Test
   public void testEncryptDecrypt() throws Exception {
     Query query;
-    Template origTemplate = Parser.parse( "http://host:0/path/file?query-param-name=query-param-value" );
+    Template origTemplate = Parser.parseLiteral( "http://host:0/path/file?query-param-name=query-param-value" );
 
     // Test encryption.  Results are left in encTemplate
 

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/ext/UrlRewriteActionRewriteProcessorExt.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/ext/UrlRewriteActionRewriteProcessorExt.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/ext/UrlRewriteActionRewriteProcessorExt.java
index 61dd609..a2bcb1b 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/ext/UrlRewriteActionRewriteProcessorExt.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/ext/UrlRewriteActionRewriteProcessorExt.java
@@ -40,9 +40,9 @@ public class UrlRewriteActionRewriteProcessorExt
   public void initialize( UrlRewriteEnvironment environment, UrlRewriteActionRewriteDescriptorExt descriptor ) throws Exception {
     this.expander = new Expander();
     if ( descriptor.parameter() != null ) {
-      this.template = Parser.parse( descriptor.parameter() );
+      this.template = Parser.parseTemplate( descriptor.parameter() );
     } else {
-      this.template = Parser.parse( "" );
+      this.template = Parser.parseTemplate( "" );
     }
   }
 

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/ext/UrlRewriteMatchDescriptorExt.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/ext/UrlRewriteMatchDescriptorExt.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/ext/UrlRewriteMatchDescriptorExt.java
index 3cb8829..a8e1130 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/ext/UrlRewriteMatchDescriptorExt.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/ext/UrlRewriteMatchDescriptorExt.java
@@ -74,7 +74,7 @@ public class UrlRewriteMatchDescriptorExt
   @Override
   public UrlRewriteMatchDescriptor pattern( String pattern ) throws URISyntaxException {
     this.pattern = pattern;
-    this.template = Parser.parse( pattern );
+    this.template = Parser.parseTemplate( pattern );
     return this;
   }
 

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java
index e97d8e1..3865d25 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java
@@ -93,7 +93,7 @@ public class UrlRewriteRequest extends GatewayRequestWrapper implements Resolver
       urlString.append( queryString );
     }
     try {
-      urlTemplate = Parser.parse( urlString.toString() );
+      urlTemplate = Parser.parseLiteral( urlString.toString() );
     } catch( URISyntaxException e ) {
       LOG.failedToParseValueForUrlRewrite( urlString.toString() );
       // Shouldn't be possible given that the URL is constructed from parts of an existing URL.
@@ -153,7 +153,7 @@ public class UrlRewriteRequest extends GatewayRequestWrapper implements Resolver
 
   private String rewriteValue( UrlRewriter rewriter, String value, String rule ) {
     try {
-      Template input = Parser.parse( value );
+      Template input = Parser.parseLiteral( value );
       Template output = rewriter.rewrite( this, input, UrlRewriter.Direction.IN, rule );
       value = output.getPattern();
     } catch( URISyntaxException e ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteResponse.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteResponse.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteResponse.java
index 6898620..0f2b185 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteResponse.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteResponse.java
@@ -113,7 +113,7 @@ public class UrlRewriteResponse extends GatewayResponseWrapper implements Params
 
   private String rewriteValue( String value, String rule ) {
     try {
-      Template input = Parser.parse( value );
+      Template input = Parser.parseLiteral( value );
       Template output = rewriter.rewrite( this, input, UrlRewriter.Direction.OUT, rule );
       if( output != null ) {
         value = output.getPattern();

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRuleDescriptorImpl.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRuleDescriptorImpl.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRuleDescriptorImpl.java
index d718921..af882df 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRuleDescriptorImpl.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRuleDescriptorImpl.java
@@ -110,7 +110,7 @@ public class UrlRewriteRuleDescriptorImpl extends UrlRewriteFlowDescriptorBase<U
   @Override
   public UrlRewriteRuleDescriptor pattern( String pattern ) throws URISyntaxException {
     this.pattern = pattern;
-    this.template = Parser.parse( pattern );
+    this.template = Parser.parseTemplate( pattern );
     return this;
   }
 

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/form/FormUrlRewriteFilterReader.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/form/FormUrlRewriteFilterReader.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/form/FormUrlRewriteFilterReader.java
index 5f01ba1..70e2173 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/form/FormUrlRewriteFilterReader.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/form/FormUrlRewriteFilterReader.java
@@ -48,7 +48,7 @@ public class FormUrlRewriteFilterReader extends FormFilterReader {
   @Override
   protected String filterValue( String name, String value, String rule ) {
     try {
-      Template input = Parser.parse( value );
+      Template input = Parser.parseLiteral( value );
       Template output = rewriter.rewrite( resolver, input, direction, rule );
       value = output.getPattern();
     } catch( URISyntaxException e ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/html/HtmlUrlRewriteFilterReader.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/html/HtmlUrlRewriteFilterReader.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/html/HtmlUrlRewriteFilterReader.java
index 340d6d1..76b7c38 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/html/HtmlUrlRewriteFilterReader.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/html/HtmlUrlRewriteFilterReader.java
@@ -50,7 +50,7 @@ public class HtmlUrlRewriteFilterReader extends HtmlFilterReader {
   @Override
   public String filterValueString( String name, String value, String rule ) {
     try {
-      Template input = Parser.parse( value );
+      Template input = Parser.parseLiteral( value );
       Template output = rewriter.rewrite( resolver, input, direction, rule );
       if( output != null ) {
         value = output.getPattern();

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/javascript/JavaScriptUrlRewriteFilterReader.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/javascript/JavaScriptUrlRewriteFilterReader.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/javascript/JavaScriptUrlRewriteFilterReader.java
index da54e22..af9a36f 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/javascript/JavaScriptUrlRewriteFilterReader.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/javascript/JavaScriptUrlRewriteFilterReader.java
@@ -48,7 +48,7 @@ public class JavaScriptUrlRewriteFilterReader extends JavaScriptFilterReader {
   @Override
   public String filterValueString( String name, String value, String rule ) {
     try {
-      Template input = Parser.parse( value );
+      Template input = Parser.parseLiteral( value );
       Template output = rewriter.rewrite( resolver, input, direction, rule );
       if( output != null ) {
         value = output.getPattern();

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/json/JsonUrlRewriteFilterReader.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/json/JsonUrlRewriteFilterReader.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/json/JsonUrlRewriteFilterReader.java
index 4dc2df6..a5bbc82 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/json/JsonUrlRewriteFilterReader.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/json/JsonUrlRewriteFilterReader.java
@@ -52,7 +52,7 @@ public class JsonUrlRewriteFilterReader extends JsonFilterReader {
 
   protected String filterValueString( String name, String value, String rule ) {
     try {
-      Template input = Parser.parse( value );
+      Template input = Parser.parseLiteral( value );
       Template output = rewriter.rewrite( resolver, input, direction, rule );
       value = output.getPattern();
     } catch( URISyntaxException e ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlUrlRewriteFilterReader.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlUrlRewriteFilterReader.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlUrlRewriteFilterReader.java
index ee6ef0e..f9b39e5 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlUrlRewriteFilterReader.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlUrlRewriteFilterReader.java
@@ -53,7 +53,7 @@ public class XmlUrlRewriteFilterReader extends XmlFilterReader {
   //TODO: Need to limit which values are attempted to be filtered by the name.
   private String filterValueString( String name, String value, String rule ) {
     try {
-      Template input = Parser.parse( value );
+      Template input = Parser.parseLiteral( value );
       if( input != null ) {
         Template output = rewriter.rewrite( resolver, input, direction, rule );
         if( output != null ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteProcessorTest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteProcessorTest.java b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteProcessorTest.java
index 86d8460..44a4e77 100644
--- a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteProcessorTest.java
+++ b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteProcessorTest.java
@@ -69,7 +69,7 @@ public class UrlRewriteProcessorTest {
         "xml", getTestResourceReader( "rewrite.xml", "UTF-8" ) );
     processor.initialize( environment, config );
 
-    Template inputUrl = Parser.parse( "test-scheme://test-host:1/test-input-path" );
+    Template inputUrl = Parser.parseLiteral( "test-scheme://test-host:1/test-input-path" );
     Template outputUrl = processor.rewrite( null, inputUrl, UrlRewriter.Direction.IN, null );
 
     assertThat( "Expect rewrite to produce a new URL",
@@ -92,7 +92,7 @@ public class UrlRewriteProcessorTest {
         "xml", getTestResourceReader( "rewrite-with-same-rules.xml", "UTF-8" ) );
     processor.initialize( environment, config );
 
-    Template inputUrl = Parser.parse( "scheme://input-mock-host:42/test-input-path" );
+    Template inputUrl = Parser.parseLiteral( "scheme://input-mock-host:42/test-input-path" );
     Template outputUrl = processor.rewrite( null, inputUrl, UrlRewriter.Direction.OUT, null );
 
     assertThat( "Expect rewrite to produce a new URL",
@@ -102,7 +102,7 @@ public class UrlRewriteProcessorTest {
         "Expect rewrite to contain the correct path.",
         outputUrl.toString(), is( "output-mock-scheme-1://output-mock-host-1:42/test-input-path" ) );
 
-    inputUrl = Parser.parse( "mock-scheme://input-mock-host:42/no-query" );
+    inputUrl = Parser.parseLiteral( "mock-scheme://input-mock-host:42/no-query" );
     outputUrl = processor.rewrite( null, inputUrl, UrlRewriter.Direction.OUT, null );
 
     assertThat(
@@ -130,7 +130,7 @@ public class UrlRewriteProcessorTest {
         "xml", getTestResourceReader( "rewrite-with-same-rules.xml", "UTF-8" ) );
     processor.initialize( environment, config );
 
-    Template inputUrl = Parser.parse( "input-mock-scheme-1://input-mock-host-1:42/test-input-path" );
+    Template inputUrl = Parser.parseLiteral( "input-mock-scheme-1://input-mock-host-1:42/test-input-path" );
     Template outputUrl = processor.rewrite( null, inputUrl, UrlRewriter.Direction.OUT, "test-rule-2" );
 
     assertThat( "Expect rewrite to produce a new URL",
@@ -165,13 +165,13 @@ public class UrlRewriteProcessorTest {
     Template inputUrl;
     Template outputUrl;
 
-    inputUrl = Parser.parse( "test-scheme://test-host:777/test-path" );
+    inputUrl = Parser.parseLiteral( "test-scheme://test-host:777/test-path" );
     outputUrl = processor.rewrite( null, inputUrl, UrlRewriter.Direction.IN, "test-rule-with-complex-flow" );
     assertThat(
         "Expect rewrite to contain the correct path.",
         outputUrl.toString(), is( "test-scheme-output://test-host-output:42/test-path-output/test-path" ) );
 
-    inputUrl = Parser.parse( "test-scheme://test-host:42/~/test-path" );
+    inputUrl = Parser.parseLiteral( "test-scheme://test-host:42/~/test-path" );
     outputUrl = processor.rewrite( null, inputUrl, UrlRewriter.Direction.IN, "test-rule-with-complex-flow" );
     assertThat(
         "Expect rewrite to contain the correct path.",
@@ -195,14 +195,14 @@ public class UrlRewriteProcessorTest {
     Template inputUrl;
     Template outputUrl;
 
-    inputUrl = Parser.parse( "test-scheme-input://test-host-input:42/test-path-input-one/test-path-input-two?test-query-name=test-query-value" );
+    inputUrl = Parser.parseLiteral( "test-scheme-input://test-host-input:42/test-path-input-one/test-path-input-two?test-query-name=test-query-value" );
     outputUrl = processor.rewrite( null, inputUrl, UrlRewriter.Direction.OUT, "test-rule-2" );
 
     assertThat(
         "Expect rewrite to contain the correct path and query.",
         outputUrl.toString(), is( "test-scheme-output://test-host-output:777/test-path-output/test-path-input-one/test-path-input-two?test-query-name=test-query-value" ) );
 
-    inputUrl = Parser.parse( "test-scheme-input://test-host-input:42/test-path-input-one/test-path-input-two" );
+    inputUrl = Parser.parseLiteral( "test-scheme-input://test-host-input:42/test-path-input-one/test-path-input-two" );
     outputUrl = processor.rewrite( null, inputUrl, UrlRewriter.Direction.OUT, "test-rule-2" );
 
     assertThat(

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteServletFilterTest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteServletFilterTest.java b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteServletFilterTest.java
index de278ad..d33582c 100644
--- a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteServletFilterTest.java
+++ b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteServletFilterTest.java
@@ -724,7 +724,7 @@ public class UrlRewriteServletFilterTest {
       try {
         request.setAttribute(
             AbstractGatewayFilter.SOURCE_REQUEST_URL_ATTRIBUTE_NAME,
-            Parser.parse( sourceUrl.toString() ) );
+            Parser.parseLiteral( sourceUrl.toString() ) );
       } catch( URISyntaxException e ) {
         throw new ServletException( e );
       }

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/FrontendFunctionProcessorTest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/FrontendFunctionProcessorTest.java b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/FrontendFunctionProcessorTest.java
index 2081706..014ce4f 100644
--- a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/FrontendFunctionProcessorTest.java
+++ b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/FrontendFunctionProcessorTest.java
@@ -276,7 +276,7 @@ public class FrontendFunctionProcessorTest {
       try {
         request.setAttribute(
             AbstractGatewayFilter.SOURCE_REQUEST_URL_ATTRIBUTE_NAME,
-            Parser.parse( sourceUrl.toString() ) );
+            Parser.parseLiteral( sourceUrl.toString() ) );
       } catch( URISyntaxException e ) {
         throw new ServletException( e );
       }

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteContextImplTest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteContextImplTest.java b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteContextImplTest.java
index 88587ea..7267b87 100644
--- a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteContextImplTest.java
+++ b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteContextImplTest.java
@@ -52,7 +52,7 @@ public class UrlRewriteContextImplTest {
     Map<String,UrlRewriteFunctionProcessor> functions = new HashMap<String,UrlRewriteFunctionProcessor>();
 
     UrlRewriter.Direction direction = UrlRewriter.Direction.OUT;
-    Template template = Parser.parse( "scheme://host:port/dir/file" );
+    Template template = Parser.parseLiteral( "scheme://host:port/dir/file" );
 
     UrlRewriteContextImpl context = new UrlRewriteContextImpl( environment, resolver, functions, direction, template );
 

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReaderTest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReaderTest.java b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReaderTest.java
index fbe7769..1e8bb56 100644
--- a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReaderTest.java
+++ b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReaderTest.java
@@ -939,6 +939,17 @@ public class XmlFilterReaderTest {
     assertThat( output, containsString( "<tag>&amp;</tag>" ) );
   }
 
+  @Test
+  public void testSpecialTextNodeBugKnox394() throws IOException, ParserConfigurationException, XMLStreamException {
+    String inputXml = "<tag>${oozieTemplateMarkup}</tag>";
+    StringReader inputReader = new StringReader( inputXml );
+    XmlFilterReader filterReader = new NoopXmlFilterReader( inputReader, null );
+    String outputXml = new String( IOUtils.toCharArray( filterReader ) );
+    //System.out.println( "OUTPUT=" + outputXml );
+    assertThat( the( outputXml ), hasXPath( "/tag/text()", equalTo( "${oozieTemplateMarkup}" ) ) );
+  }
+
+
   private class TestXmlFilterReader extends XmlFilterReader {
 
     protected TestXmlFilterReader( Reader reader, UrlRewriteFilterContentDescriptor contentConfig ) throws IOException, ParserConfigurationException, XMLStreamException {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayFilter.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayFilter.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayFilter.java
index 3ff0abd..98ad94e 100644
--- a/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayFilter.java
+++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayFilter.java
@@ -102,7 +102,7 @@ public class GatewayFilter implements Filter {
 
     Template pathTemplate;
     try {
-      pathTemplate = Parser.parse( path );
+      pathTemplate = Parser.parseLiteral( path );
     } catch( URISyntaxException e ) {
       throw new ServletException( e );
     }
@@ -253,7 +253,7 @@ public class GatewayFilter implements Filter {
 
     private Holder( String path, String name, Filter filter, Map<String,String> params, String resourceRole ) throws URISyntaxException {
 //      this.path = path;
-      this.template = Parser.parse( path );
+      this.template = Parser.parseTemplate( path );
       this.name = name;
       this.params = params;
       this.instance = filter;
@@ -274,7 +274,7 @@ public class GatewayFilter implements Filter {
 
     private Holder( String path, String name, String clazz, Map<String,String> params, String resourceRole ) throws URISyntaxException {
 //      this.path = path;
-      this.template = Parser.parse( path );
+      this.template = Parser.parseTemplate( path );
       this.name = name;
       this.params = params;
       this.instance = null;

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-server/src/main/java/org/apache/hadoop/gateway/dispatch/UrlConnectionDispatch.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/dispatch/UrlConnectionDispatch.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/dispatch/UrlConnectionDispatch.java
index c0347cf..25de087 100644
--- a/gateway-server/src/main/java/org/apache/hadoop/gateway/dispatch/UrlConnectionDispatch.java
+++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/dispatch/UrlConnectionDispatch.java
@@ -94,8 +94,8 @@ public class UrlConnectionDispatch extends AbstractGatewayFilter {
     String targetPattern = getConfig().getInitParameter( "target" );
 
     //TODO: Some of the compilation should be done at servlet init for performance reasons.
-    Template sourceTemplate = Parser.parse( sourcePattern );
-    Template targetTemplate = Parser.parse( targetPattern );
+    Template sourceTemplate = Parser.parseTemplate( sourcePattern );
+    Template targetTemplate = Parser.parseTemplate( targetPattern );
 
     Resolver resolver = new DispatchParamResolver( getConfig(), request );
     URI sourceUri = new URI( sourcePathInfo );

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-service-definitions/src/main/resources/services/oozie/4.0.0/rewrite.xml
----------------------------------------------------------------------
diff --git a/gateway-service-definitions/src/main/resources/services/oozie/4.0.0/rewrite.xml b/gateway-service-definitions/src/main/resources/services/oozie/4.0.0/rewrite.xml
index bd8002b..dda93ef 100644
--- a/gateway-service-definitions/src/main/resources/services/oozie/4.0.0/rewrite.xml
+++ b/gateway-service-definitions/src/main/resources/services/oozie/4.0.0/rewrite.xml
@@ -47,8 +47,11 @@
         <match pattern="/~/{path=**}">
             <rewrite template="hdfs://{$serviceMappedAddr[NAMENODE]}/user/{$username}/{path=**}"/>
         </match>
+        <match pattern="{var=${*}}/{path=**}">
+            <rewrite template="{var}/{path=**}"/>
+        </match>
         <match pattern="{path=**}">
-            <rewrite template="hdfs://{$serviceMappedAddr[NAMENODE]}/{path=**}"/>
+            <rewrite template="{$serviceMappedUrl[NAMENODE]}/{path=**}"/>
         </match>
     </rule>
 

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-test-utils/src/main/java/org/apache/hadoop/test/TestUtils.java
----------------------------------------------------------------------
diff --git a/gateway-test-utils/src/main/java/org/apache/hadoop/test/TestUtils.java b/gateway-test-utils/src/main/java/org/apache/hadoop/test/TestUtils.java
index d919575..084d296 100644
--- a/gateway-test-utils/src/main/java/org/apache/hadoop/test/TestUtils.java
+++ b/gateway-test-utils/src/main/java/org/apache/hadoop/test/TestUtils.java
@@ -19,13 +19,26 @@ package org.apache.hadoop.test;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.io.StringWriter;
 import java.net.URL;
 import java.util.UUID;
 
@@ -45,12 +58,30 @@ public class TestUtils {
     return url;
   }
 
+  public static URL getResourceUrl( String name ) throws FileNotFoundException {
+    URL url = ClassLoader.getSystemResource( name );
+    if( url == null ) {
+      throw new FileNotFoundException( name );
+    }
+    return url;
+  }
+
+  public static InputStream getResourceStream( String name ) throws IOException {
+    URL url = ClassLoader.getSystemResource( name );
+    InputStream stream = url.openStream();
+    return stream;
+  }
+
   public static InputStream getResourceStream( Class clazz, String name ) throws IOException {
     URL url = getResourceUrl( clazz, name );
     InputStream stream = url.openStream();
     return stream;
   }
 
+  public static Reader getResourceReader( String name, String charset ) throws IOException {
+    return new InputStreamReader( getResourceStream( name ), charset );
+  }
+
   public static Reader getResourceReader( Class clazz, String name, String charset ) throws IOException {
     return new InputStreamReader( getResourceStream( clazz, name ), charset );
   }
@@ -66,4 +97,21 @@ public class TestUtils {
     return tempDir;
   }
 
+  public static Document parseXml( InputStream stream ) throws ParserConfigurationException, IOException, SAXException {
+    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+    DocumentBuilder builder = factory.newDocumentBuilder();
+    Document document = builder.parse( new InputSource( stream ) );
+    return document;
+  }
+
+  public static void dumpXml( Document document ) throws TransformerException {
+    Transformer transformer = TransformerFactory.newInstance().newTransformer();
+    transformer.setOutputProperty( OutputKeys.INDENT, "yes" );
+    StreamResult result = new StreamResult( new StringWriter() );
+    DOMSource source = new DOMSource( document );
+    transformer.transform( source, result );
+    String xmlString = result.getWriter().toString();
+    System.out.println( xmlString );
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-test/src/test/java/org/apache/hadoop/gateway/OozieServiceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/java/org/apache/hadoop/gateway/OozieServiceDefinitionTest.java b/gateway-test/src/test/java/org/apache/hadoop/gateway/OozieServiceDefinitionTest.java
new file mode 100644
index 0000000..96d8fbd
--- /dev/null
+++ b/gateway-test/src/test/java/org/apache/hadoop/gateway/OozieServiceDefinitionTest.java
@@ -0,0 +1,148 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.gateway;
+
+import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteEnvironment;
+import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteProcessor;
+import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteRulesDescriptor;
+import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteRulesDescriptorFactory;
+import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletContextListener;
+import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletEnvironment;
+import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletFilter;
+import org.apache.hadoop.gateway.filter.rewrite.impl.UrlRewriteRequest;
+import org.apache.hadoop.gateway.services.GatewayServices;
+import org.apache.hadoop.gateway.services.registry.ServiceRegistry;
+import org.apache.hadoop.test.TestUtils;
+import org.apache.hadoop.test.mock.MockServletInputStream;
+import org.easymock.EasyMock;
+import org.junit.Test;
+import org.w3c.dom.Document;
+
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import java.io.InputStream;
+import java.io.Reader;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.xml.HasXPath.hasXPath;
+
+public class OozieServiceDefinitionTest {
+
+  @Test
+  public void testOozieRewriteRulesForLiteralTemplateValuesBugKnox394() throws Exception {
+
+    // This is a unique part of this test.
+    String testResource = "oozie-request-with-var.xml";
+
+    // Mock out the service url registry which is required for several url rewrite functions to work.
+    ServiceRegistry registry = EasyMock.createNiceMock( ServiceRegistry.class );
+    EasyMock.expect( registry.lookupServiceURL( "test-cluster", "NAMENODE" ) ).andReturn( "test-scheme://test-host:42" ).anyTimes();
+
+    // Mock out the gateway services registry which is required for several url rewrite functions to work.
+    GatewayServices services = EasyMock.createNiceMock( GatewayServices.class );
+    EasyMock.expect( services.getService( GatewayServices.SERVICE_REGISTRY_SERVICE ) ).andReturn( registry ).anyTimes();
+
+    UrlRewriteProcessor rewriteProcessor = new UrlRewriteProcessor();
+
+    ServletContext servletContext = EasyMock.createNiceMock( ServletContext.class );
+    EasyMock.expect( servletContext.getAttribute( UrlRewriteServletContextListener.PROCESSOR_ATTRIBUTE_NAME ) ).andReturn( rewriteProcessor ).anyTimes();
+    EasyMock.expect( servletContext.getAttribute( GatewayServices.GATEWAY_SERVICES_ATTRIBUTE ) ).andReturn( services ).anyTimes();
+    EasyMock.expect( servletContext.getAttribute( GatewayServices.GATEWAY_CLUSTER_ATTRIBUTE ) ).andReturn( "test-cluster" ).anyTimes();
+
+    HttpServletRequest servletRequest = EasyMock.createNiceMock( HttpServletRequest.class );
+    EasyMock.expect( servletRequest.getInputStream() ).andReturn( new MockServletInputStream( TestUtils.getResourceStream( OozieServiceDefinitionTest.class, testResource ) ) ).anyTimes();
+    EasyMock.expect( servletRequest.getContentType() ).andReturn( "text/xml" ).anyTimes();
+
+    FilterConfig filterConfig = EasyMock.createNiceMock( FilterConfig.class );
+    EasyMock.expect( filterConfig.getServletContext() ).andReturn( servletContext ).anyTimes();
+    EasyMock.expect( filterConfig.getInitParameter( UrlRewriteServletFilter.REQUEST_BODY_FILTER_PARAM ) ).andReturn( "OOZIE/oozie/configuration" ).anyTimes();
+
+    EasyMock.replay( registry, services, servletContext, servletRequest, filterConfig );
+
+    UrlRewriteEnvironment rewriteEnvironment = new UrlRewriteServletEnvironment( servletContext );
+
+    Reader rulesReader = TestUtils.getResourceReader( "services/oozie/4.0.0/rewrite.xml", "UTF-8" );
+    UrlRewriteRulesDescriptor rewriteRules = UrlRewriteRulesDescriptorFactory.load( "xml", rulesReader );
+    rulesReader.close();
+
+    rewriteProcessor.initialize( rewriteEnvironment, rewriteRules );
+
+    UrlRewriteRequest rewriteRequest = new UrlRewriteRequest( filterConfig, servletRequest );
+
+    InputStream stream = rewriteRequest.getInputStream();
+
+    Document document = TestUtils.parseXml( stream );
+
+    assertThat( document,
+        hasXPath( "/configuration/property[name='oozie.wf.application.path']/value",
+            equalTo( "${appPath}/workflow.xml" ) ) );
+  }
+
+  @Test
+  public void testOozieRewriteRulesForValuesRelativeToServiceRegistry() throws Exception {
+
+    // This is a unique part of this test.
+    String testResource = "oozie-request-relative.xml";
+
+    // Mock out the service url registry which is required for several url rewrite functions to work.
+    ServiceRegistry registry = EasyMock.createNiceMock( ServiceRegistry.class );
+    EasyMock.expect( registry.lookupServiceURL( "test-cluster", "NAMENODE" ) ).andReturn( "test-scheme://test-host:42" ).anyTimes();
+
+    // Mock out the gateway services registry which is required for several url rewrite functions to work.
+    GatewayServices services = EasyMock.createNiceMock( GatewayServices.class );
+    EasyMock.expect( services.getService( GatewayServices.SERVICE_REGISTRY_SERVICE ) ).andReturn( registry ).anyTimes();
+
+    UrlRewriteProcessor rewriteProcessor = new UrlRewriteProcessor();
+
+    ServletContext servletContext = EasyMock.createNiceMock( ServletContext.class );
+    EasyMock.expect( servletContext.getAttribute( UrlRewriteServletContextListener.PROCESSOR_ATTRIBUTE_NAME ) ).andReturn( rewriteProcessor ).anyTimes();
+    EasyMock.expect( servletContext.getAttribute( GatewayServices.GATEWAY_SERVICES_ATTRIBUTE ) ).andReturn( services ).anyTimes();
+    EasyMock.expect( servletContext.getAttribute( GatewayServices.GATEWAY_CLUSTER_ATTRIBUTE ) ).andReturn( "test-cluster" ).anyTimes();
+
+    HttpServletRequest servletRequest = EasyMock.createNiceMock( HttpServletRequest.class );
+    EasyMock.expect( servletRequest.getInputStream() ).andReturn( new MockServletInputStream( TestUtils.getResourceStream( OozieServiceDefinitionTest.class, testResource ) ) ).anyTimes();
+    EasyMock.expect( servletRequest.getContentType() ).andReturn( "text/xml" ).anyTimes();
+
+    FilterConfig filterConfig = EasyMock.createNiceMock( FilterConfig.class );
+    EasyMock.expect( filterConfig.getServletContext() ).andReturn( servletContext ).anyTimes();
+    EasyMock.expect( filterConfig.getInitParameter( UrlRewriteServletFilter.REQUEST_BODY_FILTER_PARAM ) ).andReturn( "OOZIE/oozie/configuration" ).anyTimes();
+
+    EasyMock.replay( registry, services, servletContext, servletRequest, filterConfig );
+
+    UrlRewriteEnvironment rewriteEnvironment = new UrlRewriteServletEnvironment( servletContext );
+
+    Reader rulesReader = TestUtils.getResourceReader( "services/oozie/4.0.0/rewrite.xml", "UTF-8" );
+    UrlRewriteRulesDescriptor rewriteRules = UrlRewriteRulesDescriptorFactory.load( "xml", rulesReader );
+    rulesReader.close();
+
+    rewriteProcessor.initialize( rewriteEnvironment, rewriteRules );
+
+    UrlRewriteRequest rewriteRequest = new UrlRewriteRequest( filterConfig, servletRequest );
+
+    InputStream stream = rewriteRequest.getInputStream();
+
+    Document document = TestUtils.parseXml( stream );
+
+    assertThat( document,
+        hasXPath( "/configuration/property[name='oozie.wf.application.path']/value",
+            equalTo( "test-scheme://test-host:42/workflow.xml" ) ) );
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-test/src/test/resources/org/apache/hadoop/gateway/OozieServiceDefinitionTest/oozie-request-relative.xml
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/resources/org/apache/hadoop/gateway/OozieServiceDefinitionTest/oozie-request-relative.xml b/gateway-test/src/test/resources/org/apache/hadoop/gateway/OozieServiceDefinitionTest/oozie-request-relative.xml
new file mode 100644
index 0000000..3b9ae46
--- /dev/null
+++ b/gateway-test/src/test/resources/org/apache/hadoop/gateway/OozieServiceDefinitionTest/oozie-request-relative.xml
@@ -0,0 +1,14 @@
+<configuration><property><name>oozie.use.system.libpath</name><value>true</value></property>
+    <property><name>cluster_name</name><value>hdp</value></property>
+    <property><name>knox_truth</name><value>true</value></property>
+    <property><name>oozie_port</name><value>11000</value>
+    </property><property><name>oozie_host</name><value>hostname</value></property>
+    <property><name>jobTracker</name><value>hostname</value></property>
+    <property><name>appPath</name><value>${nameNode}/user/svbigred/oozie-workflows/ecom_dmnd_tndr</value></property>
+    <property><name>oozie.wf.application.path</name><value>workflow.xml</value></property>
+    <property><name>knox_gateway_port</name><value>8443</value></property>
+    <property><name>knox_gateway_path</name><value>gateway</value></property>
+    <property><name>user.name</name><value>svbigred</value></property>
+    <property><name>ENV</name><value>dev</value></property>
+    <property><name>nameNode</name><value>hdfs://hostname:8020</value></property>
+</configuration>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-test/src/test/resources/org/apache/hadoop/gateway/OozieServiceDefinitionTest/oozie-request-with-var.xml
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/resources/org/apache/hadoop/gateway/OozieServiceDefinitionTest/oozie-request-with-var.xml b/gateway-test/src/test/resources/org/apache/hadoop/gateway/OozieServiceDefinitionTest/oozie-request-with-var.xml
new file mode 100644
index 0000000..ab535e3
--- /dev/null
+++ b/gateway-test/src/test/resources/org/apache/hadoop/gateway/OozieServiceDefinitionTest/oozie-request-with-var.xml
@@ -0,0 +1,14 @@
+<configuration><property><name>oozie.use.system.libpath</name><value>true</value></property>
+    <property><name>cluster_name</name><value>hdp</value></property>
+    <property><name>knox_truth</name><value>true</value></property>
+    <property><name>oozie_port</name><value>11000</value>
+    </property><property><name>oozie_host</name><value>hostname</value></property>
+    <property><name>jobTracker</name><value>hostname</value></property>
+    <property><name>appPath</name><value>${nameNode}/user/svbigred/oozie-workflows/ecom_dmnd_tndr</value></property>
+    <property><name>oozie.wf.application.path</name><value>${appPath}/workflow.xml</value></property>
+    <property><name>knox_gateway_port</name><value>8443</value></property>
+    <property><name>knox_gateway_path</name><value>gateway</value></property>
+    <property><name>user.name</name><value>svbigred</value></property>
+    <property><name>ENV</name><value>dev</value></property>
+    <property><name>nameNode</name><value>hdfs://hostname:8020</value></property>
+</configuration>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Builder.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Builder.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Builder.java
index 63ab4bc..f4c3bee 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Builder.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Builder.java
@@ -25,6 +25,7 @@ import java.util.Map;
 public class Builder {
 
   private String original;
+  private boolean literal;
   private boolean hasScheme;
   private Scheme scheme;
   private boolean hasAuthority;
@@ -48,6 +49,7 @@ public class Builder {
 
   public Builder( String original ) {
     this.original = original;
+    this.literal = false;
     this.hasScheme = false;
     this.scheme = null;
     this.hasAuthority = false;
@@ -171,7 +173,19 @@ public class Builder {
         fragment, hasFragment );
   }
 
-  public boolean getHashScheme() {
+  public boolean isLiteral() {
+    return literal;
+  }
+
+  public void setLiteral( boolean literal ) {
+    this.literal = literal;
+  }
+
+  public String getOriginal() {
+    return original;
+  }
+
+  public boolean getHasScheme() {
     return this.hasScheme;
   }
 
@@ -186,8 +200,8 @@ public class Builder {
     return this.scheme;
   }
 
-  public void setScheme( String paramName, String valuePattern ) {
-    this.scheme = new Scheme( paramName, valuePattern );
+  public void setScheme( String paramName, String valuePattern, boolean literal ) {
+    this.scheme = new Scheme( paramName, valuePattern, literal );
     setHasScheme( true );
   }
 
@@ -216,9 +230,9 @@ public class Builder {
     return username;
   }
 
-  public void setUsername( String paramName, String valuePattern ) {
+  public void setUsername( String paramName, String valuePattern, boolean literal ) {
     setHasAuthority( true );
-    username = new Username( new Token( paramName, valuePattern ) );
+    username = new Username( new Token( paramName, valuePattern, literal ) );
   }
 
   void setUsername( Token token ) {
@@ -230,9 +244,9 @@ public class Builder {
     return password;
   }
 
-  public void setPassword( String paramName, String valuePattern ) {
+  public void setPassword( String paramName, String valuePattern, boolean literal ) {
     setHasAuthority( true );
-    password = new Password( paramName, valuePattern );
+    password = new Password( paramName, valuePattern, literal );
   }
 
   void setPassword( Token token ) {
@@ -244,8 +258,8 @@ public class Builder {
     return host;
   }
 
-  public void setHost( String paramName, String valuePattern ) {
-    setHost( new Token( paramName, valuePattern ) );
+  public void setHost( String paramName, String valuePattern, boolean literal ) {
+    setHost( new Token( paramName, valuePattern, literal ) );
   }
 
   void setHost( Token token ) {
@@ -257,8 +271,8 @@ public class Builder {
     return port;
   }
 
-  public void setPort( String paramName, String valuePattern ) {
-    setPort( new Token( paramName, valuePattern ) );
+  public void setPort( String paramName, String valuePattern, boolean literal ) {
+    setPort( new Token( paramName, valuePattern, literal ) );
   }
 
   void setPort( Token token ) {
@@ -288,8 +302,8 @@ public class Builder {
     return path;
   }
 
-  public Builder addPath( String paramName, String valuePattern ) {
-    Path segment = new Path( paramName, valuePattern );
+  public Builder addPath( String paramName, String valuePattern, boolean literal ) {
+    Path segment = new Path( paramName, valuePattern, literal );
     path.add( segment );
     return this;
   }
@@ -313,10 +327,10 @@ public class Builder {
     return this.query;
   }
 
-  public Builder addQuery( String queryName, String paramName, String valuePattern ) {
+  public Builder addQuery( String queryName, String paramName, String valuePattern, boolean literal ) {
     if( Segment.STAR_PATTERN.equals( queryName ) || Segment.GLOB_PATTERN.equals( queryName ) ) {
       if( extra == null ) {
-        Query segment = new Query( queryName, paramName, valuePattern );
+        Query segment = new Query( queryName, paramName, valuePattern, literal );
         extra = segment;
       } else {
         // Can't have two extras: ?{*}&{**}
@@ -325,14 +339,14 @@ public class Builder {
     } else {
       Query segment = query.get( queryName );
       if( segment == null ) {
-        segment = new Query( queryName, paramName, valuePattern );
+        segment = new Query( queryName, paramName, valuePattern, literal );
         query.put( queryName, segment );
       } else {
         // Can't have two queryParam names for the same query name: ?query={param1}&query={param2} in a template.
         // Should probably throw an exception in this case.  However, you can have this in a valid URL.
         // This causes a problem with how templates are used for both URLs and Templates.
         // For a template only the first parameter name will be used.
-        segment.addValue( new Token( queryName, valuePattern ) );
+        segment.addValue( new Token( queryName, valuePattern, literal ) );
       }
     }
     return this;
@@ -377,7 +391,7 @@ public class Builder {
 
   public void setFragment( String paramName, String valuePattern ) {
     setHasFragment( true );
-    this.fragment = new Fragment( paramName, valuePattern );
+    this.fragment = new Fragment( paramName, valuePattern, literal );
   }
 
   void setFragment( Token t ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Expander.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Expander.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Expander.java
index 443df8f..7ec2e91 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Expander.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Expander.java
@@ -41,7 +41,7 @@ public class Expander {
 
   public static Template expandToTemplate( Template template, Params params, Evaluator evaluator ) throws URISyntaxException {
     //TODO: This could be much more efficient if it didn't create and then parse a string.
-    return Parser.parse( expandToString( template, params, evaluator ) );
+    return Parser.parseLiteral( expandToString( template, params, evaluator ) );
   }
 
   public static String expandToString( Template template, Params params, Evaluator evaluator ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Fragment.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Fragment.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Fragment.java
index d7d6742..96d2534 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Fragment.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Fragment.java
@@ -19,8 +19,8 @@ package org.apache.hadoop.gateway.util.urltemplate;
 
 public class Fragment extends Segment {
 
-  public Fragment( String paramName, String valuePattern ) {
-    super( new Token( paramName, valuePattern ) );
+  public Fragment( String paramName, String valuePattern, boolean literal ) {
+    super( new Token( paramName, valuePattern, literal ) );
   }
 
   public Fragment( Fragment fragment ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Host.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Host.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Host.java
index 1273ee9..f1e9a7d 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Host.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Host.java
@@ -19,8 +19,8 @@ package org.apache.hadoop.gateway.util.urltemplate;
 
 public class Host extends Segment {
 
-  public Host( String paramName, String valuePattern ) {
-    super( new Token( paramName, valuePattern ) );
+  public Host( String paramName, String valuePattern, boolean literal ) {
+    super( new Token( paramName, valuePattern, literal ) );
   }
 
   public Host( Host host ) {


[2/3] knox git commit: KNOX-394: Request and response URLs must be parsed as literals not templates

Posted by km...@apache.org.
http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Parser.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Parser.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Parser.java
index 8bf3586..e59cd32 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Parser.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Parser.java
@@ -80,16 +80,24 @@ public class Parser {
 
   private static Pattern PATTERN = Pattern.compile( "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?" );
 
-  private String template; // Kept this for debugging.
-  private Builder builder;
+  @Deprecated
+  public static final Template parse( String template ) throws URISyntaxException {
+    return Parser.parseTemplate( template );
+  }
+
+  public static final Template parseTemplate( final String template ) throws URISyntaxException {
+    Builder builder = new Builder( template );
+    return parseInternal( builder );
+  }
 
-  public static Template parse( String template ) throws URISyntaxException {
-    return new Parser().parseTemplate( template );
+  public static final Template parseLiteral( final String literal ) throws URISyntaxException {
+    Builder builder = new Builder( literal );
+    builder.setLiteral( true );
+    return parseInternal( builder );
   }
 
-  public Template parseTemplate( String template ) throws URISyntaxException {
-    this.template = template;
-    builder = new Builder( template );
+  private static final Template parseInternal( final Builder builder ) throws URISyntaxException {
+    String original = builder.getOriginal();
     builder.setHasScheme( false );
     builder.setHasAuthority( false ); // Assume no until found otherwise.  If true, will cause // in output URL.
     builder.setIsAuthorityOnly( false );
@@ -97,22 +105,22 @@ public class Parser {
     builder.setIsDirectory( false ); // Assume a file path until found otherwise.  If true, will cause trailing / in output URL.
     builder.setHasQuery( false ); // Assume no ? until found otherwise.  If true, will cause ? in output URL.
     builder.setHasFragment( false ); // Assume no # until found otherwise.  If true, will cause # in output URL.
-    Matcher match = PATTERN.matcher( template );
+    Matcher match = PATTERN.matcher( original );
     if( match.matches() ) {
-      consumeSchemeMatch( match );
-      consumeAuthorityMatch( match );
-      consumePathMatch( match );
-      consumeQueryMatch( match );
-      consumeFragmentMatch( match );
-      fixNakedAuthority();
+      consumeSchemeMatch( builder, match );
+      consumeAuthorityMatch( builder, match );
+      consumePathMatch( builder, match );
+      consumeQueryMatch( builder, match );
+      consumeFragmentMatch( builder, match );
+      fixNakedAuthority( builder );
     } else {
-      throw new URISyntaxException( template, RES.parseTemplateFailureReason( template ) );
+      throw new URISyntaxException( original, RES.parseTemplateFailureReason( original ) );
     }
     return builder.build();
   }
 
-  private final void fixNakedAuthority() {
-    if( builder.getHashScheme() &&
+  private static final void fixNakedAuthority( final Builder builder ) {
+    if( builder.getHasScheme() &&
         !builder.getHasAuthority() &&
         !builder.getIsAbsolute() &&
         !builder.getIsDirectory() &&
@@ -128,10 +136,10 @@ public class Parser {
     }
   }
 
-  private final Token makeTokenSingular( Token token ) {
+  private static final Token makeTokenSingular( Token token ) {
     final String effectivePattern = token.getEffectivePattern();
     if( Segment.GLOB_PATTERN.equals( effectivePattern ) ) {
-      token = new Token( token.getParameterName(), token.getOriginalPattern(), Segment.STAR_PATTERN );
+      token = new Token( token.getParameterName(), token.getOriginalPattern(), Segment.STAR_PATTERN, token.isLiteral() );
     }
     return token;
   }
@@ -143,28 +151,28 @@ public class Parser {
 //    return pattern;
 //  }
 
-  private void consumeSchemeMatch( Matcher match ) {
+  private static void consumeSchemeMatch( final Builder builder, final Matcher match ) {
     if( match.group( MATCH_GROUP_SCHEME ) != null ) {
       builder.setHasScheme( true );
-      consumeSchemeToken( match.group( MATCH_GROUP_SCHEME_NAKED ) );
+      consumeSchemeToken( builder, match.group( MATCH_GROUP_SCHEME_NAKED ) );
     }
   }
 
-  private void consumeSchemeToken( String token ) {
+  private static void consumeSchemeToken( final Builder builder, final String token ) {
     if( token != null ) {
-      Token t = parseTemplateToken( token, Segment.STAR_PATTERN );
+      Token t = parseTemplateToken( builder, token, Segment.STAR_PATTERN );
       builder.setScheme( t );
     }
   }
 
-  private void consumeAuthorityMatch( Matcher match ) {
+  private static void consumeAuthorityMatch( final Builder builder, final Matcher match ) {
     if( match.group( MATCH_GROUP_AUTHORITY ) != null ) {
       builder.setHasAuthority( true );
-      consumeAuthorityToken( match.group( MATCH_GROUP_AUTHORITY_NAKED ) );
+      consumeAuthorityToken( builder, match.group( MATCH_GROUP_AUTHORITY_NAKED ) );
     }
   }
 
-  private void consumeAuthorityToken( String token ) {
+  private static void consumeAuthorityToken( final Builder builder, final String token ) {
     if( token != null ) {
       Token paramPattern;
       String[] usernamePassword=null, hostPort;
@@ -177,115 +185,115 @@ public class Parser {
       }
       if( usernamePassword != null ) {
         if( usernamePassword[ 0 ].length() > 0 ) {
-          paramPattern = makeTokenSingular( parseTemplateToken( usernamePassword[ 0 ], Segment.STAR_PATTERN ) );
+          paramPattern = makeTokenSingular( parseTemplateToken( builder, usernamePassword[ 0 ], Segment.STAR_PATTERN ) );
           builder.setUsername( paramPattern );
         }
         if( usernamePassword.length > 1 && usernamePassword[ 1 ].length() > 0 ) {
-          paramPattern = makeTokenSingular( parseTemplateToken( usernamePassword[ 1 ], Segment.STAR_PATTERN ) );
+          paramPattern = makeTokenSingular( parseTemplateToken( builder, usernamePassword[ 1 ], Segment.STAR_PATTERN ) );
           builder.setPassword( paramPattern );
         }
       }
       if( hostPort[ 0 ].length() > 0 ) {
-        paramPattern = makeTokenSingular( parseTemplateToken( hostPort[ 0 ], Segment.STAR_PATTERN ) );
+        paramPattern = makeTokenSingular( parseTemplateToken( builder, hostPort[ 0 ], Segment.STAR_PATTERN ) );
         builder.setHost( paramPattern );
       }
       if( hostPort.length > 1 && hostPort[ 1 ].length() > 0 ) {
-        paramPattern = makeTokenSingular( parseTemplateToken( hostPort[ 1 ], Segment.STAR_PATTERN ) );
+        paramPattern = makeTokenSingular( parseTemplateToken( builder, hostPort[ 1 ], Segment.STAR_PATTERN ) );
         builder.setPort( paramPattern );
       }
     }
   }
 
-  private void consumePathMatch( Matcher match ) {
+  private static void consumePathMatch( final Builder builder, final Matcher match ) {
     String path = match.group( MATCH_GROUP_PATH );
     if( path != null ) {
       builder.setIsAbsolute( path.startsWith( "/" ) );
       builder.setIsDirectory( path.endsWith( "/" ) );
-      consumePathToken( path );
+      consumePathToken( builder, path );
     }
   }
 
-  private final void consumePathToken( final String token ) {
+  private static final void consumePathToken( final Builder builder, final String token ) {
     if( token != null ) {
       final StringTokenizer tokenizer = new StringTokenizer( token, "/" );
       while( tokenizer.hasMoreTokens() ) {
-        consumePathSegment( tokenizer.nextToken() );
+        consumePathSegment( builder, tokenizer.nextToken() );
       }
     }
   }
 
-  private final void consumePathSegment( final String token ) {
+  private static final void consumePathSegment( final Builder builder, final String token ) {
     if( token != null ) {
-      final Token t = parseTemplateToken( token, Segment.GLOB_PATTERN );
+      final Token t = parseTemplateToken( builder, token, Segment.GLOB_PATTERN );
       builder.addPath( t );
     }
   }
 
-  private void consumeQueryMatch( Matcher match ) {
+  private static void consumeQueryMatch( final Builder builder, Matcher match ) {
     if( match.group( MATCH_GROUP_QUERY ) != null ) {
       builder.setHasQuery( true );
-      consumeQueryToken( match.group( MATCH_GROUP_QUERY_NAKED ) );
+      consumeQueryToken( builder, match.group( MATCH_GROUP_QUERY_NAKED ) );
     }
   }
 
-  private void consumeQueryToken( String token ) {
+  private static void consumeQueryToken( final Builder builder, String token ) {
     if( token != null ) {
       StringTokenizer tokenizer = new StringTokenizer( token, "?&" );
       while( tokenizer.hasMoreTokens() ) {
-        consumeQuerySegment( tokenizer.nextToken() );
+        consumeQuerySegment( builder, tokenizer.nextToken() );
       }
     }
   }
 
-  private void consumeQuerySegment( String token ) {
+  private static void consumeQuerySegment( final Builder builder, String token ) {
     if( token != null && token.length() > 0 ) {
       // Shorthand format {queryParam} == queryParam={queryParam=*}
       if( TEMPLATE_OPEN_MARKUP == token.charAt( 0 ) ) {
-        Token paramPattern = parseTemplateToken( token, Segment.GLOB_PATTERN );
+        Token paramPattern = parseTemplateToken( builder, token, Segment.GLOB_PATTERN );
         String paramName = paramPattern.parameterName;
         if( paramPattern.originalPattern == null ) {
-          builder.addQuery( paramName, new Token( paramName, null, Segment.GLOB_PATTERN ) );
+          builder.addQuery( paramName, new Token( paramName, null, Segment.GLOB_PATTERN, builder.isLiteral() ) );
 //          if( Segment.STAR_PATTERN.equals( paramName ) || Segment.GLOB_PATTERN.equals( paramName ) ) {
 //            builder.addQuery( paramName, new Token( paramName, null, Segment.GLOB_PATTERN ) );
 //          } else {
 //            builder.addQuery( paramName, new Token( paramName, null, Segment.GLOB_PATTERN ) );
 //          }
         } else {
-          builder.addQuery( paramName, new Token( paramName, paramPattern.originalPattern ) );
+          builder.addQuery( paramName, new Token( paramName, paramPattern.originalPattern, builder.isLiteral() ) );
         }
       } else {
         String nameValue[] = split( token, '=' );
         if( nameValue.length == 1 ) {
           String queryName = nameValue[ 0 ];
-          builder.addQuery( queryName, new Token( Segment.ANONYMOUS_PARAM, null ) );
+          builder.addQuery( queryName, new Token( Segment.ANONYMOUS_PARAM, null, builder.isLiteral() ) );
         } else {
           String queryName = nameValue[ 0 ];
-          Token paramPattern = parseTemplateToken( nameValue[ 1 ], Segment.GLOB_PATTERN );
+          Token paramPattern = parseTemplateToken( builder, nameValue[ 1 ], Segment.GLOB_PATTERN );
           builder.addQuery( queryName, paramPattern );
         }
       }
     }
   }
 
-  private void consumeFragmentMatch( Matcher match ) {
+  private static void consumeFragmentMatch( final Builder builder, Matcher match ) {
     if( match.group( MATCH_GROUP_FRAGMENT ) != null ) {
       builder.setHasFragment( true );
-      consumeFragmentToken( match.group( MATCH_GROUP_FRAGMENT_NAKED ) );
+      consumeFragmentToken( builder, match.group( MATCH_GROUP_FRAGMENT_NAKED ) );
     }
   }
 
-  private void consumeFragmentToken( String token ) {
+  private static void consumeFragmentToken( final Builder builder, String token ) {
     if( token != null && token.length() > 0 ) {
-      Token t = parseTemplateToken( token, Segment.STAR_PATTERN );
+      Token t = parseTemplateToken( builder, token, Segment.STAR_PATTERN );
       builder.setFragment( t );
     }
   }
 
-  static final Token parseTemplateToken( final String s, final String defaultEffectivePattern ) {
+  static final Token parseTemplateToken( final Builder builder, final String s, final String defaultEffectivePattern ) {
     String paramName, actualPattern, effectivePattern;
     final int l = s.length();
     // If the token isn't the empty string, then
-    if( l > 0 ) {
+    if( l > 0 && !builder.isLiteral() ) {
       final int b = ( s.charAt( 0 ) == TEMPLATE_OPEN_MARKUP ? 1 : -1 );
       final int e = ( s.charAt( l-1 ) == TEMPLATE_CLOSE_MARKUP ? l-1 : -1 );
       // If this is a parameter template, ie {...}
@@ -318,7 +326,7 @@ public class Parser {
       actualPattern = s;
       effectivePattern = actualPattern;
     }
-    final Token token = new Token( paramName, actualPattern, effectivePattern );
+    final Token token = new Token( paramName, actualPattern, effectivePattern, builder.isLiteral() );
     return token;
   }
 

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Password.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Password.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Password.java
index c0e3f75..d1a5fac 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Password.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Password.java
@@ -19,8 +19,8 @@ package org.apache.hadoop.gateway.util.urltemplate;
 
 public class Password extends Segment {
 
-  public Password( String paramName, String valuePattern ) {
-    super( new Token( paramName, valuePattern ) );
+  public Password( String paramName, String valuePattern, boolean literal ) {
+    super( new Token( paramName, valuePattern, literal ) );
   }
 
   public Password( Password password ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Path.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Path.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Path.java
index 6bf55b0..6860e9b 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Path.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Path.java
@@ -19,8 +19,8 @@ package org.apache.hadoop.gateway.util.urltemplate;
 
 public class Path extends Segment {
 
-  public Path( String paramName, String pathPattern ) {
-    super( new Token( paramName, pathPattern ) );
+  public Path( String paramName, String pathPattern, boolean literal ) {
+    super( new Token( paramName, pathPattern, literal ) );
   }
 
   public Path( Path that ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Port.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Port.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Port.java
index 04d0aea..e4ac83d 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Port.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Port.java
@@ -19,8 +19,8 @@ package org.apache.hadoop.gateway.util.urltemplate;
 
 public class Port extends Segment {
 
-  public Port( String paramName, String valuePattern ) {
-    super( new Token( paramName, valuePattern ) );
+  public Port( String paramName, String valuePattern, boolean literal ) {
+    super( new Token( paramName, valuePattern, literal ) );
   }
 
   public Port( Port port ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Query.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Query.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Query.java
index f77f231..d5043da 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Query.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Query.java
@@ -21,8 +21,8 @@ public class Query extends Segment {
 
   private String queryName;
 
-  public Query( String queryName, String paramName, String valuePattern ) {
-    super( new Token( paramName, valuePattern ) );
+  public Query( String queryName, String paramName, String valuePattern, boolean literal ) {
+    super( new Token( paramName, valuePattern, literal ) );
     this.queryName = queryName;
   }
 

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Rewriter.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Rewriter.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Rewriter.java
index ebe7e15..bb140fe 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Rewriter.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Rewriter.java
@@ -41,7 +41,7 @@ public class Rewriter {
       throws URISyntaxException {
     Rewriter rewriter = new Rewriter();
     rewriter.addRule( inputTemplate, outputTemplate );
-    Template inputUriTemplate = Parser.parse( inputUri.toString() );
+    Template inputUriTemplate = Parser.parseLiteral( inputUri.toString() );
     return rewriter.rewrite( inputUriTemplate, resolver, evaluator );
   }
 

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Scheme.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Scheme.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Scheme.java
index 1a99cc5..a3cf96e 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Scheme.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Scheme.java
@@ -19,8 +19,8 @@ package org.apache.hadoop.gateway.util.urltemplate;
 
 public class Scheme extends Segment {
 
-  public Scheme( String paramName, String valuePattern ) {
-    super( new Token( paramName, valuePattern, valuePattern ) );
+  public Scheme( String paramName, String valuePattern, boolean literal ) {
+    super( new Token( paramName, valuePattern, valuePattern, literal ) );
   }
 
   public Scheme( Scheme scheme ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Segment.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Segment.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Segment.java
index 14e366d..8f9c819 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Segment.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Segment.java
@@ -164,7 +164,9 @@ abstract class Segment {
       this.token = token;
       this.regex = null;
       String effectivePattern = token.effectivePattern;
-      if( DEFAULT_PATTERN.equals( effectivePattern ) ) {
+      if( token.isLiteral() ) {
+        this.type = STATIC;
+      } else if( DEFAULT_PATTERN.equals( effectivePattern ) ) {
         this.type = DEFAULT;
       } else if( STAR_PATTERN.equals( effectivePattern ) ) {
         this.type = STAR;

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Token.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Token.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Token.java
index 5602df2..771a4b9 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Token.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Token.java
@@ -22,15 +22,17 @@ final class Token {
   String parameterName = null;
   String originalPattern = null;
   String effectivePattern = null;
+  boolean literal = false;
 
-  Token( String parameterName, String originalPattern, String effectivePattern ) {
+  Token( String parameterName, String originalPattern, String effectivePattern, boolean literal ) {
     this.parameterName = parameterName;
     this.originalPattern = originalPattern;
     this.effectivePattern = effectivePattern;
+    this.literal = literal;
   }
 
-  Token( String parameterName, String originalPattern ) {
-    this( parameterName, originalPattern, originalPattern );
+  Token( String parameterName, String originalPattern, boolean literal ) {
+    this( parameterName, originalPattern, originalPattern, literal );
   }
 
   public String getParameterName() {
@@ -45,5 +47,9 @@ final class Token {
     return effectivePattern;
   }
 
+  public boolean isLiteral() {
+    return literal;
+  }
+
 }
 

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Username.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Username.java b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Username.java
index 98c1072..8a1a7fe 100644
--- a/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Username.java
+++ b/gateway-util-urltemplate/src/main/java/org/apache/hadoop/gateway/util/urltemplate/Username.java
@@ -19,8 +19,8 @@ package org.apache.hadoop.gateway.util.urltemplate;
 
 public class Username extends Segment {
 
-  public Username( String paramName, String valuePattern ) {
-    super( new Token( paramName, valuePattern, valuePattern ) );
+  public Username( String paramName, String valuePattern, boolean literal ) {
+    super( new Token( paramName, valuePattern, valuePattern, literal ) );
   }
 
   public Username( Username username ) {

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ExpanderTest.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ExpanderTest.java b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ExpanderTest.java
index 816144c..7c91e6e 100644
--- a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ExpanderTest.java
+++ b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/ExpanderTest.java
@@ -31,6 +31,7 @@ import java.util.List;
 import static junit.framework.TestCase.assertNotNull;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.equalToIgnoringCase;
 import static org.junit.Assert.assertThat;
@@ -42,7 +43,7 @@ public class ExpanderTest {
   @Test
   public void testHostAndPortOnlyExpansionBugKnox381() throws Exception {
     String text = "{host}:{port}";
-    Template template = Parser.parse( text );
+    Template template = Parser.parseTemplate( text );
     MockParams params = new MockParams();
     params.addValue( "host", "test-host" );
     params.addValue( "port", "777" );
@@ -58,13 +59,13 @@ public class ExpanderTest {
     URI expanded;
 
     text = "foo://username:password@example.com:8042/over/there/index.dtb?type=animal&name=narwhal#nose";
-    template = Parser.parse( text );
+    template = Parser.parseLiteral( text );
     params = new MockParams();
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( text ) ) ;
 
     text = "{scheme}://{username}:{password}@{host}:{port}/{path=**}?query={queryParam}#{fragment}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     params = new MockParams();
     params.addValue( "scheme", "http" );
     params.addValue( "username", "horton" );
@@ -87,89 +88,89 @@ public class ExpanderTest {
     MockParams params;
     URI expanded;
 
-    template = Parser.parse( "" );
+    template = Parser.parseTemplate( "" );
     params = new MockParams();
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "" ) ) ;
 
-    template = Parser.parse( "/" );
+    template = Parser.parseTemplate( "/" );
     params = new MockParams();
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "/" ) ) ;
 
-    template = Parser.parse( "{path-name}" );
+    template = Parser.parseTemplate( "{path-name}" );
     params = new MockParams();
     params.addValue( "path-name", "path-value" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "path-value" ) ) ;
 
-    template = Parser.parse( "/{path-name}" );
+    template = Parser.parseTemplate( "/{path-name}" );
     params = new MockParams();
     params.addValue( "path-name", "path-value" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "/path-value" ) ) ;
 
-    template = Parser.parse( "{path-name}/" );
+    template = Parser.parseTemplate( "{path-name}/" );
     params = new MockParams();
     params.addValue( "path-name", "path-value" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "path-value/" ) ) ;
 
-    template = Parser.parse( "/{path-name}/" );
+    template = Parser.parseTemplate( "/{path-name}/" );
     params = new MockParams();
     params.addValue( "path-name", "path-value" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "/path-value/" ) ) ;
 
-    template = Parser.parse( "path-name" );
+    template = Parser.parseTemplate( "path-name" );
     params = new MockParams();
     params.addValue( "path-name", "other-path-value" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "path-name" ) ) ;
 
-    template = Parser.parse( "/path-name" );
+    template = Parser.parseTemplate( "/path-name" );
     params = new MockParams();
     params.addValue( "path-name", "other-path-value" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "/path-name" ) ) ;
 
-    template = Parser.parse( "path-name/" );
+    template = Parser.parseTemplate( "path-name/" );
     params = new MockParams();
     params.addValue( "path-name", "other-path-value" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "path-name/" ) ) ;
 
-    template = Parser.parse( "/path-name/" );
+    template = Parser.parseTemplate( "/path-name/" );
     params = new MockParams();
     params.addValue( "path-name", "other-path-value" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "/path-name/" ) ) ;
 
-    template = Parser.parse( "?" );
+    template = Parser.parseTemplate( "?" );
     params = new MockParams();
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "" ) ) ;
 
-    template = Parser.parse( "?query-name={queryParam-name}" );
+    template = Parser.parseTemplate( "?query-name={queryParam-name}" );
     params = new MockParams();
     params.addValue( "queryParam-name", "queryParam-value" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "?query-name=queryParam-value" ) ) ;
 
-    template = Parser.parse( "?query-name-1={queryParam-name-1}&query-name-2={queryParam-name-2}" );
+    template = Parser.parseTemplate( "?query-name-1={queryParam-name-1}&query-name-2={queryParam-name-2}" );
     params = new MockParams();
     params.addValue( "queryParam-name-1", "queryParam-value-1" );
     params.addValue( "queryParam-name-2", "queryParam-value-2" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "?query-name-1=queryParam-value-1&query-name-2=queryParam-value-2" ) ) ;
 
-    template = Parser.parse( "?query-name=queryParam-value" );
+    template = Parser.parseTemplate( "?query-name=queryParam-value" );
     params = new MockParams();
     params.addValue( "queryParam-name", "other-queryParam-value" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "?query-name=queryParam-value" ) ) ;
 
-    template = Parser.parse( "?query-name-1=queryParam-value-1&query-name-2=queryParam-value-2" );
+    template = Parser.parseTemplate( "?query-name-1=queryParam-value-1&query-name-2=queryParam-value-2" );
     params = new MockParams();
     params.addValue( "queryParam-name-1", "other-queryParam-value-1" );
     params.addValue( "queryParam-name-2", "other-queryParam-value-2" );
@@ -196,22 +197,22 @@ public class ExpanderTest {
     MockParams params;
     URI expanded;
 
-    template = Parser.parse( "//host" );
+    template = Parser.parseTemplate( "//host" );
     params = new MockParams();
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "//host" ) ) ;
 
-    template = Parser.parse( "//:port" );
+    template = Parser.parseTemplate( "//:port" );
     params = new MockParams();
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "//:port" ) ) ;
 
-    template = Parser.parse( "//username@" );
+    template = Parser.parseTemplate( "//username@" );
     params = new MockParams();
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "//username@" ) ) ;
 
-    template = Parser.parse( "//:password@" );
+    template = Parser.parseTemplate( "//:password@" );
     params = new MockParams();
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "//:password@" ) ) ;
@@ -223,26 +224,26 @@ public class ExpanderTest {
     MockParams params;
     URI expanded;
 
-    template = Parser.parse( "/a/b/c" );
+    template = Parser.parseTemplate( "/a/b/c" );
     params = new MockParams();
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "/a/b/c" ) ) ;
 
-    template = Parser.parse( "/top/{middle}/bottom" );
+    template = Parser.parseTemplate( "/top/{middle}/bottom" );
     params = new MockParams();
     params.addValue( "middle", "A" );
     params.addValue( "middle", "B" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "/top/A/B/bottom" ) ) ;
 
-    template = Parser.parse( "/top/{middle=*}/bottom" );
+    template = Parser.parseTemplate( "/top/{middle=*}/bottom" );
     params = new MockParams();
     params.addValue( "middle", "A" );
     params.addValue( "middle", "B" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "/top/A/bottom" ) ) ;
 
-    template = Parser.parse( "/top/{middle=**}/bottom" );
+    template = Parser.parseTemplate( "/top/{middle=**}/bottom" );
     params = new MockParams();
     params.addValue( "middle", "A" );
     params.addValue( "middle", "B" );
@@ -256,26 +257,26 @@ public class ExpanderTest {
     MockParams params;
     URI expanded;
 
-    template = Parser.parse( "?query" );
+    template = Parser.parseTemplate( "?query" );
     params = new MockParams();
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "?query" ) ) ;
 
-    template = Parser.parse( "?query={queryParam}" );
+    template = Parser.parseTemplate( "?query={queryParam}" );
     params = new MockParams();
     params.addValue( "queryParam", "A" );
     params.addValue( "queryParam", "B" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "?query=A&query=B" ) ) ;
 
-    template = Parser.parse( "?query={queryParam=*}" );
+    template = Parser.parseTemplate( "?query={queryParam=*}" );
     params = new MockParams();
     params.addValue( "queryParam", "A" );
     params.addValue( "queryParam", "B" );
     expanded = Expander.expand( template, params, null );
     assertThat( expanded.toString(), equalTo( "?query=A" ) ) ;
 
-    template = Parser.parse( "?query={queryParam=**}" );
+    template = Parser.parseTemplate( "?query={queryParam=**}" );
     params = new MockParams();
     params.addValue( "queryParam", "A" );
     params.addValue( "queryParam", "B" );
@@ -303,7 +304,7 @@ public class ExpanderTest {
     params.addValue( "extra", "extraA" );
 
     text = "{scheme}://host/{path=*]?{query=*}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     expandedTemplate = Expander.expandToTemplate( template, params, null );
     assertThat( expandedTemplate.toString(), equalTo( "schemeA://host/{path=*]?query=queryA" ) );
     expandedString = Expander.expandToString( template, params, null );
@@ -315,17 +316,17 @@ public class ExpanderTest {
       // Expected.
     }
 
-    template = Parser.parse( "{scheme}://host/{path=**}?{query=**}" );
+    template = Parser.parseTemplate( "{scheme}://host/{path=**}?{query=**}" );
     expandedUri = Expander.expand( template, params, null );
     assertThat( expandedUri.toString(), equalTo( "schemeA://host/pathA/pathB?query=queryA&query=queryB" ) );
 
-    template = Parser.parse( "{scheme}://host/{path=**}?{host}&{query=**}&{**}" );
+    template = Parser.parseTemplate( "{scheme}://host/{path=**}?{host}&{query=**}&{**}" );
     expandedUri = Expander.expand( template, params, null );
     assertThat(
         expandedUri.toString(),
         equalTo( "schemeA://host/pathA/pathB?host=hostA&query=queryA&query=queryB&extra=extraA" ) );
 
-    template = Parser.parse( "{scheme}://host/{path=**}?server={host}&{query=**}&{**}" );
+    template = Parser.parseTemplate( "{scheme}://host/{path=**}?server={host}&{query=**}&{**}" );
     expandedUri = Expander.expand( template, params, null );
     assertThat(
         expandedUri.toString(),
@@ -334,7 +335,7 @@ public class ExpanderTest {
     // In this case "server-host" is treated as a param name and not found in the params so it
     // is copied.  I'm not really sure what the correct behavior should be.  My initial thinking
     // is that if something within {} isn't resolve to a param it should be dropped from the output.
-    template = Parser.parse( "{scheme}://host/{path=**}?{server=host}&{query=**}&{**}" );
+    template = Parser.parseTemplate( "{scheme}://host/{path=**}?{server=host}&{query=**}&{**}" );
     expandedUri = Expander.expand( template, params, null );
     expandedString = expandedUri.toString();
     assertThat( expandedString, containsString( "schemeA://host/pathA/pathB?" ) );
@@ -355,7 +356,7 @@ public class ExpanderTest {
     URI expanded;
 
     text = "{scheme}://{host}:{port}/{path=**}?{**}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     params = new MockParams();
     params.addValue( "scheme", "http" );
     params.addValue( "host", "hortonworks.com" );
@@ -370,7 +371,7 @@ public class ExpanderTest {
     assertThat( expanded.toString(), equalTo( "http://hortonworks.com:8888/top/mid/bot/file?flag=&name=value" ) ) ;
 
     text = "{scheme}://{host}:{port}/{path=**}?{**}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     params = new MockParams();
     params.addValue( "scheme", "http" );
     params.addValue( "host", "hortonworks.com" );
@@ -385,7 +386,7 @@ public class ExpanderTest {
     assertThat( expanded.toString(), equalTo( "http://hortonworks.com:8888/top/mid/bot/file?flag&name=value" ) ) ;
 
     text = "{scheme}://{host}:{port}/{path=**}?{name=*}&{**}";
-    template = Parser.parse( text );
+    template = Parser.parseTemplate( text );
     params = new MockParams();
     params.addValue( "scheme", "http" );
     params.addValue( "host", "hortonworks.com" );
@@ -410,9 +411,9 @@ public class ExpanderTest {
 
     inputUri = new URI( "https://knoxHost:8443/gateway/knoxTopo/templeton/v1/?version/hive" );
 
-    input = Parser.parse( inputUri.toString() );
-    pattern = Parser.parse( "*://*:*/**/templeton/v1/?{**}" );
-    template = Parser.parse( "{$serviceUrl[WEBHCAT]}/v1/?{**}" );
+    input = Parser.parseLiteral( inputUri.toString() );
+    pattern = Parser.parseTemplate( "*://*:*/**/templeton/v1/?{**}" );
+    template = Parser.parseTemplate( "{$serviceUrl[WEBHCAT]}/v1/?{**}" );
 
     matcher = new Matcher<Void>();
     matcher.add( pattern, null );
@@ -442,9 +443,9 @@ public class ExpanderTest {
 
     inputUri = new URI("https://internal-host:9443/context/?user.name=admin#/login");
 
-    input = Parser.parse( inputUri.toString() );
-    pattern = Parser.parse( "*://*:*/{contextRoot}/?{**}#{fragment}" );
-    template = Parser.parse( "{$gateway.url}/foo/{contextRoot}/?{**}#{fragment}" );
+    input = Parser.parseLiteral( inputUri.toString() );
+    pattern = Parser.parseTemplate( "*://*:*/{contextRoot}/?{**}#{fragment}" );
+    template = Parser.parseTemplate( "{$gateway.url}/foo/{contextRoot}/?{**}#{fragment}" );
 
     matcher = new Matcher<Void>();
     matcher.add( pattern, null );
@@ -464,4 +465,77 @@ public class ExpanderTest {
         is( "https://gateway-host:9443/gateway/default/foo/context/?user.name=admin#/login" ) );
   }
 
+  @Test
+  public void testLiteralsAndRegexInTemplates() throws Exception {
+    String output;
+    Matcher<Void> matcher;
+    Matcher<Void>.Match match;
+    Template input, template, rewrite;
+    Evaluator evaluator;
+
+    evaluator = new Evaluator() {
+      @Override
+      public List<String> evaluate( String function, List<String> parameters ) {
+        return Arrays.asList( "https://gateway-host:9443/gateway/default" );
+      }
+    };
+
+    // Check to make sure that you can use constants within the {}
+    template = Parser.parseTemplate( "{root=ROOT}/{path=**}" );
+    rewrite = Parser.parseTemplate( "{root}/{path}" );
+    matcher = new Matcher<Void>();
+    matcher.add( template, null );
+    input = Parser.parseLiteral( "ROOT/child/path" );
+    match = matcher.match( input );
+    assertThat( match, notNullValue() );
+    output = Expander.expandToString( rewrite, match.getParams(), evaluator );
+    assertThat( output, is( "ROOT/child/path" ) );
+
+    // Check to see what happens when you use the special { character within the {}.
+    template = Parser.parseTemplate( "{root={}/{path=**}" );
+    rewrite = Parser.parseTemplate( "{root}/{path}" );
+    matcher = new Matcher<Void>();
+    matcher.add( template, null );
+    input = Parser.parseLiteral( "{/child/path" );
+    match = matcher.match( input );
+    assertThat( match, notNullValue() );
+    output = Expander.expandToString( rewrite, match.getParams(), evaluator );
+    assertThat( output, is( "{/child/path" ) );
+
+    // Check to see what happens when you use the special } character within the {}.
+    template = Parser.parseTemplate( "{root=}}/{path=**}" );
+    rewrite = Parser.parseTemplate( "{root}/{path}" );
+    matcher = new Matcher<Void>();
+    matcher.add( template, null );
+    input = Parser.parseLiteral( "}/child/path" );
+    match = matcher.match( input );
+    assertThat( match, notNullValue() );
+    output = Expander.expandToString( rewrite, match.getParams(), evaluator );
+    assertThat( output, is( "}/child/path" ) );
+
+    // Check to see what happens when you use the special } character within the {}.
+    template = Parser.parseTemplate( "{root={}}/{path=**}" );
+    rewrite = Parser.parseTemplate( "{root}/{path}" );
+    matcher = new Matcher<Void>();
+    matcher.add( template, null );
+    input = Parser.parseLiteral( "{}/child/path" );
+    match = matcher.match( input );
+    assertThat( match, notNullValue() );
+    output = Expander.expandToString( rewrite, match.getParams(), evaluator );
+    assertThat( output, is( "{}/child/path" ) );
+
+    template = Parser.parseTemplate( "{var=${*}}/{path=**}" );
+    rewrite = Parser.parseTemplate( "{var}/{path}" );
+
+    matcher = new Matcher<Void>();
+    matcher.add( template, null );
+
+    input = Parser.parseLiteral( "${app.dir}/child/path" );
+    match = matcher.match( input );
+    assertThat( match, notNullValue() );
+
+    output = Expander.expandToString( rewrite, match.getParams(), evaluator );
+    assertThat( output, is( "${app.dir}/child/path" ) );
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/knox/blob/33bb1ce5/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/MatcherTest.java
----------------------------------------------------------------------
diff --git a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/MatcherTest.java b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/MatcherTest.java
index 4d09a47..362f26f 100644
--- a/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/MatcherTest.java
+++ b/gateway-util-urltemplate/src/test/java/org/apache/hadoop/gateway/util/urltemplate/MatcherTest.java
@@ -41,14 +41,14 @@ import static org.junit.Assert.assertThat;
 public class MatcherTest {
 
   private void addTemplate( Matcher<String> matcher, String template ) throws URISyntaxException {
-    matcher.add( Parser.parse( template ), template );
+    matcher.add( Parser.parseTemplate( template ), template );
   }
 
   private void assertValidMatch( Matcher<String> matcher, String uri, String template ) throws URISyntaxException {
     if( template == null ) {
-      assertThat( matcher.match( Parser.parse( uri ) ), nullValue() );
+      assertThat( matcher.match( Parser.parseTemplate( uri ) ), nullValue() );
     } else {
-      Template uriTemplate = Parser.parse( uri );
+      Template uriTemplate = Parser.parseTemplate( uri );
       Matcher<String>.Match match = matcher.match( uriTemplate );
       assertThat( "Expected to find a match.", match, notNullValue() );
       assertThat( match.getValue(), equalTo( template ) );
@@ -62,17 +62,17 @@ public class MatcherTest {
     Matcher<String>.Match match;
 
     matcher = new Matcher<String>();
-    patternTemplate = Parser.parse( "*://*:*/a/{pathB=**}/c" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/a/{pathB=**}/c" );
     matcher.add( patternTemplate, "webhdfs" );
-    inputTemplate = Parser.parse( "s://h:5/a/b1/b2/c" );
+    inputTemplate = Parser.parseLiteral( "s://h:5/a/b1/b2/c" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
     assertThat( match.getValue(), is( "webhdfs" ) );
     assertThat( match.getParams().resolve( "pathB" ), hasItems( "b1", "b2" ) );
 
     matcher = new Matcher<String>();
-    inputTemplate = Parser.parse( "s://h:5/a/b/c" );
-    patternTemplate = Parser.parse( "{scheme=*}://{host=*}:{port=*}/a/{pathB=**}/c" );
+    inputTemplate = Parser.parseLiteral( "s://h:5/a/b/c" );
+    patternTemplate = Parser.parseTemplate( "{scheme=*}://{host=*}:{port=*}/a/{pathB=**}/c" );
     matcher.add( patternTemplate, "webhdfs" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
@@ -89,8 +89,8 @@ public class MatcherTest {
 //    assertThat( match.getValue(), is( "webhdfs" ) );
 
     matcher = new Matcher<String>();
-    inputTemplate = Parser.parse( "s://h:5/a/b" );
-    patternTemplate = Parser.parse( "{scheme=*}://{host=*}:{port=*}/{pathA=**}/b" );
+    inputTemplate = Parser.parseLiteral( "s://h:5/a/b" );
+    patternTemplate = Parser.parseTemplate( "{scheme=*}://{host=*}:{port=*}/{pathA=**}/b" );
     matcher.add( patternTemplate, "webhdfs" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
@@ -113,32 +113,32 @@ public class MatcherTest {
     Matcher<String>.Match match;
 
     matcher = new Matcher<String>();
-    inputTemplate = Parser.parse( "https://127.0.0.1:8443/webhdfs/v1/tmp?op=LISTSTATUS" );
-    patternTemplate = Parser.parse( "*://*:*/webhdfs/{version}/{path=**}?{**}" );
+    inputTemplate = Parser.parseLiteral( "https://127.0.0.1:8443/webhdfs/v1/tmp?op=LISTSTATUS" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/webhdfs/{version}/{path=**}?{**}" );
     matcher.add( patternTemplate, "webhdfs" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
     assertThat( match.getValue(), is( "webhdfs" ) );
 
     matcher = new Matcher<String>();
-    inputTemplate = Parser.parse( "https://127.0.0.1:8443/top/webhdfs/v1/tmp?op=LISTSTATUS" );
-    patternTemplate = Parser.parse( "*://*:*/**/webhdfs/{version}/{path=**}?{**}" );
+    inputTemplate = Parser.parseLiteral( "https://127.0.0.1:8443/top/webhdfs/v1/tmp?op=LISTSTATUS" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/**/webhdfs/{version}/{path=**}?{**}" );
     matcher.add( patternTemplate, "webhdfs" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
     assertThat( match.getValue(), is( "webhdfs" ) );
 
     matcher = new Matcher<String>();
-    inputTemplate = Parser.parse( "https://127.0.0.1:8443/a/b/c" );
-    patternTemplate = Parser.parse( "*://*:*/**/c" );
+    inputTemplate = Parser.parseLiteral( "https://127.0.0.1:8443/a/b/c" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/**/c" );
     matcher.add( patternTemplate, "webhdfs" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
     assertThat( match.getValue(), is( "webhdfs" ) );
 
     matcher = new Matcher<String>();
-    inputTemplate = Parser.parse( "https://127.0.0.1:8443/a/b/c/d" );
-    patternTemplate = Parser.parse( "*://*:*/{pathA=**}/b/{pathC=**}/d" );
+    inputTemplate = Parser.parseLiteral( "https://127.0.0.1:8443/a/b/c/d" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/{pathA=**}/b/{pathC=**}/d" );
     matcher.add( patternTemplate, "webhdfs" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
@@ -147,8 +147,8 @@ public class MatcherTest {
     assertThat( match.getParams().resolve( "pathC" ), hasItems( "c" ) );
 
     matcher = new Matcher<String>();
-    inputTemplate = Parser.parse( "https://127.0.0.1:8443/a1/a2/b/c1/c2/d" );
-    patternTemplate = Parser.parse( "*://*:*/{pathA=**}/b/{pathC=**}/d" );
+    inputTemplate = Parser.parseLiteral( "https://127.0.0.1:8443/a1/a2/b/c1/c2/d" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/{pathA=**}/b/{pathC=**}/d" );
     matcher.add( patternTemplate, "webhdfs" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
@@ -183,26 +183,26 @@ public class MatcherTest {
 
     // First verify that if .../test_table/test_row/family1... works.
     matcher = new Matcher<String>();
-    inputTemplate = Parser.parse( "https://localhost:8443/gateway/sandbox/hbase/test_table/test_row/family1:row2_col1,family2/0,9223372036854775807?v=1" );
-    patternTemplate = Parser.parse( "*://*:*/**/webhdfs/{version}/{path=**}?{**}" );
+    inputTemplate = Parser.parseLiteral( "https://localhost:8443/gateway/sandbox/hbase/test_table/test_row/family1:row2_col1,family2/0,9223372036854775807?v=1" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/**/webhdfs/{version}/{path=**}?{**}" );
     matcher.add( patternTemplate, "webhdfs" );
     match = matcher.match( inputTemplate );
     assertThat( match, nullValue() );
 
     // Then reproduce the issue with .../test_table/*/family1..
     matcher = new Matcher<String>();
-    inputTemplate = Parser.parse( "https://localhost:8443/gateway/sandbox/hbase/test_table/*/family1:row2_col1,family2/0,9223372036854775807?v=1" );
-    patternTemplate = Parser.parse( "*://*:*/**/webhdfs/{version}/{path=**}?{**}" );
+    inputTemplate = Parser.parseLiteral( "https://localhost:8443/gateway/sandbox/hbase/test_table/*/family1:row2_col1,family2/0,9223372036854775807?v=1" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/**/webhdfs/{version}/{path=**}?{**}" );
     matcher.add( patternTemplate, "webhdfs" );
     match = matcher.match( inputTemplate );
     assertThat( match, nullValue() );
 
     // Reproduce the issue where the wrong match was picked when there was a "*" in the input URL template.
     matcher = new Matcher<String>();
-    inputTemplate = Parser.parse( "https://localhost:8443/gateway/sandbox/hbase/test_table/*/family1:row2_col1,family2/0,9223372036854775807?v=1" );
-    patternTemplate = Parser.parse( "*://*:*/**/webhdfs/{version}/{path=**}?{**}" );
+    inputTemplate = Parser.parseLiteral( "https://localhost:8443/gateway/sandbox/hbase/test_table/*/family1:row2_col1,family2/0,9223372036854775807?v=1" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/**/webhdfs/{version}/{path=**}?{**}" );
     matcher.add( patternTemplate, "webhdfs" );
-    patternTemplate = Parser.parse( "*://*:*/**/hbase/{path=**}?{**}" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/**/hbase/{path=**}?{**}" );
     matcher.add( patternTemplate, "hbase" );
     match = matcher.match( inputTemplate );
     assertThat( match.getValue(), is( "hbase" ) );
@@ -215,52 +215,52 @@ public class MatcherTest {
     Matcher<String>.Match match;
 
     ///////
-    patternTemplate = Parser.parse( "*://*:*" );
+    patternTemplate = Parser.parseTemplate( "*://*:*" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "test-match" );
 
-    inputTemplate = Parser.parse( "test-scheme://test-host:42" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
-    inputTemplate = Parser.parse( "test-scheme://test-host:42/" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42/" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
-    inputTemplate = Parser.parse( "test-scheme://test-host:42/test-path" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42/test-path" );
     match = matcher.match( inputTemplate );
     assertThat( match, nullValue() );
 
     ///////
-    patternTemplate = Parser.parse( "*://*:*/" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "test-match" );
 
-    inputTemplate = Parser.parse( "test-scheme://test-host:42" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
-    inputTemplate = Parser.parse( "test-scheme://test-host:42/" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42/" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
-    inputTemplate = Parser.parse( "test-scheme://test-host:42/test-path" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42/test-path" );
     match = matcher.match( inputTemplate );
     assertThat( match, nullValue() );
 
     ///////
-    patternTemplate = Parser.parse( "*://*:*/*" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/*" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "test-match" );
 
-    inputTemplate = Parser.parse( "test-scheme://test-host:42" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42" );
     match = matcher.match( inputTemplate );
     assertThat( match, nullValue() );
-    inputTemplate = Parser.parse( "test-scheme://test-host:42/" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42/" );
     match = matcher.match( inputTemplate );
     assertThat( match, nullValue() );
-    inputTemplate = Parser.parse( "test-scheme://test-host:42/test-path" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42/test-path" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
 
     ///////
-    patternTemplate = Parser.parse( "*://*:*/**" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/**" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "test-match" );
 
@@ -271,27 +271,27 @@ public class MatcherTest {
 //    inputTemplate = Parser.parse( "test-scheme://test-host:42/" );
 //    match = matcher.match( inputTemplate );
 //    assertThat( match, ? );
-    inputTemplate = Parser.parse( "test-scheme://test-host:42/test-path" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42/test-path" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
 
     ///////
-    patternTemplate = Parser.parse( "*://*:*/{path=*}" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/{path=*}" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "test-match" );
 
-    inputTemplate = Parser.parse( "test-scheme://test-host:42" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42" );
     match = matcher.match( inputTemplate );
     assertThat( match, nullValue() );
-    inputTemplate = Parser.parse( "test-scheme://test-host:42/" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42/" );
     match = matcher.match( inputTemplate );
     assertThat( match, nullValue() );
-    inputTemplate = Parser.parse( "test-scheme://test-host:42/test-path" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42/test-path" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
 
     ///////
-    patternTemplate = Parser.parse( "*://*:*/{path=**}" );
+    patternTemplate = Parser.parseTemplate( "*://*:*/{path=**}" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "test-match" );
 
@@ -302,7 +302,7 @@ public class MatcherTest {
 //    inputTemplate = Parser.parse( "test-scheme://test-host:42/" );
 //    match = matcher.match( inputTemplate );
 //    assertThat( match, ? );
-    inputTemplate = Parser.parse( "test-scheme://test-host:42/test-path" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-host:42/test-path" );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
   }
@@ -313,15 +313,15 @@ public class MatcherTest {
     Template patternTemplate, inputTemplate;
     Matcher<String>.Match match;
 
-    patternTemplate = Parser.parse( "{*}://{host}:{*}/{**=**}?{**}" );
-    inputTemplate = Parser.parse( "test-scheme://test-input-host:42/test-path/test-file?test-name=test-value" );
+    patternTemplate = Parser.parseTemplate( "{*}://{host}:{*}/{**=**}?{**}" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-input-host:42/test-path/test-file?test-name=test-value" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "test-math" );
     match = matcher.match( inputTemplate );
     assertThat( "Should match because the path ** should include both test-path and test-file", match, notNullValue() );
 
-    patternTemplate = Parser.parse( "{*}://{host}:{*}/{**}?{**}" );
-    inputTemplate = Parser.parse( "test-scheme://test-input-host:42/test-path/test-file?test-name=test-value" );
+    patternTemplate = Parser.parseTemplate( "{*}://{host}:{*}/{**}?{**}" );
+    inputTemplate = Parser.parseLiteral( "test-scheme://test-input-host:42/test-path/test-file?test-name=test-value" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "test-math" );
     match = matcher.match( inputTemplate );
@@ -334,23 +334,23 @@ public class MatcherTest {
     Template patternTemplate, inputTemplate;
     Matcher<String>.Match match;
 
-    patternTemplate = Parser.parse( "/path?{query}" );
-    inputTemplate = Parser.parse( "/path" );
+    patternTemplate = Parser.parseTemplate( "/path?{query}" );
+    inputTemplate = Parser.parseLiteral( "/path" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
     assertThat( "Should not match because input does not contain the required query.", match, nullValue() );
 
     matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "/path?{query}" ), "T1" );
-    matcher.add( Parser.parse( "/path" ), "T2" );
-    inputTemplate = Parser.parse( "/path" );
+    matcher.add( Parser.parseTemplate( "/path?{query}" ), "T1" );
+    matcher.add( Parser.parseTemplate( "/path" ), "T2" );
+    inputTemplate = Parser.parseLiteral( "/path" );
     match = matcher.match( inputTemplate );
     assertThat( "Should match because there is an entry in the matcher without a query.", match, notNullValue() );
     assertThat( match.getValue(), equalTo( "T2") );
 
-    patternTemplate = Parser.parse( "/path?{query}" );
-    inputTemplate = Parser.parse( "/path?query=value" );
+    patternTemplate = Parser.parseTemplate( "/path?{query}" );
+    inputTemplate = Parser.parseLiteral( "/path?query=value" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
@@ -358,22 +358,22 @@ public class MatcherTest {
     assertThat( match.getParams().resolve( "query" ), hasItem( "value" ) );
     assertThat( match.getParams().resolve( "query" ).size(), equalTo( 1 ) );
 
-    patternTemplate = Parser.parse( "/path?{*}" );
-    inputTemplate = Parser.parse( "/path" );
+    patternTemplate = Parser.parseTemplate( "/path?{*}" );
+    inputTemplate = Parser.parseLiteral( "/path" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
     assertThat( "Should not match because input does not contain the required query.", match, nullValue() );
 
-    patternTemplate = Parser.parse( "/path?*" );
-    inputTemplate = Parser.parse( "/path" );
+    patternTemplate = Parser.parseTemplate( "/path?*" );
+    inputTemplate = Parser.parseLiteral( "/path" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
     assertThat( "Should not match because input does not contain the required query.", match, nullValue() );
 
-    patternTemplate = Parser.parse( "/path?*" );
-    inputTemplate = Parser.parse( "/path?query=value" );
+    patternTemplate = Parser.parseTemplate( "/path?*" );
+    inputTemplate = Parser.parseLiteral( "/path?query=value" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
@@ -384,38 +384,38 @@ public class MatcherTest {
         "Should not have extracts any parameters since pattern template didn't contain {}",
         match.getParams().resolve( "query" ), nullValue() );
 
-    patternTemplate = Parser.parse( "/path?{*}" );
-    inputTemplate = Parser.parse( "/path?query=value" );
+    patternTemplate = Parser.parseTemplate( "/path?{*}" );
+    inputTemplate = Parser.parseLiteral( "/path?query=value" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
     assertThat( "Should match because input does contain the required query.", match, notNullValue() );
     assertThat( match.getParams().resolve( "query" ), hasItem( "value" ) );
 
-    patternTemplate = Parser.parse( "/path?{**}" );
-    inputTemplate = Parser.parse( "/path" );
+    patternTemplate = Parser.parseTemplate( "/path?{**}" );
+    inputTemplate = Parser.parseLiteral( "/path" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
     assertThat( "Should match because the template has an optional query.", match, notNullValue() );
 
-    patternTemplate = Parser.parse( "/path?**" );
-    inputTemplate = Parser.parse( "/path" );
+    patternTemplate = Parser.parseTemplate( "/path?**" );
+    inputTemplate = Parser.parseLiteral( "/path" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
     assertThat( "Should match because the template has an optional extra query.", match, notNullValue() );
 
-    patternTemplate = Parser.parse( "/path?**" );
-    inputTemplate = Parser.parse( "/path?query=value" );
+    patternTemplate = Parser.parseTemplate( "/path?**" );
+    inputTemplate = Parser.parseLiteral( "/path?query=value" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
     assertThat( "Should match because the template has an optional extra query.", match, notNullValue() );
     assertThat( match.getParams().resolve( "query" ), nullValue() );
 
-    patternTemplate = Parser.parse( "/path?{**}" );
-    inputTemplate = Parser.parse( "/path?query=value" );
+    patternTemplate = Parser.parseTemplate( "/path?{**}" );
+    inputTemplate = Parser.parseLiteral( "/path?query=value" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
@@ -423,15 +423,15 @@ public class MatcherTest {
     assertThat( match.getParams().resolve( "query" ), hasItem( "value" ) );
     assertThat( match.getParams().resolve( "query" ).size(), equalTo( 1 ) );
 
-    patternTemplate = Parser.parse( "/path?{query}&{*}" );
-    inputTemplate = Parser.parse( "/path?query=value" );
+    patternTemplate = Parser.parseTemplate( "/path?{query}&{*}" );
+    inputTemplate = Parser.parseLiteral( "/path?query=value" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
     assertThat( "Should not match because input does not contain the required extra query.", match, nullValue() );
 
-    patternTemplate = Parser.parse( "/path?{query}&{*}" );
-    inputTemplate = Parser.parse( "/path?query=value&extra=extra-value" );
+    patternTemplate = Parser.parseTemplate( "/path?{query}&{*}" );
+    inputTemplate = Parser.parseLiteral( "/path?query=value&extra=extra-value" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
@@ -439,8 +439,8 @@ public class MatcherTest {
     assertThat( match.getParams().resolve( "query" ), hasItem( "value" ) );
     assertThat( match.getParams().resolve( "query" ).size(), equalTo( 1 ) );
 
-    patternTemplate = Parser.parse( "/path?{query=**}" );
-    inputTemplate = Parser.parse( "/path?query=value1&query=value2" );
+    patternTemplate = Parser.parseTemplate( "/path?{query=**}" );
+    inputTemplate = Parser.parseLiteral( "/path?query=value1&query=value2" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
@@ -449,8 +449,8 @@ public class MatcherTest {
     assertThat( match.getParams().resolve( "query" ), hasItem( "value2" ) );
     assertThat( match.getParams().resolve( "query" ).size(), equalTo( 2 ) );
 
-    patternTemplate = Parser.parse( "/path?{query}" );
-    inputTemplate = Parser.parse( "/path?query=value1&query=value2" );
+    patternTemplate = Parser.parseTemplate( "/path?{query}" );
+    inputTemplate = Parser.parseLiteral( "/path?query=value1&query=value2" );
     matcher = new Matcher<String>();
     matcher.add( patternTemplate, "T" );
     match = matcher.match( inputTemplate );
@@ -469,26 +469,26 @@ public class MatcherTest {
 
     matcher = new Matcher<String>();
     pattern = "foo://username:password@example.com:8042/over/there/index.dtb?type=animal&name=narwhal#nose";
-    patternTemplate = Parser.parse( pattern );
+    patternTemplate = Parser.parseTemplate( pattern );
     matcher.add( patternTemplate, pattern );
     input = "foo://username:password@example.com:8042/over/there/index.dtb?type=animal&name=narwhal#nose";
-    inputTemplate = Parser.parse( input );
+    inputTemplate = Parser.parseLiteral( input );
     match = matcher.match( inputTemplate );
     assertThat( match.getTemplate(), sameInstance( patternTemplate ) );
     assertThat( match.getValue(), equalTo( pattern ) );
 
     matcher = new Matcher<String>();
     pattern = "foo://username:password@example.com:8042/over/there/index.dtb?type=animal&name=narwhal#nose";
-    patternTemplate = Parser.parse( pattern );
+    patternTemplate = Parser.parseTemplate( pattern );
     matcher.add( patternTemplate, pattern );
 
     input = pattern;
-    inputTemplate = Parser.parse( input );
+    inputTemplate = Parser.parseLiteral( input );
     match = matcher.match( inputTemplate );
     assertThat( match, notNullValue() );
 
     input = "not://username:password@example.com:8042/over/there/index.dtb?type=animal&name=narwhal#nose";
-    inputTemplate = Parser.parse( input );
+    inputTemplate = Parser.parseLiteral( input );
     match = matcher.match( inputTemplate );
     assertThat( match, nullValue() );
   }
@@ -502,11 +502,11 @@ public class MatcherTest {
 
     matcher = new Matcher<String>();
     pattern = "path";
-    patternTemplate = Parser.parse( pattern );
+    patternTemplate = Parser.parseTemplate( pattern );
     matcher.add( patternTemplate, pattern );
     assertThat( matcher.get( patternTemplate ), is( pattern ) );
     input = "path";
-    inputTemplate = Parser.parse( input );
+    inputTemplate = Parser.parseLiteral( input );
     match = matcher.match( inputTemplate );
     assertThat( match.getTemplate(), sameInstance( patternTemplate ) );
     assertThat( match.getValue(), equalTo( pattern ) );
@@ -514,50 +514,50 @@ public class MatcherTest {
 
     matcher = new Matcher<String>();
     pattern = "/path";
-    patternTemplate = Parser.parse( pattern );
+    patternTemplate = Parser.parseTemplate( pattern );
     matcher.add( patternTemplate, pattern );
     input = "/path";
-    inputTemplate = Parser.parse( input );
+    inputTemplate = Parser.parseLiteral( input );
     match = matcher.match( inputTemplate );
     assertThat( match.getTemplate(), sameInstance( patternTemplate ) );
     assertThat( match.getValue(), equalTo( pattern ) );
 
     matcher = new Matcher<String>();
     pattern = "path/path";
-    patternTemplate = Parser.parse( pattern );
+    patternTemplate = Parser.parseTemplate( pattern );
     matcher.add( patternTemplate, pattern );
     input = "path/path";
-    inputTemplate = Parser.parse( input );
+    inputTemplate = Parser.parseLiteral( input );
     match = matcher.match( inputTemplate );
     assertThat( match.getTemplate(), sameInstance( patternTemplate ) );
     assertThat( match.getValue(), equalTo( pattern ) );
 
     matcher = new Matcher<String>();
     pattern = "*/path";
-    patternTemplate = Parser.parse( pattern );
+    patternTemplate = Parser.parseTemplate( pattern );
     matcher.add( patternTemplate, pattern );
     input = "pathA/path";
-    inputTemplate = Parser.parse( input );
+    inputTemplate = Parser.parseLiteral( input );
     match = matcher.match( inputTemplate );
     assertThat( match.getTemplate(), sameInstance( patternTemplate ) );
     assertThat( match.getValue(), equalTo( pattern ) );
 
     matcher = new Matcher<String>();
     pattern = "**/path";
-    patternTemplate = Parser.parse( pattern );
+    patternTemplate = Parser.parseTemplate( pattern );
     matcher.add( patternTemplate, pattern );
     input = "pathA/pathB/path";
-    inputTemplate = Parser.parse( input );
+    inputTemplate = Parser.parseLiteral( input );
     match = matcher.match( inputTemplate );
     assertThat( match.getTemplate(), sameInstance( patternTemplate ) );
     assertThat( match.getValue(), equalTo( pattern ) );
 
     matcher = new Matcher<String>();
     pattern = "path-1/{path=**}/path-4";
-    patternTemplate = Parser.parse( pattern );
+    patternTemplate = Parser.parseTemplate( pattern );
     matcher.add( patternTemplate, pattern );
     input = "path-1/path-2/path-3/path-4";
-    inputTemplate = Parser.parse( input );
+    inputTemplate = Parser.parseLiteral( input );
     match = matcher.match( inputTemplate );
     assertThat( match.getTemplate(), sameInstance( patternTemplate ) );
     assertThat( match.getValue(), equalTo( pattern ) );
@@ -566,20 +566,20 @@ public class MatcherTest {
 
     matcher = new Matcher<String>();
     pattern = "/";
-    patternTemplate = Parser.parse( pattern );
+    patternTemplate = Parser.parseTemplate( pattern );
     matcher.add( patternTemplate, pattern );
     input = "/";
-    inputTemplate = Parser.parse( input );
+    inputTemplate = Parser.parseLiteral( input );
     match = matcher.match( inputTemplate );
     assertThat( match.getTemplate(), sameInstance( patternTemplate ) );
     assertThat( match.getValue(), equalTo( pattern ) );
 
     matcher = new Matcher<String>();
     pattern = "";
-    patternTemplate = Parser.parse( pattern );
+    patternTemplate = Parser.parseTemplate( pattern );
     matcher.add( patternTemplate, pattern );
     input = "";
-    inputTemplate = Parser.parse( input );
+    inputTemplate = Parser.parseLiteral( input );
     match = matcher.match( inputTemplate );
     assertThat( match.getTemplate(), sameInstance( patternTemplate ) );
     assertThat( match.getValue(), equalTo( pattern ) );
@@ -588,14 +588,14 @@ public class MatcherTest {
   @Test
   public void testVariousPatterns() throws URISyntaxException {
     Matcher<String> matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "/webhdfs" ), "/webhdfs" );
-    matcher.add( Parser.parse( "/webhdfs/dfshealth.jsp" ), "/webhdfs/dfshealth.jsp" );
-    matcher.add( Parser.parse( "/webhdfs/*.jsp" ), "/webhdfs/*.jsp" );
-    matcher.add( Parser.parse( "/webhdfs/other.jsp" ), "/webhdfs/other.jsp" );
-    matcher.add( Parser.parse( "/webhdfs/*" ), "/webhdfs/*" );
-    matcher.add( Parser.parse( "/webhdfs/**" ), "/webhdfs/**" );
-    matcher.add( Parser.parse( "/webhdfs/v1/**" ), "/webhdfs/v1/**" );
-    matcher.add( Parser.parse( "/webhdfs/**/middle/*.xml" ), "/webhdfs/**/middle/*.xml" );
+    matcher.add( Parser.parseTemplate( "/webhdfs" ), "/webhdfs" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/dfshealth.jsp" ), "/webhdfs/dfshealth.jsp" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/*.jsp" ), "/webhdfs/*.jsp" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/other.jsp" ), "/webhdfs/other.jsp" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/*" ), "/webhdfs/*" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/**" ), "/webhdfs/**" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/v1/**" ), "/webhdfs/v1/**" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/**/middle/*.xml" ), "/webhdfs/**/middle/*.xml" );
 
     assertValidMatch( matcher, "/webhdfs", "/webhdfs" );
     assertValidMatch( matcher, "/webhdfs/dfshealth.jsp", "/webhdfs/dfshealth.jsp" );
@@ -612,7 +612,7 @@ public class MatcherTest {
   @Test
   public void testStar() throws URISyntaxException {
     Matcher<String> matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "/webhdfs/*" ), "/webhdfs/*" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/*" ), "/webhdfs/*" );
     assertValidMatch( matcher, "/webhdfs/*", "/webhdfs/*" );
     assertValidMatch( matcher, "/webhdfs/file", "/webhdfs/*" );
     assertValidMatch( matcher, "/webhdfs/path/", "/webhdfs/*" );
@@ -623,7 +623,7 @@ public class MatcherTest {
   @Test
   public void testGlob() throws URISyntaxException {
     Matcher<String> matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "/webhdfs/**" ), "/webhdfs/**" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/**" ), "/webhdfs/**" );
     assertValidMatch( matcher, "/webhdfs/file", "/webhdfs/**" );
     assertValidMatch( matcher, "/webhdfs/path/", "/webhdfs/**" );
     assertValidMatch( matcher, "/webhdfs/path/file", "/webhdfs/**" );
@@ -633,23 +633,23 @@ public class MatcherTest {
   @Test
   public void testMatrixParam() throws URISyntaxException {
     Matcher<String> matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "/webhdfs/**" ), "/webhdfs/**" );
-    matcher.add( Parser.parse( "/webhdfs/browseDirectory.jsp;dn=*" ), "/webhdfs/browseDirectory.jsp;dn=*" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/**" ), "/webhdfs/**" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/browseDirectory.jsp;dn=*" ), "/webhdfs/browseDirectory.jsp;dn=*" );
     assertValidMatch( matcher, "/webhdfs/browseDirectory.jsp;dn=X", "/webhdfs/browseDirectory.jsp;dn=*" );
   }
 
   @Test
   public void testTwoGlobsAtDifferentDepths() throws URISyntaxException {
     Matcher<String> matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "/webhdfs/**" ), "/webhdfs/**" );
-    matcher.add( Parser.parse( "/webhdfs/v1/**" ), "/webhdfs/v1/**" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/**" ), "/webhdfs/**" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/v1/**" ), "/webhdfs/v1/**" );
     assertValidMatch( matcher, "/webhdfs/file", "/webhdfs/**" );
     assertValidMatch( matcher, "/webhdfs/v1/file", "/webhdfs/v1/**" );
 
     // Reverse the put order.
     matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "/webhdfs/v1/**" ), "/webhdfs/v1/**" );
-    matcher.add( Parser.parse( "/webhdfs/**" ), "/webhdfs/**" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/v1/**" ), "/webhdfs/v1/**" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/**" ), "/webhdfs/**" );
     assertValidMatch( matcher, "/webhdfs/file", "/webhdfs/**" );
     assertValidMatch( matcher, "/webhdfs/v1/file", "/webhdfs/v1/**" );
   }
@@ -657,15 +657,15 @@ public class MatcherTest {
   @Test
   public void testGlobsVsStarsAtSameDepth() throws URISyntaxException {
     Matcher<String> matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "/webhdfs/*" ), "/webhdfs/*" );
-    matcher.add( Parser.parse( "/webhdfs/**" ), "/webhdfs/**" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/*" ), "/webhdfs/*" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/**" ), "/webhdfs/**" );
     assertValidMatch( matcher, "/webhdfs/file", "/webhdfs/*" ); // The star should be picked in preference to the glob.
     assertValidMatch( matcher, "/webhdfs/path/file", "/webhdfs/**" );
 
     // Reverse the put order.
     matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "/webhdfs/**" ), "/webhdfs/**" );
-    matcher.add( Parser.parse( "/webhdfs/*" ), "/webhdfs/*" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/**" ), "/webhdfs/**" );
+    matcher.add( Parser.parseTemplate( "/webhdfs/*" ), "/webhdfs/*" );
     assertValidMatch( matcher, "/webhdfs/path/file", "/webhdfs/**" );
     assertValidMatch( matcher, "/webhdfs/file", "/webhdfs/*" );
   }
@@ -673,19 +673,19 @@ public class MatcherTest {
   @Test
   public void testMatchingPatternsWithinPathSegments() throws URISyntaxException {
     Matcher<String> matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "/path/{file}" ), "default" );
+    matcher.add( Parser.parseTemplate( "/path/{file}" ), "default" );
     assertValidMatch( matcher, "/path/file-name", "default" );
 
     matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "/path/{file=*}" ), "*" );
+    matcher.add( Parser.parseTemplate( "/path/{file=*}" ), "*" );
     assertValidMatch( matcher, "/path/some-name", "*" );
 
     matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "/path/{more=**}" ), "**" );
+    matcher.add( Parser.parseTemplate( "/path/{more=**}" ), "**" );
     assertValidMatch( matcher, "/path/some-path/some-name", "**" );
 
     matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "/path/{regex=prefix*suffix}" ), "regex" );
+    matcher.add( Parser.parseTemplate( "/path/{regex=prefix*suffix}" ), "regex" );
     assertValidMatch( matcher, "/path/prefix-middle-suffix", "regex" );
     assertValidMatch( matcher, "/path/not-prefix-middle-suffix", null );
   }
@@ -693,19 +693,19 @@ public class MatcherTest {
   @Test
   public void testMatchingPatternsWithinQuerySegments() throws URISyntaxException {
     Matcher<String> matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "?query={queryParam}" ), "default" );
+    matcher.add( Parser.parseTemplate( "?query={queryParam}" ), "default" );
     assertValidMatch( matcher, "?query=value", "default" );
 
     matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "?query={queryParam=*}" ), "*" );
+    matcher.add( Parser.parseTemplate( "?query={queryParam=*}" ), "*" );
     assertValidMatch( matcher, "?query=some-value", "*" );
 
     matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "?query={queryParam=**}" ), "**" );
+    matcher.add( Parser.parseTemplate( "?query={queryParam=**}" ), "**" );
     assertValidMatch( matcher, "?query=some-value", "**" );
 
     matcher = new Matcher<String>();
-    matcher.add( Parser.parse( "?query={queryParam=prefix*suffix}" ), "regex" );
+    matcher.add( Parser.parseTemplate( "?query={queryParam=prefix*suffix}" ), "regex" );
     assertValidMatch( matcher, "?query=prefix-middle-suffix", "regex" );
     assertValidMatch( matcher, "?query=not-prefix-middle-suffix", null );
   }
@@ -730,8 +730,8 @@ public class MatcherTest {
     Matcher<?>.Match match;
     Params params;
 
-    template = Parser.parse( "{scheme}://{username}:{password}@{host}:{port}/{root}/{path}/{file}?queryA={paramA}&queryB={paramB}#{fragment}" );
-    input = Parser.parse( "http://horton:hadoop@hortonworks.com:80/top/middle/end?queryA=valueA&queryB=valueB#section" );
+    template = Parser.parseTemplate( "{scheme}://{username}:{password}@{host}:{port}/{root}/{path}/{file}?queryA={paramA}&queryB={paramB}#{fragment}" );
+    input = Parser.parseLiteral( "http://horton:hadoop@hortonworks.com:80/top/middle/end?queryA=valueA&queryB=valueB#section" );
     matcher = new Matcher<Void>( template, null );
     match = matcher.match( input );
     params = match.getParams();
@@ -793,11 +793,11 @@ public class MatcherTest {
 
     // This is just a reverse of the above.  The order caused a bug.
     stringMatcher = new Matcher<String>();
-    template = Parser.parse( "*://*:*/**/webhdfs/v1/{path=**}?{**=*}" );
+    template = Parser.parseTemplate( "*://*:*/**/webhdfs/v1/{path=**}?{**=*}" );
     stringMatcher.add( template, "test-value-B" );
-    template = Parser.parse( "*://*:*/**/webhdfs/data/v1/{path=**}?host={host=*}&port={port=*}&{**=*}" );
+    template = Parser.parseTemplate( "*://*:*/**/webhdfs/data/v1/{path=**}?host={host=*}&port={port=*}&{**=*}" );
     stringMatcher.add( template, "test-value-C" );
-    input = Parser.parse( "http://localhost:53221/gateway/cluster/webhdfs/v1/tmp/GatewayWebHdfsFuncTest/testBasicHdfsUseCase/dir?user.name=hdfs&op=MKDIRS" );
+    input = Parser.parseLiteral( "http://localhost:53221/gateway/cluster/webhdfs/v1/tmp/GatewayWebHdfsFuncTest/testBasicHdfsUseCase/dir?user.name=hdfs&op=MKDIRS" );
     match = stringMatcher.match( input );
     assertThat( match.getValue(), notNullValue() );
     assertThat( (String)match.getValue(), is( "test-value-B" ) );
@@ -812,8 +812,8 @@ public class MatcherTest {
     Matcher<?>.Match match;
     Params params;
 
-    template = Parser.parse( "{path-queryParam}" );
-    input = Parser.parse( "path-value" );
+    template = Parser.parseTemplate( "{path-queryParam}" );
+    input = Parser.parseLiteral( "path-value" );
     matcher = new Matcher<Void>( template, null );
     match = matcher.match( input );
     params = match.getParams();
@@ -823,8 +823,8 @@ public class MatcherTest {
     assertThat( params.resolve( "path-queryParam" ).size(), equalTo( 1 ) );
     assertThat( params.resolve( "path-queryParam" ), hasItem( "path-value" ) );
 
-    template = Parser.parse( "/some-path/{path-queryParam}" );
-    input = Parser.parse( "/some-path/path-value" );
+    template = Parser.parseTemplate( "/some-path/{path-queryParam}" );
+    input = Parser.parseLiteral( "/some-path/path-value" );
     matcher = new Matcher<Void>( template, null );
     match = matcher.match( input );
     params = match.getParams();
@@ -834,8 +834,8 @@ public class MatcherTest {
     assertThat( params.resolve( "path-queryParam" ).size(), equalTo( 1 ) );
     assertThat( params.resolve( "path-queryParam" ), hasItem( "path-value" ) );
 
-    template = Parser.parse( "/some-path/{path-queryParam}/some-other-path" );
-    input = Parser.parse( "/some-path/path-value/some-other-path" );
+    template = Parser.parseTemplate( "/some-path/{path-queryParam}/some-other-path" );
+    input = Parser.parseLiteral( "/some-path/path-value/some-other-path" );
     matcher = new Matcher<Void>( template, null );
     match = matcher.match( input );
     params = match.getParams();
@@ -845,8 +845,8 @@ public class MatcherTest {
     assertThat( params.resolve( "path-queryParam" ).size(), equalTo( 1 ) );
     assertThat( params.resolve( "path-queryParam" ), hasItem( "path-value" ) );
 
-    template = Parser.parse( "{path=**}" );
-    input = Parser.parse( "A/B" );
+    template = Parser.parseTemplate( "{path=**}" );
+    input = Parser.parseLiteral( "A/B" );
     matcher = new Matcher<Void>( template, null );
     match = matcher.match( input );
     params = match.getParams();
@@ -857,8 +857,8 @@ public class MatcherTest {
     assertThat( params.resolve( "path" ), hasItem( "A" ) );
     assertThat( params.resolve( "path" ), hasItem( "B" ) );
 
-    template = Parser.parse( "/top/{mid=**}/end" );
-    input = Parser.parse( "/top/A/B/end" );
+    template = Parser.parseTemplate( "/top/{mid=**}/end" );
+    input = Parser.parseLiteral( "/top/A/B/end" );
     matcher = new Matcher<Void>( template, null );
     match = matcher.match( input );
     params = match.getParams();
@@ -869,8 +869,8 @@ public class MatcherTest {
     assertThat( params.resolve( "mid" ), hasItem( "A" ) );
     assertThat( params.resolve( "mid" ), hasItem( "B" ) );
 
-    template = Parser.parse( "*://*:*/{path=**}?{**}" );
-    input = Parser.parse( "http://host:port/pathA/pathB" );
+    template = Parser.parseTemplate( "*://*:*/{path=**}?{**}" );
+    input = Parser.parseLiteral( "http://host:port/pathA/pathB" );
     matcher = new Matcher<Void>( template, null );
     match = matcher.match( input );
     params = match.getParams();
@@ -878,8 +878,8 @@ public class MatcherTest {
     assertThat( params.resolve( "path" ), hasItem( "pathB" ) );
     assertThat( params.resolve( "path" ).size(), is( 2 ) );
 
-    template = Parser.parse( "*://*:*/{path=**}?{**}" );
-    input = Parser.parse( "http://host:port/pathA/pathB" );
+    template = Parser.parseTemplate( "*://*:*/{path=**}?{**}" );
+    input = Parser.parseLiteral( "http://host:port/pathA/pathB" );
     matcher = new Matcher<Void>( template, null );
     match = matcher.match( input );
     params = match.getParams();
@@ -887,8 +887,8 @@ public class MatcherTest {
     assertThat( params.resolve( "path" ), hasItem( "pathB" ) );
     assertThat( params.resolve( "path" ).size(), is( 2 ) );
 
-    template = Parser.parse( "*://*:*/{path=**}?{**}" );
-    input = Parser.parse( "http://host:port/pathA/pathB" );
+    template = Parser.parseTemplate( "*://*:*/{path=**}?{**}" );
+    input = Parser.parseLiteral( "http://host:port/pathA/pathB" );
     matcher = new Matcher<Void>( template, null );
     match = matcher.match( input );
     params = match.getParams();
@@ -905,8 +905,8 @@ public class MatcherTest {
     Matcher<?>.Match match;
     Params params;
 
-    template = Parser.parse( "?query-queryParam={queryParam-name}" );
-    input = Parser.parse( "?query-queryParam=queryParam-value" );
+    template = Parser.parseTemplate( "?query-queryParam={queryParam-name}" );
+    input = Parser.parseLiteral( "?query-queryParam=queryParam-value" );
     matcher = new Matcher<Void>( template, null );
     match = matcher.match( input );
     params = match.getParams();
@@ -916,8 +916,8 @@ public class MatcherTest {
     assertThat( params.resolve( "queryParam-name" ).size(), equalTo( 1 ) );
     assertThat( params.resolve( "queryParam-name" ), hasItem( "queryParam-value" ) );
 
-    template = Parser.parse( "?query-queryParam={queryParam-name}" );
-    input = Parser.parse( "?query-queryParam=queryParam-value" );
+    template = Parser.parseTemplate( "?query-queryParam={queryParam-name}" );
+    input = Parser.parseLiteral( "?query-queryParam=queryParam-value" );
     matcher = new Matcher<Void>( template, null );
     match = matcher.match( input );
     params = match.getParams();
@@ -936,8 +936,8 @@ public class MatcherTest {
     Matcher<?>.Match match;
     Params params;
 
-    template = Parser.parse( "" );
-    input = Parser.parse( "" );
+    template = Parser.parseTemplate( "" );
+    input = Parser.parseLiteral( "" );
     matcher = new Matcher<Void>( template, null );
     match = matcher.match( input );
     params = match.getParams();
@@ -953,16 +953,16 @@ public class MatcherTest {
     Matcher<?>.Match match;
 
     matcher = new Matcher<String>();
-    template = Parser.parse( "*://*:*/**/webhdfs/v1/{path=**}?{**}" );
+    template = Parser.parseTemplate( "*://*:*/**/webhdfs/v1/{path=**}?{**}" );
     matcher.add( template, "test-value" );
 
-    input = Parser.parse( "http://kminder-os-u14-23-knoxha-150922-1352-2.novalocal:1022/gateway/sandbox/webhdfs/v1/user/hrt_qa/knox-ha/knox_webhdfs_client_dir/test_file?op=CREATE&delegation=XXX&namenoderpcaddress=nameservice&createflag=&createparent=true&overwrite=true" );
+    input = Parser.parseLiteral( "http://kminder-os-u14-23-knoxha-150922-1352-2.novalocal:1022/gateway/sandbox/webhdfs/v1/user/hrt_qa/knox-ha/knox_webhdfs_client_dir/test_file?op=CREATE&delegation=XXX&namenoderpcaddress=nameservice&createflag=&createparent=true&overwrite=true" );
 
     match = matcher.match( input );
     assertThat( match, notNullValue() );
     assertThat( (String)match.getValue(), is( "test-value" ) );
 
-    template = Parser.parse( "http://host:42/root/webhdfs/v1/{path=**}?{**}" );
+    template = Parser.parseTemplate( "http://host:42/root/webhdfs/v1/{path=**}?{**}" );
     URI expandedUri = Expander.expand( template, match.getParams(), null );
     String expandedStr = expandedUri.toString();
     assertThat( expandedStr, containsString( "http://host:42/root/webhdfs/v1/user/hrt_qa/knox-ha/knox_webhdfs_client_dir/test_file?" ) );