]> granicus.if.org Git - icu/commitdiff
ICU-9028 Implemented Freezable in TimeZoneJDK class in the locale SPI module.
authorYoshito Umaoka <y.umaoka@gmail.com>
Tue, 17 Jan 2012 16:30:12 +0000 (16:30 +0000)
committerYoshito Umaoka <y.umaoka@gmail.com>
Tue, 17 Jan 2012 16:30:12 +0000 (16:30 +0000)
X-SVN-Rev: 31218

icu4j/main/classes/localespi/src/com/ibm/icu/impl/icuadapter/TimeZoneJDK.java

index 2abdde7f39eb93a1eae7104c6eff2486263c5657..8e0221f8f96b52ae3fb390f725807482aa5859c3 100644 (file)
@@ -41,7 +41,7 @@ public class TimeZoneJDK extends com.ibm.icu.util.TimeZone {
     }
 
     private TimeZoneJDK(TimeZone jdkTz) {
-        fJdkTz = jdkTz;
+        fJdkTz = (TimeZone)jdkTz.clone();
     }
     
     public static com.ibm.icu.util.TimeZone wrap(TimeZone jdkTz) {
@@ -52,16 +52,17 @@ public class TimeZoneJDK extends com.ibm.icu.util.TimeZone {
     }
     
     public TimeZone unwrap() {
-        return fJdkTz;
+        return (TimeZone)fJdkTz.clone();
     }
 
     @Override
     public Object clone() {
-        TimeZoneJDK other = (TimeZoneJDK)super.clone();
-        other.fJdkTz = (TimeZone)fJdkTz.clone();
-        return other;
+        if (isFrozen()) {
+            return this;
+        }
+        return cloneAsThawed();
     }
-    
+
     @Override
     public boolean equals(Object obj) {
         if (obj instanceof TimeZoneJDK) {
@@ -172,11 +173,17 @@ public class TimeZoneJDK extends com.ibm.icu.util.TimeZone {
 
     @Override
     public void setID(String ID) {
+        if (isFrozen()) {
+            throw new UnsupportedOperationException("Attempt to modify a frozen TimeZoneJDK instance.");
+        }
         fJdkTz.setID(ID);
     }
 
     @Override
     public void setRawOffset(int offsetMillis) {
+        if (isFrozen()) {
+            throw new UnsupportedOperationException("Attempt to modify a frozen TimeZoneJDK instance.");
+        }
         fJdkTz.setRawOffset(offsetMillis);
     }
 
@@ -198,4 +205,28 @@ public class TimeZoneJDK extends com.ibm.icu.util.TimeZone {
         }
         return super.observesDaylightTime();
     }
+
+    // Freezable stuffs
+    private transient boolean fIsFrozen = false;
+
+    @Override
+    public boolean isFrozen() {
+        return fIsFrozen;
+    }
+
+    @Override
+    public com.ibm.icu.util.TimeZone freeze() {
+        fIsFrozen = true;
+        return this;
+    }
+
+    @Override
+    public com.ibm.icu.util.TimeZone cloneAsThawed() {
+        TimeZoneJDK tz = (TimeZoneJDK)super.cloneAsThawed();
+        tz.fJdkTz = (TimeZone)fJdkTz.clone();
+        tz.fJdkCal = (java.util.GregorianCalendar)fJdkCal.clone();
+        tz.fIsFrozen = false;
+        return tz;
+    }
+
 }