Mercurial > repos > ganjoo > webservice_toolsuite
diff WebServiceToolWorkflow/lib/SAWADLParser/src/edu/uga/cs/lsdis/meteors/wadls/util/xml/DOM2Writer.java @ 0:d5cd409b8a18 default tip
Migrated tool version 1.0.0 from old tool shed archive to new tool shed repository
author | ganjoo |
---|---|
date | Tue, 07 Jun 2011 18:00:50 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebServiceToolWorkflow/lib/SAWADLParser/src/edu/uga/cs/lsdis/meteors/wadls/util/xml/DOM2Writer.java Tue Jun 07 18:00:50 2011 -0400 @@ -0,0 +1,427 @@ +/* + * (c) Copyright IBM Corp 2001, 2005 + */ + +package edu.uga.cs.lsdis.meteors.wadls.util.xml; + +import java.io.*; +import java.util.*; +import org.w3c.dom.*; + +import edu.uga.cs.lsdis.meteors.wadls.*; +import edu.uga.cs.lsdis.meteors.wadls.util.*; + +/** + * This class is a utility to serialize a DOM node as XML. This class + * uses the <code>DOM Level 2</code> APIs. + * The main difference between this class and DOMWriter is that this class + * generates and prints out namespace declarations. + * + * @author Matthew J. Duftler (duftler@us.ibm.com) + * @author Joseph Kesselman + */ +public class DOM2Writer +{ + /** + * The namespaceURI represented by the prefix <code>xmlns</code>. + */ + private static String NS_URI_XMLNS = "http://www.w3.org/2000/xmlns/"; + + /** + * The namespaceURI represented by the prefix <code>xml</code>. + */ + private static String NS_URI_XML = "http://www.w3.org/XML/1998/namespace"; + + private static Map xmlEncodingMap = new HashMap(); + + static + { + xmlEncodingMap.put(null, Constants.XML_DECL_DEFAULT); + xmlEncodingMap.put(System.getProperty("file.encoding"), + Constants.XML_DECL_DEFAULT); + xmlEncodingMap.put("UTF8", "UTF-8"); + xmlEncodingMap.put("UTF-16", "UTF-16"); + xmlEncodingMap.put("UnicodeBig", "UTF-16"); + xmlEncodingMap.put("UnicodeLittle", "UTF-16"); + xmlEncodingMap.put("ASCII", "US-ASCII"); + xmlEncodingMap.put("ISO8859_1", "ISO-8859-1"); + xmlEncodingMap.put("ISO8859_2", "ISO-8859-2"); + xmlEncodingMap.put("ISO8859_3", "ISO-8859-3"); + xmlEncodingMap.put("ISO8859_4", "ISO-8859-4"); + xmlEncodingMap.put("ISO8859_5", "ISO-8859-5"); + xmlEncodingMap.put("ISO8859_6", "ISO-8859-6"); + xmlEncodingMap.put("ISO8859_7", "ISO-8859-7"); + xmlEncodingMap.put("ISO8859_8", "ISO-8859-8"); + xmlEncodingMap.put("ISO8859_9", "ISO-8859-9"); + xmlEncodingMap.put("ISO8859_13", "ISO-8859-13"); + xmlEncodingMap.put("ISO8859_15_FDIS", "ISO-8859-15"); + xmlEncodingMap.put("GBK", "GBK"); + xmlEncodingMap.put("Big5", "Big5"); + } + + /** + * Return a string containing this node serialized as XML. + */ + public static String nodeToString(Node node) + { + StringWriter sw = new StringWriter(); + + serializeAsXML(node, sw); + + return sw.toString(); + } + + + /** + * Print an XML declaration before serializing the element. + */ + public static void serializeElementAsDocument(Element el, Writer writer) + { + PrintWriter pw = new PrintWriter(writer); + String javaEncoding = (writer instanceof OutputStreamWriter) + ? ((OutputStreamWriter) writer).getEncoding() + : null; + + String xmlEncoding = java2XMLEncoding(javaEncoding); + + if (xmlEncoding != null) + { + pw.println(Constants.XML_DECL_START + + xmlEncoding + + Constants.XML_DECL_END); + } + else + { + pw.println("<?xml version=\"1.0\"?>"); + } + + serializeAsXML(el, writer); + } + + /** + * Serialize this node into the writer as XML. + */ + public static void serializeAsXML(Node node, Writer writer) + { + ObjectRegistry namespaceStack = new ObjectRegistry(); + + namespaceStack.register("xml", NS_URI_XML); + + PrintWriter pw = new PrintWriter(writer); + String javaEncoding = (writer instanceof OutputStreamWriter) + ? ((OutputStreamWriter) writer).getEncoding() + : null; + + print(node, namespaceStack, pw, java2XMLEncoding(javaEncoding)); + } + + private static void print(Node node, ObjectRegistry namespaceStack, + PrintWriter out, String xmlEncoding) + { + if (node == null) + { + return; + } + + boolean hasChildren = false; + int type = node.getNodeType(); + + switch (type) + { + case Node.DOCUMENT_NODE : + { + if (xmlEncoding != null) + { + out.println(Constants.XML_DECL_START + + xmlEncoding + + Constants.XML_DECL_END); + } + else + { + out.println("<?xml version=\"1.0\"?>"); + } + + NodeList children = node.getChildNodes(); + + if (children != null) + { + int numChildren = children.getLength(); + + for (int i = 0; i < numChildren; i++) + { + print(children.item(i), namespaceStack, out, xmlEncoding); + } + } + break; + } + + case Node.ELEMENT_NODE : + { + namespaceStack = new ObjectRegistry(namespaceStack); + + out.print('<' + node.getNodeName()); + + String elPrefix = node.getPrefix(); + String elNamespaceURI = node.getNamespaceURI(); + + if (elPrefix != null && elNamespaceURI != null) + { + boolean prefixIsDeclared = false; + + try + { + String namespaceURI = (String)namespaceStack.lookup(elPrefix); + + if (elNamespaceURI.equals(namespaceURI)) + { + prefixIsDeclared = true; + } + } + catch (IllegalArgumentException e) + { + // ignore this and carry on + } + + if (!prefixIsDeclared) + { + printNamespaceDecl(node, namespaceStack, out); + } + } + + NamedNodeMap attrs = node.getAttributes(); + int len = (attrs != null) ? attrs.getLength() : 0; + + for (int i = 0; i < len; i++) + { + Attr attr = (Attr)attrs.item(i); + + out.print(' ' + attr.getNodeName() +"=\"" + + normalize(attr.getValue()) + '\"'); + + String attrPrefix = attr.getPrefix(); + String attrNamespaceURI = attr.getNamespaceURI(); + + if (attrPrefix != null && attrNamespaceURI != null) + { + boolean prefixIsDeclared = false; + + try + { + String namespaceURI = (String)namespaceStack.lookup(attrPrefix); + + if (attrNamespaceURI.equals(namespaceURI)) + { + prefixIsDeclared = true; + } + } + catch (IllegalArgumentException e) + { + // ignore this and carry on + } + + if (!prefixIsDeclared) + { + printNamespaceDecl(attr, namespaceStack, out); + } + } + } + + NodeList children = node.getChildNodes(); + + if (children != null) + { + int numChildren = children.getLength(); + + hasChildren = (numChildren > 0); + + if (hasChildren) + { + out.print('>'); + } + + for (int i = 0; i < numChildren; i++) + { + print(children.item(i), namespaceStack, out, xmlEncoding); + } + } + else + { + hasChildren = false; + } + + if (!hasChildren) + { + out.print("/>"); + } + break; + } + + case Node.ENTITY_REFERENCE_NODE : + { + out.print('&'); + out.print(node.getNodeName()); + out.print(';'); + break; + } + + case Node.CDATA_SECTION_NODE : + { + out.print("<![CDATA["); + out.print(node.getNodeValue()); + out.print("]]>"); + break; + } + + case Node.TEXT_NODE : + { + out.print(normalize(node.getNodeValue())); + break; + } + + case Node.COMMENT_NODE : + { + out.print("<!--"); + out.print(node.getNodeValue()); + out.print("-->"); + break; + } + + case Node.PROCESSING_INSTRUCTION_NODE : + { + out.print("<?"); + out.print(node.getNodeName()); + + String data = node.getNodeValue(); + + if (data != null && data.length() > 0) + { + out.print(' '); + out.print(data); + } + + out.println("?>"); + break; + } + } + + if (type == Node.ELEMENT_NODE && hasChildren == true) + { + out.print("</"); + out.print(node.getNodeName()); + out.print('>'); + hasChildren = false; + } + } + + public static String java2XMLEncoding(String javaEnc) + { + return (String)xmlEncodingMap.get(javaEnc); + } + + + private static void printNamespaceDecl(Node node, + ObjectRegistry namespaceStack, + PrintWriter out) + { + switch (node.getNodeType()) + { + case Node.ATTRIBUTE_NODE : + { + printNamespaceDecl(((Attr)node).getOwnerElement(), node, + namespaceStack, out); + break; + } + + case Node.ELEMENT_NODE : + { + printNamespaceDecl((Element)node, node, namespaceStack, out); + break; + } + } + } + + private static void printNamespaceDecl(Element owner, Node node, + ObjectRegistry namespaceStack, + PrintWriter out) + { + String namespaceURI = node.getNamespaceURI(); + String prefix = node.getPrefix(); + + if (!(namespaceURI.equals(NS_URI_XMLNS) && prefix.equals("xmlns"))) + { + if (DOMUtils.getAttributeNS(owner, NS_URI_XMLNS, prefix) == null) + { + out.print(" xmlns:" + prefix + "=\"" + namespaceURI + '\"'); + } + } + else + { + prefix = node.getLocalName(); + namespaceURI = node.getNodeValue(); + } + + namespaceStack.register(prefix, namespaceURI); + } + + private static String normalize(String s) + { + StringBuffer str = new StringBuffer(); + int len = (s != null) ? s.length() : 0; + + for (int i = 0; i < len; i++) + { + char ch = s.charAt(i); + + switch (ch) + { + case '<' : + { + str.append("<"); + break; + } + case '>' : + { + str.append(">"); + break; + } + case '&' : + { + str.append("&"); + break; + } + case '"' : + { + str.append("""); + break; + } + case '\n' : + { + if (i > 0) + { + char lastChar = str.charAt(str.length() - 1); + + if (lastChar != '\r') + { + str.append(StringUtils.lineSeparator); + } + else + { + str.append('\n'); + } + } + else + { + str.append(StringUtils.lineSeparator); + } + break; + } + default : + { + str.append(ch); + } + } + } + + return (str.toString()); + } +} \ No newline at end of file