You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2026/05/28 15:55:41 UTC

(sis) branch geoapi-3.1 updated (3b34cf323f -> 45a58d0acf)

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

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


    from 3b34cf323f Merge geoapi-4.0 into geoapi-3.1. The main work are related to improvement in GeoHEIF support.
     add 926e381671 Add a `getStandardType()` method in `LenientComparable` and implement that method in classes. Refactor the `getInterface()` methods in `AbstractMetadata` and `AbstractIdentifiedObject`.
     add 0186afd021 `getStandardType()` returns `ParameterizedType` where applicable.
     add b5bad671d8 Remove the `SecondaryTrait` internal annotation and use the information provided by the `getStandardType()` method instead.
     add 6d513dd481 Remove `DataStoreProvider.TIMEZONE` because that parameter is optional while `DataStoreProvider` should declare only essential parameters.
     add 1f95591ce4 Remove unused `StoreUtilities` method and move URI-related method to `URIDataStoreProvider`.
     add 083fb59680 fix(sql): override sql datatype code for timestamp with timezone column
     add 5dd8cf8403 Merge branch 'fix/timestamp-tz-sql-type' into geoapi-4.0. https://github.com/apache/sis/pull/45
     add 69716c5e8f Support transitive search of metadata title when metadata are represented as a tree.
     add 950dade85e Add `@TitleProperty` annotation on more metadata object. This is made possible by the commit just before this one.
     add dc78d5d1ab Move some `ParameterDescriptor` management to the public `OptionKey` class. The intent is to remove the internal `URIDataStoreOption` enumeration in the future.
     new 45a58d0acf Merge branch 'geoapi-4.0' into geoapi-3.1.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/sis/console/OperationParser.java    |   2 +-
 .../org/apache/sis/coverage/RegionOfInterest.java  |   6 +-
 .../org/apache/sis/feature/FeatureOperations.java  |   4 +-
 .../main/org/apache/sis/filter/base/Node.java      |   5 +-
 .../sis/filter/sqlmm/FunctionDescription.java      |  12 +
 .../geometry/wrapper/SpatialOperationContext.java  |   3 +-
 .../org/apache/sis/metadata/AbstractMetadata.java  |  36 +-
 .../main/org/apache/sis/metadata/CacheKey.java     |  29 +-
 .../org/apache/sis/metadata/MetadataCopier.java    |  10 +-
 .../org/apache/sis/metadata/MetadataStandard.java  | 361 +++++++++++++--------
 .../org/apache/sis/metadata/MetadataVisitor.java   |  14 +-
 .../apache/sis/metadata/ModifiableMetadata.java    |  11 +-
 .../org/apache/sis/metadata/PropertyAccessor.java  |   2 +-
 .../main/org/apache/sis/metadata/Pruner.java       |   2 +-
 .../sis/metadata/StandardImplementation.java       |   6 +-
 .../main/org/apache/sis/metadata/StateChanger.java |   2 +-
 .../org/apache/sis/metadata/TitleProperty.java     |  11 +-
 .../main/org/apache/sis/metadata/TreeNode.java     |  41 ++-
 .../org/apache/sis/metadata/TreeNodeChildren.java  |  78 +++--
 .../apache/sis/metadata/ValueExistencePolicy.java  |   1 +
 .../sis/metadata/internal/shared/Merger.java       |  17 +-
 .../metadata/internal/shared/SecondaryTrait.java   |  45 ---
 .../iso/DefaultApplicationSchemaInformation.java   |   4 +-
 .../sis/metadata/iso/DefaultMetadataScope.java     |   4 +-
 .../sis/metadata/iso/acquisition/DefaultEvent.java |   4 +-
 .../iso/acquisition/DefaultInstrument.java         |   4 +-
 .../metadata/iso/acquisition/DefaultObjective.java |   2 +-
 .../metadata/iso/acquisition/DefaultOperation.java |   4 +-
 .../sis/metadata/iso/acquisition/DefaultPlan.java  |   4 +-
 .../metadata/iso/acquisition/DefaultPlatform.java  |   4 +-
 .../iso/acquisition/DefaultPlatformPass.java       |   4 +-
 .../iso/acquisition/DefaultRequirement.java        |   2 +
 .../sis/metadata/iso/acquisition/package-info.java |   2 +-
 .../iso/citation/DefaultOnlineResource.java        |   4 +-
 .../sis/metadata/iso/citation/DefaultSeries.java   |   4 +-
 .../metadata/iso/citation/DefaultTelephone.java    |   4 +-
 .../sis/metadata/iso/citation/package-info.java    |   2 +-
 .../iso/constraint/DefaultReleasability.java       |   4 +-
 .../iso/constraint/DefaultSecurityConstraints.java |   4 +-
 .../sis/metadata/iso/constraint/package-info.java  |   2 +-
 .../DefaultFeatureCatalogueDescription.java        |   4 +-
 .../metadata/iso/distribution/DefaultDataFile.java |   8 +-
 .../metadata/iso/distribution/DefaultFormat.java   |   4 +-
 .../metadata/iso/distribution/DefaultMedium.java   |   4 +-
 .../metadata/iso/distribution/package-info.java    |   2 +-
 .../iso/extent/DefaultGeographicDescription.java   |   4 +-
 .../sis/metadata/iso/extent/package-info.java      |   2 +-
 .../iso/identification/AbstractIdentification.java |   4 +-
 .../DefaultAggregateInformation.java               |   4 +-
 .../identification/DefaultAssociatedResource.java  |   4 +-
 .../iso/identification/DefaultBrowseGraphic.java   |   4 +-
 .../identification/DefaultDataIdentification.java  |   4 +-
 .../metadata/iso/identification/package-info.java  |   2 +-
 .../sis/metadata/iso/lineage/DefaultAlgorithm.java |   4 +-
 .../sis/metadata/iso/lineage/DefaultLineage.java   |   4 +-
 .../metadata/iso/lineage/DefaultProcessing.java    |   4 +-
 .../sis/metadata/iso/lineage/package-info.java     |   2 +-
 .../org/apache/sis/metadata/iso/package-info.java  |   2 +-
 .../sis/metadata/iso/quality/AbstractElement.java  |   4 +-
 .../iso/quality/DefaultConformanceResult.java      |   4 +-
 .../iso/quality/DefaultEvaluationMethod.java       |   4 +-
 .../DefaultEvaluationReportInformation.java        |   4 +-
 .../iso/quality/DefaultSourceReference.java        |   4 +-
 .../sis/metadata/iso/quality/package-info.java     |   2 +-
 .../sis/metadata/iso/spatial/DefaultGCP.java       |   2 +-
 .../metadata/iso/spatial/DefaultGCPCollection.java |  16 +-
 .../metadata/simple/SimpleIdentifiedObject.java    |  23 +-
 .../apache/sis/metadata/simple/SimpleMetadata.java |  31 +-
 .../apache/sis/metadata/sql/MetadataSource.java    |  14 +-
 .../apache/sis/metadata/sql/MetadataWriter.java    |  30 +-
 .../org/apache/sis/temporal/DefaultInstant.java    |  13 +
 .../org/apache/sis/temporal/DefaultPeriod.java     |  13 +
 .../main/org/apache/sis/temporal/TemporalDate.java |  13 +
 .../sis/xml/bind/metadata/replace/Parameter.java   |  15 +-
 .../metadata/replace/ReferenceSystemMetadata.java  |  13 +
 .../apache/sis/metadata/MetadataStandardTest.java  |   8 +-
 .../sis/metadata/ModifiableMetadataTest.java       |   1 +
 .../sis/metadata/PropertyConsistencyCheck.java     |  16 +-
 .../apache/sis/metadata/TreeNodeChildrenTest.java  |   2 +-
 .../sis/openoffice/ReferencingFunctions.java       |  11 +-
 .../gazetteer/AbstractLocationType.java            |  12 +
 .../gazetteer/ReferencingByIdentifiers.java        |   9 +-
 .../sis/referencing/gazetteer/package-info.java    |   2 +-
 .../sis/coordinate/DefaultCoordinateMetadata.java  |  15 +-
 .../main/org/apache/sis/io/wkt/WKTDictionary.java  |   8 +-
 .../sis/parameter/AbstractParameterDescriptor.java |   8 +-
 .../sis/parameter/DefaultParameterDescriptor.java  |  18 +-
 .../parameter/DefaultParameterDescriptorGroup.java |  15 +-
 .../sis/parameter/DefaultParameterValue.java       |  15 +-
 .../apache/sis/parameter/ParameterizedType.java}   |  30 +-
 .../main/org/apache/sis/parameter/Parameters.java  |  17 +-
 .../org/apache/sis/parameter/package-info.java     |   2 +-
 .../sis/referencing/AbstractIdentifiedObject.java  |  65 ++--
 .../sis/referencing/AbstractReferenceSystem.java   |   8 +-
 .../main/org/apache/sis/referencing/Builder.java   |   6 +-
 .../sis/referencing/DefaultObjectDomain.java       |  15 +-
 .../apache/sis/referencing/GeodeticCalculator.java |   5 +-
 .../apache/sis/referencing/crs/AbstractCRS.java    |   8 +-
 .../sis/referencing/crs/AbstractDerivedCRS.java    |   2 +-
 .../sis/referencing/crs/AbstractSingleCRS.java     |   5 +-
 .../sis/referencing/crs/DefaultCompoundCRS.java    |  22 +-
 .../sis/referencing/crs/DefaultDerivedCRS.java     |  29 +-
 .../sis/referencing/crs/DefaultEngineeringCRS.java |  15 +-
 .../sis/referencing/crs/DefaultGeocentricCRS.java  |  10 +-
 .../sis/referencing/crs/DefaultGeodeticCRS.java    |  10 +-
 .../sis/referencing/crs/DefaultGeographicCRS.java  |  13 +-
 .../sis/referencing/crs/DefaultParametricCRS.java  |  15 +-
 .../sis/referencing/crs/DefaultProjectedCRS.java   |  15 +-
 .../sis/referencing/crs/DefaultTemporalCRS.java    |  15 +-
 .../sis/referencing/crs/DefaultVerticalCRS.java    |  15 +-
 .../apache/sis/referencing/crs/package-info.java   |   2 +-
 .../org/apache/sis/referencing/cs/AbstractCS.java  |  11 +-
 .../apache/sis/referencing/cs/DefaultAffineCS.java |   7 +-
 .../sis/referencing/cs/DefaultCartesianCS.java     |  14 +-
 .../sis/referencing/cs/DefaultCompoundCS.java      |   2 +-
 .../cs/DefaultCoordinateSystemAxis.java            |  15 +-
 .../sis/referencing/cs/DefaultCylindricalCS.java   |  14 +-
 .../sis/referencing/cs/DefaultEllipsoidalCS.java   |  14 +-
 .../apache/sis/referencing/cs/DefaultLinearCS.java |  14 +-
 .../sis/referencing/cs/DefaultParametricCS.java    |  14 +-
 .../apache/sis/referencing/cs/DefaultPolarCS.java  |  14 +-
 .../sis/referencing/cs/DefaultSphericalCS.java     |  14 +-
 .../apache/sis/referencing/cs/DefaultTimeCS.java   |  12 +-
 .../sis/referencing/cs/DefaultVerticalCS.java      |  14 +-
 .../org/apache/sis/referencing/cs/Normalizer.java  |   2 +-
 .../sis/referencing/datum/AbstractDatum.java       |   7 +-
 .../referencing/datum/DefaultDatumEnsemble.java    |  26 +-
 .../sis/referencing/datum/DefaultEllipsoid.java    |  15 +-
 .../referencing/datum/DefaultEngineeringDatum.java |  15 +-
 .../referencing/datum/DefaultGeodeticDatum.java    |  15 +-
 .../referencing/datum/DefaultParametricDatum.java  |  15 +-
 .../referencing/datum/DefaultPrimeMeridian.java    |  15 +-
 .../referencing/datum/DefaultTemporalDatum.java    |  15 +-
 .../referencing/datum/DefaultVerticalDatum.java    |  15 +-
 .../factory/GeodeticAuthorityFactory.java          |   3 +-
 .../referencing/factory/GeodeticObjectFactory.java |   2 +-
 .../referencing/internal/ParameterizedType.java    | 118 +++++++
 .../internal/shared/AffineTransform2D.java         |  11 +
 .../internal/shared/ReferencingUtilities.java      |  50 ---
 .../sis/referencing/legacy/DefaultImageCRS.java    |   3 +-
 .../sis/referencing/legacy/DefaultImageDatum.java  |  12 +-
 .../referencing/legacy/DefaultUserDefinedCS.java   |  11 +-
 .../operation/AbstractCoordinateOperation.java     |   6 +-
 .../apache/sis/referencing/operation/CRSPair.java  |   3 +-
 .../operation/CoordinateOperationRegistry.java     |   2 +-
 .../operation/DefaultConcatenatedOperation.java    |  12 +-
 .../referencing/operation/DefaultConversion.java   |  10 +-
 .../DefaultCoordinateOperationFactory.java         |   6 +-
 .../operation/DefaultOperationMethod.java          |  15 +-
 .../operation/DefaultPassThroughOperation.java     |  15 +-
 .../referencing/operation/DefaultProjection.java   |   2 +-
 .../operation/DefaultTransformation.java           |  15 +-
 .../referencing/operation/matrix/MatrixSIS.java    |  20 +-
 .../referencing/operation/matrix/package-info.java |   2 +-
 .../operation/transform/AbstractMathTransform.java |  20 +-
 .../operation/transform/package-info.java          |   2 +-
 .../DefaultParameterDescriptorGroupTest.java       |  20 +-
 .../parameter/DefaultParameterDescriptorTest.java  | 119 +++----
 .../sis/parameter/DefaultParameterValueTest.java   |  46 +--
 .../datum/DefaultDatumEnsembleTest.java            |  99 ++++++
 .../datum/DefaultGeodeticDatumTest.java            |   6 +-
 .../sis/referencing/datum/HardCodedDatum.java      |   2 +-
 .../apache/sis/storage/landsat/LandsatStore.java   |   4 +-
 .../sis/storage/landsat/LandsatStoreProvider.java  |   4 +-
 .../apache/sis/storage/geotiff/GeoTiffStore.java   |   6 +-
 .../sis/storage/geotiff/GeoTiffStoreProvider.java  |  13 +-
 .../sis/storage/geotiff/writer/GeoEncoder.java     |   6 +-
 .../org/apache/sis/storage/netcdf/NetcdfStore.java |   4 +-
 .../sis/storage/netcdf/NetcdfStoreProvider.java    |  10 +-
 .../sis/storage/netcdf/classic/VariableInfo.java   |   4 +-
 .../org/apache/sis/storage/sql/feature/Column.java |   3 +-
 .../apache/sis/storage/sql/feature/Database.java   |  21 ++
 .../sis/storage/sql/feature/InfoStatements.java    |   8 +-
 .../apache/sis/storage/sql/postgis/Postgres.java   |  23 ++
 .../main/org/apache/sis/storage/gpx/Metadata.java  |   6 +-
 .../main/org/apache/sis/storage/gpx/Store.java     |   2 +-
 .../org/apache/sis/storage/gpx/StoreProvider.java  |  16 +-
 .../storage/xml/stream/StaxDataStoreProvider.java  |   8 +-
 .../main/org/apache/sis/storage/DataStore.java     |  27 +-
 .../org/apache/sis/storage/DataStoreProvider.java  |  32 +-
 .../main/org/apache/sis/storage/OptionKey.java     |  99 +++++-
 .../org/apache/sis/storage/StorageConnector.java   |   1 +
 .../org/apache/sis/storage/base/PRJDataStore.java  | 100 ++----
 .../apache/sis/storage/base/StoreUtilities.java    | 155 ++-------
 .../org/apache/sis/storage/base/URIDataStore.java  |  96 ++++--
 .../sis/storage/base/URIDataStoreOption.java       | 333 +++++++++++++++++++
 .../sis/storage/base/URIDataStoreProvider.java     | 178 ++++------
 .../main/org/apache/sis/storage/csv/Store.java     |  27 +-
 .../org/apache/sis/storage/csv/StoreProvider.java  |  67 +---
 .../apache/sis/storage/esri/AsciiGridStore.java    |   7 +-
 .../sis/storage/esri/AsciiGridStoreProvider.java   |   7 +-
 .../org/apache/sis/storage/esri/RasterStore.java   |   6 +-
 .../apache/sis/storage/esri/RawRasterStore.java    |   2 +-
 .../sis/storage/esri/RawRasterStoreProvider.java   |   7 +-
 .../main/org/apache/sis/storage/folder/Store.java  |  42 +--
 .../apache/sis/storage/folder/StoreProvider.java   |  90 ++---
 .../apache/sis/storage/folder/WritableStore.java   |  10 +-
 .../sis/storage/image/WorldFileStoreProvider.java  |   9 +-
 .../org/apache/sis/storage/internal/Resources.java |   7 +-
 .../sis/storage/internal/Resources.properties      |   3 +-
 .../sis/storage/internal/Resources_fr.properties   |   3 +-
 .../main/org/apache/sis/storage/wkt/Store.java     |  10 +-
 .../org/apache/sis/storage/wkt/StoreFormat.java    |   2 +-
 .../org/apache/sis/storage/wkt/StoreProvider.java  |  63 ++--
 .../apache/sis/storage/xml/AbstractProvider.java   |  13 +-
 .../org/apache/sis/storage/xml/StoreProvider.java  |   2 +-
 .../sis/storage/base/StoreUtilitiesTest.java       |  15 +-
 ...tiesTest.java => URIDataStoreProviderTest.java} |  20 +-
 .../test/org/apache/sis/storage/csv/StoreTest.java |   3 +-
 .../org/apache/sis/storage/folder/StoreTest.java   |   2 +-
 .../apache/sis/storage/wkt/StoreProviderTest.java  |   6 +-
 .../org/apache/sis/measure/AbstractConverter.java  |  21 +-
 .../main/org/apache/sis/measure/AbstractUnit.java  |  25 +-
 .../apache/sis/measure/ConcatenatedConverter.java  |   8 +-
 .../org/apache/sis/measure/LinearConverter.java    |   8 +-
 .../main/org/apache/sis/measure/package-info.java  |  10 +-
 .../main/org/apache/sis/util/Classes.java          | 211 +++++++-----
 .../main/org/apache/sis/util/ComparisonMode.java   |   3 +
 .../org/apache/sis/util/LenientComparable.java     |  39 ++-
 .../sis/util/resources/IndexedResourceBundle.java  |   3 +
 .../test/org/apache/sis/util/ClassesTest.java      |   9 +
 .../test/org/apache/sis/util/UtilitiesTest.java    |   7 +
 .../storage/coveragejson/CoverageJsonStore.java    |   4 +-
 .../coveragejson/CoverageJsonStoreProvider.java    |   5 +-
 .../apache/sis/storage/geoheif/GeoHeifStore.java   |   4 +-
 .../sis/storage/geoheif/GeoHeifStoreProvider.java  |   9 +-
 .../sis/storage/geopackage/GpkgStoreProvider.java  |   7 +-
 .../main/org/apache/sis/storage/gsf/GSFStore.java  |   6 +-
 .../apache/sis/storage/gsf/GSFStoreProvider.java   |  25 +-
 .../sis/storage/shapefile/ShapefileProvider.java   |  45 +--
 .../sis/storage/shapefile/ShapefileStore.java      |  70 ++--
 .../sis/storage/shapefile/ShapefileStoreTest.java  |  27 +-
 .../org/apache/sis/storage/shapefile/Snippets.java |   7 +-
 .../org/apache/sis/gui/dataset/PathAction.java     |  43 ++-
 .../org/apache/sis/gui/dataset/ResourceCell.java   |   3 +-
 .../apache/sis/gui/referencing/FilterByDatum.java  |   3 +-
 .../org/apache/sis/storage/gdal/GDALStore.java     |   4 +-
 .../apache/sis/storage/gdal/GDALStoreProvider.java |   7 +-
 238 files changed, 2742 insertions(+), 1879 deletions(-)
 delete mode 100644 endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/internal/shared/SecondaryTrait.java
 copy endorsed/src/{org.apache.sis.portrayal/main/org/apache/sis/style/se1/ElseFilter.java => org.apache.sis.referencing/main/org/apache/sis/parameter/ParameterizedType.java} (54%)
 create mode 100644 endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/ParameterizedType.java
 create mode 100644 endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultDatumEnsembleTest.java
 create mode 100644 endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/URIDataStoreOption.java
 copy endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/base/{StoreUtilitiesTest.java => URIDataStoreProviderTest.java} (63%)


