Package org.apache.tuscany.container.javascript.utils.xmlfromxsd

Source Code of org.apache.tuscany.container.javascript.utils.xmlfromxsd.XBbasedXMLGenerator

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you 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 org.apache.tuscany.container.javascript.utils.xmlfromxsd;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;

import javax.wsdl.Definition;
import javax.wsdl.WSDLException;
import javax.wsdl.extensions.schema.Schema;
import javax.wsdl.factory.WSDLFactory;
import javax.wsdl.xml.WSDLReader;
import javax.xml.namespace.QName;

import org.apache.xmlbeans.SchemaGlobalElement;
import org.apache.xmlbeans.SchemaType;
import org.apache.xmlbeans.SchemaTypeSystem;
import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
import org.apache.xmlbeans.impl.xsd2inst.SchemaInstanceGenerator;
import org.xml.sax.InputSource;

import com.ibm.wsdl.util.xml.DOM2Writer;

public class XBbasedXMLGenerator extends SchemaInstanceGenerator implements XMLGenerator {
    private XMLfromXSDConfiguration config = null;

    public static final String QNAME_SEPARATOR = "#";

    public XBbasedXMLGenerator(XMLfromXSDConfiguration config) {
        this.config = config;
        // config.setXsdInputStream(getClass().getResource(conf).openStream());
    }

    public Hashtable<String, XmlObject> generateXmlAll() throws Exception {
        Hashtable<String, XmlObject> xmlInstances = new Hashtable<String, XmlObject>();
        TuscanySampleXmlUtil xmlUtil = new TuscanySampleXmlUtil();
        xmlUtil.setGenerate_sample_data(config.isGenerateSampleData());
        SchemaTypeSystem sts = processXSDSources();
        SchemaType elementType = null;
        for (SchemaGlobalElement globalElement : sts.globalElements()) {
            elementType = getRootElementSchemaType(sts, globalElement.getName().getNamespaceURI(), globalElement.getName().getLocalPart());
            xmlInstances.put(makeQName(globalElement.getName()), XmlObject.Factory.parse(xmlUtil.createSampleForType(elementType)));
        }

        return xmlInstances;
    }

    public String generateXMLAsString() throws Exception {
        SchemaTypeSystem sts = processXSDSources();
        SchemaType rootElementType = getRootElementSchemaType(sts, config.getSchemaTypeNamespaceURI(), config.getSchemaTypeName());
        String result = "";
        if (rootElementType != null) {
            TuscanySampleXmlUtil xmlUtil = new TuscanySampleXmlUtil();
            xmlUtil.setGenerate_sample_data(config.isGenerateSampleData());
            result = xmlUtil.createSampleForType(rootElementType);
        } else {
            System.out.println("Could not find a global element with name \"" + config.getRootElementLocalName() + "\"");
        }
        return result;
    }

    public void generateXMLIntoOutputStream() throws Exception {
        config.getXmlOutputStream().write(generateXMLAsString().getBytes());
    }

    public void generateXML() throws Exception {
        SchemaTypeSystem sts = processXSDSources();

        SchemaType rootElementType = getRootElementSchemaType(sts, config.getSchemaTypeNamespaceURI(), config.getSchemaTypeName());

        if (rootElementType != null) {
            TuscanySampleXmlUtil xmlUtil = new TuscanySampleXmlUtil();
            xmlUtil.setGenerate_sample_data(config.isGenerateSampleData());
            String result = xmlUtil.createSampleForType(rootElementType);
            config.getXmlOutputStream().write(result.getBytes());
            // System.out.println(result);
        } else {
            System.out.println("Could not find a global element with name \"" + config.getRootElementLocalName() + "\"");
        }
    }

    protected SchemaType getRootElementSchemaType(SchemaTypeSystem sts, String schemaNamespace, String schemaTypeName) {
        SchemaType schemaType = null;

        if (sts == null) {
            System.out.println("No Schemas to process.");
        } else {
            // first check in the global types
            SchemaType[] globalTypes = sts.globalTypes();
            for (int i = 0; i < globalTypes.length; i++) {
                if (schemaNamespace.equals(globalTypes[i].getName().getNamespaceURI())
                        && schemaTypeName.equals(globalTypes[i].getName().getLocalPart())) {
                    schemaType = globalTypes[i];
                    break;
                }
            }

            // next check for anonymous types defined inline within elements
            if (schemaType == null) {
                SchemaType[] globalElems = sts.documentTypes();
                for (int i = 0; i < globalElems.length; i++) {
                    if (schemaNamespace.equals(globalElems[i].getDocumentElementName().getNamespaceURI())
                            && schemaTypeName.equals(globalElems[i].getDocumentElementName().getLocalPart())) {
                        schemaType = globalElems[i];
                        break;
                    }
                }
            }
        }
        return schemaType;
    }

