]> source.dussan.org Git - jgit.git/commitdiff
SystemReader: Offer methods with java.time API 75/1203675/2
authorIvan Frade <ifrade@google.com>
Mon, 4 Nov 2024 22:21:24 +0000 (14:21 -0800)
committerMatthias Sohn <matthias.sohn@sap.com>
Fri, 8 Nov 2024 00:06:58 +0000 (01:06 +0100)
Error prone explains: The Date API is full of major design flaws and
pitfalls and should be avoided at all costs. Prefer the java.time
APIs, specifically, java.time.Instant (for physical time) and
java.time.LocalDate[Time] (for civil time).

Add to SystemReader methods to get the time and timezone in the new
java.time classes (Instant/ZoneId) and mark as deprecated their old
counterparts.

The mapping of methods is:
* #getCurrentTime -> #now (returns Instant instead of int)
* #getTimezone -> #getTimeZoneAt (returns ZoneOffset intead of int)
* #getTimeZone -> #getTimeZoneId (return ZoneId instead of TimeZone)

Change-Id: Ic55b2f442a40046ff0ed24f61f566fc7416471be

org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/MockSystemReader.java
org.eclipse.jgit/.settings/.api_filters
org.eclipse.jgit/src/org/eclipse/jgit/util/SystemReader.java

index 419fdb1966f701250ae3cb47e9a0765bb9d5d4a6..b0365aa7e19ff28ea126796157e49b0d71b3ba36 100644 (file)
@@ -18,6 +18,9 @@ import java.lang.reflect.Field;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.time.Duration;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
@@ -201,6 +204,11 @@ public class MockSystemReader extends SystemReader {
                return now;
        }
 
+       @Override
+       public Instant now() {
+               return Instant.ofEpochMilli(now);
+       }
+
        @Override
        public MonotonicClock getClock() {
                return () -> {
@@ -236,11 +244,21 @@ public class MockSystemReader extends SystemReader {
                return getTimeZone().getOffset(when) / (60 * 1000);
        }
 
+       @Override
+       public ZoneOffset getTimeZoneAt(Instant when) {
+               return getTimeZoneId().getRules().getOffset(when);
+       }
+
        @Override
        public TimeZone getTimeZone() {
                return TimeZone.getTimeZone("GMT-03:30");
        }
 
+       @Override
+       public ZoneId getTimeZoneId() {
+               return ZoneOffset.ofHoursMinutes(-3, 30);
+       }
+
        @Override
        public Locale getLocale() {
                return Locale.US;
index f2c73f5c487200998bd7be47de28af20d89bbcf6..aed6683062ecb213ddb412e5238dad21b7d81379 100644 (file)
             </message_arguments>
         </filter>
     </resource>
+    <resource path="src/org/eclipse/jgit/util/SystemReader.java" type="org.eclipse.jgit.util.SystemReader">
+        <filter id="336695337">
+            <message_arguments>
+                <message_argument value="org.eclipse.jgit.util.SystemReader"/>
+                <message_argument value="getTimeZoneAt(Instant)"/>
+            </message_arguments>
+        </filter>
+        <filter id="336695337">
+            <message_arguments>
+                <message_argument value="org.eclipse.jgit.util.SystemReader"/>
+                <message_argument value="now()"/>
+            </message_arguments>
+        </filter>
+    </resource>
 </component>
index 03ed925617e614dec930a4974aec0f43845c73a6..7150e471bc82a288e28b308aec3587f3f7110963 100644 (file)
@@ -25,6 +25,9 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
 import java.util.Locale;
 import java.util.TimeZone;
 import java.util.concurrent.atomic.AtomicReference;
@@ -166,10 +169,20 @@ public abstract class SystemReader {
                        return System.currentTimeMillis();
                }
 
+               @Override
+               public Instant now() {
+                       return Instant.now();
+               }
+
                @Override
                public int getTimezone(long when) {
                        return getTimeZone().getOffset(when) / (60 * 1000);
                }
+
+               @Override
+               public ZoneOffset getTimeZoneAt(Instant when) {
+                       return getTimeZoneId().getRules().getOffset(when);
+               }
        }
 
        /**
@@ -227,10 +240,20 @@ public abstract class SystemReader {
                        return delegate.getCurrentTime();
                }
 
+               @Override
+               public Instant now() {
+                       return delegate.now();
+               }
+
                @Override
                public int getTimezone(long when) {
                        return delegate.getTimezone(when);
                }
+
+               @Override
+               public ZoneOffset getTimeZoneAt(Instant when) {
+                       return delegate.getTimeZoneAt(when);
+               }
        }
 
        private static volatile SystemReader INSTANCE = DEFAULT;
@@ -501,9 +524,21 @@ public abstract class SystemReader {
         * Get the current system time
         *
         * @return the current system time
+        *
+        * @deprecated Use {@link #now()}
         */
+       @Deprecated
        public abstract long getCurrentTime();
 
+       /**
+        * Get the current system time
+        *
+        * @return the current system time
+        *
+        * @since 7.1
+        */
+       public abstract Instant now();
+
        /**
         * Get clock instance preferred by this system.
         *
@@ -520,19 +555,45 @@ public abstract class SystemReader {
         * @param when
         *            a system timestamp
         * @return the local time zone
+        *
+        * @deprecated Use {@link #getTimeZoneAt(Instant)} instead.
         */
+       @Deprecated
        public abstract int getTimezone(long when);
 
+       /**
+        * Get the local time zone offset at "when" time
+        *
+        * @param when
+        *            a system timestamp
+        * @return the local time zone
+        * @since 7.1
+        */
+       public abstract ZoneOffset getTimeZoneAt(Instant when);
+
        /**
         * Get system time zone, possibly mocked for testing
         *
         * @return system time zone, possibly mocked for testing
         * @since 1.2
+        *
+        * @deprecated Use {@link #getTimeZoneId()}
         */
+       @Deprecated
        public TimeZone getTimeZone() {
                return TimeZone.getDefault();
        }
 
+       /**
+        * Get system time zone, possibly mocked for testing
+        *
+        * @return system time zone, possibly mocked for testing
+        * @since 7.1
+        */
+       public ZoneId getTimeZoneId() {
+               return ZoneId.systemDefault();
+       }
+
        /**
         * Get the locale to use
         *