(sis) 01/01: Merge branch 'geoapi-4.0' into geoapi-3.1.

Posted by de...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 45a58d0acf0d1845d3f99d95ba8e214e40d974bb
Merge: 3b34cf323f dc78d5d1ab
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Thu May 28 17:54:58 2026 +0200

    Merge branch 'geoapi-4.0' into geoapi-3.1.

 .../org/apache/sis/console/OperationParser.java    |   2 +-
 .../org/apache/sis/coverage/RegionOfInterest.java  |   6 +-
 .../org/apache/sis/feature/FeatureOperations.java  |   4 +-
 .../main/org/apache/sis/filter/base/Node.java      |   5 +-
 .../sis/filter/sqlmm/FunctionDescription.java      |  12 +
 .../geometry/wrapper/SpatialOperationContext.java  |   3 +-
 .../org/apache/sis/metadata/AbstractMetadata.java  |  36 +-
 .../main/org/apache/sis/metadata/CacheKey.java     |  29 +-
 .../org/apache/sis/metadata/MetadataCopier.java    |  10 +-
 .../org/apache/sis/metadata/MetadataStandard.java  | 361 +++++++++++++--------
 .../org/apache/sis/metadata/MetadataVisitor.java   |  14 +-
 .../apache/sis/metadata/ModifiableMetadata.java    |  11 +-
 .../org/apache/sis/metadata/PropertyAccessor.java  |   2 +-
 .../main/org/apache/sis/metadata/Pruner.java       |   2 +-
 .../sis/metadata/StandardImplementation.java       |   6 +-
 .../main/org/apache/sis/metadata/StateChanger.java |   2 +-
 .../org/apache/sis/metadata/TitleProperty.java     |  11 +-
 .../main/org/apache/sis/metadata/TreeNode.java     |  41 ++-
 .../org/apache/sis/metadata/TreeNodeChildren.java  |  78 +++--
 .../apache/sis/metadata/ValueExistencePolicy.java  |   1 +
 .../sis/metadata/internal/shared/Merger.java       |  17 +-
 .../metadata/internal/shared/SecondaryTrait.java   |  45 ---
 .../iso/DefaultApplicationSchemaInformation.java   |   4 +-
 .../sis/metadata/iso/DefaultMetadataScope.java     |   4 +-
 .../sis/metadata/iso/acquisition/DefaultEvent.java |   4 +-
 .../iso/acquisition/DefaultInstrument.java         |   4 +-
 .../metadata/iso/acquisition/DefaultObjective.java |   2 +-
 .../metadata/iso/acquisition/DefaultOperation.java |   4 +-
 .../sis/metadata/iso/acquisition/DefaultPlan.java  |   4 +-
 .../metadata/iso/acquisition/DefaultPlatform.java  |   4 +-
 .../iso/acquisition/DefaultPlatformPass.java       |   4 +-
 .../iso/acquisition/DefaultRequirement.java        |   2 +
 .../sis/metadata/iso/acquisition/package-info.java |   2 +-
 .../iso/citation/DefaultOnlineResource.java        |   4 +-
 .../sis/metadata/iso/citation/DefaultSeries.java   |   4 +-
 .../metadata/iso/citation/DefaultTelephone.java    |   4 +-
 .../sis/metadata/iso/citation/package-info.java    |   2 +-
 .../iso/constraint/DefaultReleasability.java       |   4 +-
 .../iso/constraint/DefaultSecurityConstraints.java |   4 +-
 .../sis/metadata/iso/constraint/package-info.java  |   2 +-
 .../DefaultFeatureCatalogueDescription.java        |   4 +-
 .../metadata/iso/distribution/DefaultDataFile.java |   8 +-
 .../metadata/iso/distribution/DefaultFormat.java   |   4 +-
 .../metadata/iso/distribution/DefaultMedium.java   |   4 +-
 .../metadata/iso/distribution/package-info.java    |   2 +-
 .../iso/extent/DefaultGeographicDescription.java   |   4 +-
 .../sis/metadata/iso/extent/package-info.java      |   2 +-
 .../iso/identification/AbstractIdentification.java |   4 +-
 .../DefaultAggregateInformation.java               |   4 +-
 .../identification/DefaultAssociatedResource.java  |   4 +-
 .../iso/identification/DefaultBrowseGraphic.java   |   4 +-
 .../identification/DefaultDataIdentification.java  |   4 +-
 .../metadata/iso/identification/package-info.java  |   2 +-
 .../sis/metadata/iso/lineage/DefaultAlgorithm.java |   4 +-
 .../sis/metadata/iso/lineage/DefaultLineage.java   |   4 +-
 .../metadata/iso/lineage/DefaultProcessing.java    |   4 +-
 .../sis/metadata/iso/lineage/package-info.java     |   2 +-
 .../org/apache/sis/metadata/iso/package-info.java  |   2 +-
 .../sis/metadata/iso/quality/AbstractElement.java  |   4 +-
 .../iso/quality/DefaultConformanceResult.java      |   4 +-
 .../iso/quality/DefaultEvaluationMethod.java       |   4 +-
 .../DefaultEvaluationReportInformation.java        |   4 +-
 .../iso/quality/DefaultSourceReference.java        |   4 +-
 .../sis/metadata/iso/quality/package-info.java     |   2 +-
 .../sis/metadata/iso/spatial/DefaultGCP.java       |   2 +-
 .../metadata/iso/spatial/DefaultGCPCollection.java |  16 +-
 .../metadata/simple/SimpleIdentifiedObject.java    |  23 +-
 .../apache/sis/metadata/simple/SimpleMetadata.java |  31 +-
 .../apache/sis/metadata/sql/MetadataSource.java    |  14 +-
 .../apache/sis/metadata/sql/MetadataWriter.java    |  30 +-
 .../org/apache/sis/temporal/DefaultInstant.java    |  13 +
 .../org/apache/sis/temporal/DefaultPeriod.java     |  13 +
 .../main/org/apache/sis/temporal/TemporalDate.java |  13 +
 .../sis/xml/bind/metadata/replace/Parameter.java   |  15 +-
 .../metadata/replace/ReferenceSystemMetadata.java  |  13 +
 .../apache/sis/metadata/MetadataStandardTest.java  |   8 +-
 .../sis/metadata/ModifiableMetadataTest.java       |   1 +
 .../sis/metadata/PropertyConsistencyCheck.java     |  16 +-
 .../apache/sis/metadata/TreeNodeChildrenTest.java  |   2 +-
 .../sis/openoffice/ReferencingFunctions.java       |  11 +-
 .../gazetteer/AbstractLocationType.java            |  12 +
 .../gazetteer/ReferencingByIdentifiers.java        |   9 +-
 .../sis/referencing/gazetteer/package-info.java    |   2 +-
 .../sis/coordinate/DefaultCoordinateMetadata.java  |  15 +-
 .../main/org/apache/sis/io/wkt/WKTDictionary.java  |   8 +-
 .../sis/parameter/AbstractParameterDescriptor.java |   8 +-
 .../sis/parameter/DefaultParameterDescriptor.java  |  18 +-
 .../parameter/DefaultParameterDescriptorGroup.java |  15 +-
 .../sis/parameter/DefaultParameterValue.java       |  15 +-
 .../apache/sis/parameter/ParameterizedType.java    |  49 +++
 .../main/org/apache/sis/parameter/Parameters.java  |  17 +-
 .../org/apache/sis/parameter/package-info.java     |   2 +-
 .../sis/referencing/AbstractIdentifiedObject.java  |  65 ++--
 .../sis/referencing/AbstractReferenceSystem.java   |   8 +-
 .../main/org/apache/sis/referencing/Builder.java   |   6 +-
 .../sis/referencing/DefaultObjectDomain.java       |  15 +-
 .../apache/sis/referencing/GeodeticCalculator.java |   5 +-
 .../apache/sis/referencing/crs/AbstractCRS.java    |   8 +-
 .../sis/referencing/crs/AbstractDerivedCRS.java    |   2 +-
 .../sis/referencing/crs/AbstractSingleCRS.java     |   5 +-
 .../sis/referencing/crs/DefaultCompoundCRS.java    |  22 +-
 .../sis/referencing/crs/DefaultDerivedCRS.java     |  29 +-
 .../sis/referencing/crs/DefaultEngineeringCRS.java |  15 +-
 .../sis/referencing/crs/DefaultGeocentricCRS.java  |  10 +-
 .../sis/referencing/crs/DefaultGeodeticCRS.java    |  10 +-
 .../sis/referencing/crs/DefaultGeographicCRS.java  |  13 +-
 .../sis/referencing/crs/DefaultParametricCRS.java  |  15 +-
 .../sis/referencing/crs/DefaultProjectedCRS.java   |  15 +-
 .../sis/referencing/crs/DefaultTemporalCRS.java    |  15 +-
 .../sis/referencing/crs/DefaultVerticalCRS.java    |  15 +-
 .../apache/sis/referencing/crs/package-info.java   |   2 +-
 .../org/apache/sis/referencing/cs/AbstractCS.java  |  11 +-
 .../apache/sis/referencing/cs/DefaultAffineCS.java |   7 +-
 .../sis/referencing/cs/DefaultCartesianCS.java     |  14 +-
 .../sis/referencing/cs/DefaultCompoundCS.java      |   2 +-
 .../cs/DefaultCoordinateSystemAxis.java            |  15 +-
 .../sis/referencing/cs/DefaultCylindricalCS.java   |  14 +-
 .../sis/referencing/cs/DefaultEllipsoidalCS.java   |  14 +-
 .../apache/sis/referencing/cs/DefaultLinearCS.java |  14 +-
 .../sis/referencing/cs/DefaultParametricCS.java    |  14 +-
 .../apache/sis/referencing/cs/DefaultPolarCS.java  |  14 +-
 .../sis/referencing/cs/DefaultSphericalCS.java     |  14 +-
 .../apache/sis/referencing/cs/DefaultTimeCS.java   |  12 +-
 .../sis/referencing/cs/DefaultVerticalCS.java      |  14 +-
 .../org/apache/sis/referencing/cs/Normalizer.java  |   2 +-
 .../sis/referencing/datum/AbstractDatum.java       |   7 +-
 .../referencing/datum/DefaultDatumEnsemble.java    |  26 +-
 .../sis/referencing/datum/DefaultEllipsoid.java    |  15 +-
 .../referencing/datum/DefaultEngineeringDatum.java |  15 +-
 .../referencing/datum/DefaultGeodeticDatum.java    |  15 +-
 .../referencing/datum/DefaultParametricDatum.java  |  15 +-
 .../referencing/datum/DefaultPrimeMeridian.java    |  15 +-
 .../referencing/datum/DefaultTemporalDatum.java    |  15 +-
 .../referencing/datum/DefaultVerticalDatum.java    |  15 +-
 .../factory/GeodeticAuthorityFactory.java          |   3 +-
 .../referencing/factory/GeodeticObjectFactory.java |   2 +-
 .../referencing/internal/ParameterizedType.java    | 118 +++++++
 .../internal/shared/AffineTransform2D.java         |  11 +
 .../internal/shared/ReferencingUtilities.java      |  50 ---
 .../sis/referencing/legacy/DefaultImageCRS.java    |   3 +-
 .../sis/referencing/legacy/DefaultImageDatum.java  |  12 +-
 .../referencing/legacy/DefaultUserDefinedCS.java   |  11 +-
 .../operation/AbstractCoordinateOperation.java     |   6 +-
 .../apache/sis/referencing/operation/CRSPair.java  |   3 +-
 .../operation/CoordinateOperationRegistry.java     |   2 +-
 .../operation/DefaultConcatenatedOperation.java    |  12 +-
 .../referencing/operation/DefaultConversion.java   |  10 +-
 .../DefaultCoordinateOperationFactory.java         |   6 +-
 .../operation/DefaultOperationMethod.java          |  15 +-
 .../operation/DefaultPassThroughOperation.java     |  15 +-
 .../referencing/operation/DefaultProjection.java   |   2 +-
 .../operation/DefaultTransformation.java           |  15 +-
 .../referencing/operation/matrix/MatrixSIS.java    |  20 +-
 .../referencing/operation/matrix/package-info.java |   2 +-
 .../operation/transform/AbstractMathTransform.java |  20 +-
 .../operation/transform/package-info.java          |   2 +-
 .../DefaultParameterDescriptorGroupTest.java       |  20 +-
 .../parameter/DefaultParameterDescriptorTest.java  | 119 +++----
 .../sis/parameter/DefaultParameterValueTest.java   |  46 +--
 .../datum/DefaultDatumEnsembleTest.java            |  99 ++++++
 .../datum/DefaultGeodeticDatumTest.java            |   6 +-
 .../sis/referencing/datum/HardCodedDatum.java      |   2 +-
 .../apache/sis/storage/landsat/LandsatStore.java   |   4 +-
 .../sis/storage/landsat/LandsatStoreProvider.java  |   4 +-
 .../apache/sis/storage/geotiff/GeoTiffStore.java   |   6 +-
 .../sis/storage/geotiff/GeoTiffStoreProvider.java  |  13 +-
 .../sis/storage/geotiff/writer/GeoEncoder.java     |   6 +-
 .../org/apache/sis/storage/netcdf/NetcdfStore.java |   4 +-
 .../sis/storage/netcdf/NetcdfStoreProvider.java    |  10 +-
 .../sis/storage/netcdf/classic/VariableInfo.java   |   4 +-
 .../org/apache/sis/storage/sql/feature/Column.java |   3 +-
 .../apache/sis/storage/sql/feature/Database.java   |  21 ++
 .../sis/storage/sql/feature/InfoStatements.java    |   8 +-
 .../apache/sis/storage/sql/postgis/Postgres.java   |  23 ++
 .../main/org/apache/sis/storage/gpx/Metadata.java  |   6 +-
 .../main/org/apache/sis/storage/gpx/Store.java     |   2 +-
 .../org/apache/sis/storage/gpx/StoreProvider.java  |  16 +-
 .../storage/xml/stream/StaxDataStoreProvider.java  |   8 +-
 .../main/org/apache/sis/storage/DataStore.java     |  27 +-
 .../org/apache/sis/storage/DataStoreProvider.java  |  32 +-
 .../main/org/apache/sis/storage/OptionKey.java     |  99 +++++-
 .../org/apache/sis/storage/StorageConnector.java   |   1 +
 .../org/apache/sis/storage/base/PRJDataStore.java  | 100 ++----
 .../apache/sis/storage/base/StoreUtilities.java    | 155 ++-------
 .../org/apache/sis/storage/base/URIDataStore.java  |  96 ++++--
 .../sis/storage/base/URIDataStoreOption.java       | 333 +++++++++++++++++++
 .../sis/storage/base/URIDataStoreProvider.java     | 178 ++++------
 .../main/org/apache/sis/storage/csv/Store.java     |  27 +-
 .../org/apache/sis/storage/csv/StoreProvider.java  |  67 +---
 .../apache/sis/storage/esri/AsciiGridStore.java    |   7 +-
 .../sis/storage/esri/AsciiGridStoreProvider.java   |   7 +-
 .../org/apache/sis/storage/esri/RasterStore.java   |   6 +-
 .../apache/sis/storage/esri/RawRasterStore.java    |   2 +-
 .../sis/storage/esri/RawRasterStoreProvider.java   |   7 +-
 .../main/org/apache/sis/storage/folder/Store.java  |  42 +--
 .../apache/sis/storage/folder/StoreProvider.java   |  90 ++---
 .../apache/sis/storage/folder/WritableStore.java   |  10 +-
 .../sis/storage/image/WorldFileStoreProvider.java  |   9 +-
 .../org/apache/sis/storage/internal/Resources.java |   7 +-
 .../sis/storage/internal/Resources.properties      |   3 +-
 .../sis/storage/internal/Resources_fr.properties   |   3 +-
 .../main/org/apache/sis/storage/wkt/Store.java     |  10 +-
 .../org/apache/sis/storage/wkt/StoreFormat.java    |   2 +-
 .../org/apache/sis/storage/wkt/StoreProvider.java  |  63 ++--
 .../apache/sis/storage/xml/AbstractProvider.java   |  13 +-
 .../org/apache/sis/storage/xml/StoreProvider.java  |   2 +-
 .../sis/storage/base/StoreUtilitiesTest.java       |  15 +-
 ...tiesTest.java => URIDataStoreProviderTest.java} |  20 +-
 .../test/org/apache/sis/storage/csv/StoreTest.java |   3 +-
 .../org/apache/sis/storage/folder/StoreTest.java   |   2 +-
 .../apache/sis/storage/wkt/StoreProviderTest.java  |   6 +-
 .../org/apache/sis/measure/AbstractConverter.java  |  21 +-
 .../main/org/apache/sis/measure/AbstractUnit.java  |  25 +-
 .../apache/sis/measure/ConcatenatedConverter.java  |   8 +-
 .../org/apache/sis/measure/LinearConverter.java    |   8 +-
 .../main/org/apache/sis/measure/package-info.java  |  10 +-
 .../main/org/apache/sis/util/Classes.java          | 211 +++++++-----
 .../main/org/apache/sis/util/ComparisonMode.java   |   3 +
 .../org/apache/sis/util/LenientComparable.java     |  39 ++-
 .../sis/util/resources/IndexedResourceBundle.java  |   3 +
 .../test/org/apache/sis/util/ClassesTest.java      |   9 +
 .../test/org/apache/sis/util/UtilitiesTest.java    |   7 +
 .../storage/coveragejson/CoverageJsonStore.java    |   4 +-
 .../coveragejson/CoverageJsonStoreProvider.java    |   5 +-
 .../apache/sis/storage/geoheif/GeoHeifStore.java   |   4 +-
 .../sis/storage/geoheif/GeoHeifStoreProvider.java  |   9 +-
 .../sis/storage/geopackage/GpkgStoreProvider.java  |   7 +-
 .../main/org/apache/sis/storage/gsf/GSFStore.java  |   6 +-
 .../apache/sis/storage/gsf/GSFStoreProvider.java   |  25 +-
 .../sis/storage/shapefile/ShapefileProvider.java   |  45 +--
 .../sis/storage/shapefile/ShapefileStore.java      |  70 ++--
 .../sis/storage/shapefile/ShapefileStoreTest.java  |  27 +-
 .../org/apache/sis/storage/shapefile/Snippets.java |   7 +-
 .../org/apache/sis/gui/dataset/PathAction.java     |  43 ++-
 .../org/apache/sis/gui/dataset/ResourceCell.java   |   3 +-
 .../apache/sis/gui/referencing/FilterByDatum.java  |   3 +-
 .../org/apache/sis/storage/gdal/GDALStore.java     |   4 +-
 .../apache/sis/storage/gdal/GDALStoreProvider.java |   7 +-
 238 files changed, 2776 insertions(+), 1864 deletions(-)