    public void generateXML(XMLfromXSDConfiguration config) throws Exception {
        this.config = config;
        generateXML();
    }

    public XMLfromXSDConfiguration getConfig() {
        return config;
    }

    public void setConfig(XMLfromXSDConfiguration config) {
        this.config = config;
    }

    private Definition readInTheWSDLFile(InputStream wsdlStream) throws WSDLException {
        WSDLReader reader = WSDLFactory.newInstance().newWSDLReader();
        reader.setFeature("javax.wsdl.importDocuments", true);

        /*
         * File file = new File(uri); String baseURI;
         *
         * if (uri.startsWith("http://")){ baseURI = uri; } else{ if(file.getParentFile() == null){ try { baseURI = new
         * File(".").getCanonicalFile().toURI().toString(); } catch (IOException e) { throw new RuntimeException(e); } } else { baseURI =
         * file.getParentFile().toURI().toString(); } }
         */
        // Document doc;
        InputSource inputSource;
        try {

            // doc = XMLUtils.newDocument(wsdlStream);
            inputSource = new InputSource(wsdlStream);
            /*
             * } catch (ParserConfigurationException e) { throw new WSDLException(WSDLException.PARSER_ERROR, "Parser Configuration Error", e); }
             * catch (SAXException e) { throw new WSDLException(WSDLException.PARSER_ERROR, "Parser SAX Error", e);
             */
        } catch (Exception e) {
            throw new WSDLException(WSDLException.INVALID_WSDL, "IO Error", e);
        }

        // return reader.readWSDL(config.getRootElementNamespaceURI(), doc);
        return reader.readWSDL(config.getRootElementNamespaceURI(), inputSource);
    }

    protected InputStream[] getXSDsFromWSDL(InputStream xsdInputStream) throws Exception {
        Definition defn = readInTheWSDLFile(xsdInputStream);
        List list = defn.getTypes().getExtensibilityElements();

        InputStream[] xsdFragments = new InputStream[list.size()];

        Iterator iterator = list.iterator();
        Schema schemaElement = null;

        for (int count = 0; count < list.size(); ++count) {
            schemaElement = (Schema) iterator.next();
            // System.out.println(" *** - " + element.getElementType().getNamespaceURI());
            // System.out.println(" **** - " + element + " & " + element.getClass().getPackage().getName());
            // System.out.println(DOM2Writer.nodeToString(element.getElement()));
            xsdFragments[count] = new ByteArrayInputStream(DOM2Writer.nodeToString(schemaElement.getElement()).getBytes());
        }

        return xsdFragments;
    }

    protected SchemaTypeSystem processXSDSources() throws Exception {
        SchemaTypeSystem sts = null;
        if (config.getXsdFileName().endsWith(XSD_FILE)) {
            sts = processXSDs(new InputStream[] { config.getXsdInputStream() });
        } else if (config.getXsdFileName().endsWith(WSDL_FILE)) {
            sts = processXSDs(getXSDsFromWSDL(config.getXsdInputStream()));
        }
        return sts;
    }

    protected SchemaTypeSystem processXSDs(InputStream[] inputStreams) {
        List sdocs = new ArrayList();
        for (int i = 0; i < inputStreams.length; i++) {
            try {
                sdocs.add(XmlObject.Factory.parse(inputStreams[i], (new XmlOptions()).setLoadLineNumbers().setLoadMessageDigest()));
            } catch (Exception e) {
                System.err.println("Can not load schema file: " + inputStreams[i] + ": ");
                e.printStackTrace();
            }
        }

        XmlObject[] schemas = (XmlObject[]) sdocs.toArray(new XmlObject[sdocs.size()]);

        SchemaTypeSystem sts = null;
        if (schemas.length > 0) {
            Collection errors = new ArrayList();
            XmlOptions compileOptions = new XmlOptions();
            /*
             * if (dl) compileOptions.setCompileDownloadUrls(); if (nopvr) compileOptions.setCompileNoPvrRule(); if (noupa)
             * compileOptions.setCompileNoUpaRule();
             */
            try {
                sts = XmlBeans.compileXsd(schemas, XmlBeans.getBuiltinTypeSystem(), compileOptions);
            } catch (Exception e) {
                if (errors.isEmpty() || !(e instanceof XmlException))
                    e.printStackTrace();

                System.out.println("Schema compilation errors: ");
                for (Iterator i = errors.iterator(); i.hasNext();)
                    System.out.println(i.next());
            }
        }

        return sts;
    }

    private String makeQName(String nameSpace, String localName) {
        return nameSpace + QNAME_SEPARATOR + localName;
    }

    private String makeQName(QName qName) {
        return qName.getNamespaceURI() + QNAME_SEPARATOR + qName.getLocalPart();
    }

}
TOP

Related Classes of org.apache.tuscany.container.javascript.utils.xmlfromxsd.XBbasedXMLGenerator

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.