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 99f667e72beb6b521ff0e247a9a318cbc23a5f47
Merge: fadb6e856b daa2c40eaa
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Sat Feb 10 13:02:43 2024 +0100

    Merge branch 'geoapi-4.0' into geoapi-3.1.
    The changes are mostly cleanups.

 .../sis/buildtools/coding/ReorganizeImports.java   |   5 +-
 .../org/apache/sis/cloud/aws/s3/FileService.java   |   2 +-
 .../main/org/apache/sis/console/SIS.java           |   2 +-
 .../org/apache/sis/coverage/BandedCoverage.java    |   2 +-
 .../main/org/apache/sis/coverage/Category.java     |  11 +-
 .../main/org/apache/sis/coverage/CategoryList.java |  12 +-
 .../org/apache/sis/coverage/ConvertedCategory.java |   2 +-
 .../org/apache/sis/coverage/CoverageCombiner.java  |   2 -
 .../org/apache/sis/coverage/SampleDimension.java   |  26 +-
 .../sis/coverage/grid/BufferedGridCoverage.java    |   7 +-
 .../coverage/grid/CoordinateOperationFinder.java   |   5 +-
 .../apache/sis/coverage/grid/DefaultEvaluator.java |   6 +-
 .../sis/coverage/grid/DimensionalityReduction.java |  20 +-
 .../apache/sis/coverage/grid/DomainLinearizer.java |  22 +-
 .../apache/sis/coverage/grid/GridClippingMode.java |   2 +-
 .../sis/coverage/grid/GridCoordinatesView.java     |   5 +-
 .../org/apache/sis/coverage/grid/GridCoverage.java |  16 +-
 .../apache/sis/coverage/grid/GridCoverage2D.java   |   8 +-
 .../sis/coverage/grid/GridCoverageBuilder.java     |  19 +-
 .../sis/coverage/grid/GridCoverageProcessor.java   |  14 +-
 .../apache/sis/coverage/grid/GridDerivation.java   |  15 +-
 .../org/apache/sis/coverage/grid/GridExtent.java   |  34 +-
 .../org/apache/sis/coverage/grid/GridGeometry.java |  33 +-
 .../apache/sis/coverage/grid/GridOrientation.java  |   4 +-
 .../apache/sis/coverage/grid/ImageRenderer.java    |  21 +-
 .../apache/sis/coverage/grid/PixelTranslation.java |  14 +-
 .../apache/sis/coverage/grid/ReshapedImage.java    |   2 -
 .../sis/coverage/grid/j2d/ColorsForRange.java      |   3 +-
 .../sis/coverage/grid/j2d/ImageUtilities.java      |   8 +-
 .../sis/coverage/grid/j2d/TilePlaceholder.java     |   5 +-
 .../org/apache/sis/coverage/grid/package-info.java |   4 +-
 .../sis/coverage/internal/CompoundTransform.java   |   1 -
 .../apache/sis/feature/AbstractAssociation.java    |   3 -
 .../org/apache/sis/feature/AbstractAttribute.java  |   5 +-
 .../org/apache/sis/feature/AbstractFeature.java    |   6 +-
 .../apache/sis/feature/AbstractIdentifiedType.java |  11 +-
 .../org/apache/sis/feature/CharacteristicMap.java  |   5 -
 .../apache/sis/feature/CharacteristicTypeMap.java  |   9 +-
 .../apache/sis/feature/DefaultAssociationRole.java |  10 +-
 .../apache/sis/feature/DefaultAttributeType.java   |   8 +-
 .../org/apache/sis/feature/DefaultFeatureType.java |  11 +-
 .../main/org/apache/sis/feature/DenseFeature.java  |   6 +-
 .../main/org/apache/sis/feature/FeatureFormat.java |   2 +-
 .../org/apache/sis/feature/FeatureOperations.java  |   4 +-
 .../main/org/apache/sis/feature/Field.java         |   2 -
 .../sis/feature/FoliationRepresentation.java       |   4 +-
 .../main/org/apache/sis/feature/LinkOperation.java |   2 -
 .../apache/sis/feature/MultiValuedAssociation.java |   2 +-
 .../org/apache/sis/feature/OperationResult.java    |   3 +-
 .../main/org/apache/sis/feature/SparseFeature.java |   6 +-
 .../apache/sis/feature/StringJoinOperation.java    |   5 +-
 .../main/org/apache/sis/feature/package-info.java  |  12 +-
 .../main/org/apache/sis/filter/BinaryFunction.java |   8 +-
 .../apache/sis/filter/BinaryGeometryFilter.java    |  10 +-
 .../org/apache/sis/filter/BinarySpatialFilter.java |  11 +-
 .../main/org/apache/sis/filter/Capabilities.java   |  12 +-
 .../org/apache/sis/filter/ComparisonFilter.java    |   5 +-
 .../org/apache/sis/filter/DefaultSortProperty.java |   8 +-
 .../main/org/apache/sis/filter/DistanceFilter.java |  11 +-
 .../main/org/apache/sis/filter/LikeFilter.java     |   7 +-
 .../main/org/apache/sis/filter/LogicalFilter.java  |   6 +-
 .../main/org/apache/sis/filter/UnaryFunction.java  |   7 +-
 .../apache/sis/filter/internal/CopyVisitor.java    |  10 +-
 .../sis/filter/internal/GeometryConverter.java     |   8 +-
 .../main/org/apache/sis/filter/package-info.java   |   2 +-
 .../sis/geometry/wrapper/GeometryWrapper.java      |   6 +-
 .../geometry/wrapper/SpatialOperationContext.java  |   4 +-
 .../org/apache/sis/geometry/wrapper/jts/JTS.java   |   7 +-
 .../sis/geometry/wrapper/jts/ShapeAdapter.java     |   3 +-
 .../apache/sis/image/BandedSampleConverter.java    |   2 +-
 .../main/org/apache/sis/image/ComputedImage.java   |   7 +-
 .../main/org/apache/sis/image/ComputedTiles.java   |   1 -
 .../main/org/apache/sis/image/DataType.java        |   2 -
 .../main/org/apache/sis/image/ImageAdapter.java    |   7 +-
 .../main/org/apache/sis/image/ImageCombiner.java   |   8 +-
 .../main/org/apache/sis/image/ImageProcessor.java  |  26 +-
 .../main/org/apache/sis/image/PixelIterator.java   |  15 +-
 .../main/org/apache/sis/image/PlanarImage.java     |   5 +-
 .../sis/image/PositionalConsistencyImage.java      |   4 +-
 .../main/org/apache/sis/image/ResamplingGrid.java  |   2 +-
 .../main/org/apache/sis/image/UserProperties.java  |   5 +-
 .../main/org/apache/sis/image/package-info.java    |   2 +-
 .../org/apache/sis/index/tree/NodeIterator.java    |   1 -
 .../main/org/apache/sis/index/tree/PointTree.java  |   9 +-
 .../org/apache/sis/index/tree/PointTreeNode.java   |   6 +-
 .../apache/sis/coverage/grid/GridGeometryTest.java |   6 +-
 .../apache/sis/feature/test/FeatureComparator.java |  10 +-
 .../sis/image/processing/isoline/StepsViewer.java  |   1 -
 .../org/apache/sis/index/tree/PointTreeTest.java   |   6 +-
 .../org/apache/sis/metadata/AbstractMetadata.java  |   2 +-
 .../org/apache/sis/metadata/MetadataStandard.java  |  10 +-
 .../apache/sis/metadata/ModifiableMetadata.java    |   9 +-
 .../org/apache/sis/metadata/PropertyAccessor.java  |  32 +-
 .../main/org/apache/sis/metadata/TreeNode.java     |   8 +-
 .../org/apache/sis/metadata/TreeNodeChildren.java  |   2 +-
 .../org/apache/sis/metadata/TypeValuePolicy.java   |   2 +-
 .../apache/sis/metadata/internal/AxisNames.java    |   4 +-
 .../org/apache/sis/metadata/internal/Merger.java   |  17 +-
 .../sis/metadata/internal/NameToIdentifier.java    |   4 +-
 .../apache/sis/metadata/iso/DefaultMetadata.java   |   4 +-
 .../sis/metadata/iso/citation/Citations.java       |   2 +-
 .../sis/metadata/iso/citation/DefaultContact.java  |   2 +-
 .../iso/content/DefaultSampleDimension.java        |   4 +-
 .../DefaultDigitalTransferOptions.java             |   2 +-
 .../iso/extent/AbstractGeographicExtent.java       |   6 +-
 .../sis/metadata/iso/extent/DefaultExtent.java     |  12 +-
 .../iso/extent/DefaultGeographicBoundingBox.java   |  13 +-
 .../metadata/iso/extent/DefaultVerticalExtent.java |   2 -
 .../apache/sis/metadata/iso/extent/Extents.java    |   4 +-
 .../iso/identification/DefaultResolution.java      |   2 +-
 .../metadata/iso/legacy/LegacyPropertyAdapter.java |   4 +-
 .../maintenance/DefaultMaintenanceInformation.java |   4 +-
 .../iso/maintenance/DefaultScopeDescription.java   |  34 +-
 .../sis/metadata/iso/maintenance/package-info.java |   2 +-
 .../iso/quality/DefaultEvaluationMethod.java       |   4 +-
 .../sis/metadata/iso/spatial/DefaultGCP.java       |   2 +-
 .../apache/sis/metadata/sql/MetadataSource.java    |   5 +-
 .../apache/sis/metadata/sql/MetadataWriter.java    |   2 +-
 .../org/apache/sis/metadata/sql/package-info.java  |   2 +-
 .../apache/sis/metadata/sql/util/ScriptRunner.java |   1 -
 .../org/apache/sis/util/iso/DefaultLocalName.java  |   6 +-
 .../org/apache/sis/util/iso/DefaultMemberName.java |   4 +-
 .../apache/sis/util/iso/DefaultNameFactory.java    |   1 -
 .../org/apache/sis/util/iso/DefaultNameSpace.java  |   5 +-
 .../org/apache/sis/util/iso/DefaultRecord.java     |   5 +-
 .../apache/sis/util/iso/DefaultRecordSchema.java   |   4 +-
 .../org/apache/sis/util/iso/DefaultRecordType.java |  12 +-
 .../org/apache/sis/util/iso/DefaultScopedName.java |   1 -
 .../main/org/apache/sis/util/iso/Names.java        |   4 +-
 .../org/apache/sis/util/iso/RecordDefinition.java  |   5 +-
 .../main/org/apache/sis/util/iso/Types.java        |   7 +-
 .../main/org/apache/sis/util/iso/package-info.java |   2 +-
 .../main/org/apache/sis/xml/IdentifierSpace.java   |   4 +-
 .../main/org/apache/sis/xml/MarshallerPool.java    |   7 +-
 .../main/org/apache/sis/xml/Namespaces.java        |   5 +-
 .../org/apache/sis/xml/TransformingNamespaces.java |   6 +-
 .../main/org/apache/sis/xml/XML.java               |   6 +-
 .../apache/sis/xml/bind/AdapterReplacement.java    |   2 +-
 .../main/org/apache/sis/xml/bind/Context.java      |   1 -
 .../apache/sis/xml/bind/IdentifierMapAdapter.java  |   7 +-
 .../sis/xml/bind/ModifiableIdentifierMap.java      |   2 +-
 .../org/apache/sis/xml/bind/gco/PropertyType.java  |   2 +-
 .../org/apache/sis/xml/bind/gco/package-info.java  |   2 +-
 .../apache/sis/xml/bind/lan/LocaleAndCharset.java  |  23 +-
 .../bind/metadata/replace/QualityParameter.java    |   2 +-
 .../apache/sis/metadata/PropertyAccessorTest.java  |   2 +-
 .../sis/xml/test/AnnotationConsistencyCheck.java   |   4 +-
 .../main/org/apache/sis/portrayal/Canvas.java      |  22 +-
 .../org/apache/sis/portrayal/CanvasExtent.java     |   4 +-
 .../org/apache/sis/portrayal/CanvasFollower.java   |  12 +-
 .../org/apache/sis/portrayal/PlanarCanvas.java     |  12 +-
 .../apache/sis/portrayal/TransformChangeEvent.java |   5 +-
 .../org/apache/sis/style/se1/StyleElement.java     |   5 +-
 .../org/apache/sis/style/se1/StyleFactory.java     |   5 +-
 .../apache/sis/profile/france/FrenchProfile.java   |   2 +-
 .../sis/profile/japan/netcdf/FactoryForUCAR.java   |   2 +
 .../apache/sis/profile/japan/netcdf/GCOM_C.java    |   2 +-
 .../referencing/gazetteer/FinalLocationType.java   |   6 +-
 .../gazetteer/GeohashReferenceSystem.java          |   3 +-
 .../sis/referencing/gazetteer/LocationFormat.java  |   2 +-
 .../gazetteer/MilitaryGridReferenceSystem.java     |   9 +-
 .../gazetteer/ModifiableLocationType.java          |  10 +-
 .../gazetteer/ReferenceVerifyException.java        |   4 +-
 .../gazetteer/ReferencingByIdentifiers.java        |   4 +-
 .../sis/referencing/gazetteer/SimpleLocation.java  |   2 +-
 .../sis/referencing/gazetteer/package-info.java    |   2 +-
 .../sis/geometry/AbstractDirectPosition.java       |  12 +-
 .../org/apache/sis/geometry/AbstractEnvelope.java  |  33 +-
 .../org/apache/sis/geometry/ArrayEnvelope.java     |  28 +-
 .../org/apache/sis/geometry/CoordinateFormat.java  |  17 +-
 .../org/apache/sis/geometry/DirectPosition1D.java  |   4 +-
 .../org/apache/sis/geometry/DirectPosition2D.java  |   8 +-
 .../main/org/apache/sis/geometry/Envelope2D.java   |  20 +-
 .../main/org/apache/sis/geometry/Envelopes.java    |   6 +-
 .../apache/sis/geometry/GeneralDirectPosition.java |   2 +-
 .../org/apache/sis/geometry/GeneralEnvelope.java   |  54 ++-
 .../org/apache/sis/geometry/ImmutableEnvelope.java |   4 +-
 .../main/org/apache/sis/geometry/SubEnvelope.java  |  14 +-
 .../apache/sis/geometry/WraparoundAdjustment.java  |   8 +-
 .../apache/sis/geometry/WraparoundInEnvelope.java  |   1 -
 .../main/org/apache/sis/geometry/package-info.java |   2 +-
 .../main/org/apache/sis/io/wkt/AbstractParser.java |   8 +-
 .../main/org/apache/sis/io/wkt/Colors.java         |   2 +-
 .../main/org/apache/sis/io/wkt/Convention.java     |   4 +-
 .../main/org/apache/sis/io/wkt/Element.java        |   4 +-
 .../main/org/apache/sis/io/wkt/ElementKind.java    |   2 +-
 .../org/apache/sis/io/wkt/FormattableObject.java   |  17 +-
 .../main/org/apache/sis/io/wkt/Formatter.java      |   2 +-
 .../apache/sis/io/wkt/GeodeticObjectParser.java    |  30 +-
 .../org/apache/sis/io/wkt/MathTransformParser.java |   4 +-
 .../main/org/apache/sis/io/wkt/Symbols.java        |   7 +-
 .../main/org/apache/sis/io/wkt/Transliterator.java |   8 +-
 .../sis/io/wkt/UnparsableObjectException.java      |   2 +-
 .../main/org/apache/sis/io/wkt/VerticalInfo.java   |   6 +-
 .../main/org/apache/sis/io/wkt/WKTDictionary.java  |   5 +-
 .../main/org/apache/sis/io/wkt/WKTFormat.java      |   4 +-
 .../main/org/apache/sis/io/wkt/Warnings.java       |   8 +-
 .../main/org/apache/sis/io/wkt/package-info.java   |   4 +-
 .../sis/parameter/AbstractParameterDescriptor.java |   2 +-
 .../sis/parameter/DefaultParameterDescriptor.java  |   9 +-
 .../parameter/DefaultParameterDescriptorGroup.java |   1 -
 .../sis/parameter/DefaultParameterValue.java       |   8 +-
 .../sis/parameter/DefaultParameterValueGroup.java  |  19 +-
 .../org/apache/sis/parameter/ParameterBuilder.java |  11 +-
 .../org/apache/sis/parameter/ParameterFormat.java  |  13 +-
 .../apache/sis/parameter/ParameterValueList.java   |  17 +-
 .../org/apache/sis/parameter/TensorParameters.java |  13 +-
 .../org/apache/sis/parameter/TensorValues.java     |   2 +-
 .../parameter/UnmodifiableParameterValueGroup.java |   7 +-
 .../org/apache/sis/parameter/package-info.java     |   4 +-
 .../sis/referencing/AbstractIdentifiedObject.java  |  18 +-
 .../sis/referencing/AbstractReferenceSystem.java   |   2 +-
 .../main/org/apache/sis/referencing/Builder.java   |  41 ++-
 .../main/org/apache/sis/referencing/CRS.java       |  14 +-
 .../main/org/apache/sis/referencing/CommonCRS.java |  12 +-
 .../sis/referencing/DefaultObjectDomain.java       |   2 +-
 .../sis/referencing/GeodesicsOnEllipsoid.java      |   4 +-
 .../apache/sis/referencing/GeodeticCalculator.java |   6 +-
 .../apache/sis/referencing/IdentifiedObjects.java  |   2 +-
 .../sis/referencing/ImmutableIdentifier.java       |  11 +-
 .../apache/sis/referencing/NamedIdentifier.java    |   3 +-
 .../apache/sis/referencing/crs/AbstractCRS.java    |  11 +-
 .../sis/referencing/crs/AbstractDerivedCRS.java    |   2 +-
 .../sis/referencing/crs/DefaultCompoundCRS.java    |   6 +-
 .../sis/referencing/crs/DefaultDerivedCRS.java     |   2 +-
 .../sis/referencing/crs/DefaultEngineeringCRS.java |   7 +-
 .../sis/referencing/crs/DefaultGeocentricCRS.java  |   2 +-
 .../sis/referencing/crs/DefaultGeodeticCRS.java    |  10 +-
 .../sis/referencing/crs/DefaultGeographicCRS.java  |   2 +-
 .../sis/referencing/crs/DefaultImageCRS.java       |   7 +-
 .../sis/referencing/crs/DefaultParametricCRS.java  |   7 +-
 .../sis/referencing/crs/DefaultProjectedCRS.java   |   2 +-
 .../sis/referencing/crs/DefaultTemporalCRS.java    |   7 +-
 .../sis/referencing/crs/DefaultVerticalCRS.java    |   7 +-
 .../org/apache/sis/referencing/cs/AbstractCS.java  |  13 +-
 .../apache/sis/referencing/cs/AxesConvention.java  |  21 +-
 .../org/apache/sis/referencing/cs/AxisName.java    |   2 +-
 .../sis/referencing/cs/CoordinateSystems.java      |  11 +-
 .../sis/referencing/cs/DefaultCompoundCS.java      |   5 +-
 .../cs/DefaultCoordinateSystemAxis.java            |   6 +-
 .../sis/referencing/cs/DefaultEllipsoidalCS.java   |   4 +-
 .../apache/sis/referencing/cs/DefaultTimeCS.java   |   2 +-
 .../sis/referencing/cs/DefaultVerticalCS.java      |   2 +-
 .../sis/referencing/cs/DirectionAlongMeridian.java |   7 +-
 .../org/apache/sis/referencing/cs/Normalizer.java  |   4 +-
 .../org/apache/sis/referencing/cs/SubTypes.java    |   4 +-
 .../sis/referencing/datum/AbstractDatum.java       |   4 +-
 .../sis/referencing/datum/BursaWolfParameters.java |  26 +-
 .../sis/referencing/datum/DatumShiftGrid.java      |   5 +-
 .../sis/referencing/datum/DefaultEllipsoid.java    |   4 +-
 .../referencing/datum/DefaultEngineeringDatum.java |   2 +-
 .../referencing/datum/DefaultGeodeticDatum.java    |  18 +-
 .../sis/referencing/datum/DefaultImageDatum.java   |   6 +-
 .../referencing/datum/DefaultParametricDatum.java  |   2 +-
 .../referencing/datum/DefaultPrimeMeridian.java    |   8 +-
 .../referencing/datum/DefaultTemporalDatum.java    |   4 +-
 .../referencing/datum/DefaultVerticalDatum.java    |   6 +-
 .../sis/referencing/datum/TimeDependentBWP.java    |   7 +-
 .../org/apache/sis/referencing/datum/formulas.html |   2 +-
 .../factory/CommonAuthorityFactory.java            |   6 +-
 .../factory/ConcurrentAuthorityFactory.java        |   2 +-
 .../factory/GeodeticAuthorityFactory.java          |   6 +-
 .../referencing/factory/GeodeticObjectFactory.java |  12 +-
 .../factory/IdentifiedObjectFinder.java            |  13 +-
 .../referencing/factory/IdentifiedObjectSet.java   |   9 +-
 .../sis/referencing/factory/package-info.java      |   6 +-
 .../sis/referencing/factory/sql/BursaWolfInfo.java |   2 +-
 .../factory/sql/CoordinateOperationSet.java        |   2 +-
 .../referencing/factory/sql/EPSGCodeFinder.java    |  14 +-
 .../referencing/factory/sql/EPSGDataAccess.java    |  15 +-
 .../sis/referencing/factory/sql/EPSGFactory.java   |   7 +-
 .../factory/sql/InstallationScriptProvider.java    |   6 +-
 .../sis/referencing/factory/sql/SQLTranslator.java |   8 +-
 .../referencing/internal/PositionTransformer.java  |   6 +-
 .../operation/AbstractCoordinateOperation.java     |   4 +-
 .../operation/AbstractSingleOperation.java         |   3 +-
 .../operation/CoordinateOperationContext.java      |   2 +-
 .../operation/CoordinateOperationFinder.java       |  22 +-
 .../operation/CoordinateOperationRegistry.java     |  22 +-
 .../operation/DefaultConcatenatedOperation.java    |   1 -
 .../referencing/operation/DefaultConversion.java   |   8 +-
 .../DefaultCoordinateOperationFactory.java         |   5 +-
 .../sis/referencing/operation/DefaultFormula.java  |  10 +-
 .../operation/DefaultOperationMethod.java          |  18 +-
 .../operation/builder/LinearTransformBuilder.java  |  26 +-
 .../operation/builder/LocalizationGridBuilder.java |  15 +-
 .../operation/builder/ProjectedTransformTry.java   |   8 +-
 .../operation/builder/TransformBuilder.java        |   2 +-
 .../operation/builder/package-info.java            |   2 +-
 .../referencing/operation/gridded/GridGroup.java   |   5 +-
 .../referencing/operation/gridded/LoadedGrid.java  |   5 +-
 .../operation/matrix/AffineTransforms2D.java       |  20 +-
 .../sis/referencing/operation/matrix/Matrices.java |  15 +-
 .../referencing/operation/matrix/MatrixSIS.java    |  12 +-
 .../matrix/MismatchedMatrixSizeException.java      |   2 +-
 .../operation/matrix/NonSquareMatrix.java          |   2 +-
 .../matrix/NoninvertibleMatrixException.java       |   2 +-
 .../referencing/operation/matrix/package-info.java |   8 +-
 .../sis/referencing/operation/package-info.java    |   8 +-
 .../operation/projection/AlbersEqualArea.java      |   2 +-
 .../operation/projection/AuthalicConversion.java   |   8 +-
 .../operation/projection/CassiniSoldner.java       |   2 +-
 .../operation/projection/ConformalProjection.java  |   4 +-
 .../operation/projection/CylindricalEqualArea.java |   2 +-
 .../operation/projection/Initializer.java          |  17 +-
 .../projection/LambertConicConformal.java          |   2 +-
 .../operation/projection/LongitudeWraparound.java  |   2 +-
 .../referencing/operation/projection/Mercator.java |   4 +-
 .../operation/projection/MeridianArcBased.java     |   4 +-
 .../projection/ModifiedAzimuthalEquidistant.java   |   2 +-
 .../operation/projection/NormalizedProjection.java |  72 ++--
 .../operation/projection/ObliqueStereographic.java |   2 +-
 .../operation/projection/PolarStereographic.java   |   4 +-
 .../operation/projection/Polyconic.java            |   2 +-
 .../operation/projection/SatelliteTracking.java    |   2 +-
 .../operation/projection/Sinusoidal.java           |   2 +-
 .../operation/projection/TransverseMercator.java   |   2 +-
 .../operation/projection/package-info.java         |  16 +-
 .../operation/provider/AbstractProvider.java       |   2 +-
 .../operation/provider/Geographic3Dto2D.java       |   2 +-
 .../operation/provider/MapProjection.java          |   4 +-
 .../sis/referencing/operation/provider/NTv2.java   |   4 +-
 .../operation/provider/NorthPoleRotation.java      |   2 +-
 .../provider/TransverseMercatorSouth.java          |   4 +-
 .../operation/transform/AbstractMathTransform.java |  10 +-
 .../operation/transform/ConcatenatedTransform.java |   9 +-
 .../operation/transform/ContextualParameters.java  |  29 +-
 .../operation/transform/DatumShiftTransform.java   |   8 +-
 .../transform/DefaultMathTransformFactory.java     |  31 +-
 .../operation/transform/DomainDefinition.java      |   4 +-
 .../transform/EllipsoidToCentricTransform.java     |  21 +-
 .../transform/ExponentialTransform1D.java          |   2 +-
 .../transform/InterpolatedGeocentricTransform.java |   5 +-
 .../operation/transform/InterpolatedTransform.java |  13 +-
 .../operation/transform/LinearTransform.java       |   2 +-
 .../transform/LogarithmicTransform1D.java          |   2 +-
 .../operation/transform/MathTransforms.java        |  15 +-
 .../operation/transform/MolodenskyTransform.java   |   9 +-
 .../operation/transform/PassThroughTransform.java  |   2 +-
 .../operation/transform/PoleRotation.java          |   6 +-
 .../transform/SpecializableTransform.java          |   2 +-
 .../operation/transform/TransferFunction.java      |  28 +-
 .../operation/transform/TransformSeparator.java    |   7 +-
 .../referencing/operation/transform/formulas.html  |   2 +-
 .../org/apache/sis/referencing/package-info.java   |   4 +-
 .../sis/referencing/util/AxisDirections.java       |  12 +-
 .../sis/referencing/util/CoordinateOperations.java |   6 +-
 .../org/apache/sis/referencing/util/Formulas.java  |   2 +-
 .../referencing/util/GeodeticObjectBuilder.java    |   4 +-
 .../sis/referencing/util/ReferencingUtilities.java |   8 +-
 .../sis/referencing/util/WraparoundApplicator.java |   4 +-
 .../referencing/util/j2d/AffineTransform2D.java    |   4 +-
 .../referencing/util/j2d/IntervalRectangle.java    |   2 +-
 .../referencing/util/j2d/ParameterizedAffine.java  |   2 +-
 .../org/apache/sis/referencing/util/j2d/Tile.java  |   4 +-
 .../sis/referencing/util/j2d/TileOrganizer.java    |   8 +-
 .../referencing/CC_GeneralOperationParameter.java  |   9 +-
 .../referencing/CC_OperationParameterGroup.java    |   6 +-
 .../apache/sis/geometry/AbstractEnvelopeTest.java  | 366 ++++++++++-----------
 .../org/apache/sis/referencing/Assertions.java     |   6 +-
 .../apache/sis/referencing/ClenshawSummation.java  |   6 +-
 .../operation/transform/MathTransformWrapper.java  |   6 +-
 .../referencing/util/CoordinateOperationsTest.java |  23 +-
 .../util/PositionalAccuracyConstantTest.java       |  20 +-
 .../org/apache/sis/storage/geotiff/DataSubset.java |   1 +
 .../apache/sis/storage/geotiff/GeoTiffStore.java   |   2 +-
 .../sis/storage/geotiff/ImageFileDirectory.java    |  12 +-
 .../sis/storage/geotiff/MultiResolutionImage.java  |   2 +-
 .../org/apache/sis/storage/geotiff/Reader.java     |   8 +-
 .../apache/sis/storage/geotiff/WritableStore.java  |   2 +-
 .../org/apache/sis/storage/geotiff/Writer.java     |   4 +-
 .../geotiff/reader/GridGeometryBuilder.java        |   8 +-
 .../sis/storage/geotiff/reader/XMLMetadata.java    |   2 +-
 .../sis/storage/geotiff/spi/SchemaModifier.java    |   2 +-
 .../sis/storage/geotiff/writer/GeoEncoder.java     |   2 +-
 .../sis/storage/geotiff/writer/TileMatrix.java     |   1 -
 .../org/apache/sis/storage/geotiff/WriterTest.java |   2 +-
 .../apache/sis/storage/netcdf/AttributeNames.java  |   2 +-
 .../apache/sis/storage/netcdf/MetadataReader.java  |   2 +-
 .../org/apache/sis/storage/netcdf/base/Axis.java   |   4 +-
 .../apache/sis/storage/netcdf/base/AxisType.java   |   4 +-
 .../apache/sis/storage/netcdf/base/CRSBuilder.java |   8 +-
 .../apache/sis/storage/netcdf/base/Convention.java |   4 +-
 .../apache/sis/storage/netcdf/base/Decoder.java    |   7 +-
 .../sis/storage/netcdf/base/GridMapping.java       |   2 +-
 .../apache/sis/storage/netcdf/base/Variable.java   |   4 +-
 .../sis/storage/netcdf/classic/ChannelDecoder.java |  10 +-
 .../apache/sis/storage/netcdf/package-info.java    |  14 +-
 .../sis/storage/netcdf/ucar/DecoderWrapper.java    |   4 +-
 .../apache/sis/storage/sql/SQLStoreProvider.java   |  14 +-
 .../sis/storage/sql/feature/FeatureIterator.java   |   1 +
 .../sis/storage/sql/feature/FeatureStream.java     |   5 +-
 .../org/apache/sis/storage/sql/feature/Table.java  |   5 +-
 .../sis/storage/sql/feature/ValueGetter.java       |   5 +-
 .../sis/storage/sql/postgis/RasterFormat.java      |   2 +-
 .../sis/storage/sql/postgis/RasterReader.java      |   4 +-
 .../sis/storage/sql/postgis/RasterWriter.java      |   6 +-
 .../sis/storage/sql/postgis/package-info.java      |   2 +-
 .../apache/sis/util/stream/BaseStreamWrapper.java  |   5 +-
 .../main/org/apache/sis/storage/gpx/Person.java    |   4 +-
 .../main/org/apache/sis/storage/gpx/Store.java     |   5 +-
 .../sis/storage/xml/stream/StaxStreamIO.java       |   5 +-
 .../sis/storage/xml/stream/StaxStreamReader.java   |   3 +-
 .../sis/storage/xml/stream/StaxStreamWriter.java   |   1 -
 .../sis/storage/xml/stream/package-info.java       |   2 +-
 .../org/apache/sis/io/stream/ChannelDataInput.java |   4 +-
 .../org/apache/sis/io/stream/ChannelFactory.java   |   2 +-
 .../main/org/apache/sis/storage/Aggregate.java     |   4 +-
 .../main/org/apache/sis/storage/CoverageQuery.java |  17 +-
 .../main/org/apache/sis/storage/DataStore.java     |   8 +-
 .../org/apache/sis/storage/DataStoreProvider.java  |   4 +-
 .../main/org/apache/sis/storage/FeatureNaming.java |   7 +-
 .../main/org/apache/sis/storage/FeatureQuery.java  |  37 +--
 .../main/org/apache/sis/storage/FeatureSet.java    |   5 +-
 .../apache/sis/storage/GridCoverageResource.java   |  22 +-
 .../main/org/apache/sis/storage/Query.java         |   2 +-
 .../org/apache/sis/storage/StorageConnector.java   |  16 +-
 .../org/apache/sis/storage/WritableAggregate.java  |   2 +-
 .../aggregate/BandAggregateGridResource.java       |   2 +-
 .../storage/aggregate/ConcatenatedFeatureSet.java  |   1 -
 .../sis/storage/aggregate/CoverageAggregator.java  |   2 +-
 .../org/apache/sis/storage/base/LegalSymbols.java  | 217 ++++++++++++
 .../apache/sis/storage/base/MemoryFeatureSet.java  |   8 +-
 .../sis/storage/base/MemoryGridResource.java       |   9 +-
 .../apache/sis/storage/base/MetadataBuilder.java   | 207 +-----------
 .../apache/sis/storage/base/MetadataFetcher.java   |   2 +-
 .../org/apache/sis/storage/base/PRJDataStore.java  |   5 +-
 .../sis/storage/base/WritableAggregateSupport.java |   5 +-
 .../storage/base/WritableGridCoverageSupport.java  |   6 +-
 .../main/org/apache/sis/storage/csv/Store.java     |   2 +-
 .../org/apache/sis/storage/csv/StoreProvider.java  |   2 -
 .../apache/sis/storage/event/StoreListeners.java   |  26 +-
 .../org/apache/sis/storage/event/WarningEvent.java |   5 +-
 .../main/org/apache/sis/storage/folder/Store.java  |   2 +-
 .../apache/sis/storage/folder/StoreProvider.java   |   2 -
 .../apache/sis/storage/folder/WritableStore.java   |   5 +-
 .../apache/sis/storage/image/WorldFileStore.java   |   6 +-
 .../apache/sis/storage/image/WritableStore.java    |   4 +-
 .../org/apache/sis/storage/image/package-info.java |   2 +-
 .../org/apache/sis/storage/tiling/TileMatrix.java  |   2 +-
 .../apache/sis/storage/tiling/TileMatrixSet.java   |   2 +-
 .../apache/sis/storage/xml/GeographicEnvelope.java |   2 +-
 .../src/org.apache.sis.util/main/module-info.java  |   9 +-
 .../apache/sis/converter/ConverterRegistry.java    |   4 +-
 .../apache/sis/converter/FallbackConverter.java    |   2 +-
 .../org/apache/sis/converter/StringConverter.java  |   1 -
 .../org/apache/sis/converter/package-info.java     |   2 +-
 .../main/org/apache/sis/io/Appender.java           |   5 +-
 .../main/org/apache/sis/io/CompoundFormat.java     |   6 +-
 .../main/org/apache/sis/io/LineAppender.java       |   7 +-
 .../main/org/apache/sis/io/TableAppender.java      |  17 +-
 .../main/org/apache/sis/io/TabularFormat.java      |   2 +-
 .../main/org/apache/sis/math/ArrayVector.java      |   2 +-
 .../main/org/apache/sis/math/DecimalFunctions.java |   6 +-
 .../main/org/apache/sis/math/FunctionProperty.java |  20 +-
 .../main/org/apache/sis/math/Line.java             |   1 -
 .../main/org/apache/sis/math/MathFunctions.java    |  15 +-
 .../main/org/apache/sis/math/Plane.java            |   6 +-
 .../main/org/apache/sis/math/RepeatedVector.java   |   5 +-
 .../main/org/apache/sis/math/SequenceVector.java   |   8 +-
 .../main/org/apache/sis/math/Statistics.java       |   6 +-
 .../main/org/apache/sis/math/Vector.java           |  11 +-
 .../org/apache/sis/measure/AbstractConverter.java  |   2 -
 .../main/org/apache/sis/measure/Angle.java         |  10 +-
 .../main/org/apache/sis/measure/AngleFormat.java   |  10 +-
 .../apache/sis/measure/ConcatenatedConverter.java  |   2 -
 .../org/apache/sis/measure/ConventionalUnit.java   |  18 +-
 .../org/apache/sis/measure/ElevationAngle.java     |   6 +-
 .../sis/measure/FormattedCharacterIterator.java    |  15 +-
 .../org/apache/sis/measure/IdentityConverter.java  |   5 +-
 .../main/org/apache/sis/measure/Latitude.java      |  16 +-
 .../org/apache/sis/measure/LinearConverter.java    |  11 +-
 .../main/org/apache/sis/measure/Longitude.java     |   4 +-
 .../main/org/apache/sis/measure/Quantities.java    |   2 -
 .../org/apache/sis/measure/QuantityFormat.java     |  11 +-
 .../main/org/apache/sis/measure/Range.java         |  11 +-
 .../main/org/apache/sis/measure/RangeFormat.java   |  12 +-
 .../apache/sis/measure/SexagesimalConverter.java   |  14 +-
 .../main/org/apache/sis/measure/SystemUnit.java    |   7 +-
 .../main/org/apache/sis/measure/UnitDimension.java |   1 -
 .../main/org/apache/sis/measure/UnitFormat.java    |  20 +-
 .../main/org/apache/sis/measure/UnitServices.java  |   4 +-
 .../main/org/apache/sis/pending/jdk/JDK19.java     |  22 ++
 .../main/org/apache/sis/pending/jdk/JDK21.java     |  27 +-
 .../main/org/apache/sis/setup/Configuration.java   |   9 +-
 .../apache/sis/setup/InstallationResources.java    |   2 +-
 .../main/org/apache/sis/setup/OptionKey.java       |  10 +-
 .../org/apache/sis/system/OptionalDependency.java  |   1 -
 .../{internal => }/ArgumentCheckByAssertion.java   |  21 +-
 .../main/org/apache/sis/util/ArgumentChecks.java   |  42 ++-
 .../main/org/apache/sis/util/ArraysExt.java        |   1 -
 .../main/org/apache/sis/util/CharSequences.java    |  15 +-
 .../main/org/apache/sis/util/Characters.java       |   4 +-
 .../main/org/apache/sis/util/Classes.java          |   6 +-
 .../main/org/apache/sis/util/ComparisonMode.java   |   4 +-
 ...heckByAssertion.java => ConditionallySafe.java} |  17 +-
 .../sis/util/DefaultInternationalString.java       |   2 +-
 .../main/org/apache/sis/util/Exceptions.java       |   2 +-
 .../org/apache/sis/util/LenientComparable.java     |   8 +-
 .../main/org/apache/sis/util/Locales.java          |  13 +-
 .../main/org/apache/sis/util/Numbers.java          |   4 +-
 .../main/org/apache/sis/util/ObjectConverter.java  |   2 +-
 .../main/org/apache/sis/util/ObjectConverters.java |  13 +-
 .../main/org/apache/sis/util/Printable.java        |   2 +-
 .../sis/util/ResourceInternationalString.java      |   4 +-
 .../apache/sis/util/SimpleInternationalString.java |   4 +-
 .../main/org/apache/sis/util/Static.java           |   2 +-
 .../main/org/apache/sis/util/StringBuilders.java   |  14 +-
 .../sis/util/UnconvertibleObjectException.java     |   2 +-
 .../main/org/apache/sis/util/Version.java          |   4 +-
 .../main/org/apache/sis/util/collection/Cache.java |  12 +-
 .../org/apache/sis/util/collection/Containers.java |  38 +--
 .../sis/util/collection/DefaultTreeTable.java      |  22 +-
 .../org/apache/sis/util/collection/DerivedMap.java |   2 +-
 .../org/apache/sis/util/collection/DerivedSet.java |   2 +-
 .../apache/sis/util/collection/IntegerList.java    |  14 +-
 .../org/apache/sis/util/collection/RangeSet.java   |   8 +-
 .../apache/sis/util/collection/TableColumn.java    |   8 +-
 .../apache/sis/util/collection/TreeNodeList.java   |  23 +-
 .../org/apache/sis/util/collection/TreeTable.java  |   4 +-
 .../org/apache/sis/util/collection/TreeTables.java |   1 -
 .../apache/sis/util/collection/WeakHashSet.java    |  47 ++-
 .../apache/sis/util/internal/CheckedArrayList.java |  11 +-
 .../apache/sis/util/internal/CheckedHashSet.java   |   9 +-
 .../apache/sis/util/internal/CollectionsExt.java   |  10 +-
 .../apache/sis/util/internal/DefinitionURI.java    |   6 +-
 .../org/apache/sis/util/internal/DoubleDouble.java |   2 +-
 .../org/apache/sis/util/internal/Numerics.java     |   4 +-
 .../sis/util/internal/SimpleCharacterIterator.java |   1 -
 .../sis/util/internal/UnmodifiableArrayList.java   |  23 +-
 .../main/org/apache/sis/util/internal/Unsafe.java  | 106 ++++++
 .../main/org/apache/sis/util/internal/X364.java    |   4 +-
 .../main/org/apache/sis/util/logging/Logging.java  |   1 -
 .../apache/sis/util/logging/MonolineFormatter.java |   8 +-
 .../apache/sis/util/resources/package-info.java    |   2 +-
 .../test/org/apache/sis/test/TestRunner.java       |   4 +-
 .../test/org/apache/sis/test/TestUtilities.java    |   2 +-
 .../org/apache/sis/map/ExceptionPresentation.java  |  10 +-
 .../main/org/apache/sis/map/SEPortrayer.java       |   5 +-
 .../apache/sis/map/service/GraphicsPortrayer.java  |  15 +-
 .../main/org/apache/sis/map/service/Scene2D.java   |   8 +-
 .../sis/map/service/se1/PresentationToScene2D.java |   9 +-
 .../sis/storage/shapefile/ShapefileStore.java      |   4 +-
 .../apache/sis/gui/controls/SyncWindowList.java    |   2 +-
 .../apache/sis/gui/controls/ValueColorMapper.java  |   1 +
 .../apache/sis/gui/coverage/CoverageCanvas.java    |   1 +
 .../apache/sis/gui/coverage/CoverageControls.java  |   6 +-
 .../apache/sis/gui/coverage/CoverageExplorer.java  |  13 +-
 .../apache/sis/gui/coverage/CoverageStyling.java   |   1 -
 .../org/apache/sis/gui/coverage/GridViewSkin.java  |   1 -
 .../org/apache/sis/gui/coverage/ImageRequest.java  |   8 +-
 .../apache/sis/gui/coverage/IsolineRenderer.java   |   1 -
 .../org/apache/sis/gui/dataset/WindowHandler.java  |   3 -
 .../org/apache/sis/gui/internal/ColorName.java     |   2 +-
 .../org/apache/sis/gui/internal/GUIUtilities.java  |   2 +-
 .../org/apache/sis/gui/internal/PropertyView.java  |   1 -
 .../main/org/apache/sis/gui/map/MapCanvas.java     |  26 +-
 .../main/org/apache/sis/gui/map/MapCanvasAWT.java  |   1 +
 .../main/org/apache/sis/gui/map/MapMenu.java       |  17 +-
 .../main/org/apache/sis/gui/map/StatusBar.java     |  11 +-
 .../sis/gui/metadata/IdentificationInfo.java       |   4 +-
 .../org/apache/sis/gui/metadata/MetadataTree.java  |   4 +-
 .../sis/gui/metadata/StandardMetadataTree.java     |   1 -
 .../gui/referencing/PositionableProjection.java    |   2 -
 .../org/apache/sis/gui/referencing/WKTPane.java    |   1 -
 565 files changed, 2452 insertions(+), 2655 deletions(-)

