This is an automated email from the ASF dual-hosted git repository.

chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fury.git


The following commit(s) were added to refs/heads/main by this push:
     new 670588f8 fix(java): java.util.Date and its subclasses are mutable 
(#2076)
670588f8 is described below

commit 670588f8564d425ab98f5eaf7bdf46374f01e945
Author: monk <[email protected]>
AuthorDate: Thu Feb 20 12:36:32 2025 +0800

    fix(java): java.util.Date and its subclasses are mutable (#2076)
    
    <!--
    **Thanks for contributing to Fury.**
    
    **If this is your first time opening a PR on fury, you can refer to
    
[CONTRIBUTING.md](https://github.com/apache/fury/blob/main/CONTRIBUTING.md).**
    
    Contribution Checklist
    
    - The **Apache Fury (incubating)** community has restrictions on the
    naming of pr titles. You can also find instructions in
    [CONTRIBUTING.md](https://github.com/apache/fury/blob/main/CONTRIBUTING.md).
    
    - Fury has a strong focus on performance. If the PR you submit will have
    an impact on performance, please benchmark it first and provide the
    benchmark result here.
    -->
    
    ## What does this PR do?
    
    java.util.Date and its subclasses are mutable,but in version <=
    0.10.0,all TimeSerializers extends from ImmutableSerializer.
    This pr reorganized the inheritance relationships of
    TimeSerializers.Moved and added test case to adapte new version.
    
    ## Related issues
    
    <!--
    Is there any related issue? Please attach here.
    
    - #xxxx0
    - #xxxx1
    - #xxxx2
    -->
    [issus:](url)https://github.com/apache/fury/issues/2071
    
    ## Does this PR introduce any user-facing change?
    
    <!--
    If any user-facing interface changes, please [open an
    issue](https://github.com/apache/fury/issues/new/choose) describing the
    need to do so and update the document if necessary.
    -->
    
    - [ ] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
    
    ## Benchmark
    
    <!--
    When the PR has an impact on performance (if you don't know whether the
    PR will have an impact on performance, you can submit the PR first, and
    if it will have impact on performance, the code reviewer will explain
    it), be sure to attach a benchmark data here.
    -->
---
 .../apache/fury/serializer/TimeSerializers.java    | 82 +++++++++++++++++-----
 .../test/java/org/apache/fury/FuryCopyTest.java    | 16 +++--
 2 files changed, 78 insertions(+), 20 deletions(-)

diff --git 
a/java/fury-core/src/main/java/org/apache/fury/serializer/TimeSerializers.java 
b/java/fury-core/src/main/java/org/apache/fury/serializer/TimeSerializers.java
index 2d98fc1d..41e1f50c 100644
--- 
a/java/fury-core/src/main/java/org/apache/fury/serializer/TimeSerializers.java
+++ 
b/java/fury-core/src/main/java/org/apache/fury/serializer/TimeSerializers.java
@@ -46,13 +46,24 @@ import org.apache.fury.util.DateTimeUtils;
 
 /** Serializers for all time related types. */
 public class TimeSerializers {
-  public abstract static class TimeSerializer<T> extends 
ImmutableSerializer<T> {
+  public abstract static class TimeSerializer<T> extends Serializer<T> {
 
     public TimeSerializer(Fury fury, Class<T> type) {
-      super(fury, type, !fury.getConfig().isTimeRefIgnored());
+      super(fury, type, !fury.getConfig().isTimeRefIgnored(), false);
     }
 
     public TimeSerializer(Fury fury, Class<T> type, boolean needToWriteRef) {
+      super(fury, type, needToWriteRef, false);
+    }
+  }
+
+  public abstract static class ImmutableTimeSerializer<T> extends 
ImmutableSerializer<T> {
+
+    public ImmutableTimeSerializer(Fury fury, Class<T> type) {
+      super(fury, type, !fury.getConfig().isTimeRefIgnored());
+    }
+
+    public ImmutableTimeSerializer(Fury fury, Class<T> type, boolean 
needToWriteRef) {
       super(fury, type, needToWriteRef);
     }
   }
@@ -102,6 +113,11 @@ public class TimeSerializers {
     protected Date newInstance(long time) {
       return new Date(time);
     }
+
+    @Override
+    public Date copy(Date value) {
+      return newInstance(value.getTime());
+    }
   }
 
   public static final class SqlDateSerializer extends 
BaseDateSerializer<java.sql.Date> {
@@ -117,6 +133,11 @@ public class TimeSerializers {
     protected java.sql.Date newInstance(long time) {
       return new java.sql.Date(time);
     }
+
+    @Override
+    public java.sql.Date copy(java.sql.Date value) {
+      return newInstance(value.getTime());
+    }
   }
 
   public static final class SqlTimeSerializer extends BaseDateSerializer<Time> 
{
@@ -133,6 +154,11 @@ public class TimeSerializers {
     protected Time newInstance(long time) {
       return new Time(time);
     }
+
+    @Override
+    public Time copy(Time value) {
+      return newInstance(value.getTime());
+    }
   }
 
   public static final class TimestampSerializer extends 
TimeSerializer<Timestamp> {
@@ -169,9 +195,14 @@ public class TimeSerializers {
       t.setNanos(buffer.readInt32());
       return t;
     }
+
+    @Override
+    public Timestamp copy(Timestamp value) {
+      return new Timestamp(value.getTime());
+    }
   }
 
-  public static final class LocalDateSerializer extends 
TimeSerializer<LocalDate> {
+  public static final class LocalDateSerializer extends 
ImmutableTimeSerializer<LocalDate> {
     public LocalDateSerializer(Fury fury) {
       super(fury, LocalDate.class);
     }
@@ -215,7 +246,7 @@ public class TimeSerializers {
     }
   }
 
-  public static final class InstantSerializer extends TimeSerializer<Instant> {
+  public static final class InstantSerializer extends 
ImmutableTimeSerializer<Instant> {
     public InstantSerializer(Fury fury) {
       super(fury, Instant.class);
     }
@@ -249,7 +280,7 @@ public class TimeSerializers {
     }
   }
 
-  public static class DurationSerializer extends TimeSerializer<Duration> {
+  public static class DurationSerializer extends 
ImmutableTimeSerializer<Duration> {
     public DurationSerializer(Fury fury) {
       super(fury, Duration.class);
     }
@@ -272,7 +303,7 @@ public class TimeSerializers {
     }
   }
 
-  public static class LocalDateTimeSerializer extends 
TimeSerializer<LocalDateTime> {
+  public static class LocalDateTimeSerializer extends 
ImmutableTimeSerializer<LocalDateTime> {
     public LocalDateTimeSerializer(Fury fury) {
       super(fury, LocalDateTime.class);
     }
@@ -295,7 +326,7 @@ public class TimeSerializers {
     }
   }
 
-  public static class LocalTimeSerializer extends TimeSerializer<LocalTime> {
+  public static class LocalTimeSerializer extends 
ImmutableTimeSerializer<LocalTime> {
     public LocalTimeSerializer(Fury fury) {
       super(fury, LocalTime.class);
     }
@@ -376,6 +407,11 @@ public class TimeSerializers {
     public TimeZone read(MemoryBuffer buffer) {
       return TimeZone.getTimeZone(fury.readJavaString(buffer));
     }
+
+    @Override
+    public TimeZone copy(TimeZone value) {
+      return TimeZone.getTimeZone(value.getID());
+    }
   }
 
   public static final class CalendarSerializer extends 
TimeSerializer<Calendar> {
@@ -419,9 +455,23 @@ public class TimeSerializers {
       }
       return result;
     }
+
+    @Override
+    public Calendar copy(Calendar value) {
+      Calendar copy = Calendar.getInstance(value.getTimeZone());
+      copy.setTimeInMillis(value.getTimeInMillis());
+      copy.setLenient(value.isLenient());
+      copy.setFirstDayOfWeek(value.getFirstDayOfWeek());
+      copy.setMinimalDaysInFirstWeek(value.getMinimalDaysInFirstWeek());
+      if (value instanceof GregorianCalendar) {
+        ((GregorianCalendar) copy)
+            .setGregorianChange(((GregorianCalendar) 
value).getGregorianChange());
+      }
+      return copy;
+    }
   }
 
-  public static class ZoneIdSerializer extends TimeSerializer<ZoneId> {
+  public static class ZoneIdSerializer extends ImmutableTimeSerializer<ZoneId> 
{
     public ZoneIdSerializer(Fury fury, Class<ZoneId> type) {
       super(fury, type);
     }
@@ -441,7 +491,7 @@ public class TimeSerializers {
     }
   }
 
-  public static class ZoneOffsetSerializer extends TimeSerializer<ZoneOffset> {
+  public static class ZoneOffsetSerializer extends 
ImmutableTimeSerializer<ZoneOffset> {
     public ZoneOffsetSerializer(Fury fury) {
       super(fury, ZoneOffset.class);
     }
@@ -475,7 +525,7 @@ public class TimeSerializers {
     }
   }
 
-  public static class ZonedDateTimeSerializer extends 
TimeSerializer<ZonedDateTime> {
+  public static class ZonedDateTimeSerializer extends 
ImmutableTimeSerializer<ZonedDateTime> {
 
     public ZonedDateTimeSerializer(Fury fury) {
       super(fury, ZonedDateTime.class);
@@ -499,7 +549,7 @@ public class TimeSerializers {
     }
   }
 
-  public static class YearSerializer extends TimeSerializer<Year> {
+  public static class YearSerializer extends ImmutableTimeSerializer<Year> {
     public YearSerializer(Fury fury) {
       super(fury, Year.class);
     }
@@ -519,7 +569,7 @@ public class TimeSerializers {
     }
   }
 
-  public static class YearMonthSerializer extends TimeSerializer<YearMonth> {
+  public static class YearMonthSerializer extends 
ImmutableTimeSerializer<YearMonth> {
     public YearMonthSerializer(Fury fury) {
       super(fury, YearMonth.class);
     }
@@ -542,7 +592,7 @@ public class TimeSerializers {
     }
   }
 
-  public static class MonthDaySerializer extends TimeSerializer<MonthDay> {
+  public static class MonthDaySerializer extends 
ImmutableTimeSerializer<MonthDay> {
     public MonthDaySerializer(Fury fury) {
       super(fury, MonthDay.class);
     }
@@ -563,7 +613,7 @@ public class TimeSerializers {
     }
   }
 
-  public static class PeriodSerializer extends TimeSerializer<Period> {
+  public static class PeriodSerializer extends ImmutableTimeSerializer<Period> 
{
     public PeriodSerializer(Fury fury) {
       super(fury, Period.class);
     }
@@ -586,7 +636,7 @@ public class TimeSerializers {
     }
   }
 
-  public static class OffsetTimeSerializer extends TimeSerializer<OffsetTime> {
+  public static class OffsetTimeSerializer extends 
ImmutableTimeSerializer<OffsetTime> {
     public OffsetTimeSerializer(Fury fury) {
       super(fury, OffsetTime.class);
     }
@@ -607,7 +657,7 @@ public class TimeSerializers {
     }
   }
 
-  public static class OffsetDateTimeSerializer extends 
TimeSerializer<OffsetDateTime> {
+  public static class OffsetDateTimeSerializer extends 
ImmutableTimeSerializer<OffsetDateTime> {
     public OffsetDateTimeSerializer(Fury fury) {
       super(fury, OffsetDateTime.class);
     }
diff --git a/java/fury-core/src/test/java/org/apache/fury/FuryCopyTest.java 
b/java/fury-core/src/test/java/org/apache/fury/FuryCopyTest.java
index 4b1a7107..26a127de 100644
--- a/java/fury-core/src/test/java/org/apache/fury/FuryCopyTest.java
+++ b/java/fury-core/src/test/java/org/apache/fury/FuryCopyTest.java
@@ -45,6 +45,7 @@ import java.time.ZonedDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.BitSet;
+import java.util.Calendar;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Currency;
@@ -62,6 +63,7 @@ import java.util.OptionalDouble;
 import java.util.OptionalInt;
 import java.util.OptionalLong;
 import java.util.PriorityQueue;
+import java.util.TimeZone;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.UUID;
@@ -130,6 +132,7 @@ public class FuryCopyTest extends FuryTestBase {
     collectionCopyTest();
     mapCopyTest();
     objectCopyTest();
+    dateCopyTest();
   }
 
   @Test
@@ -255,10 +258,6 @@ public class FuryCopyTest extends FuryTestBase {
   }
 
   private void timeCopyTest() {
-    assertSame(new java.util.Date());
-    assertSame(new java.sql.Date(System.currentTimeMillis()));
-    assertSame(new Time(System.currentTimeMillis()));
-    assertSame(new Timestamp(System.currentTimeMillis()));
     assertSame(LocalDate.now());
     assertSame(LocalTime.now());
     assertSame(LocalDateTime.now());
@@ -274,6 +273,15 @@ public class FuryCopyTest extends FuryTestBase {
     assertSame(OffsetDateTime.now());
   }
 
+  private void dateCopyTest() {
+    assetEqualsButNotSame(new java.util.Date());
+    assetEqualsButNotSame(new java.sql.Date(System.currentTimeMillis()));
+    assetEqualsButNotSame(new Time(System.currentTimeMillis()));
+    assetEqualsButNotSame(new Timestamp(System.currentTimeMillis()));
+    assetEqualsButNotSame(Calendar.getInstance());
+    assetEqualsButNotSame(TimeZone.getDefault());
+  }
+
   private void assertSame(Object obj) {
     Assert.assertSame(obj, fury.copy(obj));
   }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to