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

Source Code of com.alibaba.citrus.service.requestcontext.rewrite.impl.RewriteRequestContextFactoryDefinitionParser

/*
* Copyright 2010 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.springext.util.DomUtil.*;
import static com.alibaba.citrus.springext.util.SpringExtUtil.*;
import static com.alibaba.citrus.util.StringUtil.*;

import java.util.List;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;

import com.alibaba.citrus.springext.ConfigurationPoint;
import com.alibaba.citrus.springext.Contribution;
import com.alibaba.citrus.springext.ContributionAware;
import com.alibaba.citrus.springext.support.parser.AbstractSingleBeanDefinitionParser;
import com.alibaba.citrus.springext.util.DomUtil.ElementSelector;

public class RewriteRequestContextFactoryDefinitionParser extends
        AbstractSingleBeanDefinitionParser<RewriteRequestContextFactoryImpl> implements ContributionAware {
    private ConfigurationPoint rewriteHandlersConfigurationPoint;

    public void setContribution(Contribution contrib) {
        rewriteHandlersConfigurationPoint = getSiblingConfigurationPoint("services/request-contexts/rewrite/handlers",
                contrib);
    }

    @Override
    protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
        List<Object> rules = createManagedList(element, parserContext);
        ElementSelector ruleSelector = and(sameNs(element), name("rule")); // request-contexts:rule

        for (Element subElement : subElements(element, ruleSelector)) {
            rules.add(parseRule(subElement, parserContext));
        }

        builder.addPropertyValue("rules", rules);
    }

    /**
     * ����rule��
     */
    private BeanDefinition parseRule(Element ruleElement, ParserContext parserContext) {
        BeanDefinitionBuilder ruleBuilder = BeanDefinitionBuilder.genericBeanDefinition(RewriteRule.class);

        attributesToProperties(ruleElement, ruleBuilder, "pattern");

        ElementSelector conditionSelector = and(sameNs(ruleElement), name("condition")); // request-contexts:condition
        ElementSelector substitutionSelector = and(sameNs(ruleElement), name("substitution")); // request-contexts:substitution
        ElementSelector handlersSelector = and(sameNs(ruleElement), name("handlers")); // request-contexts:handlers

        List<Object> conditions = createManagedList(ruleElement, parserContext);

        BeanDefinition substitution = null;
        List<Object> handlers = null;

        for (Element subElement : subElements(ruleElement)) {
            if (conditionSelector.accept(subElement)) {
                conditions.add(parseCondition(subElement, parserContext));
            } else if (substitutionSelector.accept(subElement)) {
                substitution = parseSubstitution(subElement, parserContext);
            } else if (handlersSelector.accept(subElement)) {
                handlers = parseHandlers(subElement, parserContext, ruleBuilder);
            }
        }

        ruleBuilder.addPropertyValue("conditions", conditions);

        if (substitution != null) {
            ruleBuilder.addPropertyValue("substitution", substitution);
        }

        if (handlers != null) {
            ruleBuilder.addPropertyValue("handlers", handlers);
        }

        return ruleBuilder.getBeanDefinition();
    }

    /**
     * ����rule/condition��
     */
    private BeanDefinition parseCondition(Element conditionElement, ParserContext parserContext) {
        BeanDefinitionBuilder conditionBuilder = BeanDefinitionBuilder.genericBeanDefinition(RewriteCondition.class);

        attributesToProperties(conditionElement, conditionBuilder, "test", "pattern", "flags");

        return conditionBuilder.getBeanDefinition();
    }

    /**
     * ����rule/substitution��
     */
    private BeanDefinition parseSubstitution(Element substitutionElement, ParserContext parserContext) {
        BeanDefinitionBuilder substitutionBuilder = BeanDefinitionBuilder
                .genericBeanDefinition(RewriteSubstitution.class);

        attributesToProperties(substitutionElement, substitutionBuilder, "uri", "flags");

        List<Object> parameters = createManagedList(substitutionElement, parserContext);

        ElementSelector parameterSelector = and(sameNs(substitutionElement), name("parameter")); // request-contexts:parameter

        for (Element subElement : subElements(substitutionElement, parameterSelector)) {
            parameters.add(parseParameter(subElement, parserContext));
        }

        substitutionBuilder.addPropertyValue("parameters", parameters);

        return substitutionBuilder.getBeanDefinition();
    }

    /**
     * ����rule/substitution/parameter��
     */
    private BeanDefinition parseParameter(Element parameterElement, ParserContext parserContext) {
        BeanDefinitionBuilder parameterBuilder = BeanDefinitionBuilder
                .genericBeanDefinition(RewriteSubstitution.Parameter.class);

        attributesToProperties(parameterElement, parameterBuilder, "key", "value");

        List<Object> values = createManagedList(parameterElement, parserContext);

        ElementSelector valueSelector = and(sameNs(parameterElement), name("value")); // request-contexts:value

        for (Element subElement : subElements(parameterElement, valueSelector)) {
            values.add(trimToNull(subElement.getTextContent()));
        }

        if (!values.isEmpty()) {
            parameterBuilder.addPropertyValue("values", values);
        }

        return parameterBuilder.getBeanDefinition();
    }

    /**
     * ����rule/handlers��
     */
    private List<Object> parseHandlers(Element handlersElement, ParserContext parserContext,
                                       BeanDefinitionBuilder ruleBuilder) {
        List<Object> handlers = createManagedList(handlersElement, parserContext);

        for (Element subElement : subElements(handlersElement)) {
            handlers.add(parseConfigurationPointBean(subElement, rewriteHandlersConfigurationPoint, parserContext,
                    ruleBuilder));
        }

        return handlers;
    }
}
TOP

Related Classes of com.alibaba.citrus.service.requestcontext.rewrite.impl.RewriteRequestContextFactoryDefinitionParser

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.