diff --cc endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/DefaultApplicationSchemaInformation.java
index be816d5c6b,42007ffc81..56181738ff
--- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/DefaultApplicationSchemaInformation.java
+++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/DefaultApplicationSchemaInformation.java
@@@ -23,10 -23,12 +23,11 @@@ import jakarta.xml.bind.annotation.adap
  import org.opengis.metadata.ApplicationSchemaInformation;
  import org.opengis.metadata.citation.Citation;
  import org.opengis.metadata.citation.OnlineResource;
+ import org.apache.sis.metadata.TitleProperty;
  import org.apache.sis.xml.Namespaces;
  
 -// Specific to the geoapi-4.0 branch:
 -import org.apache.sis.xml.bind.gco.CharSequenceAdapter;
 -import org.apache.sis.xml.bind.metadata.CI_OnlineResource;
 +// Specific to the main and geoapi-3.1 branches:
 +import java.net.URI;
  
  
  /**
diff --cc endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/acquisition/DefaultPlatform.java
index ab02dcb472,a820dc9f19..40896e1616
--- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/acquisition/DefaultPlatform.java
+++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/acquisition/DefaultPlatform.java
@@@ -25,10 -25,11 +25,11 @@@ import org.opengis.metadata.acquisition
  import org.opengis.metadata.acquisition.Platform;
  import org.opengis.metadata.citation.Citation;
  import org.opengis.util.InternationalString;
+ import org.apache.sis.metadata.TitleProperty;
  import org.apache.sis.metadata.iso.ISOMetadata;
  
 -// Specific to the geoapi-4.0 branch:
 -import org.opengis.metadata.citation.Responsibility;
 +// Specific to the main and geoapi-3.1 branches:
 +import org.opengis.metadata.citation.ResponsibleParty;
  
  
  /**
diff --cc endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/acquisition/DefaultRequirement.java
index c8e29c1e58,e37b0d4a29..bffe05b346
--- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/acquisition/DefaultRequirement.java
+++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/acquisition/DefaultRequirement.java
@@@ -27,12 -27,11 +27,13 @@@ import org.opengis.metadata.acquisition
  import org.opengis.metadata.acquisition.RequestedDate;
  import org.opengis.metadata.acquisition.Requirement;
  import org.opengis.metadata.citation.Citation;
+ import org.apache.sis.metadata.TitleProperty;
  import org.apache.sis.metadata.iso.ISOMetadata;
  
 -// Specific to the geoapi-4.0 branch:
 -import org.opengis.metadata.citation.Responsibility;
 +// Specific to the main and geoapi-3.1 branches:
 +import java.util.Date;
 +import org.opengis.metadata.citation.ResponsibleParty;
 +import org.apache.sis.temporal.TemporalDate;
  
  
  /**
@@@ -65,9 -64,10 +66,10 @@@
   *
   * @author  Cédric Briançon (Geomatys)
   * @author  Martin Desruisseaux (Geomatys)
 - * @version 2.0
 + * @version 1.5
   * @since   0.3
   */
