Package org.apache.abdera.protocol.server.impl

Source Code of org.apache.abdera.protocol.server.impl.TemplateTargetBuilder$TemplateContext

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  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.  For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.abdera.protocol.server.impl;

import java.security.Principal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import org.apache.abdera.i18n.templates.Context;
import org.apache.abdera.i18n.templates.DelegatingContext;
import org.apache.abdera.i18n.templates.HashMapContext;
import org.apache.abdera.i18n.templates.ObjectContext;
import org.apache.abdera.i18n.templates.Template;
import org.apache.abdera.protocol.server.RequestContext;
import org.apache.abdera.protocol.server.Target;
import org.apache.abdera.protocol.server.TargetBuilder;
import org.apache.abdera.protocol.server.RequestContext.Scope;

/**
* A TargetBuilder implementation that uses URI/IRI Templates to construct URIs/IRIs. The input parameter can be a
* java.util.Map<String,Object>, an instance of the org.apache.abdera.i18n.templates.Context interface, or any Java
* object with public getter methods.
*/
@SuppressWarnings("unchecked")
public class TemplateTargetBuilder implements TargetBuilder {

    protected final Map<Object, Template> templates = new HashMap<Object, Template>();

    public TemplateTargetBuilder() {
    }

    public TemplateTargetBuilder(Map<Object, Template> templates) {
        for (Map.Entry<Object, Template> entry : templates.entrySet()) {
            setTemplate(entry.getKey(), entry.getValue());
        }
    }

    public TemplateTargetBuilder setTemplate(Object key, String template) {
        return setTemplate(key, new Template(template));
    }

    public TemplateTargetBuilder setTemplate(Object key, Template template) {
        template = new Template(doReplacements(template.getPattern()));
        templates.put(key, template);
        return this;
    }

    private String doReplacements(String template) {
        for (Variable var : Variable.values()) {
            String rep = var.getReplacement();
            if (rep != null) {
                template = template.replaceAll("\\Q{" + var.name().toLowerCase() + "}\\E", rep);
            }
        }
        return template;
    }

    public static Context getContext(RequestContext request, Object param) {
        Context context = null;
        if (param != null) {
            if (param instanceof Map) {
                context = new HashMapContext((Map<String, Object>)param, true);
            } else if (param instanceof Context) {
                context = (Context)param;
            } else {
                context = new ObjectContext(param, true);
            }
        }
        return new TemplateContext(request, context);
    }

    public static <T> List<T> asList(Iterator<T> i) {
        List<T> list = new ArrayList<T>();
        while (i.hasNext())
            list.add(i.next());
        return list;
    }

    public String urlFor(RequestContext request, Object key, Object param) {
        Template template = templates.get(key);
        return template != null ? template.expand(getContext(request, param)) : null;
    }

    public static class TemplateContext extends DelegatingContext {

        private static final long serialVersionUID = 4332356546022014897L;

        private final RequestContext request;

        public TemplateContext(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;
        }

        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;
            }
        }

        public Iterator<String> iterator() {
            List<String> vars = new ArrayList<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 variable.name().toLowerCase() + "_" + label;
    }

    public static enum Variable {
        REQUEST_CONTEXT_PATH("{-opt|/|request_context_path}{-listjoin|/|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(
            "{-opt|/|target_path}{-listjoin|/|target_path}"), TARGET_BASE(
            "{-opt|/|target_base}{-listjoin|/|target_base}"), ;

        static Variable get(String var) {
            if (REQUEST_PARAMETER.match(var)) {
                return REQUEST_PARAMETER;
            } else if (SESSION_ATTRIBUTE.match(var)) {
                return SESSION_ATTRIBUTE;
            } else if (REQUEST_ATTRIBUTE.match(var)) {
                return REQUEST_ATTRIBUTE;
            } else if (REQUEST_HEADER.match(var)) {
                return REQUEST_HEADER;
            } else if (TARGET_PARAMETER.match(var)) {
                return TARGET_PARAMETER;
            } else {
                try {
                    return Variable.valueOf(var.toUpperCase());
                } catch (Exception e) {
                    return null;
                }
            }
        }

        private final Pattern p;
        private final String replacement;

        Variable() {
            this(null);
        }

        Variable(String replacement) {
            this.p = Pattern.compile("\\Q" + name() + "_\\E.*", Pattern.CASE_INSENSITIVE);
            this.replacement = replacement;
        }

        String getReplacement() {
            return replacement;
        }

        boolean match(String var) {
            return p.matcher(var).matches();
        }

        String label(String var) {
            return var.substring(name().length() + 1);
        }
    }

}
TOP

Related Classes of org.apache.abdera.protocol.server.impl.TemplateTargetBuilder$TemplateContext

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.