001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.midp.jadtool;
028:
029: import java.io.*;
030:
031: import com.sun.midp.util.Properties;
032:
033: /**
034: * A class for writing JAD's. for details see
035: * {@link #write(Properties, OutputStream, String)}
036: */
037: public class JadWriter {
038: /** prevents anyone from instantiating this class */
039: private JadWriter() {
040: };
041:
042: /**
043: * Writes this property list (key and element pairs) in this
044: * <code>Properties</code> table to the output stream in a format suitable
045: * for loading into a <code>Properties</code> table using the
046: * <code>load</code> method.
047: * The stream is written using the character encoding specified by
048: * <code>enc</code>.
049: * <p>
050: * Then every entry in this <code>Properties</code> table is written out,
051: * one per line. For each entry the key string is written, then an ASCII
052: * <code>=</code>, then the associated element string. Each character of
053: * the element string is examined to see whether it should be rendered as
054: * an escape sequence. Characters less than <code>\u0020</code> and
055: * characters greater than <code>\u007E</code> are written as
056: * <code>\u</code><i>xxxx</i> for
057: * the appropriate hexadecimal value <i>xxxx</i>.
058: * <p>
059: * After the entries have been written, the output stream is flushed. The
060: * output stream remains open after this method returns.
061: *
062: * @param out an output stream.
063: * @param enc character encoding used on input stream.
064: * @exception IOException if writing this property list to the specified
065: * output stream throws an <tt>IOException</tt>.
066: * @exception ClassCastException if this <code>Properties</code> object
067: * contains any keys or values that are not
068: * <code>Strings</code>.
069: */
070: public static void write(Properties props, OutputStream out,
071: String enc) throws IOException {
072: OutputStreamWriter awriter;
073: awriter = new OutputStreamWriter(out, enc);
074:
075: // output in order.
076: for (int idx = 0; idx < props.size(); idx++) {
077: String key = props.getKeyAt(idx);
078: String val = props.getValueAt(idx);
079:
080: if (enc.equals("ISO8859_1")) {
081: key = saveConvert(key);
082: val = saveConvert(val);
083: }
084:
085: // don't forget the required space after the ":"
086: writeln(awriter, key + ": " + val);
087: }
088:
089: awriter.flush();
090: }
091:
092: /**
093: * Stores properties to the output stream using the ISO 8859-1
094: * character encoding.
095: *
096: * @see #write(Properties, OutputStream, String)
097: * @param out an output stream.
098: * @exception IOException if writing this property list to the specified
099: * output stream throws an <tt>IOException</tt>.
100: * @exception ClassCastException if this <code>Properties</code>
101: * object contains any keys or values that are not
102: * <code>Strings</code>.
103: */
104: public static void write(Properties props, OutputStream out)
105: throws IOException {
106: write(props, out, "UTF-8");
107: }
108:
109: private static void writeln(OutputStreamWriter ow, String s)
110: throws IOException {
111: ow.write(s);
112: ow.write("\n");
113: }
114:
115: /*
116: * Converts unicodes to encoded \uxxxx
117: * with a preceding slash
118: */
119: private static String saveConvert(String theString) {
120: int len = theString.length();
121: StringBuffer outBuffer = new StringBuffer(len * 2);
122:
123: for (int x = 0; x < len; x++) {
124: char aChar = theString.charAt(x);
125:
126: // don't for get to escape the '/'
127: if ((aChar < 0x0020) || (aChar > 0x007e) || aChar == 0x005c) {
128: outBuffer.append('\\');
129: outBuffer.append('u');
130: outBuffer.append(toHex((aChar >> 12) & 0xF));
131: outBuffer.append(toHex((aChar >> 8) & 0xF));
132: outBuffer.append(toHex((aChar >> 4) & 0xF));
133: outBuffer.append(toHex(aChar & 0xF));
134: continue;
135: }
136:
137: outBuffer.append(aChar);
138: }
139:
140: return outBuffer.toString();
141: }
142:
143: /**
144: * Convert a nibble to a hex character
145: * @param nibble the nibble to convert.
146: * @return a hex digit
147: */
148: private static char toHex(int nibble) {
149: return hexDigit[(nibble & 0xF)];
150: }
151:
152: /** A table of hex digits */
153: private static final char[] hexDigit = { '0', '1', '2', '3', '4',
154: '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
155: }
|