You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2013/02/28 00:35:12 UTC

svn commit: r1451034 - /sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractInternationalString.java

Author: desruisseaux
Date: Wed Feb 27 23:35:12 2013
New Revision: 1451034

URL: http://svn.apache.org/r1451034
Log:
Fixed a synchronization hole.

Modified:
    sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractInternationalString.java

Modified: sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractInternationalString.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractInternationalString.java?rev=1451034&r1=1451033&r2=1451034&view=diff
==============================================================================
--- sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractInternationalString.java [UTF-8] (original)
+++ sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractInternationalString.java [UTF-8] Wed Feb 27 23:35:12 2013
@@ -22,6 +22,7 @@ import java.util.Formattable;
 import java.util.FormattableFlags;
 import org.opengis.util.InternationalString;
 import org.apache.sis.internal.util.Utilities;
+import org.apache.sis.util.CharSequences;
 
 
 /**
@@ -45,11 +46,15 @@ public abstract class AbstractInternatio
      * if this string has not yet been determined. This is the default string returned by
      * {@link #toString()} and others methods from the {@link CharSequence} interface.
      *
-     * <p>This field is not serialized because serialization is often used for data transmission
-     * between a server and a client, and the client may not use the same locale than the server.
-     * We want the locale to be examined again on the client side.</p>
+     * {@section Thread safety}
+     * For thread safety this field shall either be read and written in a synchronized block,
+     * or be fixed at construction time and never changed after than point. All other usages
+     * are prohibited.
      *
-     * This field is read and written by {@link SimpleInternationalString}.
+     * {@section Serialization}
+     * This field is not serialized because serialization is often used for data transmission
+     * between a server and a client, and the client may not use the same locale than the server.
+     * We want the locale to be examined again on the client side.
      */
     transient String defaultValue;
 
@@ -67,15 +72,7 @@ public abstract class AbstractInternatio
      */
     @Override
     public int length() {
-        String text = defaultValue;
-        if (text == null) {
-            text = toString();
-            if (text == null) {
-                return 0;
-            }
-            defaultValue = text;
-        }
-        return text.length();
+        return CharSequences.length(toString());
     }
 
     /**
@@ -88,15 +85,7 @@ public abstract class AbstractInternatio
      */
     @Override
     public char charAt(final int index) throws IndexOutOfBoundsException {
-        String text = defaultValue;
-        if (text == null) {
-            text = toString();
-            if (text == null) {
-                throw new StringIndexOutOfBoundsException();
-            }
-            defaultValue = text;
-        }
-        return text.charAt(index);
+        return toString().charAt(index);
     }
 
     /**
@@ -111,16 +100,12 @@ public abstract class AbstractInternatio
      */
     @Override
     public CharSequence subSequence(final int start, final int end) {
-        String text = defaultValue;
+        final String text = toString();
         if (text == null) {
-            text = toString();
-            if (text == null) {
-                if (start == 0 && end == 0) {
-                    return "";
-                }
-                throw new StringIndexOutOfBoundsException();
+            if (start == 0 && end == 0) {
+                return "";
             }
-            defaultValue = text;
+            throw new StringIndexOutOfBoundsException();
         }
         return text.substring(start, end);
     }
@@ -165,7 +150,7 @@ public abstract class AbstractInternatio
      * @return The string in the default locale.
      */
     @Override
-    public String toString() {
+    public synchronized String toString() {
         String text = defaultValue;
         if (text == null) {
             text = toString(Locale.getDefault());