diff --cc 
endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/internal/NameToIdentifier.java
index 48b7c7f270,7913e21064..bae94b4215
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/internal/NameToIdentifier.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/internal/NameToIdentifier.java
@@@ -28,12 -28,8 +28,11 @@@ import org.opengis.metadata.citation.Ci
  import org.apache.sis.metadata.iso.citation.Citations;
  import org.apache.sis.util.CharSequences;
  import org.apache.sis.util.iso.DefaultNameSpace;
- import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  import static org.apache.sis.util.Characters.Filter.LETTERS_AND_DIGITS;
  
 +// Specific to the main and geoapi-3.1 branches:
 +import org.opengis.referencing.ReferenceIdentifier;
 +
  
  /**
   * Does the unobvious mapping between {@link Identifier} properties and 
{@link GenericName} ones.
diff --cc 
endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/DefaultScopeDescription.java
index 9f3c5bf2d7,1ed6037e7b..9e61cd69a9
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/DefaultScopeDescription.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/DefaultScopeDescription.java
@@@ -574,22 -522,20 +574,22 @@@ public class DefaultScopeDescription ex
                  }
              }
              setDataset(description);
-         } else if (ScopeCode.FEATURE_TYPE.equals(level)) {
+         } else if (level == ScopeCode.FEATURE_TYPE) {
 -            setFeatures(newValues);
 +            setFeatures(LegacyFeatureType.wrapAll(newValues));
-         } else if (ScopeCode.ATTRIBUTE_TYPE.equals(level)) {
+         } else if (level == ScopeCode.ATTRIBUTE_TYPE) {
 -            setAttributes(newValues);
 +            setAttributes(LegacyFeatureType.wrapAll(newValues));
-         } else if (ScopeCode.FEATURE.equals(level)) {
+         } else if (level == ScopeCode.FEATURE) {
 -            setFeatureInstances(newValues);
 +            setFeatureInstances(LegacyFeatureType.wrapAll(newValues));
-         } else if (ScopeCode.ATTRIBUTE.equals(level)) {
+         } else if (level == ScopeCode.ATTRIBUTE) {
 -            setAttributeInstances(newValues);
 +            setAttributeInstances(LegacyFeatureType.wrapAll(newValues));
          } else {
 -            InternationalString description = null;
 +            String description = null;
              if (newValues != null) {
-                 for (CharSequence value : newValues) {
-                     if (value != null) {
-                         description = value.toString();
+                 for (CharSequence v : newValues) {
 -                    description = Types.toInternationalString(v);
 -                    if (description != null) break;
++                    if (v != null) {
++                        description = v.toString();
 +                        break;
 +                    }
                  }
              }
              setOther(description);
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/GeodeticObjectParser.java
index e5b3cb101c,cef0cb0664..1dfae323b4
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/GeodeticObjectParser.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/GeodeticObjectParser.java
@@@ -455,22 -453,17 +456,17 @@@ class GeodeticObjectParser extends Math
               * (for example "WGS84" for the datum instead of "World Geodetic 
System 1984"),
               * so the name in WKT is often not compliant with the name 
actually defined by the authority.
               */
