Package com.alibaba.toolkit.util.configuration.digester

Source Code of com.alibaba.toolkit.util.configuration.digester.ContextSensitiveRules

/*
* 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.toolkit.util.configuration.digester;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.digester.Digester;
import org.apache.commons.digester.Rule;
import org.apache.commons.digester.Rules;
import org.apache.commons.digester.RulesBase;

/**
* 上下文相关的<code>Rules</code>包装器.
*
* @author Michael Zhou
* @version $Id: ContextSensitiveRules.java,v 1.2 2003/08/07 08:08:59 zyh Exp $
*/
public class ContextSensitiveRules implements Rules {
    private static final String CONTEXT_INITIALIZING = "INITIALIZING";
    private static final String CONTEXT_INITIALIZED  = "INITIALIZED";
    protected Rules rules;
    private String       context       = "";
    private StringBuffer contextBuffer = new StringBuffer();
    private Map          contextStatus = new HashMap();

    /** 创建默认的<code>Rules</code>. */
    public ContextSensitiveRules() {
        this(new RulesBase());
    }

    /**
     * 创建指定<code>Rules</code>的包装.
     *
     * @param rules 被包装的<code>Rules</code>
     */
    public ContextSensitiveRules(Rules rules) {
        this.rules = rules;
    }

    /**
     * 压入指定的上下文.
     *
     * @param context 要压入的上下文字符串
     */
    public void pushContext(String context) {
        contextBuffer.append('/').append(context);
        this.context = contextBuffer.toString();
    }

    /**
     * 弹出最新的上下文.
     *
     * @return 最新的上下文
     */
    public String popContext() {
        int index = context.lastIndexOf("/");
        String topContext = null;

        if (index >= 0) {
            topContext = contextBuffer.substring(index + 1, contextBuffer.length());
            contextBuffer.setLength(index);
        }

        this.context = contextBuffer.toString();
        return topContext;
    }

    /**
     * 检查指定的context是否被初始化.
     *
     * @param context 要检查的context
     * @return 如果被初始化, 则返回<code>true</code>
     */
    public boolean isInitialized(String context) {
        return CONTEXT_INITIALIZED.equals(contextStatus.get(context));
    }

    /**
     * 设置指定context为初始化中的状态.
     *
     * @param context 要设置的context
     */
    public void setInitializing(String context) {
        contextStatus.put(context, CONTEXT_INITIALIZING);
    }

    /**
     * 设置指定context为已初始化的状态.
     *
     * @param context 要设置的context
     */
    public void setInitialized(String context) {
        contextStatus.put(context, CONTEXT_INITIALIZED);
    }

    /**
     * 取得当前的上下文.
     *
     * @return 当前的上下文
     */
    public String getContext() {
        return context;
    }

    /**
     * 取得digester.
     *
     * @return digester
     */
    public Digester getDigester() {
        return rules.getDigester();
    }

    /**
     * 设置digester.
     *
     * @param digester digester
     */
    public void setDigester(Digester digester) {
        rules.setDigester(digester);
    }

    /**
     * 取得名字空间.
     *
     * @return 名字空间
     */
    public String getNamespaceURI() {
        return rules.getNamespaceURI();
    }

    /**
     * 设置名字空间.
     *
     * @param namespaceURI 名字空间
     */
    public void setNamespaceURI(String namespaceURI) {
        rules.setNamespaceURI(namespaceURI);
    }

    /**
     * 登记规则.
     *
     * @param pattern 匹配模板
     * @param rule    要登记的规则
     */
    public void add(String pattern, Rule rule) {
        if (context.length() > 0 && !(rule instanceof SetContextRule)
            && CONTEXT_INITIALIZING.equals(contextStatus.get(context))) {
            rule = new ContextSensitiveRule(rule, context);
        }

        rules.add(pattern, rule);
    }

    /** 清除所有规则. */
    public void clear() {
        rules.clear();
    }

    /**
     * 匹配指定模板.
     *
     * @param pattern 匹配模板
     * @return 匹配的规则
     * @deprecated
     */
    @Deprecated
    public List match(String pattern) {
        return match(null, pattern);
    }

    /**
     * 匹配指定模板.
     *
     * @param namespaceURI 名字空间
     * @param pattern      匹配模板
     * @return 匹配的规则
     */
    public List match(String namespaceURI, String pattern) {
        List list = rules.match(namespaceURI, pattern);
        List sublist = new ArrayList(list.size());

        for (Iterator i = list.iterator(); i.hasNext(); ) {
            Rule rule = (Rule) i.next();

            if (!(rule instanceof ContextSensitiveRule) || ((ContextSensitiveRule) rule).isContextMatched(context)) {
                sublist.add(rule);
            }
        }

        return sublist;
    }

    /**
     * 取得所有规则.
     *
     * @return 所有规则
     */
    public List rules() {
        return rules.rules();
    }

    /**
     * 取得<code>Rules</code>的字符串表示.
     *
     * @return <code>Rules</code>的字符串表示
     */
    @Override
    public String toString() {
        return rules.toString();
    }
}
TOP

Related Classes of com.alibaba.toolkit.util.configuration.digester.ContextSensitiveRules

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.