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

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

commit 0661f9eaf0ee9d18b2053ea011cfe695d2072af5
Merge: d581822c74 236ded5a92
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Fri Aug 15 23:13:03 2025 +0200

    Merge branch 'geoapi-3.1'.
    Contains an upgrade of the EPSG installer for EPSG version 12.

 .../coverage/grid/BandAggregateGridCoverage.java   |   2 +-
 .../sis/coverage/grid/ClippedGridCoverage.java     | 193 ++++++
 .../apache/sis/coverage/grid/DefaultEvaluator.java |   3 +-
 .../sis/coverage/grid/DerivedGridCoverage.java     |   2 +-
 .../org/apache/sis/coverage/grid/GridCoverage.java |   4 +-
 .../apache/sis/coverage/grid/GridCoverage2D.java   |   4 +-
 .../sis/coverage/grid/GridCoverageProcessor.java   |  34 +-
 .../org/apache/sis/coverage/grid/GridExtent.java   |   6 +-
 .../apache/sis/coverage/grid/ImageRenderer.java    |  50 +-
 .../sis/coverage/grid/ResampledGridCoverage.java   |   4 +-
 .../sis/coverage/grid/TranslatedGridCoverage.java  |   9 +-
 .../main/org/apache/sis/image/BandSelectImage.java |  22 +-
 .../main/org/apache/sis/image/ImageOverlay.java    |   2 +
 .../main/org/apache/sis/image/PlanarImage.java     |  25 +-
 .../sis/image/PositionalConsistencyImage.java      |   6 +-
 .../org/apache/sis/image/SourceAlignedImage.java   |   7 +-
 .../sis/coverage/grid/ClippedGridCoverageTest.java | 202 +++++++
 .../coverage/grid/ConvertedGridCoverageTest.java   |   9 +-
 .../sis/coverage/grid/GridCoverage2DTest.java      |   4 +-
 .../coverage/grid/TranslatedGridCoverageTest.java  |   4 +-
 .../org/apache/sis/metadata/sql/Installer.java     |   2 +-
 .../org/apache/sis/metadata/sql/privy/Dialect.java |  78 ++-
 .../sis/metadata/sql/privy/ScriptRunner.java       | 274 +++------
 .../apache/sis/metadata/sql/privy/Supports.java    |  41 +-
 .../main/org/apache/sis/temporal/TemporalDate.java |   2 +-
 .../org/apache/sis/metadata/sql/TestDatabase.java  |   2 +-
 .../sis/metadata/sql/privy/ScriptRunnerTest.java   |   9 +-
 .../sis/metadata/sql/privy/SupportsTest.java}      |  34 +-
 .../org/apache/sis/map/coverage/RenderingData.java |  22 +-
 .../main/org/apache/sis/portrayal/Canvas.java      |   2 +-
 .../sis/referencing/crs/AbstractSingleCRS.java     |  32 +-
 .../org/apache/sis/referencing/cs/AbstractCS.java  |   2 +-
 .../sis/referencing/datum/AbstractDatum.java       |   2 +-
 .../referencing/factory/sql/AuthorityCodes.java    |   6 +-
 .../referencing/factory/sql/EPSGCodeFinder.java    |  18 +-
 .../referencing/factory/sql/EPSGDataAccess.java    |  26 +-
 .../sis/referencing/factory/sql/EPSGFactory.java   |  54 +-
 .../sis/referencing/factory/sql/EPSGInstaller.java | 190 ++----
 .../sis/referencing/factory/sql/EPSG_Finish.sql    | 117 ++--
 .../sis/referencing/factory/sql/EPSG_Prepare.sql   |  32 +-
 .../factory/sql/InstallationScriptProvider.java    |  31 +-
 .../sis/referencing/factory/sql/SQLTranslator.java | 224 +++----
 .../sis/referencing/factory/sql/TableInfo.java     |  32 +-
 .../referencing/internal/VerticalDatumTypes.java   |   2 -
 .../operation/AbstractCoordinateOperation.java     |   2 +-
 .../referencing/factory/sql/EPSGInstallerTest.java |  40 +-
 .../sis/storage/base/MemoryGridResource.java       | 143 +++--
 .../main/org/apache/sis/pending/jdk/JDK22.java     |  11 +
 .../main/org/apache/sis/util/ComparisonMode.java   |  62 +-
 .../main/org/apache/sis/util/StringBuilders.java   |  23 +-
 .../org/apache/sis/util/StringBuildersTest.java    |  27 +-
 .../coveragejson/CoverageJsonStoreProvider.java    |   5 +-
 .../sis/storage/coveragejson/CoverageResource.java |   8 +-
 .../apache/sis/storage/geopackage/GpkgStore.java   |   2 +-
 netbeans-project/nbproject/project.xml             |   1 +
 optional/build.gradle.kts                          |   2 +
 .../sis/referencing/factory/sql/epsg/Clear.sql     |  43 ++
 .../factory/sql/epsg/DataScriptFormatter.java      | 655 ++++++++++-----------
 .../factory/sql/epsg/DataScriptUpdater.java        |  93 +++
 .../referencing/factory/sql/epsg/DebugTools.sql    |  17 +-
 .../sis/referencing/factory/sql/epsg/README.md     |  40 +-
 .../factory/sql/epsg/TableScriptUpdater.java       | 174 ++++++
 .../referencing/factory/sql/epsg/TableValues.java  | 364 ++++++++++++
 63 files changed, 2334 insertions(+), 1204 deletions(-)

diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/AbstractSingleCRS.java
index e6d0cea5cf,ac88426d4a..16172dd7aa
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/AbstractSingleCRS.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/AbstractSingleCRS.java
@@@ -31,12 -31,12 +31,13 @@@ import org.apache.sis.util.resources.Er
  import org.apache.sis.referencing.IdentifiedObjects;
  import org.apache.sis.referencing.cs.AbstractCS;
  import org.apache.sis.referencing.internal.Resources;
+ import org.apache.sis.metadata.privy.Identifiers;
  import org.apache.sis.metadata.privy.ImplementationHelper;
  
 -// Specific to the geoapi-3.1 and geoapi-4.0 branches:
 -import org.opengis.referencing.datum.DatumEnsemble;
 -import org.opengis.metadata.Identifier;
 +// Specific to the main branch:
 +import org.opengis.referencing.ReferenceIdentifier;
 +import org.apache.sis.referencing.datum.DefaultDatumEnsemble;
 +import org.apache.sis.pending.geoapi.referencing.MissingMethods;
  
  
  /**
@@@ -209,6 -209,22 +210,22 @@@ class AbstractSingleCRS<D extends Datum
          return ensemble;
      }
  
+     /**
+      * Returns whether the given datum may be considered as equivalent to the 
given datum ensemble.
+      * Used for comparisons with {@link ComparisonMode#APPROXIMATE} for 
interoperability between
+      * the legacy and the new definition of EPSG:4326.
+      */
 -    private static boolean isHeuristicMatchForName(final DatumEnsemble<?> 
ensemble, final Datum datum, final ComparisonMode mode) {
++    private static boolean isHeuristicMatchForName(final 
DefaultDatumEnsemble<?> ensemble, final Datum datum, final ComparisonMode mode) 
{
+         if (ensemble == null || datum == null) {
+             return false;
+         }
+         final Boolean match = 
Identifiers.hasCommonIdentifier(ensemble.getIdentifiers(), 
datum.getIdentifiers());
+         if (match != null) {
+             return match;
+         }
+         return IdentifiedObjects.isHeuristicMatchForName(datum, 
ensemble.getName().getCode());
+     }
+ 
      /**
       * Compares this coordinate reference system with the specified object 
for equality.
       *
@@@ -228,8 -244,17 +245,17 @@@
                  }
                  default: {
                      final var that = (SingleCRS) object;
-                     return Utilities.deepEquals(getDatum(), that.getDatum(), 
mode) &&
-                            Utilities.deepEquals(getDatumEnsemble(), 
MissingMethods.getDatumEnsemble(that), mode);
+                     final var d1   = this.getDatum();
+                     final var d2   = that.getDatum();
+                     if (mode == ComparisonMode.DEBUG) {
+                         mode = ComparisonMode.ALLOW_VARIANT;    // For 
avoiding too early `AssertionError`.
+                     }
+                     if (Utilities.deepEquals(d1, d2, mode)) {
 -                        return mode.allowsVariant() || 
Utilities.deepEquals(getDatumEnsemble(), that.getDatumEnsemble(), mode);
++                        return mode.allowsVariant() || 
Utilities.deepEquals(getDatumEnsemble(), MissingMethods.getDatumEnsemble(that), 
mode);
+                     } else if (mode.allowsVariant()) {
+                         return 
isHeuristicMatchForName(this.getDatumEnsemble(), d2, mode) ||
 -                               
isHeuristicMatchForName(that.getDatumEnsemble(), d1, mode);
++                               
isHeuristicMatchForName(MissingMethods.getDatumEnsemble(that), d1, mode);
+                     }
                  }
              }
          }
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
index 8034b0bb4f,38e2b7c7da..8d624ffa7f
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
@@@ -2051,12 -2026,12 +2051,12 @@@ search: try (ResultSet result = execute
          final var accuracy = PositionalAccuracyConstant.ensemble(max);
          final List<Datum> members = createComponents(
                  GeodeticAuthorityFactory::createDatum,
-                 "DatumEnsembleMember",
+                 "Datum Ensemble Member",
                  "SELECT DATUM_CODE"
-                         + " FROM \"DatumEnsembleMember\""
+                         + " FROM \"Datum Ensemble Member\""
                          + " WHERE DATUM_ENSEMBLE_CODE = ?"
                          + " ORDER BY DATUM_SEQUENCE", code);
 -        return (factory, metadata) -> 
DefaultDatumEnsemble.castOrCopy(factory.createDatumEnsemble(metadata, members, 
accuracy));
 +        return (factory, metadata) -> 
extended(factory).createDatumEnsemble(metadata, members, accuracy);
      }
  
      /**
@@@ -2736,24 -2711,22 +2736,24 @@@
  
      /**
       * Returns the realization method for the specified code.
 +     * Returned as the legacy {@link VerticalDatumType} because
 +     * {@code RealizationMethod} did not existed in GeoAPI 3.0.
       *
       * @param  code  code of the realization method, or {@code null} if none.
 -     * @return realization method, or {@code null} if the given code was null.
 +     * @return realization method, or {@code GEOIDAL} if the given code was 
null.
       */
 -    private RealizationMethod getRealizationMethod(final Integer code) throws 
FactoryException, SQLException {
 +    private VerticalDatumType getRealizationMethod(final Integer code) throws 
FactoryException, SQLException {
          assert Thread.holdsLock(this);
          if (code == null) {
 -            return null;
 +            return VerticalDatumType.GEOIDAL;
          }
          final Long cacheKey = cacheKey(2, code);
 -        var returnValue = (RealizationMethod) localCache.get(cacheKey);
 +        var returnValue = (VerticalDatumType) localCache.get(cacheKey);
          if (returnValue == null && code != null) {
              try (ResultSet result = executeQueryForCodes(
-                     "DatumRealizationMethod",
+                     "Datum Realization Method",
                      "SELECT REALIZATION_METHOD_NAME"
-                             + " FROM \"DatumRealizationMethod\""
+                             + " FROM \"Datum Realization Method\""
                              + " WHERE REALIZATION_METHOD_CODE = ?", code))
              {
                  while (result.next()) {
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/TableInfo.java
index 26c70067cf,49c0195828..39925454cf
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/TableInfo.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/TableInfo.java
@@@ -276,13 -265,15 +269,14 @@@ final class TableInfo 
  
      /**
       * Appends a {@code WHERE} clause together with a condition for searching 
the specified object.
-      * This method delegates to {@link #where(Class, StringBuilder)} with the 
type of the given object,
-      * except that some object properties may be inspected for resolving 
ambiguities.
+      * This method delegates to {@link #where(EPSGDataAccess, Class, 
StringBuilder)} with the type
+      * of the given object, except that some object properties may be 
inspected for resolving ambiguities.
       *
-      * @param  object  the object to search in the database.
-      * @param  buffer  where to append the {@code WHERE} clause.
+      * @param  factory  the factory which is writing a <abbr>SQL</abbr> 
statement.
+      * @param  object   the object to search in the database.
+      * @param  buffer   where to append the {@code WHERE} clause.
       */
-     final void where(final IdentifiedObject object, final StringBuilder 
buffer) {
 -    @SuppressWarnings("deprecation")
+     final void where(final EPSGDataAccess factory, final IdentifiedObject 
object, final StringBuilder buffer) {
          Class<?> userType = object.getClass();
          if (object instanceof GeodeticCRS) {
              final CoordinateSystem cs = ((GeodeticCRS) 
object).getCoordinateSystem();

Reply via email to