}
private void contributeRewriteRules( DeploymentContext context, Service service ) throws URISyntaxException {
UrlRewriteRulesDescriptor rules = context.getDescriptor( "rewrite" );
UrlRewriteRuleDescriptor rule;
UrlRewriteActionRewriteDescriptorExt rewrite;
UrlRewriteMatchDescriptor match;
rule = rules.addRule( getRole() + "/" + getName() + "/namenode/root/inbound" )
.directions( "inbound" )
.pattern( "*://*:*/**" + NAMENODE_EXTERNAL_PATH + "/?{**}" );
rewrite = rule.addStep( "rewrite" );
rewrite.template( service.getUrl().toExternalForm() + "/?{**}" );
rule = rules.addRule( getRole() + "/" + getName() + "/namenode/file/inbound" )
.directions( "inbound" )
.pattern( "*://*:*/**" + NAMENODE_EXTERNAL_PATH + "/{path=**}?{**}" );
rewrite = rule.addStep( "rewrite" );
rewrite.template( service.getUrl().toExternalForm() + "/{path=**}?{**}" );
rule = rules.addRule( getRole() + "/" + getName() + "/datanode/inbound" )
.directions( "inbound" )
.pattern( "*://*:*/**" + DATANODE_EXTERNAL_PATH + "/{path=**}?**" );
//TODO: If the input type is wrong it throws a NPE.
rule.addStep( "decode-query" );
match = rule.addStep( "match" );
match.pattern( "*://*:*/**" + DATANODE_EXTERNAL_PATH + "/{path=**}?{host}&{port}&{**}" );
rewrite = rule.addStep( "rewrite" );
rewrite.template( "http://{host}:{port}/{path=**}?{**}" );
rule = rules.addRule( getRole() + "/" + getName() + "/datanode/outbound" )
.directions( "outbound" )
.pattern( "*://*:*/**?**" );
match = rule.addStep( "match" );
match.pattern( "*://{host}:{port}/{path=**}?{**}" );
rewrite = rule.addStep( "rewrite" );
rewrite.template( CLUSTER_URL_FUNCTION + DATANODE_EXTERNAL_PATH + "/{path=**}?{host}&{port}&{**}" );
rule.addStep( "encode-query" );
}