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/11 16:38:49 UTC

[sis] branch geoapi-4.0 updated (d37c8ce013 -> 922983279c)

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

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


    from d37c8ce013 Use the safer Java 11 way to convert collection to array.
     new 7a733dc902 Resolve some of the cases (the easy ones) that where identified by a "Pending JDK9" comment.
     new d94732535a Resolve some more advanced cases that where identified by a "Pending JDK9" comment.
     new 922983279c Replace some `Collections` method calls by their `Map`, `Set` or `List` equivalent. The latter are immutable and check for null value.

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


Summary of changes:
 .../apache/sis/internal/gui/GUIUtilitiesTest.java  |  7 +-
 .../apache/sis/internal/book/CodeColorizer.java    |  7 +-
 .../org/apache/sis/coverage/SampleDimension.java   |  2 +-
 .../apache/sis/coverage/grid/GridDerivation.java   |  3 +-
 .../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 +-
 .../java/org/apache/sis/filter/LikeFilter.java     |  7 +-
 .../java/org/apache/sis/filter/PropertyValue.java  |  4 +-
 .../org/apache/sis/index/tree/PointTreeNode.java   |  2 +-
 .../org/apache/sis/index/tree/QuadTreeNode.java    |  4 +-
 .../internal/filter/sqlmm/GeometryConstructor.java |  3 +-
 .../sis/internal/filter/sqlmm/OneGeometry.java     |  3 +-
 .../sis/internal/filter/sqlmm/ST_Transform.java    |  3 +-
 .../sis/internal/filter/sqlmm/TwoGeometries.java   |  5 +-
 .../coverage/grid/BufferedGridCoverageTest.java    |  2 +-
 .../org/apache/sis/feature/FeatureFormatTest.java  |  4 +-
 .../apache/sis/feature/FeatureOperationsTest.java  |  4 +-
 .../org/apache/sis/feature/FeatureTestCase.java    |  6 +-
 .../feature/builder/AttributeTypeBuilderTest.java  |  4 +-
 .../org/apache/sis/filter/LogicalFilterTest.java   |  4 +-
 .../sis/internal/coverage/j2d/ColorizerTest.java   |  4 +-
 .../sis/internal/feature/GeometriesTestCase.java   |  8 +-
 .../sis/internal/filter/FunctionNamesTest.java     |  8 +-
 .../internal/filter/sqlmm/RegistryTestCase.java    |  6 +-
 .../internal/jaxb/cat/CodeListMarshallingTest.java |  4 +-
 .../sis/internal/jaxb/cat/EnumMarshallingTest.java |  4 +-
 .../metadata/ImplementationHelperTest.java         |  5 +-
 .../apache/sis/internal/metadata/MergerTest.java   | 11 +--
 .../java/org/apache/sis/metadata/HashCodeTest.java |  8 +-
 .../apache/sis/metadata/InformationMapTest.java    |  6 +-
 .../apache/sis/metadata/PropertyAccessorTest.java  | 11 ++-
 .../apache/sis/metadata/TreeNodeChildrenTest.java  |  4 +-
 .../apache/sis/metadata/TreeTableFormatTest.java   | 11 ++-
 .../java/org/apache/sis/metadata/ValueMapTest.java | 70 ++++++++--------
 .../sis/metadata/iso/CustomMetadataTest.java       |  4 +-
 .../apache/sis/metadata/iso/MarshallingTest.java   | 33 ++++----
 .../sis/metadata/iso/citation/CitationsTest.java   |  3 +-
 .../metadata/iso/citation/DefaultCitationTest.java | 10 +--
 .../metadata/iso/citation/DefaultContactTest.java  |  8 +-
 .../iso/citation/DefaultResponsibilityTest.java    |  4 +-
 .../constraint/DefaultLegalConstraintsTest.java    |  4 +-
 .../sis/metadata/iso/extent/DefaultExtentTest.java |  4 +-
 .../metadata/iso/quality/AbstractElementTest.java  |  4 +-
 .../iso/quality/DefaultDomainConsistencyTest.java  |  7 +-
 .../sis/metadata/sql/MetadataFallbackVerifier.java |  4 +-
 .../sis/metadata/sql/MetadataWriterTest.java       |  4 +-
 .../org/apache/sis/test/mock/MetadataMock.java     |  3 +-
 .../org/apache/sis/test/xml/PackageVerifier.java   | 49 +++++-------
 .../apache/sis/util/iso/DefaultScopedNameTest.java |  7 +-
 .../java/org/apache/sis/util/iso/TypesTest.java    |  3 +-
 .../org/apache/sis/xml/RenameListGenerator.java    |  9 +--
 .../apache/sis/xml/TransformingNamespacesTest.java |  9 +--
 .../org/apache/sis/xml/XLinkMarshallingTest.java   |  6 +-
 .../apache/sis/internal/map/ListChangeEvent.java   |  9 +--
 .../coverage/MultiResolutionCoverageLoader.java    |  2 +-
 .../apache/sis/internal/map/SEPortrayerTest.java   |  7 +-
 .../MultiResolutionCoverageLoaderTest.java         |  8 +-
 .../referencing/gazetteer/GazetteerFactory.java    |  4 +-
 .../apache/sis/geometry/WraparoundAdjustment.java  |  6 +-
 .../referencing/PositionalAccuracyConstant.java    |  4 +-
 .../provider/DatumShiftGridCompressed.java         |  4 +-
 .../java/org/apache/sis/io/wkt/WKTDictionary.java  |  8 +-
 .../sis/referencing/datum/DatumShiftGrid.java      |  4 +-
 .../factory/CommonAuthorityFactory.java            |  4 +-
 .../referencing/factory/sql/EPSGDataAccess.java    |  2 +-
 .../sis/referencing/factory/sql/EPSGFactory.java   |  2 +-
 .../operation/builder/ResidualGrid.java            |  5 +-
 .../sis/referencing/operation/matrix/Matrices.java |  2 +-
 .../sis/internal/jaxb/referencing/CodeTest.java    |  6 +-
 .../org/apache/sis/io/wkt/WKTDictionaryTest.java   | 12 +--
 .../referencing/AbstractIdentifiedObjectTest.java  |  4 +-
 .../sis/referencing/EPSGFactoryFallbackTest.java   | 24 +++---
 .../factory/CommonAuthorityFactoryTest.java        | 18 ++---
 .../factory/MultiAuthoritiesFactoryTest.java       | 30 ++++---
 .../operation/CoordinateOperationFinderTest.java   |  8 +-
 .../transform/MathTransformFactoryMock.java        |  3 +-
 .../transform/OperationMethodSetTest.java          | 10 +--
 .../report/CoordinateReferenceSystems.java         |  9 +--
 .../sis/test/integration/ConsistencyTest.java      |  7 +-
 .../apache/sis/test/integration/MetadataTest.java  | 92 +++++++++++-----------
 .../apache/sis/internal/jdk17/package-info.java    |  2 +-
 .../sis/internal/system/DefaultFactories.java      | 76 ++++++++++++------
 .../apache/sis/internal/system/package-info.java   |  2 +-
 .../java/org/apache/sis/internal/util/Cloner.java  |  8 +-
 .../apache/sis/internal/util/CollectionsExt.java   |  3 +-
 .../apache/sis/internal/util/FinalFieldSetter.java |  6 +-
 .../org/apache/sis/internal/util/Numerics.java     |  3 -
 .../main/java/org/apache/sis/math/Fraction.java    |  4 +-
 .../org/apache/sis/math/LinearlyDerivedVector.java |  8 +-
 .../java/org/apache/sis/math/SequenceVector.java   |  5 +-
 .../java/org/apache/sis/util/logging/Logging.java  | 83 ++++++++-----------
 .../apache/sis/internal/util/AbstractMapTest.java  |  3 +-
 .../sis/internal/util/CheckedArrayListTest.java    |  6 +-
 .../sis/internal/util/CollectionsExtTest.java      |  9 +--
 .../org/apache/sis/measure/SystemUnitTest.java     |  6 +-
 .../org/apache/sis/measure/UnitServicesTest.java   |  4 +-
 .../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 +-
 .../internal/storage/inflater/CopyFromBytes.java   |  8 +-
 .../apache/sis/storage/sql/ResourceDefinition.java |  6 +-
 .../sis/internal/storage/xml/AbstractProvider.java | 43 +++++-----
 .../sis/internal/storage/xml/StoreProvider.java    | 19 ++---
 .../sis/internal/storage/xml/package-info.java     |  2 +-
 .../apache/sis/storage/event/StoreListeners.java   | 26 +++---
 .../apache/sis/internal/storage/csv/StoreTest.java | 25 +++---
 .../sis/internal/storage/folder/StoreTest.java     |  6 +-
 .../aggregate/ConcatenatedFeatureSetTest.java      | 17 ++--
 .../sis/storage/aggregate/JoinFeatureSetTest.java  |  6 +-
 .../apache/sis/internal/storage/gpx/Copyright.java |  4 +-
 .../sis/internal/storage/gpx/StoreProvider.java    | 11 +--
 .../sis/internal/storage/gpx/package-info.java     |  2 +-
 .../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      |  4 +-
 .../sis/internal/storage/gpx/WriterTest.java       | 31 ++++----
 122 files changed, 579 insertions(+), 636 deletions(-)


[sis] 01/03: Resolve some of the cases (the easy ones) that where identified by a "Pending JDK9" comment.

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

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

commit 7a733dc902a2964c4c5f544e5663c6c717c1830d
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Sun Dec 11 13:53:43 2022 +0100

    Resolve some of the cases (the easy ones) that where identified by a "Pending JDK9" comment.
---
 .../src/main/java/org/apache/sis/coverage/SampleDimension.java    | 2 +-
 .../main/java/org/apache/sis/coverage/grid/GridDerivation.java    | 3 +--
 .../src/main/java/org/apache/sis/filter/BinaryFunction.java       | 3 +--
 .../src/main/java/org/apache/sis/filter/BinaryGeometryFilter.java | 3 +--
 .../src/main/java/org/apache/sis/filter/DistanceFilter.java       | 7 +++----
 .../src/main/java/org/apache/sis/filter/LikeFilter.java           | 7 ++-----
 .../src/main/java/org/apache/sis/index/tree/PointTreeNode.java    | 2 +-
 .../src/main/java/org/apache/sis/index/tree/QuadTreeNode.java     | 4 ++--
 .../org/apache/sis/internal/filter/sqlmm/GeometryConstructor.java | 3 +--
 .../java/org/apache/sis/internal/filter/sqlmm/OneGeometry.java    | 3 +--
 .../java/org/apache/sis/internal/filter/sqlmm/ST_Transform.java   | 3 +--
 .../java/org/apache/sis/internal/filter/sqlmm/TwoGeometries.java  | 5 ++---
 .../java/org/apache/sis/internal/filter/FunctionNamesTest.java    | 5 ++---
 .../sis/internal/map/coverage/MultiResolutionCoverageLoader.java  | 2 +-
 .../main/java/org/apache/sis/geometry/WraparoundAdjustment.java   | 6 +++---
 .../internal/referencing/provider/DatumShiftGridCompressed.java   | 4 ++--
 .../java/org/apache/sis/referencing/datum/DatumShiftGrid.java     | 4 ++--
 .../apache/sis/referencing/operation/builder/ResidualGrid.java    | 5 ++---
 .../org/apache/sis/referencing/operation/matrix/Matrices.java     | 2 +-
 .../src/main/java/org/apache/sis/internal/jdk17/package-info.java | 2 +-
 .../src/main/java/org/apache/sis/internal/util/Cloner.java        | 8 ++++----
 .../main/java/org/apache/sis/internal/util/CollectionsExt.java    | 3 +--
 .../main/java/org/apache/sis/internal/util/FinalFieldSetter.java  | 6 +++---
 .../src/main/java/org/apache/sis/internal/util/Numerics.java      | 3 ---
 core/sis-utility/src/main/java/org/apache/sis/math/Fraction.java  | 4 ++--
 .../src/main/java/org/apache/sis/math/LinearlyDerivedVector.java  | 8 ++++----
 .../src/main/java/org/apache/sis/math/SequenceVector.java         | 5 ++---
 .../org/apache/sis/internal/storage/inflater/CopyFromBytes.java   | 8 ++++----
 .../main/java/org/apache/sis/storage/sql/ResourceDefinition.java  | 6 ++----
 29 files changed, 53 insertions(+), 73 deletions(-)

diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/SampleDimension.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/SampleDimension.java
index 82b27f1df3..755e289e6d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/SampleDimension.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/SampleDimension.java
@@ -1067,7 +1067,7 @@ public class SampleDimension implements Serializable {
             final double scale     = Δvalue / Δsample;
             final TransferFunction transferFunction = new TransferFunction();
             transferFunction.setScale(scale);
-            transferFunction.setOffset(minValue - scale * minSample);               // TODO: use Math.fma with JDK9.
+            transferFunction.setOffset(Math.fma(-scale, minSample, minValue));
             return addQuantitative(name, samples, transferFunction.getTransform(),
                     (converted instanceof MeasurementRange<?>) ? ((MeasurementRange<?>) converted).unit() : null);
         }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridDerivation.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridDerivation.java
index 26ab0221c2..5d3050746a 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridDerivation.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridDerivation.java
@@ -714,8 +714,7 @@ public class GridDerivation {
                         if (s > 1) {                                                 // Also for skipping NaN values.
                             final int i = (modifiedDimensions != null) ? modifiedDimensions[k] : k;
                             affine.setElement(i, i, s);
-                            affine.setElement(i, dimension, extent.getLow(i) - scaledExtent.getLow(i) * s);
-                            // TODO: use Math.fma with JDK9.
+                            affine.setElement(i, dimension, Math.fma(-s, scaledExtent.getLow(i), extent.getLow(i)));
                         }
                     }
                     toBase = MathTransforms.linear(affine);
diff --git a/core/sis-feature/src/main/java/org/apache/sis/filter/BinaryFunction.java b/core/sis-feature/src/main/java/org/apache/sis/filter/BinaryFunction.java
index f79897a5ba..78eeb6c864 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/BinaryFunction.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/BinaryFunction.java
@@ -17,7 +17,6 @@
 package org.apache.sis.filter;
 
 import java.util.List;
-import java.util.Arrays;
 import java.util.Collection;
 import java.math.BigInteger;
 import java.math.BigDecimal;
@@ -101,7 +100,7 @@ abstract class BinaryFunction<R,V1,V2> extends Node {
      * @return a list of size 2 containing the two expressions.
      */
     public List<Expression<? super R, ?>> getExpressions() {
-        return Arrays.asList(expression1, expression2);         // TODO: use List.of(…) with JDK9.
+        return List.of(expression1, expression2);
     }
 
     /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/filter/BinaryGeometryFilter.java b/core/sis-feature/src/main/java/org/apache/sis/filter/BinaryGeometryFilter.java
index 741ebfc587..71a98683d5 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/BinaryGeometryFilter.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/BinaryGeometryFilter.java
@@ -17,7 +17,6 @@
 package org.apache.sis.filter;
 
 import java.util.List;
-import java.util.Arrays;
 import javax.measure.Unit;
 import javax.measure.IncommensurableException;
 import org.opengis.util.FactoryException;
@@ -171,7 +170,7 @@ abstract class BinaryGeometryFilter<R,G> extends FilterNode<R> implements Spatia
      */
     @Override
     public List<Expression<? super R, ?>> getExpressions() {
-        return Arrays.asList(original(expression1), original(expression2));     // TODO: use List.of(…) with JDK9.
+        return List.of(original(expression1), original(expression2));
     }
 
     /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/filter/DistanceFilter.java b/core/sis-feature/src/main/java/org/apache/sis/filter/DistanceFilter.java
index 4c75c4d969..16f96844d7 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/DistanceFilter.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/DistanceFilter.java
@@ -17,7 +17,6 @@
 package org.apache.sis.filter;
 
 import java.util.List;
-import java.util.Arrays;
 import java.util.Collection;
 import javax.measure.Quantity;
 import javax.measure.quantity.Length;
@@ -115,8 +114,8 @@ final class DistanceFilter<R,G> extends BinaryGeometryFilter<R,G> implements Dis
      */
     @Override
     public List<Expression<? super R, ?>> getExpressions() {
-        return Arrays.asList(original(expression1), original(expression2),          // TODO: use List.of(…) with JDK9.
-                             new LeafExpression.Literal<>(distance));
+        return List.of(original(expression1), original(expression2),
+                       new LeafExpression.Literal<>(distance));
     }
 
     /**
@@ -125,7 +124,7 @@ final class DistanceFilter<R,G> extends BinaryGeometryFilter<R,G> implements Dis
      */
     @Override
     protected Collection<?> getChildren() {
-        return Arrays.asList(original(expression1), original(expression2), distance);   // TODO: use List.of(…) with JDK9.
+        return List.of(original(expression1), original(expression2), distance);
     }
 
     /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/filter/LikeFilter.java b/core/sis-feature/src/main/java/org/apache/sis/filter/LikeFilter.java
index d0cddd88f7..e588e7c4b1 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/LikeFilter.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/LikeFilter.java
@@ -17,7 +17,6 @@
 package org.apache.sis.filter;
 
 import java.util.List;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.regex.Pattern;
 import org.apache.sis.util.ArgumentChecks;
@@ -169,8 +168,7 @@ final class LikeFilter<R> extends FilterNode<R> implements LikeOperator<R>, Opti
      */
     @Override
     protected Collection<?> getChildren() {
-        // TODO: use List.of(…) in JDK9.
-        return Arrays.asList(expression, pattern);
+        return List.of(expression, pattern);
     }
 
     /**
@@ -178,8 +176,7 @@ final class LikeFilter<R> extends FilterNode<R> implements LikeOperator<R>, Opti
      */
     @Override
     public List<Expression<? super R, ?>> getExpressions() {
-        // TODO: use List.of(…) in JDK9.
-        return Arrays.asList(expression, new LeafExpression.Literal<>(pattern));
+        return List.of(expression, new LeafExpression.Literal<>(pattern));
     }
 
     /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/index/tree/PointTreeNode.java b/core/sis-feature/src/main/java/org/apache/sis/index/tree/PointTreeNode.java
index 72201fce19..f772722496 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/index/tree/PointTreeNode.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/index/tree/PointTreeNode.java
@@ -96,7 +96,7 @@ abstract class PointTreeNode implements Cloneable, Serializable {
     static void enterQuadrant(final double[] region, final int quadrant) {
         final int n = region.length >>> 1;
         for (int i = n; --i >= 0;) {
-            region[i] += factor(quadrant, i) * (region[i+n] *= 0.5);    // TODO: use Math.fma with JDK9.
+            region[i] = Math.fma(factor(quadrant, i), region[i+n] *= 0.5, region[i]);
         }
     }
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/index/tree/QuadTreeNode.java b/core/sis-feature/src/main/java/org/apache/sis/index/tree/QuadTreeNode.java
index fe0d87ccb9..3f2a609697 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/index/tree/QuadTreeNode.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/index/tree/QuadTreeNode.java
@@ -91,7 +91,7 @@ final class QuadTreeNode extends PointTreeNode {
             case NE: child = ne; break;
             case SW: child = sw; break;
             case SE: child = se; break;
-            default: throw new IndexOutOfBoundsException(/*quadrant*/);     // TODO: uncomment with JDK9.
+            default: throw new IndexOutOfBoundsException(quadrant);
         }
         return child;
     }
@@ -109,7 +109,7 @@ final class QuadTreeNode extends PointTreeNode {
             case NE: ne = child; break;
             case SW: sw = child; break;
             case SE: se = child; break;
-            default: throw new IndexOutOfBoundsException(/*quadrant*/);     // TODO: uncomment with JDK9.
+            default: throw new IndexOutOfBoundsException(quadrant);
         }
     }
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/GeometryConstructor.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/GeometryConstructor.java
index dac8fcd473..23c0f5e460 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/GeometryConstructor.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/GeometryConstructor.java
@@ -18,7 +18,6 @@ package org.apache.sis.internal.filter.sqlmm;
 
 import java.nio.ByteBuffer;
 import java.util.List;
-import java.util.Arrays;
 import java.util.Collections;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.apache.sis.internal.feature.Geometries;
@@ -87,7 +86,7 @@ class GeometryConstructor<R,G> extends FunctionWithSRID<R> {
         if (srid == null) {
             return Collections.singletonList(geometry);
         }
-        return Arrays.asList(geometry, srid);                   // TODO: use List.of(…) with JDK9.
+        return List.of(geometry, srid);
     }
 
     /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/OneGeometry.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/OneGeometry.java
index d219252ed3..ce89681955 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/OneGeometry.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/OneGeometry.java
@@ -16,7 +16,6 @@
  */
 package org.apache.sis.internal.filter.sqlmm;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.Collections;
 import org.apache.sis.internal.feature.Geometries;
