/**
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.filter.rewrite.impl;
import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteEnvironment;
import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriter;
import org.apache.hadoop.gateway.filter.rewrite.i18n.UrlRewriteMessages;
import org.apache.hadoop.gateway.filter.rewrite.spi.UrlRewriteContext;
import org.apache.hadoop.gateway.filter.rewrite.spi.UrlRewriteFunctionProcessor;
import org.apache.hadoop.gateway.i18n.messages.MessagesFactory;
import org.apache.hadoop.gateway.util.urltemplate.Evaluator;
import org.apache.hadoop.gateway.util.urltemplate.Params;
import org.apache.hadoop.gateway.util.urltemplate.Resolver;
import org.apache.hadoop.gateway.util.urltemplate.Template;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class UrlRewriteContextImpl implements UrlRewriteContext {
private static final UrlRewriteMessages LOG = MessagesFactory.get( UrlRewriteMessages.class );
private UrlRewriteEnvironment environment;
private Resolver resolver;
private Evaluator evaluator;
private Map<String,UrlRewriteFunctionProcessor> functions;
private ContextParameters params;
private UrlRewriter.Direction direction;
private Template originalUrl;
private Template currentUrl;
public UrlRewriteContextImpl(
UrlRewriteEnvironment environment,
Resolver resolver,
Map<String,UrlRewriteFunctionProcessor> functions,
UrlRewriter.Direction direction,
Template url ) {
this.environment = environment;
this.resolver = resolver;
this.functions = functions;
this.params = new ContextParameters();
this.evaluator = new ContextEvaluator();
this.direction = direction;
this.originalUrl = url;
this.currentUrl = url;
}
@Override
public UrlRewriter.Direction getDirection() {
return direction;
}
@Override
public Template getOriginalUrl() {
return originalUrl;
}
@Override
public Template getCurrentUrl() {
return currentUrl;
}
@Override
public void setCurrentUrl( Template url ) {
currentUrl = url;
}
@Override
public void addParameters( Params parameters ) {
params.add( parameters );
}
@Override
public Params getParameters() {
return params;
}
@Override
public Evaluator getEvaluator() {
return evaluator;
}
private class ContextParameters implements Params {
Map<String,List<String>> map = new HashMap<String,List<String>>();
@Override
public Set<String> getNames() {
return map.keySet();
}
@Override
public List<String> resolve( String name ) {
List<String> values = map.get( name ); // Try to find the name in the context map.
if( values == null ) {
try {
values = resolver.resolve( name );
if( values == null ) {
values = environment.resolve( name ); // Try to find the name in the environment.
}
} catch( Exception e ) {
LOG.failedToFindValuesByParameter( name, e );
// Ignore it and return null.
}
}
return values;
}
public void add( Params params ) {
for( String name : params.getNames() ) {
map.put( name, params.resolve( name ) );
}
}
}
private class ContextEvaluator implements Evaluator {
@Override
public List<String> evaluate( String function, List<String> parameters ) {
List<String> results = null;
UrlRewriteFunctionProcessor processor = functions.get( function );
if( processor != null ) {
try {
results = processor.resolve( UrlRewriteContextImpl.this, parameters );
} catch( Exception e ) {
LOG.failedToInvokeRewriteFunction( function, e );
results = null;
}
}
return results;
}
}
}