blob: e734140b7756db01316680ba14f00c246a89947f [file] [log] [blame]
package org.apache.abdera2.common.protocol;
import java.security.Principal;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;
import java.util.Set;
import org.apache.abdera2.common.protocol.RequestContext.Scope;
import org.apache.abdera2.common.templates.Context;
import org.apache.abdera2.common.templates.DelegatingContext;
public class RequestTemplateContext extends DelegatingContext {
private static final long serialVersionUID = 4332356546022014897L;
private final RequestContext request;
public RequestTemplateContext(RequestContext request, Context subcontext) {
super(subcontext);
this.request = request;
}
private String[] split(String val) {
if (val.equals(""))
return null;
String[] segments = val.split("/");
return segments.length > 0 ? segments : null;
}
@Override
public boolean contains(String var) {
if (super.contains(var)) return true;
return resolveActual(var) != null;
}
@Override
@SuppressWarnings("unchecked")
protected <T> T resolveActual(String var) {
Variable variable = Variable.get(var);
if (variable == null)
return subcontext != null ? (T)subcontext.resolve(var) : null;
switch (variable) {
case REQUEST_URI:
return (T)request.getUri().toString();
case REQUEST_RESOLVED_URI:
return (T)request.getResolvedUri().toString();
case REQUEST_CONTENT_TYPE:
return (T)request.getContentType().toString();
case REQUEST_CONTEXT_PATH:
return (T)split(request.getContextPath());
case REQUEST_PARAMETER:
String name = Variable.REQUEST_PARAMETER.label(var);
return (T)request.getParameter(name);
case REQUEST_LANGUAGE:
return (T)request.getAcceptLanguage();
case REQUEST_CHARSET:
return (T)request.getAcceptCharset();
case REQUEST_USER:
Principal p = request.getPrincipal();
return p != null ? (T)p.getName() : null;
case SESSION_ATTRIBUTE:
name = Variable.SESSION_ATTRIBUTE.label(var);
return (T)request.getAttribute(Scope.SESSION, name);
case REQUEST_ATTRIBUTE:
name = Variable.REQUEST_ATTRIBUTE.label(var);
return (T)request.getAttribute(Scope.REQUEST, name);
case REQUEST_HEADER:
name = Variable.REQUEST_HEADER.label(var);
return (T)request.getHeader(name);
case TARGET_PARAMETER:
name = Variable.TARGET_PARAMETER.label(var);
return (T)request.getTarget().getParameter(name);
case TARGET_IDENTITY:
return (T)request.getTarget().getIdentity();
case TARGET_PATH:
return (T)split(request.getTargetPath());
case TARGET_BASE:
return (T)split(request.getTargetBasePath());
default:
return subcontext != null ? (T)subcontext.resolve(var) : null;
}
}
@Override
public Iterator<String> iterator() {
Set<String> vars = new HashSet<String>();
for (String var : subcontext)
vars.add(var);
for (String var : request.getParameterNames())
vars.add(toVar(Variable.REQUEST_PARAMETER, var));
for (String var : request.getAttributeNames(Scope.SESSION))
vars.add(toVar(Variable.SESSION_ATTRIBUTE, var));
for (String var : request.getAttributeNames(Scope.REQUEST))
vars.add(toVar(Variable.REQUEST_ATTRIBUTE, var));
for (String var : request.getHeaderNames())
vars.add(toVar(Variable.REQUEST_HEADER, var));
Target target = request.getTarget();
for (String var : target.getParameterNames())
vars.add(toVar(Variable.TARGET_PARAMETER, var));
vars.add(Variable.REQUEST_CONTEXT_PATH.name().toLowerCase());
vars.add(Variable.REQUEST_CONTENT_TYPE.name().toLowerCase());
vars.add(Variable.REQUEST_URI.name().toLowerCase());
vars.add(Variable.REQUEST_RESOLVED_URI.name().toLowerCase());
vars.add(Variable.REQUEST_LANGUAGE.name().toLowerCase());
vars.add(Variable.REQUEST_CHARSET.name().toLowerCase());
vars.add(Variable.REQUEST_USER.name().toLowerCase());
vars.add(Variable.TARGET_IDENTITY.name().toLowerCase());
vars.add(Variable.TARGET_PATH.name().toLowerCase());
vars.add(Variable.TARGET_BASE.name().toLowerCase());
return vars.iterator();
}
private static String toVar(Variable variable, String label) {
return String.format("%s_%s", variable.name().toLowerCase(), label);
}
public static enum Variable {
REQUEST_CONTEXT_PATH,
REQUEST_CONTENT_TYPE,
REQUEST_URI,
REQUEST_RESOLVED_URI,
REQUEST_PARAMETER,
REQUEST_LANGUAGE,
REQUEST_CHARSET,
REQUEST_USER,
SESSION_ATTRIBUTE,
REQUEST_ATTRIBUTE,
REQUEST_HEADER,
TARGET_PARAMETER,
TARGET_IDENTITY,
TARGET_PATH,
TARGET_BASE;
static Variable get(String var) {
if (var == null) return null;
var = var.toUpperCase(Locale.US);
for (Variable variable : Variable.values())
if (var.startsWith(variable.name()))
return variable;
return null;
}
boolean match(String var) {
if (var == null) return false;
var = var.toUpperCase(Locale.US);
return var.startsWith(name());
}
String label(String var) {
return var.substring(name().length() + 1);
}
}
}