@@ -133,7 +132,7 @@ class OneGeometry<R,G> extends SpatialFunction<R> {
          */
         @Override
         public List<Expression<? super R, ?>> getParameters() {
-            return Arrays.asList(unwrap(geometry), argument);       // TODO: use List.of(…) with JDK9.
+            return List.of(unwrap(geometry), argument);
         }
 
         /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Transform.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Transform.java
index f60c689127..a7bbb3de7d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Transform.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Transform.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.filter.sqlmm;
 
 import java.util.List;
-import java.util.Arrays;
 import org.opengis.util.FactoryException;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.opengis.referencing.operation.TransformException;
@@ -107,7 +106,7 @@ final class ST_Transform<R,G> extends FunctionWithSRID<R> {
      */
     @Override
     public List<Expression<? super R, ?>> getParameters() {
-        return Arrays.asList(unwrap(geometry), srid);             // TODO: use List.of(…) with JDK9.
+        return List.of(unwrap(geometry), srid);
     }
 
     /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/TwoGeometries.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/TwoGeometries.java
index ccb6e1b983..8a29bdf3c5 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/TwoGeometries.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/TwoGeometries.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.filter.sqlmm;
 
 import java.util.List;
-import java.util.Arrays;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.opengis.referencing.operation.TransformException;
 import org.apache.sis.filter.Optimization;
@@ -121,7 +120,7 @@ class TwoGeometries<R,G> extends SpatialFunction<R> {
      */
     @Override
     public List<Expression<? super R, ?>> getParameters() {
-        return Arrays.asList(unwrap(geometry1), unwrap(geometry2));     // TODO: use List.of(…) with JDK9.
+        return List.of(unwrap(geometry1), unwrap(geometry2));
     }
 
     /**
@@ -177,7 +176,7 @@ class TwoGeometries<R,G> extends SpatialFunction<R> {
          */
         @Override
         public List<Expression<? super R, ?>> getParameters() {
-            return Arrays.asList(unwrap(geometry1), unwrap(geometry2), argument);   // TODO: use List.of(…) with JDK9.
+            return List.of(unwrap(geometry1), unwrap(geometry2), argument);
         }
 
         /**
diff --git a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/FunctionNamesTest.java b/core/sis-feature/src/test/java/org/apache/sis/internal/filter/FunctionNamesTest.java
index ab56a4d13f..cf38988806 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/FunctionNamesTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/internal/filter/FunctionNamesTest.java
@@ -106,7 +106,7 @@ public final strictfp class FunctionNamesTest extends TestCase {
      */
     @Test
     public void verifyLiteral() {
-        final Literal<Object,Object> expression = new Literal<Object,Object>() {
+        final var expression = new Literal<Object,Object>() {
             @Override public Object getValue() {return null;}
             @Override public <N> Expression<Object, N> toValueType(Class<N> target) {
                 throw new UnsupportedOperationException();
@@ -120,8 +120,7 @@ public final strictfp class FunctionNamesTest extends TestCase {
      */
     @Test
     public void verifyValueReference() {
-        // TODO: use diamond operator with JDK9.
-        final ValueReference<Object,Object> expression = new ValueReference<Object,Object>() {
+        final var expression = new ValueReference<Object,Object>() {
             @Override public String getXPath()      {return null;}
             @Override public Object apply(Object o) {return null;}
             @Override public <N> Expression<Object,N> toValueType(Class<N> target) {
diff --git a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/coverage/MultiResolutionCoverageLoader.java b/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/coverage/MultiResolutionCoverageLoader.java
index bb54bff5e7..8c442d8746 100644
--- a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/coverage/MultiResolutionCoverageLoader.java
+++ b/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/coverage/MultiResolutionCoverageLoader.java
@@ -237,7 +237,7 @@ dimensions: for (int j=0; j<tgtDim; j++) {
                          */
                         e = 0;
                         for (int k=0; k<objDim; k++) {
-                            e += d.getElement(j,k) * m.getElement(k,i);     // TODO: use Math.fma(…) with JDK9.
+                            e = Math.fma(d.getElement(j,k), m.getElement(k,i), e);
                         }
                     }
                     sum += e * e;
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/geometry/WraparoundAdjustment.java b/core/sis-referencing/src/main/java/org/apache/sis/geometry/WraparoundAdjustment.java
index d7948b7eb0..4526203cb7 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/geometry/WraparoundAdjustment.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/geometry/WraparoundAdjustment.java
@@ -488,8 +488,8 @@ public class WraparoundAdjustment {
                             shifted = new GeneralEnvelope(areaOfInterest);
                         }
                         areaOfInterest = shifted;           // `shifted` may have been set before the loop.
-                        shifted.setRange(i, lower + lowerCycles * period,   // TODO: use Math.fma in JDK9.
-                                            upper + upperCycles * period);
+                        shifted.setRange(i, Math.fma(period, lowerCycles, lower),
+                                            Math.fma(period, upperCycles, upper));
                     }
                 }
             }
@@ -553,7 +553,7 @@ public class WraparoundAdjustment {
                             shifted = new GeneralDirectPosition(pointOfInterest);
                         }
                         pointOfInterest = shifted;                         // `shifted` may have been set before the loop.
-                        shifted.setOrdinate(i, x + delta * period);        // TODO: use Math.fma in JDK9.
+                        shifted.setOrdinate(i, Math.fma(period, delta, x));
                     }
                 }
             }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/DatumShiftGridCompressed.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/DatumShiftGridCompressed.java
index 7a7d49b64f..6ad77c7088 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/DatumShiftGridCompressed.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/DatumShiftGridCompressed.java
@@ -212,8 +212,8 @@ final class DatumShiftGridCompressed<C extends Quantity<C>, T extends Quantity<T
             final double r01 = values[p00 + 1];                     // Naming convention: ryx (row index first, like matrix).
             final double r10 = values[p10    ];
             final double r11 = values[p10 + 1];
-            final double r0x = r00 + gridX * (dx = r01 - r00);      // TODO: use Math.fma on JDK9.
-            final double r1x = r10 + gridX * (dy = r11 - r10);      // Not really "dy" measurement yet, will become dy later.
+            final double r0x = Math.fma(gridX, dx = r01 - r00, r00);
+            final double r1x = Math.fma(gridX, dy = r11 - r10, r10);  // Not really "dy" measurement yet, will become dy later.
             vector[dim] = (gridY * (r1x - r0x) + r0x) * scale + averages[dim];
             if (derivative) {
                 if (skipX) {
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DatumShiftGrid.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DatumShiftGrid.java
index 0d1b02f53c..40e4749e41 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DatumShiftGrid.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DatumShiftGrid.java
@@ -553,8 +553,8 @@ public abstract class DatumShiftGrid<C extends Quantity<C>, T extends Quantity<T
             final double r01 = getCellValue(dim, ix+1, iy  );       // Naming convention: ryx (row index first, like matrix).
             final double r10 = getCellValue(dim, ix,   iy+1);
             final double r11 = getCellValue(dim, ix+1, iy+1);
-            final double r0x = r00 + gridX * (dx = r01 - r00);      // TODO: use Math.fma on JDK9.
-            final double r1x = r10 + gridX * (dy = r11 - r10);      // Not really "dy" measurement yet, will become dy later.
+            final double r0x = Math.fma(gridX, dx = r01 - r00, r00);
+            final double r1x = Math.fma(gridX, dy = r11 - r10, r10);    // Not really "dy" measurement yet, will become dy later.
             vector[dim] = gridY * (r1x - r0x) + r0x;
             if (derivative) {
                 /*
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/ResidualGrid.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/ResidualGrid.java
index 301ad0670d..1a8d7df858 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/ResidualGrid.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/ResidualGrid.java
@@ -327,9 +327,8 @@ final class ResidualGrid extends DatumShiftGrid<Dimensionless,Dimensionless> {
             if ((x | y) < 0 || x >= scanlineStride) {
                 throw new IndexOutOfBoundsException();
             }
-            return c0 * (x + getCellValue(0, x, y)) +                // TODO: use Math.fma with JDK9.
-                   c1 * (y + getCellValue(1, x, y)) +
-                   c2;
+            return Math.fma(x + getCellValue(0, x, y), c0,
+                   Math.fma(y + getCellValue(1, x, y), c1, c2));
         }
 
         /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/Matrices.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/Matrices.java
index a5ba531d0f..6ba7a811a9 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/Matrices.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/Matrices.java
@@ -889,7 +889,7 @@ public final class Matrices extends Static {
                 if (anchor != null) {
                     final double p = anchor[j];
                     double e = matrix.getElement(j, srcDim);
-                    changed |= (e != (e = (e-p)*rescale + p));      // TODO: use Math.fma in JDK9.
+                    changed |= (e != (e = Math.fma(rescale, e-p, p)));
                     matrix.setElement(j, srcDim, e);
                 }
             }
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/jdk17/package-info.java b/core/sis-utility/src/main/java/org/apache/sis/internal/jdk17/package-info.java
index c766349852..f2d2fc1a75 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/jdk17/package-info.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/jdk17/package-info.java
@@ -16,7 +16,7 @@
  */
 
 /**
- * Place-holder for JDK9 classes that do not exist in JDK8.
+ * Place-holder for classes that do not exist in JDK 11.
  *
  * <STRONG>Do not use!</STRONG>
  *
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/util/Cloner.java b/core/sis-utility/src/main/java/org/apache/sis/internal/util/Cloner.java
index 4e9f314d36..f6f6b67758 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/Cloner.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/Cloner.java
@@ -22,6 +22,7 @@ import java.lang.reflect.Array;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.InaccessibleObjectException;
 import org.apache.sis.util.Workaround;
 import org.apache.sis.util.resources.Errors;
 
@@ -31,7 +32,7 @@ import org.apache.sis.util.resources.Errors;
  * for the lack of public {@code clone()} method in the {@link Cloneable} interface.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.1
+ * @version 1.4
  * @since   0.3
  * @module
  */
@@ -133,7 +134,7 @@ public final class Cloner {
         if (componentType != null) {
             return cloneArray(object, componentType);
         }
-        SecurityException security = null;
+        RuntimeException security = null;
         result = object;
         try {
             if (valueType != type) {
@@ -146,9 +147,8 @@ public final class Cloner {
                  * in order to report it in case of failure.
                  */
                 if (!Modifier.isPublic(method.getDeclaringClass().getModifiers())) try {
-                    // TODO: use trySetAccessible() with JDK9.
                     method.setAccessible(true);
-                } catch (SecurityException e) {
+                } catch (SecurityException | InaccessibleObjectException e) {
                     security = e;
                 }
             }
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/util/CollectionsExt.java b/core/sis-utility/src/main/java/org/apache/sis/internal/util/CollectionsExt.java
index 0803fdeb29..239e764442 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/CollectionsExt.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/CollectionsExt.java
@@ -477,8 +477,7 @@ public final class CollectionsExt extends Static {
                          * implements CheckedContainer is not a goal here, and is actually unsafe since we have
                          * no guarantee (except Javadoc contract) that the <E> in CheckedContainer<E> is really
                          * the same than in Collection<E>.  We tolerate this hole for now because we documented
-                         * the restriction in CheckedContainer javadoc, but future version may replace this block
-                         * by JDK9 collections.
+                         * the restriction in CheckedContainer javadoc.
                          */
                         @SuppressWarnings("unchecked")       // Okay if collection is compliant with CheckedContainer contract.
                         final E[] array = (E[]) Array.newInstance(((CheckedContainer<E>) list).getElementType(), length);
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/util/FinalFieldSetter.java b/core/sis-utility/src/main/java/org/apache/sis/internal/util/FinalFieldSetter.java
index 039dde3594..8116bd10ee 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/FinalFieldSetter.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/FinalFieldSetter.java
@@ -18,6 +18,7 @@ package org.apache.sis.internal.util;
 
 import java.lang.reflect.Field;
 import java.io.InvalidClassException;
+import java.lang.reflect.InaccessibleObjectException;
 import org.apache.sis.internal.system.Modules;
 
 
@@ -49,7 +50,7 @@ import org.apache.sis.internal.system.Modules;
  * since {@code java.security.AccessController} has been deprecated in Java 17.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.2
+ * @version 1.4
  *
  * @see <a href="https://openjdk.java.net/jeps/411">JEP-411</a>
  * @see <a href="https://issues.apache.org/jira/browse/SIS-525">SIS-525</a>
@@ -123,7 +124,6 @@ public final class FinalFieldSetter {
      * @return the exception to throw.
      */
     public static RuntimeException cloneFailure(final ReflectiveOperationException cause) {
-        return new RuntimeException(cause);
-        // TODO: use InaccessibleObjectException in JDK9.
+        return (InaccessibleObjectException) new InaccessibleObjectException().initCause(cause);
     }
 }
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/util/Numerics.java b/core/sis-utility/src/main/java/org/apache/sis/internal/util/Numerics.java
index 63df579148..ca272ef6ce 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/Numerics.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/Numerics.java
@@ -270,9 +270,6 @@ public final class Numerics extends Static {
      * @return {@code value} × {@code multiplier} / {@code divisor} rounded toward zero.
      */
     public static long multiplyDivide(final long value, final long multiplier, final long divisor) {
-        // TODO: uncomment with JDK9
-//      final long high = Math.multiplyHigh(value, multiplier);
-//      return Math.multiplyExact(value * multiplier / divisor, high);
         return Math.multiplyExact(value, multiplier) / divisor;
     }
 
diff --git a/core/sis-utility/src/main/java/org/apache/sis/math/Fraction.java b/core/sis-utility/src/main/java/org/apache/sis/math/Fraction.java
index 9dddc00600..2cc1c33a16 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/math/Fraction.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/math/Fraction.java
@@ -637,8 +637,8 @@ public final class Fraction extends Number implements Comparable<Fraction>, Seri
                 case '⁄':
                 case '/':
                 case '∕': {
-                    numerator   = Integer.parseInt(s.substring(0,i));       // TODO: revisit with JDK9.
-                    denominator = Integer.parseInt(s.substring(i+1));
+                    numerator   = Integer.parseInt(s, 0, i, 10);
+                    denominator = Integer.parseInt(s, i+1, length, 10);
                     return;
                 }
             }
diff --git a/core/sis-utility/src/main/java/org/apache/sis/math/LinearlyDerivedVector.java b/core/sis-utility/src/main/java/org/apache/sis/math/LinearlyDerivedVector.java
index 573a447299..3db222e23b 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/math/LinearlyDerivedVector.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/math/LinearlyDerivedVector.java
@@ -136,7 +136,7 @@ final class LinearlyDerivedVector extends Vector implements Serializable {
      */
     @Override
     public double doubleValue(final int index) {
-        return base.doubleValue(index) * scale + offset;        // TODO: use Math.fma in JDK9.
+        return Math.fma(base.doubleValue(index), scale, offset);
     }
 
     /**
@@ -218,7 +218,7 @@ final class LinearlyDerivedVector extends Vector implements Serializable {
      */
     private Number convert(Number value) {
         if (value != null) {
-            value = value.doubleValue() * scale + offset;       // TODO: use Math.fma in JDK9.
+            value = Math.fma(value.doubleValue(), scale, offset);
         }
         return value;
     }
@@ -320,7 +320,7 @@ final class LinearlyDerivedVector extends Vector implements Serializable {
      */
     @Override
     final Vector createTransform(final double s, final double t) {
-        return base.transform(scale * s, offset * s + t);            // TODO: use Math.fma with JDK9.
+        return base.transform(scale * s, Math.fma(offset, s, t));
     }
 
     /**
@@ -332,7 +332,7 @@ final class LinearlyDerivedVector extends Vector implements Serializable {
     public double[] doubleValues() {
         final double[] array = base.doubleValues();
         for (int i=0; i<array.length; i++) {
-            array[i] = array[i] * scale + offset;           // TODO: use Math.fma with JDK9.
+            array[i] = Math.fma(array[i], scale, offset);
         }
         return array;
     }
diff --git a/core/sis-utility/src/main/java/org/apache/sis/math/SequenceVector.java b/core/sis-utility/src/main/java/org/apache/sis/math/SequenceVector.java
index 69790dd593..be4bb0b063 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/math/SequenceVector.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/math/SequenceVector.java
@@ -69,7 +69,7 @@ abstract class SequenceVector extends Vector implements Serializable {
     @Override
     final Vector createTransform(final double scale, final double offset) {
         return new Doubles(Double.class,
-                doubleValue(0) * scale + offset,                // TODO: use Math.fma with JDK9.
+                Math.fma(doubleValue(0), scale, offset),
                 increment(0).doubleValue() * scale, length);
     }
 
@@ -195,8 +195,7 @@ abstract class SequenceVector extends Vector implements Serializable {
         /** Computes the value at the given index. */
         @Override public final double doubleValue(final int index) {
             ArgumentChecks.ensureValidIndex(length, index);
-            return first + increment*index;
-            // TODO: use Math.fma with JDK9.
+            return Math.fma(index, increment, first);
         }
 
         /** Returns the string representation of the value at the given index. */
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/CopyFromBytes.java b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/CopyFromBytes.java
index 29a1a9a891..63574d3193 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/CopyFromBytes.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/CopyFromBytes.java
@@ -289,7 +289,7 @@ abstract class CopyFromBytes extends Inflater {
             }
             final int n = elementsPerChunk * Short.BYTES;
             input.ensureBufferContains(n);
-            bank.put((ShortBuffer) source.asShortBuffer().limit(elementsPerChunk));    // TODO: remove cast in JDK9.
+            bank.put(source.asShortBuffer().limit(elementsPerChunk));
             source.position(source.position() + n);
         }
     }
@@ -329,7 +329,7 @@ abstract class CopyFromBytes extends Inflater {
             }
             final int n = elementsPerChunk * Integer.BYTES;
             input.ensureBufferContains(n);
-            bank.put((IntBuffer) source.asIntBuffer().limit(elementsPerChunk));        // TODO: remove cast in JDK9.
+            bank.put(source.asIntBuffer().limit(elementsPerChunk));
             source.position(source.position() + n);
         }
     }
@@ -369,7 +369,7 @@ abstract class CopyFromBytes extends Inflater {
             }
             final int n = elementsPerChunk * Float.BYTES;
             input.ensureBufferContains(n);
-            bank.put((FloatBuffer) source.asFloatBuffer().limit(elementsPerChunk));    // TODO: remove cast in JDK9.
+            bank.put(source.asFloatBuffer().limit(elementsPerChunk));
             source.position(source.position() + n);
         }
     }
@@ -409,7 +409,7 @@ abstract class CopyFromBytes extends Inflater {
             }
             final int n = elementsPerChunk * Double.BYTES;
             input.ensureBufferContains(n);
-            bank.put((DoubleBuffer) source.asDoubleBuffer().limit(elementsPerChunk));  // TODO: remove cast in JDK9.
+            bank.put(source.asDoubleBuffer().limit(elementsPerChunk));
             source.position(source.position() + n);
         }
     }
diff --git a/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/ResourceDefinition.java b/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/ResourceDefinition.java
index 75938e791b..61e36a2cb8 100644
--- a/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/ResourceDefinition.java
+++ b/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/ResourceDefinition.java
@@ -17,7 +17,6 @@
 package org.apache.sis.storage.sql;
 
 import java.util.Map;
-import java.util.HashMap;
 import java.util.Objects;
 import java.util.Optional;
 import org.opengis.util.NameSpace;
@@ -166,9 +165,8 @@ public final class ResourceDefinition {
         final NameFactory factory = DefaultFactories.forBuildin(NameFactory.class);
         NameSpace ns = tableNS;
         if (ns == null) {
-            final Map<String,String> properties = new HashMap<>(4);     // TODO: use Map.of with JDK9.
-            properties.put("separator",      ".");
-            properties.put("separator.head", ":");
+            var properties = Map.of("separator",      ".",
+                                    "separator.head", ":");
             tableNS = ns = factory.createNameSpace(factory.createLocalName(null, "database"), properties);
         }
         return new ResourceDefinition(factory.createGenericName(ns, names), null);


[sis] 02/03: Resolve some more advanced cases that where identified by a "Pending JDK9" comment.

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

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

commit d94732535a5210151e4c32017a282ede8ffae08f
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Sun Dec 11 15:59:24 2022 +0100

    Resolve some more advanced cases that where identified by a "Pending JDK9" comment.
---
 .../java/org/apache/sis/io/wkt/WKTDictionary.java  |  8 +--
 .../sis/internal/system/DefaultFactories.java      | 76 ++++++++++++++------
 .../apache/sis/internal/system/package-info.java   |  2 +-
 .../java/org/apache/sis/util/logging/Logging.java  | 83 ++++++++--------------
 .../sis/internal/storage/xml/AbstractProvider.java | 43 ++++++-----
 .../sis/internal/storage/xml/StoreProvider.java    | 19 ++---
 .../sis/internal/storage/xml/package-info.java     |  2 +-
 .../apache/sis/storage/event/StoreListeners.java   | 26 ++++---
 .../sis/internal/storage/gpx/StoreProvider.java    | 11 +--
 .../sis/internal/storage/gpx/package-info.java     |  2 +-
 .../storage/xml/stream/StaxDataStoreProvider.java  | 12 ++--
 .../internal/storage/xml/stream/package-info.java  |  2 +-
 12 files changed, 144 insertions(+), 142 deletions(-)

diff --git a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/WKTDictionary.java b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/WKTDictionary.java
index 04268b3420..e7ac6de1f3 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/WKTDictionary.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/WKTDictionary.java
@@ -938,19 +938,13 @@ public class WKTDictionary extends GeodeticAuthorityFactory {
                      * Verify if an existing collection (assigned to another type) provides the same values.
                      * If we find one, share the same instance for reducing memory usage.
                      */
-                    boolean share = false;
                     for (final Set<String> other : codeCaches.values()) {
                         if (codes.equals(other)) {
                             codes = other;
-                            share = true;
                             break;
                         }
                     }
-                    if (!share) {
-                        // TODO: replace by Set.copyOf(Set) in JDK9 and remove the `share` flag
-                        // (not needed because Set.copyOf(Set) does the verification itself).
-                        codes = CollectionsExt.unmodifiableOrCopy(codes);
-                    }
+                    codes = Set.copyOf(codes);
                     codeCaches.put(type, codes);
                 }
             } finally {
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java b/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java
index b2ac1610e0..6cf286badc 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java
@@ -22,6 +22,7 @@ import java.util.HashSet;
 import java.util.IdentityHashMap;
 import java.util.ServiceLoader;
 import java.util.ServiceConfigurationError;
+import java.util.function.Consumer;
 import org.apache.sis.util.logging.Logging;
 
 import static java.util.logging.Logger.getLogger;
@@ -34,7 +35,7 @@ import static java.util.logging.Logger.getLogger;
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Guilhem Legal (Geomatys)
- * @version 1.2
+ * @version 1.4
  *
  * @see <a href="https://jcp.org/en/jsr/detail?id=330">JSR-330</a>
  *
@@ -207,33 +208,62 @@ public final class DefaultFactories extends SystemListener {
      * @since 0.8
      */
     public static ClassLoader getContextClassLoader() throws SecurityException {
-        final Thread thread = Thread.currentThread();
-        ClassLoader loader = thread.getContextClassLoader();
-        final Set<ClassLoader> parents = new HashSet<>();
-        for (ClassLoader c = loader; c != null; c = c.getParent()) {
-            parents.add(c);
+        final Walker walker = new Walker();
+        return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk((stream) -> {
+            stream.forEach(walker);
+            return walker.loader;
+        });
+    }
+
+    /**
+     * Action to be executed for each stack frame inspected by {@link #getContextClassLoader()}.
+     * The action is initialized to the context class loader of current thread.
+     * Then it checks if the class loader should be replaced by another one containing at least
+     * the Apache SIS class loader.
+     */
+    private static final class Walker implements Consumer<StackWalker.StackFrame> {
+        /**
+         * The context class loader to be returned by {@link #getContextClassLoader()}.
+         */
+        ClassLoader loader;
+
+        /**
+         * All parents of {@link #loader}.
+         */
+        private final Set<ClassLoader> parents;
+
+        /**
+         * Creates a new walker initialized to the context class loader of current thread.
+         */
+        Walker() {
+            parents = new HashSet<>();
+            setClassLoader(Thread.currentThread().getContextClassLoader());
         }
-        boolean warnings = false;
-        for (final StackTraceElement trace : thread.getStackTrace()) {      // TODO: replace by StackWalker in JDK9.
-            final String element = trace.getClassName();
-            if (element.startsWith(Modules.CLASSNAME_PREFIX)) try {
-                ClassLoader c = Class.forName(element).getClassLoader();
+
+        /**
+         * Set the class loader to the given value, which may be null.
+         */
+        private void setClassLoader(ClassLoader c) {
+            loader = c;
+            while (c != null) {
+                parents.add(c);
+                c = c.getParent();
+            }
+        }
+
+        /**
+         * If the given stack frame is an Apache SIS method, ensures that {@link #loader}
+         * is the SIS class loader or has the SIS class loader as a parent.
+         */
+        @Override
+        public void accept(final StackWalker.StackFrame frame) {
+            if (frame.getClassName().startsWith(Modules.CLASSNAME_PREFIX)) {
+                ClassLoader c = frame.getDeclaringClass().getClassLoader();
                 if (!parents.contains(c)) {
-                    loader = c;
                     parents.clear();
-                    while (c != null) {
-                        parents.add(c);
-                        c = c.getParent();
-                    }
-                }
-            } catch (SecurityException | ClassNotFoundException e) {
-                if (!warnings) {
-                    warnings = true;
-                    Logging.recoverableException(getLogger(Loggers.SYSTEM),
-                            DefaultFactories.class, "getContextClassLoader", e);
+                    setClassLoader(c);
                 }
             }
         }
-        return loader;
     }
 }
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/system/package-info.java b/core/sis-utility/src/main/java/org/apache/sis/internal/system/package-info.java
index 88db831943..f9f5e0586e 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/system/package-info.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/system/package-info.java
@@ -24,7 +24,7 @@
  * may change in incompatible ways in any future version without notice.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.3
+ * @version 1.4
  * @since   0.3
  * @module
  */
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/logging/Logging.java b/core/sis-utility/src/main/java/org/apache/sis/util/logging/Logging.java
index 11d77db468..d7c3b8f361 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/logging/Logging.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/logging/Logging.java
@@ -16,9 +16,12 @@
  */
 package org.apache.sis.util.logging;
 
+import java.util.Arrays;
+import java.util.stream.Stream;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.logging.LogRecord;
+import java.lang.reflect.Modifier;
 
 import org.apache.sis.util.ArgumentChecks;
 import org.apache.sis.util.Static;
@@ -40,7 +43,7 @@ import org.apache.sis.internal.system.Modules;
  * </ul>
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.3
+ * @version 1.4
  * @since   0.3
  * @module
  */
@@ -102,7 +105,7 @@ public final class Logging extends Static {
      * @param  method  the method to report as the source of the logging message.
      * @param  record  the record to log.
      */
-    public static void log(final Class<?> classe, String method, final LogRecord record) {
+    public static void log(final Class<?> classe, final String method, final LogRecord record) {
         ArgumentChecks.ensureNonNull("record", record);
         final String loggerName = record.getLoggerName();
         Logger logger;
@@ -120,8 +123,11 @@ public final class Logging extends Static {
              * If the given class or method is null, infer them from stack trace. We do not document this feature
              * in public API because the rules applied here are heuristic and may change in any future SIS version.
              */
-            logger = inferCaller(logger, (classe != null) ? classe.getCanonicalName() : null,
-                            method, Thread.currentThread().getStackTrace(), record);
+            final Logger fl = logger;       // Because lambda functions require final values.
+            logger = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk((stream) ->
+                    inferCaller(fl, (classe != null) ? classe.getCanonicalName() : null, method,
+                            stream.filter((frame) -> Modifier.isPublic(frame.getDeclaringClass().getModifiers()))
+                                  .map((StackWalker.StackFrame::toStackTraceElement)), record));
         }
         logger.log(record);
     }
@@ -131,6 +137,9 @@ public final class Logging extends Static {
      * This method inspects the given stack trace, skips what looks like internal API based on heuristic rules, then
      * if some arguments are non-null tries to match them.
      *
+     * <p>This method should be invoked only if at least one of {@code logger}, {@code classe} or {@code method}
+     * is null.</p>
+     *
      * @param  logger  where the log record will be sent after this method call, or {@code null} if unknown.
      * @param  classe  the name of the class to report in the log record, or {@code null} if unknown.
      * @param  method  the name of the method to report in the log record, or {@code null} if unknown.
@@ -138,61 +147,31 @@ public final class Logging extends Static {
      * @param  record  the record where to set the class and method names.
      * @return the record to use for logging the record.
      */
-    private static Logger inferCaller(Logger logger, String classe, String method,
-            final StackTraceElement[] trace, final LogRecord record)
+    private static Logger inferCaller(Logger logger, final String classe, final String method,
+            final Stream<StackTraceElement> trace, final LogRecord record)
     {
-        for (final StackTraceElement element : trace) {
+        final StackTraceElement first = trace.filter((element) -> {
             /*
-             * Search for the first stack trace element with a classname matching the expected one.
-             * We compare against the name of the class given in argument if it was non-null.
+             * Search for the first stack trace element with a class name and method name matching the expected ones.
+             * Null argument (class or method name) will not be compared (i.e. any name is accepted).
              *
              * Note: a previous version also compared logger name with package name.
              * This has been removed because those names are only loosely related.
              */
-            final String classname = element.getClassName();
-            if (classe != null) {
-                if (!classname.equals(classe)) {
-                    continue;
-                }
-            } else if (!isPublic(element)) {
-                continue;
-            }
-            /*
-             * Now that we have a stack trace element from the expected class (or any
-             * element if we don't know the class), make sure that we have the right method.
-             */
-            final String methodName = element.getMethodName();
-            if (method != null && !methodName.equals(method)) {
-                continue;
-            }
-            /*
-             * Now computes every values that are null, and stop the loop.
-             */
-            if (logger == null) {
+            return ((classe != null) ?  classe.equals(element.getClassName()) : isPublic(element)) &&
+                   ((method == null) || method.equals(element.getMethodName()));
+        }).findFirst().orElse(null);
+        if (logger == null) {
+            String name = Logger.GLOBAL_LOGGER_NAME;
+            if (first != null) {
+                final String classname = first.getClassName();
                 final int separator = classname.lastIndexOf('.');
-                logger = Logger.getLogger((separator >= 1) ? classname.substring(0, separator-1) : "");
-            }
-            if (classe == null) {
-                classe = classname;
-            }
-            if (method == null) {
-                method = methodName;
+                name = (separator >= 1) ? classname.substring(0, separator-1) : "";
             }
-            break;
-        }
-        /*
-         * The logger may stay null if we have been unable to find a suitable stack trace.
-         * Fallback on the global logger.
-         */
-        if (logger == null) {
-            logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
-        }
-        if (classe != null) {
-            record.setSourceClassName(classe);
-        }
-        if (method != null) {
-            record.setSourceMethodName(method);
+            logger = Logger.getLogger(name);
         }
+        if (classe != null || first != null) record.setSourceClassName (first == null ? classe : first.getClassName());
+        if (method != null || first != null) record.setSourceMethodName(first == null ? method : first.getMethodName());
         return logger;
     }
 
@@ -217,7 +196,7 @@ public final class Logging extends Static {
         if (classname.startsWith(Modules.CLASSNAME_PREFIX + "util.logging.")) {
             return classname.endsWith("Test");      // Consider JUnit tests as public.
         }
-        return true;    // TODO: with StackWalker on JDK9, check if the class is public.
+        return true;
     }
 
     /**
@@ -308,7 +287,7 @@ public final class Logging extends Static {
             record.setThrown(error);
         }
         if (logger == null || classe == null || method == null) {
-            logger = inferCaller(logger, classe, method, error.getStackTrace(), record);
+            logger = inferCaller(logger, classe, method, Arrays.stream(error.getStackTrace()), record);
         } else {
             record.setSourceClassName(classe);
             record.setSourceMethodName(method);
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/AbstractProvider.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/AbstractProvider.java
index 0af607b10b..6588e2ea90 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/AbstractProvider.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/AbstractProvider.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.storage.xml;
 
 import java.util.Map;
-import java.util.HashMap;
 import java.io.Reader;
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -35,7 +34,7 @@ import org.apache.sis.internal.storage.DocumentedStoreProvider;
  * (JAXB, StAX, <i>etc</i>).
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.2
+ * @version 1.4
  * @since   0.8
  * @module
  */
@@ -58,17 +57,15 @@ public abstract class AbstractProvider extends DocumentedStoreProvider {
     private static final byte[] HEADER = {'<','?','x','m','l',' '};
 
     /**
-     * The mapping from XML namespaces to MIME types. This map shall be populated by subclasses
-     * at construction time, then never modified anymore since we do not synchronize it.
+     * The mapping from XML namespaces to MIME types.
      *
-     * <div class="note"><b>Example</b>
-     * public MyDataStore() {
-     *     mimeForNameSpaces.put("http://www.opengis.net/gml/3.2",        "application/gml+xml");
-     *     mimeForNameSpaces.put("http://www.isotc211.org/2005/gmd",      "application/vnd.iso.19139+xml");
-     *     mimeForNameSpaces.put("http://www.opengis.net/cat/csw/2.0.2",  "application/vnd.ogc.csw_xml");
-     * }</div>
-     *
-     * @todo replace by {@code Map.of(…)} on JDK9 branch.
+     * <table class="sis">
+     *   <caption>Example</caption>
+     *   <tr><th>Key</th>                                  <th>Value</th></tr>
+     *   <tr><td>http://www.opengis.net/gml/3.2</td>       <td>application/gml+xml</td></tr>
+     *   <tr><td>http://www.isotc211.org/2005/gmd</td>     <td>application/vnd.iso.19139+xml</td></tr>
+     *   <tr><td>http://www.opengis.net/cat/csw/2.0.2</td> <td>application/vnd.ogc.csw_xml</td></tr>
+     * </table>
      */
     protected final Map<String,String> mimeForNameSpaces;
 
@@ -76,25 +73,25 @@ public abstract class AbstractProvider extends DocumentedStoreProvider {
      * The mapping from root elements to MIME types. Used only if the root element is in
      * the default namespace and contains no {@code xmlns} attributes for that namespace.
      *
-     * <div class="note"><b>Example</b>
-     * public MyDataStore() {
-     *     mimeForRootElements.put("MD_Metadata", "application/vnd.iso.19139+xml");
-     * }</div>
-     *
-     * @todo replace by {@code Map.of(…)} on JDK9 branch.
+     * <table class="sis">
+     *   <caption>Example</caption>
+     *   <tr><th>Key</th>         <th>Value</th></tr>
+     *   <tr><td>MD_Metadata</td> <td>application/vnd.iso.19139+xml</td></tr>
+     * </table>
      */
     protected final Map<String,String> mimeForRootElements;
 
     /**
-     * Creates a new provider. Subclasses shall populate the {@link #mimeForNameSpaces} map with a mapping
-     * from their namespace to the MIME type to declare.
+     * Creates a new provider.
      *
      * @param  name  the primary key to use for searching in the {@code MD_Format} table, or {@code null} if none.
+     * @param  mimeForNameSpaces    the mapping from XML namespaces to MIME type.
+     * @param  mimeForRootElements  the mapping from root elements to MIME types, used only as a fallback.
      */
-    protected AbstractProvider(final String name) {
+    protected AbstractProvider(final String name, final Map<String,String> mimeForNameSpaces, final Map<String,String> mimeForRootElements) {
         super(name);
-        mimeForNameSpaces   = new HashMap<>();
-        mimeForRootElements = new HashMap<>();
+        this.mimeForNameSpaces   = mimeForNameSpaces;
+        this.mimeForRootElements = mimeForRootElements;
     }
 
     /**
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/StoreProvider.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/StoreProvider.java
index 1f1c96d6d3..1ce9dafc70 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/StoreProvider.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/StoreProvider.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.internal.storage.xml;
 
+import java.util.Map;
 import org.apache.sis.xml.Namespaces;
 import org.apache.sis.storage.DataStore;
 import org.apache.sis.storage.DataStoreException;
@@ -29,7 +30,7 @@ import org.apache.sis.internal.storage.Capability;
  * The provider of {@link Store} instances.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.2
+ * @version 1.4
  * @since   0.4
  * @module
  */
@@ -46,14 +47,14 @@ public final class StoreProvider extends AbstractProvider {
      * Creates a new provider.
      */
     public StoreProvider() {
-        super(null);
-        mimeForNameSpaces.put(      Namespaces.GML,       "application/gml+xml");
-        mimeForNameSpaces.put(      Namespaces.CSW,       "application/vnd.ogc.csw_xml");
-        mimeForNameSpaces.put(LegacyNamespaces.CSW,       "application/vnd.ogc.csw_xml");
-        mimeForNameSpaces.put(LegacyNamespaces.GMD,       "application/vnd.iso.19139+xml");
-        mimeForNameSpaces.put(LegacyNamespaces.GMI,       "application/vnd.iso.19139+xml");
-        mimeForNameSpaces.put(LegacyNamespaces.GMI_ALIAS, "application/vnd.iso.19139+xml");
-        mimeForRootElements.put("MD_Metadata",            "application/vnd.iso.19139+xml");
+        super(null,
+              Map.of(      Namespaces.GML,       "application/gml+xml",
+                           Namespaces.CSW,       "application/vnd.ogc.csw_xml",
+                     LegacyNamespaces.CSW,       "application/vnd.ogc.csw_xml",
+                     LegacyNamespaces.GMD,       "application/vnd.iso.19139+xml",
+                     LegacyNamespaces.GMI,       "application/vnd.iso.19139+xml",
+                     LegacyNamespaces.GMI_ALIAS, "application/vnd.iso.19139+xml"),
+              Map.of("MD_Metadata",              "application/vnd.iso.19139+xml"));
         // More types to be added in future versions.
     }
 
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/package-info.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/package-info.java
index c1890634b9..57e5e08529 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/package-info.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/package-info.java
@@ -26,7 +26,7 @@
  * the {@code sis-xmlstore} module extends this package with classes designed for use with StAX cursor API.</p>
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.3
+ * @version 1.4
  * @since   0.4
  * @module
  */
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java
index 804badd303..b18e51ae6e 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java
@@ -483,28 +483,26 @@ public class StoreListeners implements Localized {
      */
     public void warning(final Level level, String message, final Exception exception) {
         ArgumentChecks.ensureNonNull("level", level);
-        final LogRecord record;
-        final StackTraceElement[] trace;
-        if (exception != null) {
-            trace = exception.getStackTrace();
+        if (exception == null) {
+            ArgumentChecks.ensureNonEmpty("message", message);
+        } else {
             message = Exceptions.formatChainedMessages(getLocale(), message, exception);
             if (message == null) {
                 message = exception.toString();
             }
-            record = new LogRecord(level, message);
-            record.setThrown(exception);
-        } else {
-            ArgumentChecks.ensureNonEmpty("message", message);
-            trace = Thread.currentThread().getStackTrace();         // TODO: on JDK9, use StackWalker instead.
-            record = new LogRecord(level, message);
         }
-        try {
-            for (final StackTraceElement e : trace) {
+        final LogRecord record = new LogRecord(level, message);
+        if (exception == null) {
+           StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk((stream) -> stream.filter(
+                   (frame) -> setPublicSource(record, frame.getDeclaringClass(), frame.getMethodName())).findFirst());
+         } else try {
+            record.setThrown(exception);
+            for (final StackTraceElement e : exception.getStackTrace()) {
                 if (setPublicSource(record, Class.forName(e.getClassName()), e.getMethodName())) {
                     break;
                 }
             }
-        } catch (ClassNotFoundException | SecurityException e) {
+        } catch (ClassNotFoundException e) {
             Logging.ignorableException(StoreUtilities.LOGGER, StoreListeners.class, "warning", e);
         }
         warning(record, StoreUtilities.removeStackTraceInLogs());
@@ -512,7 +510,7 @@ public class StoreListeners implements Localized {
 
     /**
      * Eventually sets the class name and method name in the given record,
-     * and returns {@code true} if the method is public resource method.
+     * and returns {@code true} if the method is a public resource method.
      *
      * @param  record      the record where to set the source class/method name.
      * @param  type        the source class. This method does nothing if the class is not a {@link Resource}.
diff --git a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/StoreProvider.java b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/StoreProvider.java
index 6595a46bcb..eaf053596e 100644
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/StoreProvider.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/StoreProvider.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.internal.storage.gpx;
 
+import java.util.Map;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import org.apache.sis.storage.DataStore;
@@ -35,7 +36,7 @@ import org.apache.sis.util.Version;
  *
  * @author  Johann Sorel (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.3
+ * @version 1.4
  * @since   0.8
  * @module
  */
@@ -68,10 +69,10 @@ public final class StoreProvider extends StaxDataStoreProvider {
      * Creates a new GPX store provider.
      */
     public StoreProvider() {
-        super("GPX");
-        mimeForNameSpaces.put(Tags.NAMESPACE_V10, "application/gpx+xml");
-        mimeForNameSpaces.put(Tags.NAMESPACE_V11, "application/gpx+xml");
-        mimeForRootElements.put("gpx", "application/gpx+xml");
+        super("GPX",
+              Map.of(Tags.NAMESPACE_V10, "application/gpx+xml",
+                     Tags.NAMESPACE_V11, "application/gpx+xml"),
+              Map.of("gpx",              "application/gpx+xml"));
     }
 
     /**
diff --git a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/package-info.java b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/package-info.java
index 0ef4f26ff1..8fbb0f7ce1 100644
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/package-info.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/package-info.java
@@ -56,7 +56,7 @@
  * </ul>
  *
  * @author  Johann Sorel (Geomatys)
- * @version 1.3
+ * @version 1.4
  *
  * @see <a href="https://en.wikipedia.org/wiki/GPS_Exchange_Format">GPS Exchange Format on Wikipedia</a>
  * @see <a href="http://www.topografix.com/GPX/1/1/">GPX 1.1 Schema Documentation</a>
diff --git a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxDataStoreProvider.java b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxDataStoreProvider.java
index d83aa89851..7cc40d5490 100644
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxDataStoreProvider.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxDataStoreProvider.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.internal.storage.xml.stream;
 
+import java.util.Map;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import org.apache.sis.xml.MarshallerPool;
@@ -27,7 +28,7 @@ import org.apache.sis.internal.storage.xml.AbstractProvider;
  *
  * @author  Johann Sorel (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.8
+ * @version 1.4
  * @since   0.8
  * @module
  */
@@ -40,13 +41,14 @@ public abstract class StaxDataStoreProvider extends AbstractProvider {
     private volatile MarshallerPool jaxb;
 
     /**
-     * Creates a new provider. Subclasses shall populate the {@link #mimeForNameSpaces}
-     * map with a mapping from their namespace to the MIME type to declare.
+     * Creates a new provider.
      *
      * @param  name  the primary key to use for searching in the {@code MD_Format} table, or {@code null} if none.
+     * @param  mimeForNameSpaces    the mapping from XML namespaces to MIME type.
+     * @param  mimeForRootElements  the mapping from root elements to MIME types, used only as a fallback.
      */
-    protected StaxDataStoreProvider(final String name) {
-        super(name);
+    protected StaxDataStoreProvider(final String name, final Map<String,String> mimeForNameSpaces, final Map<String,String> mimeForRootElements) {
+        super(name, mimeForNameSpaces, mimeForRootElements);
     }
 
     /**
diff --git a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/package-info.java b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/package-info.java
index 20f295c0f6..7899d86ebb 100644
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/package-info.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/package-info.java
@@ -24,7 +24,7 @@
  *
  * @author  Johann Sorel (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.3
+ * @version 1.4
  * @since   0.8
  * @module
  */


[sis] 03/03: Replace some `Collections` method calls by their `Map`, `Set` or `List` equivalent. The latter are immutable and check for null value.

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

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

commit 922983279cd61ee31bde1417b55cccba655083ae
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Sun Dec 11 17:37:48 2022 +0100

    Replace some `Collections` method calls by their `Map`, `Set` or `List` equivalent.
    The latter are immutable and check for null value.
---
 .../apache/sis/internal/gui/GUIUtilitiesTest.java  |  7 +-
 .../apache/sis/internal/book/CodeColorizer.java    |  7 +-
 .../org/apache/sis/filter/ComparisonFilter.java    |  3 +-
 .../org/apache/sis/filter/ConvertFunction.java     |  4 +-
 .../java/org/apache/sis/filter/PropertyValue.java  |  4 +-
 .../coverage/grid/BufferedGridCoverageTest.java    |  2 +-
 .../org/apache/sis/feature/FeatureFormatTest.java  |  4 +-
 .../apache/sis/feature/FeatureOperationsTest.java  |  4 +-
 .../org/apache/sis/feature/FeatureTestCase.java    |  6 +-
 .../feature/builder/AttributeTypeBuilderTest.java  |  4 +-
 .../org/apache/sis/filter/LogicalFilterTest.java   |  4 +-
 .../sis/internal/coverage/j2d/ColorizerTest.java   |  4 +-
 .../sis/internal/feature/GeometriesTestCase.java   |  8 +-
 .../sis/internal/filter/FunctionNamesTest.java     |  3 +-
 .../internal/filter/sqlmm/RegistryTestCase.java    |  6 +-
 .../internal/jaxb/cat/CodeListMarshallingTest.java |  4 +-
 .../sis/internal/jaxb/cat/EnumMarshallingTest.java |  4 +-
 .../metadata/ImplementationHelperTest.java         |  5 +-
 .../apache/sis/internal/metadata/MergerTest.java   | 11 +--
 .../java/org/apache/sis/metadata/HashCodeTest.java |  8 +-
 .../apache/sis/metadata/InformationMapTest.java    |  6 +-
 .../apache/sis/metadata/PropertyAccessorTest.java  | 11 ++-
 .../apache/sis/metadata/TreeNodeChildrenTest.java  |  4 +-
 .../apache/sis/metadata/TreeTableFormatTest.java   | 11 ++-
 .../java/org/apache/sis/metadata/ValueMapTest.java | 70 ++++++++--------
 .../sis/metadata/iso/CustomMetadataTest.java       |  4 +-
 .../apache/sis/metadata/iso/MarshallingTest.java   | 33 ++++----
 .../sis/metadata/iso/citation/CitationsTest.java   |  3 +-
 .../metadata/iso/citation/DefaultCitationTest.java | 10 +--
 .../metadata/iso/citation/DefaultContactTest.java  |  8 +-
 .../iso/citation/DefaultResponsibilityTest.java    |  4 +-
 .../constraint/DefaultLegalConstraintsTest.java    |  4 +-
 .../sis/metadata/iso/extent/DefaultExtentTest.java |  4 +-
 .../metadata/iso/quality/AbstractElementTest.java  |  4 +-
 .../iso/quality/DefaultDomainConsistencyTest.java  |  7 +-
 .../sis/metadata/sql/MetadataFallbackVerifier.java |  4 +-
 .../sis/metadata/sql/MetadataWriterTest.java       |  4 +-
 .../org/apache/sis/test/mock/MetadataMock.java     |  3 +-
 .../org/apache/sis/test/xml/PackageVerifier.java   | 49 +++++-------
 .../apache/sis/util/iso/DefaultScopedNameTest.java |  7 +-
 .../java/org/apache/sis/util/iso/TypesTest.java    |  3 +-
 .../org/apache/sis/xml/RenameListGenerator.java    |  9 +--
 .../apache/sis/xml/TransformingNamespacesTest.java |  9 +--
 .../org/apache/sis/xml/XLinkMarshallingTest.java   |  6 +-
 .../apache/sis/internal/map/ListChangeEvent.java   |  9 +--
 .../apache/sis/internal/map/SEPortrayerTest.java   |  7 +-
 .../MultiResolutionCoverageLoaderTest.java         |  8 +-
 .../referencing/gazetteer/GazetteerFactory.java    |  4 +-
 .../referencing/PositionalAccuracyConstant.java    |  4 +-
 .../factory/CommonAuthorityFactory.java            |  4 +-
 .../referencing/factory/sql/EPSGDataAccess.java    |  2 +-
 .../sis/referencing/factory/sql/EPSGFactory.java   |  2 +-
 .../sis/internal/jaxb/referencing/CodeTest.java    |  6 +-
 .../org/apache/sis/io/wkt/WKTDictionaryTest.java   | 12 +--
 .../referencing/AbstractIdentifiedObjectTest.java  |  4 +-
 .../sis/referencing/EPSGFactoryFallbackTest.java   | 24 +++---
 .../factory/CommonAuthorityFactoryTest.java        | 18 ++---
 .../factory/MultiAuthoritiesFactoryTest.java       | 30 ++++---
 .../operation/CoordinateOperationFinderTest.java   |  8 +-
 .../transform/MathTransformFactoryMock.java        |  3 +-
 .../transform/OperationMethodSetTest.java          | 10 +--
 .../report/CoordinateReferenceSystems.java         |  9 +--
 .../sis/test/integration/ConsistencyTest.java      |  7 +-
 .../apache/sis/test/integration/MetadataTest.java  | 92 +++++++++++-----------
 .../apache/sis/internal/util/AbstractMapTest.java  |  3 +-
 .../sis/internal/util/CheckedArrayListTest.java    |  6 +-
 .../sis/internal/util/CollectionsExtTest.java      |  9 +--
 .../org/apache/sis/measure/SystemUnitTest.java     |  6 +-
 .../org/apache/sis/measure/UnitServicesTest.java   |  4 +-
 .../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/internal/storage/csv/StoreTest.java | 25 +++---
 .../sis/internal/storage/folder/StoreTest.java     |  6 +-
 .../aggregate/ConcatenatedFeatureSetTest.java      | 17 ++--
 .../sis/storage/aggregate/JoinFeatureSetTest.java  |  6 +-
 .../apache/sis/internal/storage/gpx/Copyright.java |  4 +-
 .../sis/internal/storage/gpx/MetadataTest.java     | 10 +--
 .../sis/internal/storage/gpx/UpdaterTest.java      |  4 +-
 .../sis/internal/storage/gpx/WriterTest.java       | 31 ++++----
 82 files changed, 382 insertions(+), 421 deletions(-)

diff --git a/application/sis-javafx/src/test/java/org/apache/sis/internal/gui/GUIUtilitiesTest.java b/application/sis-javafx/src/test/java/org/apache/sis/internal/gui/GUIUtilitiesTest.java
index a83c56a2ce..81d6487953 100644
--- a/application/sis-javafx/src/test/java/org/apache/sis/internal/gui/GUIUtilitiesTest.java
+++ b/application/sis-javafx/src/test/java/org/apache/sis/internal/gui/GUIUtilitiesTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.sis.internal.gui;
 
-import java.util.Arrays;
 import java.util.List;
 import javafx.scene.control.TreeItem;
 import javafx.scene.paint.Color;
@@ -118,9 +117,9 @@ public final strictfp class GUIUtilitiesTest extends TestCase {
      */
     @Test
     public void testLongestCommonSubsequence() {
-        final List<Integer> x = Arrays.asList(1, 2, 4, 6, 7,    9);
-        final List<Integer> y = Arrays.asList(1, 2,    3, 7, 8);
-        assertEquals(Arrays.asList(1, 2, 7), GUIUtilities.longestCommonSubsequence(x, y));
+        final List<Integer> x = List.of(1, 2, 4, 6, 7,    9);
+        final List<Integer> y = List.of(1, 2,    3, 7, 8);
+        assertEquals(List.of(1, 2, 7), GUIUtilities.longestCommonSubsequence(x, y));
     }
 
     /**
diff --git a/core/sis-build-helper/src/main/java/org/apache/sis/internal/book/CodeColorizer.java b/core/sis-build-helper/src/main/java/org/apache/sis/internal/book/CodeColorizer.java
index 7295eab09b..2026323d0a 100644
--- a/core/sis-build-helper/src/main/java/org/apache/sis/internal/book/CodeColorizer.java
+++ b/core/sis-build-helper/src/main/java/org/apache/sis/internal/book/CodeColorizer.java
@@ -16,10 +16,7 @@
  */
 package org.apache.sis.internal.book;
 
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.io.BufferedReader;
@@ -47,7 +44,7 @@ public final class CodeColorizer {
     /**
      * Lists of Java keywords.
      */
-    public static final Set<String> JAVA_KEYWORDS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
+    public static final Set<String> JAVA_KEYWORDS = Set.of(
         "abstract", "continue", "for",        "new",        "switch",
         "assert",   "default",  "goto",       "package",    "synchronized",
         "boolean",  "do",       "if",         "private",    "this",
@@ -58,7 +55,7 @@ public final class CodeColorizer {
         "char",     "final",    "interface",  "static",     "void",
         "class",    "finally",  "long",       "strictfp",   "volatile",
         "const",    "float",    "native",     "super",      "while",
-        /* literals: */ "true", "false", "null")));
+        /* literals: */ "true", "false", "null");
 
     /**
      * Returns all nodes in the given list as an array. This method is used for getting a snapshot
diff --git a/core/sis-feature/src/main/java/org/apache/sis/filter/ComparisonFilter.java b/core/sis-feature/src/main/java/org/apache/sis/filter/ComparisonFilter.java
index af6ec2793c..4a9afa8405 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/ComparisonFilter.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/ComparisonFilter.java
@@ -19,7 +19,6 @@ package org.apache.sis.filter;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.List;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
 import java.util.Calendar;
@@ -825,7 +824,7 @@ abstract class ComparisonFilter<R> extends BinaryFunction<R,Object,Object>
 
         /** Returns the expression to be compared by this operator, together with boundaries. */
         @Override public List<Expression<? super R, ?>> getExpressions() {
-            return Arrays.asList(lower.expression1, lower.expression2, upper.expression2);
+            return List.of(lower.expression1, lower.expression2, upper.expression2);
         }
 
         /** Returns the expression to be compared. */
diff --git a/core/sis-feature/src/main/java/org/apache/sis/filter/ConvertFunction.java b/core/sis-feature/src/main/java/org/apache/sis/filter/ConvertFunction.java
index 28d80869bd..b0c1afcd13 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/ConvertFunction.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/ConvertFunction.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.filter;
 
-import java.util.Arrays;
+import java.util.List;
 import java.util.Collection;
 import org.opengis.util.ScopedName;
 import org.apache.sis.util.ObjectConverter;
@@ -126,7 +126,7 @@ final class ConvertFunction<R,S,V> extends UnaryFunction<R,S>
      */
     @Override
     protected Collection<?> getChildren() {
-        return Arrays.asList(expression, converter.getSourceClass(), converter.getTargetClass());
+        return List.of(expression, converter.getSourceClass(), converter.getTargetClass());
     }
 
     /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/filter/PropertyValue.java b/core/sis-feature/src/main/java/org/apache/sis/filter/PropertyValue.java
index 1db9b1493a..a4348b1ca1 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/filter/PropertyValue.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/filter/PropertyValue.java
@@ -16,11 +16,9 @@
  */
 package org.apache.sis.filter;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
 import java.util.Collection;
-import java.util.Collections;
 import org.apache.sis.feature.Features;
 import org.apache.sis.util.ObjectConverter;
 import org.apache.sis.util.ObjectConverters;
@@ -141,7 +139,7 @@ split:  if (path != null) {
      */
     @Override
     protected final Collection<?> getChildren() {
-        return isVirtual ? Arrays.asList(name, isVirtual) : Collections.singleton(name);
+        return isVirtual ? List.of(name, isVirtual) : List.of(name);
     }
 
     /**
diff --git a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/BufferedGridCoverageTest.java b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/BufferedGridCoverageTest.java
index 1efaf01c55..40cc8ea8fc 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/BufferedGridCoverageTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/BufferedGridCoverageTest.java
@@ -82,7 +82,7 @@ public final strictfp class BufferedGridCoverageTest extends GridCoverage2DTest
         final int nbTime = 3;
         final GridExtent extent = new GridExtent(null, null, new long[] {width, height, nbTime}, false);
         final GridGeometry domain = new GridGeometry(extent, PixelInCell.CELL_CENTER, MathTransforms.scale(2, 3, 5), null);
-        final SampleDimension band = new SampleDimension(Names.createLocalName(null, null, "Data"), null, Collections.emptyList());
+        final SampleDimension band = new SampleDimension(Names.createLocalName(null, null, "Data"), null, List.of());
         /*
          * Fill slices with all values set to 10, 11 and 12 at time t=0, 1 and 2 respectively.
          * All values are stored in a single bank.
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureFormatTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureFormatTest.java
index 091b18ee13..a52e00e809 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureFormatTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureFormatTest.java
@@ -16,9 +16,9 @@
  */
 package org.apache.sis.feature;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumSet;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.HashMap;
@@ -151,7 +151,7 @@ public final strictfp class FeatureFormatTest extends TestCase {
         final AbstractFeature feature = isSparse ? new SparseFeature(type) : new DenseFeature(type);
         feature.setPropertyValue("city", "Tokyo");
         feature.setPropertyValue("population", 13185502);                               // In 2011.
-        feature.setPropertyValue("universities", Arrays.asList("Waseda", "Keio"));
+        feature.setPropertyValue("universities", List.of("Waseda", "Keio"));
         feature.setPropertyValue("temperature", Float.NaN);
 
         final FeatureFormat format = create();
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureOperationsTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureOperationsTest.java
index ac08c5889e..612737fc45 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureOperationsTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureOperationsTest.java
@@ -16,8 +16,8 @@
  */
 package org.apache.sis.feature;
 
-import java.util.Arrays;
 import java.util.Map;
+import java.util.List;
 import java.util.Collections;
 import com.esri.core.geometry.Point;
 import com.esri.core.geometry.Polygon;
@@ -110,7 +110,7 @@ public final strictfp class FeatureOperationsTest extends TestCase {
         assertInstanceOf("bounds", EnvelopeOperation.class, property);
         final EnvelopeOperation op = (EnvelopeOperation) property;
         assertSame("targetCRS", HardCodedCRS.WGS84, op.targetCRS);
-        assertSetEquals(Arrays.asList("classes", "climbing wall", "gymnasium"), op.getDependencies());
+        assertSetEquals(List.of("classes", "climbing wall", "gymnasium"), op.getDependencies());
     }
 
     /**
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureTestCase.java b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureTestCase.java
index 32cd40a4ff..8e69ddf2ff 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureTestCase.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureTestCase.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.feature;
 
-import java.util.Arrays;
+import java.util.List;
 import java.util.Collection;
 import java.util.Collections;
 import org.opengis.metadata.quality.DataQuality;
@@ -251,7 +251,7 @@ public abstract strictfp class FeatureTestCase extends TestCase {
          * Set the attribute value on a property having [0 … ∞] multiplicity.
          * The feature implementation should put the value in a list.
          */
-        assertEquals("universities", Collections.emptyList(), getAttributeValue("universities"));
+        assertEquals("universities", List.of(), getAttributeValue("universities"));
         feature.setPropertyValue("universities", "University of arts");
         assertEquals("universities", Collections.singletonList("University of arts"), getAttributeValue("universities"));
         /*
@@ -360,7 +360,7 @@ public abstract strictfp class FeatureTestCase extends TestCase {
         assertTrue("isEmpty", values.isEmpty());
         // Cannot perform values.add("something") here.
 
-        feature.setPropertyValue("universities", Arrays.asList("UCAR", "Marie-Curie"));
+        feature.setPropertyValue("universities", List.of("UCAR", "Marie-Curie"));
         values = (Collection<?>) feature.getPropertyValue("universities");
         assertArrayEquals(new String[] {"UCAR", "Marie-Curie"}, values.toArray());
     }
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/builder/AttributeTypeBuilderTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/builder/AttributeTypeBuilderTest.java
index e9cf8b5e0c..1e87cada7b 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/builder/AttributeTypeBuilderTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/builder/AttributeTypeBuilderTest.java
@@ -16,8 +16,8 @@
  */
 package org.apache.sis.feature.builder;
 
-import java.util.Arrays;
 import java.util.Set;
+import java.util.List;
 import java.util.Collections;
 import com.esri.core.geometry.Geometry;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
@@ -236,7 +236,7 @@ public final strictfp class AttributeTypeBuilderTest extends TestCase {
         assertFalse("add(DEFAULT_GEOMETRY)", builder.addRole(AttributeRole.DEFAULT_GEOMETRY));
 
         assertTrue("add(IDENTIFIER_COMPONENT)", roles.add(AttributeRole.IDENTIFIER_COMPONENT));
-        assertSetEquals(Arrays.asList(AttributeRole.DEFAULT_GEOMETRY, AttributeRole.IDENTIFIER_COMPONENT), roles);
+        assertSetEquals(List.of(AttributeRole.DEFAULT_GEOMETRY, AttributeRole.IDENTIFIER_COMPONENT), roles);
         assertFalse("add(IDENTIFIER_COMPONENT)", roles.add(AttributeRole.IDENTIFIER_COMPONENT));
 
         assertTrue("remove(DEFAULT_GEOMETRY)", roles.remove(AttributeRole.DEFAULT_GEOMETRY));
diff --git 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
index 8dd829b507..6639491972 100644
--- 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
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.filter;
 
-import java.util.Arrays;
+import java.util.List;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.function.Function;
@@ -143,7 +143,7 @@ public final strictfp class LogicalFilterTest extends TestCase {
         assertEquals(expected, filter.test(null));
         assertSerializedEquals(filter);
 
-        filter = anyArity.apply(Arrays.asList(f1, f2, f1));
+        filter = anyArity.apply(List.of(f1, f2, f1));
         assertArrayEquals(new Filter<?>[] {f1, f2, f1}, filter.getOperands().toArray());
         assertEquals(expected, filter.test(null));
         assertSerializedEquals(filter);
diff --git a/core/sis-feature/src/test/java/org/apache/sis/internal/coverage/j2d/ColorizerTest.java b/core/sis-feature/src/test/java/org/apache/sis/internal/coverage/j2d/ColorizerTest.java
index 3eceb31cf3..41049e7805 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/internal/coverage/j2d/ColorizerTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/internal/coverage/j2d/ColorizerTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.internal.coverage.j2d;
 
-import java.util.Arrays;
+import java.util.List;
 import java.util.Collection;
 import java.util.AbstractMap.SimpleEntry;
 import java.awt.Color;
@@ -50,7 +50,7 @@ public final strictfp class ColorizerTest extends TestCase {
      */
     @Test
     public void testRangeAndColors() throws TransformException {
-        final Colorizer colorizer = new Colorizer(Arrays.asList(
+        final Colorizer colorizer = new Colorizer(List.of(
                 new SimpleEntry<>(NumberRange.create(0, true,  0, true), new Color[] {Color.GRAY}),
                 new SimpleEntry<>(NumberRange.create(1, true,  1, true), new Color[] {ColorModelFactory.TRANSPARENT}),
                 new SimpleEntry<>(NumberRange.create(2, true, 15, true), new Color[] {Color.BLUE, Color.WHITE, Color.RED})));
diff --git a/core/sis-feature/src/test/java/org/apache/sis/internal/feature/GeometriesTestCase.java b/core/sis-feature/src/test/java/org/apache/sis/internal/feature/GeometriesTestCase.java
index 59acd7822e..a6cec06868 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/internal/feature/GeometriesTestCase.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/internal/feature/GeometriesTestCase.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.internal.feature;
 
-import java.util.Arrays;
+import java.util.List;
 import java.util.EnumSet;
 import java.util.Iterator;
 import org.opengis.geometry.Envelope;
@@ -127,7 +127,7 @@ public abstract strictfp class GeometriesTestCase extends TestCase {
      */
     @Test
     public void testMergePolylines() {
-        final Iterator<Object> c1 = Arrays.asList(
+        final Iterator<Object> c1 = List.of(
                 factory.createPoint(  4,   5),
                 factory.createPoint(  7,   9),
                 factory.createPoint(  9,   3),
@@ -137,14 +137,14 @@ public abstract strictfp class GeometriesTestCase extends TestCase {
                 factory.createPoint( -2,  -5),
                 factory.createPoint( -1,  -6)).iterator();
 
-        final Iterator<Object> c2 = Arrays.asList(
+        final Iterator<Object> c2 = List.of(
                 factory.createPoint( 14,  12),
                 factory.createPoint( 15,  11),
                 factory.createPoint( 13,  10)).iterator();
 
         final Object g1 = factory.castOrWrap(c1.next()).mergePolylines(c1);
         final Object g2 = factory.castOrWrap(c2.next()).mergePolylines(c2);
-        geometry = factory.castOrWrap(g1).mergePolylines(Arrays.asList(factory.createPoint(13, 11), g2).iterator());
+        geometry = factory.castOrWrap(g1).mergePolylines(List.of(factory.createPoint(13, 11), g2).iterator());
 
         createWrapper();
         final GeneralEnvelope env = wrapper.getEnvelope();
diff --git a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/FunctionNamesTest.java b/core/sis-feature/src/test/java/org/apache/sis/internal/filter/FunctionNamesTest.java
index cf38988806..fc0b8f82e2 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/FunctionNamesTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/internal/filter/FunctionNamesTest.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.filter;
 
 import java.util.List;
-import java.util.Collections;
 import java.lang.reflect.Field;
 import org.apache.sis.internal.filter.sqlmm.SQLMM;
 import org.apache.sis.test.TestCase;
@@ -61,7 +60,7 @@ public final strictfp class FunctionNamesTest extends TestCase {
      * Base class for dummy implementation of filter.
      */
     private static abstract class FilterBase implements ComparisonOperator<Object> {
-        @Override public List<Expression<Object,?>> getExpressions() {return Collections.emptyList();}
+        @Override public List<Expression<Object,?>> getExpressions() {return List.of();}
         @Override public boolean test(Object resource) {return false;}
     }
 
diff --git a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryTestCase.java b/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryTestCase.java
index a228df9103..a8e303d2bf 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryTestCase.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryTestCase.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.internal.filter.sqlmm;
 
-import java.util.Arrays;
+import java.util.List;
 import org.opengis.geometry.DirectPosition;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.opengis.referencing.crs.GeographicCRS;
@@ -422,8 +422,8 @@ public abstract strictfp class RegistryTestCase<G> extends TestCase {
     public void testLineString() {
         assertRequireArguments("ST_LineString");
         final Object result = evaluate("ST_LineString",
-                Arrays.asList(library.createPoint(10, 20),
-                              library.createPoint(30, 40)), HardCodedCRS.WGS84);
+                List.of(library.createPoint(10, 20),
+                        library.createPoint(30, 40)), HardCodedCRS.WGS84);
         assertPolylineEquals(result, HardCodedCRS.WGS84, 10, 20, 30, 40);
     }
 
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/cat/CodeListMarshallingTest.java b/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/cat/CodeListMarshallingTest.java
index 45b64a9a21..2aab8902ed 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/cat/CodeListMarshallingTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/cat/CodeListMarshallingTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.internal.jaxb.cat;
 
-import java.util.Arrays;
+import java.util.List;
 import java.util.Locale;
 import java.util.Collections;
 import javax.xml.bind.Marshaller;
@@ -196,7 +196,7 @@ public final strictfp class CodeListMarshallingTest extends TestCase {
     @Test
     public void testExtraCodes() throws JAXBException {
         final DefaultCitation id = new DefaultCitation();
-        id.setPresentationForms(Arrays.asList(
+        id.setPresentationForms(List.of(
                 PresentationForm.valueOf("IMAGE_DIGITAL"),      // Existing code with UML id="imageDigital"
                 PresentationForm.valueOf("test")));             // New code
 
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/cat/EnumMarshallingTest.java b/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/cat/EnumMarshallingTest.java
index a877637776..9a879c4ded 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/cat/EnumMarshallingTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/cat/EnumMarshallingTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.internal.jaxb.cat;
 
-import java.util.Arrays;
+import java.util.List;
 import java.util.EnumSet;
 import java.util.Collection;
 import javax.xml.bind.JAXBException;
@@ -46,7 +46,7 @@ public final strictfp class EnumMarshallingTest extends TestCase {
      */
     @Test
     public void testTopicCategories() throws JAXBException {
-        final Collection<TopicCategory> topics = Arrays.asList(
+        final List<TopicCategory> topics = List.of(
                 TopicCategory.OCEANS,
                 TopicCategory.ENVIRONMENT,
                 TopicCategory.IMAGERY_BASE_MAPS_EARTH_COVER);   // We need to test at least one enum with many words.
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/ImplementationHelperTest.java b/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/ImplementationHelperTest.java
index 0ba376708c..385ee365c0 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/ImplementationHelperTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/ImplementationHelperTest.java
@@ -17,6 +17,7 @@
 package org.apache.sis.internal.metadata;
 
 import java.util.Date;
+import java.util.List;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.LinkedHashSet;
@@ -66,11 +67,11 @@ public final strictfp class ImplementationHelperTest extends TestCase {
         locales = ImplementationHelper.setFirst(null, GERMAN);
         assertArrayEquals(new Locale[] {GERMAN}, locales.toArray());
 
-        locales = Arrays.asList(ENGLISH, JAPANESE, FRENCH);
+        locales = Arrays.asList(ENGLISH, JAPANESE, FRENCH);                 // Content will be modified.
         assertSame("Shall set value in-place.", locales, ImplementationHelper.setFirst(locales, GERMAN));
         assertArrayEquals(new Locale[] {GERMAN, JAPANESE, FRENCH}, locales.toArray());
 
-        locales = new LinkedHashSet<>(Arrays.asList(ENGLISH, JAPANESE, FRENCH));
+        locales = new LinkedHashSet<>(List.of(ENGLISH, JAPANESE, FRENCH));
         locales = ImplementationHelper.setFirst(locales, ITALIAN);
         assertArrayEquals(new Locale[] {ITALIAN, JAPANESE, FRENCH}, locales.toArray());
 
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/MergerTest.java b/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/MergerTest.java
index e3ef4bd3a6..b5cc133401 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/MergerTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/MergerTest.java
@@ -16,7 +16,8 @@
  */
 package org.apache.sis.internal.metadata;
 
-import java.util.Arrays;
+import java.util.Set;
+import java.util.List;
 import java.util.Locale;
 import java.util.Iterator;
 import java.util.Collections;
@@ -56,7 +57,7 @@ public final strictfp class MergerTest extends TestCase {
         final DefaultCoverageDescription         coverage = new DefaultCoverageDescription();
         final DefaultImageDescription            image    = new DefaultImageDescription();
         final DefaultMetadata                    metadata = new DefaultMetadata();
-        features.setFeatureCatalogueCitations(Collections.singleton(new DefaultCitation("Shapefile")));
+        features.setFeatureCatalogueCitations(Set.of(new DefaultCitation("Shapefile")));
         features.setIncludedWithDataset(Boolean.TRUE);
         metadata.getContentInfo().add(features);
 
@@ -82,7 +83,7 @@ public final strictfp class MergerTest extends TestCase {
         image.setProcessingLevelCode(new DefaultIdentifier("Level 2"));
         metadata.getContentInfo().add(image);
 
-        features.setFeatureCatalogueCitations(Collections.singleton(new DefaultCitation("GPX file")));
+        features.setFeatureCatalogueCitations(Set.of(new DefaultCitation("GPX file")));
         features.setIncludedWithDataset(Boolean.TRUE);
         metadata.getContentInfo().add(features);
 
@@ -101,9 +102,9 @@ public final strictfp class MergerTest extends TestCase {
         final Merger merger = new Merger(null);
         merger.copy(source, target);
 
-        assertSetEquals(Arrays.asList(Locale.JAPANESE, Locale.FRENCH),
+        assertSetEquals(List.of(Locale.JAPANESE, Locale.FRENCH),
                         target.getLocalesAndCharsets().keySet());
-        assertSetEquals(Arrays.asList(StandardCharsets.UTF_16, StandardCharsets.UTF_8),
+        assertSetEquals(List.of(StandardCharsets.UTF_16, StandardCharsets.UTF_8),
                         target.getLocalesAndCharsets().values());
 
         final Iterator<ContentInformation> it       = target.getContentInfo().iterator();
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/HashCodeTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/HashCodeTest.java
index f013c0cf9e..6b6eb621ab 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/HashCodeTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/HashCodeTest.java
@@ -16,7 +16,8 @@
  */
 package org.apache.sis.metadata;
 
-import java.util.Arrays;
+import java.util.Set;
+import java.util.List;
 import org.opengis.util.InternationalString;
 import org.opengis.metadata.Identifier;
 import org.opengis.metadata.citation.Role;
@@ -37,7 +38,6 @@ import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singleton;
 import static org.junit.Assert.*;
 
 
@@ -74,9 +74,9 @@ public final strictfp class HashCodeTest extends TestCase {
         assertEquals("Metadata with a single value.", Integer.valueOf(baseCode + title.hashCode()), hash(instance));
 
         final InternationalString alternateTitle = new SimpleInternationalString("Another title");
-        instance.setAlternateTitles(singleton(alternateTitle));
+        instance.setAlternateTitles(Set.of(alternateTitle));
         assertEquals("Metadata with two values.",
-                     Integer.valueOf(baseCode + title.hashCode() + Arrays.asList(alternateTitle).hashCode()),
+                     Integer.valueOf(baseCode + title.hashCode() + List.of(alternateTitle).hashCode()),
                      hash(instance));
     }
 
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/InformationMapTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/InformationMapTest.java
index 66cc785861..2bc673bcb9 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/InformationMapTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/InformationMapTest.java
@@ -18,8 +18,6 @@ package org.apache.sis.metadata;
 
 import java.util.Map;
 import java.util.Set;
-import java.util.HashSet;
-import java.util.Arrays;
 import java.util.Locale;
 import org.opengis.metadata.ExtendedElementInformation;
 import org.opengis.metadata.acquisition.EnvironmentalRecord;
@@ -68,9 +66,9 @@ public final strictfp class InformationMapTest extends TestCase {
         final Map<String,ExtendedElementInformation> descriptions = MetadataStandard.ISO_19115.asInformationMap(
                 EnvironmentalRecord.class, KeyNamePolicy.UML_IDENTIFIER);
 
-        final Set<String> expected = new HashSet<>(Arrays.asList(
+        final Set<String> expected = Set.of(
             "averageAirTemperature", "maxAltitude", "maxRelativeHumidity", "meteorologicalConditions"
-        ));
+        );
         assertEquals(expected, descriptions.keySet());
     }
 
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/PropertyAccessorTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/PropertyAccessorTest.java
index b0d1b39fc7..e3b89e5ec8 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/PropertyAccessorTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/PropertyAccessorTest.java
@@ -19,7 +19,6 @@ package org.apache.sis.metadata;
 import java.util.Map;
 import java.util.Set;
 import java.util.List;
-import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Locale;
@@ -436,10 +435,10 @@ public final strictfp class PropertyAccessorTest extends TestCase {
     @DependsOnMethod("testSet")
     public void testSetCollection() {
         final DefaultCitation instance = new DefaultCitation("Ignored title");
-        final List<InternationalString> oldTitles = Arrays.<InternationalString>asList(
+        final List<InternationalString> oldTitles = List.of(
                 new SimpleInternationalString("Old title 1"),
                 new SimpleInternationalString("Old title 2"));
-        final List<InternationalString> newTitles = Arrays.<InternationalString>asList(
+        final List<InternationalString> newTitles = List.of(
                 new SimpleInternationalString("New title 1"),
                 new SimpleInternationalString("New title 2"));
 
@@ -521,7 +520,7 @@ public final strictfp class PropertyAccessorTest extends TestCase {
         }
 
         // Check final collection content.
-        final List<InternationalString> expected = Arrays.asList(title1, title2);
+        final List<InternationalString> expected = List.of(title1, title2);
         assertEquals("alternateTitles", expected, accessor.get(index, instance));
         assertTitleEquals("title", "Ignored title", instance);
     }
@@ -545,10 +544,10 @@ public final strictfp class PropertyAccessorTest extends TestCase {
      */
     public void testSetInAppendMode() {
         final DefaultCitation instance = new DefaultCitation();
-        final List<InternationalString> oldTitles = Arrays.<InternationalString>asList(
+        final List<InternationalString> oldTitles = List.of(
                 new SimpleInternationalString("Old title 1"),
                 new SimpleInternationalString("Old title 2"));
-        final List<InternationalString> newTitles = Arrays.<InternationalString>asList(
+        final List<InternationalString> newTitles = List.of(
                 new SimpleInternationalString("New title 1"),
                 new SimpleInternationalString("New title 2"));
         final List<InternationalString> merged = new ArrayList<>(oldTitles);
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeNodeChildrenTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeNodeChildrenTest.java
index 4eb499ebe7..ea9499f86d 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeNodeChildrenTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeNodeChildrenTest.java
@@ -19,9 +19,9 @@ package org.apache.sis.metadata;
 import java.util.Date;
 import java.util.Random;
 import java.util.Iterator;
+import java.util.Set;
 import java.util.List;
 import java.util.ArrayList;
-import java.util.Collections;
 import org.opengis.metadata.citation.Citation;
 import org.opengis.metadata.citation.DateType;
 import org.opengis.metadata.citation.PresentationForm;
@@ -70,7 +70,7 @@ public final strictfp class TreeNodeChildrenTest extends TestCase {
     static DefaultCitation metadataWithoutCollections() {
         final DefaultCitation citation = new DefaultCitation("Some title");
         citation.setEdition(new SimpleInternationalString("Some edition"));
-        citation.setOtherCitationDetails(Collections.singleton(new SimpleInternationalString("Some other details")));
+        citation.setOtherCitationDetails(Set.of(new SimpleInternationalString("Some other details")));
         return citation;
     }
 
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeTableFormatTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeTableFormatTest.java
index 9d8c298790..f999c21e04 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeTableFormatTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeTableFormatTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.metadata;
 
-import java.util.Arrays;
+import java.util.List;
 import org.opengis.metadata.citation.Role;
 import org.opengis.metadata.citation.PresentationForm;
 import org.apache.sis.util.collection.TableColumn;
@@ -35,7 +35,6 @@ import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static java.util.Arrays.asList;
 import static java.util.Collections.singleton;
 import static org.apache.sis.test.Assert.*;
 
@@ -116,7 +115,7 @@ public final strictfp class TreeTableFormatTest extends TestCase {
         coded   .setPresentationForms(singleton(PresentationForm.IMAGE_HARDCOPY));
         untitled.setCitedResponsibleParties(singleton(new DefaultResponsibility(Role.AUTHOR, null, null)));
         final DefaultProcessing processing = new DefaultProcessing();
-        processing.setDocumentations(asList(titled, coded, untitled));
+        processing.setDocumentations(List.of(titled, coded, untitled));
         final String text = format.format(processing.asTreeTable());
         assertMultilinesEquals(
             "Processing\n" +
@@ -135,7 +134,7 @@ public final strictfp class TreeTableFormatTest extends TestCase {
     @Test
     public void testImageDescription() {
         final DefaultImageDescription image = new DefaultImageDescription();
-        image.setAttributeGroups(Arrays.asList(
+        image.setAttributeGroups(List.of(
             new DefaultAttributeGroup(null, createBand(0.25, 0.26)),
             new DefaultAttributeGroup(null, createBand(0.28, 0.29))
         ));
@@ -160,12 +159,12 @@ public final strictfp class TreeTableFormatTest extends TestCase {
     @Test
     public void testTreeWithCustomElements() {
         final DefaultCitation citation = new DefaultCitation();
-        citation.setAlternateTitles(Arrays.asList(
+        citation.setAlternateTitles(List.of(
                 new SimpleInternationalString("Apple"),
                 new SimpleInternationalString("Orange"),
                 new SimpleInternationalString("Kiwi")));
 
-        citation.setPresentationForms(Arrays.asList(
+        citation.setPresentationForms(List.of(
                 PresentationForm.IMAGE_DIGITAL,
                 PresentationForm.valueOf("AUDIO_DIGITAL"),  // Existing form
                 PresentationForm.valueOf("test")));         // Custom form
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/ValueMapTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/ValueMapTest.java
index a5d58b5112..965966d77f 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/ValueMapTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/ValueMapTest.java
@@ -17,6 +17,8 @@
 package org.apache.sis.metadata;
 
 import java.util.Map;
+import java.util.Set;
+import java.util.List;
 import java.util.Collection;
 import org.opengis.util.InternationalString;
 import org.opengis.metadata.Identifier;
@@ -32,10 +34,6 @@ import org.junit.Test;
 
 import static org.opengis.test.Assert.*;
 import static java.util.AbstractMap.SimpleEntry;
-import static java.util.Collections.emptySet;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singleton;
-import static java.util.Collections.singletonList;
 import static org.opengis.metadata.citation.PresentationForm.DOCUMENT_HARDCOPY;
 import static org.apache.sis.test.TestUtilities.getSingleton;
 
@@ -93,8 +91,8 @@ public final strictfp class ValueMapTest extends TestCase {
         title    = new SimpleInternationalString("Undercurrent");
         author   = new DefaultResponsibility();
         citation = new DefaultCitation(title);
-        author.setParties(singleton(new DefaultIndividual("Testsuya Toyoda", null, null)));
-        citation.setCitedResponsibleParties(singleton(author));
+        author.setParties(Set.of(new DefaultIndividual("Testsuya Toyoda", null, null)));
+        citation.setCitedResponsibleParties(Set.of(author));
         citation.setISBN("9782505004509");
         citation.setEdition(NilReason.UNKNOWN.createNilObject(InternationalString.class));
         return MetadataStandard.ISO_19115.asValueMap(citation, null, KeyNamePolicy.JAVABEANS_PROPERTY, ValueExistencePolicy.NON_EMPTY);
@@ -107,7 +105,7 @@ public final strictfp class ValueMapTest extends TestCase {
     public void testGet() {
         final Map<String,Object> map = createCitation();
         assertEquals("Undercurrent",                 map.get("title").toString());
-        assertEquals(singletonList(author),          map.get("citedResponsibleParties"));
+        assertEquals(List.of(author),                map.get("citedResponsibleParties"));
         assertEquals("9782505004509",                map.get("ISBN"));
         assertNull  ("NilObject shall be excluded.", map.get("edition"));
         /*
@@ -144,7 +142,7 @@ public final strictfp class ValueMapTest extends TestCase {
         assertArrayEquals(new SimpleEntry<?,?>[] {
             new SimpleEntry<>("title",                   title),
             new SimpleEntry<>("identifiers",             citation.getIdentifiers()),
-            new SimpleEntry<>("citedResponsibleParties", singletonList(author)),
+            new SimpleEntry<>("citedResponsibleParties", List.of(author)),
             new SimpleEntry<>("ISBN",                    "9782505004509")
         }, map.entrySet().toArray());
     }
@@ -167,15 +165,15 @@ public final strictfp class ValueMapTest extends TestCase {
         assertFalse("'all' shall be a larger map than 'map'.", map.entrySet().containsAll(all.entrySet()));
         assertArrayEquals(new SimpleEntry<?,?>[] {
             new SimpleEntry<>("title",                   title),
-            new SimpleEntry<>("alternateTitles",         emptyList()),
-            new SimpleEntry<>("dates",                   emptyList()),
+            new SimpleEntry<>("alternateTitles",         List.of()),
+            new SimpleEntry<>("dates",                   List.of()),
             new SimpleEntry<>("identifiers",             citation.getIdentifiers()),
-            new SimpleEntry<>("citedResponsibleParties", singletonList(author)),
-            new SimpleEntry<>("presentationForms",       emptySet()),
-            new SimpleEntry<>("otherCitationDetails",    emptyList()),
+            new SimpleEntry<>("citedResponsibleParties", List.of(author)),
+            new SimpleEntry<>("presentationForms",       Set.of()),
+            new SimpleEntry<>("otherCitationDetails",    List.of()),
             new SimpleEntry<>("ISBN",                    "9782505004509"),
-            new SimpleEntry<>("onlineResources",         emptyList()),
-            new SimpleEntry<>("graphics",                emptyList())
+            new SimpleEntry<>("onlineResources",         List.of()),
+            new SimpleEntry<>("graphics",                List.of())
         }, all.entrySet().toArray());
     }
 
@@ -197,16 +195,16 @@ public final strictfp class ValueMapTest extends TestCase {
         assertFalse("'all' shall be a larger map than 'map'.", map.entrySet().containsAll(all.entrySet()));
         assertArrayEquals(new SimpleEntry<?,?>[] {
             new SimpleEntry<>("title",                   title),
-            new SimpleEntry<>("alternateTitles",         emptyList()),
-            new SimpleEntry<>("dates",                   emptyList()),
+            new SimpleEntry<>("alternateTitles",         List.of()),
+            new SimpleEntry<>("dates",                   List.of()),
             new SimpleEntry<>("edition",                 NilReason.UNKNOWN.createNilObject(InternationalString.class)),
             new SimpleEntry<>("identifiers",             citation.getIdentifiers()),
-            new SimpleEntry<>("citedResponsibleParties", singletonList(author)),
-            new SimpleEntry<>("presentationForms",       emptySet()),
-            new SimpleEntry<>("otherCitationDetails",    emptyList()),
+            new SimpleEntry<>("citedResponsibleParties", List.of(author)),
+            new SimpleEntry<>("presentationForms",       Set.of()),
+            new SimpleEntry<>("otherCitationDetails",    List.of()),
             new SimpleEntry<>("ISBN",                    "9782505004509"),
-            new SimpleEntry<>("onlineResources",         emptyList()),
-            new SimpleEntry<>("graphics",                emptyList())
+            new SimpleEntry<>("onlineResources",         List.of()),
+            new SimpleEntry<>("graphics",                List.of())
         }, all.entrySet().toArray());
     }
 
@@ -226,20 +224,20 @@ public final strictfp class ValueMapTest extends TestCase {
         assertFalse("'all' shall be a larger map than 'map'.", map.entrySet().containsAll(all.entrySet()));
         assertArrayEquals(new SimpleEntry<?,?>[] {
             new SimpleEntry<>("title",                   title),
-            new SimpleEntry<>("alternateTitles",         emptyList()),
-            new SimpleEntry<>("dates",                   emptyList()),
+            new SimpleEntry<>("alternateTitles",         List.of()),
+            new SimpleEntry<>("dates",                   List.of()),
             new SimpleEntry<>("edition",                 NilReason.UNKNOWN.createNilObject(InternationalString.class)),
             new SimpleEntry<>("editionDate",             null),
             new SimpleEntry<>("identifiers",             citation.getIdentifiers()),
-            new SimpleEntry<>("citedResponsibleParties", singletonList(author)),
-            new SimpleEntry<>("presentationForms",       emptySet()),
+            new SimpleEntry<>("citedResponsibleParties", List.of(author)),
+            new SimpleEntry<>("presentationForms",       Set.of()),
             new SimpleEntry<>("series",                  null),
-            new SimpleEntry<>("otherCitationDetails",    emptyList()),
+            new SimpleEntry<>("otherCitationDetails",    List.of()),
 //          new SimpleEntry<>("collectiveTitle",         null),  -- deprecated as of ISO 19115:2014.
             new SimpleEntry<>("ISBN",                    "9782505004509"),
             new SimpleEntry<>("ISSN",                    null),
-            new SimpleEntry<>("onlineResources",         emptyList()),
-            new SimpleEntry<>("graphics",                emptyList())
+            new SimpleEntry<>("onlineResources",         List.of()),
+            new SimpleEntry<>("graphics",                List.of())
         }, all.entrySet().toArray());
     }
 
@@ -264,8 +262,8 @@ public final strictfp class ValueMapTest extends TestCase {
         assertNull("ISBN shall have been removed.", citation.getISBN());
         assertTrue("ISBN shall have been removed.", citation.getIdentifiers().isEmpty());
         assertArrayEquals(new SimpleEntry<?,?>[] {
-            new SimpleEntry<>("title",                   title),
-            new SimpleEntry<>("citedResponsibleParties", singletonList(author))
+            new SimpleEntry<>("title", title),
+            new SimpleEntry<>("citedResponsibleParties", List.of(author))
         }, map.entrySet().toArray());
         /*
          * Add a value. Result shall be:
@@ -279,9 +277,9 @@ public final strictfp class ValueMapTest extends TestCase {
         assertNull(map.put("presentationForm", DOCUMENT_HARDCOPY));
         assertEquals(DOCUMENT_HARDCOPY, getSingleton(citation.getPresentationForms()));
         assertArrayEquals(new SimpleEntry<?,?>[] {
-            new SimpleEntry<>("title",                   title),
-            new SimpleEntry<>("citedResponsibleParties", singletonList(author)),
-            new SimpleEntry<>("presentationForms",       singleton(DOCUMENT_HARDCOPY))
+            new SimpleEntry<>("title", title),
+            new SimpleEntry<>("citedResponsibleParties", List.of(author)),
+            new SimpleEntry<>("presentationForms", Set.of(DOCUMENT_HARDCOPY))
         }, map.entrySet().toArray());
         /*
          * Add back the ISBN value. Result shall be:
@@ -300,8 +298,8 @@ public final strictfp class ValueMapTest extends TestCase {
         assertArrayEquals(new SimpleEntry<?,?>[] {
             new SimpleEntry<>("title",                   title),
             new SimpleEntry<>("identifiers",             citation.getIdentifiers()),
-            new SimpleEntry<>("citedResponsibleParties", singletonList(author)),
-            new SimpleEntry<>("presentationForms",       singleton(DOCUMENT_HARDCOPY)),
+            new SimpleEntry<>("citedResponsibleParties", List.of(author)),
+            new SimpleEntry<>("presentationForms",       Set.of(DOCUMENT_HARDCOPY)),
             new SimpleEntry<>("ISBN",                    "9782505004509")
         }, map.entrySet().toArray());
     }
diff --git 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
index c01907e9c5..a23ef5488b 100644
--- 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
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.metadata.iso;
 
+import java.util.Set;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.Collection;
@@ -36,7 +37,6 @@ import org.apache.sis.test.xml.TestCase;
 import org.apache.sis.xml.XML;
 import org.junit.Test;
 
-import static java.util.Collections.singleton;
 import static org.junit.Assert.*;
 
 
@@ -110,7 +110,7 @@ public final strictfp class CustomMetadataTest extends TestCase {
             @Override public Collection<Extent>        getExtents()            {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 --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/MarshallingTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/MarshallingTest.java
index ddf453bd58..5a961e7dcc 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/MarshallingTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/MarshallingTest.java
@@ -18,7 +18,8 @@ package org.apache.sis.metadata.iso;
 
 import java.util.Date;
 import java.util.Locale;
-import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
 import java.util.Map;
 import java.util.Collection;
 import java.util.Collections;
@@ -145,7 +146,7 @@ public final class MarshallingTest extends TestUsingFile implements Filter {
             md.setMetadataIdentifier(id);
         }
         // Languages — one language only, and one (country, language) tuple.
-        final Collection<Locale> languages = Arrays.asList(Locale.ENGLISH, Locale.CANADA_FRENCH);
+        final Collection<Locale> languages = List.of(Locale.ENGLISH, Locale.CANADA_FRENCH);
         md.setLanguages(languages);
 
         // Character Sets (character encoding)
@@ -195,8 +196,8 @@ public final class MarshallingTest extends TestUsingFile implements Filter {
              *       └─Position name………………………………………… Philosopher
              */
             final DefaultContact contact = new DefaultContact();
-            contact.setPhones(Arrays.asList(new DefaultTelephone("555-444-3333", TelephoneType.VOICE),
-                                            new DefaultTelephone("555-555-5555", TelephoneType.FACSIMILE)));
+            contact.setPhones(List.of(new DefaultTelephone("555-444-3333", TelephoneType.VOICE),
+                                      new DefaultTelephone("555-555-5555", TelephoneType.FACSIMILE)));
             {
                 {
                     // Address information
@@ -230,8 +231,8 @@ public final class MarshallingTest extends TestUsingFile implements Filter {
             final DefaultIndividual individual  = new DefaultIndividual("Socrates", "Philosopher", null);
             final DefaultIndividual individual2 = new DefaultIndividual("Hermocrates", "Politician", contact);
             final DefaultOrganisation org = new DefaultOrganisation("Plato Republic", null, individual, contact);
-            md.setContacts(Arrays.asList(new DefaultResponsibility(Role.POINT_OF_CONTACT, null, org),
-                                         new DefaultResponsibility(Role.POINT_OF_CONTACT, null, individual2)));
+            md.setContacts(List.of(new DefaultResponsibility(Role.POINT_OF_CONTACT, null, org),
+                                   new DefaultResponsibility(Role.POINT_OF_CONTACT, null, individual2)));
         }
         // Date info (date stamp in legacy ISO 19115:2003 model)
         final Collection<CitationDate> dateInfo = Collections.singleton(new DefaultCitationDate(new Date(1260961229580L), DateType.CREATION));
@@ -263,7 +264,7 @@ public final class MarshallingTest extends TestUsingFile implements Filter {
             final DefaultDimension cols = new DefaultDimension(DimensionNameType.COLUMN, 2233);
             rows.setResolution(10.0);
             cols.setResolution( 5.0);
-            georectified.setAxisDimensionProperties(Arrays.asList(rows, cols));
+            georectified.setAxisDimensionProperties(List.of(rows, cols));
             georectified.setCellGeometry(CellGeometry.AREA);
             georectified.setPointInPixel(PixelOrientation.UPPER_RIGHT);
             georectified.getCornerPoints().add(NilReason.MISSING.createNilObject(Point.class));
@@ -404,7 +405,7 @@ public final class MarshallingTest extends TestUsingFile implements Filter {
             resolution.setDistance(56777.0);
             dataId.getSpatialResolutions().add(resolution);
         }
-        dataId.setTopicCategories(Arrays.asList(TopicCategory.OCEANS, TopicCategory.SOCIETY));
+        dataId.setTopicCategories(List.of(TopicCategory.OCEANS, TopicCategory.SOCIETY));
         dataId.getStatus().add(Progress.HISTORICAL_ARCHIVE);
         /*
          * Citation………………………………………………………… A lost island
@@ -420,12 +421,12 @@ public final class MarshallingTest extends TestUsingFile implements Filter {
         cit.setEdition(new SimpleInternationalString("First edition"));
         cit.setEditionDate(new Date(1523311200000L));
         cit.setCollectiveTitle(new SimpleInternationalString("Popular legends"));
-        cit.setAlternateTitles(Arrays.asList(new SimpleInternationalString("Island lost again"),
-                                             new Anchor(new URI("http://map-example.com"), "Map example")));
+        cit.setAlternateTitles(List.of(new SimpleInternationalString("Island lost again"),
+                                       new Anchor(new URI("http://map-example.com"), "Map example")));
         cit.getDates().add(new DefaultCitationDate(new Date(1523224800000L), DateType.CREATION));
         cit.getIdentifierMap().putSpecialized(IdentifierSpace.ID, "lost-island");
         dataId.setCitation(cit);
-        dataId.setTemporalResolutions(Collections.emptySet());          // TODO: need a more complete sis-temporal.
+        dataId.setTemporalResolutions(Set.of());          // TODO: need a more complete sis-temporal.
         final Collection<MaintenanceInformation> resourceMaintenances;
         {
             /*
@@ -487,8 +488,8 @@ public final class MarshallingTest extends TestUsingFile implements Filter {
             final DefaultKeywordClass keywordClass = new DefaultKeywordClass();
             keywordClass.setClassName(new SimpleInternationalString("Greek elements"));
             keywords.setKeywordClass(keywordClass);
-            keywords.setKeywords(Arrays.asList(new SimpleInternationalString("Water"),
-                                               new SimpleInternationalString("Aether")));
+            keywords.setKeywords(List.of(new SimpleInternationalString("Water"),
+                                         new SimpleInternationalString("Aether")));
             keywords.getIdentifierMap().putSpecialized(IdentifierSpace.ID, "greek-elements");
             descriptiveKeywords = Collections.singleton(keywords);
             dataId.setDescriptiveKeywords(descriptiveKeywords);
@@ -545,7 +546,7 @@ public final class MarshallingTest extends TestUsingFile implements Filter {
             }
             serviceId.getContainsOperations().add(operationMetadata);
             serviceId.getOperatesOn().add(dataId);
-            md.setIdentificationInfo(Arrays.asList(dataId, serviceId));
+            md.setIdentificationInfo(List.of(dataId, serviceId));
         }
         {
             // Content info
@@ -587,7 +588,7 @@ public final class MarshallingTest extends TestUsingFile implements Filter {
                     sampleDimension.setMaxValue(22.22);
                     sampleDimension.setUnits(Units.CELSIUS);
                     sampleDimension.setScaleFactor(1.5);
-                    attributeGroup.setAttributes(Arrays.asList(rangeDimension, sampleDimension));
+                    attributeGroup.setAttributes(List.of(rangeDimension, sampleDimension));
                     coverageDescription.getAttributeGroups().add(attributeGroup);
                 }
             }
@@ -595,7 +596,7 @@ public final class MarshallingTest extends TestUsingFile implements Filter {
             final DefaultFeatureCatalogueDescription featureCatalogueDescription = new DefaultFeatureCatalogueDescription();
             featureCatalogueDescription.setIncludedWithDataset(true);
             featureCatalogueDescription.setCompliant(true);
-            md.setContentInfo(Arrays.asList(coverageDescription, featureCatalogueDescription));
+            md.setContentInfo(List.of(coverageDescription, featureCatalogueDescription));
         }
         return md;
     }
diff --git 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
index dabbd9c224..c9faf85073 100644
--- 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
@@ -18,7 +18,6 @@ package org.apache.sis.metadata.iso.citation;
 
 import java.util.Set;
 import java.util.List;
-import java.util.Arrays;
 import java.util.Locale;
 import java.util.Collection;
 import java.util.Collections;
@@ -288,7 +287,7 @@ public final strictfp class CitationsTest extends TestCase {
         final Identifier ogc = new DefaultIdentifier("OGC", "06-042", null);
         final Identifier iso = new DefaultIdentifier("ISO", "19128", null);
         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"));
diff --git 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
index 98605b4a16..a38d2ebc3f 100644
--- 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
@@ -17,7 +17,7 @@
 package org.apache.sis.metadata.iso.citation;
 
 import java.net.URI;
-import java.util.Arrays;
+import java.util.List;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
@@ -82,12 +82,12 @@ public final strictfp class DefaultCitationTest extends TestUsingFile {
         title.add(Locale.ENGLISH,  "Undercurrent");
         citation.setTitle(title);
         citation.setISBN("9782505004509");
-        citation.setPresentationForms(Arrays.asList(
+        citation.setPresentationForms(List.of(
                 PresentationForm.DOCUMENT_HARDCOPY,
                 PresentationForm.DOCUMENT_DIGITAL));
         citation.setAlternateTitles(Collections.singleton(
                 new SimpleInternationalString("Andākarento")));   // Actually a different script of the Japanese title.
-        citation.setCitedResponsibleParties(Arrays.asList(
+        citation.setCitedResponsibleParties(List.of(
                 new DefaultResponsibility(Role.AUTHOR, null, new DefaultIndividual("Testsuya Toyoda", null, null)),
                 new DefaultResponsibility(Role.EDITOR, Extents.WORLD, new DefaultOrganisation("Kōdansha", null, null, null))));
         return citation;
@@ -115,7 +115,7 @@ public final strictfp class DefaultCitationTest extends TestUsingFile {
          * The ISSN code shall be retained because it is a new code.
          */
         assertNull("ISSN shall be initially null.", citation.getISSN());
-        citation.setIdentifiers(Arrays.asList(
+        citation.setIdentifiers(List.of(
                 new DefaultIdentifier(Citations.NETCDF, "MyNetCDF"),
                 new DefaultIdentifier(Citations.EPSG,   "MyEPSG"),
                 new DefaultIdentifier(Citations.ISBN,   "NewISBN"),
@@ -247,7 +247,7 @@ public final strictfp class DefaultCitationTest extends TestUsingFile {
         contact.setContactInstructions(new SimpleInternationalString("Send carrier pigeon."));
         contact.getIdentifierMap().putSpecialized(IdentifierSpace.ID, "ip-protocol");
         final DefaultCitation c = new DefaultCitation("Fight against poverty");
-        c.setCitedResponsibleParties(Arrays.asList(
+        c.setCitedResponsibleParties(List.of(
                 new DefaultResponsibility(Role.ORIGINATOR, null, new DefaultIndividual("Maid Marian", null, contact)),
                 new DefaultResponsibility(Role.FUNDER,     null, new DefaultIndividual("Robin Hood",  null, contact))
         ));
diff --git 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
index 598b702fc6..1f001a364b 100644
--- 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
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.metadata.iso.citation;
 
-import java.util.Arrays;
+import java.util.List;
 import java.util.Collection;
 import java.util.logging.Filter;
 import java.util.logging.LogRecord;
@@ -88,7 +88,7 @@ public final strictfp class DefaultContactTest extends TestCase implements Filte
         final DefaultTelephone   tel4 = new DefaultTelephone("00.04", TelephoneType.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
@@ -149,8 +149,8 @@ public final strictfp class DefaultContactTest extends TestCase implements Filte
     private void testSetPhone(final boolean hideSIS) {
         init();
         final DefaultTelephone tel = new DefaultTelephone();
-        tel.setVoices(Arrays.asList("00.02", "00.04"));
-        tel.setFacsimiles(Arrays.asList("00.03"));
+        tel.setVoices(List.of("00.02", "00.04"));
+        tel.setFacsimiles(List.of("00.03"));
         final Telephone view;
         if (hideSIS) {
             view = new Telephone() {
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultResponsibilityTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultResponsibilityTest.java
index 1dabcbfd47..0974ad48d1 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultResponsibilityTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultResponsibilityTest.java
@@ -16,13 +16,13 @@
  */
 package org.apache.sis.metadata.iso.citation;
 
+import java.util.Set;
 import javax.xml.bind.JAXBException;
 import org.opengis.metadata.citation.Role;
 import org.apache.sis.test.xml.TestCase;
 import org.apache.sis.internal.xml.LegacyNamespaces;
 import org.junit.Test;
 
-import static java.util.Collections.singleton;
 import static org.apache.sis.test.MetadataAssert.*;
 
 
@@ -46,7 +46,7 @@ public final strictfp class DefaultResponsibilityTest extends TestCase {
         final DefaultIndividual  party = new DefaultIndividual("An author", null, null);
         final DefaultResponsibility  r = new DefaultResponsibility(Role.AUTHOR, null, party);
         final DefaultCitation citation = new DefaultCitation();
-        citation.setCitedResponsibleParties(singleton(r));
+        citation.setCitedResponsibleParties(Set.of(r));
         final String xml = marshal(citation, VERSION_2007);
         assertXmlEquals("<gmd:CI_Citation xmlns:gco=\"" + LegacyNamespaces.GCO + '"' +
                                         " xmlns:gmd=\"" + LegacyNamespaces.GMD + "\">\n" +
diff --git 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
index 58012543f8..1e41e1df9b 100644
--- 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
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.metadata.iso.constraint;
 
+import java.util.Set;
 import javax.xml.bind.JAXBException;
 import org.opengis.metadata.constraint.Restriction;
 import org.apache.sis.xml.Namespaces;
@@ -23,7 +24,6 @@ import org.apache.sis.internal.xml.LegacyNamespaces;
 import org.apache.sis.test.xml.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singleton;
 import static org.apache.sis.test.MetadataAssert.*;
 import static org.apache.sis.test.TestUtilities.getSingleton;
 import static org.apache.sis.internal.metadata.ImplementationHelper.ISO_NAMESPACE;
@@ -85,7 +85,7 @@ public final strictfp class DefaultLegalConstraintsTest extends TestCase {
                 "</mco:MD_LegalConstraints>\n";
 
         final DefaultLegalConstraints c = new DefaultLegalConstraints();
-        c.setUseConstraints(singleton(Restriction.LICENCE));
+        c.setUseConstraints(Set.of(Restriction.LICENCE));
         assertXmlEquals(xml, marshal(c), "xmlns:*");
         DefaultLegalConstraints actual = unmarshal(DefaultLegalConstraints.class, xml);
         assertSame(Restriction.LICENCE, getSingleton(actual.getUseConstraints()));
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/DefaultExtentTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/DefaultExtentTest.java
index 8a19f7cb35..837a38126a 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/DefaultExtentTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/extent/DefaultExtentTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.metadata.iso.extent;
 
-import java.util.Arrays;
+import java.util.List;
 import javax.xml.bind.JAXBException;
 import org.opengis.metadata.extent.Extent;
 import org.apache.sis.util.Version;
@@ -74,7 +74,7 @@ public final strictfp class DefaultExtentTest extends TestUsingFile {
          * intersection. That bounding box should be omitted.
          */
         bounds2.setBounds(8, 12, 33, 35);
-        e1.setGeographicElements(Arrays.asList(bounds1, bounds2));
+        e1.setGeographicElements(List.of(bounds1, bounds2));
         e2.setDescription(new SimpleInternationalString("Somewhere else"));
         e1.intersect(e2);
         assertTrue("isNil(description)", e1.getDescription() instanceof NilObject);
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/AbstractElementTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/AbstractElementTest.java
index f06163f89c..ecbd7e250c 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/AbstractElementTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/AbstractElementTest.java
@@ -18,7 +18,7 @@ package org.apache.sis.metadata.iso.quality;
 
 import java.time.Instant;
 import java.util.Date;
-import java.util.Arrays;
+import java.util.List;
 import java.util.Iterator;
 import java.util.Collection;
 import org.apache.sis.test.TestCase;
@@ -44,7 +44,7 @@ public final strictfp class AbstractElementTest extends TestCase {
         final Instant   startTime = Instant.parse("2009-05-08T14:10:00Z");
         final Instant     endTime = Instant.parse("2009-05-12T21:45:00Z");
         final DefaultEvaluationMethod method = new DefaultEvaluationMethod();
-        method.setDates(Arrays.asList(startTime, endTime));
+        method.setDates(List.of(startTime, endTime));
         final AbstractElement element = new AbstractElement();
         element.setEvaluationMethod(method);
 
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/DefaultDomainConsistencyTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/DefaultDomainConsistencyTest.java
index 0ad12c0936..20a3c850cb 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/DefaultDomainConsistencyTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/DefaultDomainConsistencyTest.java
@@ -17,7 +17,8 @@
 package org.apache.sis.metadata.iso.quality;
 
 import java.util.Map;
-import java.util.Collections;
+import java.util.List;
+import java.util.Set;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
@@ -41,7 +42,7 @@ public final strictfp class DefaultDomainConsistencyTest extends TestCase {
         final DefaultDescriptiveResult r = new DefaultDescriptiveResult("A result");
         final DefaultDomainConsistency c = new DefaultDomainConsistency();
         final Map<String,Object> m = c.asMap();
-        c.setResults(Collections.singleton(r));
-        assertEquals(Collections.singletonList(r), m.get("result"));
+        c.setResults(Set.of(r));
+        assertEquals(List.of(r), m.get("result"));
     }
 }
diff --git 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
index 494b9e99d1..9429c08c41 100644
--- 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,9 +16,7 @@
  */
 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;
@@ -48,7 +46,7 @@ public final strictfp class MetadataFallbackVerifier {
     /**
      * Identifier for which {@link MetadataFallback} does not provide hard-coded values.
      */
-    private static final Set<String> EXCLUDES = new HashSet<>(Arrays.asList("NetCDF", "GeoTIFF", "ArcGIS", "MapInfo"));
+    private static final Set<String> EXCLUDES = Set.of("NetCDF", "GeoTIFF", "ArcGIS", "MapInfo");
 
     /**
      * Creates a temporary database for comparing {@link MetadataFallback} content with database content.
diff --git 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
index 23bf003cea..69fc072aff 100644
--- 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,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;
@@ -208,7 +208,7 @@ public final strictfp class MetadataWriterTest extends TestCase {
     @SuppressWarnings("deprecation")
     private void readWriteDeprecated() throws MetadataStoreException {
         final DefaultTelephone tel = new DefaultTelephone();
-        tel.setVoices(Collections.singleton("01.02.03.04"));
+        tel.setVoices(Set.of("01.02.03.04"));
         assertEquals("01.02.03.04", source.add(tel));
 
         final Telephone check = source.lookup(Telephone.class, "01.02.03.04");
diff --git 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
index 634f1e2efb..3303ddb1cf 100644
--- 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
@@ -17,6 +17,7 @@
 package org.apache.sis.test.mock;
 
 import java.util.Map;
+import java.util.Set;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Locale;
@@ -86,7 +87,7 @@ public final strictfp class MetadataMock extends SimpleMetadata {
     @Override
     @Deprecated
     public Collection<Locale> getLanguages() {
-        return (language != null) ? Collections.singleton(language) : Collections.emptySet();
+        return (language != null) ? Set.of(language) : Set.of();
     }
 
     /**
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/test/xml/PackageVerifier.java b/core/sis-metadata/src/test/java/org/apache/sis/test/xml/PackageVerifier.java
index f1e1c34ba5..02ffd7b3bd 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/test/xml/PackageVerifier.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/test/xml/PackageVerifier.java
@@ -20,7 +20,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.HashMap;
 import java.util.Collection;
-import java.util.Collections;
 import java.io.IOException;
 import java.lang.reflect.Type;
 import java.lang.reflect.Field;
@@ -79,44 +78,32 @@ final strictfp class PackageVerifier {
      * we had to keep the namespace declared in {@link org.apache.sis.util.iso.DefaultScopedName}
      * (the replacement is performed by {@code org.apache.sis.xml.TransformingWriter}).</p>
      */
-    private static final Map<String, Set<String>> LEGACY_NAMESPACES;
-    static {
-        final Map<String, Set<String>> m = new HashMap<>(8);
-        m.put(LegacyNamespaces.GMD, ALL);
-        m.put(LegacyNamespaces.GMI, ALL);
-        m.put(LegacyNamespaces.GMX, ALL);
-        m.put(LegacyNamespaces.SRV, ALL);
-        m.put(Namespaces.GCO, Collections.singleton("ScopedName"));     // Not to be confused with standard <srv:scopedName>
-        LEGACY_NAMESPACES = Collections.unmodifiableMap(m);
-    }
+    private static final Map<String, Set<String>> LEGACY_NAMESPACES = Map.of(
+            LegacyNamespaces.GMD, ALL,
+            LegacyNamespaces.GMI, ALL,
+            LegacyNamespaces.GMX, ALL,
+            LegacyNamespaces.SRV, ALL,
+            Namespaces.GCO, Set.of("ScopedName"));     // Not to be confused with standard <srv:scopedName>
 
     /**
      * Types declared in JAXB annotations to be considered as equivalent to types in XML schemas.
      */
-    private static final Map<String,String> TYPE_EQUIVALENCES;
-    static {
-        final Map<String,String> m = new HashMap<>();
-        m.put("PT_FreeText",             "CharacterString");
-        m.put("Abstract_Citation",       "CI_Citation");
-        m.put("AbstractCI_Party",        "CI_Party");
-        m.put("Abstract_Responsibility", "CI_Responsibility");
-        m.put("Abstract_Extent",         "EX_Extent");
-        TYPE_EQUIVALENCES = Collections.unmodifiableMap(m);
-    }
+    private static final Map<String,String> TYPE_EQUIVALENCES = Map.of(
+            "PT_FreeText",             "CharacterString",
+            "Abstract_Citation",       "CI_Citation",
+            "AbstractCI_Party",        "CI_Party",
+            "Abstract_Responsibility", "CI_Responsibility",
+            "Abstract_Extent",         "EX_Extent");
 
     /**
      * XML elements that are not yet in the XML schema used by this verifier.
      * They are XML elements added by corrigendum applied on abstract models,
      * but not yet (at the time of writing this test) propagated in the XML schema.
      */
-    private static final Map<Class<?>, String> PENDING_XML_ELEMENTS;
-    static {
-        final Map<Class<?>,String> m = new HashMap<>();
-        m.put(org.apache.sis.metadata.iso.citation.AbstractParty.class, "partyIdentifier");
-        m.put(org.apache.sis.metadata.iso.content.DefaultSampleDimension.class, "rangeElementDescription");
-        m.put(org.apache.sis.metadata.iso.spatial.AbstractSpatialRepresentation.class, "scope");
-        PENDING_XML_ELEMENTS = Collections.unmodifiableMap(m);
-    }
+    private static final Map<Class<?>, String> PENDING_XML_ELEMENTS = Map.of(
+            org.apache.sis.metadata.iso.citation.AbstractParty.class, "partyIdentifier",
+            org.apache.sis.metadata.iso.content.DefaultSampleDimension.class, "rangeElementDescription",
+            org.apache.sis.metadata.iso.spatial.AbstractSpatialRepresentation.class, "scope");
 
     /**
      * The schemas to compare with the JAXB annotations.
@@ -265,7 +252,7 @@ final strictfp class PackageVerifier {
         classNS           = null;
         currentClass      = type;
         isDeprecatedClass = false;
-        properties        = Collections.emptyMap();
+        properties        = Map.of();
 
         final XmlType        xmlType = type.getDeclaredAnnotation(XmlType.class);
         final XmlRootElement xmlRoot = type.getDeclaredAnnotation(XmlRootElement.class);
@@ -434,7 +421,7 @@ final strictfp class PackageVerifier {
          * We do not verify fully the properties in legacy namespaces because we didn't loaded their schemas.
          * However, we verify at least that those properties are not declared as required.
          */
-        if (LEGACY_NAMESPACES.getOrDefault(ns, Collections.emptySet()).contains(name)) {
+        if (LEGACY_NAMESPACES.getOrDefault(ns, Set.of()).contains(name)) {
             if (!isDeprecatedClass && element.required()) {
                 throw new SchemaException(errorInClassMember(javaName)
                         .append("Legacy property should not be required.").toString());
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/util/iso/DefaultScopedNameTest.java b/core/sis-metadata/src/test/java/org/apache/sis/util/iso/DefaultScopedNameTest.java
index 42cc7a837e..def9030431 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/util/iso/DefaultScopedNameTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/util/iso/DefaultScopedNameTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.util.iso;
 
+import java.util.List;
 import java.util.Arrays;
 import org.opengis.util.GenericName;
 import org.apache.sis.util.SimpleInternationalString;
@@ -69,9 +70,9 @@ public final strictfp class DefaultScopedNameTest extends TestCase {
      */
     @Test
     public void testSimpleInternationalString() {
-        GenericName n1 = new DefaultScopedName(null, Arrays.asList("ns1", "Route"));
-        GenericName n2 = new DefaultScopedName(null, Arrays.asList(new SimpleInternationalString("ns1"), "Route"));
-        GenericName n3 = new DefaultScopedName(null, Arrays.asList("ns1", new SimpleInternationalString("Route")));
+        GenericName n1 = new DefaultScopedName(null, List.of("ns1", "Route"));
+        GenericName n2 = new DefaultScopedName(null, List.of(new SimpleInternationalString("ns1"), "Route"));
+        GenericName n3 = new DefaultScopedName(null, List.of("ns1", new SimpleInternationalString("Route")));
         assertNameEqual(n1, n2);
         assertNameEqual(n1, n3);
         assertNameEqual(n2, n3);
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/util/iso/TypesTest.java b/core/sis-metadata/src/test/java/org/apache/sis/util/iso/TypesTest.java
index 107ef0978f..7544a747df 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/util/iso/TypesTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/util/iso/TypesTest.java
@@ -17,6 +17,7 @@
 package org.apache.sis.util.iso;
 
 import java.util.Map;
+import java.util.List;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.TreeMap;
@@ -257,7 +258,7 @@ public final strictfp class TypesTest extends TestCase {
     @Test
     public void testGetCodeValues() {
         final OnLineFunction[] actual = Types.getCodeValues(OnLineFunction.class);
-        assertTrue(Arrays.asList(actual).containsAll(Arrays.asList(
+        assertTrue(Arrays.asList(actual).containsAll(List.of(
                 OnLineFunction.INFORMATION, OnLineFunction.SEARCH, OnLineFunction.ORDER,
                 OnLineFunction.DOWNLOAD, OnLineFunction.OFFLINE_ACCESS)));
     }
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/xml/RenameListGenerator.java b/core/sis-metadata/src/test/java/org/apache/sis/xml/RenameListGenerator.java
index bbc605559b..ad6ca6bf1e 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/xml/RenameListGenerator.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/xml/RenameListGenerator.java
@@ -25,9 +25,6 @@ import java.nio.file.Files;
 import java.nio.file.DirectoryStream;
 import java.nio.file.DirectoryIteratorException;
 import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Collections;
 import java.lang.reflect.Method;
 import javax.xml.bind.annotation.XmlSchema;
 import javax.xml.bind.annotation.XmlElement;
@@ -79,8 +76,10 @@ public final class RenameListGenerator {
     /**
      * Properties in those namespaces do not have older namespaces to map from.
      */
-    private static final Set<String> LEGACY_NAMESPACES = Collections.unmodifiableSet(new HashSet<>(
-            Arrays.asList(LegacyNamespaces.GMD, LegacyNamespaces.GMI, LegacyNamespaces.SRV)));
+    private static final Set<String> LEGACY_NAMESPACES = Set.of(
+            LegacyNamespaces.GMD,
+            LegacyNamespaces.GMI,
+            LegacyNamespaces.SRV);
 
     /**
      * The {@value} string used in JAXB annotations for default names or namespaces.
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/xml/TransformingNamespacesTest.java b/core/sis-metadata/src/test/java/org/apache/sis/xml/TransformingNamespacesTest.java
index d433dab052..15bfff9f42 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/xml/TransformingNamespacesTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/xml/TransformingNamespacesTest.java
@@ -16,12 +16,11 @@
  */
 package org.apache.sis.xml;
 
-import java.util.Arrays;
+import java.util.List;
 import java.util.Set;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Collection;
-import java.util.Collections;
 import javax.xml.namespace.NamespaceContext;
 import org.apache.sis.internal.xml.LegacyNamespaces;
 import org.apache.sis.test.TestCase;
@@ -43,7 +42,7 @@ public final strictfp class TransformingNamespacesTest extends TestCase implemen
      * All prefixes declared in this test.
      */
     private static Collection<String> prefixes() {
-        return Arrays.asList("mdq", "ns1", "ns2", "cit", "mdb", "gex");
+        return List.of("mdq", "ns1", "ns2", "cit", "mdb", "gex");
     }
 
     /**
@@ -74,12 +73,12 @@ public final strictfp class TransformingNamespacesTest extends TestCase implemen
         switch (namespaceURI) {
             case Namespaces.MDQ: {
                 // Arbitrarily return more than one prefix for that namespace.
-                prefixes = Arrays.asList("mdq", "ns1", "ns2");
+                prefixes = List.of("mdq", "ns1", "ns2");
                 break;
             }
             default: {
                 final String p = getPrefix(namespaceURI);
-                prefixes = (p != null) ? Collections.singleton(p) : Collections.emptySet();
+                prefixes = (p != null) ? Set.of(p) : Set.of();
                 break;
             }
         }
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/xml/XLinkMarshallingTest.java b/core/sis-metadata/src/test/java/org/apache/sis/xml/XLinkMarshallingTest.java
index 8398ecb624..4faf343014 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/xml/XLinkMarshallingTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/xml/XLinkMarshallingTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.xml;
 
-import java.util.Collections;
+import java.util.Set;
 import java.net.URI;
 import java.net.URISyntaxException;
 import javax.xml.bind.JAXBException;
@@ -103,7 +103,7 @@ public final strictfp class XLinkMarshallingTest extends TestCase {
         final DefaultDataIdentification identification = new DefaultDataIdentification();
         identification.getIdentifierMap().putSpecialized(IdentifierSpace.XLINK, xlink);
         final DefaultMetadata metadata = new DefaultMetadata();
-        metadata.setIdentificationInfo(Collections.singleton(identification));
+        metadata.setIdentificationInfo(Set.of(identification));
 
         assertXmlEquals(LINK_ONLY_XML, marshal(metadata), "xmlns:*");
         verify(true, unmarshal(DefaultMetadata.class, LINK_ONLY_XML));
@@ -136,7 +136,7 @@ public final strictfp class XLinkMarshallingTest extends TestCase {
         identification.getIdentifierMap().putSpecialized(IdentifierSpace.XLINK, xlink);
         identification.setAbstract(new SimpleInternationalString("This is a test."));
         final DefaultMetadata metadata = new DefaultMetadata();
-        metadata.setIdentificationInfo(Collections.singleton(identification));
+        metadata.setIdentificationInfo(Set.of(identification));
 
         assertXmlEquals(LINK_WITH_ELEMENT_XML, marshal(metadata), "xmlns:*");
         final DefaultMetadata unmarshal = unmarshal(DefaultMetadata.class, LINK_WITH_ELEMENT_XML);
diff --git a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/ListChangeEvent.java b/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/ListChangeEvent.java
index 7853b63d0d..73019d6a06 100644
--- a/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/ListChangeEvent.java
+++ b/core/sis-portrayal/src/main/java/org/apache/sis/internal/map/ListChangeEvent.java
@@ -17,9 +17,6 @@
 package org.apache.sis.internal.map;
 
 import java.beans.PropertyChangeEvent;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import org.apache.sis.measure.NumberRange;
 
@@ -46,7 +43,7 @@ public final class ListChangeEvent<T> extends PropertyChangeEvent {
         super(source, propertyName, originalList, originalList);
         this.range = range;
         this.type = type;
-        this.items = (items != null) ? Collections.unmodifiableList(new ArrayList<>(items)) : null;
+        this.items = (items != null) ? List.copyOf(items) : null;
     }
 
     /**
@@ -77,7 +74,7 @@ public final class ListChangeEvent<T> extends PropertyChangeEvent {
     }
 
     public static <T> ListChangeEvent<T> added(Object source, String propertyName, List<T> originalList, T newItem, final int index) {
-        return added(source, propertyName, originalList, Arrays.asList(newItem),
+        return added(source, propertyName, originalList, List.of(newItem),
                 NumberRange.create(index, true, index, true));
     }
 
@@ -86,7 +83,7 @@ public final class ListChangeEvent<T> extends PropertyChangeEvent {
     }
 
     public static <T> ListChangeEvent<T> removed(Object source, String propertyName, List<T> originalList, T newItem, final int index) {
-        return removed(source, propertyName, originalList, Arrays.asList(newItem),
+        return removed(source, propertyName, originalList, List.of(newItem),
                 NumberRange.create(index, true, index, true));
     }
 
diff --git a/core/sis-portrayal/src/test/java/org/apache/sis/internal/map/SEPortrayerTest.java b/core/sis-portrayal/src/test/java/org/apache/sis/internal/map/SEPortrayerTest.java
index a9469550d4..a2a71cb11f 100644
--- a/core/sis-portrayal/src/test/java/org/apache/sis/internal/map/SEPortrayerTest.java
+++ b/core/sis-portrayal/src/test/java/org/apache/sis/internal/map/SEPortrayerTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.sis.internal.map;
 
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -122,7 +121,7 @@ public class SEPortrayerTest extends TestCase {
         shark1.setPropertyValue("specie", "White Shark");
         shark1.setPropertyValue("length", 12.0);
 
-        fishes = new MemoryFeatureSet(null, sharkType, Arrays.asList(fish1, fish2, shark1));
+        fishes = new MemoryFeatureSet(null, sharkType, List.of(fish1, fish2, shark1));
 
         final FeatureTypeBuilder boatbuilder = new FeatureTypeBuilder();
         boatbuilder.setName("boat");
@@ -147,7 +146,7 @@ public class SEPortrayerTest extends TestCase {
         boat2.setPropertyValue("geom", poly2);
         boat2.setPropertyValue("description", "A submarine");
 
-        boats = new MemoryFeatureSet(null, boatType, Arrays.asList(boat1, boat2));
+        boats = new MemoryFeatureSet(null, boatType, List.of(boat1, boat2));
     }
 
     private Set<Match> present(MapItem item) {
@@ -525,7 +524,7 @@ public class SEPortrayerTest extends TestCase {
         style.featureTypeStyles().add(fts);
         fts.rules().add(ruleBase);
 
-        final List<Resource> list = Arrays.asList(fishes, boats);
+        final List<Resource> list = List.of(fishes, boats);
         final Aggregate agg = new Aggregate() {
             @Override
             public Collection<? extends Resource> components() throws DataStoreException {
diff --git a/core/sis-portrayal/src/test/java/org/apache/sis/internal/map/coverage/MultiResolutionCoverageLoaderTest.java b/core/sis-portrayal/src/test/java/org/apache/sis/internal/map/coverage/MultiResolutionCoverageLoaderTest.java
index 85c380d99a..d36e115cd8 100644
--- a/core/sis-portrayal/src/test/java/org/apache/sis/internal/map/coverage/MultiResolutionCoverageLoaderTest.java
+++ b/core/sis-portrayal/src/test/java/org/apache/sis/internal/map/coverage/MultiResolutionCoverageLoaderTest.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.map.coverage;
 
 import java.util.List;
-import java.util.Arrays;
 import java.util.Collections;
 import java.awt.image.RenderedImage;
 import org.opengis.geometry.DirectPosition;
@@ -110,10 +109,9 @@ public final strictfp class MultiResolutionCoverageLoaderTest extends TestCase {
 
         /** Returns the preferred resolutions in units of CRS axes. */
         @Override public List<double[]> getResolutions() {
-            return Arrays.asList(
-                    new double[] {2, 3, 1},
-                    new double[] {4, 4, 3},
-                    new double[] {8, 9, 5});
+            return List.of(new double[] {2, 3, 1},
+                           new double[] {4, 4, 3},
+                           new double[] {8, 9, 5});
         }
 
         /** Returns a grid geometry with the resolution of finest level. */
diff --git a/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/GazetteerFactory.java b/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/GazetteerFactory.java
index ed3bcf8952..6cc1b70942 100644
--- a/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/GazetteerFactory.java
+++ b/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/GazetteerFactory.java
@@ -16,8 +16,8 @@
  */
 package org.apache.sis.referencing.gazetteer;
 
+import java.util.List;
 import java.util.Set;
-import java.util.Arrays;
 import java.util.LinkedHashSet;
 import java.util.Optional;
 import org.apache.sis.internal.util.Constants;
@@ -58,7 +58,7 @@ public class GazetteerFactory extends AbstractFactory {
          * In current implementation of `sis-javafx` module, the order in this set determines the order
          * of menu items. So we want a "nice" order and a `Set` implementation that preserve it.
          */
-        return new LinkedHashSet<>(Arrays.asList(
+        return new LinkedHashSet<>(List.of(
                 MilitaryGridReferenceSystem.IDENTIFIER,
                 GeohashReferenceSystem.IDENTIFIER));
     }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/PositionalAccuracyConstant.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/PositionalAccuracyConstant.java
index 9d3672590d..79bbb736f6 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/PositionalAccuracyConstant.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/PositionalAccuracyConstant.java
@@ -16,8 +16,8 @@
  */
 package org.apache.sis.internal.referencing;
 
+import java.util.Set;
 import java.util.Collection;
-import java.util.Collections;
 import java.io.ObjectStreamException;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.measure.quantity.Length;
@@ -124,7 +124,7 @@ public final class PositionalAccuracyConstant extends DefaultAbsoluteExternalPos
             final InternationalString evaluationMethodDescription, final boolean pass)
     {
         DefaultConformanceResult result = new DefaultConformanceResult(Citations.SIS, evaluationMethodDescription, pass);
-        setResults(Collections.singleton(result));
+        setResults(Set.of(result));
         setMeasureDescription(measureDescription);
         setEvaluationMethodDescription(evaluationMethodDescription);
         setEvaluationMethodType(EvaluationMethodType.DIRECT_INTERNAL);
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/CommonAuthorityFactory.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
index 86c9907966..eb8d8905ab 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
@@ -18,10 +18,10 @@ package org.apache.sis.referencing.factory;
 
 import java.util.Map;
 import java.util.Set;
+import java.util.List;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Collections;
-import java.util.Arrays;
 import javax.measure.Unit;
 import javax.measure.quantity.Length;
 import org.opengis.util.FactoryException;
@@ -230,7 +230,7 @@ public class CommonAuthorityFactory extends GeodeticAuthorityFactory implements
      * @see #getCodeSpaces()
      */
     private static final Set<String> CODESPACES = Collections.unmodifiableSet(
-            new LinkedHashSet<>(Arrays.asList(Constants.OGC, Constants.CRS, "AUTO", AUTO2)));
+            new LinkedHashSet<>(List.of(Constants.OGC, Constants.CRS, "AUTO", AUTO2)));
 
     /**
      * First code in the AUTO(2) namespace.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
index b19617cede..f75879798e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
@@ -436,7 +436,7 @@ public class EPSGDataAccess extends GeodeticAuthorityFactory implements CRSAutho
          * We do not cache this citation because the caching service is already provided by ConcurrentAuthorityFactory.
          */
         final DefaultCitation c = new DefaultCitation("EPSG Geodetic Parameter Dataset");
-        c.setIdentifiers(Collections.singleton(new ImmutableIdentifier(null, null, Constants.EPSG)));
+        c.setIdentifiers(Set.of(new ImmutableIdentifier(null, null, Constants.EPSG)));
         try {
             /*
              * Get the most recent version number from the history table. We get the date in local timezone
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGFactory.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGFactory.java
index b449b336e4..3140648a46 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGFactory.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGFactory.java
@@ -94,7 +94,7 @@ public class EPSGFactory extends ConcurrentAuthorityFactory<EPSGDataAccess> impl
      *
      * @see #getCodeSpaces()
      */
-    private static final Set<String> CODESPACES = Collections.singleton(Constants.EPSG);
+    private static final Set<String> CODESPACES = Set.of(Constants.EPSG);
 
     /**
      * The factory to use for creating {@link Connection}s to the EPSG database.
diff --git 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
index fc998b39b5..2c7b8ab36e 100644
--- 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,7 +16,7 @@
  */
 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.apache.sis.internal.util.Constants;
@@ -95,7 +95,7 @@ public final strictfp class CodeTest extends TestCase {
     @DependsOnMethod("testWithVersion")
     public void testForIdentifiedObject() {
         final Identifier 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);
@@ -112,7 +112,7 @@ public final strictfp class CodeTest extends TestCase {
         authority.getIdentifiers().add(new ImmutableIdentifier(null, "OGP", "EPSG"));
 
         final Identifier 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 --git a/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/WKTDictionaryTest.java b/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/WKTDictionaryTest.java
index c03afa29f5..fb4a133f89 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/WKTDictionaryTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/WKTDictionaryTest.java
@@ -18,7 +18,7 @@ package org.apache.sis.io.wkt;
 
 import java.util.Set;
 import java.util.Map;
-import java.util.Arrays;
+import java.util.List;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
 import java.util.function.Consumer;
@@ -64,7 +64,7 @@ public final strictfp class WKTDictionaryTest extends TestCase {
     @Test
     public void testAddDefinitions() throws FactoryException {
         final WKTDictionary factory = new WKTDictionary(null);
-        factory.addDefinitions(Arrays.asList(
+        factory.addDefinitions(List.of(
                 "GeodCRS[\"Anguilla 1957\",\n" +
                 " Datum[\"Anguilla 1957\",\n" +
                 "  Ellipsoid[\"Clarke 1880\", 6378249.145, 293.465]],\n" +
@@ -90,7 +90,7 @@ public final strictfp class WKTDictionaryTest extends TestCase {
         assertSame( codes,  factory.getAuthorityCodes(GeodeticCRS.class));
         assertSame( codes,  factory.getAuthorityCodes(GeographicCRS.class));
         assertEquals(0, factory.getAuthorityCodes(ProjectedCRS.class).size());
-        assertSetEquals(Arrays.asList("21", "E1"), codes);
+        assertSetEquals(List.of("21", "E1"), codes);
         /*
          * Tests CRS creation, potentially with expected error.
          */
@@ -138,10 +138,10 @@ public final strictfp class WKTDictionaryTest extends TestCase {
         Set<String> codes = factory.getAuthorityCodes(IdentifiedObject.class);
         assertSame( codes,  factory.getAuthorityCodes(IdentifiedObject.class));     // Test caching.
         assertSame( codes,  factory.getAuthorityCodes(SingleCRS.class));            // Test sharing.
-        assertSetEquals(Arrays.asList("102018", "ESRI::102021", "TEST::102021", "TEST:v2:102021", "E1", "E2"), codes);
-        assertSetEquals(Arrays.asList("102018", "ESRI::102021"), factory.getAuthorityCodes(ProjectedCRS.class));
+        assertSetEquals(List.of("102018", "ESRI::102021", "TEST::102021", "TEST:v2:102021", "E1", "E2"), codes);
+        assertSetEquals(List.of("102018", "ESRI::102021"), factory.getAuthorityCodes(ProjectedCRS.class));
         codes = factory.getAuthorityCodes(GeographicCRS.class);
-        assertSetEquals(Arrays.asList("TEST::102021", "TEST:v2:102021", "E1", "E2"), codes);
+        assertSetEquals(List.of("TEST::102021", "TEST:v2:102021", "E1", "E2"), codes);
         assertSame(codes, factory.getAuthorityCodes(GeodeticCRS.class));            // Test sharing.
         assertSame(codes, factory.getAuthorityCodes(GeographicCRS.class));          // Test caching.
         /*
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/AbstractIdentifiedObjectTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/AbstractIdentifiedObjectTest.java
index eb5fa53043..45dbe11c7e 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/AbstractIdentifiedObjectTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/AbstractIdentifiedObjectTest.java
@@ -153,7 +153,7 @@ public final strictfp class AbstractIdentifiedObjectTest extends TestCase {
     @DependsOnMethod("testWithoutIdentifier")
     public void testWithSingleIdentifier() {
         final Identifier               identifier  = new ImmutableIdentifier(null, "EPSG", "7019");
-        final Set<Identifier>          identifiers = Collections.singleton(identifier);
+        final Set<Identifier>          identifiers = Set.of(identifier);
         final AbstractIdentifiedObject object      = new AbstractIdentifiedObject(properties(identifiers));
         final Identifier               gmlId       = validate(object, identifiers, "epsg-7019");
         assertNotNull("gmlId",                   gmlId);
@@ -188,7 +188,7 @@ public final strictfp class AbstractIdentifiedObjectTest extends TestCase {
     @DependsOnMethod("testWithManyIdentifiers")
     public void testAsSubtype() {
         final Identifier               identifier  = new NamedIdentifier(EPSG, "7019");
-        final Set<Identifier>          identifiers = Collections.singleton(identifier);
+        final Set<Identifier>          identifiers = Set.of(identifier);
         final AbstractIdentifiedObject object      = new AbstractDatum(properties(identifiers));
         final Identifier               gmlId       = validate(object, identifiers, "epsg-datum-7019");
         assertNotNull("gmlId",                   gmlId);
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/EPSGFactoryFallbackTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/EPSGFactoryFallbackTest.java
index 28dd9b12f1..4b5bc78b52 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/EPSGFactoryFallbackTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/EPSGFactoryFallbackTest.java
@@ -16,9 +16,9 @@
  */
 package org.apache.sis.referencing;
 
-import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
 import java.util.Set;
 import org.opengis.util.FactoryException;
 import org.opengis.referencing.crs.SingleCRS;
@@ -68,30 +68,30 @@ public final strictfp class EPSGFactoryFallbackTest extends TestCase {
      */
     @Test
     public void testGetAuthorityCodes() throws FactoryException {
-        assertSetEquals(Arrays.asList(StandardDefinitions.GREENWICH),
+        assertSetEquals(List.of(StandardDefinitions.GREENWICH),
                 EPSGFactoryFallback.INSTANCE.getAuthorityCodes(PrimeMeridian.class));
-        assertSetEquals(Arrays.asList("7030", "7043", "7019", "7008", "7022", "7048"),
+        assertSetEquals(List.of("7030", "7043", "7019", "7008", "7022", "7048"),
                 EPSGFactoryFallback.INSTANCE.getAuthorityCodes(Ellipsoid.class));
-        assertSetEquals(Arrays.asList("6326", "6322", "6269", "6267", "6258", "6230", "6019", "6047", "5100", "5103"),
+        assertSetEquals(List.of("6326", "6322", "6269", "6267", "6258", "6230", "6019", "6047", "5100", "5103"),
                 EPSGFactoryFallback.INSTANCE.getAuthorityCodes(Datum.class));
-        assertSetEquals(Arrays.asList("6422", "6423"),
+        assertSetEquals(List.of("6422", "6423"),
                 EPSGFactoryFallback.INSTANCE.getAuthorityCodes(EllipsoidalCS.class));
-        assertSetEquals(Arrays.asList("6404"),
+        assertSetEquals(List.of("6404"),
                 EPSGFactoryFallback.INSTANCE.getAuthorityCodes(SphericalCS.class));
-        assertSetEquals(Arrays.asList("6500", "4400", "1026", "1027"),
+        assertSetEquals(List.of("6500", "4400", "1026", "1027"),
                 EPSGFactoryFallback.INSTANCE.getAuthorityCodes(CartesianCS.class));
-        assertSetEquals(Arrays.asList("4978", "4984", "4936"),
+        assertSetEquals(List.of("4978", "4984", "4936"),
                 EPSGFactoryFallback.INSTANCE.getAuthorityCodes(GeocentricCRS.class));
-        assertSetEquals(Arrays.asList("4326", "4322", "4019", "4047", "4269", "4267", "4258", "4230", "4979", "4985", "4937"),
+        assertSetEquals(List.of("4326", "4322", "4019", "4047", "4269", "4267", "4258", "4230", "4979", "4985", "4937"),
                 EPSGFactoryFallback.INSTANCE.getAuthorityCodes(GeographicCRS.class));
-        assertSetEquals(Arrays.asList("5714", "5715", "5703"),
+        assertSetEquals(List.of("5714", "5715", "5703"),
                 EPSGFactoryFallback.INSTANCE.getAuthorityCodes(VerticalCRS.class));
         /*
          * There is too many ProjectedCRS codes for enumerating all of them, so test only a sampling.
          */
         final Set<String> codes = EPSGFactoryFallback.INSTANCE.getAuthorityCodes(ProjectedCRS.class);
-        assertTrue(codes.containsAll(Arrays.asList("5041", "5042", "32601", "32660", "32701", "32760")));
-        assertTrue(Collections.disjoint(codes, Arrays.asList("7030", "6326", "4326", "4978", "32600", "32700", "5714")));
+        assertTrue(codes.containsAll(List.of("5041", "5042", "32601", "32660", "32701", "32760")));
+        assertTrue(Collections.disjoint(codes, List.of("7030", "6326", "4326", "4978", "32600", "32700", "5714")));
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/CommonAuthorityFactoryTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/CommonAuthorityFactoryTest.java
index 4217d64240..6a27dbc03a 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/CommonAuthorityFactoryTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/CommonAuthorityFactoryTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.factory;
 
-import java.util.Arrays;
+import java.util.List;
 import java.util.Set;
 import java.util.HashSet;
 import java.awt.geom.AffineTransform;
@@ -84,19 +84,19 @@ public final strictfp class CommonAuthorityFactoryTest extends TestCase {
     public void testGetAuthorityCodes() throws FactoryException {
         assertTrue("getAuthorityCodes(Datum.class)",
                 factory.getAuthorityCodes(Datum.class).isEmpty());
-        assertSetEquals(Arrays.asList("CRS:1", "CRS:27", "CRS:83", "CRS:84", "CRS:88",
-                                      "AUTO2:42001", "AUTO2:42002", "AUTO2:42003", "AUTO2:42004", "AUTO2:42005",
-                                      "OGC:JulianDate", "OGC:TruncatedJulianDate", "OGC:UnixTime"),
+        assertSetEquals(List.of("CRS:1", "CRS:27", "CRS:83", "CRS:84", "CRS:88",
+                                "AUTO2:42001", "AUTO2:42002", "AUTO2:42003", "AUTO2:42004", "AUTO2:42005",
+                                "OGC:JulianDate", "OGC:TruncatedJulianDate", "OGC:UnixTime"),
                 factory.getAuthorityCodes(CoordinateReferenceSystem.class));
-        assertSetEquals(Arrays.asList("AUTO2:42001", "AUTO2:42002", "AUTO2:42003", "AUTO2:42004", "AUTO2:42005"),
+        assertSetEquals(List.of("AUTO2:42001", "AUTO2:42002", "AUTO2:42003", "AUTO2:42004", "AUTO2:42005"),
                 factory.getAuthorityCodes(ProjectedCRS.class));
-        assertSetEquals(Arrays.asList("CRS:27", "CRS:83", "CRS:84"),
+        assertSetEquals(List.of("CRS:27", "CRS:83", "CRS:84"),
                 factory.getAuthorityCodes(GeographicCRS.class));
-        assertSetEquals(Arrays.asList("CRS:88"),
+        assertSetEquals(List.of("CRS:88"),
                 factory.getAuthorityCodes(VerticalCRS.class));
-        assertSetEquals(Arrays.asList("OGC:JulianDate", "OGC:TruncatedJulianDate", "OGC:UnixTime"),
+        assertSetEquals(List.of("OGC:JulianDate", "OGC:TruncatedJulianDate", "OGC:UnixTime"),
                 factory.getAuthorityCodes(TemporalCRS.class));
-        assertSetEquals(Arrays.asList("CRS:1"),
+        assertSetEquals(List.of("CRS:1"),
                 factory.getAuthorityCodes(EngineeringCRS.class));
 
         final Set<String> codes = factory.getAuthorityCodes(GeographicCRS.class);
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactoryTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactoryTest.java
index 9feaf3771f..805595a6d5 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactoryTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactoryTest.java
@@ -16,8 +16,6 @@
  */
 package org.apache.sis.referencing.factory;
 
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 import org.opengis.referencing.IdentifiedObject;
@@ -114,9 +112,9 @@ public final strictfp class MultiAuthoritiesFactoryTest extends TestCase {
         final AuthorityFactoryMock mock2 = new AuthorityFactoryMock("MOCK2", null);
         final AuthorityFactoryMock mock3 = new AuthorityFactoryMock("MOCK3", null);
         final MultiAuthoritiesFactory factory = new MultiAuthoritiesFactory(
-                Arrays.asList(mock1, mock2), null,
-                Arrays.asList(mock1, mock3), null);
-        assertSetEquals(Arrays.asList("MOCK1", "MOCK2", "MOCK3"), factory.getCodeSpaces());
+                List.of(mock1, mock2), null,
+                List.of(mock1, mock3), null);
+        assertSetEquals(List.of("MOCK1", "MOCK2", "MOCK3"), factory.getCodeSpaces());
     }
 
     /**
@@ -130,8 +128,8 @@ public final strictfp class MultiAuthoritiesFactoryTest extends TestCase {
         final AuthorityFactoryMock mock2 = new AuthorityFactoryMock("MOCK2", "1.2");
         final AuthorityFactoryMock mock3 = new AuthorityFactoryMock("MOCK1", "2.3");
         final MultiAuthoritiesFactory factory = new MultiAuthoritiesFactory(
-                Arrays.asList(mock1, mock2, mock3), null,
-                Arrays.asList(mock1, mock3), null);
+                List.of(mock1, mock2, mock3), null,
+                List.of(mock1, mock3), null);
 
         assertSame("MOCK2", mock2, factory.getAuthorityFactory(  CRSAuthorityFactory.class, "mock2", null));
         assertSame("MOCK1", mock1, factory.getAuthorityFactory(  CRSAuthorityFactory.class, "mock1", null));
@@ -171,7 +169,7 @@ public final strictfp class MultiAuthoritiesFactoryTest extends TestCase {
         final AuthorityFactoryMock mock4 = new AuthorityFactoryMock("MOCK3", null);
         final AuthorityFactoryMock mock5 = new AuthorityFactoryMock("MOCK5", null);
         final MultiAuthoritiesFactory factory = new MultiAuthoritiesFactory(
-                Arrays.asList(mock1, mock2, mock3, mock4, mock5), null, null, null);
+                List.of(mock1, mock2, mock3, mock4, mock5), null, null, null);
 
         assertSame("MOCK1", mock1, factory.getAuthorityFactory(CRSAuthorityFactory.class, "mock1", null));
         assertSame("MOCK1", mock1, factory.getAuthorityFactory(CRSAuthorityFactory.class, "mock1", "2.3"));
@@ -200,7 +198,7 @@ public final strictfp class MultiAuthoritiesFactoryTest extends TestCase {
     @Test
     @DependsOnMethod("testGetAuthorityFactory")
     public void testCreateFromSimpleCodes() throws FactoryException {
-        final Set<AuthorityFactoryMock> mock = Collections.singleton(new AuthorityFactoryMock("MOCK", "2.3"));
+        final Set<AuthorityFactoryMock> mock = Set.of(new AuthorityFactoryMock("MOCK", "2.3"));
         final MultiAuthoritiesFactory factory = new MultiAuthoritiesFactory(mock, mock, mock, null);
 
         assertSame("Straight",      HardCodedCRS  .WGS84_LATITUDE_FIRST, factory.createGeographicCRS("MOCK:4326"));
@@ -230,7 +228,7 @@ public final strictfp class MultiAuthoritiesFactoryTest extends TestCase {
     @Test
     @DependsOnMethod("testCreateFromSimpleCodes")
     public void testCreateFromURNs() throws FactoryException {
-        final Set<AuthorityFactoryMock> mock = Collections.singleton(new AuthorityFactoryMock("MOCK", "2.3"));
+        final Set<AuthorityFactoryMock> mock = Set.of(new AuthorityFactoryMock("MOCK", "2.3"));
         final MultiAuthoritiesFactory factory = new MultiAuthoritiesFactory(mock, mock, mock, null);
 
         assertSame("Empty version", HardCodedCRS  .WGS84_LATITUDE_FIRST, factory.createGeographicCRS("urn:ogc:def:crs:MOCK::4326"));
@@ -259,7 +257,7 @@ public final strictfp class MultiAuthoritiesFactoryTest extends TestCase {
     @Test
     @DependsOnMethod("testCreateFromURNs")
     public void testCreateFromHTTPs() throws FactoryException {
-        final Set<AuthorityFactoryMock> mock = Collections.singleton(new AuthorityFactoryMock("MOCK", "2.3"));
+        final Set<AuthorityFactoryMock> mock = Set.of(new AuthorityFactoryMock("MOCK", "2.3"));
         final MultiAuthoritiesFactory factory = new MultiAuthoritiesFactory(mock, mock, mock, null);
 
         assertSame("HTTP",        HardCodedCRS.WGS84_LATITUDE_FIRST, factory.createGeographicCRS("http://www.opengis.net/def/crs/mock/0/4326"));
@@ -287,7 +285,7 @@ public final strictfp class MultiAuthoritiesFactoryTest extends TestCase {
     @Test
     @DependsOnMethod("testCreateFromURNs")
     public void testCreateFromCombinedURNs() throws FactoryException {
-        final Set<AuthorityFactoryMock> mock = Collections.singleton(new AuthorityFactoryMock("MOCK", "2.3"));
+        final Set<AuthorityFactoryMock> mock = Set.of(new AuthorityFactoryMock("MOCK", "2.3"));
         final MultiAuthoritiesFactory factory = new MultiAuthoritiesFactory(mock, mock, mock, null);
         testCreateFromCombinedURIs(factory, "urn:ogc:def:crs, crs:MOCK::4326, crs:MOCK::5714");
         /*
@@ -326,7 +324,7 @@ public final strictfp class MultiAuthoritiesFactoryTest extends TestCase {
     @Test
     @DependsOnMethod("testCreateFromHTTPs")
     public void testCreateFromCombinedHTTPs() throws FactoryException {
-        final Set<AuthorityFactoryMock> mock = Collections.singleton(new AuthorityFactoryMock("MOCK", "2.3"));
+        final Set<AuthorityFactoryMock> mock = Set.of(new AuthorityFactoryMock("MOCK", "2.3"));
         final MultiAuthoritiesFactory factory = new MultiAuthoritiesFactory(mock, mock, mock, null);
         testCreateFromCombinedURIs(factory, "http://www.opengis.net/def/crs-compound?"
                                         + "1=http://www.opengis.net/def/crs/MOCK/0/4326&"
@@ -366,7 +364,7 @@ public final strictfp class MultiAuthoritiesFactoryTest extends TestCase {
      */
     @Test
     public void testGetAuthorityCodes() throws FactoryException {
-        final List<AuthorityFactoryMock> mock = Arrays.asList(
+        final List<AuthorityFactoryMock> mock = List.of(
                 new AuthorityFactoryMock("MOCK", null),
                 new AuthorityFactoryMock("MOCK", "2.3"));
         final MultiAuthoritiesFactory factory = new MultiAuthoritiesFactory(mock, mock, mock, null);
@@ -389,7 +387,7 @@ public final strictfp class MultiAuthoritiesFactoryTest extends TestCase {
      */
     @Test
     public void testCreateFromCoordinateReferenceSystemCodes() throws FactoryException {
-        final List<AuthorityFactoryMock> mock = Arrays.asList(
+        final List<AuthorityFactoryMock> mock = List.of(
                 new AuthorityFactoryMock("MOCK", null),
                 new AuthorityFactoryMock("MOCK", "2.3"));
         final MultiAuthoritiesFactory factory = new MultiAuthoritiesFactory(mock, null, null, mock);
@@ -413,7 +411,7 @@ public final strictfp class MultiAuthoritiesFactoryTest extends TestCase {
      */
     @Test
     public void testNewIdentifiedObjectFinder() throws FactoryException {
-        final List<AuthorityFactoryMock> mock = Arrays.asList(
+        final List<AuthorityFactoryMock> mock = List.of(
                 new AuthorityFactoryMock("MOCK", null),
                 new AuthorityFactoryMock("MOCK", "2.3"));
         final MultiAuthoritiesFactory factory = new MultiAuthoritiesFactory(mock, null, mock, null);
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java
index 8eccc24bf1..52c6d19d0a 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java
@@ -16,9 +16,9 @@
  */
 package org.apache.sis.referencing.operation;
 
+import java.util.Set;
 import java.util.Map;
 import java.util.HashMap;
-import java.util.Arrays;
 import java.util.Collections;
 import java.text.ParseException;
 import org.opengis.util.FactoryException;
@@ -279,7 +279,7 @@ public final strictfp class CoordinateOperationFinderTest extends MathTransformT
         assertSame      ("targetCRS",  targetCRS,            operation.getTargetCRS());
         assertFalse     ("isIdentity",                       operation.getMathTransform().isIdentity());
         assertEquals    ("name",       "Datum shift",        operation.getName().getCode());
-        assertSetEquals (Arrays.asList(DATUM_SHIFT_APPLIED), operation.getCoordinateOperationAccuracy());
+        assertSetEquals (Set.of(DATUM_SHIFT_APPLIED), operation.getCoordinateOperationAccuracy());
         assertInstanceOf("operation",  Transformation.class, operation);
         assertEquals    ("method", method, ((SingleOperation) operation).getMethod().getName().getCode());
 
@@ -340,7 +340,7 @@ public final strictfp class CoordinateOperationFinderTest extends MathTransformT
         assertSame      ("targetCRS",  targetCRS,            operation.getTargetCRS());
         assertFalse     ("isIdentity",                       operation.getMathTransform().isIdentity());
         assertEquals    ("name",       "Datum shift",        operation.getName().getCode());
-        assertSetEquals (Arrays.asList(DATUM_SHIFT_APPLIED), operation.getCoordinateOperationAccuracy());
+        assertSetEquals (Set.of(DATUM_SHIFT_APPLIED), operation.getCoordinateOperationAccuracy());
         assertInstanceOf("operation",  Transformation.class, operation);
         assertEquals("method", "Geocentric translations (geog2D domain)",
                 ((SingleOperation) operation).getMethod().getName().getCode());
@@ -386,7 +386,7 @@ public final strictfp class CoordinateOperationFinderTest extends MathTransformT
         assertSame      ("targetCRS",  targetCRS,            operation.getTargetCRS());
         assertFalse     ("isIdentity",                       operation.getMathTransform().isIdentity());
         assertEquals    ("name",       "Datum shift",        operation.getName().getCode());
-        assertSetEquals (Arrays.asList(DATUM_SHIFT_APPLIED), operation.getCoordinateOperationAccuracy());
+        assertSetEquals (Set.of(DATUM_SHIFT_APPLIED), operation.getCoordinateOperationAccuracy());
         assertInstanceOf("operation", Transformation.class,  operation);
         assertEquals    ("method", "Geocentric translations (geocentric domain)",
                 ((SingleOperation) operation).getMethod().getName().getCode());
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/MathTransformFactoryMock.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/MathTransformFactoryMock.java
index 6ebf315421..8ca24534a1 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/MathTransformFactoryMock.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/MathTransformFactoryMock.java
@@ -17,7 +17,6 @@
 package org.apache.sis.referencing.operation.transform;
 
 import java.util.Set;
-import java.util.Collections;
 import org.opengis.util.FactoryException;
 import org.opengis.util.NoSuchIdentifierException;
 import org.opengis.metadata.citation.Citation;
@@ -64,7 +63,7 @@ public final strictfp class MathTransformFactoryMock implements MathTransformFac
      */
     @Override
     public Set<OperationMethod> getAvailableMethods(Class<? extends SingleOperation> type) {
-        return type.isInstance(method) ? Collections.singleton(method) : Collections.emptySet();
+        return type.isInstance(method) ? Set.of(method) : Set.of();
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/OperationMethodSetTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/OperationMethodSetTest.java
index 2c4155416f..c90370d27e 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/OperationMethodSetTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/OperationMethodSetTest.java
@@ -16,9 +16,9 @@
  */
 package org.apache.sis.referencing.operation.transform;
 
+import java.util.Set;
 import java.util.Map;
 import java.util.Iterator;
-import java.util.Collections;
 import java.util.NoSuchElementException;
 import org.opengis.parameter.ParameterDescriptorGroup;
 import org.opengis.referencing.operation.Projection;
@@ -58,13 +58,13 @@ public final strictfp class OperationMethodSetTest extends TestCase {
      */
     @SuppressWarnings("serial")
     private static DefaultOperationMethod createMethod(final Class<? extends Projection> type, final String method) {
-        Map<String,?> properties = Collections.singletonMap(DefaultOperationMethod.NAME_KEY, method);
+        Map<String,?> properties = Map.of(DefaultOperationMethod.NAME_KEY, method);
         final ParameterDescriptorGroup parameters = new DefaultParameterDescriptorGroup(properties, 1, 1);
         /*
          * Recycle the ParameterDescriptorGroup name for DefaultOperationMethod.
          * This save us one object creation, and is often the same name anyway.
          */
-        properties = Collections.singletonMap(DefaultOperationMethod.NAME_KEY, parameters.getName());
+        properties = Map.of(DefaultOperationMethod.NAME_KEY, parameters.getName());
         return new DefaultOperationMethod(properties, 2, 2, parameters) {
             @Override public Class<? extends Projection> getOperationType() {
                 return type;
@@ -151,8 +151,8 @@ public final strictfp class OperationMethodSetTest extends TestCase {
         /*
          * Lambert case. Test twice since the two excecutions will take different code paths.
          */
-        assertEquals(Collections.singleton(lamb), lambert);
-        assertEquals(Collections.singleton(lamb), lambert);
+        assertEquals(Set.of(lamb), lambert);
+        assertEquals(Set.of(lamb), lambert);
         /*
          * Test filtering: the test should not contain any conic projection.
          */
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/report/CoordinateReferenceSystems.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/report/CoordinateReferenceSystems.java
index ed8436a185..a620075e51 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/report/CoordinateReferenceSystems.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/report/CoordinateReferenceSystems.java
@@ -16,7 +16,6 @@
  */
 package org.apache.sis.referencing.report;
 
-import java.util.Arrays;
 import java.util.Locale;
 import java.util.Set;
 import java.util.Map;
@@ -265,8 +264,8 @@ public final strictfp class CoordinateReferenceSystems extends AuthorityCodesRep
      * The datums from the above list which are deprecated, but that we do not want to replace by the non-deprecated
      * datum. We disable some replacements when they allow better sorting of deprecated CRS.
      */
-    private static final Set<String> KEEP_DEPRECATED_DATUM = new HashSet<>(Arrays.asList(
-        "Dealul Piscului 1970"));           // Datum does not exist but is an alias for S-42 in Romania.
+    private static final Set<String> KEEP_DEPRECATED_DATUM = Set.of(
+        "Dealul Piscului 1970");            // Datum does not exist but is an alias for S-42 in Romania.
 
     /**
      * Shortcut for {@link #SECTION_TITLES} initialization.
@@ -279,7 +278,7 @@ public final strictfp class CoordinateReferenceSystems extends AuthorityCodesRep
     /**
      * Words to ignore in a datum name in order to detect if a CRS name is the acronym of the datum name.
      */
-    private static final Set<String> DATUM_WORDS_TO_IGNORE = new HashSet<>(Arrays.asList(
+    private static final Set<String> DATUM_WORDS_TO_IGNORE = Set.of(
             "of",           // VIVD:   Virgin Islands Vertical Datum of 2009
             "de",           // RRAF:   Reseau de Reference des Antilles Francaises
             "des",          // RGAF:   Reseau Geodesique des Antilles Francaises
@@ -288,7 +287,7 @@ public final strictfp class CoordinateReferenceSystems extends AuthorityCodesRep
             "para",         // SIRGAS: Sistema de Referencia Geocentrico para America del Sur 1995
             "del",          // SIRGAS: Sistema de Referencia Geocentrico para America del Sur 1995
             "las",          // SIRGAS: Sistema de Referencia Geocentrico para las AmericaS 2000
-            "Tides"));      // MLWS:   Mean Low Water Spring Tides
+            "Tides");       // MLWS:   Mean Low Water Spring Tides
 
     /**
      * The keywords before which to cut the CRS names when sorting by alphabetical order.
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/test/integration/ConsistencyTest.java b/core/sis-referencing/src/test/java/org/apache/sis/test/integration/ConsistencyTest.java
index 5f5209fe9a..fe4c766c15 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/test/integration/ConsistencyTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/test/integration/ConsistencyTest.java
@@ -16,8 +16,6 @@
  */
 package org.apache.sis.test.integration;
 
-import java.util.Arrays;
-import java.util.HashSet;
 import java.util.Set;
 import java.text.ParseException;
 import javax.measure.Quantity;
@@ -72,15 +70,14 @@ public final strictfp class ConsistencyTest extends TestCase {
     /**
      * Codes to exclude for now.
      */
-    private static final Set<String> EXCLUDES = new HashSet<>(Arrays.asList(
+    private static final Set<String> EXCLUDES = Set.of(
         "CRS:1",            // Computer display: WKT parser alters the (i,j) axis names.
         "EPSG:5819",        // EPSG topocentric example A: DerivedCRS wrongly handled as a ProjectedCRS. See SIS-518.
         "AUTO2:42001",      // This projection requires parameters, but we provide none.
         "AUTO2:42002",      // This projection requires parameters, but we provide none.
         "AUTO2:42003",      // This projection requires parameters, but we provide none.
         "AUTO2:42004",      // This projection requires parameters, but we provide none.
-        "AUTO2:42005"       // This projection requires parameters, but we provide none.
-    ));
+        "AUTO2:42005");     // This projection requires parameters, but we provide none.
 
     /**
      * Width of the code columns in the warnings formatted by {@link #print(String, String, Object)}.
diff --git 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
index 2fe622b05c..5538a1dfb0 100644
--- 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
@@ -18,8 +18,9 @@ package org.apache.sis.test.integration;
 
 import java.net.URI;
 import java.net.URL;
-import java.util.Arrays;
+import java.util.List;
 import java.util.Locale;
+import java.util.Set;
 import java.util.Map;
 import java.util.HashMap;
 import java.io.StringWriter;
@@ -64,9 +65,6 @@ import org.apache.sis.xml.IdentifierSpace;
 import org.apache.sis.xml.NilReason;
 import org.apache.sis.xml.XML;
 
-import static java.util.Collections.singleton;
-import static java.util.Collections.singletonMap;
-
 // Test dependencies
 import org.apache.sis.test.LoggingWatcher;
 import org.apache.sis.test.TestUtilities;
@@ -125,9 +123,9 @@ public final strictfp class MetadataTest extends TestCase {
     private DefaultMetadata createHardCoded() {
         final DefaultMetadata metadata = new DefaultMetadata();
         metadata.setMetadataIdentifier(new DefaultIdentifier("test/Metadata.xml"));
-        metadata.setLocalesAndCharsets(singletonMap(Locale.ENGLISH, StandardCharsets.UTF_8));
-        metadata.setMetadataScopes(singleton(new DefaultMetadataScope(ScopeCode.DATASET, "Pseudo Common Data Index record")));
-        metadata.setDateInfo(singleton(new DefaultCitationDate(TestUtilities.date("2009-01-01 04:00:00"), DateType.CREATION)));
+        metadata.setLocalesAndCharsets(Map.of(Locale.ENGLISH, StandardCharsets.UTF_8));
+        metadata.setMetadataScopes(Set.of(new DefaultMetadataScope(ScopeCode.DATASET, "Pseudo Common Data Index record")));
+        metadata.setDateInfo(Set.of(new DefaultCitationDate(TestUtilities.date("2009-01-01 04:00:00"), DateType.CREATION)));
         /*
          * Contact information for the author. The same party will be used for custodian and distributor,
          * with only the role changed. Note that we need to create an instance of the deprecated class,
@@ -141,27 +139,27 @@ public final strictfp class MetadataTest extends TestCase {
             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)
             ));
             final DefaultAddress address = new DefaultAddress();
-            address.setDeliveryPoints(singleton(new SimpleInternationalString("Brest institute")));
+            address.setDeliveryPoints(Set.of(new SimpleInternationalString("Brest institute")));
             address.setCity(new SimpleInternationalString("Plouzane"));
             address.setPostalCode("29280");
             address.setCountry(country);
-            address.setElectronicMailAddresses(singleton("xx@xx.fr"));
-            contact.setAddresses(singleton(address));
-            author.setParties(singleton(new DefaultOrganisation("Some marine institute", null, null, contact)));
-            metadata.setContacts(singleton(author));
+            address.setElectronicMailAddresses(Set.of("xx@xx.fr"));
+            contact.setAddresses(Set.of(address));
+            author.setParties(Set.of(new DefaultOrganisation("Some marine institute", null, null, contact)));
+            metadata.setContacts(Set.of(author));
         }
         /*
          * Data indentification.
          */
         {
             final DefaultCitation citation = new DefaultCitation("Some set of points");
-            citation.setAlternateTitles(singleton(new SimpleInternationalString("Code XYZ")));
-            citation.setDates(Arrays.asList(
+            citation.setAlternateTitles(Set.of(new SimpleInternationalString("Code XYZ")));
+            citation.setDates(List.of(
                     new DefaultCitationDate(TestUtilities.date("1990-06-04 22:00:00"), DateType.REVISION),
                     new DefaultCitationDate(TestUtilities.date("1979-08-02 22:00:00"), DateType.CREATION)));
             {
@@ -170,18 +168,18 @@ public final strictfp class MetadataTest extends TestCase {
                 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)
                 ));
                 final DefaultAddress address = new DefaultAddress();
-                address.setDeliveryPoints(singleton(new SimpleInternationalString("Oceanology institute")));
+                address.setDeliveryPoints(Set.of(new SimpleInternationalString("Oceanology institute")));
                 address.setCity(new SimpleInternationalString("Marseille"));
                 address.setPostalCode("13288");
                 address.setCountry(country);
-                contact.setAddresses(singleton(address));
-                originator.setParties(singleton(new DefaultOrganisation("Oceanology laboratory", null, null, contact)));
-                citation.setCitedResponsibleParties(singleton(originator));
+                contact.setAddresses(Set.of(address));
+                originator.setParties(Set.of(new DefaultOrganisation("Oceanology laboratory", null, null, contact)));
+                citation.setCitedResponsibleParties(Set.of(originator));
             }
             final DefaultDataIdentification identification = new DefaultDataIdentification(
                     citation,                                                   // Citation
@@ -192,7 +190,7 @@ public final strictfp class MetadataTest extends TestCase {
                 @SuppressWarnings("deprecation")
                 final DefaultResponsibility custodian = new DefaultResponsibleParty(author);
                 custodian.setRole(Role.CUSTODIAN);
-                identification.setPointOfContacts(singleton(custodian));
+                identification.setPointOfContacts(Set.of(custodian));
             }
             /*
              * Data indentification / Keywords.
@@ -202,12 +200,12 @@ public final strictfp class MetadataTest extends TestCase {
                         new Anchor(URI.create("SDN:P021:35:ATTN"), "Transmittance and attenuance of the water column"));
                 keyword.setType(KeywordType.THEME);
                 final DefaultCitation thesaurus = new DefaultCitation("BODC Parameter Discovery Vocabulary");
-                thesaurus.setAlternateTitles(singleton(new SimpleInternationalString("P021")));
-                thesaurus.setDates(singleton(new DefaultCitationDate(TestUtilities.date("2008-11-25 23:00:00"), DateType.REVISION)));
+                thesaurus.setAlternateTitles(Set.of(new SimpleInternationalString("P021")));
+                thesaurus.setDates(Set.of(new DefaultCitationDate(TestUtilities.date("2008-11-25 23:00:00"), DateType.REVISION)));
                 thesaurus.setEdition(new Anchor(URI.create("SDN:C371:1:35"), "35"));
-                thesaurus.setIdentifiers(singleton(new ImmutableIdentifier(null, null, "http://www.seadatanet.org/urnurl/")));
+                thesaurus.setIdentifiers(Set.of(new ImmutableIdentifier(null, null, "http://www.seadatanet.org/urnurl/")));
                 keyword.setThesaurusName(thesaurus);
-                identification.setDescriptiveKeywords(singleton(keyword));
+                identification.setDescriptiveKeywords(Set.of(keyword));
             }
             /*
              * Data indentification / Browse graphic.
@@ -215,15 +213,15 @@ public final strictfp class MetadataTest extends TestCase {
             {
                 final DefaultBrowseGraphic g = new DefaultBrowseGraphic(URI.create("file:///thumbnail.png"));
                 g.setFileDescription(new SimpleInternationalString("Arbitrary thumbnail for this test only."));
-                identification.setGraphicOverviews(singleton(g));
+                identification.setGraphicOverviews(Set.of(g));
             }
             /*
              * Data indentification / Resource constraint.
              */
             {
                 final DefaultLegalConstraints constraint = new DefaultLegalConstraints();
-                constraint.setAccessConstraints(singleton(Restriction.LICENCE));
-                identification.setResourceConstraints(singleton(constraint));
+                constraint.setAccessConstraints(Set.of(Restriction.LICENCE));
+                identification.setResourceConstraints(Set.of(constraint));
             }
             /*
              * Data indentification / Aggregate information.
@@ -232,12 +230,12 @@ public final strictfp class MetadataTest extends TestCase {
                 @SuppressWarnings("deprecation")
                 final DefaultAssociatedResource 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);
-                identification.setAssociatedResources(singleton(aggregateInfo));
+                identification.setAssociatedResources(Set.of(aggregateInfo));
             }
             /*
              * Data indentification / Extent.
@@ -257,7 +255,7 @@ public final strictfp class MetadataTest extends TestCase {
 
                 final DefaultTemporalExtent temporal = new DefaultTemporalExtent();
                 temporal.setBounds(TestUtilities.date("1990-06-05 00:00:00"), TestUtilities.date("1990-07-02 00:00:00"));
-                identification.setExtents(singleton(new DefaultExtent(
+                identification.setExtents(Set.of(new DefaultExtent(
                         null,
                         new DefaultGeographicBoundingBox(1.1666, 1.1667, 36.4, 36.6),
                         new DefaultVerticalExtent(10, 25, vcrs),
@@ -270,7 +268,7 @@ public final strictfp class MetadataTest extends TestCase {
                 identification.setEnvironmentDescription (new SimpleInternationalString("Possibly cloudy."));
                 identification.setSupplementalInformation(new SimpleInternationalString("This metadata has been modified with dummy values."));
             }
-            metadata.setIdentificationInfo(singleton(identification));
+            metadata.setIdentificationInfo(Set.of(identification));
         }
         /*
          * Information about spatial representation.
@@ -278,18 +276,18 @@ public final strictfp class MetadataTest extends TestCase {
         {
             final DefaultVectorSpatialRepresentation rep = new DefaultVectorSpatialRepresentation();
             final DefaultGeometricObjects geoObj = new DefaultGeometricObjects(GeometricObjectType.POINT);
-            rep.setGeometricObjects(singleton(geoObj));
-            metadata.setSpatialRepresentationInfo(singleton(rep));
+            rep.setGeometricObjects(Set.of(geoObj));
+            metadata.setSpatialRepresentationInfo(Set.of(rep));
         }
         /*
          * Information about Coordinate Reference System.
          */
         {
             final DefaultCitation citation = new DefaultCitation("World Geodetic System 84");
-            citation.setAlternateTitles(singleton(new SimpleInternationalString("L101")));
-            citation.setIdentifiers(singleton(new ImmutableIdentifier(null, null, "SDN:L101:2:4326")));
+            citation.setAlternateTitles(Set.of(new SimpleInternationalString("L101")));
+            citation.setIdentifiers(Set.of(new ImmutableIdentifier(null, null, "SDN:L101:2:4326")));
             citation.setEdition(new Anchor(URI.create("SDN:C371:1:2"), "2"));
-            metadata.setReferenceSystemInfo(singleton(
+            metadata.setReferenceSystemInfo(Set.of(
                     new ReferenceSystemMetadata(new ImmutableIdentifier(citation, "L101", "4326"))));
         }
         /*
@@ -298,14 +296,14 @@ public final strictfp class MetadataTest extends TestCase {
         {
             final DefaultImageDescription contentInfo = new DefaultImageDescription();
             contentInfo.setCloudCoverPercentage(50.0);
-            metadata.setContentInfo(singleton(contentInfo));
+            metadata.setContentInfo(Set.of(contentInfo));
         }
         /*
          * Extension to metadata.
          */
         {
             final DefaultMetadataExtensionInformation extensionInfo = new DefaultMetadataExtensionInformation();
-            extensionInfo.setExtendedElementInformation(singleton(new DefaultExtendedElementInformation(
+            extensionInfo.setExtendedElementInformation(Set.of(new DefaultExtendedElementInformation(
                     "SDN:EDMO",                                                     // Name
                     "European Directory of Marine Organisations",                   // Definition
                     null,                                                           // Condition
@@ -313,7 +311,7 @@ public final strictfp class MetadataTest extends TestCase {
                     "SeaDataNet",                                                   // Parent entity
                     "For testing only",                                             // Rule
                     NilReason.MISSING.createNilObject(Responsibility.class))));     // Source
-            metadata.setMetadataExtensionInfo(singleton(extensionInfo));
+            metadata.setMetadataExtensionInfo(Set.of(extensionInfo));
         }
         /*
          * Distribution information.
@@ -323,14 +321,14 @@ public final strictfp class MetadataTest extends TestCase {
             final DefaultResponsibility distributor = new DefaultResponsibleParty(author);
             final DefaultDistribution distributionInfo = new DefaultDistribution();
             distributor.setRole(Role.DISTRIBUTOR);
-            distributionInfo.setDistributors(singleton(new DefaultDistributor(distributor)));
+            distributionInfo.setDistributors(Set.of(new DefaultDistributor(distributor)));
 
             final DefaultFormat format = new DefaultFormat();
             final DefaultCitation specification = new DefaultCitation();
-            specification.setAlternateTitles(singleton(new Anchor(URI.create("SDN:L241:1:MEDATLAS"), "MEDATLAS ASCII")));
+            specification.setAlternateTitles(Set.of(new Anchor(URI.create("SDN:L241:1:MEDATLAS"), "MEDATLAS ASCII")));
             specification.setEdition(new SimpleInternationalString("1.0"));
             format.setFormatSpecificationCitation(specification);
-            distributionInfo.setDistributionFormats(singleton(format));
+            distributionInfo.setDistributionFormats(Set.of(format));
 
             final DefaultDigitalTransferOptions transfer = new DefaultDigitalTransferOptions();
             transfer.setTransferSize(2.431640625);
@@ -338,9 +336,9 @@ public final strictfp class MetadataTest extends TestCase {
             onlines.setDescription(new SimpleInternationalString("Dummy download link"));
             onlines.setFunction(OnLineFunction.DOWNLOAD);
             onlines.setProtocol("ftp");
-            transfer.setOnLines(singleton(onlines));
-            distributionInfo.setTransferOptions(singleton(transfer));
-            metadata.setDistributionInfo(singleton(distributionInfo));
+            transfer.setOnLines(Set.of(onlines));
+            distributionInfo.setTransferOptions(Set.of(transfer));
+            metadata.setDistributionInfo(Set.of(distributionInfo));
         }
         return metadata;
     }
diff --git a/core/sis-utility/src/test/java/org/apache/sis/internal/util/AbstractMapTest.java b/core/sis-utility/src/test/java/org/apache/sis/internal/util/AbstractMapTest.java
index db13e37224..79b947a338 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/internal/util/AbstractMapTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/internal/util/AbstractMapTest.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.util;
 
 import java.util.List;
-import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -47,7 +46,7 @@ public final strictfp class AbstractMapTest extends TestCase {
      * or consistency.
      */
     private static final class Count extends AbstractMap<Integer,String> {
-        private final List<String> values = new ArrayList<>(Arrays.asList("one", "two", "three"));
+        private final List<String> values = new ArrayList<>(List.of("one", "two", "three"));
 
         @Override public    void    clear   ()                    {       values.clear();}
         @Override public    String  get     (Object  k)           {return values.get(((Integer) k) - 1);}
diff --git a/core/sis-utility/src/test/java/org/apache/sis/internal/util/CheckedArrayListTest.java b/core/sis-utility/src/test/java/org/apache/sis/internal/util/CheckedArrayListTest.java
index 169bf0f65d..cb8dfd22c5 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/internal/util/CheckedArrayListTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/internal/util/CheckedArrayListTest.java
@@ -46,7 +46,7 @@ public final strictfp class CheckedArrayListTest extends TestCase {
         assertTrue(list.add("One"));
         assertTrue(list.add("Two"));
         assertTrue(list.add("Three"));
-        assertEquals(Arrays.asList("One", "Two", "Three"), list);
+        assertEquals(List.of("One", "Two", "Three"), list);
     }
 
     /**
@@ -57,7 +57,7 @@ public final strictfp class CheckedArrayListTest extends TestCase {
         final CheckedArrayList<String> list = new CheckedArrayList<>(String.class);
         assertTrue(list.add("One"));
         assertTrue(Collections.addAll(list, "Two", "Three"));
-        assertEquals(Arrays.asList("One", "Two", "Three"), list);
+        assertEquals(List.of("One", "Two", "Three"), list);
     }
 
     /**
@@ -137,7 +137,7 @@ public final strictfp class CheckedArrayListTest extends TestCase {
     @DependsOnMethod("testAddAll")
     public void testCastOrCopy() {
         assertNull(CheckedArrayList.castOrCopy(null, String.class));
-        final List<String> fruits = Arrays.asList("Apple", "Orange", "Raisin");
+        final List<String> fruits = List.of("Apple", "Orange", "Raisin");
         final CheckedArrayList<String> asStrings = CheckedArrayList.castOrCopy(fruits, String.class);
         assertEquals ("Should have the given element type.", String.class, asStrings.getElementType());
         assertNotSame("Should have created a new instance.", fruits, asStrings);
diff --git a/core/sis-utility/src/test/java/org/apache/sis/internal/util/CollectionsExtTest.java b/core/sis-utility/src/test/java/org/apache/sis/internal/util/CollectionsExtTest.java
index 7b8fb254f1..502bcea35d 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/internal/util/CollectionsExtTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/internal/util/CollectionsExtTest.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.util;
 
 import java.util.List;
-import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.Map;
 import java.util.AbstractMap;
@@ -155,11 +154,11 @@ public final strictfp class CollectionsExtTest extends TestCase {
      */
     @Test
     public void testIdentityEquals() {
-        final List<String> c1 = Arrays.asList("A", "B", "C");
-        final List<String> c2 = Arrays.asList("A", "B");
+        final List<String> c1 = List.of("A", "B", "C");
+        final List<String> c2 = List.of("A", "B");
         assertFalse(CollectionsExt.identityEquals(c1.iterator(), c2.iterator()));
         assertFalse(CollectionsExt.identityEquals(c2.iterator(), c1.iterator()));
-        assertTrue(CollectionsExt.identityEquals(c1.iterator(), Arrays.asList("A", "B", "C").iterator()));
+        assertTrue(CollectionsExt.identityEquals(c1.iterator(), List.of("A", "B", "C").iterator()));
     }
 
     /**
@@ -170,7 +169,7 @@ public final strictfp class CollectionsExtTest extends TestCase {
     @Test
     public void testToArray() {
         final String[] expected = new String[] {"One", "Two", "Three"};
-        final String[] actual = CollectionsExt.toArray(Arrays.asList(expected), String.class);
+        final String[] actual = CollectionsExt.toArray(List.of(expected), String.class);
         assertArrayEquals(expected, actual);
     }
 }
diff --git a/core/sis-utility/src/test/java/org/apache/sis/measure/SystemUnitTest.java b/core/sis-utility/src/test/java/org/apache/sis/measure/SystemUnitTest.java
index b2019276e6..8e74d75678 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/measure/SystemUnitTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/measure/SystemUnitTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.measure;
 
-import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.Collections;
@@ -310,7 +310,7 @@ public final strictfp class SystemUnitTest extends TestCase {
         /*
          * Verify that the unit cannot be casted to an incompatible units.
          */
-        for (final Unit<Length> unit : Arrays.asList(Units.METRE, anonymous, otherName)) {
+        for (final Unit<Length> unit : List.of(Units.METRE, anonymous, otherName)) {
             try {
                 unit.asType(Time.class);
                 fail("Expected an exception for incompatible quantity types.");
@@ -338,7 +338,7 @@ public final strictfp class SystemUnitTest extends TestCase {
         assertEquals("Should have a name since we invoked 'alternate'.", "strange", named.getSymbol());
         assertSame  ("Should prefer the named instance.", named, Units.METRE.asType(Strange.class));
         assertSame  ("Go back to the fundamental unit.",  Units.METRE, named.asType(Length.class));
-        for (final Unit<Strange> unit : Arrays.asList(strange, named)) {
+        for (final Unit<Strange> unit : List.of(strange, named)) {
             try {
                 unit.asType(Time.class);
                 fail("Expected an exception for incompatible quantity types.");
diff --git a/core/sis-utility/src/test/java/org/apache/sis/measure/UnitServicesTest.java b/core/sis-utility/src/test/java/org/apache/sis/measure/UnitServicesTest.java
index 6186087687..3c1e667751 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/measure/UnitServicesTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/measure/UnitServicesTest.java
@@ -17,7 +17,7 @@
 package org.apache.sis.measure;
 
 import java.util.Set;
-import java.util.Arrays;
+import java.util.List;
 import java.util.Locale;
 import javax.measure.Unit;
 import javax.measure.format.UnitFormat;
@@ -120,7 +120,7 @@ public final strictfp class UnitServicesTest extends TestCase {
     @Test
     public void testGetAvailableFormatNames() {
         final ServiceProvider provider = ServiceProvider.current();
-        assertSetEquals(Arrays.asList("SYMBOL", "UCUM", "NAME"),
+        assertSetEquals(List.of("SYMBOL", "UCUM", "NAME"),
                 provider.getUnitFormatService().getAvailableFormatNames());
     }
 
diff --git a/core/sis-utility/src/test/java/org/apache/sis/util/collection/CacheTest.java b/core/sis-utility/src/test/java/org/apache/sis/util/collection/CacheTest.java
index 53e729e61e..07f66e8307 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/util/collection/CacheTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/util/collection/CacheTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.util.collection;
 
+import java.util.Set;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.AbstractMap.SimpleEntry;
@@ -36,7 +37,6 @@ import org.apache.sis.test.Performance;
 import org.junit.Test;
 
 import static java.lang.StrictMath.*;
-import static java.util.Collections.singleton;
 import static org.apache.sis.test.Assert.*;
 
 
@@ -92,10 +92,10 @@ public final strictfp class CacheTest extends TestCase {
         assertNull("No initial value expected.", handler.peek());
         handler.putAndUnlock(value);
 
-        assertEquals(1,              cache.size());
-        assertEquals(value,          cache.peek(key));
-        assertEquals(singleton(key), cache.keySet());
-        assertEquals(singleton(new SimpleEntry<>(key, value)), cache.entrySet());
+        assertEquals(1,           cache.size());
+        assertEquals(value,       cache.peek(key));
+        assertEquals(Set.of(key), cache.keySet());
+        assertEquals(Set.of(new SimpleEntry<>(key, value)), cache.entrySet());
     }
 
     /**
diff --git a/core/sis-utility/src/test/java/org/apache/sis/util/collection/CodeListSetTest.java b/core/sis-utility/src/test/java/org/apache/sis/util/collection/CodeListSetTest.java
index 6db8e8d862..e8540500f2 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/util/collection/CodeListSetTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/util/collection/CodeListSetTest.java
@@ -290,6 +290,6 @@ public final strictfp class CodeListSetTest extends TestCase {
          */
         assertTrue("Add the element to be retained.", clone.add(lastRemoved));
         assertTrue(c.retainAll(clone));
-        assertEquals(Collections.singleton(lastRemoved), c);
+        assertEquals(Set.of(lastRemoved), c);
     }
 }
diff --git a/core/sis-utility/src/test/java/org/apache/sis/util/collection/DerivedSetTest.java b/core/sis-utility/src/test/java/org/apache/sis/util/collection/DerivedSetTest.java
index 0b564e7fbe..ad48777f2a 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/util/collection/DerivedSetTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/util/collection/DerivedSetTest.java
@@ -16,10 +16,10 @@
  */
 package org.apache.sis.util.collection;
 
+import java.util.List;
 import java.util.Set;
 import java.util.HashSet;
 import java.util.EnumSet;
-import java.util.Arrays;
 import org.apache.sis.math.FunctionProperty;
 import org.apache.sis.util.ObjectConverter;
 import org.apache.sis.test.TestCase;
@@ -50,8 +50,8 @@ public final strictfp class DerivedSetTest extends TestCase implements ObjectCon
      */
     @Test
     public void testNoExclusion() {
-        final Set<Integer> source = new HashSet<>(Arrays.asList(2,  7,  12,  17,  20 ));
-        final Set<Integer> target = new HashSet<>(Arrays.asList(20, 70, 120, 170, 200));
+        final Set<Integer> source = new HashSet<>(List.of(2,  7,  12,  17,  20 ));
+        final Set<Integer> target = new HashSet<>(List.of(20, 70, 120, 170, 200));
         final Set<Integer> tested = DerivedSet.create(source, this);
         assertEquals(target.size(), tested.size());
         assertEquals(target, tested);
@@ -76,8 +76,8 @@ public final strictfp class DerivedSetTest extends TestCase implements ObjectCon
      */
     @Test
     public void testWithExclusion() {
-        final Set<Integer> source = new HashSet<>(Arrays.asList(2,  7,  12,  EXCLUDED, 20));
-        final Set<Integer> target = new HashSet<>(Arrays.asList(20, 70, 120, 200));
+        final Set<Integer> source = new HashSet<>(List.of(2,  7,  12,  EXCLUDED, 20));
+        final Set<Integer> target = new HashSet<>(List.of(20, 70, 120, 200));
         final Set<Integer> tested = DerivedSet.create(source, this);
         assertEquals(target.size(), tested.size());
         assertEquals(target, tested);
diff --git a/core/sis-utility/src/test/java/org/apache/sis/util/collection/FrequencySortedSetTest.java b/core/sis-utility/src/test/java/org/apache/sis/util/collection/FrequencySortedSetTest.java
index 4eb9ee7694..9815058124 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/util/collection/FrequencySortedSetTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/util/collection/FrequencySortedSetTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.util.collection;
 
+import java.util.Set;
 import java.util.Collections;
 import org.apache.sis.test.DependsOnMethod;
 import org.apache.sis.test.TestCase;
@@ -43,7 +44,7 @@ public final strictfp class FrequencySortedSetTest extends TestCase {
             final FrequencySortedSet<Integer> set = new FrequencySortedSet<>(reverse);
             assertFalse(set.add(12, 0));
             assertTrue (set.add(18, 11));
-            assertEquals(Collections.singleton(18), set);
+            assertEquals(Set.of(18), set);
             assertArrayEquals(new int[] {11}, set.frequencies());
         } while ((reverse = !reverse) == true);
     }
diff --git a/core/sis-utility/src/test/java/org/apache/sis/util/collection/IntegerListTest.java b/core/sis-utility/src/test/java/org/apache/sis/util/collection/IntegerListTest.java
index 11e74c33e3..94b3b5d108 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/util/collection/IntegerListTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/util/collection/IntegerListTest.java
@@ -20,7 +20,6 @@ import java.util.List;
 import java.util.ArrayList;
 import java.util.Set;
 import java.util.HashSet;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.Random;
 import java.util.ConcurrentModificationException;
@@ -149,11 +148,11 @@ public final strictfp class IntegerListTest extends TestCase {
         final Set<Integer> set = new HashSet<>();
         list.fill(value);
         set.addAll(list);
-        assertEquals("fill(value)", Collections.singleton(value), set);
+        assertEquals("fill(value)", Set.of(value), set);
         list.fill(0);
         set.clear();
         set.addAll(list);
-        assertEquals("fill(0)", Collections.singleton(0), set);
+        assertEquals("fill(0)", Set.of(0), set);
     }
 
     /**
diff --git 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
index 160c39d596..2387c93a91 100644
--- 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
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.internal.storage.csv;
 
-import java.util.Arrays;
+import java.util.List;
 import java.util.Iterator;
 import java.time.Instant;
 import java.io.StringReader;
@@ -27,6 +27,8 @@ import org.apache.sis.feature.FoliationRepresentation;
 import org.apache.sis.storage.DataStoreException;
 import org.apache.sis.storage.StorageConnector;
 import org.apache.sis.storage.DataOptionKey;
+import org.apache.sis.setup.OptionKey;
+import org.apache.sis.setup.GeometryLibrary;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 import com.esri.core.geometry.Point2D;
@@ -83,9 +85,12 @@ public final strictfp class StoreTest extends TestCase {
     /**
      * Opens a CSV store on the test data for reading the lines as-is, without assembling them in a single trajectory.
      */
-    private static Store open() throws DataStoreException {
-        StorageConnector connector = new StorageConnector(testData());
-        connector.setOption(DataOptionKey.FOLIATION_REPRESENTATION, FoliationRepresentation.FRAGMENTED);
+    private static Store open(final boolean fragmented) throws DataStoreException {
+        final var connector = new StorageConnector(testData());
+        if (fragmented) {
+            connector.setOption(DataOptionKey.FOLIATION_REPRESENTATION, FoliationRepresentation.FRAGMENTED);
+        }
+        connector.setOption(OptionKey.GEOMETRY_LIBRARY, GeometryLibrary.ESRI);
         return new Store(null, connector);
     }
 
@@ -97,7 +102,7 @@ public final strictfp class StoreTest extends TestCase {
     @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());
@@ -116,7 +121,7 @@ public final strictfp class StoreTest extends TestCase {
      */
     @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();
@@ -145,13 +150,13 @@ public final strictfp class StoreTest extends TestCase {
     @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();
-            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}, singletonList("walking"), List.of(1, 2));
+            assertPropertyEquals(it.next(), "b", "12:33:51", "12:36:51", new double[] {10, 2, 11, 3},        singletonList("walking"), List.of(2));
+            assertPropertyEquals(it.next(), "c", "12:33:51", "12:36:51", new double[] {12, 1, 10, 2, 11, 3}, singletonList("vehicle"), List.of(1));
             assertFalse(it.hasNext());
         }
     }
diff --git a/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/folder/StoreTest.java b/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/folder/StoreTest.java
index ae1ecfc087..54289ca9f0 100644
--- a/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/folder/StoreTest.java
+++ b/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/folder/StoreTest.java
@@ -21,8 +21,8 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Arrays;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import org.opengis.parameter.ParameterValueGroup;
 import org.opengis.metadata.identification.Identification;
@@ -69,7 +69,7 @@ public final strictfp class StoreTest extends TestCase {
      */
     @Test
     public void testComponents() throws URISyntaxException, DataStoreException, IOException {
-        final Set<String> identifiers = new HashSet<>(Arrays.asList("EPSG:4326", "Sample 1", "Sample 2", "Sample 3", "data4"));
+        final Set<String> identifiers = new HashSet<>(List.of("EPSG:4326", "Sample 1", "Sample 2", "Sample 3", "data4"));
         final Path path = testDirectory();
         try (Store store = new Store(null, new StorageConnector(path), path, null)) {
             assertEquals("Wrong number of data stores.", 4, store.components().size());
@@ -90,7 +90,7 @@ public final strictfp class StoreTest extends TestCase {
     @Test
     public void testSearchProviderParameter() throws URISyntaxException, DataStoreException, IOException {
         final StoreProvider provider = new StoreProvider();
-        final Set<String> identifiers = new HashSet<>(Arrays.asList("Sample 1", "Sample 2", "Sample 3", "data4"));
+        final Set<String> identifiers = new HashSet<>(List.of("Sample 1", "Sample 2", "Sample 3", "data4"));
         final ParameterValueGroup params = StoreProvider.PARAMETERS.createValue();
         params.parameter("location").setValue(testDirectory());
         params.parameter("format").setValue("XML");
diff --git 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
index 4fec239bca..e507067c89 100644
--- 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
@@ -16,8 +16,7 @@
  */
 package org.apache.sis.storage.aggregate;
 
-import java.util.Arrays;
-import java.util.Collections;
+import java.util.List;
 import org.opengis.metadata.Metadata;
 import org.opengis.metadata.lineage.Lineage;
 import org.opengis.metadata.content.FeatureCatalogueDescription;
@@ -61,8 +60,8 @@ public final strictfp class ConcatenatedFeatureSetTest extends TestCase {
 
         final FeatureType 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());
@@ -108,7 +107,7 @@ public final strictfp class ConcatenatedFeatureSetTest extends TestCase {
         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();
@@ -119,7 +118,7 @@ public final strictfp class ConcatenatedFeatureSetTest extends TestCase {
         t2f2.setPropertyValue("value", 4);
         t2f2.setPropertyValue("label", "second-second");
 
-        final FeatureSet t2fs = new MemoryFeatureSet(null, t2, Arrays.asList(t2f1, t2f2));
+        final FeatureSet t2fs = new MemoryFeatureSet(null, t2, List.of(t2f1, t2f2));
         /*
          * First, we'll test that total sum of value property is coherent with initialized features.
          * After that, we will ensure that we can get back the right labels for each subtype.
@@ -155,8 +154,8 @@ public final strictfp class ConcatenatedFeatureSetTest extends TestCase {
         final FeatureType mockSuperType = builder.build();
         final FeatureType firstType  = builder.setSuperTypes(mockSuperType).setName("first").build();
         final FeatureType 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,7 +181,7 @@ public final strictfp class ConcatenatedFeatureSetTest extends TestCase {
         }
         final FeatureTypeBuilder builder = new FeatureTypeBuilder().setName("mock");
         final FeatureType 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 --git 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
index e9b1c3efd8..4c5191ff10 100644
--- 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
@@ -18,7 +18,7 @@ package org.apache.sis.storage.aggregate;
 
 import java.util.Map;
 import java.util.HashMap;
-import java.util.Arrays;
+import java.util.List;
 import java.util.Iterator;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -72,7 +72,7 @@ public final strictfp class JoinFeatureSetTest extends TestCase {
         builder.addAttribute( String.class).setName("myNameSpace", "att1");
         builder.addAttribute(Integer.class).setName("myNameSpace", "att2");
         final FeatureType 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),
@@ -84,7 +84,7 @@ public final strictfp class JoinFeatureSetTest extends TestCase {
         builder.addAttribute(Integer.class).setName("otherNameSpace", "att3");
         builder.addAttribute( Double.class).setName("otherNameSpace", "att4");
         final FeatureType 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 --git 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
index a544011381..22eb6f12cb 100644
--- 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
@@ -17,7 +17,7 @@
 package org.apache.sis.internal.storage.gpx;
 
 import java.net.URI;
-import java.util.Arrays;
+import java.util.List;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
@@ -159,7 +159,7 @@ resp:   for (final Responsibility r : c.getResponsibleParties()) {
     @Override
     public Collection<Restriction> getUseConstraints() {
         if (license != null) {
-            return Arrays.asList(Restriction.COPYRIGHT, Restriction.LICENCE);
+            return List.of(Restriction.COPYRIGHT, Restriction.LICENCE);
         } else {
             return Collections.singleton(Restriction.COPYRIGHT);
         }
diff --git a/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/MetadataTest.java b/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/MetadataTest.java
index 567bd7660a..7dc5afe0b8 100644
--- a/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/MetadataTest.java
+++ b/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/MetadataTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.internal.storage.gpx;
 
-import java.util.Arrays;
+import java.util.List;
 import java.net.URI;
 import java.net.URISyntaxException;
 import org.apache.sis.test.DependsOn;
@@ -95,12 +95,12 @@ public final strictfp class MetadataTest extends TestCase {
         metadata.author      = person;
         metadata.creator     = "DataProducer";
         metadata.copyright   = copyright;
-        metadata.keywords    = Arrays.asList("sample", "metadata");
+        metadata.keywords    = List.of("sample", "metadata");
         metadata.bounds      = bounds;
         metadata.time        = date("2010-03-01 00:00:00");
-        metadata.links       = Arrays.asList(new Link(new URI("http://first-address.org")),
-                                             new Link(new URI("http://second-address.org")),
-                                             new Link(new URI("http://third-address.org")));
+        metadata.links       = List.of(new Link(new URI("http://first-address.org")),
+                                       new Link(new URI("http://second-address.org")),
+                                       new Link(new URI("http://third-address.org")));
         metadata.links.get(2).type = "website";
         metadata.links.get(0).text = "first";
         return metadata;
diff --git a/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/UpdaterTest.java b/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/UpdaterTest.java
index 9f5ce3d2dc..085f8d2924 100644
--- a/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/UpdaterTest.java
+++ b/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/UpdaterTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.internal.storage.gpx;
 
-import java.util.Arrays;
+import java.util.List;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -133,7 +133,7 @@ public final strictfp class UpdaterTest extends TestCase {
             point3.setPropertyValue("sis:geometry", new Point(35, 30));
             point1.setPropertyValue("time", Instant.parse("2010-01-10T00:00:00Z"));
             point3.setPropertyValue("time", Instant.parse("2010-01-30T00:00:00Z"));
-            store.add(Arrays.asList(point1, point2, point3).iterator());
+            store.add(List.of(point1, point2, point3).iterator());
         }
         assertXmlEquals(
                 "<gpx xmlns=\"" + Tags.NAMESPACE + "1/1\" version=\"1.1\">\n" +
diff --git 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
index 71d9260874..5e5de0203f 100644
--- 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
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.storage.gpx;
 
 import java.util.List;
-import java.util.Arrays;
 import java.time.Instant;
 import java.net.URI;
 import java.io.UncheckedIOException;
@@ -272,9 +271,9 @@ public final strictfp class WriterTest extends TestCase {
         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();
         point3.setPropertyValue("sis:geometry",  new Point(35, 30));
         point3.setPropertyValue("time",          Instant.parse("2010-01-30T00:00:00Z"));
@@ -294,11 +293,11 @@ public final strictfp class WriterTest extends TestCase {
         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();
         point2.setPropertyValue("sis:geometry", new Point(25, 20));
-        final List<Feature> wayPoints = Arrays.asList(point1, point2, point3);
+        final List<Feature> wayPoints = List.of(point1, point2, point3);
         final List<Feature> features;
         switch (type) {
             case WAY_POINT: {
@@ -314,11 +313,11 @@ public final strictfp class WriterTest extends TestCase {
                 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();
-                features = Arrays.asList(route1, route2);
+                features = List.of(route1, route2);
                 break;
             }
             case TRACK: {
@@ -333,12 +332,12 @@ public final strictfp class WriterTest extends TestCase {
                 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();
-                features = Arrays.asList(track1, track2);
+                features = List.of(track1, track2);
                 break;
             }
             default: throw new AssertionError(type);