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

desruisseaux pushed a commit to branch geoapi-3.1
in repository https://gitbox.apache.org/repos/asf/sis.git

commit 269d8e975979799762d278031fd422db4ddd971e
Merge: 5dab0950ea 76bddb705e
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Fri May 24 18:45:47 2024 +0200

    Merge branch 'geoapi-4.0' into geoapi-3.1

 .../main/org/apache/sis/console/AboutCommand.java  |   4 +-
 .../apache/sis/feature/FeatureMemoryBenchmark.java |   4 +-
 .../test/org/apache/sis/filter/PeriodLiteral.java  |   8 +-
 .../org/apache/sis/filter/TemporalFilterTest.java  |   2 +-
 .../sis/metadata/iso/acquisition/DefaultEvent.java |  34 +-
 .../sis/metadata/iso/acquisition/package-info.java |   2 +-
 .../metadata/iso/citation/DefaultCitationDate.java |  55 ++-
 .../sis/metadata/iso/citation/package-info.java    |   2 +-
 .../metadata/iso/extent/DefaultTemporalExtent.java | 101 +++--
 .../apache/sis/metadata/iso/extent/Extents.java    | 131 ++++---
 .../sis/metadata/iso/legacy/TemporalToDate.java    |  13 +-
 .../metadata/iso/lineage/DefaultProcessStep.java   |   4 +-
 .../maintenance/DefaultMaintenanceInformation.java |   4 +-
 .../sis/metadata/privy/ImplementationHelper.java   |   2 +-
 .../apache/sis/pending/temporal/DefaultPeriod.java |   4 +-
 .../sis/pending/temporal/TemporalUtilities.java    |  50 ++-
 .../org/apache/sis/xml/bind/gml/TM_Primitive.java  |  33 +-
 .../apache/sis/xml/bind/gml/TemporalAdapter.java   |  67 ++++
 .../apache/sis/xml/bind/gml/TimePeriodBound.java   |   1 +
 .../sis/xml/bind/gml/UniversalTimeAdapter.java     |   2 +-
 .../org/apache/sis/xml/privy/XmlUtilities.java     |  33 +-
 .../sis/metadata/iso/extent/DefaultExtentTest.java |  25 +-
 .../iso/extent/DefaultTemporalExtentTest.java      |  59 +++
 .../apache/sis/xml/bind/gml/TimePeriodTest.java    |  31 +-
 .../apache/sis/xml/bind/lan/LanguageCodeTest.java  |   2 +-
 .../org/apache/sis/xml/privy/XmlUtilitiesTest.java |  14 +-
 .../referencing/gazetteer/AbstractLocation.java    |   6 +-
 .../sis/referencing/gazetteer/LocationFormat.java  |  17 +-
 .../gazetteer/MilitaryGridReferenceSystem.java     |   2 +-
 .../sis/referencing/gazetteer/SimpleLocation.java  |  13 +-
 .../gazetteer/GeohashReferenceSystemTest.java      |   2 +-
 .../gazetteer/MilitaryGridReferenceSystemTest.java |   2 +-
 .../sis/geometry/AbstractDirectPosition.java       |  10 -
 .../org/apache/sis/geometry/CoordinateFormat.java  |  20 +-
 .../org/apache/sis/geometry/DirectPosition2D.java  |  10 -
 .../main/org/apache/sis/io/wkt/Element.java        |   5 +-
 .../main/org/apache/sis/io/wkt/Formatter.java      |  53 ++-
 .../apache/sis/io/wkt/GeodeticObjectParser.java    |  24 +-
 .../main/org/apache/sis/io/wkt/WKTFormat.java      |   2 +-
 .../main/org/apache/sis/referencing/CommonCRS.java |  26 +-
 .../sis/referencing/GeodesicsOnEllipsoid.java      |   4 +-
 .../apache/sis/referencing/GeodeticCalculator.java |  48 +--
 .../sis/referencing/crs/DefaultTemporalCRS.java    |  19 +-
 .../sis/referencing/datum/BursaWolfParameters.java |  16 +-
 .../referencing/datum/DefaultGeodeticDatum.java    |  10 +-
 .../referencing/datum/DefaultTemporalDatum.java    |  62 ++--
 .../sis/referencing/datum/TimeDependentBWP.java    |  42 ++-
 .../factory/ConcurrentAuthorityFactory.java        |   6 +-
 .../referencing/factory/GeodeticObjectFactory.java |  94 +++--
 .../factory/MultiAuthoritiesFactory.java           |   4 +-
 .../sis/referencing/factory/ReferenceKeeper.java   |   4 +-
 .../referencing/factory/sql/EPSGDataAccess.java    |  28 +-
 .../sis/referencing/factory/sql/EPSGInstaller.java |   4 +-
 .../org/apache/sis/referencing/internal/Epoch.java |   4 +-
 .../operation/CoordinateOperationFinder.java       |  39 +-
 .../operation/builder/LinearTransformBuilder.java  |  24 +-
 .../sis/referencing/privy/ExtentSelector.java      |  23 +-
 .../org/apache/sis/referencing/privy/Formulas.java |   9 -
 .../referencing/privy/GeodeticObjectBuilder.java   |   6 +-
 .../sis/referencing/privy/TemporalAccessor.java    |   4 +-
 .../test/org/apache/sis/io/wkt/ElementTest.java    |   6 +-
 .../sis/io/wkt/GeodeticObjectParserTest.java       |   9 +-
 .../org/apache/sis/referencing/CommonCRSTest.java  |  30 +-
 .../referencing/crs/DefaultTemporalCRSTest.java    |  10 +-
 .../referencing/datum/BursaWolfParametersTest.java |   5 +-
 .../datum/DefaultTemporalDatumTest.java            |  25 +-
 .../sis/referencing/datum/HardCodedDatum.java      |   8 +-
 .../referencing/datum/TimeDependentBWPTest.java    |  21 +-
 .../factory/ConcurrentAuthorityFactoryTest.java    |   2 +-
 .../internal/ServicesForMetadataTest.java          |  41 +--
 .../operation/CoordinateOperationFinderTest.java   |   3 +-
 .../projection/MercatorMethodComparison.java       |   2 +-
 .../operation/projection/ProjectionBenchmark.java  |   5 +-
 .../sis/referencing/privy/ExtentSelectorTest.java  |  10 +-
 .../apache/sis/referencing/privy/FormulasTest.java |   8 -
 .../apache/sis/test/integration/MetadataTest.java  |   4 +-
 .../apache/sis/storage/landsat/MetadataReader.java |  10 +-
 .../sis/storage/geotiff/ImageFileDirectory.java    |   2 +-
 .../sis/storage/geotiff/reader/CRSBuilder.java     |   3 +-
 .../apache/sis/storage/netcdf/MetadataReader.java  |  12 +-
 .../apache/sis/storage/netcdf/base/AxisType.java   |   3 +-
 .../apache/sis/storage/netcdf/base/CRSBuilder.java |  12 +-
 .../apache/sis/storage/netcdf/base/Convention.java |   3 +-
 .../apache/sis/storage/netcdf/base/Decoder.java    |  25 +-
 .../sis/storage/netcdf/base/GridMapping.java       |   7 +-
 .../org/apache/sis/storage/netcdf/base/HYCOM.java  |   8 +-
 .../apache/sis/storage/netcdf/base/Variable.java   |   3 +-
 .../sis/storage/netcdf/classic/ChannelDecoder.java |  40 +-
 .../sis/storage/netcdf/ucar/DecoderWrapper.java    |  13 +-
 .../sis/storage/netcdf/base/DecoderTest.java       |  21 +-
 .../apache/sis/storage/netcdf/base/TestCase.java   |  12 +-
 .../sis/storage/sql/feature/ValueGetter.java       |  10 +-
 .../sis/storage/xml/stream/StaxStreamReader.java   |   2 +-
 .../sis/storage/AbstractGridCoverageResource.java  |   4 +-
 .../org/apache/sis/storage/base/LegalSymbols.java  |   2 +-
 .../apache/sis/storage/base/MetadataBuilder.java   |  39 +-
 .../main/org/apache/sis/storage/csv/Store.java     |   7 +-
 .../org/apache/sis/storage/csv/TimeEncoding.java   |  27 +-
 .../sis/storage/test/CoverageReadConsistency.java  |   4 +-
 .../main/org/apache/sis/io/CompoundFormat.java     |   2 +-
 .../main/org/apache/sis/measure/RangeFormat.java   |   6 +-
 .../org/apache/sis/measure/UnitNames.properties    |   1 +
 .../org/apache/sis/measure/UnitNames_fr.properties |   1 +
 .../main/org/apache/sis/measure/Units.java         |  50 ++-
 .../main/org/apache/sis/pending/jdk/JDK23.java     |  47 +++
 .../main/org/apache/sis/setup/About.java           |   2 +-
 .../apache/sis/util/logging/MonolineFormatter.java |   2 +-
 .../main/org/apache/sis/util/privy/Constants.java  |  48 +++
 .../org/apache/sis/util/privy/DoubleDouble.java    |  11 +
 .../apache/sis/util/privy/StandardDateFormat.java  | 120 +-----
 .../org/apache/sis/util/privy/TemporalDate.java    | 236 ++++++++++++
 .../main/org/apache/sis/util/resources/Errors.java | 408 ++++++++++-----------
 .../org/apache/sis/measure/RangeFormatTest.java    |   2 +-
 .../org/apache/sis/measure/UnitFormatTest.java     |   1 +
 .../test/org/apache/sis/test/TestUtilities.java    |  15 +-
 .../org/apache/sis/util/collection/CacheTest.java  |   4 +-
 .../apache/sis/util/collection/RangeSetTest.java   |   4 +-
 .../org/apache/sis/util/privy/ConstantsTest.java   |  51 +++
 .../sis/util/privy/StandardDateFormatTest.java     |  18 +-
 geoapi/snapshot                                    |   2 +-
 .../main/org/apache/sis/gui/map/MapCanvas.java     |   2 +-
 .../sis/gui/metadata/IdentificationInfo.java       |   9 +-
 .../apache/sis/gui/referencing/AuthorityCodes.java |   6 +-
 123 files changed, 1708 insertions(+), 1127 deletions(-)

diff --cc 
endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/lineage/DefaultProcessStep.java
index c2cf029dfc,05df948518..a91ec949e4
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/lineage/DefaultProcessStep.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/lineage/DefaultProcessStep.java
@@@ -34,14 -34,11 +34,14 @@@ import org.apache.sis.metadata.TitlePro
  import org.apache.sis.metadata.iso.ISOMetadata;
  import org.apache.sis.util.iso.Types;
  import org.apache.sis.xml.bind.FilterByVersion;
- import org.apache.sis.xml.privy.LegacyNamespaces;
  import org.apache.sis.xml.bind.gml.TM_Primitive;
  import org.apache.sis.xml.bind.metadata.MD_Scope;
+ import org.apache.sis.xml.privy.LegacyNamespaces;
  import org.apache.sis.pending.temporal.TemporalUtilities;
  
 +// Specific to the main and geoapi-3.1 branches:
 +import org.opengis.metadata.citation.ResponsibleParty;
 +
  // Specific to the geoapi-3.1 and geoapi-4.0 branches:
  import org.opengis.metadata.maintenance.Scope;
  
diff --cc 
endorsed/src/org.apache.sis.metadata/main/org/apache/sis/pending/temporal/TemporalUtilities.java
index 9dbd8518ad,baedbaaaed..591aee1ba7
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/pending/temporal/TemporalUtilities.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/pending/temporal/TemporalUtilities.java
@@@ -37,32 -40,39 +40,49 @@@ public final class TemporalUtilities 
      private TemporalUtilities() {
      }
  
 +    /**
 +     * Creates an instant for the given date.
 +     *
 +     * @param  time  the date for which to create instant, or {@code null}.
 +     * @return the instant, or {@code null} if the given time was null.
-      * @throws UnsupportedOperationException if the temporal factory is not 
available on the module path.
 +     */