-             final ImmutableIdentifier id = new 
ImmutableIdentifier(Citations.fromName(authority),
+             final var id = new 
ImmutableIdentifier(Citations.fromName(authority),
                      codeSpace, code, (version != null) ? version.toString() : 
null, null);
-             final Object previous = 
properties.put(IdentifiedObject.IDENTIFIERS_KEY, id);
-             if (previous != null) {
-                 ReferenceIdentifier[] identifiers;
+             properties.merge(IdentifiedObject.IDENTIFIERS_KEY, id, (previous, 
toAdd) -> {
 -                final var more = (Identifier) toAdd;
 -                if (previous instanceof Identifier) {
 -                    return new Identifier[] {(Identifier) previous, more};
++                final var more = (ReferenceIdentifier) toAdd;
 +                if (previous instanceof ReferenceIdentifier) {
-                     identifiers = new ReferenceIdentifier[] 
{(ReferenceIdentifier) previous, id};
++                    return new ReferenceIdentifier[] {(ReferenceIdentifier) 
previous, more};
                  } else {
-                     identifiers = (ReferenceIdentifier[]) previous;
-                     final int n = identifiers.length;
-                     identifiers = Arrays.copyOf(identifiers, n + 1);
-                     identifiers[n] = id;
 -                    return ArraysExt.append((Identifier[]) previous, more);
++                    return ArraysExt.append((ReferenceIdentifier[]) previous, 
more);
                  }
-                 properties.put(IdentifiedObject.IDENTIFIERS_KEY, identifiers);
-                 // REMINDER: values associated to IDENTIFIERS_KEY shall be 
recognized by `toIdentifier(Object)`.
-             }
+             });
+             // REMINDER: values associated to IDENTIFIERS_KEY shall be 
recognized by `toIdentifier(Object)`.
          }
          /*
           * Other metadata (SCOPE, AREA, etc.).  ISO 19162 said that at most 
one of each type shall be present,
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/ParameterFormat.java
index c2aa138be7,74a38bfdf8..0e609f7ac7
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/ParameterFormat.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/ParameterFormat.java
@@@ -56,11 -57,8 +57,11 @@@ import org.apache.sis.util.internal.Col
  import org.apache.sis.util.internal.X364;
  import org.apache.sis.referencing.IdentifiedObjects;
  import org.apache.sis.metadata.internal.NameToIdentifier;
- import static org.apache.sis.util.collection.Containers.hashMapCapacity;
+ import org.apache.sis.pending.jdk.JDK19;
  
 +// Specific to the main and geoapi-3.1 branches:
 +import org.opengis.referencing.ReferenceIdentifier;
 +
  // Specific to the geoapi-3.1 and geoapi-4.0 branches:
  import org.opengis.util.ControlledVocabulary;
  
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/Builder.java
index 19393f5a85,73893af8bf..7a844ec307
--- 
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
@@@ -37,11 -40,7 +40,10 @@@ import org.apache.sis.util.ArgumentChec
  import org.apache.sis.util.iso.DefaultNameFactory;
  import org.apache.sis.util.iso.Types;
  import org.apache.sis.util.resources.Errors;
- import static org.apache.sis.util.ArgumentChecks.*;
  
 +// Specific to the main and geoapi-3.1 branches:
 +import org.opengis.referencing.ReferenceIdentifier;
 +
  
  /**
   * Base class of builders for various kinds of {@link IdentifiedObject}. This 
class provides convenience methods
@@@ -94,8 -93,8 +96,8 @@@
   *       The result is a {@linkplain 
org.apache.sis.util.iso.DefaultScopedName scoped name} or identifier,
   *       in which the code space information is shown by the {@code 
toString()} method.</li>
   *
-  *   <li>The {@code addIdentifier(Identifier)}, {@code addName(Identifier)} 
and {@link #addName(GenericName)}
-  *       methods take the given object <cite>as-is</cite>. Any authority, 
code space, version or description
 - *   <li>The {@link #addIdentifier(Identifier)}, {@link #addName(Identifier)} 
and {@link #addName(GenericName)}
++ *   <li>The {@link #addIdentifier(ReferenceIdentifier)}, {@link 
#addName(ReferenceIdentifier)} and {@link #addName(GenericName)}
+  *       methods take the given object <em>as-is</em>. Any authority, code 
space, version or description
   *       information given to the {@code Builder} are ignored.</li>
   * </ul>
   *
@@@ -581,9 -579,8 +584,8 @@@ public abstract class Builder<B extend
       * @param  name  the {@code IdentifiedObject} name as an identifier.
       * @return {@code this}, for method call chaining.
       */
 -    public B addName(final Identifier name) {
 +    public B addName(final ReferenceIdentifier name) {
-         ensureNonNull("name", name);
-         if (properties.putIfAbsent(IdentifiedObject.NAME_KEY, name) != null) {
+         if (properties.putIfAbsent(IdentifiedObject.NAME_KEY, 
Objects.requireNonNull(name)) != null) {
              // A primary name is already present. Add the given name as an 
alias instead.
              aliases.add(name instanceof GenericName ? (GenericName) name : 
new NamedIdentifier(name));
          }
@@@ -673,9 -670,8 +675,8 @@@
       * @param  identifier  the {@code IdentifiedObject} identifier.
       * @return {@code this}, for method call chaining.
       */
 -    public B addIdentifier(final Identifier identifier) {
 +    public B addIdentifier(final ReferenceIdentifier identifier) {
-         ensureNonNull("identifier", identifier);
-         identifiers.add(identifier);
+         identifiers.add(Objects.requireNonNull(identifier));
          return self();
      }
  
@@@ -702,8 -698,7 +703,7 @@@
       * @since 0.6
       */
      public B addNamesAndIdentifiers(final IdentifiedObject object) {
-         ensureNonNull("object", object);
 -        for (final Identifier id : object.getIdentifiers()) {
 +        for (final ReferenceIdentifier id : object.getIdentifiers()) {
              if (isValid(id)) {
                  addIdentifier(id);
              }
@@@ -731,9 -726,8 +731,8 @@@
       * @since 1.1
       */
      public B addNameAndIdentifier(final Citation authority, final 
IdentifiedObject object) {
-         ensureNonNull("authority", authority);
-         ensureNonNull("object", object);
+         ArgumentChecks.ensureNonNull("authority", authority);
 -        for (final Identifier id : object.getIdentifiers()) {
 +        for (final ReferenceIdentifier id : object.getIdentifiers()) {
              if (isValid(id) && authority.equals(id.getAuthority())) {
                  addIdentifier(id);
              }
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/ImmutableIdentifier.java
index c2d6e03534,3e46929f8c..1c357a918c
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/ImmutableIdentifier.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/ImmutableIdentifier.java
@@@ -36,12 -36,8 +36,11 @@@ import org.apache.sis.io.wkt.Formattabl
  import org.apache.sis.io.wkt.Formatter;
  import org.apache.sis.io.wkt.Convention;
  import org.apache.sis.io.wkt.ElementKind;
- import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
  import static org.apache.sis.util.collection.Containers.property;
  
 +// Specific to the main and geoapi-3.1 branches:
 +import org.opengis.referencing.ReferenceIdentifier;
 +
  
  /**
   * Immutable value uniquely identifying an object within a namespace, 
together with a version.
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/provider/AbstractProvider.java
index 4b693fcb27,9aa1f91739..efc54c97ba
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/provider/AbstractProvider.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/provider/AbstractProvider.java
@@@ -165,13 -165,13 +165,13 @@@ public abstract class AbstractProvider 
       */
      @Workaround(library="JDK", version="1.7")
      private static Map<String,Object> toMap(final IdentifiedObject 
parameters) {
-         ArgumentChecks.ensureNonNull("parameters", parameters);
+         // Implicit null value check below.
          final Map<String,Object> properties = new HashMap<>(4);
          properties.put(NAME_KEY, parameters.getName());
 -        final Collection<Identifier> identifiers = 
parameters.getIdentifiers();
 +        final Collection<ReferenceIdentifier> identifiers = 
parameters.getIdentifiers();
          int size = identifiers.size();
          if (size != 0) {
 -            properties.put(IDENTIFIERS_KEY, identifiers.toArray(new 
Identifier[size]));
 +            properties.put(IDENTIFIERS_KEY, identifiers.toArray(new 
ReferenceIdentifier[size]));
          }
          final Collection<GenericName> aliases = parameters.getAlias();
          size = aliases.size();
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactory.java
index 18e79d0926,5188a62e3b..1bfad11b97
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactory.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactory.java
@@@ -1645,23 -1643,9 +1643,22 @@@ public class DefaultMathTransformFactor
          return unique(tr);
      }
  
 +    /**
 +     * There is no XML format for math transforms.
 +     *
 +     * @param  xml  math transform encoded in XML format.
 +     * @throws FactoryException if the object creation failed.
 +     */
 +    @Override
 +    @Deprecated
 +    public MathTransform createFromXML(String xml) throws FactoryException {
 +        lastMethod.remove();
 +        throw new 
FactoryException(Errors.format(Errors.Keys.UnsupportedOperation_1, 
"createFromXML"));
 +    }
 +
      /**
       * Creates a math transform object from a
-      * <a 
href="http://www.geoapi.org/snapshot/javadoc/org/opengis/referencing/doc-files/WKT.html";><cite>Well
-      * Known Text</cite> (WKT)</a>.
+      * <a 
href="http://www.geoapi.org/snapshot/javadoc/org/opengis/referencing/doc-files/WKT.html";>Well
 Known Text (WKT)</a>.
       * If the given text contains non-fatal anomalies (unknown or unsupported 
WKT elements,
       * inconsistent unit definitions, <i>etc.</i>), warnings may be reported 
in a
       * {@linkplain java.util.logging.Logger logger} named {@code 
"org.apache.sis.io.wkt"}.
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CC_GeneralOperationParameter.java
index 3906b3fcb5,716af63e88..46a4d4ca60
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CC_GeneralOperationParameter.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CC_GeneralOperationParameter.java
@@@ -45,11 -44,8 +44,11 @@@ import org.apache.sis.xml.IdentifiedObj
  import org.apache.sis.xml.IdentifierSpace;
  import org.apache.sis.xml.bind.Context;
  import org.apache.sis.xml.bind.gco.PropertyType;
- import org.apache.sis.util.resources.Errors;
+ import org.apache.sis.pending.jdk.JDK19;
  
 +// Specific to the main and geoapi-3.1 branches:
 +import org.opengis.referencing.ReferenceIdentifier;
 +
  
  /**
   * JAXB adapter mapping implementing class to the GeoAPI interface. See
diff --cc 
endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/LegalSymbols.java
index 0000000000,c2916e1a64..8f6675256b
mode 000000,100644..100644
--- 
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
@@@ -1,0 -1,216 +1,217 @@@
+ /*
+  * 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.time.LocalDate;
+ import java.util.Date;
+ import java.util.Collections;
+ import org.opengis.metadata.citation.*;
+ import org.opengis.metadata.constraint.*;
+ import org.apache.sis.util.CharSequences;
+ import org.apache.sis.metadata.iso.citation.*;
+ import org.apache.sis.metadata.iso.constraint.*;
+ import static 
org.apache.sis.util.internal.StandardDateFormat.MILLISECONDS_PER_DAY;
+ 
+ 
+ /**
+  * Elements to omit in the legal notice to be parsed by {@link 
MetadataBuilder#parseLegalNotice(String)}.
+  * Some of those elements are implied by the metadata were the legal notice 
will be stored.
+  *
+  * @author  Martin Desruisseaux (Geomatys)
+  */
+ final class LegalSymbols {
+     /**
+      * Symbols associated to restrictions.
+      */
+     private static final LegalSymbols[] VALUES = {
+         new LegalSymbols(Restriction.COPYRIGHT, "COPYRIGHT", "(C)", "©", "All 
rights reserved"),
+         new LegalSymbols(Restriction.TRADEMARK, "TRADEMARK", "(TM)", "™", 
"(R)", "®")
+     };
+ 
+     /**
+      * The restriction to use if an item in the {@linkplain #symbols} list is 
found.
+      */
+     private final Restriction restriction;
+ 
+     /**
+      * Symbols to use as an indication that the {@linkplain #restriction} 
applies.
+      */
+     private final String[] symbols;
+ 
+     /**
+      * Creates a new enumeration value for the given symbol.
+      */
+     private LegalSymbols(final Restriction restriction, final String... 
symbols) {
+         this.restriction = restriction;
+         this.symbols = symbols;
+     }
+ 
+     /**
+      * Returns {@code true} if the given character is a space or a 
punctuation of category "other".
+      * The punctuation characters include coma, dot, semi-colon, <i>etc.</i> 
but do not include
+      * parenthesis or connecting punctuation.
+      *
+      * @param c the Unicode code point of the character to test.
+      */
+     private static boolean isSpaceOrPunctuation(final int c) {
+         switch (Character.getType(c)) {
+             case Character.LINE_SEPARATOR:
+             case Character.SPACE_SEPARATOR:
+             case Character.PARAGRAPH_SEPARATOR:
+             case Character.OTHER_PUNCTUATION: return true;
+             default: return false;
+         }
+     }
+ 
+     /**
+      * Implementation of {@link MetadataBuilder#parseLegalNotice(String)}, 
provided here for reducing
+      * the number of class loading in the common case where there is no legal 
notice to parse.
+      */
+     static void parse(final String notice, final DefaultLegalConstraints 
constraints) {
+         final int length = notice.length();
+         final StringBuilder buffer = new StringBuilder(length);
+         int     year           = 0;         // The copyright year, or 0 if 
none.
+         int     quoteLevel     = 0;         // Incremented on ( [ « 
characters, decremented on ) ] » characters.
+         boolean isCopyright    = false;     // Whether the word parsed by 
previous iteration was "Copyright" or "(C)".
+         boolean wasSeparator   = true;      // Whether the caracter parsed by 
the previous iteration was a word separator.
+         boolean wasPunctuation = true;      // Whether the previous character 
was a punctuation of Unicode category "other".
+         boolean skipNextChars  = true;      // Whether the next spaces and 
some punction characters should be ignored.
+ parse:  for (int i = 0; i < length;) {
+             final int c = notice.codePointAt(i);
+             final int n = Character.charCount(c);
+             int     quoteChange   = 0;
+             boolean isSeparator   = false;
+             boolean isPunctuation;
+             switch (Character.getType(c)) {
+                 case Character.INITIAL_QUOTE_PUNCTUATION:
+                 case Character.START_PUNCTUATION: {
+                     quoteChange   = +1;                     //  ( [ «  etc.
+                     skipNextChars = false;
+                     isPunctuation = false;
+                     break;
+                 }
+                 case Character.FINAL_QUOTE_PUNCTUATION:
+                 case Character.END_PUNCTUATION: {
+                     quoteChange   = -1;                     //  ) ] »  etc.
+                     skipNextChars = false;
+                     isPunctuation = false;
+                     break;
+                 }
+                 default: {                                  // Letter, digit, 
hyphen, etc.
+                     skipNextChars = false;
+                     isPunctuation = false;
+                     break;
+                 }
+                 case Character.OTHER_PUNCTUATION: {         //  , . : ; / " 
etc. but not -.
+                     isPunctuation = true;
+                     isSeparator   = true;
+                     break;
+                 }
+                 case Character.LINE_SEPARATOR:
+                 case Character.SPACE_SEPARATOR:
+                 case Character.PARAGRAPH_SEPARATOR: {
+                     isPunctuation = wasPunctuation;
+                     isSeparator   = true;
+                     break;
+                 }
+             }
+             if (wasSeparator && !isSeparator && quoteLevel == 0) {
+                 /*
+                  * Found the beginning of a new word. Ignore textes like 
"(C)" or "All rights reserved".
+                  * Some of those textes are implied by the metadata where the 
legal notice will be stored.
+                  */
+                 for (final LegalSymbols r : VALUES) {
+                     for (final String symbol : r.symbols) {
+                         if (notice.regionMatches(true, i, symbol, 0, 
symbol.length())) {
+                             final int after = i + symbol.length();
+                             if (after >= length || 
isSpaceOrPunctuation(notice.codePointAt(after))) {
+                                 isCopyright |= (r.restriction == 
Restriction.COPYRIGHT);
+                                 
constraints.getUseConstraints().add(r.restriction);
+                                 wasPunctuation = true;      // Pretend that 
"Copyright" was followed by a coma.
+                                 skipNextChars  = true;      // Ignore spaces 
and punctuations until the next word.
+                                 i = after;                  // Skip the 
"Copyright" (or other) word.
+                                 continue parse;
+                             }
+                         }
+                     }
+                 }
+                 /*
+                  * If a copyright notice is followed by digits, assume that 
those digits are the copyright year.
+                  * We require the year is followed by punctuations or 
non-breaking space in order to reduce the
+                  * risk of confusion with postal addresses. So this block 
should accept "John, 1992." but not
+                  * "1992-1 Nowhere road".
+                  */
+                 if (isCopyright && wasPunctuation && year == 0 && c >= '0' && 
c <= '9') {
+                     int endOfDigits = i + n;            // After the last 
digit in sequence.
+                     while (endOfDigits < length) {
+                         final int d = notice.codePointAt(endOfDigits);
+                         if (d < '0' || d > '9') break;
+                         endOfDigits++;              // No need to use 
Character.charCount(s) here.
+                     }
+                     // Verify if the digits are followed by a punctuation.
+                     final int endOfToken = 
CharSequences.skipLeadingWhitespaces(notice, endOfDigits, length);
+                     if (endOfToken > endOfDigits || 
isSpaceOrPunctuation(notice.codePointAt(endOfToken))) try {
+                         year = Integer.parseInt(notice.substring(i, 
endOfDigits));
+                         if (year >= 1800 && year <= 9999) {                   
  // Those limits are arbitrary.
+                             skipNextChars = true;
+                             i = endOfToken;
+                             continue;
+                         }
+                         year = 0;                                             
  // Reject as not a copyright year.
+                     } catch (NumberFormatException e) {
+                         // Not an integer - ignore, will be handled as text.
+                     }
+                 }
+             }
+             /*
+              * End of the block that was executed at the beginning of each 
new word.
+              * Following is executed for every characters, except if the 
above block
+              * skipped a portion of the input string.
+              */
+             wasPunctuation = isPunctuation;
+             wasSeparator   = isSeparator;
+             quoteLevel    += quoteChange;
+             if (!skipNextChars && !Character.isIdentifierIgnorable(c)) {
+                 buffer.appendCodePoint(c);
+             }
+             i += n;
+         }
+         /*
+          * End of parsing. Omit trailing spaces and some punctuations if any, 
then store the result.
+          */
+         int i = buffer.length();
+         while (i > 0) {
+             final int c = buffer.codePointBefore(i);
+             if (!isSpaceOrPunctuation(c)) break;
+             i -= Character.charCount(c);
+         }
+         final DefaultCitation c = new DefaultCitation(notice);
+         if (year != 0) {
+             final Date date = new Date(LocalDate.of(year, 1, 1).toEpochDay() 
* MILLISECONDS_PER_DAY);
+             c.setDates(Collections.singleton(new DefaultCitationDate(date, 
DateType.IN_FORCE)));
+         }
+         if (i != 0) {
+             buffer.setLength(i);
+             // Same limitation as MetadataBuilder.party().
+             final AbstractParty party = new AbstractParty(buffer, null);
 -            final DefaultResponsibility r = new 
DefaultResponsibility(Role.OWNER, null, party);
++            final var r = new DefaultResponsibleParty(Role.OWNER);
++            r.setParties(Collections.singleton(party));
+             c.setCitedResponsibleParties(Collections.singleton(r));
+         }
+         constraints.getReferences().add(c);
+     }
+ }
diff --cc 
endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/MetadataBuilder.java
index 8f319d7c4c,76aebaa558..e22d14dae3
--- 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/MetadataBuilder.java
+++ 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/MetadataBuilder.java
@@@ -1520,10 -1511,9 +1511,9 @@@ public class MetadataBuilder 
       * @param  contact  means of communication with party associated with the 
resource, or {@code null} for no-operation.
       * @param  scope    whether the contact applies to data, to metadata or 
to both.
       */
 -    public final void addPointOfContact(final Responsibility contact, final 
Scope scope) {
 +    public final void addPointOfContact(final ResponsibleParty contact, final 
Scope scope) {
-         ArgumentChecks.ensureNonNull("scope", scope);
          if (contact != null) {
-             if (scope != Scope.RESOURCE)     
addIfNotPresent(metadata().getContacts(), contact);
+             if (scope != Scope.RESOURCE) 
addIfNotPresent(metadata().getContacts(), contact);
              if (scope != Scope.METADATA) 
addIfNotPresent(identification().getPointOfContacts(), contact);
          }
      }

Reply via email to