Package com.alibaba.citrus.service.requestcontext.rewrite.impl

Source Code of com.alibaba.citrus.service.requestcontext.rewrite.impl.RewriteCondition$ConditionFlags

/*
* Copyright (c) 2002-2012 Alibaba Group Holding Limited.
* All rights reserved.
*
* 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.alibaba.citrus.service.requestcontext.rewrite.impl;

import static com.alibaba.citrus.service.requestcontext.rewrite.impl.RewriteUtil.*;
import static com.alibaba.citrus.util.Assert.*;
import static com.alibaba.citrus.util.StringUtil.*;

import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import javax.servlet.http.HttpServletRequest;

import com.alibaba.citrus.util.StringEscapeUtil;
import com.alibaba.citrus.util.ToStringBuilder;
import com.alibaba.citrus.util.ToStringBuilder.MapBuilder;
import com.alibaba.citrus.util.regex.MatchResultSubstitution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;

public class RewriteCondition implements InitializingBean {
    private static final Logger log = LoggerFactory.getLogger(RewriteCondition.class);
    private String         testString;
    private String         patternString;
    private Pattern        pattern;
    private boolean        negative;
    private ConditionFlags flags;

    public void setTest(String testString) {
        this.testString = trimToNull(testString);
    }

    public void setPattern(String patternString) throws PatternSyntaxException {
        this.patternString = trimToNull(patternString);
    }

    public void setFlags(String[] flags) {
        this.flags = new ConditionFlags(flags);
    }

    public ConditionFlags getFlags() {
        return flags;
    }

    public void afterPropertiesSet() throws Exception {
        // test
        assertNotNull(testString, "missing test attribute for condition");

        // pattern
        if (patternString == null || "!".equals(patternString)) {
            throw new PatternSyntaxException("empty pattern", patternString, -1);
        }

        String realPattern;

        if (patternString.startsWith("!")) {
            this.negative = true;
            realPattern = patternString.substring(1);
        } else {
            realPattern = patternString;
        }

        this.pattern = Pattern.compile(realPattern);

        // flags
        if (flags == null) {
            flags = new ConditionFlags();
        }
    }

    public MatchResult match(MatchResult ruleMatchResult, MatchResult conditionMatchResult, HttpServletRequest request) {
        if (log.isTraceEnabled()) {
            log.trace("Testing condition: testString=\"{}\", pattern=\"{}\"", StringEscapeUtil.escapeJava(testString),
                      StringEscapeUtil.escapeJava(patternString));
        }

        String subsTestString = getSubstitutedTestString(testString, ruleMatchResult, conditionMatchResult, request);

        if (log.isTraceEnabled()) {
            log.trace("Expanded testString: original=\"{}\", expanded=\"{}\"", StringEscapeUtil.escapeJava(testString),
                      StringEscapeUtil.escapeJava(subsTestString));
        }

        Matcher matcher = pattern.matcher(subsTestString);
        boolean matched = matcher.find();

        if (!negative && matched) {
            if (log.isDebugEnabled()) {
                log.debug("Testing \"{}\" with condition pattern: \"{}\", MATCHED",
                          StringEscapeUtil.escapeJava(subsTestString), StringEscapeUtil.escapeJava(patternString));
            }

            return matcher.toMatchResult();
        }

        if (negative && !matched) {
            if (log.isDebugEnabled()) {
                log.debug("Testing \"{}\" with condition pattern: \"{}\", MATCHED",
                          StringEscapeUtil.escapeJava(subsTestString), StringEscapeUtil.escapeJava(patternString));
            }

            return MatchResultSubstitution.EMPTY_MATCH_RESULT;
        }

        if (log.isTraceEnabled()) {
            log.trace("Testing \"{}\" with condition pattern: \"{}\", MISMATCHED",
                      StringEscapeUtil.escapeJava(subsTestString), StringEscapeUtil.escapeJava(patternString));
        }

        return null;
    }

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

        mb.append("test", testString);
        mb.append("pattern", patternString);

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

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

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

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

        /** 标志位:和下一个condition呈“或”的关系。 */
        public boolean hasOR() {
            return hasFlags("OR", "ornext");
        }
    }
}
TOP

Related Classes of com.alibaba.citrus.service.requestcontext.rewrite.impl.RewriteCondition$ConditionFlags

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.