All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.tinygroup.weblayer.webcontext.rewrite.RewriteSubstitution Maven / Gradle / Ivy

The newest version!
/**
 *  Copyright (c) 1997-2013, www.tinygroup.org ([email protected]).
 *
 *  Licensed under the GPL, Version 3.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.gnu.org/licenses/gpl.html
 *
 *  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.tinygroup.weblayer.webcontext.rewrite;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.tinygroup.commons.tools.*;
import org.tinygroup.commons.tools.ToStringBuilder.MapBuilder;
import org.tinygroup.weblayer.webcontext.parser.valueparser.ParameterParser;

import javax.servlet.http.HttpServletResponse;
import java.util.regex.MatchResult;

import static org.tinygroup.commons.tools.ArrayUtil.isEmptyArray;
import static org.tinygroup.commons.tools.Assert.assertNotNull;
import static org.tinygroup.commons.tools.BasicConstant.EMPTY_STRING_ARRAY;
import static org.tinygroup.commons.tools.StringUtil.trimToNull;
import static org.tinygroup.weblayer.webcontext.rewrite.RewriteUtil.isFullURL;

public class RewriteSubstitution implements InitializingBean {
    private static final Logger log = LoggerFactory.getLogger(RewriteSubstitution.class);
	private static final String SPLIT_CHAR = ",";
    private String            uri;
    private String flags;
    private SubstitutionFlags subflags;
    private Parameter[]       parameters;

    public void setUri(String uri) {
        this.uri = StringUtil.trimToNull(uri);
    }

    public SubstitutionFlags getSubFlags() {
        return subflags;
    }

    public String getFlags() {
		return flags;
	}

	public void setFlags(String flags) {
    	this.flags=flags;
    	String[] flagArray=null;
    	if(StringUtil.isEmpty(flags)){
    		flagArray=EMPTY_STRING_ARRAY;
    	}else{
    		flagArray=flags.split(SPLIT_CHAR);
    	}
        this.subflags = new SubstitutionFlags(flagArray);
    }

    public void setParameters(Parameter[] params) {
        this.parameters = params;
    }

    public void afterPropertiesSet() throws Exception {
        // flags
        if (subflags == null) {
        	subflags = new SubstitutionFlags();
        }

        // params
        if (parameters == null) {
            parameters = new Parameter[0];
        }
    }

    public String substitute(String path, MatchResultSubstitution resultSubs) {
        if (uri == null) {
            if (log.isTraceEnabled()) {
                log.trace("No substitution applied to path: \"{}\"", StringEscapeUtil.escapeJava(path));
            }

            return path;
        }

        String subsPath = resultSubs.substitute(uri);

        if (!isFullURL(subsPath)) {
            MatchResult ruleMatchResult = resultSubs.getMatch();

            subsPath = path.substring(0, ruleMatchResult.start()) // before match
                       + subsPath // match
                       + path.substring(ruleMatchResult.end()); // after match
        }

        if (log.isDebugEnabled()) {
            log.debug("Rewriting \"{}\" to \"{}\"", StringEscapeUtil.escapeJava(path),
                      StringEscapeUtil.escapeJava(subsPath));
        }

        return subsPath;
    }

    public boolean substituteParameters(ParameterParser params, MatchResultSubstitution resultSubs) {
        boolean parameterSubstituted = false;

        if (!params.isEmpty()) {
            if (!subflags.hasQSA()) {
                params.clear();
                parameterSubstituted = true;

                log.debug("All parameters have been cleared.  To prevent from clearing the parameters, "
                          + "just specify \"QSA\" or \"qsappend\"(query string append) flag to the substitution");
            }
        }

        for (Parameter param : parameters) {
            String key = param.getKey(resultSubs);
            String[] values = param.getValues(resultSubs);

            if (!StringUtil.isEmpty(key)) {
                if (ArrayUtil.isEmptyArray(values) || values.length == 1 && StringUtil.isEmpty(values[0])) {
                    params.remove(key);

                    if (log.isDebugEnabled()) {
                        log.debug("Removed parameter: \"{}\"", StringEscapeUtil.escapeJava(key));
                    }
                } else {
                    params.setStrings(key, values);

                    if (log.isDebugEnabled()) {
                        log.debug("Set parameter: \"{}\"=\"{}\"", StringEscapeUtil.escapeJava(key),
                                  ObjectUtil.toString(values));
                    }
                }

                parameterSubstituted = true;
            }
        }

        return parameterSubstituted;
    }

    
    public String toString() {
        MapBuilder mb = new MapBuilder();

        if (uri != null) {
            mb.append("uri", uri);
        }

        if (!isEmptyArray(parameters)) {
            mb.append("params", parameters);
        }

        if (!subflags.isEmpty()) {
            mb.append("flags", subflags);
        }

        return new ToStringBuilder().append("Substitution").append(mb).toString();
    }

    /** 代表substitution的标志位。 */
    public static class SubstitutionFlags extends Flags {
        public SubstitutionFlags() {
            super();
        }

        public SubstitutionFlags(String... flags) {
            super(flags);
        }

        /** 标志位:保留所有GET、POST、UPLOAD所得的参数。 */
        public boolean hasQSA() {
            return hasFlags("QSA", "qsappend");
        }

        /** 标志位:如果一个规则被匹配,则继续处理其后继规则;如果该规则不被匹配,则其后继规则将被跳过。 */
        public boolean hasC() {
            return hasFlags("C", "chain");
        }

        /** 标志位:如果一个规则被匹配,并指明该参数,则立即结束。 */
        public boolean hasL() {
            return hasFlags("L", "last");
        }

        /**
         * 标志位:重定向,并取得redirect code。如果未指定重定向,则返回0。
         * 

* 默认为302 moved temporarily。如指定R=301则表示 * 301 moved permanently。 *

*/ public int getRedirectCode() { String value = getFlagValue("R", "redirect"); int defaultStatusCode = HttpServletResponse.SC_MOVED_TEMPORARILY; if (value == null) { return 0; } else if (value.length() == 0) { return defaultStatusCode; } else { try { return Integer.parseInt(value); } catch (NumberFormatException e) { return defaultStatusCode; } } } } public static class Parameter implements InitializingBean { private String key; private String[] values; public void setKey(String key) { this.key = trimToNull(key); } public void setValue(String value) { this.values = value.split(SPLIT_CHAR); } public void setValues(String[] values) { this.values = values; } public void afterPropertiesSet() throws Exception { assertNotNull(key, "missing key attribute for parameter"); if (values == null) { values = EMPTY_STRING_ARRAY; } } public String getKey(MatchResultSubstitution resultSubs) { return resultSubs.substitute(key); } public String[] getValues(MatchResultSubstitution resultSubs) { String[] subsValues = new String[values.length]; for (int i = 0; i < values.length; i++) { subsValues[i] = resultSubs.substitute(values[i]); } return subsValues; } public String toString() { ToStringBuilder buf = new ToStringBuilder().append(key).append(" = "); if (values.length == 1) { buf.append(values[0]); } else { buf.appendArray(values); } return buf.toString(); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy