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 2022/12/13 13:27:27 UTC

[sis] 01/01: Merge branch 'geoapi-3.1'. This is the upgrade from Java 8 to Java 11.

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

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

commit e7c5ccf5a900bf49cf045ad9a55c5cb36b8b2477
Merge: 217df02d3e f5bc633ac3
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Tue Dec 13 14:25:57 2022 +0100

    Merge branch 'geoapi-3.1'.
    This is the upgrade from Java 8 to Java 11.
    
    https://issues.apache.org/jira/browse/SIS-561

 README                                             |   2 +-
 application/sis-console/pom.xml                    |   5 +
 .../org/apache/sis/console/IdentifierCommand.java  |   1 +
 .../org/apache/sis/console/MetadataCommand.java    |   4 +-
 .../apache/sis/console/ResourcesDownloader.java    |   3 +-
 .../org/apache/sis/console/TransformCommand.java   |   3 +-
 application/sis-javafx/pom.xml                     |   5 +
 application/sis-javafx/src/main/artifact/README    |   6 +-
 application/sis-javafx/src/main/artifact/bin/sis   |   2 +-
 .../sis-javafx/src/main/artifact/bin/sis.bat       |   2 +-
 application/sis-javafx/src/main/artifact/bin/sisfx |   2 +-
 .../sis-javafx/src/main/artifact/bin/sisfx.bat     |   2 +-
 .../main/java/org/apache/sis/gui/DataViewer.java   |   3 +-
 .../main/java/org/apache/sis/gui/RecentFiles.java  |   4 +-
 .../apache/sis/gui/coverage/CoverageControls.java  |   4 +-
 .../apache/sis/gui/coverage/CoverageExplorer.java  |  24 +-
 .../apache/sis/gui/coverage/CoverageStyling.java   |   2 +-
 .../org/apache/sis/gui/coverage/package-info.java  |   2 +-
 .../apache/sis/gui/dataset/ExpandedFeature.java    |   8 +-
 .../org/apache/sis/gui/dataset/PathAction.java     |   3 +-
 .../java/org/apache/sis/gui/map/StatusBar.java     |  63 +---
 .../java/org/apache/sis/gui/map/package-info.java  |   2 +-
 .../sis/gui/metadata/StandardMetadataTree.java     |   6 +-
 .../apache/sis/gui/referencing/AuthorityCodes.java |   3 +-
 .../gui/referencing/PositionableProjection.java    |   2 +-
 .../gui/referencing/RecentReferenceSystems.java    |  20 +-
 .../apache/sis/gui/referencing/package-info.java   |   2 +-
 .../org/apache/sis/internal/gui/GUIUtilities.java  |   4 +-
 .../apache/sis/internal/gui/ImageConverter.java    |   5 +-
 .../org/apache/sis/internal/gui/RecentChoices.java |   4 +-
 .../apache/sis/internal/gui/GUIUtilitiesTest.java  |   7 +-
 application/sis-openoffice/pom.xml                 |   5 +
 application/sis-webapp/pom.xml                     |  10 +
 .../org/apache/sis/services}/OSGiActivator.java    |   7 +-
 .../org/apache/sis/services}/ServletListener.java  |   8 +-
 .../org/apache/sis/internal/book/Assembler.java    |  10 +-
 .../apache/sis/internal/book/CodeColorizer.java    |   7 +-
 .../org/apache/sis/internal/book/package-info.java |   4 +-
 .../org/apache/sis/coverage/SampleDimension.java   |   4 +-
 .../sis/coverage/grid/BufferedGridCoverage.java    |   3 +-
 .../sis/coverage/grid/GridCoordinatesView.java     |   5 +-
 .../org/apache/sis/coverage/grid/GridCoverage.java |   2 +-
 .../apache/sis/coverage/grid/GridCoverage2D.java   |   3 +-
 .../apache/sis/coverage/grid/GridDerivation.java   |   3 +-
 .../org/apache/sis/coverage/grid/GridExtent.java   |  42 +--
 .../apache/sis/coverage/grid/GridExtentCRS.java    |   3 +-
 .../org/apache/sis/coverage/grid/GridGeometry.java |  31 +-
 .../apache/sis/coverage/grid/ImageRenderer.java    |   3 +-
 .../apache/sis/coverage/grid/PixelTranslation.java |  23 +-
 .../org/apache/sis/coverage/grid/package-info.java |   2 +-
 .../org/apache/sis/feature/AbstractAttribute.java  |   4 +-
 .../org/apache/sis/feature/AbstractFeature.java    |   7 +-
 .../org/apache/sis/feature/DefaultFeatureType.java |   2 +-
 .../org/apache/sis/feature/FeatureOperations.java  |   2 +-
 .../java/org/apache/sis/feature/LinkOperation.java |   3 +-
 .../sis/feature/builder/FeatureTypeBuilder.java    |   9 +-
 .../org/apache/sis/filter/AssociationValue.java    |   6 +-
 .../java/org/apache/sis/filter/BinaryFunction.java |   3 +-
 .../apache/sis/filter/BinaryGeometryFilter.java    |   3 +-
 .../org/apache/sis/filter/ComparisonFilter.java    |   3 +-
 .../org/apache/sis/filter/ConvertFunction.java     |   4 +-
 .../java/org/apache/sis/filter/DistanceFilter.java |   7 +-
 .../org/apache/sis/filter/IdentifierFilter.java    |   9 +-
 .../java/org/apache/sis/filter/LeafExpression.java |   3 +-
 .../java/org/apache/sis/filter/LikeFilter.java     |   7 +-
 .../java/org/apache/sis/filter/LogicalFilter.java  |   5 +-
 .../java/org/apache/sis/filter/Optimization.java   |   5 +-
 .../java/org/apache/sis/filter/PropertyValue.java  |   4 +-
 .../java/org/apache/sis/filter/UnaryFunction.java  |   3 +-
 .../java/org/apache/sis/image/BandSelectImage.java |   3 +-
 .../java/org/apache/sis/image/ComputedImage.java   |   2 +-
 .../java/org/apache/sis/image/ImageCombiner.java   |   5 +-
 .../java/org/apache/sis/image/PlanarImage.java     |  15 +-
 .../sis/image/PositionalConsistencyImage.java      |   3 +-
 .../org/apache/sis/image/SourceAlignedImage.java   |   3 +-
 .../main/java/org/apache/sis/image/TileCache.java  |   3 +-
 .../org/apache/sis/index/tree/PointTreeNode.java   |   2 +-
 .../org/apache/sis/index/tree/QuadTreeNode.java    |   4 +-
 .../internal/coverage/j2d/BatchComputedImage.java  |   4 +-
 .../internal/coverage/j2d/ColorModelFactory.java   |  31 +-
 .../sis/internal/coverage/j2d/ColorModelPatch.java | 121 -------
 .../internal/coverage/j2d/DeferredProperty.java    |   4 +-
 .../sis/internal/coverage/j2d/ImageUtilities.java  |   2 +-
 .../coverage/j2d/MultiBandsIndexColorModel.java    |  43 ++-
 .../sis/internal/coverage/j2d/TiledImage.java      |   4 +-
 .../sis/internal/coverage/j2d/package-info.java    |   2 +-
 .../sis/internal/feature/AttributeConvention.java  |  30 +-
 .../sis/internal/feature/GeometryFactories.java    |   3 +-
 .../sis/internal/feature/MovingFeatures.java       |   7 +-
 .../internal/feature/SpatialOperationContext.java  |   5 +-
 .../apache/sis/internal/feature/j2d/Factory.java   |   4 +-
 .../sis/internal/feature/j2d/PathBuilder.java      |   2 +-
 .../apache/sis/internal/feature/j2d/Wrapper.java   |   4 +-
 .../internal/feature/jts/PathIteratorAdapter.java  |   6 +-
 .../sis/internal/feature/jts/ShapeConverter.java   |   5 +-
 .../sis/internal/filter/GeometryConverter.java     |   3 +-
 .../java/org/apache/sis/internal/filter/Node.java  |   1 +
 .../sis/internal/filter/SortByComparator.java      |   2 +-
 .../internal/filter/sqlmm/GeometryConstructor.java |   7 +-
 .../sis/internal/filter/sqlmm/OneGeometry.java     |   7 +-
 .../apache/sis/internal/filter/sqlmm/Registry.java |   4 +-
 .../sis/internal/filter/sqlmm/ST_Transform.java    |   3 +-
 .../sis/internal/filter/sqlmm/TwoGeometries.java   |   7 +-
 .../internal/processing/image/TiledProcess.java    |   3 +-
 .../coverage/grid/BufferedGridCoverageTest.java    |   5 +-
 .../coverage/grid/ConvertedGridCoverageTest.java   |  10 +-
 .../sis/coverage/grid/GridCoverage2DTest.java      |   7 +-
 .../sis/coverage/grid/GridDerivationTest.java      |   8 +-
 .../apache/sis/coverage/grid/GridExtentTest.java   |   4 +-
 .../apache/sis/feature/AbstractOperationTest.java  |   4 +-
 .../sis/feature/CharacteristicTypeMapTest.java     |  15 +-
 .../org/apache/sis/feature/CustomAttribute.java    |   7 +-
 .../sis/feature/DefaultAssociationRoleTest.java    |  17 +-
 .../sis/feature/DefaultAttributeTypeTest.java      |   5 +-
 .../apache/sis/feature/DefaultFeatureTypeTest.java |   3 +-
 .../org/apache/sis/feature/FeatureFormatTest.java  |   7 +-
 .../apache/sis/feature/FeatureMemoryBenchmark.java |  11 +-
 .../apache/sis/feature/FeatureOperationsTest.java  |   7 +-
 .../org/apache/sis/feature/FeatureTestCase.java    |  20 +-
 .../org/apache/sis/feature/LinkOperationTest.java  |   6 +-
 .../apache/sis/feature/PropertySingletonTest.java  |   8 +-
 .../sis/feature/SingletonAssociationTest.java      |  15 +-
 .../sis/feature/StringJoinOperationTest.java       |   3 +-
 .../feature/builder/AttributeTypeBuilderTest.java  |  13 +-
 .../builder/CharacteristicTypeBuilderTest.java     |   6 +-
 .../feature/builder/FeatureTypeBuilderTest.java    |   4 +-
 .../org/apache/sis/filter/LogicalFilterTest.java   |   8 +-
 .../sis/internal/coverage/j2d/ColorizerTest.java   |   4 +-
 .../internal/feature/AttributeConventionTest.java  |  19 +-
 .../sis/internal/feature/GeometriesTestCase.java   |   8 +-
 .../apache/sis/internal/feature/jts/JTSTest.java   |   4 +-
 .../internal/filter/sqlmm/RegistryTestCase.java    |   6 +-
 core/sis-metadata/pom.xml                          |   5 +
 .../sis/internal/jaxb/IdentifierMapAdapter.java    |   8 +-
 .../sis/internal/jaxb/NonMarshalledAuthority.java  |   5 +-
 .../apache/sis/internal/jaxb/TypeRegistration.java |   7 +-
 .../internal/jaxb/metadata/replace/SensorType.java |   2 +-
 .../apache/sis/internal/metadata/ExcludedSet.java  |   2 -
 .../apache/sis/internal/metadata/NameMeaning.java  |  27 +-
 .../sis/internal/metadata/RecordSchemaSIS.java     |   5 +-
 .../internal/metadata/TransformationAccuracy.java  |   6 +-
 .../sis/internal/xml/StreamWriterDelegate.java     |   2 +-
 .../java/org/apache/sis/metadata/TreeNode.java     |   4 +-
 .../iso/DefaultExtendedElementInformation.java     |  16 +-
 .../apache/sis/metadata/iso/DefaultMetadata.java   |  50 +--
 .../sis/metadata/iso/citation/DefaultCitation.java |   6 +-
 .../sis/metadata/iso/citation/DefaultContact.java  |  12 +-
 .../iso/citation/DefaultResponsibleParty.java      |  16 +-
 .../metadata/iso/citation/DefaultTelephone.java    |  10 +-
 .../iso/constraint/DefaultReleasability.java       |  26 +-
 .../sis/metadata/iso/constraint/package-info.java  |   2 +-
 .../iso/content/DefaultCoverageDescription.java    |   8 +-
 .../DefaultFeatureCatalogueDescription.java        |   8 +-
 .../iso/content/DefaultRangeDimension.java         |   4 +-
 .../metadata/iso/distribution/DefaultDataFile.java |   6 +-
 .../DefaultDigitalTransferOptions.java             |   4 +-
 .../metadata/iso/distribution/DefaultFormat.java   |  12 +-
 .../metadata/iso/distribution/DefaultMedium.java   |   4 +-
 .../distribution/DefaultStandardOrderProcess.java  |  24 --
 .../iso/identification/AbstractIdentification.java |   4 +-
 .../DefaultAggregateInformation.java               |   8 +-
 .../identification/DefaultDataIdentification.java  |   8 +-
 .../metadata/iso/lineage/DefaultProcessStep.java   |   4 +-
 .../sis/metadata/iso/lineage/DefaultSource.java    |   8 +-
 .../maintenance/DefaultMaintenanceInformation.java |  12 +-
 .../sis/metadata/iso/quality/AbstractElement.java  |  28 +-
 .../iso/quality/AbstractTemporalAccuracy.java      |   2 +-
 .../iso/quality/DefaultCoverageResult.java         |   6 +-
 .../metadata/iso/quality/DefaultDataQuality.java   |   6 +-
 .../DefaultNonQuantitativeAttributeAccuracy.java   |   2 +-
 .../iso/quality/DefaultQuantitativeResult.java     |   6 +-
 .../sis/metadata/iso/quality/DefaultScope.java     |   2 +-
 .../sis/metadata/iso/quality/DefaultUsability.java |   2 +-
 .../apache/sis/metadata/sql/MetadataWriter.java    |   5 +-
 .../org/apache/sis/util/iso/DefaultLocalName.java  |   3 +-
 .../apache/sis/util/iso/DefaultNameFactory.java    |   2 +-
 .../org/apache/sis/util/iso/DefaultRecord.java     |   3 +-
 .../org/apache/sis/util/iso/DefaultRecordType.java |   2 +-
 .../org/apache/sis/util/iso/DefaultTypeName.java   |  17 +-
 .../main/java/org/apache/sis/util/iso/Names.java   |   4 +-
 .../java/org/apache/sis/util/iso/package-info.java |   2 +-
 .../java/org/apache/sis/xml/Implementation.java    |  55 +---
 .../java/org/apache/sis/xml/MarshalContext.java    |   2 +-
 .../java/org/apache/sis/xml/MarshallerPool.java    |   4 +-
 .../main/java/org/apache/sis/xml/Namespaces.java   |  71 ++--
 .../src/main/java/org/apache/sis/xml/Pooled.java   |  50 +--
 .../java/org/apache/sis/xml/PooledTemplate.java    |   7 +-
 .../main/java/org/apache/sis/xml/Transformer.java  |  19 +-
 .../org/apache/sis/xml/TransformingReader.java     |   6 +-
 .../org/apache/sis/xml/TransformingWriter.java     |  11 +-
 .../src/main/java/org/apache/sis/xml/XML.java      |  15 +-
 .../main/java/org/apache/sis/xml/package-info.java |   2 +-
 .../internal/jaxb/cat/CodeListMarshallingTest.java |   8 +-
 .../sis/internal/jaxb/cat/EnumMarshallingTest.java |   4 +-
 .../sis/internal/jaxb/gco/MultiplicityTest.java    |   4 +-
 .../metadata/ImplementationHelperTest.java         |   5 +-
 .../apache/sis/internal/metadata/MergerTest.java   |  17 +-
 .../java/org/apache/sis/metadata/HashCodeTest.java |   8 +-
 .../apache/sis/metadata/InformationMapTest.java    |   6 +-
 .../apache/sis/metadata/MetadataStandardTest.java  |   5 +-
 .../sis/metadata/ModifiableMetadataTest.java       |   8 +-
 .../apache/sis/metadata/PropertyAccessorTest.java  |  11 +-
 .../java/org/apache/sis/metadata/PrunerTest.java   |  12 +-
 .../java/org/apache/sis/metadata/TreeNodeTest.java |  10 +-
 .../apache/sis/metadata/TreeTableFormatTest.java   |  19 +-
 .../java/org/apache/sis/metadata/ValueMapTest.java |  64 ++--
 .../sis/metadata/iso/CustomMetadataTest.java       |   4 +-
 .../sis/metadata/iso/citation/CitationsTest.java   |   3 +-
 .../metadata/iso/citation/DefaultCitationTest.java |  24 +-
 .../metadata/iso/citation/DefaultContactTest.java  |   8 +-
 .../iso/citation/DefaultResponsibilityTest.java    |   6 +-
 .../constraint/DefaultLegalConstraintsTest.java    |   4 +-
 .../sis/metadata/iso/extent/DefaultExtentTest.java |   4 +-
 .../identification/DefaultBrowseGraphicTest.java   |   7 +-
 .../identification/DefaultCoupledResourceTest.java |  12 +-
 .../DefaultDataIdentificationTest.java             |  16 +-
 .../DefaultServiceIdentificationTest.java          |  10 +-
 .../metadata/iso/quality/AbstractElementTest.java  |   4 +-
 .../iso/quality/DefaultDomainConsistencyTest.java  |   7 +-
 .../iso/quality/DefaultQuantitativeResultTest.java |  11 +-
 .../sis/metadata/sql/MetadataFallbackVerifier.java |   4 +-
 .../sis/metadata/sql/MetadataSourceTest.java       |   3 +-
 .../sis/metadata/sql/MetadataWriterTest.java       |   4 +-
 .../java/org/apache/sis/test/MetadataAssert.java   |   3 +-
 .../org/apache/sis/test/mock/MetadataMock.java     |   4 +-
 .../apache/sis/test/xml/DocumentComparator.java    |  26 +-
 .../apache/sis/util/iso/DefaultRecordTypeTest.java |   4 +-
 .../apache/sis/util/iso/DefaultScopedNameTest.java |   7 +-
 .../apache/sis/util/iso/NameMarshallingTest.java   |   4 +-
 .../java/org/apache/sis/util/iso/TypesTest.java    |   3 +-
 .../org/apache/sis/xml/MarshallerPoolTest.java     |   4 -
 .../apache/sis/xml/TransformingNamespacesTest.java |   9 +-
 .../org/apache/sis/xml/XLinkMarshallingTest.java   |   6 +-
 .../coverage/MultiResolutionCoverageLoader.java    |   5 +-
 .../main/java/org/apache/sis/portrayal/Canvas.java |   2 +-
 .../MultiResolutionCoverageLoaderTest.java         |  13 +-
 core/sis-referencing-by-identifiers/pom.xml        |   5 +
 .../referencing/gazetteer/FinalLocationType.java   |   8 +-
 .../referencing/gazetteer/GazetteerFactory.java    |   4 +-
 .../gazetteer/MilitaryGridReferenceSystem.java     |   3 +-
 .../referencing/gazetteer/LocationTypeTest.java    |   4 +-
 core/sis-referencing/pom.xml                       |   5 +
 .../org/apache/sis/geometry/CoordinateFormat.java  |   3 +-
 .../java/org/apache/sis/geometry/Envelopes.java    |   2 +-
 .../apache/sis/geometry/WraparoundAdjustment.java  |   6 +-
 .../referencing/CC_GeneralOperationParameter.java  |   5 +-
 .../jaxb/referencing/CC_OperationMethod.java       |   5 +-
 .../referencing/CC_OperationParameterGroup.java    |   2 +-
 .../sis/internal/referencing/AxisDirections.java   |  22 +-
 .../internal/referencing/CoordinateOperations.java |  11 +-
 .../referencing/GeodeticObjectBuilder.java         |   8 +-
 .../apache/sis/internal/referencing/Legacy.java    |  10 +-
 .../referencing/PositionalAccuracyConstant.java    |   4 +-
 .../internal/referencing/ReferencingUtilities.java |   4 +-
 .../internal/referencing/j2d/TileOrganizer.java    |   2 +-
 .../sis/internal/referencing/provider/Affine.java  |   8 +-
 .../provider/DatumShiftGridCompressed.java         |   4 +-
 .../referencing/provider/DatumShiftGridFile.java   |   2 +-
 .../provider/FranceGeocentricInterpolation.java    |   6 +-
 .../referencing/provider/GeodeticOperation.java    |   2 +-
 .../referencing/provider/MapProjection.java        |   4 +-
 .../referencing/provider/MapProjection3D.java      |   6 +-
 .../internal/referencing/provider/Molodensky.java  |   3 +-
 .../sis/internal/referencing/provider/NTv2.java    |   2 +-
 .../provider/PolarStereographicNorth.java          |   3 +-
 .../main/java/org/apache/sis/io/wkt/Element.java   |   5 +-
 .../main/java/org/apache/sis/io/wkt/Formatter.java |   5 +-
 .../apache/sis/io/wkt/GeodeticObjectParser.java    |   8 +-
 .../org/apache/sis/io/wkt/MathTransformParser.java |   3 +-
 .../org/apache/sis/io/wkt/SingletonElement.java    |   2 +-
 .../java/org/apache/sis/io/wkt/Transliterator.java |  23 +-
 .../java/org/apache/sis/io/wkt/VerticalInfo.java   |   3 +-
 .../java/org/apache/sis/io/wkt/WKTDictionary.java  |  12 +-
 .../main/java/org/apache/sis/io/wkt/WKTFormat.java |   3 +-
 .../parameter/DefaultParameterDescriptorGroup.java |  13 +-
 .../sis/parameter/DefaultParameterValueGroup.java  |   3 +-
 .../sis/parameter/MapProjectionParameters.java     |  13 +-
 .../org/apache/sis/parameter/ParameterFormat.java  |   3 +-
 .../org/apache/sis/parameter/TensorParameters.java |   5 +-
 .../sis/referencing/AbstractIdentifiedObject.java  |   2 +-
 .../java/org/apache/sis/referencing/Builder.java   |   4 +-
 .../main/java/org/apache/sis/referencing/CRS.java  |  29 +-
 .../java/org/apache/sis/referencing/CommonCRS.java |   5 +-
 .../sis/referencing/EPSGFactoryFallback.java       |   3 +-
 .../sis/referencing/crs/DefaultCompoundCRS.java    |  14 +-
 .../cs/DefaultCoordinateSystemAxis.java            |  27 +-
 .../org/apache/sis/referencing/cs/Normalizer.java  |   3 +-
 .../sis/referencing/datum/DatumShiftGrid.java      |   4 +-
 .../org/apache/sis/referencing/datum/formulas.html |   2 +-
 .../referencing/factory/AuthorityFactoryProxy.java |  31 +-
 .../sis/referencing/factory/CacheRecord.java       |   2 +-
 .../factory/CommonAuthorityFactory.java            |   4 +-
 .../factory/GeodeticAuthorityFactory.java          |   5 +-
 .../referencing/factory/GeodeticObjectFactory.java |  12 +-
 .../factory/IdentifiedObjectFinder.java            |   5 +-
 .../referencing/factory/IdentifiedObjectSet.java   |   2 +-
 .../factory/MultiAuthoritiesFactory.java           |   6 +-
 .../referencing/factory/sql/EPSGCodeFinder.java    |  15 +-
 .../referencing/factory/sql/EPSGDataAccess.java    |  13 +-
 .../sis/referencing/factory/sql/EPSGFactory.java   |   5 +-
 .../factory/sql/InstallationScriptProvider.java    |   3 +-
 .../operation/AbstractCoordinateOperation.java     |   5 +-
 .../operation/AbstractSingleOperation.java         |   2 +-
 .../operation/CoordinateOperationFinder.java       |   2 +-
 .../operation/CoordinateOperationRegistry.java     |   5 +-
 .../operation/DefaultConcatenatedOperation.java    |  10 +-
 .../DefaultCoordinateOperationFactory.java         |  14 +-
 .../operation/DefaultOperationMethod.java          |  20 +-
 .../operation/InverseOperationMethod.java          |   2 +-
 .../operation/builder/LinearTransformBuilder.java  |   2 +-
 .../operation/builder/ResidualGrid.java            |   5 +-
 .../sis/referencing/operation/matrix/Matrices.java |   2 +-
 .../transform/CoordinateSystemTransform.java       |   3 +-
 .../transform/DefaultMathTransformFactory.java     |  46 +--
 .../transform/EllipsoidToCentricTransform.java     |   5 +-
 .../operation/transform/MathTransformProvider.java |   2 +-
 .../operation/transform/MathTransforms.java        |   5 +-
 .../operation/transform/PoleRotation.java          |   6 +-
 .../transform/SpecializableTransform.java          |   7 +-
 .../referencing/operation/transform/formulas.html  |   2 +-
 .../operation/transform/package-info.java          |   2 +-
 .../org/apache/sis/referencing/package-info.java   |   2 +-
 .../org/apache/sis/geometry/EnvelopesTest.java     |   4 +-
 .../CC_OperationParameterGroupTest.java            |   9 +-
 .../sis/internal/jaxb/referencing/CodeTest.java    |   6 +-
 .../referencing/SecondDefiningParameterTest.java   |  16 +-
 .../referencing/EllipsoidalHeightCombinerTest.java |   7 +-
 .../sis/internal/referencing/FormulasTest.java     |   7 +-
 .../sis/internal/referencing/WKTKeywordsTest.java  |   5 +-
 .../sis/io/wkt/GeodeticObjectParserTest.java       |   4 +-
 .../org/apache/sis/io/wkt/WKTDictionaryTest.java   |  12 +-
 .../java/org/apache/sis/io/wkt/WKTFormatTest.java  |   7 +-
 .../DefaultParameterDescriptorGroupTest.java       |   9 +-
 .../parameter/DefaultParameterValueGroupTest.java  |  16 +-
 .../sis/parameter/DefaultParameterValueTest.java   |   4 +-
 .../sis/parameter/MapProjectionParametersTest.java |   3 +-
 .../apache/sis/parameter/ParameterFormatTest.java  |   2 +-
 .../sis/parameter/ParameterMarshallingTest.java    |   7 +-
 .../org/apache/sis/parameter/ParametersTest.java   |   6 +-
 .../apache/sis/parameter/TensorParametersTest.java |   3 +-
 .../org/apache/sis/parameter/TensorValuesTest.java |  10 +-
 .../referencing/AbstractIdentifiedObjectTest.java  |  11 +-
 .../sis/referencing/EPSGFactoryFallbackTest.java   |  24 +-
 .../sis/referencing/crs/AbstractCRSTest.java       |  10 +-
 .../referencing/crs/DefaultCompoundCRSTest.java    |  23 +-
 .../sis/referencing/crs/DefaultDerivedCRSTest.java |   4 +-
 .../referencing/crs/DefaultEngineeringCRSTest.java |  10 +-
 .../sis/referencing/crs/DefaultImageCRSTest.java   |  10 +-
 .../referencing/crs/DefaultTemporalCRSTest.java    |   6 +-
 .../apache/sis/referencing/crs/HardCodedCRS.java   |  11 +-
 .../apache/sis/referencing/cs/AbstractCSTest.java  |  18 +-
 .../sis/referencing/cs/CoordinateSystemsTest.java  |  16 +-
 .../sis/referencing/cs/DefaultCartesianCSTest.java |   9 +-
 .../sis/referencing/cs/DefaultCompoundCSTest.java  |   5 +-
 .../cs/DefaultCoordinateSystemAxisTest.java        |   4 +-
 .../referencing/cs/DefaultCylindricalCSTest.java   |   4 +-
 .../sis/referencing/cs/DefaultPolarCSTest.java     |   4 +-
 .../sis/referencing/cs/DefaultSphericalCSTest.java |   4 +-
 .../org/apache/sis/referencing/cs/HardCodedCS.java |  31 +-
 .../apache/sis/referencing/cs/NormalizerTest.java  |   8 +-
 .../datum/DefaultPrimeMeridianTest.java            |   5 +-
 .../datum/DefaultVerticalDatumTest.java            |  11 +-
 .../factory/CommonAuthorityFactoryTest.java        |  18 +-
 .../factory/IdentifiedObjectFinderTest.java        |   4 +-
 .../factory/MultiAuthoritiesFactoryTest.java       |  30 +-
 .../factory/sql/epsg/DataScriptFormatter.java      |   3 +-
 .../operation/CoordinateOperationFinderTest.java   |  11 +-
 .../DefaultConcatenatedOperationTest.java          |  12 +-
 .../operation/DefaultConversionTest.java           |  13 +-
 .../operation/HardCodedConversions.java            |  12 +-
 .../builder/LinearTransformBuilderTest.java        |   7 +-
 .../sis/referencing/operation/projection/NoOp.java |   6 +-
 .../projection/SatelliteTrackingTest.java          |   4 +-
 .../operation/transform/CoordinateDomain.java      |   2 +-
 .../transform/DefaultMathTransformFactoryTest.java |   3 +-
 .../transform/MathTransformFactoryBase.java        |   3 +-
 .../transform/MathTransformFactoryMock.java        |   3 +-
 .../transform/OperationMethodSetTest.java          |  10 +-
 .../operation/transform/SinusoidalShiftGrid.java   |   4 +-
 .../transform/WraparoundTransformTest.java         |  10 +-
 .../report/CoordinateOperationMethods.java         |   2 +-
 .../sis/test/integration/ConsistencyTest.java      |   7 +-
 .../apache/sis/test/integration/MetadataTest.java  |  90 +++--
 core/sis-utility/pom.xml                           |  16 -
 .../sis/internal/converter/SystemRegistry.java     |   7 +-
 .../sis/internal/converter/package-info.java       |   7 +-
 .../sis/internal/{jdk9 => jdk17}/HexFormat.java    |   2 +-
 .../java/org/apache/sis/internal/jdk17/JDK17.java  |  72 ++++
 .../sis/internal/{jdk9 => jdk17}/package-info.java |   6 +-
 .../java/org/apache/sis/internal/jdk9/JDK9.java    | 366 ---------------------
 .../sis/internal/system/DefaultFactories.java      |  76 +++--
 .../apache/sis/internal/system/SystemListener.java |   3 +-
 .../apache/sis/internal/system/package-info.java   |   2 +-
 .../java/org/apache/sis/internal/util/Cloner.java  |   8 +-
 .../apache/sis/internal/util/CollectionsExt.java   | 232 ++++---------
 .../apache/sis/internal/util/DefinitionURI.java    |  13 +-
 .../apache/sis/internal/util/FinalFieldSetter.java |   6 +-
 .../org/apache/sis/internal/util/Numerics.java     |  16 +-
 .../org/apache/sis/internal/util/package-info.java |   2 +-
 .../main/java/org/apache/sis/math/ArrayVector.java |  13 +-
 .../main/java/org/apache/sis/math/Fraction.java    |  17 +-
 .../org/apache/sis/math/LinearlyDerivedVector.java |   8 +-
 .../java/org/apache/sis/math/MathFunctions.java    |   2 +-
 .../java/org/apache/sis/math/SequenceVector.java   |   5 +-
 .../java/org/apache/sis/math/StatisticsFormat.java |   2 +-
 .../src/main/java/org/apache/sis/math/Vector.java  |  41 +--
 .../org/apache/sis/measure/AbstractConverter.java  |   3 +-
 .../java/org/apache/sis/measure/UnitDimension.java |  23 +-
 .../java/org/apache/sis/measure/UnitFormat.java    |  10 +-
 .../src/main/java/org/apache/sis/setup/About.java  |   3 +-
 .../java/org/apache/sis/setup/GeometryLibrary.java |   2 -
 .../main/java/org/apache/sis/setup/OptionKey.java  |   2 +-
 .../apache/sis/setup/OptionalInstallations.java    |   3 +-
 .../java/org/apache/sis/util/CharSequences.java    |   4 +-
 .../src/main/java/org/apache/sis/util/Classes.java |   4 +-
 .../sis/util/DefaultInternationalString.java       |  10 +-
 .../src/main/java/org/apache/sis/util/Locales.java |   2 +-
 .../sis/util/collection/BackingStoreException.java |   2 +-
 .../sis/util/collection/DefaultTreeTable.java      |  20 +-
 .../sis/util/collection/FrequencySortedSet.java    |   3 +-
 .../apache/sis/util/collection/IntegerList.java    |   9 +-
 .../apache/sis/util/collection/TableColumn.java    |   3 +-
 .../sis/util/collection/TreeTableFormat.java       |   4 +-
 .../java/org/apache/sis/util/logging/Logging.java  |  86 ++---
 .../apache/sis/util/logging/PerformanceLevel.java  |   8 +-
 .../org/apache/sis/util/logging/package-info.java  |   2 +-
 .../java/org/apache/sis/util/resources/Loader.java |   3 +-
 .../apache/sis/internal/util/AbstractMapTest.java  |   3 +-
 .../sis/internal/util/CheckedArrayListTest.java    |   6 +-
 .../sis/internal/util/CollectionsExtTest.java      |  27 +-
 .../org/apache/sis/internal/util/NumericsTest.java |  35 +-
 .../org/apache/sis/measure/SystemUnitTest.java     |   9 +-
 .../org/apache/sis/measure/UnitDimensionTest.java  |   3 +-
 .../org/apache/sis/measure/UnitServicesTest.java   |   4 +-
 .../org/apache/sis/test/ProjectDirectories.java    |   3 +-
 .../test/java/org/apache/sis/test/TestRunner.java  |   3 +-
 .../org/apache/sis/util/collection/CacheTest.java  |  10 +-
 .../sis/util/collection/CodeListSetTest.java       |   2 +-
 .../apache/sis/util/collection/DerivedSetTest.java |  10 +-
 .../util/collection/FrequencySortedSetTest.java    |   3 +-
 .../sis/util/collection/IntegerListTest.java       |   5 +-
 .../apache/sis/util/collection/LargeCodeList.java  |   2 +-
 ide-project/NetBeans/nbproject/build-impl.xml      |  25 +-
 ide-project/NetBeans/nbproject/genfiles.properties |   6 +-
 ide-project/NetBeans/nbproject/project.properties  |  17 +-
 ide-project/NetBeans/nbproject/project.xml         |   1 -
 pom.xml                                            |  28 +-
 .../profile/fra/DirectReferenceSystemTest.java     |   6 +-
 .../apache/sis/internal/earth/netcdf/GCOM_C.java   |  33 +-
 .../apache/sis/internal/earth/netcdf/GCOM_W.java   |  32 +-
 src/main/javadoc/overview.html                     |   2 +-
 storage/pom.xml                                    |   5 +
 .../storage/inflater/CompressionChannel.java       |   3 +-
 .../internal/storage/inflater/CopyFromBytes.java   |   8 +-
 .../storage/inflater/HorizontalPredictor.java      |   4 +-
 .../storage/inflater/PredictorChannel.java         |   4 +-
 .../apache/sis/internal/storage/inflater/ZIP.java  |  31 +-
 .../internal/storage/inflater/package-info.java    |   2 +-
 .../org/apache/sis/storage/geotiff/CRSBuilder.java |   7 +-
 .../sis/storage/geotiff/CompressedSubset.java      |   2 +-
 .../org/apache/sis/storage/geotiff/DataSubset.java |   2 +-
 .../apache/sis/storage/geotiff/Localization.java   |   2 +-
 .../sis/storage/geotiff/MultiResolutionImage.java  |   2 +-
 .../sis/storage/geotiff/ReversedBitsChannel.java   |   2 +-
 .../apache/sis/storage/geotiff/XMLMetadata.java    |   4 +-
 .../java/org/apache/sis/internal/netcdf/Axis.java  |   2 +-
 .../org/apache/sis/internal/netcdf/CRSBuilder.java |   3 +-
 .../org/apache/sis/internal/netcdf/Convention.java |   5 +-
 .../org/apache/sis/internal/netcdf/FeatureSet.java |   2 +-
 .../apache/sis/internal/netcdf/GridMapping.java    |   3 +-
 .../apache/sis/internal/netcdf/RasterResource.java |   5 +-
 .../org/apache/sis/internal/netcdf/Variable.java   |   2 +-
 .../sis/internal/netcdf/impl/ChannelDecoder.java   |  10 +-
 .../sis/internal/netcdf/impl/VariableInfo.java     |   3 +-
 .../sis/internal/netcdf/ucar/DecoderWrapper.java   |   6 +-
 .../sis/internal/netcdf/ucar/VariableWrapper.java  |   4 +-
 .../apache/sis/storage/netcdf/MetadataReader.java  |  16 +-
 .../org/apache/sis/storage/netcdf/NetcdfStore.java |   2 +-
 storage/sis-sqlstore/pom.xml                       |   5 +
 .../apache/sis/internal/sql/feature/Analyzer.java  |   3 +-
 .../sis/internal/sql/feature/BinaryEncoding.java   |   2 +-
 .../apache/sis/internal/sql/feature/Database.java  |   4 +-
 .../sis/internal/sql/feature/PrimaryKey.java       |   5 +-
 .../sis/internal/sql/feature/QueryAnalyzer.java    |   2 +-
 .../sis/internal/sql/feature/TableAnalyzer.java    |   2 +-
 .../sis/internal/sql/postgis/RasterReader.java     |   3 +-
 .../apache/sis/storage/sql/ResourceDefinition.java |   6 +-
 .../sis/internal/storage/StoreUtilities.java       |   3 +-
 .../sis/internal/storage/TiledGridCoverage.java    |   2 +-
 .../org/apache/sis/internal/storage/csv/Store.java |   5 +-
 .../sis/internal/storage/esri/CharactersView.java  |   6 +-
 .../sis/internal/storage/esri/RawRasterReader.java |   2 +-
 .../apache/sis/internal/storage/folder/Store.java  |   5 +-
 .../apache/sis/internal/storage/io/ByteWriter.java |   5 +-
 .../sis/internal/storage/io/ChannelFactory.java    |   3 +-
 .../sis/internal/storage/wkt/FirstKeywordPeek.java |   2 +-
 .../sis/internal/storage/xml/AbstractProvider.java |  45 ++-
 .../org/apache/sis/internal/storage/xml/Store.java |   3 +-
 .../sis/internal/storage/xml/StoreProvider.java    |  19 +-
 .../sis/internal/storage/xml/package-info.java     |   2 +-
 .../sis/storage/AbstractGridCoverageResource.java  |   3 +-
 .../java/org/apache/sis/storage/FeatureNaming.java |   6 +-
 .../apache/sis/storage/GridCoverageResource.java   |   5 +-
 .../org/apache/sis/storage/StorageConnector.java   |   7 +-
 .../storage/aggregate/AggregatedFeatureSet.java    |   4 +-
 .../aggregate/ConcatenatedGridResource.java        |   3 +-
 .../sis/storage/aggregate/GroupBySample.java       |   2 +-
 .../sis/storage/aggregate/JoinFeatureSet.java      |  13 +-
 .../apache/sis/storage/event/StoreListeners.java   |  53 +--
 .../org/apache/sis/storage/event/package-info.java |   2 +-
 .../sis/internal/storage/MetadataBuilderTest.java  |   7 +-
 .../apache/sis/internal/storage/csv/StoreTest.java |  26 +-
 .../sis/internal/storage/folder/StoreTest.java     |   6 +-
 .../internal/storage/xml/MimeTypeDetectorTest.java |  11 +-
 .../org/apache/sis/storage/GridResourceMock.java   |   3 +-
 .../aggregate/ConcatenatedFeatureSetTest.java      |  17 +-
 .../sis/storage/aggregate/JoinFeatureSetTest.java  |   6 +-
 .../sis/test/storage/CoverageReadConsistency.java  |   2 +-
 .../apache/sis/internal/storage/gpx/Copyright.java |   4 +-
 .../storage/gpx/GroupAsPolylineOperation.java      |   6 +-
 .../apache/sis/internal/storage/gpx/Metadata.java  |   2 +-
 .../org/apache/sis/internal/storage/gpx/Store.java |   2 +-
 .../sis/internal/storage/gpx/StoreProvider.java    |  11 +-
 .../org/apache/sis/internal/storage/gpx/Types.java |   7 +-
 .../sis/internal/storage/gpx/WritableStore.java    |   2 +-
 .../sis/internal/storage/gpx/package-info.java     |   2 +-
 .../storage/xml/stream/FormattedWriter.java        |   6 +-
 .../storage/xml/stream/StaxDataStoreProvider.java  |  12 +-
 .../internal/storage/xml/stream/package-info.java  |   2 +-
 .../sis/internal/storage/gpx/MetadataTest.java     |  10 +-
 .../sis/internal/storage/gpx/UpdaterTest.java      |   6 +-
 .../sis/internal/storage/gpx/WriterTest.java       |  31 +-
 532 files changed, 2084 insertions(+), 3209 deletions(-)

diff --cc application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageExplorer.java
index 508305767e,d4bcfba71c..9a8b168400
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageExplorer.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageExplorer.java
@@@ -68,10 -68,10 +68,10 @@@ import org.apache.sis.gui.Widget
   *
   * <h2>Limitations</h2>
   * Current implementation is restricted to {@link GridCoverage} instances, but a future
 - * implementation may generalize to {@link org.opengis.coverage.Coverage} instances.
 + * implementation may generalize to {@code org.opengis.coverage.Coverage} instances.
   *
   * @author  Martin Desruisseaux (Geomatys)
-  * @version 1.3
+  * @version 1.4
   *
   * @see CoverageCanvas
   * @see GridView
diff --cc application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ExpandedFeature.java
index 64c8a59f87,26a78bc4ea..edec90fd8b
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ExpandedFeature.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ExpandedFeature.java
@@@ -19,9 -19,10 +19,11 @@@ package org.apache.sis.gui.dataset
  import java.util.Arrays;
  import java.util.Map;
  import java.util.Collection;
- import java.util.Collections;
+ import java.util.List;
 -import org.opengis.feature.Feature;
 -import org.opengis.feature.FeatureType;
 -import org.opengis.feature.Property;
++
++// Branch-dependent imports
 +import org.apache.sis.feature.AbstractFeature;
 +import org.apache.sis.feature.DefaultFeatureType;
  
  
  /**
diff --cc core/sis-feature/src/main/java/org/apache/sis/coverage/grid/BufferedGridCoverage.java
index e434b87630,07a0549ee3..a18028f358
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/BufferedGridCoverage.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/BufferedGridCoverage.java
@@@ -39,9 -39,8 +39,8 @@@ import org.apache.sis.util.collection.C
  import org.apache.sis.image.DataType;
  
  // Branch-specific imports
- import org.apache.sis.internal.jdk9.JDK9;
 -import org.opengis.coverage.CannotEvaluateException;
 -import org.opengis.coverage.PointOutsideCoverageException;
 +import org.apache.sis.coverage.CannotEvaluateException;
 +import org.apache.sis.coverage.PointOutsideCoverageException;
  
  
  /**
diff --cc core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoordinatesView.java
index 09e1193d49,92d67f4201..ad8f132b6d
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoordinatesView.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoordinatesView.java
@@@ -17,8 -17,9 +17,7 @@@
  package org.apache.sis.coverage.grid;
  
  import java.util.Arrays;
 -import org.opengis.coverage.grid.GridCoordinates;
 -import org.apache.sis.util.resources.Errors;
  import org.apache.sis.util.ArgumentChecks;
- import org.apache.sis.internal.jdk9.JDK9;
  
  
  /**
diff --cc core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAttribute.java
index 3f1c4397fb,45742cebb2..30bbeab54a
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAttribute.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/AbstractAttribute.java
@@@ -150,9 -156,9 +150,9 @@@ public abstract class AbstractAttribute
       */
      private void writeObject(final ObjectOutputStream out) throws IOException {
          out.defaultWriteObject();
 -        final Attribute<?>[] characterizedBy;
 +        final AbstractAttribute<?>[] characterizedBy;
          if (characteristics instanceof CharacteristicMap) {
-             characterizedBy = characteristics.values().toArray(new AbstractAttribute<?>[characteristics.size()]);
 -            characterizedBy = characteristics.values().toArray(Attribute[]::new);
++            characterizedBy = characteristics.values().toArray(AbstractAttribute[]::new);
          } else {
              characterizedBy = null;
          }
@@@ -351,13 -356,13 +351,13 @@@
       * This method does not store the new map in the {@link #characteristics} field;
       * it is caller responsibility to do so if desired.
       */
 -    private Map<String,Attribute<?>> newCharacteristicsMap() {
 +    private Map<String,AbstractAttribute<?>> newCharacteristicsMap() {
          if (type instanceof DefaultAttributeType<?>) {
 -            Map<String, AttributeType<?>> map = ((DefaultAttributeType<?>) type).characteristics();
 +            Map<String, DefaultAttributeType<?>> map = type.characteristics();
              if (!map.isEmpty()) {
                  if (!(map instanceof CharacteristicTypeMap)) {
 -                    final Collection<AttributeType<?>> types = map.values();
 -                    map = CharacteristicTypeMap.create(type, types.toArray(AttributeType<?>[]::new));
 +                    final Collection<DefaultAttributeType<?>> types = map.values();
-                     map = CharacteristicTypeMap.create(type, types.toArray(new DefaultAttributeType<?>[types.size()]));
++                    map = CharacteristicTypeMap.create(type, types.toArray(DefaultAttributeType<?>[]::new));
                  }
                  return new CharacteristicMap(this, (CharacteristicTypeMap) map);
              }
diff --cc core/sis-feature/src/main/java/org/apache/sis/feature/DefaultFeatureType.java
index fca73023b3,193da7f434..25d5c47511
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultFeatureType.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/DefaultFeatureType.java
@@@ -353,7 -353,7 +353,7 @@@ public class DefaultFeatureType extend
          assignableTo = new HashSet<>(4);
          assignableTo.add(super.getName());
          scanPropertiesFrom(this, properties);
-         allProperties = UnmodifiableArrayList.wrap(byName.values().toArray(new AbstractIdentifiedType[byName.size()]));
 -        allProperties = UnmodifiableArrayList.wrap(byName.values().toArray(PropertyType[]::new));
++        allProperties = UnmodifiableArrayList.wrap(byName.values().toArray(AbstractIdentifiedType[]::new));
          /*
           * Now check if the feature is simple/complex or dense/sparse. We perform this check after we finished
           * to create the list of all properties, because some properties may be overridden and we want to take
diff --cc core/sis-feature/src/main/java/org/apache/sis/feature/builder/FeatureTypeBuilder.java
index cb464a4653,98b969b62e..262a89b6f1
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/builder/FeatureTypeBuilder.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/builder/FeatureTypeBuilder.java
@@@ -412,8 -407,8 +411,8 @@@ public class FeatureTypeBuilder extend
       *
       * @see DefaultFeatureType#getSuperTypes()
       */
 -    public FeatureType[] getSuperTypes() {
 -        return superTypes.toArray(FeatureType[]::new);
 +    public DefaultFeatureType[] getSuperTypes() {
-         return superTypes.toArray(new DefaultFeatureType[superTypes.size()]);
++        return superTypes.toArray(DefaultFeatureType[]::new);
      }
  
      /**
@@@ -1015,7 -991,7 +1014,7 @@@
                  }
              }
              feature = new DefaultFeatureType(identification(), isAbstract(),
-                     superTypes.toArray(new DefaultFeatureType[superTypes.size()]),
 -                    superTypes.toArray(FeatureType[]::new),
++                    superTypes.toArray(DefaultFeatureType[]::new),
                      ArraysExt.resize(propertyTypes, propertyCursor));
          }
          return feature;
diff --cc core/sis-feature/src/main/java/org/apache/sis/filter/IdentifierFilter.java
index 23884bae02,83ee72bbfe..02dc5e2182
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/IdentifierFilter.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/IdentifierFilter.java
@@@ -21,8 -21,11 +21,9 @@@ import java.util.Collection
  import org.apache.sis.util.ArgumentChecks;
  import org.apache.sis.internal.feature.AttributeConvention;
  
+ // Branch-dependent imports
 -import org.opengis.feature.Feature;
 -import org.opengis.filter.Expression;
 -import org.opengis.filter.ResourceId;
++import org.apache.sis.feature.AbstractFeature;
+ 
  
  /**
   * Filter features using a set of predefined identifiers and discarding features
diff --cc core/sis-feature/src/main/java/org/apache/sis/filter/Optimization.java
index d7ff6e6d13,ffc8e17298..93048e4ea3
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/Optimization.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/Optimization.java
@@@ -423,9 -425,9 +422,9 @@@ public class Optimization 
       */
      private static <R> List<Filter<? super R>> toAndOperands(final Filter<R> filter) {
          if (filter == null) {
-             return Collections.emptyList();
+             return List.of();
          }
 -        final CodeList<?> type = filter.getOperatorType();
 +        final Enum<?> type = filter.getOperatorType();
          if (type == LogicalOperatorName.AND) {
              return ((LogicalOperator<R>) filter).getOperands();
          }
diff --cc core/sis-feature/src/main/java/org/apache/sis/internal/feature/AttributeConvention.java
index 50b461ab77,5062863567..36442c9c6f
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/AttributeConvention.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/AttributeConvention.java
@@@ -102,15 -106,15 +102,15 @@@ public final class AttributeConvention 
       * <p>The {@linkplain org.apache.sis.feature.DefaultAttributeType#getValueClass() value class} can be
       * the {@link com.esri.core.geometry.Geometry} class from ESRI's API, or the {@code Geometry} class from
       * <cite>Java Topology Suite</cite> (JTS) library, or any other class defined in future SIS versions.
 -     * See {@link #isGeometryAttribute(IdentifiedType)} for testing whether the value is a supported type.</p>
 +     * See {@code isGeometryAttribute(IdentifiedType)} for testing whether the value is a supported type.</p>
       *
 -     * @see #isGeometryAttribute(IdentifiedType)
 +     * @see #isGeometryAttribute(AbstractIdentifiedType)
       */
-     public static final ScopedName GEOMETRY_PROPERTY;
+     public static final ScopedName GEOMETRY_PROPERTY = Names.createScopedName(SCOPE, null, "geometry");
  
      /**
-      * Conventional name for fetching the envelope encompassing all geometries in a feature. Most {@code FeatureType}s
-      * have at most one geometry, which is also the {@link #GEOMETRY_PROPERTY default geometry}.
+      * Conventional name for fetching the envelope encompassing all geometries in a feature.
+      * Most {@code FeatureType}s have at most one geometry, which is also the {@link #GEOMETRY_PROPERTY default geometry}.
       * But if several geometries exist, then the value for this synthetic property is the union of all geometries.
       *
       * <p>Properties of this name are usually
@@@ -136,9 -140,9 +136,9 @@@
       * <p>The {@linkplain org.apache.sis.feature.DefaultAttributeType#getValueClass() value class} should be
       * {@link org.opengis.referencing.crs.CoordinateReferenceSystem}.</p>
       *
 -     * @see #getCRSCharacteristic(Property)
 +     * @see #getCRSCharacteristic(Object)
       */
-     public static final ScopedName CRS_CHARACTERISTIC;
+     public static final ScopedName CRS_CHARACTERISTIC = Names.createScopedName(SCOPE, null, "crs");
  
      /**
       * Conventional name for fetching the unit of measurement of a property.
@@@ -166,9 -170,9 +166,9 @@@
       * <p>The {@linkplain org.apache.sis.feature.DefaultAttributeType#getValueClass() value class} should be
       * {@link Integer}.</p>
       *
 -     * @see #getMaximalLengthCharacteristic(Property)
 +     * @see #getMaximalLengthCharacteristic(Object)
       */
-     public static final ScopedName MAXIMAL_LENGTH_CHARACTERISTIC;
+     public static final ScopedName MAXIMAL_LENGTH_CHARACTERISTIC = Names.createScopedName(SCOPE, null, "maximalLength");
  
      /**
       * Conventional name for fetching the enumeration of valid values.
diff --cc core/sis-feature/src/main/java/org/apache/sis/internal/feature/MovingFeatures.java
index 46f52afd4f,fec27f404f..8824c781f0
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/MovingFeatures.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/MovingFeatures.java
@@@ -54,11 -53,10 +52,10 @@@ public class MovingFeatures 
       * This characteristic uses the same name than {@code TIME_AS_INSTANTS}. Consequently, at most one
       * of {@code TIME_AS_INSTANTS} and {@code TIME_AS_NUMBERS} can be used on the same property.
       */
 -    private static final AttributeType<Number> TIME_AS_NUMBERS;
 +    private static final DefaultAttributeType<Number> TIME_AS_NUMBERS;
      static {
-         final LocalName scope = Names.createLocalName("OGC", null, "MF");
-         final Map<String,Object> properties = Collections.singletonMap(
-                 DefaultAttributeType.NAME_KEY, Names.createScopedName(scope, null, "datetimes"));
+         final var scope = Names.createLocalName("OGC", null, "MF");
+         final var properties = Map.of(DefaultAttributeType.NAME_KEY, Names.createScopedName(scope, null, "datetimes"));
          TIME_AS_INSTANTS = new DefaultAttributeType<>(properties, Instant.class, 0, Integer.MAX_VALUE, null);
          TIME_AS_NUMBERS  = new DefaultAttributeType<>(properties,  Number.class, 0, Integer.MAX_VALUE, null);
      }
diff --cc core/sis-feature/src/main/java/org/apache/sis/internal/filter/Node.java
index cd78942517,4fe8e0e1f7..944184c617
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/Node.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/Node.java
@@@ -84,9 -86,10 +84,10 @@@ public abstract class Node implements S
       *
       * @see Expression#getFunctionName()
       */
 -    protected static <T> AttributeType<T> createType(final Class<T> type, final Object name) {
 +    protected static <T> DefaultAttributeType<T> createType(final Class<T> type, final Object name) {
+         // We do not use `Map.of(…)` for letting the attribute type constructor do the null check.
          return new DefaultAttributeType<>(Collections.singletonMap(DefaultAttributeType.NAME_KEY, name),
 -                                          type, 1, 1, null, (AttributeType<?>[]) null);
 +                                          type, 1, 1, null, (DefaultAttributeType<?>[]) null);
      }
  
      /**
diff --cc core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/Registry.java
index 9202548677,397f181b00..163349e1bd
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/Registry.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/Registry.java
@@@ -20,10 -20,10 +20,10 @@@ import java.util.Arrays
  import java.util.Collection;
  import org.apache.sis.internal.feature.Geometries;
  import org.apache.sis.internal.filter.FunctionRegister;
- import org.apache.sis.internal.jdk9.JDK9;
+ import org.apache.sis.internal.jdk17.JDK17;
  
  // Branch-dependent imports
 -import org.opengis.filter.Expression;
 +import org.apache.sis.filter.Expression;
  
  
  /**
diff --cc core/sis-feature/src/test/java/org/apache/sis/feature/CharacteristicTypeMapTest.java
index d7ae539fe2,8246b7add6..e8e34acf50
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/CharacteristicTypeMapTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/CharacteristicTypeMapTest.java
@@@ -114,12 -116,12 +113,12 @@@ public final strictfp class Characteris
      @Test
      public void testQualifiedNames() {
          final DefaultAttributeType<?> a1, a2, a3, tp;
-         a1 = new DefaultAttributeType<>(singletonMap(NAME_KEY, Names.parseGenericName(null, null, "ns1:accuracy")), Float.class, 1, 1, 0.1f);
-         a2 = new DefaultAttributeType<>(singletonMap(NAME_KEY, Names.parseGenericName(null, null, "ns2:accuracy")), Float.class, 1, 1, 0.1f);
-         a3 = new DefaultAttributeType<>(singletonMap(NAME_KEY, Names.parseGenericName(null, null, "ns2:s3:units")), String.class, 1, 1, "°C");
-         tp = new DefaultAttributeType<>(singletonMap(NAME_KEY, "temperature"), Float.class, 1, 1, null, a1, a2, a3);
+         a1 = new DefaultAttributeType<>(Map.of(NAME_KEY, Names.parseGenericName(null, null, "ns1:accuracy")), Float.class, 1, 1, 0.1f);
+         a2 = new DefaultAttributeType<>(Map.of(NAME_KEY, Names.parseGenericName(null, null, "ns2:accuracy")), Float.class, 1, 1, 0.1f);
+         a3 = new DefaultAttributeType<>(Map.of(NAME_KEY, Names.parseGenericName(null, null, "ns2:s3:units")), String.class, 1, 1, "°C");
+         tp = new DefaultAttributeType<>(Map.of(NAME_KEY, "temperature"), Float.class, 1, 1, null, a1, a2, a3);
  
 -        final Map<String, AttributeType<?>> characteristics = tp.characteristics();
 +        final Map<String, DefaultAttributeType<?>> characteristics = tp.characteristics();
          assertSame("ns1:accuracy", a1, characteristics.get("ns1:accuracy"));
          assertSame("ns2:accuracy", a2, characteristics.get("ns2:accuracy"));
          assertSame("ns2:s3:units", a3, characteristics.get("ns2:s3:units"));
diff --cc core/sis-feature/src/test/java/org/apache/sis/feature/CustomAttribute.java
index ac8fa16a9b,d2fd163eb4..4b48808ac1
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/CustomAttribute.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/CustomAttribute.java
@@@ -23,8 -24,9 +24,6 @@@ import org.apache.sis.metadata.iso.qual
  import org.apache.sis.util.SimpleInternationalString;
  import org.apache.sis.referencing.NamedIdentifier;
  
- import static java.util.Collections.singleton;
 -// Branch-dependent imports
 -import org.opengis.feature.AttributeType;
--
  
  /**
   * For testing {@link AbstractAttribute} customization.
diff --cc core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java
index 9cb66a9ce6,614b81cfe0..1491a6be2d
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java
@@@ -83,10 -86,10 +82,10 @@@ public final strictfp class DefaultAsso
       * @return the feature type to use for testing purpose.
       */
      private static DefaultFeatureType createType(final Object name,
 -            final FeatureType parent, final FeatureAssociationRole... property)
 +            final DefaultFeatureType parent, final DefaultAssociationRole... property)
      {
-         return new DefaultFeatureType(singletonMap(NAME_KEY, name),
+         return new DefaultFeatureType(Map.of(NAME_KEY, name),
 -                false, new FeatureType[] {parent}, property);
 +                false, new DefaultFeatureType[] {parent}, property);
      }
  
      /**
diff --cc core/sis-feature/src/test/java/org/apache/sis/feature/DefaultFeatureTypeTest.java
index 362a8cde02,ccd058b601..33335b48e4
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultFeatureTypeTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultFeatureTypeTest.java
@@@ -30,8 -30,11 +30,7 @@@ import org.junit.Test
  
  import static org.apache.sis.test.Assert.*;
  import static org.apache.sis.test.TestUtilities.getSingleton;
- import static java.util.Collections.singletonMap;
  
 -// Branch-dependent imports
 -import org.opengis.feature.PropertyType;
 -import org.opengis.feature.AttributeType;
 -
  
  /**
   * Tests {@link DefaultFeatureType}.
diff --cc core/sis-feature/src/test/java/org/apache/sis/feature/FeatureMemoryBenchmark.java
index e420655a40,3112dd90a1..6d65371eb7
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureMemoryBenchmark.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureMemoryBenchmark.java
@@@ -19,11 -19,11 +19,10 @@@ package org.apache.sis.feature
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.List;
+ import java.util.Map;
  import java.util.Random;
 -import org.opengis.feature.Feature;
  import org.apache.sis.internal.util.StandardDateFormat;
  
- import static java.util.Collections.singletonMap;
- 
  
  /**
   * Compares {@link org.apache.sis.feature} memory usage with a plain {@link HashMap}.
diff --cc core/sis-feature/src/test/java/org/apache/sis/feature/builder/FeatureTypeBuilderTest.java
index 3226c00e59,a6a8b8b5bf..ebc2600cff
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/builder/FeatureTypeBuilderTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/builder/FeatureTypeBuilderTest.java
@@@ -368,15 -370,15 +368,15 @@@ public final strictfp class FeatureType
      @Test
      public void testOverrideByOperation() {
          FeatureTypeBuilder builder = new FeatureTypeBuilder().setName("Parent").setAbstract(true);
 -        final AttributeType<Integer> pa = builder.addAttribute(Integer.class).setName("A").build();
 +        final DefaultAttributeType<Integer> pa = builder.addAttribute(Integer.class).setName("A").build();
          builder.addAttribute(Integer.class).setName("B");
 -        final FeatureType parentType = builder.build();
 +        final DefaultFeatureType parentType = builder.build();
  
          builder = new FeatureTypeBuilder().setName("Child").setSuperTypes(parentType);
-         builder.addProperty(FeatureOperations.link(Collections.singletonMap(AbstractOperation.NAME_KEY, "B"), pa));
+         builder.addProperty(FeatureOperations.link(Map.of(AbstractOperation.NAME_KEY, "B"), pa));
 -        final FeatureType childType = builder.build();
 +        final DefaultFeatureType childType = builder.build();
  
 -        final Iterator<? extends PropertyType> it = childType.getProperties(true).iterator();
 +        final Iterator<? extends AbstractIdentifiedType> it = childType.getProperties(true).iterator();
          assertPropertyEquals("A", Integer.class, it.next());
          assertPropertyEquals("B", Integer.class, it.next());
          assertFalse(it.hasNext());
diff --cc core/sis-feature/src/test/java/org/apache/sis/filter/LogicalFilterTest.java
index 673d92052f,7faabe4268..9776c0b849
--- a/core/sis-feature/src/test/java/org/apache/sis/filter/LogicalFilterTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/filter/LogicalFilterTest.java
@@@ -139,7 -143,7 +139,7 @@@ public final strictfp class LogicalFilt
          assertEquals(expected, filter.test(null));
          assertSerializedEquals(filter);
  
-         filter = (LogicalOperator<AbstractFeature>) anyArity.apply(Arrays.asList(f1, f2, f1));
 -        filter = anyArity.apply(List.of(f1, f2, f1));
++        filter = (LogicalOperator<AbstractFeature>) anyArity.apply(List.of(f1, f2, f1));
          assertArrayEquals(new Filter<?>[] {f1, f2, f1}, filter.getOperands().toArray());
          assertEquals(expected, filter.test(null));
          assertSerializedEquals(filter);
diff --cc core/sis-feature/src/test/java/org/apache/sis/internal/feature/AttributeConventionTest.java
index 231bd46595,a13bd75df7..f42c890475
--- a/core/sis-feature/src/test/java/org/apache/sis/internal/feature/AttributeConventionTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/internal/feature/AttributeConventionTest.java
@@@ -93,10 -94,10 +92,10 @@@ public final strictfp class AttributeCo
          /*
           * Test again AttributeConvention.getCRSCharacteristic(…, PropertyType), but following link.
           */
-         final AbstractOperation link = FeatureOperations.link(Collections.singletonMap(DefaultAttributeType.NAME_KEY, "geom"), type);
-         final DefaultFeatureType feat = new DefaultFeatureType(Collections.singletonMap(DefaultAttributeType.NAME_KEY, "feat"), false, null, type, link);
-         assertEquals(HardCodedCRS.WGS84, AttributeConvention.getCRSCharacteristic(feat, link));
-         assertNull(                      AttributeConvention.getCRSCharacteristic(null, link));
 -        final Operation link = FeatureOperations.link(Map.of(DefaultAttributeType.NAME_KEY, "geom"), type);
++        final var link = FeatureOperations.link(Map.of(DefaultAttributeType.NAME_KEY, "geom"), type);
+         final var feature = new DefaultFeatureType(Map.of(DefaultAttributeType.NAME_KEY, "feat"), false, null, type, link);
+         assertEquals(HardCodedCRS.WGS84, AttributeConvention.getCRSCharacteristic(feature, link));
+         assertNull(AttributeConvention.getCRSCharacteristic(null, link));
      }
  
      /**
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultExtendedElementInformation.java
index a5703b1071,066c1b896e..fafa9b4d94
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultExtendedElementInformation.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/DefaultExtendedElementInformation.java
@@@ -577,10 -574,32 +577,10 @@@ public class DefaultExtendedElementInfo
       * @return reason for creating the extended element.
       */
      @Override
-     @Deprecated
+     @Deprecated(since="1.0")
      @Dependencies("getRationale")
      public Collection<InternationalString> getRationales() {
 -        return new AbstractSet<InternationalString>() {
 -            /** Returns 0 if empty, or 1 if a density has been specified. */
 -            @Override public int size() {
 -                return getRationale() != null ? 1 : 0;
 -            }
 -
 -            /** Returns an iterator over 0 or 1 element. Current iterator implementation is unmodifiable. */
 -            @Override public Iterator<InternationalString> iterator() {
 -                return CollectionsExt.singletonOrEmpty(getRationale()).iterator();
 -            }
 -
 -            /** Adds an element only if the set is empty. This method is invoked by JAXB at unmarshalling time. */
 -            @Override public boolean add(final InternationalString newValue) {
 -                if (isEmpty()) {
 -                    setRationale(newValue);
 -                    return true;
 -                } else {
 -                    LegacyPropertyAdapter.warnIgnoredExtraneous(InternationalString.class,
 -                            DefaultExtendedElementInformation.class, "setRationales");
 -                    return false;
 -                }
 -            }
 -        };
 +        return rationales = nonNullCollection(rationales, InternationalString.class);
      }
  
      /**
@@@ -588,9 -607,10 +588,9 @@@
       *
       * @param  newValues  the new rationales.
       */
-     @Deprecated
+     @Deprecated(since="1.0")
      public void setRationales(final Collection<? extends InternationalString> newValues) {
 -        setRationale(LegacyPropertyAdapter.getSingleton(newValues, InternationalString.class,
 -                null, DefaultExtendedElementInformation.class, "setRationales"));
 +        rationales = writeCollection(newValues, rationales, InternationalString.class);
      }
  
      /**
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultResponsibleParty.java
index 2b9c948b1e,5e8f5bf5bd..3be0e055b4
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultResponsibleParty.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultResponsibleParty.java
@@@ -268,9 -255,9 +268,9 @@@ public class DefaultResponsibleParty ex
       *
       * @deprecated As of ISO 19115:2014, replaced by {@code setName(InternationalString)} in {@link DefaultIndividual}.
       */
-     @Deprecated
+     @Deprecated(since="1.0")
      public void setIndividualName(final String newValue) {
 -        setName(Individual.class, false, Types.toInternationalString(newValue), DefaultResponsibleParty::individual);
 +        setName(DefaultIndividual.class, false, Types.toInternationalString(newValue), DefaultResponsibleParty::individual);
      }
  
      /**
@@@ -312,9 -299,9 +312,9 @@@
       *
       * @deprecated As of ISO 19115:2014, replaced by {@code setName(InternationalString)} in {@link DefaultOrganisation}.
       */
-     @Deprecated
+     @Deprecated(since="1.0")
      public void setOrganisationName(final InternationalString newValue) {
 -        setName(Organisation.class, false, newValue, DefaultResponsibleParty::organisation);
 +        setName(DefaultOrganisation.class, false, newValue, DefaultResponsibleParty::organisation);
      }
  
      /**
@@@ -410,19 -397,21 +410,19 @@@
       *
       * @deprecated As of ISO 19115:2014, replaced by {@link AbstractParty#setContactInfo(Collection)}.
       */
-     @Deprecated
+     @Deprecated(since="1.0")
      public void setContactInfo(final Contact newValue) {
 -        final Collection<Party> parties = getParties();
 +        final Collection<AbstractParty> parties = getParties();
          checkWritePermission(valueIfDefined(parties));
          if (parties != null) {                                  // May be null on unmarshalling.
 -            final Iterator<Party> it = parties.iterator();
 +            final Iterator<AbstractParty> it = parties.iterator();
              while (it.hasNext()) {
 -                final Party party = it.next();
 -                if (party instanceof AbstractParty) {
 -                    ((AbstractParty) party).setContactInfo(newValue != null ? Collections.singleton(newValue) : null);
 -                    if (((AbstractParty) party).isEmpty()) {
 -                        it.remove();
 -                    }
 -                    return;
 +                final AbstractParty party = it.next();
 +                party.setContactInfo(newValue != null ? Collections.singleton(newValue) : null);
 +                if (party.isEmpty()) {
 +                    it.remove();
                  }
 +                return;
              }
          }
          /*
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultTelephone.java
index c3893476c8,17a8901433..69a0ad0f2a
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultTelephone.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/citation/DefaultTelephone.java
@@@ -325,10 -274,10 +325,10 @@@ public class DefaultTelephone extends I
       * @return telephone numbers by which individuals can speak to the responsible organization or individual.
       *
       * @deprecated As of ISO 19115:2014, replaced by a {@linkplain #getNumber() number}
 -     *             with {@link TelephoneType#VOICE}.
 +     *             with {@code TelephoneType.VOICE}.
       */
      @Override
-     @Deprecated
+     @Deprecated(since="1.0")
      @Dependencies({"getNumber", "getNumberType"})
      @XmlElement(name = "voice", namespace = LegacyNamespaces.GMD)
      public final Collection<String> getVoices() {
@@@ -346,9 -295,9 +346,9 @@@
       * @param  newValues  the new telephone numbers, or {@code null} if none.
       *
       * @deprecated As of ISO 19115:2014, replaced by a {@linkplain #setNumber(String) number}
 -     *             with {@link TelephoneType#VOICE}.
 +     *             code {@code TelephoneType.VOICE}.
       */
-     @Deprecated
+     @Deprecated(since="1.0")
      public void setVoices(final Collection<? extends String> newValues) {
          ((LegacyTelephones) getVoices()).setValues(newValues);
      }
@@@ -361,10 -310,10 +361,10 @@@
       * @return telephone numbers of a facsimile machine for the responsible organization or individual.
       *
       * @deprecated As of ISO 19115:2014, replaced by a {@linkplain #getNumber() number}
 -     *             with {@link TelephoneType#FACSIMILE}.
 +     *             code {@code TelephoneType.FACSIMILE}.
       */
      @Override
-     @Deprecated
+     @Deprecated(since="1.0")
      @Dependencies({"getNumber", "getNumberType"})
      @XmlElement(name = "facsimile", namespace = LegacyNamespaces.GMD)
      public final Collection<String> getFacsimiles() {
@@@ -382,9 -331,9 +382,9 @@@
       * @param  newValues  the new telephone number, or {@code null} if none.
       *
       * @deprecated As of ISO 19115:2014, replaced by a {@linkplain #setNumber(String) number}
 -     *             with {@link TelephoneType#FACSIMILE}.
 +     *             with {@code TelephoneType.FACSIMILE}.
       */
-     @Deprecated
+     @Deprecated(since="1.0")
      public void setFacsimiles(final Collection<? extends String> newValues) {
          ((LegacyTelephones) getFacsimiles()).setValues(newValues);
      }
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/constraint/DefaultReleasability.java
index 407029973e,d482dba13c..f40c44a34a
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/constraint/DefaultReleasability.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/constraint/DefaultReleasability.java
@@@ -128,29 -137,12 +128,17 @@@ public class DefaultReleasability exten
      /**
       * Sets the parties to which the release statement applies.
       *
 +     * <div class="warning"><b>Upcoming API change — generalization</b><br>
 +     * The element type will be changed to the {@code Responsibility} interface
 +     * when GeoAPI will provide it (tentatively in GeoAPI 3.1).
 +     * </div>
 +     *
       * @param  newValues  the new parties.
       */
 -    public void setAddressees(final Collection<? extends Responsibility> newValues) {
 -        addressees = writeCollection(newValues, addressees, Responsibility.class);
 +    public void setAddressees(final Collection<? extends DefaultResponsibility> newValues) {
 +        addressees = writeCollection(newValues, addressees, DefaultResponsibility.class);
      }
  
-     /**
-      * Sets the parties to which the release statement applies.
-      *
-      * @param  newValues  the new parties.
-      *
-      * @deprecated Renamed {@link #setAddressees(Collection)}.
-      */
-     @Deprecated
-     public void getAddressees(final Collection<? extends DefaultResponsibility> newValues) {
-         setAddressees(newValues);
-     }
- 
      /**
       * Returns the release statement.
       *
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/DefaultMedium.java
index fcf15df6cc,1e68d884c0..a0a42dfeb0
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/DefaultMedium.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/DefaultMedium.java
@@@ -273,9 -288,9 +273,9 @@@ public class DefaultMedium extends ISOM
       *
       * @param  newValues  the new densities.
       */
-     @Deprecated
+     @Deprecated(since="1.0")
      public void setDensities(final Collection<? extends Double> newValues) {
 -        setDensity(LegacyPropertyAdapter.getSingleton(newValues, Double.class, null, DefaultMedium.class, "setDensities"));
 +        densities = writeCollection(newValues, densities, Double.class);
      }
  
      /**
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/AbstractIdentification.java
index 9e18c382ff,acb7f2142d..0c99ec9c11
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/AbstractIdentification.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/AbstractIdentification.java
@@@ -830,22 -837,9 +830,22 @@@ public class AbstractIdentification ext
       *
       * @deprecated As of ISO 19115:2014, replaced by {@link #setAssociatedResources(Collection)}.
       */
-     @Deprecated
+     @Deprecated(since="1.0")
      public void setAggregationInfo(final Collection<? extends AggregateInformation> newValues) {
 -        setAssociatedResources(newValues);
 +        checkWritePermission(associatedResources);
 +        /*
 +         * We can not invoke getAggregationInfo().setValues(newValues) because this method
 +         * is invoked by the constructor, which is itself invoked at JAXB marshalling time,
 +         * in which case getAggregationInfo() may return null.
 +         */
 +        List<DefaultAssociatedResource> r = null;
 +        if (newValues != null) {
 +            r = new ArrayList<DefaultAssociatedResource>(newValues.size());
 +            for (final AggregateInformation value : newValues) {
 +                r.add(DefaultAssociatedResource.castOrCopy(value));
 +            }
 +        }
 +        setAssociatedResources(r);
      }
  
  
diff --cc core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/maintenance/DefaultMaintenanceInformation.java
index c57ce2a093,75f2966485..686b6494d4
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/maintenance/DefaultMaintenanceInformation.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/maintenance/DefaultMaintenanceInformation.java
@@@ -257,11 -241,11 +257,11 @@@ public class DefaultMaintenanceInformat
       * @return scheduled revision date, or {@code null}.
       *
       * @deprecated As of ISO 19115:2014, replaced by {@link #getMaintenanceDates()} in order to enable inclusion
 -     *             of a {@link DateType} to describe the type of the date. Note that {@link DateType#NEXT_UPDATE}
 -     *             was added to that code list.
 +     *             of a {@link DateType} to describe the type of the date. The associated date type is
 +     *             {@code DateType.valueOf("NEXT_UPDATE")}.
       */
      @Override
-     @Deprecated
+     @Deprecated(since="1.0")
      @Dependencies("getMaintenanceDates")
      @XmlElement(name = "dateOfNextUpdate", namespace = LegacyNamespaces.GMD)
      public Date getDateOfNextUpdate() {
diff --cc core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecord.java
index 0cb736e75a,e70021ff00..1eb0b616a1
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecord.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/DefaultRecord.java
@@@ -178,28 -177,12 +177,28 @@@ public class DefaultRecord implements R
       *
       * @return the dictionary of all (<var>name</var>, <var>value</var>) pairs in this record.
       *
 -     * @see RecordType#getFieldTypes()
 +     * @see RecordType#getMemberTypes()
 +     *
 +     * @deprecated Renamed {@link #getFields()} for consistency with the 2015 revision of ISO 19103 standard.
       */
      @Override
 +    @Deprecated
 +    public Map<MemberName, Object> getAttributes() {
 +        return getFields();
 +    }
 +
 +    /**
 +     * Returns the dictionary of all (<var>name</var>, <var>value</var>) pairs in this record.
 +     * This method returns a view which will delegate all {@code get} and {@code put} operations to
 +     * the {@link #locate(MemberName)} and {@link #set(MemberName, Object)} methods respectively.
 +     *
 +     * @return the dictionary of all (<var>name</var>, <var>value</var>) pairs in this record.
 +     *
 +     * @since 1.1
 +     */
      public Map<MemberName, Object> getFields() {
          if (values == null) {                         // Should never be null, except temporarily at XML unmarshalling time.
-             return Collections.emptyMap();
+             return Map.of();
          }
          return new AbstractMap<MemberName, Object>() {
              /** Returns the number of fields in the record. */
diff --cc core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/CustomMetadataTest.java
index 87186e4871,a23ef5488b..86d531f8ad
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/CustomMetadataTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/CustomMetadataTest.java
@@@ -110,28 -105,12 +110,28 @@@ public final strictfp class CustomMetad
                  return factory.createInternationalString(names);
              }
  
 -            @Override public Citation                  getCitation()           {return null;}
 -            @Override public Collection<TopicCategory> getTopicCategories()    {return null;}
 -            @Override public Collection<Extent>        getExtents()            {return null;}
 +            @Override public InternationalString                   getSupplementalInformation()    {return null;}
 +            @Override public Citation                              getCitation()                   {return null;}
 +            @Override public InternationalString                   getPurpose()                    {return null;}
 +            @Override public Collection<SpatialRepresentationType> getSpatialRepresentationTypes() {return null;}
 +            @Override public Collection<Resolution>                getSpatialResolutions()         {return null;}
 +            @Override public Collection<Locale>                    getLanguages()                  {return null;}
 +            @Override public Collection<CharacterSet>              getCharacterSets()              {return null;}
 +            @Override public Collection<TopicCategory>             getTopicCategories()            {return null;}
 +            @Override public Collection<Extent>                    getExtents()                    {return null;}
 +            @Override public Collection<String>                    getCredits()                    {return null;}
 +            @Override public Collection<Progress>                  getStatus()                     {return null;}
 +            @Override public Collection<ResponsibleParty>          getPointOfContacts()            {return null;}
 +            @Override public Collection<MaintenanceInformation>    getResourceMaintenances()       {return null;}
 +            @Override public Collection<BrowseGraphic>             getGraphicOverviews()           {return null;}
 +            @Override public Collection<Format>                    getResourceFormats()            {return null;}
 +            @Override public Collection<Keywords>                  getDescriptiveKeywords()        {return null;}
 +            @Override public Collection<Usage>                     getResourceSpecificUsages()     {return null;}
 +            @Override public Collection<Constraints>               getResourceConstraints()        {return null;}
 +@Deprecated @Override public Collection<AggregateInformation>      getAggregationInfo()            {return null;}
          };
          final DefaultMetadata data = new DefaultMetadata();
-         data.setIdentificationInfo(singleton(identification));
+         data.setIdentificationInfo(Set.of(identification));
          final String xml = XML.marshal(data);
          /*
           * A few simple checks.
diff --cc core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/CitationsTest.java
index e7494bc585,c9faf85073..963983e9c4
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/CitationsTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/CitationsTest.java
@@@ -287,14 -284,14 +286,14 @@@ public final strictfp class CitationsTe
       */
      @Test
      public void testIdentifierMatches() {
 -        final Identifier ogc = new DefaultIdentifier("OGC", "06-042", null);
 -        final Identifier iso = new DefaultIdentifier("ISO", "19128", null);
 +        final Identifier ogc = new Id("OGC", "06-042");
 +        final Identifier iso = new Id("ISO", "19128");
          final DefaultCitation citation = new DefaultCitation("Web Map Server");
-         citation.setIdentifiers(Arrays.asList(ogc, iso, new DefaultIdentifier("Foo", "06-042", null)));
+         citation.setIdentifiers(List.of(ogc, iso, new DefaultIdentifier("Foo", "06-042", null)));
          assertTrue ("With full identifier",  Citations.identifierMatches(citation, ogc, ogc.getCode()));
          assertTrue ("With full identifier",  Citations.identifierMatches(citation, iso, iso.getCode()));
 -        assertFalse("With wrong code",       Citations.identifierMatches(citation, new DefaultIdentifier("ISO", "19115", null), "19115"));
 -        assertFalse("With wrong code space", Citations.identifierMatches(citation, new DefaultIdentifier("Foo", "19128", null), "19128"));
 +        assertFalse("With wrong code",       Citations.identifierMatches(citation, new Id("ISO", "19115"), "19115"));
 +        assertFalse("With wrong code space", Citations.identifierMatches(citation, new Id("Foo", "19128"), "19128"));
          assertFalse("With wrong code",       Citations.identifierMatches(citation, "Foo"));
          assertTrue ("Without identifier",    Citations.identifierMatches(citation, "19128"));
          assertTrue ("With parsing",          Citations.identifierMatches(citation, "ISO:19128"));
diff --cc core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultCitationTest.java
index b3ec5b107e,8fe47ab471..05093683ca
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultCitationTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultCitationTest.java
@@@ -88,13 -90,13 +88,13 @@@ public final strictfp class DefaultCita
                  new SimpleInternationalString("Andākarento")));   // Actually a different script of the Japanese title.
  
          final DefaultResponsibleParty author = new DefaultResponsibleParty(Role.AUTHOR);
-         author.setParties(Collections.singleton(new DefaultIndividual("Testsuya Toyoda", null, null)));
+         author.setParties(Set.of(new DefaultIndividual("Testsuya Toyoda", null, null)));
  
 -        final DefaultResponsibleParty editor = new DefaultResponsibleParty(Role.EDITOR);
 +        final DefaultResponsibleParty editor = new DefaultResponsibleParty(Role.valueOf("EDITOR"));
-         editor.setParties(Collections.singleton(new DefaultOrganisation("Kōdansha", null, null, null)));
-         editor.setExtents(Collections.singleton(Extents.WORLD));
+         editor.setParties(Set.of(new DefaultOrganisation("Kōdansha", null, null, null)));
+         editor.setExtents(Set.of(Extents.WORLD));
  
-         citation.setCitedResponsibleParties(Arrays.asList(author, editor));
+         citation.setCitedResponsibleParties(List.of(author, editor));
          return citation;
      }
  
@@@ -253,12 -255,12 +253,12 @@@
          contact.getIdentifierMap().putSpecialized(IdentifierSpace.ID, "ip-protocol");
          final DefaultCitation c = new DefaultCitation("Fight against poverty");
          final DefaultResponsibleParty r1 = new DefaultResponsibleParty(Role.ORIGINATOR);
 -        final DefaultResponsibleParty r2 = new DefaultResponsibleParty(Role.FUNDER);
 +        final DefaultResponsibleParty r2 = new DefaultResponsibleParty(Role.valueOf("funder"));
-         r1.setParties(Collections.singleton(new DefaultIndividual("Maid Marian", null, contact)));
-         r2.setParties(Collections.singleton(new DefaultIndividual("Robin Hood",  null, contact)));
-         c.setCitedResponsibleParties(Arrays.asList(r1, r2));
+         r1.setParties(Set.of(new DefaultIndividual("Maid Marian", null, contact)));
+         r2.setParties(Set.of(new DefaultIndividual("Robin Hood",  null, contact)));
+         c.setCitedResponsibleParties(List.of(r1, r2));
 -        c.getDates().add(new DefaultCitationDate(TestUtilities.date("2015-10-17 00:00:00"), DateType.ADOPTED));
 -        c.getPresentationForms().add(PresentationForm.PHYSICAL_OBJECT);
 +        c.getDates().add(new DefaultCitationDate(TestUtilities.date("2015-10-17 00:00:00"), DateType.valueOf("adopted")));
 +        c.getPresentationForms().add(PresentationForm.valueOf("physicalObject"));
          /*
           * Check that XML file built by the marshaller is the same as the example file.
           */
diff --cc core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultContactTest.java
index ce74e4c5eb,1f001a364b..3f71e90576
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultContactTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultContactTest.java
@@@ -82,13 -82,13 +82,13 @@@ public final strictfp class DefaultCont
      @SuppressWarnings("deprecation")
      public void testSetPhones() {
          init();
 -        final DefaultTelephone   tel1 = new DefaultTelephone("00.01", TelephoneType.SMS);
 -        final DefaultTelephone   tel2 = new DefaultTelephone("00.02", TelephoneType.VOICE);
 -        final DefaultTelephone   tel3 = new DefaultTelephone("00.03", TelephoneType.FACSIMILE);
 -        final DefaultTelephone   tel4 = new DefaultTelephone("00.04", TelephoneType.VOICE);
 +        final DefaultTelephone   tel1 = new DefaultTelephone("00.01", UnsupportedCodeList.valueOf("SMS"));
 +        final DefaultTelephone   tel2 = new DefaultTelephone("00.02", UnsupportedCodeList.VOICE);
 +        final DefaultTelephone   tel3 = new DefaultTelephone("00.03", UnsupportedCodeList.FACSIMILE);
 +        final DefaultTelephone   tel4 = new DefaultTelephone("00.04", UnsupportedCodeList.VOICE);
          final DefaultTelephone[] tels = new DefaultTelephone[] {tel1, tel2, tel3, tel4};
          final DefaultContact  contact = new DefaultContact();
-         contact.setPhones(Arrays.asList(tel1, tel2, tel3, tel4));
+         contact.setPhones(List.of(tel1, tel2, tel3, tel4));
          assertArrayEquals("getPhones", tels, contact.getPhones().toArray());
          /*
           * Test the deprecated 'getPhone()' method. Invoking that method shall emit
diff --cc core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/constraint/DefaultLegalConstraintsTest.java
index 6bb9b4d7f9,1e41e1df9b..085444c50e
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/constraint/DefaultLegalConstraintsTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/constraint/DefaultLegalConstraintsTest.java
@@@ -84,10 -85,10 +84,10 @@@ public final strictfp class DefaultLega
                  "</mco:MD_LegalConstraints>\n";
  
          final DefaultLegalConstraints c = new DefaultLegalConstraints();
-         c.setUseConstraints(singleton(Restriction.LICENSE));
 -        c.setUseConstraints(Set.of(Restriction.LICENCE));
++        c.setUseConstraints(Set.of(Restriction.LICENSE));
          assertXmlEquals(xml, marshal(c), "xmlns:*");
          DefaultLegalConstraints actual = unmarshal(DefaultLegalConstraints.class, xml);
 -        assertSame(Restriction.LICENCE, getSingleton(actual.getUseConstraints()));
 +        assertSame(Restriction.LICENSE, getSingleton(actual.getUseConstraints()));
          assertEquals(c, actual);
          /*
           * Above code tested ISO 19115-3 (un)marshalling. Code below test legacy ISO 19139:2007 (un)marshalling.
diff --cc core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultCoupledResourceTest.java
index 6ebf23e54f,1d98dd9363..7130c595a2
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultCoupledResourceTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultCoupledResourceTest.java
@@@ -46,11 -47,10 +46,11 @@@ public final strictfp class DefaultCoup
       * Creates the resource to use for testing purpose.
       */
      static DefaultCoupledResource create(final NameFactory factory) {
 -        final DefaultOperationMetadata operation = new DefaultOperationMetadata("Get Map",
 -                DistributedComputingPlatform.WEB_SERVICES, null);
 +        final DefaultOperationMetadata operation = new DefaultOperationMetadata();
 +        operation.setOperationName("Get Map");
-         operation.setDistributedComputingPlatforms(singleton(UnsupportedCodeList.valueOf("WEB_SERVICES")));
-         operation.setParameters(singleton((ParameterDescriptor<?>) ServiceParameterTest.create()));
-         operation.setConnectPoints(singleton(NilReason.MISSING.createNilObject(OnlineResource.class)));
++        operation.setDistributedComputingPlatforms(Set.of(UnsupportedCodeList.valueOf("WEB_SERVICES")));
+         operation.setParameters(Set.of((ParameterDescriptor<?>) ServiceParameterTest.create()));
+         operation.setConnectPoints(Set.of(NilReason.MISSING.createNilObject(OnlineResource.class)));
  
          final DefaultCoupledResource resource = new DefaultCoupledResource();
          resource.setScopedName((ScopedName) factory.createGenericName(null, "mySpace", "ABC-123"));
diff --cc core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultServiceIdentificationTest.java
index b27d919138,3c26eac39b..41fdcc0039
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultServiceIdentificationTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultServiceIdentificationTest.java
@@@ -16,11 -16,17 +16,12 @@@
   */
  package org.apache.sis.metadata.iso.identification;
  
+ import java.util.Set;
  import javax.xml.bind.JAXBException;
  import org.opengis.util.NameFactory;
 -import org.opengis.parameter.ParameterDirection;
  import org.opengis.parameter.ParameterDescriptor;
  import org.opengis.metadata.citation.Citation;
 -import org.opengis.metadata.identification.CouplingType;
 -import org.opengis.metadata.identification.CoupledResource;
 -import org.opengis.metadata.identification.OperationMetadata;
 -import org.opengis.metadata.identification.ServiceIdentification;
 -import org.opengis.metadata.identification.DistributedComputingPlatform;
 +import org.apache.sis.internal.geoapi.evolution.UnsupportedCodeList;
  import org.apache.sis.metadata.iso.citation.DefaultCitation;
  import org.apache.sis.internal.system.DefaultFactories;
  import org.apache.sis.metadata.xml.TestUsingFile;
@@@ -63,10 -68,10 +63,10 @@@ public final strictfp class DefaultServ
                  factory.createGenericName(null, "Web Map Server"),      // serviceType
                  NilReason.MISSING.createNilObject(Citation.class),      // citation
                  "A dummy service for testing purpose.");                // abstract
-         id.setServiceTypeVersions(singleton("1.0"));
-         id.setCoupledResources(singleton(resource));
+         id.setServiceTypeVersions(Set.of("1.0"));
+         id.setCoupledResources(Set.of(resource));
 -        id.setCouplingType(CouplingType.LOOSE);
 +        id.setCouplingType(UnsupportedCodeList.valueOf("LOOSE"));
-         id.setContainsOperations(singleton(resource.getOperation()));
+         id.setContainsOperations(Set.of(resource.getOperation()));
          return id;
      }
  
diff --cc core/sis-metadata/src/test/java/org/apache/sis/metadata/sql/MetadataFallbackVerifier.java
index 3cfbd28bec,9429c08c41..99ddaa8efc
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/sql/MetadataFallbackVerifier.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/sql/MetadataFallbackVerifier.java
@@@ -16,13 -16,12 +16,11 @@@
   */
  package org.apache.sis.metadata.sql;
  
- import java.util.Arrays;
  import java.util.Set;
- import java.util.HashSet;
  import org.opengis.util.InternationalString;
  import org.opengis.metadata.Identifier;
 -import org.opengis.metadata.citation.Party;
  import org.opengis.metadata.citation.Citation;
 -import org.opengis.metadata.citation.Responsibility;
 +import org.opengis.metadata.citation.ResponsibleParty;
  import org.apache.sis.internal.simple.CitationConstant;
  import org.apache.sis.metadata.iso.citation.Citations;
  import org.apache.sis.metadata.MetadataStandard;
diff --cc core/sis-metadata/src/test/java/org/apache/sis/metadata/sql/MetadataWriterTest.java
index 4cb97f8907,24401459ae..01f8227743
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/sql/MetadataWriterTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/sql/MetadataWriterTest.java
@@@ -16,7 -16,8 +16,7 @@@
   */
  package org.apache.sis.metadata.sql;
  
- import java.util.Collections;
+ import java.util.Set;
 -import org.opengis.metadata.citation.Contact;
  import org.opengis.metadata.citation.Citation;
  import org.opengis.metadata.citation.PresentationForm;
  import org.opengis.metadata.citation.OnLineFunction;
diff --cc core/sis-metadata/src/test/java/org/apache/sis/test/MetadataAssert.java
index 4e99c36c1c,04269a6334..79aa4b20af
--- a/core/sis-metadata/src/test/java/org/apache/sis/test/MetadataAssert.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/test/MetadataAssert.java
@@@ -121,10 -117,10 +120,10 @@@ public strictfp class MetadataAssert ex
       */
      public static void assertFeatureSourceEquals(final String name, final String[] features, final Source source) {
          assertEquals("metadata.lineage.source.sourceCitation.title", name, String.valueOf(source.getSourceCitation().getTitle()));
 -        final Scope scope = source.getScope();
 +        final DefaultScope scope = (DefaultScope) ((DefaultSource) source).getScope();
          assertNotNull("metadata.lineage.source.scope", scope);
          assertEquals("metadata.lineage.source.scope.level", ScopeCode.FEATURE_TYPE, scope.getLevel());
-         final Object[] actual = CollectionsExt.toArray(getSingleton(scope.getLevelDescription()).getFeatures(), Object.class);
 -        final var actual = getSingleton(scope.getLevelDescription()).getFeatures().toArray(CharSequence[]::new);
++        final Object[] actual = getSingleton(scope.getLevelDescription()).getFeatures().toArray();
          for (int i=0; i<actual.length; i++) {
              actual[i] = actual[i].toString();
          }
diff --cc core/sis-metadata/src/test/java/org/apache/sis/test/mock/MetadataMock.java
index 5479bc2022,3303ddb1cf..bcdd092e7f
--- a/core/sis-metadata/src/test/java/org/apache/sis/test/mock/MetadataMock.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/test/mock/MetadataMock.java
@@@ -16,9 -16,12 +16,9 @@@
   */
  package org.apache.sis.test.mock;
  
 -import java.util.Map;
 +import java.util.Locale;
+ import java.util.Set;
  import java.util.Collection;
--import java.util.Collections;
 -import java.util.Locale;
 -import java.nio.charset.Charset;
  import javax.xml.bind.annotation.XmlElement;
  import javax.xml.bind.annotation.XmlRootElement;
  import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@@@ -72,8 -85,9 +72,8 @@@ public final strictfp class MetadataMoc
       * @return {@link #language}
       */
      @Override
 -    @Deprecated
      public Collection<Locale> getLanguages() {
-         return (language != null) ? Collections.singleton(language) : Collections.emptySet();
+         return (language != null) ? Set.of(language) : Set.of();
      }
  
      /**
diff --cc core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/FinalLocationType.java
index 3bf250350b,9c1d259e12..60605b3c2d
--- a/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/FinalLocationType.java
+++ b/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/FinalLocationType.java
@@@ -161,12 -163,12 +161,12 @@@ final class FinalLocationType extends A
       * @param rs        the reference system to assign to the new location types.
       * @param existing  an initially empty identity hash map for internal usage by this method.
       */
 -    static List<LocationType> snapshot(final Collection<? extends LocationType> types,
 -            final ReferenceSystemUsingIdentifiers rs, final Map<LocationType, FinalLocationType> existing)
 +    static List<AbstractLocationType> snapshot(final Collection<? extends AbstractLocationType> types,
 +            final ReferencingByIdentifiers rs, final Map<AbstractLocationType, FinalLocationType> existing)
      {
-         final AbstractLocationType[] array = types.toArray(new AbstractLocationType[types.size()]);
 -        final LocationType[] array = types.toArray(LocationType[]::new);
++        final AbstractLocationType[] array = types.toArray(AbstractLocationType[]::new);
          for (int i=0; i < array.length; i++) {
 -            final LocationType source = array[i];
 +            final AbstractLocationType source = array[i];
              ArgumentChecks.ensureNonNullElement("types", i, source);
              FinalLocationType copy = existing.get(source);
              if (copy == null) {
diff --cc core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java
index 923bb4a085,d80d5ca66d..c5b80c0144
--- a/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java
+++ b/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java
@@@ -76,10 -80,12 +76,9 @@@ import org.apache.sis.measure.Latitude
  import org.apache.sis.measure.Quantities;
  import org.apache.sis.measure.Units;
  
 -import static java.util.logging.Logger.getLogger;
  
  // Branch-dependent imports
 -import org.opengis.metadata.citation.Party;
 -import org.opengis.referencing.gazetteer.Location;
 -import org.opengis.referencing.gazetteer.LocationType;
 +import org.apache.sis.metadata.iso.citation.AbstractParty;
- import org.apache.sis.internal.jdk9.JDK9;
  
  
  /**
diff --cc core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/LocationTypeTest.java
index e69e23ae97,e0c1bbe950..a7a335d818
--- a/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/LocationTypeTest.java
+++ b/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/LocationTypeTest.java
@@@ -180,8 -182,7 +179,7 @@@ public final strictfp class LocationTyp
      @Test
      @DependsOnMethod("testInheritance")
      public void testSnapshot() {
-         final List<AbstractLocationType> snapshot = ModifiableLocationType.snapshot(null, create(true));
-         verify(snapshot.toArray(new AbstractLocationType[snapshot.size()]));
 -        verify(ModifiableLocationType.snapshot(null, create(true)).toArray(LocationType[]::new));
++        verify(ModifiableLocationType.snapshot(null, create(true)).toArray(AbstractLocationType[]::new));
      }
  
      /**
diff --cc core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Formatter.java
index e018487c84,02d8863e5a..30dc73773e
--- a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Formatter.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/Formatter.java
@@@ -853,12 -851,12 +852,12 @@@ public class Formatter implements Local
              appendForSubtypes(object);
          }
          if (showIDs) {
 -            Collection<? extends Identifier> identifiers = object.getIdentifiers();
 +            Collection<ReferenceIdentifier> identifiers = object.getIdentifiers();
              if (identifiers != null) {                                                  // Paranoiac check
                  if (filterID) {
 -                    for (final Identifier id : identifiers) {
 +                    for (final ReferenceIdentifier id : identifiers) {
                          if (Citations.identifierMatches(authority, id.getAuthority())) {
-                             identifiers = Collections.singleton(id);
+                             identifiers = Set.of(id);
                              break;
                          }
                      }
diff --cc core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/CodeTest.java
index e6f7e8b8be,2c7b8ab36e..d77873c5bd
--- a/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/CodeTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/CodeTest.java
@@@ -16,9 -16,9 +16,9 @@@
   */
  package org.apache.sis.internal.jaxb.referencing;
  
- import java.util.Collections;
+ import java.util.Set;
  import org.opengis.referencing.crs.GeographicCRS;
 -import org.opengis.metadata.Identifier;
 +import org.opengis.referencing.ReferenceIdentifier;
  import org.apache.sis.internal.util.Constants;
  import org.apache.sis.internal.simple.SimpleCitation;
  import org.apache.sis.referencing.ImmutableIdentifier;
@@@ -94,8 -94,8 +94,8 @@@ public final strictfp class CodeTest ex
      @Test
      @DependsOnMethod("testWithVersion")
      public void testForIdentifiedObject() {
 -        final Identifier id = new ImmutableIdentifier(Citations.EPSG, "EPSG", "4326", "8.2", null);
 +        final ReferenceIdentifier id = new ImmutableIdentifier(Citations.EPSG, "EPSG", "4326", "8.2", null);
-         final Code value = Code.forIdentifiedObject(GeographicCRS.class, Collections.singleton(id));
+         final Code value = Code.forIdentifiedObject(GeographicCRS.class, Set.of(id));
          assertNotNull(value);
          assertEquals("codeSpace", Constants.IOGP, value.codeSpace);
          assertEquals("code", "urn:ogc:def:crs:EPSG:8.2:4326", value.code);
@@@ -111,8 -111,8 +111,8 @@@
          final DefaultCitation authority = new DefaultCitation("EPSG");
          authority.getIdentifiers().add(new ImmutableIdentifier(null, "OGP", "EPSG"));
  
 -        final Identifier id = new ImmutableIdentifier(authority, "EPSG", "4326", "8.2", null);
 +        final ReferenceIdentifier id = new ImmutableIdentifier(authority, "EPSG", "4326", "8.2", null);
-         final Code value = Code.forIdentifiedObject(GeographicCRS.class, Collections.singleton(id));
+         final Code value = Code.forIdentifiedObject(GeographicCRS.class, Set.of(id));
          assertNotNull(value);
          assertEquals("codeSpace", "OGP", value.codeSpace);
          assertEquals("code", "urn:ogc:def:crs:EPSG:8.2:4326", value.code);
diff --cc core/sis-referencing/src/test/java/org/apache/sis/parameter/DefaultParameterDescriptorGroupTest.java
index d9c709e326,88e0487826..61a10bf572
--- a/core/sis-referencing/src/test/java/org/apache/sis/parameter/DefaultParameterDescriptorGroupTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/parameter/DefaultParameterDescriptorGroupTest.java
@@@ -19,7 -19,7 +19,6 @@@ package org.apache.sis.parameter
  import java.util.Map;
  import java.util.List;
  import java.util.HashMap;
- import java.util.Collections;
 -import org.opengis.parameter.ParameterDirection;
  import org.opengis.parameter.GeneralParameterDescriptor;
  import org.opengis.parameter.ParameterNotFoundException;
  import org.apache.sis.internal.util.Constants;
diff --cc core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java
index 278e8dbecd,d985502dce..b7ae48f2d0
--- a/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java
@@@ -16,13 -16,15 +16,13 @@@
   */
  package org.apache.sis.parameter;
  
+ import java.util.Map;
  import java.util.Set;
  import java.util.Collection;
- import java.util.Collections;
  import javax.measure.Unit;
  import org.opengis.parameter.ParameterDescriptor;
 -import org.opengis.parameter.ParameterDirection;
  import org.opengis.parameter.ParameterValue;
  import org.opengis.parameter.ParameterValueGroup;
 -import org.opengis.util.TypeName;
  import org.opengis.util.GenericName;
  import org.opengis.util.InternationalString;
  import org.apache.sis.measure.Range;
diff --cc core/sis-referencing/src/test/java/org/apache/sis/parameter/TensorParametersTest.java
index a89901ea3b,bb1969ebd1..79f7e49504
--- a/core/sis-referencing/src/test/java/org/apache/sis/parameter/TensorParametersTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/parameter/TensorParametersTest.java
@@@ -29,7 -29,7 +29,6 @@@ import org.apache.sis.test.TestCase
  import org.junit.AfterClass;
  import org.junit.Test;
  
- import static java.util.Collections.singletonMap;
 -import static org.opengis.test.Validators.validate;
  import static org.apache.sis.test.ReferencingAssert.*;
  import static org.apache.sis.internal.util.Constants.NUM_ROW;
  import static org.apache.sis.internal.util.Constants.NUM_COL;
@@@ -319,7 -319,8 +318,7 @@@ public strictfp class TensorParametersT
                      }
                  }
                  final ParameterValueGroup group = param.createValueGroup(
-                         singletonMap(ParameterDescriptor.NAME_KEY, "Test"), matrix);
+                         Map.of(ParameterDescriptor.NAME_KEY, "Test"), matrix);
 -                validate(group);
                  assertEquals(NUM_ROW,    numRow, group.parameter(NUM_ROW).intValue());
                  assertEquals(NUM_COL,    numCol, group.parameter(NUM_COL).intValue());
                  assertEquals("elements", matrix, param.toMatrix(group));
diff --cc core/sis-referencing/src/test/java/org/apache/sis/test/integration/MetadataTest.java
index cf85e0fa75,7d6e3a7da0..10d438272f
--- a/core/sis-referencing/src/test/java/org/apache/sis/test/integration/MetadataTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/test/integration/MetadataTest.java
@@@ -155,12 -139,12 +153,12 @@@ public final strictfp class MetadataTes
              online.setProtocol("http");
              final DefaultContact contact = new DefaultContact(online);
              contact.getIdentifierMap().putSpecialized(IdentifierSpace.ID, "IFREMER");
-             contact.setPhones(Arrays.asList(
+             contact.setPhones(List.of(
 -                    new DefaultTelephone("+33 (0)2 xx.xx.xx.x6", TelephoneType.VOICE),
 -                    new DefaultTelephone("+33 (0)2 xx.xx.xx.x4", TelephoneType.FACSIMILE)
 +                    telephone("+33 (0)2 xx.xx.xx.x6", "VOICE"),
 +                    telephone("+33 (0)2 xx.xx.xx.x4", "FACSIMILE")
              ));
              final DefaultAddress address = new DefaultAddress();
-             address.setDeliveryPoints(singleton("Brest institute"));
+             address.setDeliveryPoints(Set.of("Brest institute"));
              address.setCity(new SimpleInternationalString("Plouzane"));
              address.setPostalCode("29280");
              address.setCountry(country);
@@@ -184,12 -168,12 +182,12 @@@
                  final DefaultOnlineResource online = new DefaultOnlineResource(URI.create("http://www.com.univ-mrs.fr/LOB/"));
                  online.setProtocol("http");
                  final DefaultContact contact = new DefaultContact(online);
-                 contact.setPhones(Arrays.asList(
+                 contact.setPhones(List.of(
 -                        new DefaultTelephone("+33 (0)4 xx.xx.xx.x5", TelephoneType.VOICE),
 -                        new DefaultTelephone("+33 (0)4 xx.xx.xx.x8", TelephoneType.FACSIMILE)
 +                        telephone("+33 (0)4 xx.xx.xx.x5", "VOICE"),
 +                        telephone("+33 (0)4 xx.xx.xx.x8", "FACSIMILE")
                  ));
                  final DefaultAddress address = new DefaultAddress();
-                 address.setDeliveryPoints(singleton("Oceanology institute"));
+                 address.setDeliveryPoints(Set.of("Oceanology institute"));
                  address.setCity(new SimpleInternationalString("Marseille"));
                  address.setPostalCode("13288");
                  address.setCountry(country);
@@@ -236,22 -220,22 +234,22 @@@
               */
              {
                  final DefaultLegalConstraints constraint = new DefaultLegalConstraints();
-                 constraint.setAccessConstraints(singleton(Restriction.LICENSE));
-                 identification.setResourceConstraints(singleton(constraint));
 -                constraint.setAccessConstraints(Set.of(Restriction.LICENCE));
++                constraint.setAccessConstraints(Set.of(Restriction.LICENSE));
+                 identification.setResourceConstraints(Set.of(constraint));
              }
              /*
               * Data indentification / Aggregate information.
               */
              {
                  @SuppressWarnings("deprecation")
 -                final DefaultAssociatedResource aggregateInfo = new DefaultAggregateInformation();
 +                final DefaultAggregateInformation aggregateInfo = new DefaultAggregateInformation();
                  final DefaultCitation name = new DefaultCitation("Some oceanographic campaign");
-                 name.setAlternateTitles(singleton(new SimpleInternationalString("Pseudo group of data")));
-                 name.setDates(singleton(new DefaultCitationDate(TestUtilities.date("1990-06-04 22:00:00"), DateType.REVISION)));
+                 name.setAlternateTitles(Set.of(new SimpleInternationalString("Pseudo group of data")));
+                 name.setDates(Set.of(new DefaultCitationDate(TestUtilities.date("1990-06-04 22:00:00"), DateType.REVISION)));
                  aggregateInfo.setName(name);
                  aggregateInfo.setInitiativeType(InitiativeType.CAMPAIGN);
 -                aggregateInfo.setAssociationType(AssociationType.LARGER_WORK_CITATION);
 +                aggregateInfo.setAssociationType(AssociationType.LARGER_WORD_CITATION); // There is a typo ("WORD" → "WORK"), but we have to use the wrong spelling for this branch.
-                 identification.setAggregationInfo(singleton(aggregateInfo));
+                 identification.setAssociatedResources(Set.of(aggregateInfo));
              }
              /*
               * Data indentification / Extent.
diff --cc ide-project/NetBeans/nbproject/genfiles.properties
index 9598b10f14,874d87f86b..b73c624292
--- a/ide-project/NetBeans/nbproject/genfiles.properties
+++ b/ide-project/NetBeans/nbproject/genfiles.properties
@@@ -3,6 -3,6 +3,6 @@@
  build.xml.data.CRC32=58e6b21c
  build.xml.script.CRC32=462eaba0
  build.xml.stylesheet.CRC32=28e38971@1.53.1.46
- nbproject/build-impl.xml.data.CRC32=f188e30a
- nbproject/build-impl.xml.script.CRC32=933f5834
- nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.101.0.48
 -nbproject/build-impl.xml.data.CRC32=e6c2891e
 -nbproject/build-impl.xml.script.CRC32=02d4f276
++nbproject/build-impl.xml.data.CRC32=61740f25
++nbproject/build-impl.xml.script.CRC32=101e7069
+ nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.104.0.48
diff --cc pom.xml
index db966691dc,1e8f742594..c24c9dff72
--- a/pom.xml
+++ b/pom.xml
@@@ -873,9 -867,9 +867,9 @@@
            <validateLinks>true</validateLinks>                   <!-- Validates content of package-list resources. -->
            <detectJavaApiLink>false</detectJavaApiLink>          <!-- Let us declare link to Java API. -->
            <links>
-             <link>https://docs.oracle.com/javase/8/docs/api</link>
+             <link>https://docs.oracle.com/en/java/javase/11/docs/api</link>
              <link>http://unitsofmeasurement.github.io/unit-api/site/apidocs</link>
 -            <link>http://www.geoapi.org/snapshot/javadoc</link>
 +            <link>http://www.geoapi.org/3.0/javadoc</link>
            </links>
  
            <additionalOptions>
diff --cc storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
index 3bc391981f,ed51bc0d94..080ca1f106
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
@@@ -80,8 -79,8 +79,7 @@@ import ucar.nc2.constants.ACDD
  import ucar.nc2.constants.CDM;
  import ucar.nc2.constants.CF;
  
- import static java.util.Collections.singleton;
  import static org.apache.sis.storage.netcdf.AttributeNames.*;
 -import static org.apache.sis.internal.util.CollectionsExt.first;
  
  
  /**
@@@ -513,11 -518,13 +511,13 @@@ split:  while ((start = CharSequences.s
              if (individualName != null || organisationName != null || contact != null) {        // Do not test role.
                  AbstractParty party = null;
                  if (individualName   != null) party = new DefaultIndividual(individualName, null, null);
 -                if (organisationName != null) party = new DefaultOrganisation(organisationName, null, (Individual) party, null);
 +                if (organisationName != null) party = new DefaultOrganisation(organisationName, null, (DefaultIndividual) party, null);
                  if (party            == null) party = isOrganisation(keys) ? new DefaultOrganisation() : new DefaultIndividual();
-                 if (contact          != null) party.setContactInfo(singleton(contact));
+                 if (contact          != null) party.setContactInfo(Set.of(contact));
                  responsibility = new DefaultResponsibleParty(role);
-                 ((DefaultResponsibleParty) responsibility).setParties(singleton(party));
+                 if (party != null) {
+                     ((DefaultResponsibleParty) responsibility).setParties(Set.of(party));
+                 }
              }
          }
          return responsibility;
diff --cc storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
index eed2b67459,4c5370968e..64427ed861
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
@@@ -576,20 -578,21 +576,21 @@@ final class Store extends URIDataStore 
              }
              properties.add(createProperty(name, type, minOccurrence, maxOccurrence, characteristics));
          }
+         // Do not use Map.of(…) because `name` may be null. Let constructor throw the exception.
          final String name = IOUtilities.filenameWithoutExtension(super.getDisplayName());
          return new DefaultFeatureType(Collections.singletonMap(DefaultFeatureType.NAME_KEY, name),
-                 false, null, properties.toArray(new AbstractIdentifiedType[properties.size()]));
 -                                      false, null, properties.toArray(PropertyType[]::new));
++                                      false, null, properties.toArray(AbstractIdentifiedType[]::new));
      }
  
      /**
       * Creates a property type for the given name and type.
       * This is a helper method for {@link #parseFeatureType(List)}.
       */
 -    private static PropertyType createProperty(final String name, final Class<?> type,
 -            final int minOccurrence, final int maxOccurrence, final AttributeType<?>[] characteristics)
 +    private static AbstractIdentifiedType createProperty(final String name, final Class<?> type,
 +            final int minOccurrence, final int maxOccurrence, final DefaultAttributeType<?>[] characteristics)
      {
          return new DefaultAttributeType<>(Collections.singletonMap(DefaultAttributeType.NAME_KEY, name),
-                 type, minOccurrence, maxOccurrence, null, characteristics);
+                                           type, minOccurrence, maxOccurrence, null, characteristics);
      }
  
      /**
diff --cc storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/JoinFeatureSet.java
index 9d7d340da0,d8297aff83..c8dfd8d964
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/JoinFeatureSet.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/JoinFeatureSet.java
@@@ -231,16 -232,16 +230,16 @@@ public class JoinFeatureSet extends Agg
           * We could build the FeatureType only when first needed, but the type is required by the iterators.
           * Since we are going to need the type for any use of this JoinFeatureSet, better to create it now.
           */
 -        PropertyType[] properties = new PropertyType[] {
 +        AbstractIdentifiedType[] properties = new AbstractIdentifiedType[] {
-             new DefaultAssociationRole(name(leftAlias),  leftType,  joinType.minimumOccurs(false), 1),
-             new DefaultAssociationRole(name(rightAlias), rightType, joinType.minimumOccurs(true),  1)
+             new DefaultAssociationRole(properties(leftAlias),  leftType,  joinType.minimumOccurs(false), 1),
+             new DefaultAssociationRole(properties(rightAlias), rightType, joinType.minimumOccurs(true),  1)
          };
          final String identifierDelimiter = Containers.property(featureInfo, "identifierDelimiter", String.class);
          if (identifierDelimiter != null && AttributeConvention.hasIdentifier(leftType)
                                          && AttributeConvention.hasIdentifier(rightType))
          {
 -            final Operation identifier = FeatureOperations.compound(
 +            final AbstractOperation identifier = FeatureOperations.compound(
-                     name(AttributeConvention.IDENTIFIER_PROPERTY), identifierDelimiter,
+                     properties(AttributeConvention.IDENTIFIER_PROPERTY), identifierDelimiter,
                      Containers.property(featureInfo, "identifierPrefix", String.class),
                      Containers.property(featureInfo, "identifierSuffix", String.class), properties);
              properties = ArraysExt.insert(properties, 0, 1);
diff --cc storage/sis-storage/src/test/java/org/apache/sis/internal/storage/csv/StoreTest.java
index 06f07681d3,421e59a612..46fdbe2bb0
--- a/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/csv/StoreTest.java
+++ b/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/csv/StoreTest.java
@@@ -98,10 -101,10 +102,10 @@@ public final strictfp class StoreTest e
      @Test
      public void testGetMetadata() throws DataStoreException {
          final Metadata metadata;
-         try (Store store = open()) {
+         try (Store store = open(true)) {
              metadata = store.getMetadata();
          }
 -        final Extent extent = getSingleton(getSingleton(metadata.getIdentificationInfo()).getExtents());
 +        final Extent extent = getSingleton(((AbstractIdentification) getSingleton(metadata.getIdentificationInfo())).getExtents());
          final GeographicBoundingBox bbox = (GeographicBoundingBox) getSingleton(extent.getGeographicElements());
          assertEquals("westBoundLongitude", 50.23, bbox.getWestBoundLongitude(), STRICT);
          assertEquals("eastBoundLongitude", 50.31, bbox.getEastBoundLongitude(), STRICT);
@@@ -117,10 -120,10 +121,10 @@@
       */
      @Test
      public void testStaticFeatures() throws DataStoreException {
-         try (Store store = open()) {
+         try (Store store = open(true)) {
              verifyFeatureType(store.featureType, double[].class, 1);
              assertEquals("foliation", Foliation.TIME, store.foliation);
 -            final Iterator<Feature> it = store.features(false).iterator();
 +            final Iterator<AbstractFeature> it = store.features(false).iterator();
              assertPropertyEquals(it.next(), "a", "12:33:51", "12:36:11", new double[] {11, 2, 12, 3},        "walking", 1);
              assertPropertyEquals(it.next(), "b", "12:33:51", "12:36:51", new double[] {10, 2, 11, 3},        "walking", 2);
              assertPropertyEquals(it.next(), "a", "12:36:11", "12:36:51", new double[] {12, 3, 10, 3},        "walking", 2);
@@@ -146,13 -149,13 +150,13 @@@
      @Test
      public void testMovingFeatures() throws DataStoreException {
          isMovingFeature = true;
-         try (Store store = new Store(null, new StorageConnector(testData()))) {
+         try (Store store = open(false)) {
              verifyFeatureType(store.featureType, Polyline.class, Integer.MAX_VALUE);
              assertEquals("foliation", Foliation.TIME, store.foliation);
 -            final Iterator<Feature> it = store.features(false).iterator();
 +            final Iterator<AbstractFeature> it = store.features(false).iterator();
-             assertPropertyEquals(it.next(), "a", "12:33:51", "12:36:51", new double[] {11, 2, 12, 3, 10, 3}, singletonList("walking"), Arrays.asList(1, 2));
-             assertPropertyEquals(it.next(), "b", "12:33:51", "12:36:51", new double[] {10, 2, 11, 3},        singletonList("walking"), singletonList(2));
-             assertPropertyEquals(it.next(), "c", "12:33:51", "12:36:51", new double[] {12, 1, 10, 2, 11, 3}, singletonList("vehicle"), singletonList(1));
+             assertPropertyEquals(it.next(), "a", "12:33:51", "12:36:51", new double[] {11, 2, 12, 3, 10, 3}, List.of("walking"), List.of(1, 2));
+             assertPropertyEquals(it.next(), "b", "12:33:51", "12:36:51", new double[] {10, 2, 11, 3},        List.of("walking"), List.of(2));
+             assertPropertyEquals(it.next(), "c", "12:33:51", "12:36:51", new double[] {12, 1, 10, 2, 11, 3}, List.of("vehicle"), List.of(1));
              assertFalse(it.hasNext());
          }
      }
diff --cc storage/sis-storage/src/test/java/org/apache/sis/storage/aggregate/ConcatenatedFeatureSetTest.java
index cb882b1817,e507067c89..c743a128bc
--- a/storage/sis-storage/src/test/java/org/apache/sis/storage/aggregate/ConcatenatedFeatureSetTest.java
+++ b/storage/sis-storage/src/test/java/org/apache/sis/storage/aggregate/ConcatenatedFeatureSetTest.java
@@@ -60,10 -58,10 +59,10 @@@ public final strictfp class Concatenate
          builder.addAttribute(String.class).setName("name");
          builder.addAttribute(Integer.class).setName("population");
  
 -        final FeatureType ft = builder.build();
 +        final DefaultFeatureType ft = builder.build();
          final FeatureSet cfs = ConcatenatedFeatureSet.create(
-                 new MemoryFeatureSet(null, ft, Arrays.asList(ft.newInstance(), ft.newInstance())),
-                 new MemoryFeatureSet(null, ft, Arrays.asList(ft.newInstance())));
+                 new MemoryFeatureSet(null, ft, List.of(ft.newInstance(), ft.newInstance())),
+                 new MemoryFeatureSet(null, ft, List.of(ft.newInstance())));
  
          assertSame("getType()", ft, cfs.getType());
          assertEquals("features.count()", 3, cfs.features(false).count());
@@@ -109,10 -107,10 +108,10 @@@
          t1f2.setPropertyValue("value", 3);
          t1f2.setPropertyValue("label", "first-second");
  
-         final FeatureSet t1fs = new MemoryFeatureSet(null, t1, Arrays.asList(t1f1, t1f2));
+         final FeatureSet t1fs = new MemoryFeatureSet(null, t1, List.of(t1f1, t1f2));
  
          // Populate a feature set for second type.
 -        final Feature t2f1 = t2.newInstance();
 +        final AbstractFeature t2f1 = t2.newInstance();
          t2f1.setPropertyValue("value", 3);
          t2f1.setPropertyValue("label", "second-first");
  
@@@ -153,11 -151,11 +152,11 @@@
      public void noCommonType() {
          final FeatureTypeBuilder builder = new FeatureTypeBuilder();
          builder.setName("super");
 -        final FeatureType mockSuperType = builder.build();
 -        final FeatureType firstType  = builder.setSuperTypes(mockSuperType).setName("first").build();
 -        final FeatureType secondType = builder.clear().setName("second").build();
 +        final DefaultFeatureType mockSuperType = builder.build();
 +        final DefaultFeatureType firstType  = builder.setSuperTypes(mockSuperType).setName("first").build();
 +        final DefaultFeatureType secondType = builder.clear().setName("second").build();
-         final FeatureSet fs1 = new MemoryFeatureSet(null, firstType,  Collections.emptyList());
-         final FeatureSet fs2 = new MemoryFeatureSet(null, secondType, Collections.emptyList());
+         final FeatureSet fs1 = new MemoryFeatureSet(null, firstType,  List.of());
+         final FeatureSet fs2 = new MemoryFeatureSet(null, secondType, List.of());
          try {
              FeatureSet concatenation = ConcatenatedFeatureSet.create(fs1, fs2);
              fail("Concatenation succeeded despite the lack of common type. Result is:\n" + concatenation);
@@@ -182,8 -180,8 +181,8 @@@
              // This is the expected exception.
          }
          final FeatureTypeBuilder builder = new FeatureTypeBuilder().setName("mock");
 -        final FeatureType mockType = builder.build();
 +        final DefaultFeatureType mockType = builder.build();
-         final FeatureSet fs1 = new MemoryFeatureSet(null, mockType, Collections.emptyList());
+         final FeatureSet fs1 = new MemoryFeatureSet(null, mockType, List.of());
          final FeatureSet set = ConcatenatedFeatureSet.create(fs1);
          assertSame("A concatenation has been created from a single type.", fs1, set);
      }
diff --cc storage/sis-storage/src/test/java/org/apache/sis/storage/aggregate/JoinFeatureSetTest.java
index 8b3806694f,4c5191ff10..d10f93d9b9
--- a/storage/sis-storage/src/test/java/org/apache/sis/storage/aggregate/JoinFeatureSetTest.java
+++ b/storage/sis-storage/src/test/java/org/apache/sis/storage/aggregate/JoinFeatureSetTest.java
@@@ -71,8 -71,8 +71,8 @@@ public final strictfp class JoinFeature
          builder.addAttribute( String.class).setName(AttributeConvention.IDENTIFIER_PROPERTY);
          builder.addAttribute( String.class).setName("myNameSpace", "att1");
          builder.addAttribute(Integer.class).setName("myNameSpace", "att2");
 -        final FeatureType type1 = builder.build();
 +        final DefaultFeatureType type1 = builder.build();
-         featureSet1 = new MemoryFeatureSet(null, type1, Arrays.asList(
+         featureSet1 = new MemoryFeatureSet(null, type1, List.of(
                  newFeature1(type1, "fid_1_0", "str1",   1),
                  newFeature1(type1, "fid_1_1", "str2",   2),
                  newFeature1(type1, "fid_1_2", "str3",   3),
@@@ -83,8 -83,8 +83,8 @@@
          builder.addAttribute( String.class).setName(AttributeConvention.IDENTIFIER_PROPERTY);
          builder.addAttribute(Integer.class).setName("otherNameSpace", "att3");
          builder.addAttribute( Double.class).setName("otherNameSpace", "att4");
 -        final FeatureType type2 = builder.build();
 +        final DefaultFeatureType type2 = builder.build();
-         featureSet2 = new MemoryFeatureSet(null, type2, Arrays.asList(
+         featureSet2 = new MemoryFeatureSet(null, type2, List.of(
                  newFeature2(type2, "fid_2_0",  1, 10),
                  newFeature2(type2, "fid_2_1",  2, 20),
                  newFeature2(type2, "fid_2_2",  2, 30),
diff --cc storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Copyright.java
index f493afd918,22eb6f12cb..178e294276
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Copyright.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Copyright.java
@@@ -158,7 -159,7 +158,7 @@@ resp:   for (final DefaultResponsibilit
      @Override
      public Collection<Restriction> getUseConstraints() {
          if (license != null) {
-             return Arrays.asList(Restriction.COPYRIGHT, Restriction.valueOf("LICENCE"));
 -            return List.of(Restriction.COPYRIGHT, Restriction.LICENCE);
++            return List.of(Restriction.COPYRIGHT, Restriction.valueOf("LICENCE"));
          } else {
              return Collections.singleton(Restriction.COPYRIGHT);
          }
diff --cc storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/GroupAsPolylineOperation.java
index 166da7c6b1,562f91b22b..46c5825bb5
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/GroupAsPolylineOperation.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/GroupAsPolylineOperation.java
@@@ -79,7 -81,8 +78,8 @@@ final class GroupAsPolylineOperation ex
      /**
       * The expected result type to be returned by {@link #getResult()}.
       */
+     @SuppressWarnings("serial")
 -    private final AttributeType<?> result;
 +    private final DefaultAttributeType<?> result;
  
      /**
       * Creates a new operation which will look for geometries in the given feature association.
@@@ -100,9 -103,9 +100,9 @@@
       *
       * @param  geometries  accessor to the geometry implementation in use (Java2D, ESRI or JTS).
       */
 -    static <G> AttributeType<? extends G> getResult(final Geometries<G> geometries) {
 +    static <G> DefaultAttributeType<? extends G> getResult(final Geometries<G> geometries) {
-         return new DefaultAttributeType<>(Collections.singletonMap(NAME_KEY, AttributeConvention.ENVELOPE_PROPERTY),
-                 geometries.polylineClass, 1, 1, null);
+         return new DefaultAttributeType<>(Map.of(NAME_KEY, AttributeConvention.ENVELOPE_PROPERTY),
+                                           geometries.polylineClass, 1, 1, null);
      }
  
      /**
diff --cc storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Store.java
index 394babaa84,da0f246f30..ef48ccc435
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Store.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Store.java
@@@ -203,8 -203,8 +203,8 @@@ public class Store extends StaxDataStor
       * @deprecated We are not sure yet if we will keep this method. Decision is pending acquisition of
       *             more experience with the API proposed by {@link org.apache.sis.storage.FeatureSet}.
       */
-     @Deprecated
+     @Deprecated(since="0.8")
 -    public FeatureType getFeatureType(final String name) throws IllegalNameException {
 +    public DefaultFeatureType getFeatureType(final String name) throws IllegalNameException {
          return types.names.get(this, name);
      }
  
diff --cc storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java
index 0a8605abc6,c1807c50af..22dd795b66
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java
@@@ -100,8 -99,8 +99,8 @@@ final class Types 
       * @deprecated We are not sure yet if we will keep this field. Decision is pending acquisition of
       *             more experience with the API proposed by {@link org.apache.sis.storage.FeatureSet}.
       */
-     @Deprecated
+     @Deprecated(since="0.8")
 -    final FeatureNaming<FeatureType> names;
 +    final FeatureNaming<DefaultFeatureType> names;
  
      /**
       * Accessor to the geometry implementation in use (Java2D, ESRI or JTS).
diff --cc storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/WritableStore.java
index 44bb071d34,817ec098a6..7f5aeda791
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/WritableStore.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/WritableStore.java
@@@ -147,8 -147,8 +147,8 @@@ public final class WritableStore extend
       *
       * @see <a href="https://issues.apache.org/jira/browse/SIS-411">SIS-411</a>
       */
-     @Deprecated
+     @Deprecated(since="1.3")
 -    public synchronized void write(final Metadata metadata, final Stream<? extends Feature> features) throws DataStoreException {
 +    public synchronized void write(final Metadata metadata, final Stream<? extends AbstractFeature> features) throws DataStoreException {
          try {
              /*
               * If we created a reader for reading metadata, we need to close that reader now otherwise the call
diff --cc storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/WriterTest.java
index 6ca634509d,5e5de0203f..136d689e77
--- a/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/WriterTest.java
+++ b/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/WriterTest.java
@@@ -272,10 -271,10 +271,10 @@@ public final strictfp class WriterTest 
          point1.setPropertyValue("ageofdgpsdata", 55.55);
          point1.setPropertyValue("dgpsid",        256);
          point1.setPropertyValue("fix",           Fix.NONE);
-         point1.setPropertyValue("link",          Arrays.asList(new Link(new URI("http://first-address1.org")),
-                                                                new Link(new URI("http://first-address2.org")),
-                                                                new Link(new URI("http://first-address3.org"))));
+         point1.setPropertyValue("link",          List.of(new Link(new URI("http://first-address1.org")),
+                                                          new Link(new URI("http://first-address2.org")),
+                                                          new Link(new URI("http://first-address3.org"))));
 -        final Feature point3 = types.wayPoint.newInstance();
 +        final AbstractFeature point3 = types.wayPoint.newInstance();
          point3.setPropertyValue("sis:geometry",  new Point(35, 30));
          point3.setPropertyValue("time",          Instant.parse("2010-01-30T00:00:00Z"));
          point3.setPropertyValue("name",          "third point");
@@@ -294,12 -293,12 +293,12 @@@
          point3.setPropertyValue("ageofdgpsdata", 85.55);
          point3.setPropertyValue("dgpsid",        456);
          point3.setPropertyValue("fix",           Fix.THREE_DIMENSIONAL);
-         point3.setPropertyValue("link",          Arrays.asList(new Link(new URI("http://third-address1.org")),
-                                                                new Link(new URI("http://third-address2.org"))));
+         point3.setPropertyValue("link",          List.of(new Link(new URI("http://third-address1.org")),
+                                                          new Link(new URI("http://third-address2.org"))));
 -        final Feature point2 = types.wayPoint.newInstance();
 +        final AbstractFeature point2 = types.wayPoint.newInstance();
          point2.setPropertyValue("sis:geometry", new Point(25, 20));
-         final List<AbstractFeature> wayPoints = Arrays.asList(point1, point2, point3);
 -        final List<Feature> wayPoints = List.of(point1, point2, point3);
 -        final List<Feature> features;
++        final List<AbstractFeature> wayPoints = List.of(point1, point2, point3);
 +        final List<AbstractFeature> features;
          switch (type) {
              case WAY_POINT: {
                  features = wayPoints;
@@@ -314,11 -313,11 +313,11 @@@
                  route1.setPropertyValue("type",   "Route type");
                  route1.setPropertyValue("number", 7);
                  route1.setPropertyValue("rtept",  wayPoints);
-                 route1.setPropertyValue("link",   Arrays.asList(new Link(new URI("http://route-address1.org")),
-                                                                 new Link(new URI("http://route-address2.org")),
-                                                                 new Link(new URI("http://route-address3.org"))));
+                 route1.setPropertyValue("link",   List.of(new Link(new URI("http://route-address1.org")),
+                                                           new Link(new URI("http://route-address2.org")),
+                                                           new Link(new URI("http://route-address3.org"))));
 -                final Feature route2 = types.route.newInstance();
 +                final AbstractFeature route2 = types.route.newInstance();
-                 features = Arrays.asList(route1, route2);
+                 features = List.of(route1, route2);
                  break;
              }
              case TRACK: {
@@@ -333,12 -332,12 +332,12 @@@
                  track1.setPropertyValue("src",    "Track source");
                  track1.setPropertyValue("type",   "Track type");
                  track1.setPropertyValue("number", 7);
-                 track1.setPropertyValue("trkseg", Arrays.asList(seg1, seg2));
-                 track1.setPropertyValue("link",   Arrays.asList(new Link(new URI("http://track-address1.org")),
-                                                                 new Link(new URI("http://track-address2.org")),
-                                                                 new Link(new URI("http://track-address3.org"))));
+                 track1.setPropertyValue("trkseg", List.of(seg1, seg2));
+                 track1.setPropertyValue("link",   List.of(new Link(new URI("http://track-address1.org")),
+                                                           new Link(new URI("http://track-address2.org")),
+                                                           new Link(new URI("http://track-address3.org"))));
 -                final Feature track2 = types.track.newInstance();
 +                final AbstractFeature track2 = types.track.newInstance();
-                 features = Arrays.asList(track1, track2);
+                 features = List.of(track1, track2);
                  break;
              }
              default: throw new AssertionError(type);