You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@harmony.apache.org by Kevin Zhou <zh...@gmail.com> on 2010/07/09 12:03:19 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

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