/* =========================================================== * TradeManager : a application to trade strategies for the Java(tm) platform * =========================================================== * * (C) Copyright 2011-2011, by Simon Allen and Contributors. * * Project Info: org.trade * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Oracle, Inc. * in the United States and other countries.] * * (C) Copyright 2011-2011, by Simon Allen and Contributors. * * Original Author: Simon Allen; * Contributor(s): -; * * Changes * ------- * */ package org.trade.ui.base; import java.io.FileWriter; import java.io.IOException; import java.io.UnsupportedEncodingException; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * A sample DOM writer. This sample program illustrates how to traverse a DOM * tree in order to print a document that is parsed. * * @version $Id: DOMWriter.java,v 1.1 2002/01/03 18:20:45 simon Exp $ * @author Simon Allen */ public class DOMWriter { // // Constants // /** Default parser name. */ // private static final String DEFAULT_PARSER_NAME = // "org.apache.xerces.parsers.DOMParser"; // private static boolean setValidation = false; // defaults // private static boolean setNameSpaces = true; // private static boolean setSchemaSupport = true; // private static boolean setDeferredDOM = true; // // Data // /** Default Encoding */ private static String PRINTWRITER_ENCODING = "UTF8"; /* * private static String MIME2JAVA_ENCODINGS[] = { "Default", "UTF-8", * "US-ASCII", "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4", * "ISO-8859-5", "ISO-8859-6", "ISO-8859-7", "ISO-8859-8", "ISO-8859-9", * "ISO-2022-JP", "SHIFT_JIS", "EUC-JP", "GB2312", "BIG5", "EUC-KR", * "ISO-2022-KR", "KOI8-R", "EBCDIC-CP-US", "EBCDIC-CP-CA", "EBCDIC-CP-NL", * "EBCDIC-CP-DK", "EBCDIC-CP-NO", "EBCDIC-CP-FI", "EBCDIC-CP-SE", * "EBCDIC-CP-IT", "EBCDIC-CP-ES", "EBCDIC-CP-GB", "EBCDIC-CP-FR", * "EBCDIC-CP-AR1", "EBCDIC-CP-HE", "EBCDIC-CP-CH", "EBCDIC-CP-ROECE", * "EBCDIC-CP-YU", "EBCDIC-CP-IS", "EBCDIC-CP-AR2", "UTF-16" }; * * * private static String JAVA_SUPPORTED_ENCODINGS[] = { "Default", "8859_1", * "8859_2", "8859_3", "8859_4", "8859_5", "8859_6", "8859_7", "8859_8", * "8859_9", "Cp037", "Cp273", "Cp277", "Cp278", "Cp280", "Cp284", "Cp285", * "Cp297", "Cp420", "Cp424", "Cp437", "Cp500", "Cp737", "Cp775", "Cp838", * "Cp850", "Cp852", "Cp855", "Cp856", "Cp857", "Cp860", "Cp861", "Cp862", * "Cp863", "Cp864", "Cp865", "Cp866", "Cp868", "Cp869", "Cp870", "Cp871", * "Cp874", "Cp875", "Cp918", "Cp921", "Cp922", "Cp930", "Cp933", "Cp935", * "Cp937", "Cp939", "Cp942", "Cp948", "Cp949", "Cp950", "Cp964", "Cp970", * "Cp1006", "Cp1025", "Cp1026", "Cp1046", "Cp1097", "Cp1098", "Cp1112", * "Cp1122", "Cp1123", "Cp1124", "Cp1250", "Cp1251", "Cp1252", "Cp1253", * "Cp1254", "Cp1255", "Cp1256", "Cp1257", "Cp1258", "Cp1381", "Cp1383", * "Cp33722", "MS874", "EUCJIS", "GB2312", "GBK", "ISO2022CN_CNS", * "ISO2022CN_GB", "JIS", "JIS0208", "KOI8_R", "KSC5601","MS874", "SJIS", * "Big5", "CNS11643", "MacArabic", "MacCentralEurope", "MacCroatian", * "MacCyrillic", "MacDingbat", "MacGreek", "MacHebrew", "MacIceland", * "MacRoman", "MacRomania", "MacSymbol", "MacThai", "MacTurkish", * "MacUkraine", "SJIS", "Unicode", "UnicodeBig", "UnicodeLittle", "UTF8"}; */ /** Print writer. */ // protected PrintWriter m_out = null; protected FileWriter m_out = null; /** Canonical output. */ protected boolean m_canonical = false; // // Constructors // /** Default constructor. */ public DOMWriter() { } /** * Method printDocument. * * @param encoding * String * @param canonical * boolean * @param fileName * String * @param doc * Node * @throws UnsupportedEncodingException * @throws IOException */ public void printDocument(String encoding, boolean canonical, String fileName, Node doc) throws UnsupportedEncodingException, IOException { m_out = new FileWriter(fileName); m_canonical = canonical; if (null != encoding) { DOMWriter.setWriterEncoding(encoding); } print(doc); m_out.close(); } // getWriterEncoding /** * Method getWriterEncoding. * * @return String */ private static String getWriterEncoding() { return (PRINTWRITER_ENCODING); } // getWriterEncoding /** * Method setWriterEncoding. * * @param encoding * String */ private static void setWriterEncoding(String encoding) { if (encoding.equalsIgnoreCase("DEFAULT")) { PRINTWRITER_ENCODING = "UTF8"; } else if (encoding.equalsIgnoreCase("UTF-16")) { PRINTWRITER_ENCODING = "Unicode"; } } // setWriterEncoding /* * private static boolean isValidJavaEncoding(String encoding) { for (int i * = 0; i < MIME2JAVA_ENCODINGS.length; i++) { if * (encoding.equals(MIME2JAVA_ENCODINGS[i])) { return (true); } } * * return (false); } // isValidJavaEncoding */ /** * Prints the specified node, recursively. * @param node Node * * @throws IOException */ private void print(Node node) throws IOException { // is there anything to do? if (node == null) { return; } int type = node.getNodeType(); switch (type) { // print document case Node.DOCUMENT_NODE: { if (!m_canonical) { String Encoding = DOMWriter.getWriterEncoding(); if (Encoding.equalsIgnoreCase("DEFAULT")) { Encoding = "UTF-8"; } else if (Encoding.equalsIgnoreCase("Unicode")) { Encoding = "UTF-16"; } m_out.write("<?xml version=\"1.0\" encoding=\"" + Encoding + "\"?>"); } print(((Document) node).getDocumentElement()); m_out.flush(); break; } // print element with attributes case Node.ELEMENT_NODE: { m_out.write('<'); m_out.write(node.getNodeName()); Attr attrs[] = sortAttributes(node.getAttributes()); for (Attr attr : attrs) { m_out.write(' '); m_out.write(attr.getNodeName()); m_out.write("=\""); m_out.write(normalize(attr.getNodeValue())); m_out.write('"'); } m_out.write('>'); NodeList children = node.getChildNodes(); if (children != null) { int len = children.getLength(); for (int i = 0; i < len; i++) { print(children.item(i)); } } break; } // handle entity reference nodes case Node.ENTITY_REFERENCE_NODE: { if (m_canonical) { NodeList children = node.getChildNodes(); if (children != null) { int len = children.getLength(); for (int i = 0; i < len; i++) { print(children.item(i)); } } } else { m_out.write('&'); m_out.write(node.getNodeName()); m_out.write(';'); } break; } // print cdata sections case Node.CDATA_SECTION_NODE: { if (m_canonical) { m_out.write(normalize(node.getNodeValue())); } else { m_out.write("<![CDATA["); m_out.write(node.getNodeValue()); m_out.write("]]>"); } break; } // print text case Node.TEXT_NODE: { m_out.write(normalize(node.getNodeValue())); break; } // print processing instruction case Node.PROCESSING_INSTRUCTION_NODE: { m_out.write("<?"); m_out.write(node.getNodeName()); String data = node.getNodeValue(); if ((data != null) && (data.length() > 0)) { m_out.write(' '); m_out.write(data); } m_out.write("?>"); break; } } if (type == Node.ELEMENT_NODE) { m_out.write("</"); m_out.write(node.getNodeName()); m_out.write('>'); } m_out.flush(); } // print(Node) /** * Returns a sorted list of attributes. * @param attrs NamedNodeMap * * @return Attr[] */ protected Attr[] sortAttributes(NamedNodeMap attrs) { int len = (attrs != null) ? attrs.getLength() : 0; Attr array[] = new Attr[len]; for (int i = 0; i < len; i++) { array[i] = (Attr) attrs.item(i); } for (int i = 0; i < (len - 1); i++) { String name = array[i].getNodeName(); int index = i; for (int j = i + 1; j < len; j++) { String curName = array[j].getNodeName(); if (curName.compareTo(name) < 0) { name = curName; index = j; } } if (index != i) { Attr temp = array[i]; array[i] = array[index]; array[index] = temp; } } return (array); } // sortAttributes(NamedNodeMap):Attr[] // // Main // /** * Main program entry point. * @param s String * * @return String */ /* * public static void main(String argv[]) { * * argopt.setUsage( new String[] { "usage: java dom.DOMWriter (options) uri * ...","", "options:", " -n | -N Turn on/off namespace [default=on]", " -v * | -V Turn on/off validation [default=on]", " -s | -S Turn on/off Schema * support [default=on]", " -d | -D Turn on/off deferred DOM [default=on] * ", " -c Canonical XML output.", " -h This help screen.", " -e Output Java * Encoding.", " Default encoding: UTF-8"} ); * * // is there anything to do? if ( argv.length == 0 ) { * argopt.printUsage(); System.exit(1); } // vars String parserName = * DEFAULT_PARSER_NAME; boolean canonical = false; String encoding = "UTF8"; * // default encoding * * argopt.parseArgumentTokens(argv, new char[] { 'p', 'e'} ); * * int c; String arg = null; while ( ( arg = argopt.getlistFiles() ) != null * ) { * * outer: while ( (c = argopt.getArguments()) != -1 ){ switch (c) { case * 'c': canonical = true; break; case 'e': encoding = * argopt.getStringParameter(); if ( encoding != null && * isValidJavaEncoding( encoding ) ) setWriterEncoding( encoding ); else { * printValidJavaEncoding(); System.exit( 1 ); } break; case 'v': * setValidation = true; break; case 'V': setValidation = false; break; case * 'N': setNameSpaces = false; break; case 'n': setNameSpaces = true; break; * case 'p': parserName = argopt.getStringParameter(); break; case 'd': * setDeferredDOM = true; break; case 'D': setDeferredDOM = false; break; * case 's': setSchemaSupport = true; break; case 'S': setSchemaSupport = * false; break; case '?': case 'h': case '-': argopt.printUsage(); * System.exit(1); break; case -1: break outer; default: break; } } * * * print(parserName, arg, canonical ); } } // main(String[]) */ /** Normalizes the given string. */ protected 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 '\r': case '\n': { if (m_canonical) { str.append("&#"); str.append(Integer.toString(ch)); str.append(';'); break; } // else, default append char } default: { str.append(ch); } } } return (str.toString()); } // normalize(String):String /* * private static void printValidJavaEncoding() { System.err.println( * " ENCODINGS:"); System.err.print(" "); * * for (int i = 0; i < MIME2JAVA_ENCODINGS.length; i++) { * System.err.print(MIME2JAVA_ENCODINGS[i] + " "); * * if ((i % 7) == 0) { System.err.println(); System.err.print(" "); } } } * // printJavaEncoding() */ }