You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@harmony.apache.org by Mark Hindess <ma...@googlemail.com> on 2010/07/07 09:15:20 UTC

Re: svn commit: r958912 - in /harmony/enhanced/java/trunk/classlib/modules/luni/src: main/java/java/util/Properties.java test/api/common/org/apache/harmony/luni/tests/java/util/PropertiesTest.java

Kevin,

During the merge to java6 I did a --record-only merge (which just
updates the metadata to say that it is complete but changes nothing)
for this commit on the assumption that the changes were already made in
r958904.  If that is not correct - i.e. there is work missing - then please
make a commit with the missing changes.

Thanks,
 Mark.


In message <20...@eris.apache.org>, zhoukevin@apache.org 
writes:
>
> Author: zhoukevin
> Date: Tue Jun 29 10:14:01 2010
> New Revision: 958912
> 
> URL: http://svn.apache.org/viewvc?rev=958912&view=rev
> Log:
> As to java.util.Properties.store(os, comments) method, if the comments argume
> nt is not null, then '#' character and a line separator are first written to 
> the output stream. Thus, the comments can serve as an identifying comment. An
> y '\n', '\r' or "\r\n" in comments is replaced by a line separator generated 
> by the Writer and if the next character in comments is not character # or cha
> racter ! then an ASCII # is written out after that line separator.
> This patch fixes the above issue. In addition, it includes several test cases
>  for coverage.
> 
> Modified:
>     harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/util
> /Properties.java
>     harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org
> /apache/harmony/luni/tests/java/util/PropertiesTest.java
> 
> Modified: harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/jav
> a/util/Properties.java
> URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/module
> s/luni/src/main/java/java/util/Properties.java?rev=958912&r1=958911&r2=958912
> &view=diff
> =============================================================================
> =
> --- harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/util
> /Properties.java (original)
> +++ harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/util
> /Properties.java Tue Jun 29 10:14:01 2010
> @@ -25,6 +25,7 @@ import java.io.OutputStreamWriter;
>  import java.io.PrintStream;
>  import java.io.PrintWriter;
>  import java.io.StringReader;
> +import java.io.Writer;
>  import java.nio.charset.Charset;
>  import java.nio.charset.IllegalCharsetNameException;
>  import java.nio.charset.UnsupportedCharsetException;
> @@ -97,15 +98,15 @@ public class Properties extends Hashtabl
>          defaults = properties;
>      }
>  
> -    private void dumpString(StringBuilder buffer, String string, boolean key
> ) {
> -        int i = 0;
> -        if (!key && i < string.length() && string.charAt(i) == ' ') {
> +    private void dumpString(StringBuilder buffer, String string, boolean isK
> ey) {
> +        int index = 0, length = string.length();
> +        if (!isKey && index < length && string.charAt(index) == ' ') {
>              buffer.append("\\ "); //$NON-NLS-1$
> -            i++;
> +            index++;
>          }
>  
> -        for (; i < string.length(); i++) {
> -            char ch = string.charAt(i);
> +        for (; index < length; index++) {
> +            char ch = string.charAt(index);
>              switch (ch) {
>              case '\t':
>                  buffer.append("\\t"); //$NON-NLS-1$
> @@ -120,23 +121,33 @@ public class Properties extends Hashtabl
>                  buffer.append("\\r"); //$NON-NLS-1$
>                  break;
>              default:
> -                if ("\\#!=:".indexOf(ch) >= 0 || (key && ch == ' ')) {
> +                if ("\\#!=:".indexOf(ch) >= 0 || (isKey && ch == ' ')) {
>                      buffer.append('\\');
>                  }
>                  if (ch >= ' ' && ch <= '~') {
>                      buffer.append(ch);
>                  } else {
> -                    String hex = Integer.toHexString(ch);
> -                    buffer.append("\\u"); //$NON-NLS-1$
> -                    for (int j = 0; j < 4 - hex.length(); j++) {
> -                        buffer.append("0"); //$NON-NLS-1$
> -                    }
> -                    buffer.append(hex);
> +                    buffer.append(toHexaDecimal(ch));
>                  }
>              }
>          }
>      }
>  
> +    private char[] toHexaDecimal(final int ch) {
> +        char[] hexChars = { '\\', 'u', '0', '0', '0', '0' };
> +        int hexChar, index = hexChars.length, copyOfCh = ch;
> +        do {
> +            hexChar = copyOfCh & 15;
> +            if (hexChar > 9) {
> +                hexChar = hexChar - 10 + 'A';
> +            } else {
> +                hexChar += '0';
> +            }
> +            hexChars[--index] = (char) hexChar;
> +        } while ((copyOfCh >>>= 4) != 0);
> +        return hexChars;
> +    }
> +
>      /**
>       * Searches for the property with the specified name. If the property is
>  not
>       * found, the default {@code Properties} are checked. If the property is
>  not
> @@ -412,7 +423,7 @@ public class Properties extends Hashtabl
>                      }
>                      break;
>                  }
> -                if (Character.isWhitespace(nextChar)) {
> +                if (nextChar < 256 && Character.isWhitespace(nextChar)) {
>                      if (mode == CONTINUE) {
>                          mode = IGNORE;
>                      }
> @@ -504,36 +515,36 @@ public class Properties extends Hashtabl
>      private static String lineSeparator;
>  
>      /**
> -     * Stores the mappings in this {@code Properties} to the specified {@cod
> e
> -     * OutputStream}, putting the specified comment at the beginning. The ou
> tput
> -     * from this method is suitable for being read by the
> +     * Stores the mappings in this {@code Properties} to the specified
> +     * {@code OutputStream}, putting the specified comment at the beginning.
>  The
> +     * output from this method is suitable for being read by the
>       * {@link #load(InputStream)} method.
>       * 
> -     * @param out the {@code OutputStream} to write to.
> -     * @param comment the comment to put at the beginning.
> -     * @throws IOException if an error occurs during the write to the {@code
> -     *             OutputStream}.
> -     * @throws ClassCastException if the key or value of a mapping is not a
> -     *                {@code String}.
> +     * @param out
> +     *            the {@code OutputStream} to write to.
> +     * @param comments
> +     *            the comments to put at the beginning.
> +     * @throws IOException
> +     *             if an error occurs during the write to the
> +     *             {@code OutputStream}.
> +     * @throws ClassCastException
> +     *             if the key or value of a mapping is not a {@code String}.
>       */
> -    public synchronized void store(OutputStream out, String comment)
> +    public synchronized void store(OutputStream out, String comments)
>              throws IOException {
>          if (lineSeparator == null) {
>              lineSeparator = AccessController
>                      .doPrivileged(new PriviAction<String>("line.separator"))
> ; //$NON-NLS-1$
>          }
> -
> -        StringBuilder buffer = new StringBuilder(200);
>          OutputStreamWriter writer = new OutputStreamWriter(out, "ISO8859_1")
> ; //$NON-NLS-1$
> -        if (comment != null) {
> -            writer.write("#"); //$NON-NLS-1$
> -            writer.write(comment);
> -            writer.write(lineSeparator);
> +        if (comments != null) {
> +            writeComments(writer, comments);
>          }
> -        writer.write("#"); //$NON-NLS-1$
> +        writer.write('#');
>          writer.write(new Date().toString());
>          writer.write(lineSeparator);
>  
> +        StringBuilder buffer = new StringBuilder(200);
>          for (Map.Entry<Object, Object> entry : entrySet()) {
>              String key = (String) entry.getKey();
>              dumpString(buffer, key, true);
> @@ -546,6 +557,32 @@ public class Properties extends Hashtabl
>          writer.flush();
>      }
>  
> +    private void writeComments(Writer writer, String comments)
> +            throws IOException {
> +        writer.write('#');
> +        char[] chars = comments.toCharArray();
> +        for (int index = 0; index < chars.length; index++) {
> +            if (chars[index] == '\r' || chars[index] == '\n') {
> +                int indexPlusOne = index + 1;
> +                if (chars[index] == '\r' && indexPlusOne < chars.length
> +                        && chars[indexPlusOne] == '\n') {
> +                    // "\r\n"
> +                    continue;
> +                }
> +                writer.write(lineSeparator);
> +                if (indexPlusOne < chars.length
> +                        && (chars[indexPlusOne] == '#' || chars[indexPlusOne
> ] == '!')) {
> +                    // return char with either '#' or '!' afterward
> +                    continue;
> +                }
> +                writer.write('#');
> +            } else {
> +                writer.write(chars[index]);
> +            }
> +        }
> +        writer.write(lineSeparator);
> +    }
> +
>      /**
>       * Loads the properties from an {@code InputStream} containing the
>       * properties in XML form. The XML document must begin with (and conform
>  to)
> 
> Modified: harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/comm
> on/org/apache/harmony/luni/tests/java/util/PropertiesTest.java
> URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/module
> s/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/Properties
> Test.java?rev=958912&r1=958911&r2=958912&view=diff
> =============================================================================
> =
> --- harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org
> /apache/harmony/luni/tests/java/util/PropertiesTest.java (original)
> +++ harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org
> /apache/harmony/luni/tests/java/util/PropertiesTest.java Tue Jun 29 10:14:01 
> 2010
> @@ -17,10 +17,12 @@
>  
>  package org.apache.harmony.luni.tests.java.util;
>  
> +import java.io.BufferedReader;
>  import java.io.ByteArrayInputStream;
>  import java.io.ByteArrayOutputStream;
>  import java.io.IOException;
>  import java.io.InputStream;
> +import java.io.InputStreamReader;
>  import java.io.PrintStream;
>  import java.io.PrintWriter;
>  import java.util.Enumeration;
> @@ -541,6 +543,131 @@ public class PropertiesTest extends juni
>          assertEquals(1, props.size());
>      }
>  
> +    private String comment1 = "comment1";
> +
> +    private String comment2 = "comment2";
> +
> +    private void validateOutput(String[] expectStrings, byte[] output)
> +            throws IOException {
> +        ByteArrayInputStream bais = new ByteArrayInputStream(output);
> +        BufferedReader br = new BufferedReader(new InputStreamReader(bais,
> +                "ISO8859_1"));
> +        for (String expectString : expectStrings) {
> +            assertEquals(expectString, br.readLine());
> +        }
> +        br.readLine();
> +        assertNull(br.readLine());
> +        br.close();
> +    }
> +
> +    public void testStore_scenario0() throws IOException {
> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> +        Properties props = new Properties();
> +        props.store(baos, comment1 + '\r' + comment2);
> +        validateOutput(new String[] { "#comment1", "#comment2" },
> +                baos.toByteArray());
> +        baos.close();
> +    }
> +
> +    public void testStore_scenario1() throws IOException {
> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> +        Properties props = new Properties();
> +        props.store(baos, comment1 + '\n' + comment2);
> +        validateOutput(new String[] { "#comment1", "#comment2" },
> +                baos.toByteArray());
> +        baos.close();
> +    }
> +
> +    public void testStore_scenario2() throws IOException {
> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> +        Properties props = new Properties();
> +        props.store(baos, comment1 + '\r' + '\n' + comment2);
> +        validateOutput(new String[] { "#comment1", "#comment2" },
> +                baos.toByteArray());
> +        baos.close();
> +    }
> +
> +    public void testStore_scenario3() throws IOException {
> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> +        Properties props = new Properties();
> +        props.store(baos, comment1 + '\n' + '\r' + comment2);
> +        validateOutput(new String[] { "#comment1", "#", "#comment2" },
> +                baos.toByteArray());
> +        baos.close();
> +    }
> +
> +    public void testStore_scenario4() throws IOException {
> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> +        Properties props = new Properties();
> +        props.store(baos, comment1 + '\r' + '#' + comment2);
> +        validateOutput(new String[] { "#comment1", "#comment2" },
> +                baos.toByteArray());
> +        baos.close();
> +    }
> +
> +    public void testStore_scenario5() throws IOException {
> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> +        Properties props = new Properties();
> +        props.store(baos, comment1 + '\r' + '!' + comment2);
> +        validateOutput(new String[] { "#comment1", "!comment2" },
> +                baos.toByteArray());
> +        baos.close();
> +    }
> +
> +    public void testStore_scenario6() throws IOException {
> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> +        Properties props = new Properties();
> +        props.store(baos, comment1 + '\n' + '#' + comment2);
> +        validateOutput(new String[] { "#comment1", "#comment2" },
> +                baos.toByteArray());
> +        baos.close();
> +    }
> +
> +    public void testStore_scenario7() throws IOException {
> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> +        Properties props = new Properties();
> +        props.store(baos, comment1 + '\n' + '!' + comment2);
> +        validateOutput(new String[] { "#comment1", "!comment2" },
> +                baos.toByteArray());
> +        baos.close();
> +    }
> +
> +    public void testStore_scenario8() throws IOException {
> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> +        Properties props = new Properties();
> +        props.store(baos, comment1 + '\r' + '\n' + '#' + comment2);
> +        validateOutput(new String[] { "#comment1", "#comment2" },
> +                baos.toByteArray());
> +        baos.close();
> +    }
> +
> +    public void testStore_scenario9() throws IOException {
> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> +        Properties props = new Properties();
> +        props.store(baos, comment1 + '\n' + '\r' + '#' + comment2);
> +        validateOutput(new String[] { "#comment1", "#", "#comment2" },
> +                baos.toByteArray());
> +        baos.close();
> +    }
> +
> +    public void testStore_scenario10() throws IOException {
> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> +        Properties props = new Properties();
> +        props.store(baos, comment1 + '\r' + '\n' + '!' + comment2);
> +        validateOutput(new String[] { "#comment1", "!comment2" },
> +                baos.toByteArray());
> +        baos.close();
> +    }
> +
> +    public void testStore_scenario11() throws IOException {
> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> +        Properties props = new Properties();
> +        props.store(baos, comment1 + '\n' + '\r' + '!' + comment2);
> +        validateOutput(new String[] { "#comment1", "#", "!comment2" },
> +                baos.toByteArray());
> +        baos.close();
> +    }
> +
>      /**
>       * Sets up the fixture, for example, open a network connection. This met
> hod
>       * is called before a test is executed.
> 



Re: svn commit: r958912 - in /harmony/enhanced/java/trunk/classlib/modules/luni/src: main/java/java/util/Properties.java test/api/common/org/apache/harmony/luni/tests/java/util/PropertiesTest.java

Posted by Kevin Zhou <zh...@gmail.com>.
Thanks, Mark. The changes have already been made.

On Wed, Jul 7, 2010 at 3:15 PM, Mark Hindess <ma...@googlemail.com>wrote:

>
> Kevin,
>
> During the merge to java6 I did a --record-only merge (which just
> updates the metadata to say that it is complete but changes nothing)
> for this commit on the assumption that the changes were already made in
> r958904.  If that is not correct - i.e. there is work missing - then please
> make a commit with the missing changes.
>
> Thanks,
>  Mark.
>
>
> In message <20...@eris.apache.org>,
> zhoukevin@apache.org
> writes:
> >
> > Author: zhoukevin
> > Date: Tue Jun 29 10:14:01 2010
> > New Revision: 958912
> >
> > URL: http://svn.apache.org/viewvc?rev=958912&view=rev
> > Log:
> > As to java.util.Properties.store(os, comments) method, if the comments
> argume
> > nt is not null, then '#' character and a line separator are first written
> to
> > the output stream. Thus, the comments can serve as an identifying
> comment. An
> > y '\n', '\r' or "\r\n" in comments is replaced by a line separator
> generated
> > by the Writer and if the next character in comments is not character # or
> cha
> > racter ! then an ASCII # is written out after that line separator.
> > This patch fixes the above issue. In addition, it includes several test
> cases
> >  for coverage.
> >
> > Modified:
> >
> harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/util
> > /Properties.java
> >
> harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org
> > /apache/harmony/luni/tests/java/util/PropertiesTest.java
> >
> > Modified:
> harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/jav
> > a/util/Properties.java
> > URL:
> http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/module
> >
> s/luni/src/main/java/java/util/Properties.java?rev=958912&r1=958911&r2=958912
> > &view=diff
> >
> =============================================================================
> > =
> > ---
> harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/util
> > /Properties.java (original)
> > +++
> harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/util
> > /Properties.java Tue Jun 29 10:14:01 2010
> > @@ -25,6 +25,7 @@ import java.io.OutputStreamWriter;
> >  import java.io.PrintStream;
> >  import java.io.PrintWriter;
> >  import java.io.StringReader;
> > +import java.io.Writer;
> >  import java.nio.charset.Charset;
> >  import java.nio.charset.IllegalCharsetNameException;
> >  import java.nio.charset.UnsupportedCharsetException;
> > @@ -97,15 +98,15 @@ public class Properties extends Hashtabl
> >          defaults = properties;
> >      }
> >
> > -    private void dumpString(StringBuilder buffer, String string, boolean
> key
> > ) {
> > -        int i = 0;
> > -        if (!key && i < string.length() && string.charAt(i) == ' ') {
> > +    private void dumpString(StringBuilder buffer, String string, boolean
> isK
> > ey) {
> > +        int index = 0, length = string.length();
> > +        if (!isKey && index < length && string.charAt(index) == ' ') {
> >              buffer.append("\\ "); //$NON-NLS-1$
> > -            i++;
> > +            index++;
> >          }
> >
> > -        for (; i < string.length(); i++) {
> > -            char ch = string.charAt(i);
> > +        for (; index < length; index++) {
> > +            char ch = string.charAt(index);
> >              switch (ch) {
> >              case '\t':
> >                  buffer.append("\\t"); //$NON-NLS-1$
> > @@ -120,23 +121,33 @@ public class Properties extends Hashtabl
> >                  buffer.append("\\r"); //$NON-NLS-1$
> >                  break;
> >              default:
> > -                if ("\\#!=:".indexOf(ch) >= 0 || (key && ch == ' ')) {
> > +                if ("\\#!=:".indexOf(ch) >= 0 || (isKey && ch == ' ')) {
> >                      buffer.append('\\');
> >                  }
> >                  if (ch >= ' ' && ch <= '~') {
> >                      buffer.append(ch);
> >                  } else {
> > -                    String hex = Integer.toHexString(ch);
> > -                    buffer.append("\\u"); //$NON-NLS-1$
> > -                    for (int j = 0; j < 4 - hex.length(); j++) {
> > -                        buffer.append("0"); //$NON-NLS-1$
> > -                    }
> > -                    buffer.append(hex);
> > +                    buffer.append(toHexaDecimal(ch));
> >                  }
> >              }
> >          }
> >      }
> >
> > +    private char[] toHexaDecimal(final int ch) {
> > +        char[] hexChars = { '\\', 'u', '0', '0', '0', '0' };
> > +        int hexChar, index = hexChars.length, copyOfCh = ch;
> > +        do {
> > +            hexChar = copyOfCh & 15;
> > +            if (hexChar > 9) {
> > +                hexChar = hexChar - 10 + 'A';
> > +            } else {
> > +                hexChar += '0';
> > +            }
> > +            hexChars[--index] = (char) hexChar;
> > +        } while ((copyOfCh >>>= 4) != 0);
> > +        return hexChars;
> > +    }
> > +
> >      /**
> >       * Searches for the property with the specified name. If the
> property is
> >  not
> >       * found, the default {@code Properties} are checked. If the
> property is
> >  not
> > @@ -412,7 +423,7 @@ public class Properties extends Hashtabl
> >                      }
> >                      break;
> >                  }
> > -                if (Character.isWhitespace(nextChar)) {
> > +                if (nextChar < 256 && Character.isWhitespace(nextChar))
> {
> >                      if (mode == CONTINUE) {
> >                          mode = IGNORE;
> >                      }
> > @@ -504,36 +515,36 @@ public class Properties extends Hashtabl
> >      private static String lineSeparator;
> >
> >      /**
> > -     * Stores the mappings in this {@code Properties} to the specified
> {@cod
> > e
> > -     * OutputStream}, putting the specified comment at the beginning.
> The ou
> > tput
> > -     * from this method is suitable for being read by the
> > +     * Stores the mappings in this {@code Properties} to the specified
> > +     * {@code OutputStream}, putting the specified comment at the
> beginning.
> >  The
> > +     * output from this method is suitable for being read by the
> >       * {@link #load(InputStream)} method.
> >       *
> > -     * @param out the {@code OutputStream} to write to.
> > -     * @param comment the comment to put at the beginning.
> > -     * @throws IOException if an error occurs during the write to the
> {@code
> > -     *             OutputStream}.
> > -     * @throws ClassCastException if the key or value of a mapping is
> not a
> > -     *                {@code String}.
> > +     * @param out
> > +     *            the {@code OutputStream} to write to.
> > +     * @param comments
> > +     *            the comments to put at the beginning.
> > +     * @throws IOException
> > +     *             if an error occurs during the write to the
> > +     *             {@code OutputStream}.
> > +     * @throws ClassCastException
> > +     *             if the key or value of a mapping is not a {@code
> String}.
> >       */
> > -    public synchronized void store(OutputStream out, String comment)
> > +    public synchronized void store(OutputStream out, String comments)
> >              throws IOException {
> >          if (lineSeparator == null) {
> >              lineSeparator = AccessController
> >                      .doPrivileged(new
> PriviAction<String>("line.separator"))
> > ; //$NON-NLS-1$
> >          }
> > -
> > -        StringBuilder buffer = new StringBuilder(200);
> >          OutputStreamWriter writer = new OutputStreamWriter(out,
> "ISO8859_1")
> > ; //$NON-NLS-1$
> > -        if (comment != null) {
> > -            writer.write("#"); //$NON-NLS-1$
> > -            writer.write(comment);
> > -            writer.write(lineSeparator);
> > +        if (comments != null) {
> > +            writeComments(writer, comments);
> >          }
> > -        writer.write("#"); //$NON-NLS-1$
> > +        writer.write('#');
> >          writer.write(new Date().toString());
> >          writer.write(lineSeparator);
> >
> > +        StringBuilder buffer = new StringBuilder(200);
> >          for (Map.Entry<Object, Object> entry : entrySet()) {
> >              String key = (String) entry.getKey();
> >              dumpString(buffer, key, true);
> > @@ -546,6 +557,32 @@ public class Properties extends Hashtabl
> >          writer.flush();
> >      }
> >
> > +    private void writeComments(Writer writer, String comments)
> > +            throws IOException {
> > +        writer.write('#');
> > +        char[] chars = comments.toCharArray();
> > +        for (int index = 0; index < chars.length; index++) {
> > +            if (chars[index] == '\r' || chars[index] == '\n') {
> > +                int indexPlusOne = index + 1;
> > +                if (chars[index] == '\r' && indexPlusOne < chars.length
> > +                        && chars[indexPlusOne] == '\n') {
> > +                    // "\r\n"
> > +                    continue;
> > +                }
> > +                writer.write(lineSeparator);
> > +                if (indexPlusOne < chars.length
> > +                        && (chars[indexPlusOne] == '#' ||
> chars[indexPlusOne
> > ] == '!')) {
> > +                    // return char with either '#' or '!' afterward
> > +                    continue;
> > +                }
> > +                writer.write('#');
> > +            } else {
> > +                writer.write(chars[index]);
> > +            }
> > +        }
> > +        writer.write(lineSeparator);
> > +    }
> > +
> >      /**
> >       * Loads the properties from an {@code InputStream} containing the
> >       * properties in XML form. The XML document must begin with (and
> conform
> >  to)
> >
> > Modified:
> harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/comm
> > on/org/apache/harmony/luni/tests/java/util/PropertiesTest.java
> > URL:
> http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/module
> >
> s/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/Properties
> > Test.java?rev=958912&r1=958911&r2=958912&view=diff
> >
> =============================================================================
> > =
> > ---
> harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org
> > /apache/harmony/luni/tests/java/util/PropertiesTest.java (original)
> > +++
> harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org
> > /apache/harmony/luni/tests/java/util/PropertiesTest.java Tue Jun 29
> 10:14:01
> > 2010
> > @@ -17,10 +17,12 @@
> >
> >  package org.apache.harmony.luni.tests.java.util;
> >
> > +import java.io.BufferedReader;
> >  import java.io.ByteArrayInputStream;
> >  import java.io.ByteArrayOutputStream;
> >  import java.io.IOException;
> >  import java.io.InputStream;
> > +import java.io.InputStreamReader;
> >  import java.io.PrintStream;
> >  import java.io.PrintWriter;
> >  import java.util.Enumeration;
> > @@ -541,6 +543,131 @@ public class PropertiesTest extends juni
> >          assertEquals(1, props.size());
> >      }
> >
> > +    private String comment1 = "comment1";
> > +
> > +    private String comment2 = "comment2";
> > +
> > +    private void validateOutput(String[] expectStrings, byte[] output)
> > +            throws IOException {
> > +        ByteArrayInputStream bais = new ByteArrayInputStream(output);
> > +        BufferedReader br = new BufferedReader(new
> InputStreamReader(bais,
> > +                "ISO8859_1"));
> > +        for (String expectString : expectStrings) {
> > +            assertEquals(expectString, br.readLine());
> > +        }
> > +        br.readLine();
> > +        assertNull(br.readLine());
> > +        br.close();
> > +    }
> > +
> > +    public void testStore_scenario0() throws IOException {
> > +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > +        Properties props = new Properties();
> > +        props.store(baos, comment1 + '\r' + comment2);
> > +        validateOutput(new String[] { "#comment1", "#comment2" },
> > +                baos.toByteArray());
> > +        baos.close();
> > +    }
> > +
> > +    public void testStore_scenario1() throws IOException {
> > +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > +        Properties props = new Properties();
> > +        props.store(baos, comment1 + '\n' + comment2);
> > +        validateOutput(new String[] { "#comment1", "#comment2" },
> > +                baos.toByteArray());
> > +        baos.close();
> > +    }
> > +
> > +    public void testStore_scenario2() throws IOException {
> > +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > +        Properties props = new Properties();
> > +        props.store(baos, comment1 + '\r' + '\n' + comment2);
> > +        validateOutput(new String[] { "#comment1", "#comment2" },
> > +                baos.toByteArray());
> > +        baos.close();
> > +    }
> > +
> > +    public void testStore_scenario3() throws IOException {
> > +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > +        Properties props = new Properties();
> > +        props.store(baos, comment1 + '\n' + '\r' + comment2);
> > +        validateOutput(new String[] { "#comment1", "#", "#comment2" },
> > +                baos.toByteArray());
> > +        baos.close();
> > +    }
> > +
> > +    public void testStore_scenario4() throws IOException {
> > +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > +        Properties props = new Properties();
> > +        props.store(baos, comment1 + '\r' + '#' + comment2);
> > +        validateOutput(new String[] { "#comment1", "#comment2" },
> > +                baos.toByteArray());
> > +        baos.close();
> > +    }
> > +
> > +    public void testStore_scenario5() throws IOException {
> > +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > +        Properties props = new Properties();
> > +        props.store(baos, comment1 + '\r' + '!' + comment2);
> > +        validateOutput(new String[] { "#comment1", "!comment2" },
> > +                baos.toByteArray());
> > +        baos.close();
> > +    }
> > +
> > +    public void testStore_scenario6() throws IOException {
> > +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > +        Properties props = new Properties();
> > +        props.store(baos, comment1 + '\n' + '#' + comment2);
> > +        validateOutput(new String[] { "#comment1", "#comment2" },
> > +                baos.toByteArray());
> > +        baos.close();
> > +    }
> > +
> > +    public void testStore_scenario7() throws IOException {
> > +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > +        Properties props = new Properties();
> > +        props.store(baos, comment1 + '\n' + '!' + comment2);
> > +        validateOutput(new String[] { "#comment1", "!comment2" },
> > +                baos.toByteArray());
> > +        baos.close();
> > +    }
> > +
> > +    public void testStore_scenario8() throws IOException {
> > +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > +        Properties props = new Properties();
> > +        props.store(baos, comment1 + '\r' + '\n' + '#' + comment2);
> > +        validateOutput(new String[] { "#comment1", "#comment2" },
> > +                baos.toByteArray());
> > +        baos.close();
> > +    }
> > +
> > +    public void testStore_scenario9() throws IOException {
> > +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > +        Properties props = new Properties();
> > +        props.store(baos, comment1 + '\n' + '\r' + '#' + comment2);
> > +        validateOutput(new String[] { "#comment1", "#", "#comment2" },
> > +                baos.toByteArray());
> > +        baos.close();
> > +    }
> > +
> > +    public void testStore_scenario10() throws IOException {
> > +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > +        Properties props = new Properties();
> > +        props.store(baos, comment1 + '\r' + '\n' + '!' + comment2);
> > +        validateOutput(new String[] { "#comment1", "!comment2" },
> > +                baos.toByteArray());
> > +        baos.close();
> > +    }
> > +
> > +    public void testStore_scenario11() throws IOException {
> > +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
> > +        Properties props = new Properties();
> > +        props.store(baos, comment1 + '\n' + '\r' + '!' + comment2);
> > +        validateOutput(new String[] { "#comment1", "#", "!comment2" },
> > +                baos.toByteArray());
> > +        baos.close();
> > +    }
> > +
> >      /**
> >       * Sets up the fixture, for example, open a network connection. This
> met
> > hod
> >       * is called before a test is executed.
> >
>
>
>


-- 
Best regards,
Yours, Kevin Zhou