com.astamuse.asta4d.web.builtin.AbstractGenericPathHandler.java Source code

Java tutorial

Introduction

Here is the source code for com.astamuse.asta4d.web.builtin.AbstractGenericPathHandler.java

Source

/*
 * Copyright 2014 astamuse company,Ltd.
 * 
 * Licensed 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 com.astamuse.asta4d.web.builtin;

import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.io.FilenameUtils;

import com.astamuse.asta4d.Context;
import com.astamuse.asta4d.web.WebApplicationContext;
import com.astamuse.asta4d.web.dispatch.mapping.UrlMappingRule;

public abstract class AbstractGenericPathHandler {
    public final static String VAR_BASEPATH = "basePath";

    private final static ConcurrentHashMap<String, String> genericMapResult = new ConcurrentHashMap<>();

    private final static String NullHolder = AbstractGenericPathHandler.class.getName() + "#NULL";

    private String _basePath = null;

    public AbstractGenericPathHandler() {
    }

    public AbstractGenericPathHandler(String basePath) {
        this._basePath = basePath;
    }

    public String convertPath(UrlMappingRule currentRule) {
        WebApplicationContext context = Context.getCurrentThreadContext();
        String uri = context.getAccessURI();

        String targetPath = genericMapResult.get(uri);
        if (targetPath != null) {
            if (targetPath.equals(NullHolder)) {
                return null;
            } else {
                return targetPath;
            }
        } else {
            String basePath = context.getData(WebApplicationContext.SCOPE_PATHVAR, VAR_BASEPATH);
            if (basePath == null) {
                basePath = _basePath;
            }

            if (basePath == null) {// default from web context root
                targetPath = uri;
            } else {

                basePath = FilenameUtils.normalize(basePath, true);

                String src = currentRule.getSourcePath();
                // convert for /**/*
                String mask = "/**/*";
                int idx = src.indexOf(mask);
                if (idx >= 0) {
                    String parentPath = src.substring(0, idx);
                    String childPath = uri.substring(parentPath.length());

                    if (basePath.endsWith("/")) {
                        basePath = basePath.substring(0, basePath.length() - 1);
                    }
                    if (!childPath.startsWith("/")) {
                        childPath = "/" + childPath;
                    }
                    targetPath = basePath + childPath;
                } else {// be a one 2 one mapping
                    targetPath = basePath;
                }
            }

            if (fileNameSecurityCheck(targetPath)) {
                genericMapResult.put(uri, targetPath);
                return targetPath;
            } else {
                genericMapResult.put(uri, NullHolder);
                return null;
            }
        }
    }

    private boolean fileNameSecurityCheck(String path) {
        // we do not allow any unnormalized path for security reason
        String normalizedPath = FilenameUtils.normalize(path, true);
        return path.equals(normalizedPath);
    }
}