+ @TitleProperty(name = "identifier")
  @XmlType(name = "MI_Requirement_Type", propOrder = {
      "citation",
      "identifier",
diff --cc endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/DefaultDataFile.java
index 85b4111de4,a8c0d6e559..8f186cab2e
--- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/DefaultDataFile.java
+++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/DefaultDataFile.java
@@@ -22,17 -22,18 +22,18 @@@ import jakarta.xml.bind.annotation.XmlT
  import jakarta.xml.bind.annotation.XmlElement;
  import jakarta.xml.bind.annotation.XmlRootElement;
  import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 -import org.opengis.util.InternationalString;
  import org.opengis.metadata.distribution.Format;
  import org.opengis.metadata.distribution.DataFile;
 +import org.opengis.util.InternationalString;
- import org.apache.sis.xml.Namespaces;
+ import org.apache.sis.metadata.TitleProperty;
  import org.apache.sis.metadata.iso.ISOMetadata;
+ import org.apache.sis.xml.Namespaces;
  import org.apache.sis.xml.bind.FilterByVersion;
- import org.apache.sis.xml.internal.shared.LegacyNamespaces;
  import org.apache.sis.xml.bind.gcx.MimeFileTypeAdapter;
+ import org.apache.sis.xml.internal.shared.LegacyNamespaces;
  
 -// Specific to the geoapi-4.0 branch:
 -import org.opengis.util.GenericName;
 +// Specific to the main and geoapi-3.1 branches:
 +import org.opengis.util.LocalName;
  
  
  /**
diff --cc endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/DefaultMedium.java
index a3c7498a39,21701bbe7e..5506b95521
--- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/DefaultMedium.java
+++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/distribution/DefaultMedium.java
@@@ -33,9 -33,10 +33,10 @@@ import org.apache.sis.xml.bind.FilterBy
  import org.apache.sis.xml.bind.gco.GO_Real;
  import org.apache.sis.xml.bind.metadata.CI_Citation;
  import org.apache.sis.xml.bind.metadata.MD_Identifier;
 -import org.apache.sis.xml.internal.shared.LegacyNamespaces;
+ import org.apache.sis.metadata.TitleProperty;
 -import org.apache.sis.metadata.iso.legacy.LegacyPropertyAdapter;
  import org.apache.sis.metadata.internal.Dependencies;
 +import org.apache.sis.metadata.iso.legacy.LegacyPropertyAdapter;
 +import org.apache.sis.xml.internal.shared.LegacyNamespaces;
  import org.apache.sis.util.collection.Containers;
  import static org.apache.sis.metadata.internal.shared.ImplementationHelper.ensurePositive;
  
diff --cc endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/lineage/DefaultLineage.java
index 4faa4c3ed4,0929d48ebd..5c44d14f68
--- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/lineage/DefaultLineage.java
+++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/lineage/DefaultLineage.java
@@@ -26,7 -26,8 +26,8 @@@ import org.opengis.metadata.citation.Ci
  import org.opengis.metadata.lineage.Source;
  import org.opengis.metadata.lineage.Lineage;
  import org.opengis.metadata.lineage.ProcessStep;
 +import org.opengis.metadata.maintenance.ScopeCode;
+ import org.apache.sis.metadata.TitleProperty;
  import org.apache.sis.metadata.iso.ISOMetadata;
  import org.apache.sis.metadata.iso.maintenance.DefaultScope;
  import org.apache.sis.xml.bind.FilterByVersion;
diff --cc endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/simple/SimpleMetadata.java
index 2a89923dcc,3357d29223..0c0d38f7d5
--- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/simple/SimpleMetadata.java
+++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/simple/SimpleMetadata.java
@@@ -107,9 -113,11 +113,11 @@@ public class SimpleMetadata implements 
  
      /**
       * Parties responsible for the metadata information.
+      *
+      * @return empty collection.
       */
      @Override
 -    public Collection<Responsibility> getContacts() {
 +    public Collection<ResponsibleParty> getContacts() {
          return Collections.emptyList();
      }
  
diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/AbstractIdentifiedObject.java
index 40eef73fc0,43076c6565..f3023924fa
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/AbstractIdentifiedObject.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/AbstractIdentifiedObject.java
@@@ -800,20 -813,13 +818,25 @@@ public class AbstractIdentifiedObject e
          }
      }
  
 +    /**
-      * Returns {@code true} if the given object implements the same GeoAPI interface as this object.
++     * Returns the type of the given object, ignoring the deprecated {@link Projection} class.
++     * Allows the code to hehave as of the deprecated interface didn't existed.
 +     */
-     private boolean implementsSameInterface(final Object object) {
-         Class<? extends IdentifiedObject> type = getInterface();
-         if (Projection.class.isAssignableFrom(type)) {  // Deprecated interface, behave as if it does not exist.
++    private static Type getStandardType(final LenientComparable object) {
++        Type type = object.getStandardType();
++        if ((type instanceof Class<?>) && Projection.class.isAssignableFrom((Class<?>) type)) {
 +            type = Conversion.class;
 +        }
-         if (object instanceof AbstractIdentifiedObject) {
-             Class<?> other = ((AbstractIdentifiedObject) object).getInterface();
-             if (Projection.class.isAssignableFrom(other)) {
-                 other = Conversion.class;
-             }
-             return other == type;
++        return type;
++    }
++
+     /**
+      * Returns {@code true} if the given object implements the same GeoAPI interface as this object.
+      */
+     private boolean implementsSameInterface(final Object object) {
 -        Type type = getStandardType();
++        Type type = getStandardType(this);
+         if (object instanceof LenientComparable) {
 -            return type.equals(((LenientComparable) object).getStandardType());
++            return type.equals(getStandardType((LenientComparable) object));
          }
          /*
           * Fallback for non-SIS implementations.
@@@ -1071,10 -1078,11 +1095,11 @@@
          if (identifiers != null) {
              propertyAlreadySet("setIdentifier", "identifier");
          } else if (identifier != null) {
 -            final Identifier id = identifier.getIdentifier();
 +            final ReferenceIdentifier id = identifier.getIdentifier();
              if (id != null) {
                  identifiers = Collections.singleton(id);
-                 ScopedIdentifier<IdentifiedObject> key = new ScopedIdentifier<>(getInterface(), identifier.toString());
+                 Class<? extends IdentifiedObject> type = Classes.getStandardClass(this, IdentifiedObject.class);
+                 ScopedIdentifier<IdentifiedObject> key = new ScopedIdentifier<>(type, identifier.toString());
                  key.store(IdentifiedObject.class, this, AbstractIdentifiedObject.class, "setIdentifier");
                  if (key != (key = key.rename(identifier.code))) {
                      key.store(IdentifiedObject.class, this, null, null);        // Shorter form without codespace.
diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/Builder.java
index 14602bfa74,efb262a864..b3a05802a3
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/Builder.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/Builder.java
@@@ -276,8 -273,8 +276,8 @@@ public abstract class Builder<B extend
          this();
          if (object != null) {
              properties.putAll(IdentifiedObjects.getProperties(object));
-             final GenericName[] valueAlias = (GenericName[]) properties.remove(IdentifiedObject.ALIAS_KEY);
-             final ReferenceIdentifier[] valueIds = (ReferenceIdentifier[]) properties.remove(IdentifiedObject.IDENTIFIERS_KEY);
+             final var valueAlias = (GenericName[]) properties.remove(IdentifiedObject.ALIAS_KEY);
 -            final var  valueIds  = (Identifier[])  properties.remove(IdentifiedObject.IDENTIFIERS_KEY);
++            final var valueIds   = (ReferenceIdentifier[]) properties.remove(IdentifiedObject.IDENTIFIERS_KEY);
              if (valueAlias != null) Collections.addAll(aliases, valueAlias);
              if (valueIds   != null) Collections.addAll(identifiers, valueIds);
          }
diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultDerivedCRS.java
index 70283c6670,da86912eaa..6158368b35
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultDerivedCRS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultDerivedCRS.java
@@@ -381,28 -382,15 +382,24 @@@ public class DefaultDerivedCRS extends 
          }
      }
  
 +    /**
 +     * Returns the type of conversion associated to this {@code DefaultDerivedCRS}.
 +     * Must be a hard-coded, constant value (not dependent on object state).
 +     */
 +    @Override
 +    final Class<Conversion> getConversionType() {
 +        return Conversion.class;
 +    }
 +
      /**
-      * Returns the GeoAPI interface implemented by this class.
-      * The SIS implementation returns {@code DerivedCRS.class}.
-      *
-      * <h4>Note for implementers</h4>
-      * Subclasses usually do not need to override this method since GeoAPI does not define {@code DerivedCRS}
-      * sub-interface. Overriding possibility is left mostly for implementers who wish to extend GeoAPI with
-      * their own set of interfaces.
+      * Returns the GeoAPI interface that defines the contract of this implementation class.
+      * This is the base type required by {@code equals(…)} methods for returning a potentially {@code true} value.
       *
       * @return {@code DerivedCRS.class} or a user-defined sub-interface.
+      * @since 1.7
       */
      @Override
-     public Class<? extends DerivedCRS> getInterface() {
+     public Type getStandardType() {
          return DerivedCRS.class;
      }
  
diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultGeocentricCRS.java
index 91115e1be5,5e0ee051f1..c221b6873b
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultGeocentricCRS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultGeocentricCRS.java
@@@ -221,14 -218,15 +222,15 @@@ public class DefaultGeocentricCRS exten
      }
  
      /**
-      * Returns the GeoAPI interface implemented by this class.
-      * The SIS implementation returns {@code GeocentricCRS.class}.
+      * Returns the GeoAPI interface that defines the contract of this implementation class.
+      * This is the base type required by {@code equals(…)} methods for returning a potentially {@code true} value.
       *
 -     * @return {@code GeodeticCRS.class} or a user-defined sub-interface.
 +     * @return {@code GeocentricCRS.class} or a user-defined sub-interface.
+      * @since 1.7
       */
      @Override
-     public Class<? extends GeocentricCRS> getInterface() {
+     public Type getStandardType() {
 -        return GeodeticCRS.class;
 +        return GeocentricCRS.class;
      }
  
      /**
diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultProjectedCRS.java
index d1026ad824,7e3209d2d1..c6de7da338
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultProjectedCRS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultProjectedCRS.java
@@@ -197,28 -194,15 +198,24 @@@ public class DefaultProjectedCRS extend
                  ? (DefaultProjectedCRS) object : new DefaultProjectedCRS(object);
      }
  
 +    /**
 +     * Returns the type of conversion associated to this {@code DefaultProjectedCRS}.
 +     * Must be a hard-coded, constant value (not dependent on object state).
 +     */
 +    @Override
 +    final Class<Projection> getConversionType() {
 +        return Projection.class;
 +    }
 +
      /**
-      * Returns the GeoAPI interface implemented by this class.
-      * The SIS implementation returns {@code ProjectedCRS.class}.
-      *
-      * <h4>Note for implementers</h4>
-      * Subclasses usually do not need to override this method since GeoAPI does not define {@code ProjectedCRS}
-      * sub-interface. Overriding possibility is left mostly for implementers who wish to extend GeoAPI with
-      * their own set of interfaces.
+      * Returns the GeoAPI interface that defines the contract of this implementation class.
+      * This is the base type required by {@code equals(…)} methods for returning a potentially {@code true} value.
       *
       * @return {@code ProjectedCRS.class} or a user-defined sub-interface.
+      * @since 1.7
       */
      @Override
-     public Class<? extends ProjectedCRS> getInterface() {
+     public Type getStandardType() {
          return ProjectedCRS.class;
      }
  
diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/legacy/DefaultImageCRS.java
index 4034b5a263,370a464e6b..fb0dcfafba
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/legacy/DefaultImageCRS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/legacy/DefaultImageCRS.java
@@@ -167,8 -132,8 +168,8 @@@ public final class DefaultImageCRS exte
       * @return the coordinate reference system interface implemented by this class.
       */
      @Override
-     public Class<? extends ImageCRS> getInterface() {
+     public Type getStandardType() {
 -        return SingleCRS.class;
 +        return ImageCRS.class;
      }
  
      /**
diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/legacy/DefaultImageDatum.java
index 9d706c2f6b,e8568f24e3..782194c540
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/legacy/DefaultImageDatum.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/legacy/DefaultImageDatum.java
@@@ -18,6 -18,6 +18,7 @@@ package org.apache.sis.referencing.lega
  
  import java.util.Map;
  import java.util.Objects;
++import java.lang.reflect.Type;
  import jakarta.xml.bind.annotation.XmlType;
  import jakarta.xml.bind.annotation.XmlElement;
  import jakarta.xml.bind.annotation.XmlRootElement;
@@@ -122,53 -122,6 +123,48 @@@ public final class DefaultImageDatum ex
          this.pixelInCell = Objects.requireNonNull(pixelInCell);
      }
  
 +    /**
 +     * Creates a new datum with the same values as the specified one.
 +     * This copy constructor provides a way to convert an arbitrary implementation into a SIS one
 +     * or a user-defined one (as a subclass), usually in order to leverage some implementation-specific API.
 +     *
 +     * <p>This constructor performs a shallow copy, i.e. the properties are not cloned.</p>
 +     *
 +     * @param  datum  the datum to copy.
 +     *
 +     * @see #castOrCopy(ImageDatum)
 +     */
 +    protected DefaultImageDatum(final ImageDatum datum) {
 +        super(datum);
 +        pixelInCell = datum.getPixelInCell();
 +    }
 +
 +    /**
 +     * Returns a SIS datum implementation with the same values as the given arbitrary implementation.
 +     * If the given object is {@code null}, then this method returns {@code null}.
 +     * Otherwise if the given object is already a SIS implementation, then the given object is returned unchanged.
 +     * Otherwise a new SIS implementation is created and initialized to the attribute values of the given object.
 +     *
 +     * @param  object  the object to get as a SIS implementation, or {@code null} if none.
 +     * @return a SIS implementation containing the values of the given object (may be the
 +     *         given object itself), or {@code null} if the argument was null.
 +     */
 +    public static DefaultImageDatum castOrCopy(final ImageDatum object) {
 +        return (object == null) || (object instanceof DefaultImageDatum)
 +                ? (DefaultImageDatum) object : new DefaultImageDatum(object);
 +    }
 +
 +    /**
-      * Returns the GeoAPI interface implemented by this class.
-      * The SIS implementation returns {@code ImageDatum.class}.
-      *
-      * <h4>Note for implementers</h4>
-      * Subclasses usually do not need to override this method since GeoAPI does not define {@code ImageDatum}
-      * sub-interface. Overriding possibility is left mostly for implementers who wish to extend GeoAPI with
-      * their own set of interfaces.
++     * Returns the GeoAPI interface that defines the contract of this implementation class.
++     * This is the base type required by {@code equals(…)} methods for returning a potentially {@code true} value.
 +     *
 +     * @return {@code ImageDatum.class} or a user-defined sub-interface.
 +     */
 +    @Override
-     public Class<? extends ImageDatum> getInterface() {
++    public Type getStandardType() {
 +        return ImageDatum.class;
 +    }
 +
      /**
       * Specification of the way the image grid is associated with the image data attributes.
       *
diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/legacy/DefaultUserDefinedCS.java
index 99ff3a8e10,771156d8b2..2e35b393a2
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/legacy/DefaultUserDefinedCS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/legacy/DefaultUserDefinedCS.java
@@@ -116,51 -113,6 +116,46 @@@ public final class DefaultUserDefinedC
          super(properties, axis0, axis1, axis2);
      }
  
 +    /**
 +     * Creates a new coordinate system with the same values as the specified one.
 +     * This copy constructor provides a way to convert an arbitrary implementation into a SIS one
 +     * or a user-defined one (as a subclass), usually in order to leverage some implementation-specific API.
 +     *
 +     * <p>This constructor performs a shallow copy, i.e. the properties are not cloned.</p>
 +     *
 +     * @param  original  the coordinate system to copy.
 +     *
 +     * @see #castOrCopy(UserDefinedCS)
 +     */
 +    protected DefaultUserDefinedCS(final UserDefinedCS original) {
 +        super(original);
 +    }
 +
 +    /**
 +     * Returns a SIS coordinate system implementation with the same values as the given arbitrary implementation.
 +     * If the given object is {@code null}, then this method returns {@code null}.
 +     * Otherwise if the given object is already a SIS implementation, then the given object is returned unchanged.
 +     * Otherwise a new SIS implementation is created and initialized to the attribute values of the given object.
 +     *
 +     * @param  object  the object to get as a SIS implementation, or {@code null} if none.
 +     * @return a SIS implementation containing the values of the given object (may be the
 +     *         given object itself), or {@code null} if the argument was null.
 +     */
 +    public static DefaultUserDefinedCS castOrCopy(final UserDefinedCS object) {
 +        return (object == null) || (object instanceof DefaultUserDefinedCS)
 +                ? (DefaultUserDefinedCS) object : new DefaultUserDefinedCS(object);
 +    }
 +
 +    /**
-      * Returns the GeoAPI interface implemented by this class.
-      * The SIS implementation returns {@code UserDefinedCS.class}.
-      *
-      * <h4>Note for implementers</h4>
-      * Subclasses usually do not need to override this method since GeoAPI does not define {@code UserDefinedCS}
-      * sub-interface. Overriding possibility is left mostly for implementers who wish to extend GeoAPI with their
-      * own set of interfaces.
++     * Returns the GeoAPI interface that defines the contract of this implementation class.
++     * This is the base type required by {@code equals(…)} methods for returning a potentially {@code true} value.
 +     *
 +     * @return {@code UserDefinedCS.class} or a user-defined sub-interface.
 +     */
 +    @Override
-     public Class<? extends UserDefinedCS> getInterface() {
++    public Class<? extends UserDefinedCS> getStandardType() {
 +        return UserDefinedCS.class;
 +    }
  
  
  
diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
index 49ba178ccf,088f11239a..838108dad8
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
@@@ -468,19 -466,8 +469,19 @@@ check:      for (int isTarget=0; ; isTa
          return new AbstractCoordinateOperation(object);
      }
  
 +    /**
 +     * Returns {@code true} if the given operation is a single operation but not a pass-through operation.
 +     * In an older ISO 19111 model, {@link PassThroughOperation} extended {@link SingleOperation}, which
 +     * was a problem for providing a value to the inherited {@link SingleOperation#getMethod()} method.
 +     * This has been fixed in newer ISO 19111 model, but for safety with objects following the older model
 +     * (e.g. GeoAPI 3.0) we are better to perform an explicit exclusion of {@link PassThroughOperation}.
 +     */
 +    static boolean isSingleOperation(final CoordinateOperation operation) {
 +        return (operation instanceof SingleOperation) && !(operation instanceof PassThroughOperation);
 +    }
 +
      /**
-      * Returns the GeoAPI interface implemented by this class.
+      * Returns the GeoAPI interface that defines the contract of this implementation class.
       * The default implementation returns {@code CoordinateOperation.class}.
       * Subclasses implementing a more specific GeoAPI interface shall override this method.
       *
diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultProjection.java
index fd914eddcc,0000000000..126cd4204f
mode 100644,000000..100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultProjection.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultProjection.java
@@@ -1,110 -1,0 +1,110 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one or more
 + * contributor license agreements.  See the NOTICE file distributed with
 + * this work for additional information regarding copyright ownership.
 + * The ASF licenses this file to You under the Apache License, Version 2.0
 + * (the "License"); you may not use this file except in compliance with
 + * the License.  You may obtain a copy of the License at
 + *
 + *     http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing, software
 + * distributed under the License is distributed on an "AS IS" BASIS,
 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + * See the License for the specific language governing permissions and
 + * limitations under the License.
 + */
 +package org.apache.sis.referencing.operation;
 +
 +import java.util.Map;
 +import jakarta.xml.bind.annotation.XmlTransient;
 +import org.opengis.util.FactoryException;
 +import org.opengis.referencing.operation.Conversion;
 +import org.opengis.referencing.operation.Projection;
 +import org.opengis.referencing.operation.OperationMethod;
 +import org.opengis.referencing.operation.MathTransform;
 +import org.opengis.referencing.operation.MathTransformFactory;
 +import org.opengis.referencing.crs.ProjectedCRS;
 +import org.opengis.referencing.crs.GeographicCRS;
 +import org.opengis.referencing.crs.CoordinateReferenceSystem;
 +import org.apache.sis.util.ArgumentChecks;
 +
 +
 +/**
 + * A conversion from (<var>longitude</var>, <var>latitude</var>) coordinates to Cartesian coordinates
 + * (<var>x</var>,<var>y</var>).
 + *
 + * @author  Martin Desruisseaux (IRD, Geomatys)
 + *
 + * @see org.apache.sis.referencing.crs.DefaultProjectedCRS
 + */
 +@XmlTransient
 +final class DefaultProjection extends DefaultConversion implements Projection {
 +    /**
 +     * Serial number for inter-operability with different versions.
 +     */
 +    private static final long serialVersionUID = -7176751851369816864L;
 +
 +    /**
 +     * Creates a projection from the given properties.
 +     *
 +     * @param  properties  the properties to be given to the identified object.
 +     * @param  sourceCRS   the source CRS.
 +     * @param  targetCRS   the target CRS.
 +     * @param  method      the coordinate operation method.
 +     * @param  transform   transform from positions in the source CRS to positions in the target CRS.
 +     */
 +    public DefaultProjection(final Map<String,?>   properties,
 +                             final GeographicCRS   sourceCRS,
 +                             final ProjectedCRS    targetCRS,
 +                             final OperationMethod method,
 +                             final MathTransform   transform)
 +    {
 +        super(properties, sourceCRS, targetCRS, null, method, transform);
 +    }
 +
 +    /**
 +     * Creates a new projection with the same values as the specified one, together with the
 +     * specified source and target CRS. While the source conversion can be an arbitrary one,
 +     * it is typically a defining conversion.
 +     *
 +     * @param  definition  the defining conversion.
 +     * @param  sourceCRS   the source CRS.
 +     * @param  targetCRS   the target CRS.
 +     * @param  factory     the factory to use for creating a transform from the parameters or for performing axis changes.
 +     * @throws IllegalArgumentException if the source or targe CRS is not of the expected types.
 +     */
 +    DefaultProjection(final Conversion definition,
 +                      final boolean normalized,
 +                      final CoordinateReferenceSystem sourceCRS,
 +                      final CoordinateReferenceSystem targetCRS,
 +                      final MathTransformFactory factory) throws FactoryException
 +    {
 +        super(definition, normalized, sourceCRS, targetCRS, factory);
 +        ArgumentChecks.ensureCanCast("sourceCRS", GeographicCRS.class, sourceCRS);
 +        ArgumentChecks.ensureCanCast("targetCRS", ProjectedCRS .class, targetCRS);
 +    }
 +
 +    /**
 +     * Creates a new coordinate operation with the same values as the specified one.
 +     * This copy constructor provides a way to convert an arbitrary implementation
 +     * into a SIS one, usually in order to leverage some implementation-specific API.
 +     *
 +     * <p>This constructor performs a shallow copy, i.e. the properties are not cloned.</p>
 +     *
 +     * @param  operation  the coordinate operation to copy.
 +     */
 +    protected DefaultProjection(final Projection operation) {
 +        super(operation);
 +    }
 +
 +    /**
 +     * Returns the GeoAPI interface implemented by this class.
 +     *
 +     * @return the conversion interface implemented by this class.
 +     */
 +    @Override
-     public Class<? extends Projection> getInterface() {
++    public Class<? extends Projection> getStandardType() {
 +        return Projection.class;
 +    }
 +}
diff --cc endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/URIDataStoreOption.java
index 0000000000,2a11917c63..186806e78b
mode 000000,100644..100644
--- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/URIDataStoreOption.java
+++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/URIDataStoreOption.java
@@@ -1,0 -1,333 +1,333 @@@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.sis.storage.base;
+ 
+ import java.net.URI;
+ import java.nio.file.StandardOpenOption;
+ import java.util.EnumSet;
+ import java.util.Collection;
+ import org.opengis.parameter.ParameterValueGroup;
+ import org.opengis.parameter.ParameterDescriptor;
+ import org.opengis.parameter.ParameterDescriptorGroup;
+ import org.opengis.parameter.ParameterNotFoundException;
+ import org.apache.sis.parameter.ParameterBuilder;
+ import org.apache.sis.storage.DataStoreProvider;
+ import org.apache.sis.storage.OptionKey;
+ import org.apache.sis.storage.StorageConnector;
+ import org.apache.sis.storage.IllegalOpenParameterException;
+ import org.apache.sis.storage.internal.Resources;
+ import org.apache.sis.util.ObjectConverters;
+ import org.apache.sis.util.UnconvertibleObjectException;
+ import org.apache.sis.util.resources.Errors;
+ import org.apache.sis.util.logging.Logging;
+ 
+ 
+ /**
+  * Options supported by {@link URIDataStoreProvider}.
+  * This enumeration does the link between {@link ParameterDescriptor} and {@link OptionKey}.
+  * This enumeration contains all parameters used by all subclasses of {@link URIDataStore}
+  * in the Apache <abbr>SIS</abbr> code base. This is an enumeration for a closed universe,
+  * which is why it cannot be in exported <abbr>API</abbr>.
+  * This enumeration is useful for data stores that are containers of other data stores,
+  * such as the data store that read all files in a folder.
+  *
+  * <h4>Deferred construction of parameter descriptor</h4>
+  * Some parameters are used by only one {@link URIDataStore}. These parameters are constructed
+  * during the static initialization of the {@link URIDataStoreProvider} that use them.
+  *
+  * <h4>Future evolution</h4>
+  * This class is an attempt to bring a little bit of order in the mapping between parameters and option keys,
+  * at least for the most frequently used parameters. This class may change in any future <abbr>SIS</abbr>
+  * version according experience.
+  *
+  * @author  Johann Sorel (Geomatys)
+  * @author  Martin Desruisseaux (Geomatys)
+  */
+ public enum URIDataStoreOption {
+     /**
+      * Description of the mandatory {@value URIDataStoreProvider#LOCATION} parameter.
+      * This is the only mandatory parameter in all {@link URIDataStoreProvider} implementations.
+      *
+      * @see URIDataStoreProvider#LOCATION
+      * @see #createForLocationOnly(String)
+      */
+     LOCATION(URIDataStoreProvider.LOCATION, Resources.Keys.DataStoreLocation, URI.class),
+ 
+     /**
+      * Description of the optional {@value URIDataStoreProvider#FORMAT} parameter.
+      *
+      * @see URIDataStoreProvider#FORMAT
+      */
+     FORMAT(URIDataStoreProvider.FORMAT, Resources.Keys.DirectoryContentFormatName, String.class),
+ 
+     /**
+      * Description of the optional {@value URIDataStoreProvider#CREATE} parameter of writable data stores.
+      *
+      * @see URIDataStoreProvider#CREATE
+      * @see OptionKey#OPEN_OPTIONS
+      */
+     CREATE(URIDataStoreProvider.CREATE, Resources.Keys.DataStoreCreate, Boolean.class),
+ 
+     /**
+      * Description of the optional parameter for character encoding used by the data store.
+      * This is used only when the data store does not have explicit encoding information.
+      *
+      * @see OptionKey#ENCODING
+      */
+     ENCODING(OptionKey.ENCODING),
+ 
+     /**
+      * Description of the parameter for formatting conventions of dates and numbers.
+      * This is used only when the data store does not have explicit locale information.
+      *
+      * @see OptionKey#LOCALE
+      */
+     LOCALE(OptionKey.LOCALE),
+ 
+     /**
+      * Description of the optional parameter for the time zone used by the data store.
+      * This is used only when the data store does not have explicit time zone information.
+      *
+      * @see OptionKey#TIMEZONE
+      */
+     TIMEZONE(OptionKey.TIMEZONE),
+ 
+     /**
+      * Description of the optional parameter for the default coordinate reference system.
+      * This is used only when the data store does not have explicit <abbr>CRS</abbr> information.
+      *
+      * @see OptionKey#DEFAULT_CRS
+      * @todo Use {@link CodeType} when parsing from text.
+      */
+     DEFAULT_CRS(OptionKey.DEFAULT_CRS),
+ 
+     /**
+      * Description of the optional "metadata" parameter.
+      *
+      * @see OptionKey#METADATA_PATH
+      */
+     METADATA(OptionKey.METADATA_PATH),
+ 
+     /**
+      * Description of the optional parameter for specifying whether to assemble
+      * distinct lines into a single {@code Feature} instance forming a foliation.
+      */
+     FOLIATION(OptionKey.FOLIATION_REPRESENTATION);
+ 
+     /**
+      * The option key for storing the parameter value in a storage connector,
+      * or {@code null} if none.
+      */
+     private final OptionKey<?> option;
+ 
+     /**
+      * The parameter descriptor for this option, or {@code null} if not yet constructed.
+      *
+      * @see #getParameterDescriptor()
+      */
+     private volatile ParameterDescriptor<?> parameter;
+ 
+     /**
+      * Creates a new enumeration value with deferred construction of the parameter descriptor.
+      *
+      * @param option  associated option in {@link StorageConnector}.
+      */
+     private URIDataStoreOption(final OptionKey<?> option) {
+         this.option = option;
+     }
+ 
+     /**
+      * Creates a new enumeration value with immediate construction of the parameter descriptor.
+      *
+      * @param parameterName  name of the parameter to create.
+      * @param description    constant from {@link Resources} keys for the localized description.
+      * @param valueClass     type of value of the parameter.
+      */
+     private <V> URIDataStoreOption(final String parameterName, final short description, final Class<V> valueClass) {
+         option = null;
+         parameter = new ParameterBuilder()
+                 .addName(parameterName)
+                 .setDescription(Resources.formatInternational(description))
+                 .setRequired(ordinal() == 0)
+                 .create(valueClass, null);
+     }
+ 
+     /**
+      * Returns the parameter associated to this enumeration.
+      *
+      * @return the parameter (never {@code null}).
+      * @throws IllegalStateException if the parameter has not yet been initialized.
+      */
+     public final ParameterDescriptor<?> getParameterDescriptor() {
+         ParameterDescriptor<?> p = parameter;
+         if (p == null) {
+             p = option.asOpenParameter().orElseThrow(() -> new IllegalStateException(name()));
+         }
+         return p;
+     }
+ 
+     /**
+      * Returns the parameter name.
+      */
+     private String parameterName() {
+         return getParameterDescriptor().getName().getCode();
+     }
+ 
+     /**
+      * Creates a parameter with the same name as this parameter but different type or remarks.
+      *
+      * @param  builder     the builder to use for creating the parameter.
+      * @param  valueClass  the new value class, or {@code null} for keeping the same class.
+      * @param  remarks     the new parameter remarks, or {@code null} for keeping the same remarks.
+      * @return parameter of the same name as {@link #parameter()} but the specified value class and remarks.
+      */
+     public final ParameterDescriptor<?> deriveParameterDescriptor(
+             final ParameterBuilder builder, Class<?> valueClass, CharSequence remarks)
+     {
+         ParameterDescriptor<?> p = getParameterDescriptor();
+         if (valueClass == null) valueClass = p.getValueClass();
 -        if (remarks    == null) remarks    = p.getRemarks().orElse(null);
++        if (remarks    == null) remarks    = p.getRemarks();
+         return builder.addName(p.getName())
+                 .setDescription(p.getDescription().orElse(null))
+                 .setRemarks(remarks)
+                 .create(valueClass, null);
+     }
+ 
+     /**
+      * Creates a parameter descriptor group containing only the mandatory parameters.
+      * The mandatory parameter is: {@link #LOCATION}.
+      *
+      * @param  name  short name of the data store format.
+      * @return the descriptor for open parameters with only mandatory parameters.
+      *
+      * @see URIDataStoreProvider#createOpenParameters(ParameterBuilder)
+      */
+     public static ParameterDescriptorGroup createForLocationOnly(final String name) {
+         return new ParameterBuilder().addName(name).createGroup(LOCATION.getParameterDescriptor());
+     }
+ 
+     /**
+      * Returns a group of parameters set to the given mandatory values.
+      * This is a shortcut when only the mandatory parameters are defined.
+      * If the parameter descriptor group of the given provider contains parameters other than location,
+      * those additional parameters are present but without values.
+      *
+      * @param  provider  provider of the data store for which to get the parameters, or {@code null}.
+      * @param  location  value of {@link #LOCATION}, or {@code null} if none.
+      * @return the parameters with the given values, or {@code null} if {@code provider} or {@code location} is null.
+      */
+     public static ParameterValueGroup createWithLocationOnly(final DataStoreProvider provider, final URI location) {
+         if (provider != null && location != null) {
+             final ParameterDescriptorGroup descriptor = provider.getOpenParameters();
+             if (descriptor != null) {
+                 final ParameterValueGroup pg = descriptor.createValue();
+                 pg.parameter(URIDataStoreProvider.LOCATION).setValue(location);
+                 return pg;
+             }
+         }
+         return null;
+     }
+ 
+     /**
+      * Sets the value of the parameter described by this enumeration value.
+      *
+      * @param parameters  the parameters where to set the parameter.
+      * @param value       the value to set, or {@code null} if none.
+      */
+     public final void setValueOf(final ParameterValueGroup parameters, final Object value) {
+         if (value != null) {
+             parameters.parameter(parameterName()).setValue(value);
+         }
+     }
+ 
+     /**
+      * Creates a storage connector initialized to the location declared in the given parameters.
+      * The {@value #LOCATION} parameter is unconditionally requested. The other parameters to be
+      * requested are specified in the {@code options} collection.
+      * Missing optional parameters are ignored.
+      *
+      * @param  provider     the provider for which to create a storage connector (for error messages).
+      * @param  parameters   the parameters to use for creating a storage connector.
+      * @param  options      options to include, or {@code null} for only the mandatory parameters.
+      * @param  openOptions  where to store open options, or {@code null} for storing them in the storage connector.
+      * @return the storage connector initialized to the location specified in the parameters.
+      * @throws IllegalOpenParameterException if no {@value URIDataStoreProvider#LOCATION} parameter has been found.
+      */
+     public static StorageConnector connector(final DataStoreProvider provider,
+                                              final ParameterValueGroup parameters,
+                                              Collection<URIDataStoreOption> options,
+                                              EnumSet<StandardOpenOption> openOptions)
+             throws IllegalOpenParameterException
+     {
+         final StorageConnector connector;
+         try {
+             connector = new StorageConnector(parameters.parameter(URIDataStoreProvider.LOCATION).getValue());
+         } catch (ParameterNotFoundException | NullPointerException e) {
+             throw new IllegalOpenParameterException(
+                     Resources.format(Resources.Keys.UndefinedParameter_2,
+                                      provider.getShortName(),
+                                      URIDataStoreProvider.LOCATION), e);
+         }
+         if (options != null) {
+             for (final URIDataStoreOption option : options) {
+                 if (option.option == null) continue;
+                 final Object value;
+                 try {
+                     value = parameters.parameter(option.parameterName()).getValue();
+                 } catch (ParameterNotFoundException e) {
+                     Logging.ignorableException(provider.getLogger(), URIDataStoreOption.class, "connector", e);
+                     continue;
+                 }
+                 if (value != null) try {
+                     switch (option) {
+                         case CREATE: {
+                             final boolean store = (openOptions == null);
+                             if (store) {
+                                 openOptions = EnumSet.of(StandardOpenOption.WRITE);
+                             } else {
+                                 openOptions.add(StandardOpenOption.WRITE);
+                             }
+                             if (ObjectConverters.convert(value, Boolean.class)) {
+                                 openOptions.add(StandardOpenOption.CREATE);
+                             }
+                             if (store) {
+                                 connector.setOption(OptionKey.OPEN_OPTIONS, openOptions.toArray(StandardOpenOption[]::new));
+                             }
+                             break;
+                         }
+                         default: {
+                             convertAndSet(option.option, value, connector);
+                             break;
+                         }
+                     }
+                 } catch (UnconvertibleObjectException e) {
+                     throw new IllegalOpenParameterException(Errors.format(
+                             Errors.Keys.IllegalOptionValue_2, option.parameterName(), value), e);
+                 }
+             }
+         }
+         return connector;
+     }
+ 
+     /**
+      * Set the given option to the given value in the given storage connector.
+      * Defined as a separated method for type-safety.
+      */
+     private static <V> void convertAndSet(final OptionKey<V> option, final Object value, final StorageConnector connector) {
+         connector.setOption(option, ObjectConverters.convert(value, option.getElementType()));
+     }
+ }