-     public static TemporalPrimitive createInstant(final Date time) throws 
UnsupportedOperationException {
-         if (time == null) return null;
-         final Instant t = time.toInstant();
-         return new DefaultPeriod(t, t);
++    public static TemporalPrimitive createInstant(final Date time) {
++        return (time == null) ? null : createInstant(time.toInstant());
 +    }
 +
      /**
-      * Creates a period for the given begin and end dates.
+      * Creates an instant for the given Java temporal instant.
       *
-      * @param  begin  the begin date (inclusive), or {@code null}.
-      * @param  end    the end date (inclusive), or {@code null}.
+      * @param  time  the date for which to create instant, or {@code null}.
+      * @return the instant, or {@code null} if the given time was null.
+      */
+     public static TemporalPrimitive createInstant(final Instant time) {
+         return (time == null) ? null : new DefaultPeriod(time, time);
+     }
+ 
+     /**
+      * Creates a period for the given begin and end instant.
+      *
+      * @param  begin  the begin instant (inclusive), or {@code null}.
+      * @param  end    the end instant (inclusive), or {@code null}.
       * @return the period, or {@code null} if both arguments are null.
-      * @throws UnsupportedOperationException if the temporal factory is not 
available on the module path.
       */
-     public static TemporalPrimitive createPeriod(final Date begin, final Date 
end) throws UnsupportedOperationException {
-         if (begin == null && end == null) return null;
-         return new DefaultPeriod(
-                 (begin != null) ? begin.toInstant() : null,
-                   (end != null) ?   end.toInstant() : null);
+     public static TemporalPrimitive createPeriod(final Instant begin, final 
Instant end) {
+         return (begin == null && end == null) ? null : new 
DefaultPeriod(begin, end);
+     }
+ 
+     /**
+      * Creates a period for the given begin and end instant.
+      *
+      * @param  begin  the begin instant (inclusive), or {@code null}.
+      * @param  end    the end instant (inclusive), or {@code null}.
+      * @return the period, or {@code null} if both arguments are null.
+      *
+      * @todo Needs to avoid assuming UTC timezone.
+      */
+     public static TemporalPrimitive createPeriod(final Temporal begin, final 
Temporal end) {
+         return createPeriod(TemporalDate.toInstant(begin, ZoneOffset.UTC),
+                             TemporalDate.toInstant(end,   ZoneOffset.UTC));
      }
  
      /**
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/geometry/CoordinateFormat.java
index 113ee12fe3,efc89b49e2..8b353f26fa
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/geometry/CoordinateFormat.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/geometry/CoordinateFormat.java
@@@ -575,8 -580,8 +580,8 @@@ public class CoordinateFormat extends C
                      }
                      types  [i] = DATE;
                      formats[i] = getFormat(Date.class);
-                     epochs [i] = ((TemporalCRS) 
t).getDatum().getOrigin().getTime();
-                     setConverter(dimension, i, 
unit.asType(Time.class).getConverterTo(Units.MILLISECOND));
 -                    epochs [i] = TemporalDate.toInstant(((TemporalCRS) 
t).getDatum().getOrigin(), null);
++                    epochs [i] = TemporalDate.toInstant(((TemporalCRS) 
t).getDatum().getOrigin());
+                     setConverter(dimension, i, 
unit.asType(Time.class).getConverterTo(Units.SECOND));
                      if (direction == AxisDirection.PAST) {
                          negate(i);
                      }
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultTemporalCRS.java
index 3644a65a34,0c3a5579d9..5381ff13e1
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultTemporalCRS.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultTemporalCRS.java
@@@ -40,9 -42,9 +42,12 @@@ import org.apache.sis.metadata.privy.Im
  import org.apache.sis.io.wkt.Formatter;
  import org.apache.sis.measure.Units;
  import org.apache.sis.math.Fraction;
- import static org.apache.sis.util.privy.StandardDateFormat.NANOS_PER_SECOND;
- import static org.apache.sis.util.privy.StandardDateFormat.MILLIS_PER_SECOND;
+ import static org.apache.sis.util.privy.Constants.NANOS_PER_SECOND;
+ import static org.apache.sis.util.privy.Constants.MILLIS_PER_SECOND;
+ 
++// Specific to the main and geoapi-3.1 branches:
++import org.apache.sis.util.privy.TemporalDate;
 +
  
  /**
   * A 1-dimensional coordinate reference system used for the recording of time.
@@@ -223,10 -225,10 +228,10 @@@ public class DefaultTemporalCRS extend
       */
      private void initializeConverter() {
          toSeconds = getUnit().getConverterTo(Units.SECOND);
-         long t = datum.getOrigin().getTime();
-         origin = t / MILLIS_PER_SECOND;
-         t %= MILLIS_PER_SECOND;
-         if (t != 0) {
 -        final Temporal t = datum.getOrigin();
++        final Temporal t = TemporalDate.toTemporal(datum.getOrigin());
+         origin = t.getLong(ChronoField.INSTANT_SECONDS);
+         int r = t.get(ChronoField.NANO_OF_SECOND);
+         if (r != 0) {
              /*
               * The origin is usually an integer number of days or hours. It 
rarely has a fractional number of seconds.
               * If it happens anyway, put the fractional number of seconds in 
the converter instead of adding another
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/DefaultTemporalDatum.java
index cb7a8d5e53,51ebb99c78..cc44c7ebb9
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/DefaultTemporalDatum.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/DefaultTemporalDatum.java
@@@ -34,6 -34,6 +34,9 @@@ import org.apache.sis.util.ComparisonMo
  import org.apache.sis.io.wkt.Formatter;
  import org.apache.sis.io.wkt.FormattableObject;
  
++// Specific to the main and geoapi-3.1 branches:
++import org.apache.sis.util.privy.TemporalDate;
++
  // Specific to the geoapi-3.1 and geoapi-4.0 branches:
  import org.opengis.metadata.Identifier;
  
@@@ -162,7 -166,7 +169,7 @@@ public class DefaultTemporalDatum exten
       */
      protected DefaultTemporalDatum(final TemporalDatum datum) {
          super(datum);
-         origin = ImplementationHelper.toMilliseconds(datum.getOrigin());
 -        origin = datum.getOrigin();
++        origin = TemporalDate.toTemporal(datum.getOrigin());
      }
  
      /**
@@@ -202,11 -206,8 +209,8 @@@
       * @return the date and time origin of this temporal datum.
       */
      @Override
-     @XmlSchemaType(name = "dateTime")
-     @XmlElement(name = "origin", required = true)
-     @XmlJavaTypeAdapter(UniversalTimeAdapter.class)
 -    public Temporal getOrigin() {
 -        return origin;
 +    public Date getOrigin() {
-         return ImplementationHelper.toDate(origin);
++        return TemporalDate.toDate(origin);
      }
  
      /**
@@@ -261,7 -262,7 +265,7 @@@
      @Override
      protected String formatTo(final Formatter formatter) {
          super.formatTo(formatter);
--        formatter.append(new Origin(getOrigin()));
++        formatter.append(new Origin(TemporalDate.toTemporal(getOrigin())));
          if (formatter.getConvention().majorVersion() == 1) {
              formatter.setInvalidWKT(this, null);
          }
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
index 82eeff00dc,39a7d78e28..92beac6368
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
@@@ -69,6 -70,6 +70,9 @@@ import org.apache.sis.util.privy.Double
  import org.apache.sis.util.resources.Vocabulary;
  import static org.apache.sis.util.Utilities.equalsIgnoreMetadata;
  
++// Specific to the main and geoapi-3.1 branches:
++import org.apache.sis.util.privy.TemporalDate;
++
  
  /**
   * Finds a conversion or transformation path from a source CRS to a target 
CRS.
@@@ -869,9 -866,8 +873,10 @@@ public class CoordinateOperationFinder 
           * This "epoch shift" is in units of `targetCRS`.
           */
          final Unit<Time> targetUnit = 
targetCS.getAxis(0).getUnit().asType(Time.class);
-         DoubleDouble epochShift = 
DoubleDouble.of(sourceDatum.getOrigin().getTime());
-         epochShift = epochShift.subtract(targetDatum.getOrigin().getTime());
-         epochShift = 
DoubleDouble.of(Units.MILLISECOND.getConverterTo(targetUnit).convert(epochShift),
 true);
 -        DoubleDouble epochShift = 
DoubleDouble.of(Duration.between(targetDatum.getOrigin(), 
sourceDatum.getOrigin()));
++        DoubleDouble epochShift = DoubleDouble.of(Duration.between(
++                TemporalDate.toTemporal(targetDatum.getOrigin()),
++                TemporalDate.toTemporal(sourceDatum.getOrigin())));
+         epochShift = 
DoubleDouble.of(Units.NANOSECOND.getConverterTo(targetUnit).convert(epochShift),
 true);
          /*
           * Check axis directions. The method `swapAndScaleAxes` should 
returns a matrix of size 2×2.
           * The element at index (0,0) may be +1 if source and target axes are 
in the same direction,
diff --cc 
endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/GeodeticObjectParserTest.java
index 3b3719cfcd,4610b54611..6356d054c5
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/GeodeticObjectParserTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/GeodeticObjectParserTest.java
@@@ -43,8 -43,8 +43,11 @@@ import org.apache.sis.referencing.facto
  import org.apache.sis.referencing.operation.transform.MathTransforms;
  import org.apache.sis.referencing.operation.transform.LinearTransform;
  import org.apache.sis.measure.Units;
- import static 
org.apache.sis.util.privy.StandardDateFormat.MILLISECONDS_PER_DAY;
+ import static org.apache.sis.util.privy.Constants.SECONDS_PER_DAY;
+ 
++// Specific to the main and geoapi-3.1 branches:
++import org.apache.sis.util.privy.TemporalDate;
 +
  // Test dependencies
  import org.junit.jupiter.api.Test;
  import static org.junit.jupiter.api.Assertions.*;
@@@ -1065,7 -1065,7 +1068,7 @@@ public final class GeodeticObjectParser
          final TemporalDatum timeDatum = timeCRS.getDatum();
          assertNameAndIdentifierEqual("Time", 0, timeCRS);
          assertNameAndIdentifierEqual("Modified Julian", 0, timeDatum);
-         assertEquals(new Date(-40587L * MILLISECONDS_PER_DAY), 
timeDatum.getOrigin(), "epoch");
 -        assertEquals(Instant.ofEpochSecond(-40587L * SECONDS_PER_DAY), 
timeDatum.getOrigin(), "epoch");
++        assertEquals(Instant.ofEpochSecond(-40587L * SECONDS_PER_DAY), 
TemporalDate.toTemporal(timeDatum.getOrigin()), "epoch");
  
          // No more CRS.
          assertFalse(components.hasNext());
diff --cc 
endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/CommonCRSTest.java
index 206e67dc7d,712918bd4a..d2a66ce416
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/CommonCRSTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/CommonCRSTest.java
@@@ -50,6 -54,6 +54,7 @@@ import static org.apache.sis.util.privy
  // Specific to the geoapi-3.1 and geoapi-4.0 branches:
  import org.opengis.referencing.datum.RealizationMethod;
  import static org.opengis.test.Assertions.assertAxisDirectionsEqual;
++import org.apache.sis.util.privy.TemporalDate;
  
  
  /**
@@@ -255,8 -254,20 +255,20 @@@ public final class CommonCRSTest extend
       */
      @Test
      public void testTemporal() {
-         final double julianEpoch = 
CommonCRS.Temporal.JULIAN.datum().getOrigin().getTime() / DAY_LENGTH;
-         assertTrue(julianEpoch < 0);
 -        final var julianEpoch = (Instant) 
CommonCRS.Temporal.JULIAN.datum().getOrigin();
++        final var julianEpoch = 
TemporalDate.toInstant(CommonCRS.Temporal.JULIAN.datum().getOrigin());
+         final double SECONDS_PER_DAY = Constants.SECONDS_PER_DAY;
+         final double julianEpochSecond = julianEpoch.getEpochSecond() / 
SECONDS_PER_DAY;
+         assertTrue(julianEpochSecond < 0);
+         /*
+          * We need to use `java.text.DateFormat` rather than 
`Instant.parse(String)` because
+          * they have different policy regarding the calendar for dates before 
October 15, 1582.
+          * The `java.time` classes use the proleptic Gregorian calendar while 
`java.text` uses
+          * the prolectic Julian calendar. The latter is what we need for this 
test.
+          */
+         final var dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", 
Locale.CANADA);
+         dateFormat.setTimeZone(TimeZone.getTimeZone(UTC));
+         dateFormat.setLenient(false);
+ 
          for (final CommonCRS.Temporal e : CommonCRS.Temporal.values()) {
              final String epoch;
              final double days;
@@@ -277,8 -288,8 +289,8 @@@
              Validators.validate(crs);
              assertSame(datum, e.datum(), name);             // Datum before 
CRS creation.
              assertSame(crs.getDatum(), e.datum(), name);    // Datum after 
CRS creation.
-             assertEquals(epoch, format(origin), name);
-             assertEquals(days, origin.getTime() / DAY_LENGTH - julianEpoch, 
name);
 -            assertEquals(epoch, dateFormat.format(Date.from(origin)), name);
 -            assertEquals(days, origin.getEpochSecond() / SECONDS_PER_DAY - 
julianEpochSecond, name);
++            assertEquals(epoch, dateFormat.format(origin), name);
++            assertEquals(days, origin.getTime() / (1000*SECONDS_PER_DAY) - 
julianEpochSecond, name);
              switch (e) {
                  case JAVA: {
                      assertNameContains(datum, "Unix/POSIX");
diff --cc 
endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultTemporalDatumTest.java
index 80821b864b,443246a803..58b4981490
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultTemporalDatumTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultTemporalDatumTest.java
@@@ -34,6 -34,6 +34,9 @@@ import static org.apache.sis.referencin
  import static org.apache.sis.test.TestUtilities.getSingleton;
  import static org.apache.sis.test.TestUtilities.getScope;
  
++// Specific to the main and geoapi-3.1 branches:
++import org.apache.sis.util.privy.TemporalDate;
++
  // Specific to the geoapi-3.1 and geoapi-4.0 branches:
  import static org.opengis.referencing.ObjectDomain.*;
  import static org.opengis.referencing.IdentifiedObject.*;
@@@ -86,7 -88,7 +91,7 @@@ public final class DefaultTemporalDatum
       */
      @Test
      public void testConsistency() {
-         assertEquals(HardCodedDatum.MODIFIED_JULIAN.getOrigin(), new 
Date(ORIGIN));
 -        assertEquals(HardCodedDatum.MODIFIED_JULIAN.getOrigin(), 
ORIGIN.toInstant());
++        
assertEquals(TemporalDate.toTemporal(HardCodedDatum.MODIFIED_JULIAN.getOrigin()),
 ORIGIN.toInstant());
      }
  
      /**
@@@ -129,6 -131,6 +134,6 @@@
          assertEquals("Modified Julian", datum.getName().getCode());
          assertRemarksEquals("Time measured as days since November 17, 1858 at 
00:00 UTC.", datum, null);
          assertEquals("History.", getScope(datum));
-         assertEquals(new Date(ORIGIN), datum.getOrigin());
 -        assertEquals(ORIGIN, datum.getOrigin());
++        assertEquals(ORIGIN, TemporalDate.toTemporal(datum.getOrigin()));
      }
  }
diff --cc 
endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/HardCodedDatum.java
index cfb5e1e085,3edb04e959..dedd0764fd
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/HardCodedDatum.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/HardCodedDatum.java
@@@ -16,10 -16,9 +16,10 @@@
   */
  package org.apache.sis.referencing.datum;
  
- import java.util.Date;
  import java.util.Map;
  import java.util.HashMap;
+ import java.time.Instant;
 +import org.opengis.referencing.datum.PixelInCell;
  import org.apache.sis.referencing.NamedIdentifier;
  import org.apache.sis.referencing.internal.VerticalDatumTypes;
  import org.apache.sis.measure.Units;
diff --cc 
endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/LegalSymbols.java
index 3ea5a57b36,570b35d2e2..b71b7cc956
--- 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/LegalSymbols.java
+++ 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/LegalSymbols.java
@@@ -27,10 -27,10 +27,10 @@@ import org.apache.sis.metadata.iso.cita
  import org.apache.sis.metadata.iso.citation.DefaultCitation;
  import org.apache.sis.metadata.iso.citation.DefaultCitationDate;
  import org.apache.sis.metadata.iso.constraint.DefaultLegalConstraints;
- import static 
org.apache.sis.util.privy.StandardDateFormat.MILLISECONDS_PER_DAY;
+ import static org.apache.sis.util.privy.Constants.MILLISECONDS_PER_DAY;
  
 -// Specific to the geoapi-4.0 branch:
 -import org.apache.sis.metadata.iso.citation.DefaultResponsibility;
 +// Specific to the main and geoapi-3.1 branches:
 +import org.apache.sis.metadata.iso.citation.DefaultResponsibleParty;
  
  
  /**
diff --cc 
endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/csv/TimeEncoding.java
index 34580953fb,1571c6b88b..8fe13bc062
--- 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/csv/TimeEncoding.java
+++ 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/csv/TimeEncoding.java
@@@ -62,8 -64,8 +64,8 @@@ class TimeEncoding extends SurjectiveCo
       * Creates a new time encoding.
       */
      TimeEncoding(final TemporalDatum datum, final Unit<Time> unit) {
-         this.origin   = datum.getOrigin().getTime();
-         this.interval = unit.getConverterTo(Units.MILLISECOND).convert(1);
 -        this.origin   = TemporalDate.toInstant(datum.getOrigin(), null);
++        this.origin   = TemporalDate.toInstant(datum.getOrigin());
+         this.interval = unit.getConverterTo(Units.SECOND).convert(1);
      }
  
      /**
diff --cc geoapi/snapshot
index 80d7264486,ccc41ee613..ed7e9f0463
--- a/geoapi/snapshot
+++ b/geoapi/snapshot
@@@ -1,1 -1,1 +1,1 @@@
- Subproject commit 80d72644860facda496cef21b132d13fec65c029
 -Subproject commit ccc41ee613b7451366a796fada91c1f74f8f7168
++Subproject commit ed7e9f0463a9b5eb0f9181da5ca070d0b79375ac

Reply via email to