org.betaconceptframework.astroboa.resourceapi.utility.XmlSchemaGenerator.java Source code

Java tutorial

Introduction

Here is the source code for org.betaconceptframework.astroboa.resourceapi.utility.XmlSchemaGenerator.java

Source

/*
 * Copyright (C) 2005-2012 BetaCONCEPT Limited.
 *
 * This file is part of Astroboa.
 *
 * Astroboa is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Astroboa is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Astroboa.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.betaconceptframework.astroboa.resourceapi.utility;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.betaconceptframework.astroboa.api.model.BetaConceptNamespaceConstants;
import org.betaconceptframework.astroboa.util.CmsConstants;

/**
 * 
 * @author Gregory Chomatas (gchomatas@betaconcept.com)
 * @author Savvas Triantafyllou (striantafyllou@betaconcept.com)
 * 
 */

public class XmlSchemaGenerator {

    public final static String declaration = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";

    private StringBuilder sb = new StringBuilder();

    public String generateXmlSchema(Map<String, Object> objectType) {

        String typeName = (String) objectType.get("name");

        addLine(declaration);
        addLine("<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"");
        addLine("targetNamespace=\"" + BetaConceptNamespaceConstants.ASTROBOA_SCHEMA_URI + "/content/" + typeName
                + "\"");
        addLine("xmlns:tns=\"" + BetaConceptNamespaceConstants.ASTROBOA_SCHEMA_URI + "/content/" + typeName + "\"");
        addLine("xmlns:bccmsmodel=\"" + BetaConceptNamespaceConstants.ASTROBOA_MODEL_DEFINITION_URI + "\"");

        if (objectType.containsKey("version")) {
            addLine("version=\"" + objectType.get("version") + "\"");
        }

        addLine(">");

        addLine("<xs:import namespace=\"" + BetaConceptNamespaceConstants.ASTROBOA_MODEL_DEFINITION_URI + "\"");
        addLine("schemaLocation=\"astroboa-model-" + CmsConstants.ASTROBOA_VERSION + ".xsd\" />");

        createElementForType(objectType);

        addNewLine();

        addLine("</xs:schema>");

        return sb.toString();
    }

    private void createElementForType(Map<String, Object> objectType) {

        addElementForComplexProperty(objectType, false);

    }

    private void addComplexTypeAndArrayOfProperties(Map<String, Object> arrayOfProperties) {

        if (arrayOfProperties != null && arrayOfProperties.containsKey("property")
                && arrayOfProperties.get("property") != null) {

            List<Map<String, Object>> properties = (List<Map<String, Object>>) arrayOfProperties.get("property");

            if (!properties.isEmpty()) {
                addLine("\t<xs:complexType>");
                //addLine("\t\t<xs:complexContent>");
                addLine("\t\t\t<xs:sequence>");

                for (Map<String, Object> property : properties) {

                    if (property.containsKey("valueType")) {
                        String valueType = (String) property.get("valueType");

                        if (StringUtils.equals(valueType, "String")) {
                            addStringProperty(property);
                        } else if (StringUtils.equals(valueType, "Long")) {
                            addLongProperty(property);
                        } else if (StringUtils.equals(valueType, "Double")) {
                            addDoubleProperty(property);
                        } else if (StringUtils.equals(valueType, "Boolean")) {
                            addBooleanProperty(property);
                        } else if (StringUtils.equals(valueType, "Date")) {
                            addDateProperty(property);
                        } else if (StringUtils.equals(valueType, "Binary")) {
                            addBinaryProperty(property);
                        } else if (StringUtils.equals(valueType, "TopicReference")) {
                            addTopicReferenceProperty(property);
                        } else if (StringUtils.equals(valueType, "ObjectReference")) {
                            addObjectReferenceProperty(property);
                        } else if (StringUtils.equals(valueType, "Complex")) {
                            addElementForComplexProperty(property, true);
                        }

                    }
                }

                addLine("\t\t\t</xs:sequence>");
                //addLine("\t\t</xs:complexContent>");
                addLine("\t</xs:complexType>");
            }
        }
    }

    private void addElementForComplexProperty(Map<String, Object> property, boolean displayCardinality) {

        String minOccurs = "";
        String maxOccurs = "";

        if (displayCardinality) {
            minOccurs = " minOccurs=\""
                    + (BooleanUtils.isTrue(Boolean.valueOf((String) property.get("mandatory"))) ? "1" : "0")
                    + "\" ";
            maxOccurs = " maxOccurs=\""
                    + (BooleanUtils.isTrue(Boolean.valueOf((String) property.get("multiple"))) ? "unbounded" : "1")
                    + "\" ";
        }

        addLine("<xs:element name=\"" + property.get("name") + "\"" + minOccurs + maxOccurs + ">");

        addLabel((Map<String, Object>) property.get("label"));

        addComplexTypeAndArrayOfProperties((Map<String, Object>) property.get("arrayOfProperties"));

        addLine("</xs:element>");

    }

    private void addTopicReferenceProperty(Map<String, Object> property) {

        String name = (String) property.get("name");
        String minOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("mandatory"))) ? "1" : "0";
        String maxOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("multiple"))) ? "unbounded"
                : "1";
        String acceptedTaxonomies = (String) property.get("acceptedTaxonomies");

        if (StringUtils.isNotBlank(acceptedTaxonomies)) {
            acceptedTaxonomies = " bccmsmodel:acceptedTaxonomies=\"" + acceptedTaxonomies + "\" ";
        } else {
            acceptedTaxonomies = "";
        }

        addLine("<xs:element name=\"" + name + "\" type=\"bccmsmodel:topicType\" minOccurs=\"" + minOccurs
                + "\" maxOccurs=\"" + maxOccurs + "\"" + acceptedTaxonomies + ">");
        addLabel((Map<String, Object>) property.get("label"));
        addLine("</xs:element>");

    }

    private void addObjectReferenceProperty(Map<String, Object> property) {

        String name = (String) property.get("name");
        String minOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("mandatory"))) ? "1" : "0";
        String maxOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("multiple"))) ? "unbounded"
                : "1";
        String acceptedContentTypes = (String) property.get("acceptedContentTypes");

        if (StringUtils.isNotBlank(acceptedContentTypes)) {
            acceptedContentTypes = " bccmsmodel:acceptedContentTypes=\"" + acceptedContentTypes + "\" ";
        } else {
            acceptedContentTypes = "";
        }

        addLine("<xs:element name=\"" + name + "\" type=\"bccmsmodel:contentObjectReferenceType\" minOccurs=\""
                + minOccurs + "\" maxOccurs=\"" + maxOccurs + "\"" + acceptedContentTypes + ">");
        addLabel((Map<String, Object>) property.get("label"));
        addLine("</xs:element>");

    }

    private void addStringProperty(Map<String, Object> property) {

        String name = (String) property.get("name");
        String minOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("mandatory"))) ? "1" : "0";
        String maxOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("multiple"))) ? "unbounded"
                : "1";
        String stringFormat = (String) property.get("stringFormat");

        if (StringUtils.isNotBlank(stringFormat)) {
            stringFormat = " bccmsmodel:stringFormat=\"" + stringFormat + "\" ";
        } else {
            stringFormat = "";
        }

        addLine("<xs:element name=\"" + name + "\" type=\"xs:string\" minOccurs=\"" + minOccurs + "\" maxOccurs=\""
                + maxOccurs + "\"" + stringFormat + ">");
        addLabel((Map<String, Object>) property.get("label"));
        addLine("</xs:element>");

    }

    private void addLongProperty(Map<String, Object> property) {

        String name = (String) property.get("name");
        String minOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("mandatory"))) ? "1" : "0";
        String maxOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("multiple"))) ? "unbounded"
                : "1";

        addLine("<xs:element name=\"" + name + "\" type=\"xs:long\" minOccurs=\"" + minOccurs + "\" maxOccurs=\""
                + maxOccurs + "\">");
        addLabel((Map<String, Object>) property.get("label"));
        addLine("</xs:element>");

    }

    private void addDoubleProperty(Map<String, Object> property) {

        String name = (String) property.get("name");
        String minOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("mandatory"))) ? "1" : "0";
        String maxOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("multiple"))) ? "unbounded"
                : "1";

        addLine("<xs:element name=\"" + name + "\" type=\"xs:double\" minOccurs=\"" + minOccurs + "\" maxOccurs=\""
                + maxOccurs + "\">");
        addLabel((Map<String, Object>) property.get("label"));
        addLine("</xs:element>");

    }

    private void addDateProperty(Map<String, Object> property) {

        String name = (String) property.get("name");
        String minOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("mandatory"))) ? "1" : "0";
        String maxOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("multiple"))) ? "unbounded"
                : "1";

        addLine("<xs:element name=\"" + name + "\" type=\"xs:datetime\" minOccurs=\"" + minOccurs
                + "\" maxOccurs=\"" + maxOccurs + "\">");
        addLabel((Map<String, Object>) property.get("label"));
        addLine("</xs:element>");

    }

    private void addBooleanProperty(Map<String, Object> property) {

        String name = (String) property.get("name");
        String minOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("mandatory"))) ? "1" : "0";
        String maxOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("multiple"))) ? "unbounded"
                : "1";

        addLine("<xs:element name=\"" + name + "\" type=\"xs:boolean\" minOccurs=\"" + minOccurs + "\" maxOccurs=\""
                + maxOccurs + "\">");
        addLabel((Map<String, Object>) property.get("label"));
        addLine("</xs:element>");

    }

    private void addBinaryProperty(Map<String, Object> property) {

        String name = (String) property.get("name");
        String minOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("mandatory"))) ? "1" : "0";
        String maxOccurs = BooleanUtils.isTrue(Boolean.valueOf((String) property.get("multiple"))) ? "unbounded"
                : "1";

        addLine("<xs:element name=\"" + name + "\" type=\"bccmsmodel:binaryChannelType\" minOccurs=\"" + minOccurs
                + "\" maxOccurs=\"" + maxOccurs + "\">");
        addLabel((Map<String, Object>) property.get("label"));
        addLine("</xs:element>");

    }

    private void addLabel(Map<String, Object> labels) {

        if (labels != null && !labels.isEmpty()) {
            addLine("\t<xs:annotation>");

            for (Entry<String, Object> labelEntry : labels.entrySet()) {

                addLine("\t\t<xs:documentation xml:lang=\"" + labelEntry.getKey() + "\">");
                addLine("\t\t\t<bccmsmodel:displayName>" + labelEntry.getValue() + "</bccmsmodel:displayName>");
                addLine("\t\t\t<bccmsmodel:description>" + labelEntry.getValue() + "</bccmsmodel:description>");
                addLine("\t\t</xs:documentation>");
            }

            addLine("\t</xs:annotation>");
        }
    }

    private void addLine(String line) {
        sb.append(line);
        addNewLine();
    }

    private void addNewLine() {
        sb.append("\n");
    }
}