Author: scabanovich
Date: 2008-11-10 10:38:24 -0500 (Mon, 10 Nov 2008)
New Revision: 11638
Added:
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/loaders/impl/EncodedProperties.java
Removed:
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/loaders/impl/Properties_.java
Modified:
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/loaders/impl/PropertiesLoader.java
Log:
JBIDE-2601 Properties_.java renamed to EncodedProperties
Copied:
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/loaders/impl/EncodedProperties.java
(from rev 11610,
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/loaders/impl/Properties_.java)
===================================================================
---
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/loaders/impl/EncodedProperties.java
(rev 0)
+++
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/loaders/impl/EncodedProperties.java 2008-11-10
15:38:24 UTC (rev 11638)
@@ -0,0 +1,406 @@
+package org.jboss.tools.common.model.loaders.impl;
+
+import java.io.BufferedWriter;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.Properties;
+
+import org.jboss.tools.common.CommonPlugin;
+
+public class EncodedProperties extends Properties {
+ private static final long serialVersionUID = 4112578634029123456L;
+
+ /**
+ * V.K.
+ */
+ private String encoding = "8859_1";
+
+ /**
+ * Creates an empty property list with no default values.
+ */
+ public EncodedProperties() {
+ this(null);
+ }
+
+ /**
+ * Creates an empty property list with the specified defaults.
+ *
+ * @param defaults the defaults.
+ */
+ public EncodedProperties(EncodedProperties defaults) {
+ super(defaults);
+ }
+
+ /**
+ * V.K
+ * @param encoding
+ */
+ public void setEncoding(String encoding) {
+ this.encoding = encoding;
+ }
+
+ /**
+ *
+ * @param inStream the input stream.
+ * @exception IOException if an error occurred when reading from the
+ * input stream.
+ * @throws IllegalArgumentException if the input stream contains a
+ * malformed Unicode escape sequence.
+ */
+ public synchronized void load(InputStream inStream) throws IOException {
+ char[] convtBuf = new char[1024];
+ LineReader lr = new LineReader(inStream);
+
+ int limit;
+ int keyLen;
+ int valueStart;
+ char c;
+ boolean hasSep;
+ boolean precedingBackslash;
+
+ while ((limit = lr.readLine()) >= 0) {
+ c = 0;
+ keyLen = 0;
+ valueStart = limit;
+ hasSep = false;
+
+ //System.out.println("line=<" + new String(lineBuf, 0, limit) +
">");
+ precedingBackslash = false;
+ while (keyLen < limit) {
+ c = lr.lineBuf[keyLen];
+ //need check if escaped.
+ if ((c == '=' || c == ':') &&
!precedingBackslash) {
+ valueStart = keyLen + 1;
+ hasSep = true;
+ break;
+ } else if ((c == ' ' || c == '\t' || c == '\f')
&& !precedingBackslash) {
+ valueStart = keyLen + 1;
+ break;
+ }
+ if (c == '\\') {
+ precedingBackslash = !precedingBackslash;
+ } else {
+ precedingBackslash = false;
+ }
+ keyLen++;
+ }
+ while (valueStart < limit) {
+ c = lr.lineBuf[valueStart];
+ if (c != ' ' && c != '\t' && c !=
'\f') {
+ if (!hasSep && (c == '=' || c == ':')) {
+ hasSep = true;
+ } else {
+ break;
+ }
+ }
+ valueStart++;
+ }
+ String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf);
+ String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart,
convtBuf);
+ put(key, value);
+ }
+ }
+
+ private String readStream(InputStream is) {
+ StringBuffer sb = new StringBuffer("");
+ try {
+ byte[] b = new byte[4096];
+ while(true) {
+ int l = is.read(b, 0, b.length);
+ if(l < 0) break;
+ sb.append(new String(b, 0, l, encoding));
+ }
+ is.close();
+ } catch (IOException e) {
+ CommonPlugin.getPluginLog().logError(e);
+ }
+ return sb.toString();
+ }
+
+
+ /* read in a "logical line" from input stream, skip all comment and
+ * blank lines and filter out those leading whitespace characters
+ * (\u0020, \u0009 and \u000c) from the beginning of a "natural line".
+ * Method returns the char length of the "logical line" and stores
+ * the line in "lineBuf".
+ */
+ class LineReader {
+ char[] lineBuf = new char[1024];
+ int inOff = 0;
+ int inLimit = 0;
+ String source = null;
+
+ public LineReader(InputStream inStream) {
+ source = readStream(inStream);
+ inLimit = source.length();
+ }
+
+ int readLine() throws IOException {
+ int len = 0;
+ char c = 0;
+
+ boolean skipWhiteSpace = true;
+ boolean isCommentLine = false;
+ boolean isNewLine = true;
+ boolean appendedLineBegin = false;
+ boolean precedingBackslash = false;
+ boolean skipLF = false;
+
+ while (true) {
+ if (inOff >= inLimit) {
+ if (len == 0 || isCommentLine) {
+ return -1;
+ }
+ return len;
+ }
+
+ //V.K.
+ c = source.charAt(inOff++);
+
+ if (skipLF) {
+ skipLF = false;
+ if (c == '\n') {
+ continue;
+ }
+ }
+ if (skipWhiteSpace) {
+ if (c == ' ' || c == '\t' || c == '\f') {
+ continue;
+ }
+ if (!appendedLineBegin && (c == '\r' || c == '\n')) {
+ continue;
+ }
+ skipWhiteSpace = false;
+ appendedLineBegin = false;
+ }
+ if (isNewLine) {
+ isNewLine = false;
+ if (c == '#' || c == '!') {
+ isCommentLine = true;
+ continue;
+ }
+ }
+
+ if (c != '\n' && c != '\r') {
+ lineBuf[len++] = c;
+ if (len == lineBuf.length) {
+ int newLength = lineBuf.length * 2;
+ if (newLength < 0) {
+ newLength = Integer.MAX_VALUE;
+ }
+ char[] buf = new char[newLength];
+ System.arraycopy(lineBuf, 0, buf, 0, lineBuf.length);
+ lineBuf = buf;
+ }
+ //flip the preceding backslash flag
+ if (c == '\\') {
+ precedingBackslash = !precedingBackslash;
+ } else {
+ precedingBackslash = false;
+ }
+ } else {
+ // reached EOL
+ if (isCommentLine || len == 0) {
+ isCommentLine = false;
+ isNewLine = true;
+ skipWhiteSpace = true;
+ len = 0;
+ continue;
+ }
+ if (inOff >= inLimit) {
+ return len;
+ }
+ if (precedingBackslash) {
+ len -= 1;
+ //skip the leading whitespace characters in following line
+ skipWhiteSpace = true;
+ appendedLineBegin = true;
+ precedingBackslash = false;
+ if (c == '\r') {
+ skipLF = true;
+ }
+ } else {
+ return len;
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * Converts encoded \uxxxx to unicode chars
+ * and changes special saved chars to their original forms
+ */
+ private String loadConvert (char[] in, int off, int len, char[] convtBuf) {
+ if (convtBuf.length < len) {
+ int newLen = len * 2;
+ if (newLen < 0) {
+ newLen = Integer.MAX_VALUE;
+ }
+ convtBuf = new char[newLen];
+ }
+ char aChar;
+ char[] out = convtBuf;
+ int outLen = 0;
+ int end = off + len;
+
+ while (off < end) {
+ aChar = in[off++];
+ if (aChar == '\\') {
+ aChar = in[off++];
+ if(aChar == 'u') {
+ // Read the xxxx
+ int value=0;
+ for (int i=0; i<4; i++) {
+ aChar = in[off++];
+ switch (aChar) {
+ case '0': case '1': case '2': case '3': case
'4':
+ case '5': case '6': case '7': case '8': case
'9':
+ value = (value << 4) + aChar - '0';
+ break;
+ case 'a': case 'b': case 'c':
+ case 'd': case 'e': case 'f':
+ value = (value << 4) + 10 + aChar - 'a';
+ break;
+ case 'A': case 'B': case 'C':
+ case 'D': case 'E': case 'F':
+ value = (value << 4) + 10 + aChar - 'A';
+ break;
+ default:
+ throw new IllegalArgumentException(
+ "Malformed \\uxxxx encoding.");
+ }
+ }
+ out[outLen++] = (char)value;
+ } else {
+ if (aChar == 't') aChar = '\t';
+ else if (aChar == 'r') aChar = '\r';
+ else if (aChar == 'n') aChar = '\n';
+ else if (aChar == 'f') aChar = '\f';
+ out[outLen++] = aChar;
+ }
+ } else {
+ out[outLen++] = (char)aChar;
+ }
+ }
+ return new String (out, 0, outLen);
+ }
+
+ /*
+ * Converts unicodes to encoded \uxxxx and escapes
+ * special characters with a preceding slash
+ */
+ public static String saveConvert(String theString, boolean escapeSpace) {
+ int len = theString.length();
+ int bufLen = len * 2;
+ if (bufLen < 0) {
+ bufLen = Integer.MAX_VALUE;
+ }
+ StringBuffer outBuffer = new StringBuffer(bufLen);
+
+ for(int x=0; x<len; x++) {
+ char aChar = theString.charAt(x);
+ // Handle common case first, selecting largest block that
+ // avoids the specials below
+ if ((aChar > 61) && (aChar < 127)) {
+ if (aChar == '\\') {
+ outBuffer.append('\\'); outBuffer.append('\\');
+ continue;
+ }
+ outBuffer.append(aChar);
+ continue;
+ }
+ switch(aChar) {
+ case ' ':
+ if (x == 0 || escapeSpace)
+ outBuffer.append('\\');
+ outBuffer.append(' ');
+ break;
+ case '\t':outBuffer.append('\\');
outBuffer.append('t');
+ break;
+ case '\n':outBuffer.append('\\');
outBuffer.append('n');
+ break;
+ case '\r':outBuffer.append('\\');
outBuffer.append('r');
+ break;
+ case '\f':outBuffer.append('\\');
outBuffer.append('f');
+ break;
+ case '=': // Fall through
+ case ':': // Fall through
+ case '#': // Fall through
+ case '!':
+ outBuffer.append('\\'); outBuffer.append(aChar);
+ break;
+ default:
+ if ((aChar < 0x0020) || (aChar > 0x007e)) {
+ outBuffer.append('\\');
+ outBuffer.append('u');
+ outBuffer.append(toHex((aChar >> 12) & 0xF));
+ outBuffer.append(toHex((aChar >> 8) & 0xF));
+ outBuffer.append(toHex((aChar >> 4) & 0xF));
+ outBuffer.append(toHex( aChar & 0xF));
+ } else {
+ outBuffer.append(aChar);
+ }
+ }
+ }
+ return outBuffer.toString();
+ }
+
+ public synchronized void store(OutputStream out, String comments)
+ throws IOException
+ {
+ BufferedWriter awriter;
+ awriter = new BufferedWriter(new OutputStreamWriter(out, encoding));
+ if (comments != null)
+ writeln(awriter, "#" + comments);
+ writeln(awriter, "#" + new Date().toString());
+ for (Enumeration e = keys(); e.hasMoreElements();) {
+ String key = (String)e.nextElement();
+ String val = (String)get(key);
+ key = saveConvert(key, true);
+
+ /* No need to escape embedded and trailing spaces for value, hence
+ * pass false to flag.
+ */
+ val = saveConvert(val, false);
+ writeln(awriter, key + "=" + val);
+ }
+ awriter.flush();
+ }
+
+ private static void writeln(BufferedWriter bw, String s) throws IOException {
+ bw.write(s);
+ bw.newLine();
+ }
+
+ /**
+ * Convert a nibble to a hex character
+ * @param nibble the nibble to convert.
+ */
+ private static char toHex(int nibble) {
+ return hexDigit[(nibble & 0xF)];
+ }
+
+ /** A table of hex digits */
+ private static final char[] hexDigit = {
+ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
+ };
+
+ public static void main(String[] args) {
+ String ps = "p1:v1 \\\n hh \\\n gg\n\np2=v2\\u0034\\u0055";
+ EncodedProperties p = new EncodedProperties();
+ ByteArrayInputStream s = new ByteArrayInputStream(ps.getBytes());
+ try {
+ p.load(s);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ p.list(System.out);
+ }
+
+}
Modified:
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/loaders/impl/PropertiesLoader.java
===================================================================
---
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/loaders/impl/PropertiesLoader.java 2008-11-10
15:37:05 UTC (rev 11637)
+++
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/loaders/impl/PropertiesLoader.java 2008-11-10
15:38:24 UTC (rev 11638)
@@ -49,7 +49,7 @@
object.setAttributeValue("encoding", encoding);
String body = XModelObjectLoaderUtil.getTempBody(object);
- Properties_ properties = new Properties_();
+ EncodedProperties properties = new EncodedProperties();
properties.setEncoding(encoding);
Properties mapping = new Properties();
try {
@@ -58,7 +58,7 @@
Iterator it = properties.keySet().iterator();
while(it.hasNext()) {
String nm = it.next().toString();
- String sn = Properties_.saveConvert(nm, true); // convertName(nm);
+ String sn = EncodedProperties.saveConvert(nm, true); // convertName(nm);
mapping.put(sn, nm);
}
} catch (IOException e) {
@@ -182,11 +182,11 @@
appendComments(sb, cs[i].get("COMMENTS"), cs[i].get("SEPARATOR"),
lineSeparator);
if("no".equals(cs[i].get("ENABLED"))) sb.append('#');
String dirtyname = cs[i].getAttributeValue("dirtyname");
- String name = Properties_.saveConvert(cs[i].get("NAME"), true); //
convertName(cs[i].get("NAME"));
+ String name = EncodedProperties.saveConvert(cs[i].get("NAME"), true); //
convertName(cs[i].get("NAME"));
String value = cs[i].get("VALUE");
String dirtyvalue = cs[i].getAttributeValue("dirtyvalue");
if(value == null || dirtyvalue == null || !value.equals(dirtyvalue.trim())) {
- value = Properties_.saveConvert(value, false); // convertValue(value);
+ value = EncodedProperties.saveConvert(value, false); // convertValue(value);
}
String resolved = resolveValue(value, dirtyvalue);
//preserve one white space after separator
Deleted:
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/loaders/impl/Properties_.java
===================================================================
---
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/loaders/impl/Properties_.java 2008-11-10
15:37:05 UTC (rev 11637)
+++
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/loaders/impl/Properties_.java 2008-11-10
15:38:24 UTC (rev 11638)
@@ -1,406 +0,0 @@
-package org.jboss.tools.common.model.loaders.impl;
-
-import java.io.BufferedWriter;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.Properties;
-
-import org.jboss.tools.common.CommonPlugin;
-
-public class Properties_ extends Properties {
- private static final long serialVersionUID = 4112578634029123456L;
-
- /**
- * V.K.
- */
- private String encoding = "8859_1";
-
- /**
- * Creates an empty property list with no default values.
- */
- public Properties_() {
- this(null);
- }
-
- /**
- * Creates an empty property list with the specified defaults.
- *
- * @param defaults the defaults.
- */
- public Properties_(Properties_ defaults) {
- super(defaults);
- }
-
- /**
- * V.K
- * @param encoding
- */
- public void setEncoding(String encoding) {
- this.encoding = encoding;
- }
-
- /**
- *
- * @param inStream the input stream.
- * @exception IOException if an error occurred when reading from the
- * input stream.
- * @throws IllegalArgumentException if the input stream contains a
- * malformed Unicode escape sequence.
- */
- public synchronized void load(InputStream inStream) throws IOException {
- char[] convtBuf = new char[1024];
- LineReader lr = new LineReader(inStream);
-
- int limit;
- int keyLen;
- int valueStart;
- char c;
- boolean hasSep;
- boolean precedingBackslash;
-
- while ((limit = lr.readLine()) >= 0) {
- c = 0;
- keyLen = 0;
- valueStart = limit;
- hasSep = false;
-
- //System.out.println("line=<" + new String(lineBuf, 0, limit) +
">");
- precedingBackslash = false;
- while (keyLen < limit) {
- c = lr.lineBuf[keyLen];
- //need check if escaped.
- if ((c == '=' || c == ':') &&
!precedingBackslash) {
- valueStart = keyLen + 1;
- hasSep = true;
- break;
- } else if ((c == ' ' || c == '\t' || c == '\f')
&& !precedingBackslash) {
- valueStart = keyLen + 1;
- break;
- }
- if (c == '\\') {
- precedingBackslash = !precedingBackslash;
- } else {
- precedingBackslash = false;
- }
- keyLen++;
- }
- while (valueStart < limit) {
- c = lr.lineBuf[valueStart];
- if (c != ' ' && c != '\t' && c !=
'\f') {
- if (!hasSep && (c == '=' || c == ':')) {
- hasSep = true;
- } else {
- break;
- }
- }
- valueStart++;
- }
- String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf);
- String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart,
convtBuf);
- put(key, value);
- }
- }
-
- private String readStream(InputStream is) {
- StringBuffer sb = new StringBuffer("");
- try {
- byte[] b = new byte[4096];
- while(true) {
- int l = is.read(b, 0, b.length);
- if(l < 0) break;
- sb.append(new String(b, 0, l, encoding));
- }
- is.close();
- } catch (IOException e) {
- CommonPlugin.getPluginLog().logError(e);
- }
- return sb.toString();
- }
-
-
- /* read in a "logical line" from input stream, skip all comment and
- * blank lines and filter out those leading whitespace characters
- * (\u0020, \u0009 and \u000c) from the beginning of a "natural line".
- * Method returns the char length of the "logical line" and stores
- * the line in "lineBuf".
- */
- class LineReader {
- char[] lineBuf = new char[1024];
- int inOff = 0;
- int inLimit = 0;
- String source = null;
-
- public LineReader(InputStream inStream) {
- source = readStream(inStream);
- inLimit = source.length();
- }
-
- int readLine() throws IOException {
- int len = 0;
- char c = 0;
-
- boolean skipWhiteSpace = true;
- boolean isCommentLine = false;
- boolean isNewLine = true;
- boolean appendedLineBegin = false;
- boolean precedingBackslash = false;
- boolean skipLF = false;
-
- while (true) {
- if (inOff >= inLimit) {
- if (len == 0 || isCommentLine) {
- return -1;
- }
- return len;
- }
-
- //V.K.
- c = source.charAt(inOff++);
-
- if (skipLF) {
- skipLF = false;
- if (c == '\n') {
- continue;
- }
- }
- if (skipWhiteSpace) {
- if (c == ' ' || c == '\t' || c == '\f') {
- continue;
- }
- if (!appendedLineBegin && (c == '\r' || c == '\n')) {
- continue;
- }
- skipWhiteSpace = false;
- appendedLineBegin = false;
- }
- if (isNewLine) {
- isNewLine = false;
- if (c == '#' || c == '!') {
- isCommentLine = true;
- continue;
- }
- }
-
- if (c != '\n' && c != '\r') {
- lineBuf[len++] = c;
- if (len == lineBuf.length) {
- int newLength = lineBuf.length * 2;
- if (newLength < 0) {
- newLength = Integer.MAX_VALUE;
- }
- char[] buf = new char[newLength];
- System.arraycopy(lineBuf, 0, buf, 0, lineBuf.length);
- lineBuf = buf;
- }
- //flip the preceding backslash flag
- if (c == '\\') {
- precedingBackslash = !precedingBackslash;
- } else {
- precedingBackslash = false;
- }
- } else {
- // reached EOL
- if (isCommentLine || len == 0) {
- isCommentLine = false;
- isNewLine = true;
- skipWhiteSpace = true;
- len = 0;
- continue;
- }
- if (inOff >= inLimit) {
- return len;
- }
- if (precedingBackslash) {
- len -= 1;
- //skip the leading whitespace characters in following line
- skipWhiteSpace = true;
- appendedLineBegin = true;
- precedingBackslash = false;
- if (c == '\r') {
- skipLF = true;
- }
- } else {
- return len;
- }
- }
- }
- }
- }
-
- /*
- * Converts encoded \uxxxx to unicode chars
- * and changes special saved chars to their original forms
- */
- private String loadConvert (char[] in, int off, int len, char[] convtBuf) {
- if (convtBuf.length < len) {
- int newLen = len * 2;
- if (newLen < 0) {
- newLen = Integer.MAX_VALUE;
- }
- convtBuf = new char[newLen];
- }
- char aChar;
- char[] out = convtBuf;
- int outLen = 0;
- int end = off + len;
-
- while (off < end) {
- aChar = in[off++];
- if (aChar == '\\') {
- aChar = in[off++];
- if(aChar == 'u') {
- // Read the xxxx
- int value=0;
- for (int i=0; i<4; i++) {
- aChar = in[off++];
- switch (aChar) {
- case '0': case '1': case '2': case '3': case
'4':
- case '5': case '6': case '7': case '8': case
'9':
- value = (value << 4) + aChar - '0';
- break;
- case 'a': case 'b': case 'c':
- case 'd': case 'e': case 'f':
- value = (value << 4) + 10 + aChar - 'a';
- break;
- case 'A': case 'B': case 'C':
- case 'D': case 'E': case 'F':
- value = (value << 4) + 10 + aChar - 'A';
- break;
- default:
- throw new IllegalArgumentException(
- "Malformed \\uxxxx encoding.");
- }
- }
- out[outLen++] = (char)value;
- } else {
- if (aChar == 't') aChar = '\t';
- else if (aChar == 'r') aChar = '\r';
- else if (aChar == 'n') aChar = '\n';
- else if (aChar == 'f') aChar = '\f';
- out[outLen++] = aChar;
- }
- } else {
- out[outLen++] = (char)aChar;
- }
- }
- return new String (out, 0, outLen);
- }
-
- /*
- * Converts unicodes to encoded \uxxxx and escapes
- * special characters with a preceding slash
- */
- public static String saveConvert(String theString, boolean escapeSpace) {
- int len = theString.length();
- int bufLen = len * 2;
- if (bufLen < 0) {
- bufLen = Integer.MAX_VALUE;
- }
- StringBuffer outBuffer = new StringBuffer(bufLen);
-
- for(int x=0; x<len; x++) {
- char aChar = theString.charAt(x);
- // Handle common case first, selecting largest block that
- // avoids the specials below
- if ((aChar > 61) && (aChar < 127)) {
- if (aChar == '\\') {
- outBuffer.append('\\'); outBuffer.append('\\');
- continue;
- }
- outBuffer.append(aChar);
- continue;
- }
- switch(aChar) {
- case ' ':
- if (x == 0 || escapeSpace)
- outBuffer.append('\\');
- outBuffer.append(' ');
- break;
- case '\t':outBuffer.append('\\');
outBuffer.append('t');
- break;
- case '\n':outBuffer.append('\\');
outBuffer.append('n');
- break;
- case '\r':outBuffer.append('\\');
outBuffer.append('r');
- break;
- case '\f':outBuffer.append('\\');
outBuffer.append('f');
- break;
- case '=': // Fall through
- case ':': // Fall through
- case '#': // Fall through
- case '!':
- outBuffer.append('\\'); outBuffer.append(aChar);
- break;
- default:
- if ((aChar < 0x0020) || (aChar > 0x007e)) {
- outBuffer.append('\\');
- outBuffer.append('u');
- outBuffer.append(toHex((aChar >> 12) & 0xF));
- outBuffer.append(toHex((aChar >> 8) & 0xF));
- outBuffer.append(toHex((aChar >> 4) & 0xF));
- outBuffer.append(toHex( aChar & 0xF));
- } else {
- outBuffer.append(aChar);
- }
- }
- }
- return outBuffer.toString();
- }
-
- public synchronized void store(OutputStream out, String comments)
- throws IOException
- {
- BufferedWriter awriter;
- awriter = new BufferedWriter(new OutputStreamWriter(out, encoding));
- if (comments != null)
- writeln(awriter, "#" + comments);
- writeln(awriter, "#" + new Date().toString());
- for (Enumeration e = keys(); e.hasMoreElements();) {
- String key = (String)e.nextElement();
- String val = (String)get(key);
- key = saveConvert(key, true);
-
- /* No need to escape embedded and trailing spaces for value, hence
- * pass false to flag.
- */
- val = saveConvert(val, false);
- writeln(awriter, key + "=" + val);
- }
- awriter.flush();
- }
-
- private static void writeln(BufferedWriter bw, String s) throws IOException {
- bw.write(s);
- bw.newLine();
- }
-
- /**
- * Convert a nibble to a hex character
- * @param nibble the nibble to convert.
- */
- private static char toHex(int nibble) {
- return hexDigit[(nibble & 0xF)];
- }
-
- /** A table of hex digits */
- private static final char[] hexDigit = {
- '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
- };
-
- public static void main(String[] args) {
- String ps = "p1:v1 \\\n hh \\\n gg\n\np2=v2\\u0034\\u0055";
- Properties_ p = new Properties_();
- ByteArrayInputStream s = new ByteArrayInputStream(ps.getBytes());
- try {
- p.load(s);
- } catch (IOException e) {
- e.printStackTrace();
- }
- p.list(System.out);
- }
-
-}