/* * 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 generateXmlAll() throws Exception { Hashtable xmlInstances = new Hashtable(); 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(); } }