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

com.alipay.v3.util.schema.api.ServiceSchemaReader Maven / Gradle / Ivy

There is a newer version: 3.1.6.ALL
Show newest version
package com.alipay.v3.util.schema.api;

import com.alipay.v3.util.schema.exception.SchemaException;
import com.alipay.v3.util.schema.model.attribute.*;
import com.alipay.v3.util.schema.model.enums.AttrRuleTypeEnum;
import com.alipay.v3.util.schema.model.enums.AttrTypeEnum;
import com.alipay.v3.util.schema.model.enums.AttrValueTypeEnum;
import com.alipay.v3.util.schema.model.enums.SchemaErrorEnum;
import com.alipay.v3.util.schema.model.option.Option;
import com.alipay.v3.util.schema.model.rule.AttributeRule;
import com.alipay.v3.util.schema.util.StringUtil;
import com.alipay.v3.util.schema.util.XmlUtils;
import org.dom4j.Element;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ServiceSchemaReader {

    public static Map readXmlForMap(File file) throws SchemaException {
        Element rootEle = XmlUtils.getRootElementFromFile(file);
        return readXmlForMap(rootEle);
    }

    public static Map readXmlForMap(String xmlStirng) throws SchemaException {
        Element rootEle = XmlUtils.getRootElementFromString(xmlStirng);
        return readXmlForMap(rootEle);
    }

    public static List readXmlForList(File file) throws SchemaException {
        Element rootEle = XmlUtils.getRootElementFromFile(file);
        return readXmlForList(rootEle);
    }

    public static List readXmlForList(String xmlStirng) throws SchemaException {
        Element rootEle = XmlUtils.getRootElementFromString(xmlStirng);
        return readXmlForList(rootEle);
    }

    public static List readXmlForList(Element rootEle) throws SchemaException {
        List attributeList = ServiceSchemaFactory.createEmptyAttributeList();
        List attributeElmList = XmlUtils.getChildElements(rootEle, "attribute");
        for (Element attrElm : attributeElmList) {
            Attribute attribute = elementToAttribute(attrElm);
            attributeList.add(attribute);
        }
        return attributeList;
    }

    public static Map readXmlForMap(Element rootEle) throws SchemaException {
        Map attributeMap = new HashMap();
        List attributeElmList = XmlUtils.getChildElements(rootEle, "attribute");
        for (Element attributeElm : attributeElmList) {
            Attribute attribute = elementToAttribute(attributeElm);
            attributeMap.put(attribute.getId(), attribute);
        }
        return attributeMap;
    }

    public static Attribute elementToAttribute(Element attributeElm) throws SchemaException {
        if (attributeElm == null) {
            return null;
        }
        String attributeId = XmlUtils.getAttributeValue(attributeElm, "id");
        if (StringUtil.isEmpty(attributeId)) {
            String msg = SchemaErrorEnum.ATTR_MISS_ID.getErrorMessage() + "相关xml片段 ["
                    + attributeElm.asXML() + "]";
            throw new SchemaException(SchemaErrorEnum.ATTR_MISS_ID.getErrorCode(), msg);
        }
        String attributeType = XmlUtils.getAttributeValue(attributeElm, "type");
        if (StringUtil.isEmpty(attributeType)) {
            String msg = SchemaErrorEnum.ATTR_MISS_TYPE.getErrorMessage() + "相关xml片段 ["
                    + attributeElm.asXML() + "].attributeId=" + attributeId;
            throw new SchemaException(SchemaErrorEnum.ATTR_MISS_TYPE.getErrorCode(), msg,
                    attributeId);
        }
        String attributeName = XmlUtils.getAttributeValue(attributeElm, "name");

        String valueType = XmlUtils.getAttributeValue(attributeElm, "valueType");
        AttrValueTypeEnum valueTypeEnum = AttrValueTypeEnum.getByCode(valueType);
        if (valueTypeEnum == null) {
            String msg = SchemaErrorEnum.ATTR_VALUETYPE_ERROR.getErrorMessage() + "相关xml片段 ["
                    + attributeElm.asXML() + "].attributeId=" + attributeId;
            throw new SchemaException(SchemaErrorEnum.ATTR_VALUETYPE_ERROR.getErrorCode(),
                    msg, attributeId);
        }

        AttrTypeEnum attributeTypeEnum = AttrTypeEnum.getType(attributeType);
        if (attributeTypeEnum == null) {
            String msg = SchemaErrorEnum.ATTR_TYPE_ERROR.getErrorMessage() + "相关xml片段["
                    + attributeElm.asXML() + "].attributeId=" + attributeId;
            throw new SchemaException(SchemaErrorEnum.ATTR_TYPE_ERROR.getErrorCode(), msg,
                    attributeId);
        }

        Attribute attribute_result = null;
        switch (attributeTypeEnum) {
            case SINGLE:
                attribute_result = elementToSingleAttribute(attributeElm, attributeId,
                        attributeName, valueTypeEnum);
                break;
            case MULTI:
                attribute_result = elementToMultiAttribute(attributeElm, attributeId, attributeName,
                        valueTypeEnum);
                break;
            case COMPLEX:
                attribute_result = elementToComplexAttribute(attributeElm, attributeId,
                        attributeName, valueTypeEnum);
                break;
            case MULTICOMPLEX:
                attribute_result = elementToMultiComplexAttribute(attributeElm, attributeId,
                        attributeName, valueTypeEnum);
                break;
        }
        return attribute_result;
    }

    private static AttributeRule elementToRule(Element ruleEle,
                                               String attributeId) throws SchemaException {
        if (ruleEle == null) {
            return null;
        }
        String ruleType = XmlUtils.getAttributeValue(ruleEle, "type");
        if (StringUtil.isEmpty(ruleType)) {
            throw new SchemaException(SchemaErrorEnum.ATTR_RULE_TYPE_ERROR, attributeId);
        }
        String ruleValue = XmlUtils.getAttributeValue(ruleEle, "value");
        if (StringUtil.isEmpty(ruleValue)) {
            throw new SchemaException(SchemaErrorEnum.ATTR_RULE_VALUE_ERROR, attributeId);
        }

        AttributeRule rule = null;
        AttrRuleTypeEnum ruleTypeEnum = AttrRuleTypeEnum.getType(ruleType);
        if (ruleTypeEnum == null) {
            throw new SchemaException(SchemaErrorEnum.ATTR_RULE_TYPE_ERROR, attributeId);
        }
        rule = ServiceSchemaFactory.createRule(ruleTypeEnum);
        rule.setType(ruleTypeEnum);
        rule.setName(XmlUtils.getAttributeValue(ruleEle, "name"));
        rule.setValue(ruleValue);

        return rule;
    }

    private static Option elementToOption(Element optionEle,
                                          String attributeId) throws SchemaException {
        Option opResult = new Option();
        String displayName = XmlUtils.getAttributeValue(optionEle, "displayName");
        if (StringUtil.isEmpty(displayName)) {
            throw new SchemaException(SchemaErrorEnum.OPTION_NAME_ERROR, attributeId);
        }
        String value = XmlUtils.getAttributeValue(optionEle, "value");
        if (StringUtil.isEmpty(value)) {
            throw new SchemaException(SchemaErrorEnum.OPTION_VALUE_ERROR, attributeId);
        }
        opResult.setDisplayName(displayName);
        opResult.setValue(value);

        return opResult;
    }

    private static SingleAttribute elementToSingleAttribute(Element attributeElm,
                                                            String attributeId,
                                                            String attributeName,
                                                            AttrValueTypeEnum valueType) throws SchemaException {
        if (attributeElm == null) {
            return null;
        }
        SingleAttribute singleAttribute = (SingleAttribute) ServiceSchemaFactory
                .createAttribute(AttrTypeEnum.SINGLE);
        singleAttribute.setId(attributeId);
        singleAttribute.setName(attributeName);
        singleAttribute.setValueType(valueType);
        //rules
        Element rulesEle = XmlUtils.getChildElement(attributeElm, "rules");
        if (rulesEle != null) {
            List ruleEleList = XmlUtils.getChildElements(rulesEle, "rule");
            for (Element ruleEle : ruleEleList) {
                AttributeRule rule = elementToRule(ruleEle, singleAttribute.getId());
                singleAttribute.addRule(rule);
            }
        }

        //option
        Element optionsEle = XmlUtils.getChildElement(attributeElm, "options");
        if (optionsEle != null) {
            List optionEleList = XmlUtils.getChildElements(optionsEle, "option");
            for (Element optionEleEle : optionEleList) {
                Option op = elementToOption(optionEleEle, singleAttribute.getId());
                singleAttribute.addOption(op);
            }
        }

        //value
        Element value = XmlUtils.getChildElement(attributeElm, "value");
        if (value != null) {
            singleAttribute.setValue(XmlUtils.getElementValue(value));
        }
        return singleAttribute;
    }

    private static MultiAttribute elementToMultiAttribute(Element attrElm, String attrId,
                                                          String attrName,
                                                          AttrValueTypeEnum valueType) throws SchemaException {
        if (attrElm == null) {
            return null;
        }
        MultiAttribute multiAttr = (MultiAttribute) ServiceSchemaFactory
                .createAttribute(AttrTypeEnum.MULTI);
        multiAttr.setId(attrId);
        multiAttr.setName(attrName);
        multiAttr.setValueType(valueType);
        //rules
        Element rulesEle = XmlUtils.getChildElement(attrElm, "rules");
        if (rulesEle != null) {
            List ruleEleList = XmlUtils.getChildElements(rulesEle, "rule");
            for (Element ruleEle : ruleEleList) {
                AttributeRule rule = elementToRule(ruleEle, multiAttr.getId());
                multiAttr.addRule(rule);
            }
        }

        //value
        Element valuesEle = XmlUtils.getChildElement(attrElm, "values");
        if (valuesEle != null) {
            List valueEleList = XmlUtils.getChildElements(valuesEle, "value");
            for (Element valueEle : valueEleList) {
                String value = XmlUtils.getElementValue(valueEle);
                multiAttr.addValue(value);
            }
        }

        //option
        Element optionsEle = XmlUtils.getChildElement(attrElm, "options");
        if (optionsEle != null) {
            List optionEleList = XmlUtils.getChildElements(optionsEle, "option");
            for (Element optionEleEle : optionEleList) {
                Option op = elementToOption(optionEleEle, multiAttr.getId());
                multiAttr.addOption(op);
            }
        }

        return multiAttr;
    }

    private static MultiComplexAttribute elementToMultiComplexAttribute(Element attributeElm,
                                                                        String attributeId,
                                                                        String attributeName,
                                                                        AttrValueTypeEnum valueType) throws SchemaException {
        if (attributeElm == null) {
            return null;
        }
        MultiComplexAttribute multiComplexAttribute = (MultiComplexAttribute) ServiceSchemaFactory
                .createAttribute(AttrTypeEnum.MULTICOMPLEX);
        multiComplexAttribute.setId(attributeId);
        multiComplexAttribute.setName(attributeName);
        multiComplexAttribute.setValueType(valueType);

        //attributes
        List attributesList = XmlUtils.getChildElements(attributeElm, "attributes");
        if (attributesList != null) {
            for (Element attributes : attributesList) {
                ComplexAttribute complexAttribute = new ComplexAttribute();
                List attributeEleList = XmlUtils.getChildElements(attributes, "attribute");
                for (Element subAttributeEle : attributeEleList) {
                    Attribute attrFromEle = elementToAttribute(subAttributeEle);
                    complexAttribute.addAttribute(attrFromEle);
                }
                multiComplexAttribute.addAttributes(complexAttribute);
            }
        }
        //rules
        Element rulesEle = XmlUtils.getChildElement(attributeElm, "rules");
        if (rulesEle != null) {
            List ruleEleList = XmlUtils.getChildElements(rulesEle, "rule");
            for (Element ruleEle : ruleEleList) {
                AttributeRule rule = elementToRule(ruleEle, multiComplexAttribute.getId());
                multiComplexAttribute.addRule(rule);
            }
        }
        return multiComplexAttribute;
    }

    private static ComplexAttribute elementToComplexAttribute(Element attrElm, String attrId,
                                                              String attrName,
                                                              AttrValueTypeEnum valueType) throws SchemaException {
        if (attrElm == null) {
            return null;
        }
        ComplexAttribute complexAttr = (ComplexAttribute) ServiceSchemaFactory
                .createAttribute(AttrTypeEnum.COMPLEX);
        complexAttr.setId(attrId);
        complexAttr.setName(attrName);
        complexAttr.setValueType(valueType);
        Element attributesEle = XmlUtils.getChildElement(attrElm, "attributes");
        if (attributesEle != null) {
            List attributeEleList = XmlUtils.getChildElements(attributesEle, "attribute");
            for (Element subAttributeEle : attributeEleList) {
                Attribute attributeFromEle = elementToAttribute(subAttributeEle);
                complexAttr.addAttribute(attributeFromEle);
            }
        }
        //rules
        Element rulesEle = XmlUtils.getChildElement(attrElm, "rules");
        if (rulesEle != null) {
            List ruleEleList = XmlUtils.getChildElements(rulesEle, "rule");
            for (Element ruleEle : ruleEleList) {
                AttributeRule rule = elementToRule(ruleEle, complexAttr.getId());
                complexAttr.addRule(rule);
            }
        }
        return complexAttr;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy