Mercurial > public > ssdtant
diff src/org/ssdt_ohio/tools/ant/WsdlSetup.java @ 2:09f9f3d5c507
CM-127: Move wsdlsetup and wsd2html.xsl from Tools
author | smith@nwoca.org |
---|---|
date | Tue, 07 Jun 2011 18:06:07 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/ssdt_ohio/tools/ant/WsdlSetup.java Tue Jun 07 18:06:07 2011 -0400 @@ -0,0 +1,270 @@ +/* Copyright 2003 Ohio Department of Education, Office of Information Technology, + * 25 South Front St, Columbus, Ohio 43215, U.S.A., All Rights Reserved. + */ +package org.ssdt_ohio.tools.ant; + +import java.io.File; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.util.regex.Pattern; + +/** Simple ant task for maniuplating WSDL settings. + * + * + * @author smith + * @since 2007-8-1 + */ +public class WsdlSetup + extends Task { + + private static final String SCHEMA_NS = "http://www.w3.org/2001/XMLSchema"; + private static final String OECNRPC_NS = "http://xml.ssdt.nwoca.org/OECN-RPC/10"; + private final List locations = new ArrayList(); /* Store locations */ + + private String file; + private String destfile; + private String typesFile; + private String typesPattern = ".*Fault$"; + private boolean elementFormDefaultQualified = true; + + public void execute() { + if (file == null) { + throw new BuildException("must specify 'file' as input file"); + } + + if (destfile == null) { + throw new BuildException("must specify 'destfile' as output file"); + } + + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setNamespaceAware(true); + + Document wsdl = dbf.newDocumentBuilder().parse(new File(getFile())); + NodeList imports = wsdl.getElementsByTagNameNS(SCHEMA_NS, "import"); + + for (int i = 0; i < imports.getLength(); i++) { + replaceLocations((Element) imports.item(i)); + } + + TransformerFactory tFactory = TransformerFactory.newInstance(); + Transformer transformer = tFactory.newTransformer(); + DOMSource source = new DOMSource(wsdl); + StreamResult result = new StreamResult(new File(getDestfile())); + transformer.transform(source, result); + + if (typesFile != null) { + generateTypesSchema(wsdl); + } + } catch (javax.xml.parsers.ParserConfigurationException e) { + throw new BuildException(e); + } catch (org.xml.sax.SAXException e) { + throw new BuildException(e); + } catch (java.io.IOException e) { + throw new BuildException(e); + } catch (javax.xml.transform.TransformerException e) { + throw new BuildException(e); + } + } + + private void replaceLocations(Element imp) { + String ns = imp.getAttribute("namespace"); + + for (Iterator it = locations.iterator(); it.hasNext();) { + SchemaLocation loc = (SchemaLocation) it.next(); + + if (ns.equals(loc.getNamespace())) { + imp.setAttribute("schemaLocation", loc.getLocation()); + } + } + } + + private void generateTypesSchema(Document wsdl) + throws BuildException { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setNamespaceAware(true); + + Document schema = dbf.newDocumentBuilder().newDocument(); + Element root = (Element) wsdl.getElementsByTagNameNS(SCHEMA_NS, + "schema").item(0); + String targetNamespace = root.getAttribute("targetNamespace"); + + schema.appendChild(schema.importNode(root, true)); + root = schema.getDocumentElement(); + root.setAttribute("xmlns:xsd", SCHEMA_NS); + if (isElementFormDefaultQualified()) { + root.setAttribute("elementFormDefault", "qualified"); + } + root.setAttribute("xmlns", targetNamespace); + root.setAttribute("xmlns:oecnrpc", OECNRPC_NS); + + for (Iterator it = locations.iterator(); it.hasNext();) { + SchemaLocation loc = (SchemaLocation) it.next(); + + if (loc.getPrefix() != null) { + root.setAttribute("xmlns:" + loc.getPrefix(), loc.getNamespace()); + } + } + + // Remove everything except the included types. + boolean done = false; + + Pattern typesPat = Pattern.compile(getTypesPattern()); + + while (!done) { + done = true; + + NodeList children = root.getChildNodes(); + + for (int i = 0; i < children.getLength(); i++) { + if (children.item(i).getNodeType() == Node.ELEMENT_NODE) { + Element e = (Element) children.item(i); + + if (!e.getLocalName().equals("import") && !typesPat.matcher(e. + getAttribute("name")).matches()) { + root.removeChild(e); + done = false; + } + } + } + } + TransformerFactory tFactory = TransformerFactory.newInstance(); + Transformer transformer = tFactory.newTransformer(); + + DOMSource source = new DOMSource(schema); + StreamResult result = new StreamResult(new File(getTypesFile())); + transformer.transform(source, result); + } catch (Exception e) { + throw new BuildException(e); + } + } + + public SchemaLocation createSchemaLocation() { + SchemaLocation loc = new SchemaLocation(); + locations.add(loc); + + return loc; + } + + /** + * Getter for property file. + * @return Value of property file. + */ + public java.lang.String getFile() { + return file; + } + + /** + * Setter for property file. + * @param file New value of property file. + */ + public void setFile(java.lang.String file) { + this.file = file; + } + + /** + * Getter for property destfile. + * @return Value of property destfile. + */ + public java.lang.String getDestfile() { + return destfile; + } + + /** + * Setter for property destfile. + * @param destfile New value of property destfile. + */ + public void setDestfile(java.lang.String destfile) { + this.destfile = destfile; + } + + /** + * Getter for property typesFile. + * @return Value of property typesFile. + */ + public java.lang.String getTypesFile() { + return typesFile; + } + + /** + * Setter for property typesFile. + * @param typesFile New value of property typesFile. + */ + public void setTypesFile(java.lang.String typesFile) { + this.typesFile = typesFile; + } + + /** + * @return the elementFormDefaultQualified + */ + public boolean isElementFormDefaultQualified() { + return elementFormDefaultQualified; + } + + /** + * @param elementFormDefaultQualified the elementFormDefaultQualified to set + */ + public void setElementFormDefaultQualified(boolean elementFormDefaultQualified) { + this.elementFormDefaultQualified = elementFormDefaultQualified; + } + + /** A nested 'schemaLocation' object. */ + public class SchemaLocation { + + private String namespace; + private String location; + private String prefix; + + public SchemaLocation() { + } + + public java.lang.String getNamespace() { + return namespace; + } + + public void setNamespace(java.lang.String namespace) { + this.namespace = namespace; + } + + public java.lang.String getLocation() { + return location; + } + + public void setLocation(java.lang.String location) { + this.location = location; + } + + public String getPrefix() { + return prefix; + } + + public void setPrefix(String prefix) { + this.prefix = prefix; + } + } + + public String getTypesPattern() { + return typesPattern; + } + + public void setTypesPattern(String typesPattern) { + this.typesPattern = typesPattern; + } +}