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

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

commit 3c78638b96e1e5cb3bacabc80a125f752148478f
Merge: f1ea236300 230b6bceb6
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Sat Jul 15 15:55:53 2023 +0200

    Merge branch 'geoapi-3.1'.
    This merge completes the preparation for JPMS (Jigsaw)
    and prepares the upgrade from JUnit 4 to JUnit 5.
    
    https://github.com/apache/sis/pull/34

 .gitattributes                                     |  43 ++++--
 .../apache/sis/console/MimeTypeCommandTest.java    |  14 +-
 .../gui/referencing/PositionableProjection.java    |  10 ++
 application/sis-webapp/pom.xml                     |  10 +-
 .../org/apache/sis/services/ServletListener.java   |   6 +-
 .../org/apache/sis/coverage/SampleDimension.java   |  16 +-
 .../apache/sis/feature/DefaultAttributeType.java   |   5 +-
 .../sis/feature/GroupAsPolylineOperation.java      |   4 +-
 .../sis/feature/builder/FeatureTypeBuilder.java    |   2 +-
 .../apache/sis/filter/BinaryGeometryFilter.java    |  30 ++--
 .../org/apache/sis/filter/BinarySpatialFilter.java |  15 +-
 .../apache/sis/filter/DefaultFilterFactory.java    |   4 +-
 .../java/org/apache/sis/filter/DistanceFilter.java |  23 ++-
 .../apache/sis/internal/feature/Geometries.java    |  99 ++++++++----
 .../sis/internal/feature/GeometryFactories.java    |  26 +++-
 .../sis/internal/feature/GeometryWithCRS.java      |  13 +-
 .../sis/internal/feature/GeometryWrapper.java      |  72 +++++----
 .../org/apache/sis/internal/feature/Resources.java |   5 +
 .../sis/internal/feature/Resources.properties      |   1 +
 .../sis/internal/feature/Resources_fr.properties   |   1 +
 .../internal/feature/SpatialOperationContext.java  |  12 +-
 .../sis/internal/feature/StandardGeometries.java   | 170 +++++++++++++++++++++
 .../apache/sis/internal/feature/esri/Factory.java  |  44 ++++--
 .../apache/sis/internal/feature/esri/Wrapper.java  |  13 +-
 .../sis/internal/feature/esri/package-info.java    |   2 +-
 .../apache/sis/internal/feature/j2d/Factory.java   |  22 +--
 .../sis/internal/feature/j2d/PointWrapper.java     |  12 +-
 .../apache/sis/internal/feature/j2d/Wrapper.java   |  12 +-
 .../sis/internal/feature/j2d/package-info.java     |   2 +-
 .../apache/sis/internal/feature/jts/Factory.java   |  57 ++++---
 .../apache/sis/internal/feature/jts/Wrapper.java   |  53 +++++--
 .../sis/internal/filter/GeometryConverter.java     |   8 +-
 .../java/org/apache/sis/internal/filter/Node.java  |  12 +-
 .../internal/filter/sqlmm/GeometryConstructor.java |   9 +-
 .../sis/internal/filter/sqlmm/GeometryParser.java  |  11 +-
 .../sis/internal/filter/sqlmm/OneGeometry.java     |  15 +-
 .../apache/sis/internal/filter/sqlmm/SQLMM.java    |   2 +-
 .../sis/internal/filter/sqlmm/ST_FromBinary.java   |   2 +-
 .../sis/internal/filter/sqlmm/ST_FromText.java     |   2 +-
 .../apache/sis/internal/filter/sqlmm/ST_Point.java |  21 ++-
 .../sis/internal/filter/sqlmm/ST_Transform.java    |  10 +-
 .../sis/internal/filter/sqlmm/SpatialFunction.java |   2 +-
 .../sis/internal/filter/sqlmm/TwoGeometries.java   |  23 ++-
 .../apache/sis/feature/EnvelopeOperationTest.java  |   6 +-
 .../sis/filter/BinarySpatialFilterTestCase.java    |   4 +-
 .../sis/internal/feature/GeometriesTestCase.java   |  14 +-
 .../internal/feature/StandardGeometriesTest.java   |  59 +++++++
 .../sis/internal/feature/esri/FactoryTest.java     |  22 ++-
 .../apache/sis/internal/feature/jts/JTSTest.java   |  14 +-
 .../internal/filter/sqlmm/RegistryTestCase.java    |   8 +-
 .../sis/internal/jaxb/code/MD_ObligationCode.java  |   2 +-
 .../sis/internal/jaxb/gco/GO_CharacterString.java  |  20 ++-
 .../apache/sis/internal/jaxb/gco/GO_DateTime.java  |   4 +-
 .../apache/sis/internal/jaxb/gco/GO_Distance.java  |   2 +-
 .../apache/sis/internal/jaxb/gco/GO_Integer.java   |   2 +-
 .../apache/sis/internal/jaxb/gco/GO_Measure.java   |   2 +-
 .../internal/jaxb/gco/GO_MultiplicityRange.java    |   8 +-
 .../org/apache/sis/internal/jaxb/gco/GO_Real.java  |   2 +-
 .../apache/sis/internal/jaxb/gco/GO_Record.java    |   2 +-
 .../sis/internal/jaxb/gco/GO_RecordType.java       |   2 +-
 .../apache/sis/internal/jaxb/gco/GO_Temporal.java  |   4 +-
 .../org/apache/sis/internal/jaxb/gco/GO_URL.java   |   6 +-
 .../sis/internal/jaxb/gco/GO_UnlimitedInteger.java |   4 +-
 .../jaxb/gco/InternationalStringAdapter.java       |   2 +-
 .../apache/sis/internal/jaxb/gco/Multiplicity.java |   2 +-
 .../sis/internal/jaxb/gco/MultiplicityRange.java   |   8 +-
 .../sis/internal/jaxb/gco/StringAdapter.java       |   2 +-
 .../sis/internal/jaxb/gco/UnlimitedInteger.java    |  16 +-
 .../org/apache/sis/internal/jaxb/gcx/Anchor.java   |   2 +-
 .../org/apache/sis/internal/jaxb/gcx/FileName.java |   4 +-
 .../apache/sis/internal/jaxb/gcx/MimeFileType.java |   4 +-
 .../sis/internal/jaxb/geometry/GM_Object.java      |   2 +-
 .../sis/internal/jaxb/gml/CodeListAdapter.java     |  12 +-
 .../apache/sis/internal/jaxb/gml/GMLAdapter.java   |   2 +-
 .../apache/sis/internal/jaxb/gml/TimePeriod.java   |   4 +-
 .../apache/sis/internal/jaxb/gts/TM_Duration.java  |   2 +-
 .../sis/internal/jaxb/gts/TM_PeriodDuration.java   |   2 +-
 .../org/apache/sis/internal/jaxb/lan/Country.java  |  20 ++-
 .../apache/sis/internal/jaxb/lan/LanguageCode.java |   6 +-
 .../sis/internal/jaxb/lan/LocaleAdapter.java       |   4 +-
 .../jaxb/lan/LocalisedCharacterString.java         |   6 +-
 .../apache/sis/internal/jaxb/lan/PT_FreeText.java  |   4 +-
 .../apache/sis/internal/jaxb/lan/PT_Locale.java    |  30 ++--
 .../apache/sis/internal/jaxb/lan/TextGroup.java    |   4 +-
 .../internal/jaxb/metadata/replace/Parameter.java  |   5 +
 .../jaxb/metadata/replace/QualityParameter.java    |  20 ++-
 .../metadata/replace/ReferenceSystemMetadata.java  |   6 +-
 .../internal/jaxb/metadata/replace/SensorType.java |  12 +-
 .../jaxb/metadata/replace/ServiceParameter.java    |  43 ++++--
 .../sis/internal/metadata/ReferencingServices.java |  17 +--
 .../sis/internal/metadata/sql/ScriptRunner.java    |  35 ++++-
 .../org/apache/sis/metadata/sql/Installer.java     |  15 +-
 .../main/java/org/apache/sis/util/iso/Types.java   |  58 +++----
 .../org.apache.sis.internal.util.MetadataServices  |   1 +
 .../sis/internal/jaxb/gco/MultiplicityTest.java    |  22 ++-
 .../sis/internal/jaxb/lan/PT_LocaleTest.java       |  27 ++--
 .../java/org/apache/sis/metadata/Assertions.java   |   3 +-
 .../metadata/iso/citation/DefaultCitationTest.java |  32 ++--
 .../sis/metadata/iso/extent/DefaultExtentTest.java |  32 +++-
 .../DefaultServiceIdentificationTest.java          |  18 ++-
 .../iso/lineage/DefaultProcessStepTest.java        |  21 ++-
 .../quality/AbstractPositionalAccuracyTest.java    |  22 ++-
 .../org/apache/sis/metadata/xml/TestUsingFile.java |  52 ++++++-
 .../java/org/apache/sis/test/sql/TestDatabase.java |  29 ++--
 .../apache/sis/test/xml/DocumentComparator.java    |   8 +-
 .../java/org/apache/sis/test/xml/TestCase.java     | 104 +++++++------
 .../java/org/apache/sis/test/xml/package-info.java |   2 +-
 .../sis/util/iso/DefaultNameFactoryTest.java       |   5 +-
 .../java/org/apache/sis/util/iso/TypesTest.java    |   9 --
 .../jaxb/referencing/CC_OperationParameter.java    |  14 +-
 .../apache/sis/internal/jaxb/referencing/Code.java |   6 +-
 .../jaxb/referencing/SC_DerivedCRSType.java        |   6 +-
 .../referencing/provider/Description.java}         |  35 +++--
 .../referencing/provider/SatelliteTracking.java    |   4 +-
 .../sis/parameter/DefaultParameterDescriptor.java  |   6 +-
 .../sis/parameter/DefaultParameterValue.java       |   2 +-
 ...pache.sis.internal.metadata.ReferencingServices |   1 +
 .../sis/parameter/ParameterMarshallingTest.java    |  43 +++++-
 .../referencing/crs/DefaultCompoundCRSTest.java    |  14 +-
 .../sis/referencing/crs/DefaultDerivedCRSTest.java |  14 +-
 .../referencing/crs/DefaultGeodeticCRSTest.java    |  14 +-
 .../referencing/crs/DefaultProjectedCRSTest.java   |  20 ++-
 .../sis/referencing/cs/DefaultCartesianCSTest.java |  14 +-
 .../referencing/cs/DefaultEllipsoidalCSTest.java   |  14 +-
 .../referencing/datum/DefaultEllipsoidTest.java    |  24 +--
 .../datum/DefaultGeodeticDatumTest.java            |  12 +-
 .../datum/DefaultPrimeMeridianTest.java            |  15 +-
 .../datum/DefaultTemporalDatumTest.java            |  14 +-
 .../datum/DefaultVerticalDatumTest.java            |  25 +--
 .../referencing/factory/sql/EPSGFactoryTest.java   |  14 +-
 .../DefaultConcatenatedOperationTest.java          |  14 +-
 .../operation/DefaultPassThroughOperationTest.java |  14 +-
 .../operation/SingleOperationMarshallingTest.java  |  17 ++-
 .../operation/projection/InitializerTest.java      |   8 +-
 .../operation/transform/LinearTransformTest.java   |   5 +-
 .../transform/ProjectiveTransformTest.java         |   3 -
 .../sis/test/integration/MetadataVerticalTest.java |  15 +-
 .../sis/internal/system/OptionalDependency.java    |  50 ++----
 .../apache/sis/internal/util/MetadataServices.java |  12 +-
 .../org/apache/sis/internal/util/Numerics.java     |  59 +------
 .../java/org/apache/sis/math/SequenceVector.java   |   5 +-
 .../java/org/apache/sis/measure/NumberRange.java   |   4 +-
 .../java/org/apache/sis/setup/GeometryLibrary.java |  25 ++-
 .../java/org/apache/sis/util/ArgumentChecks.java   |  21 +++
 .../src/main/java/org/apache/sis/util/Numbers.java |  13 +-
 .../sis/util/ResourceInternationalString.java      |  82 +++-------
 .../org/apache/sis/internal/util/NumericsTest.java |  28 ----
 .../test/java/org/apache/sis/test/TestCase.java    |   2 -
 .../java/org/apache/sis/test/TestUtilities.java    |  16 +-
 ide-project/NetBeans/build.xml                     |  14 ++
 ide-project/NetBeans/nbproject/project.properties  |   4 +-
 pom.xml                                            |  23 ++-
 .../profile/fra/DirectReferenceSystemTest.java     |  13 +-
 .../apache/sis/profile/japan/JapanProfileTest.java |  26 ++--
 .../sis/internal/netcdf/DiscreteSampling.java      |   4 +-
 .../jdbc/AbstractTestBaseForInternalJDBC.java      |   3 +-
 .../internal/shapefile/jdbc/DBFConnectionTest.java |   4 +-
 .../internal/shapefile/jdbc/DBFResultSetTest.java  |   2 -
 .../internal/shapefile/jdbc/DBFStatementTest.java  |   2 -
 .../sis/storage/shapefile/ShapeFileTest.java       |   3 +-
 .../apache/sis/internal/sql/feature/Database.java  |   2 +-
 .../sis/internal/sql/feature/GeometryGetter.java   |   6 +-
 .../sis/internal/sql/feature/SelectionClause.java  |   2 +-
 .../internal/sql/feature/GeometryGetterTest.java   |  12 +-
 .../sql/feature/SelectionClauseWriterTest.java     |   5 +-
 .../sis/internal/sql/postgis/PostgresTest.java     |  28 +++-
 .../org/apache/sis/storage/sql/SQLStoreTest.java   |  29 +++-
 .../sis/internal/storage/MetadataBuilder.java      |   5 +-
 .../org/apache/sis/internal/storage/csv/Store.java |   4 +-
 .../sis/internal/storage/wkt/StoreFormat.java      |   4 +-
 .../internal/storage/xml/MimeTypeDetectorTest.java |   6 +-
 .../apache/sis/storage/StorageConnectorTest.java   |  23 ++-
 .../sis/internal/storage/gpx/Description.java      |  62 ++++++++
 .../org/apache/sis/internal/storage/gpx/Types.java |   7 +-
 .../storage/xml/stream/StaxStreamReader.java       |   3 +-
 .../sis/internal/storage/gpx/ReaderTest.java       |  27 ++--
 .../apache/sis/internal/storage/gpx/TestData.java  |  91 +++++++++++
 .../sis/internal/storage/gpx/WriterTest.java       |  35 +++--
 178 files changed, 1883 insertions(+), 1108 deletions(-)

diff --cc 
core/sis-feature/src/main/java/org/apache/sis/filter/BinaryGeometryFilter.java
index 457d8ea980,b03cadd903..f694d42062
--- 
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
@@@ -45,12 -51,11 +45,11 @@@ import org.apache.sis.internal.geoapi.f
   * @author  Alexis Manin (Geomatys)
   * @version 1.4
   *
 - * @param  <R>  the type of resources (e.g. {@link 
org.opengis.feature.Feature}) used as inputs.
 + * @param  <R>  the type of resources (e.g. {@code Feature}) used as inputs.
-  * @param  <G>  the implementation type of geometry objects.
   *
   * @since 1.1
   */
- abstract class BinaryGeometryFilter<R,G> extends Node implements 
Optimization.OnFilter<R> {
 -abstract class BinaryGeometryFilter<R> extends Node implements 
SpatialOperator<R>, Optimization.OnFilter<R> {
++abstract class BinaryGeometryFilter<R> extends Node implements 
Optimization.OnFilter<R> {
      /**
       * For cross-version compatibility.
       */
@@@ -58,15 -63,19 +57,15 @@@
  
      /**
       * The first of the two expressions to be used by this function.
 -     *
 -     * @see BinarySpatialOperator#getOperand1()
       */
      @SuppressWarnings("serial")         // Most SIS implementations are 
serializable.
-     protected final Expression<R, GeometryWrapper<G>> expression1;
+     protected final Expression<R, GeometryWrapper> expression1;
  
      /**
       * The second of the two expressions to be used by this function.
 -     *
 -     * @see BinarySpatialOperator#getOperand2()
       */
      @SuppressWarnings("serial")         // Most SIS implementations are 
serializable.
-     protected final Expression<R, GeometryWrapper<G>> expression2;
+     protected final Expression<R, GeometryWrapper> expression2;
  
      /**
       * The preferred CRS and other context to use if geometry transformations 
are needed.
@@@ -142,8 -151,7 +141,7 @@@
      /**
       * Returns the original expression specified by the user.
       *
 -     * @param  <R>  the type of resources (e.g. {@link 
org.opengis.feature.Feature}) used as inputs.
 +     * @param  <R>  the type of resources (e.g. {@code Feature}) used as 
inputs.
-      * @param  <G>  the geometry implementation type.
       * @param  expression  the expression to unwrap.
       * @return the unwrapped expression.
       */
@@@ -219,10 -227,10 +217,10 @@@
                  final CoordinateReferenceSystem targetCRS = 
AttributeConvention.getCRSCharacteristic(
                          featureType, 
featureType.getProperty(((ValueReference<?,?>) other).getXPath()));
                  if (targetCRS != null) {
-                     final GeometryWrapper<G> geometry    = 
wrapper.apply(null);
-                     final GeometryWrapper<G> transformed = 
geometry.transform(targetCRS);
+                     final GeometryWrapper geometry    = wrapper.apply(null);
+                     final GeometryWrapper transformed = 
geometry.transform(targetCRS);
                      if (geometry != transformed) {
 -                        literal = Optimization.literal(transformed);
 +                        literal = (Literal<R,?>) 
Optimization.literal(transformed);
                          if (literal == effective1) effective1 = literal;
                          else effective2 = literal;
                      }
diff --cc 
core/sis-feature/src/main/java/org/apache/sis/filter/BinarySpatialFilter.java
index e3ee507b62,ff76063e42..3266c8d02b
--- 
a/core/sis-feature/src/main/java/org/apache/sis/filter/BinarySpatialFilter.java
+++ 
b/core/sis-feature/src/main/java/org/apache/sis/filter/BinarySpatialFilter.java
@@@ -38,12 -40,11 +38,11 @@@ import org.apache.sis.internal.geoapi.f
   * @author  Martin Desruisseaux (Geomatys)
   * @version 1.4
   *
 - * @param  <R>  the type of resources (e.g. {@link 
org.opengis.feature.Feature}) used as inputs.
 + * @param  <R>  the type of resources (e.g. {@code Feature}) used as inputs.
-  * @param  <G>  the implementation type of geometry objects.
   *
   * @since 1.1
   */
- final class BinarySpatialFilter<R,G> extends BinaryGeometryFilter<R,G> {
 -final class BinarySpatialFilter<R> extends BinaryGeometryFilter<R> implements 
BinarySpatialOperator<R> {
++final class BinarySpatialFilter<R> extends BinaryGeometryFilter<R> {
      /**
       * For cross-version compatibility.
       */
diff --cc 
core/sis-feature/src/main/java/org/apache/sis/filter/DistanceFilter.java
index 30061a34c4,8b43988333..77d53b6dd0
--- 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
@@@ -43,12 -45,11 +43,11 @@@ import org.apache.sis.internal.geoapi.f
   * @author  Martin Desruisseaux (Geomatys)
   * @version 1.4
   *
 - * @param  <R>  the type of resources (e.g. {@link 
org.opengis.feature.Feature}) used as inputs.
 + * @param  <R>  the type of resources (e.g. {@code Feature}) used as inputs.
-  * @param  <G>  the implementation type of geometry objects.
   *
   * @since 1.1
   */
- final class DistanceFilter<R,G> extends BinaryGeometryFilter<R,G> {
 -final class DistanceFilter<R> extends BinaryGeometryFilter<R> implements 
DistanceOperator<R> {
++final class DistanceFilter<R> extends BinaryGeometryFilter<R> {
      /**
       * For cross-version compatibility.
       */
@@@ -136,12 -138,13 +135,12 @@@
       *
       * @throws IllegalStateException if the geometry is not a literal.
       */
 -    @Override
      public Geometry getGeometry() {
-         final Literal<R, ? extends GeometryWrapper<G>> literal;
+         final Literal<R, ? extends GeometryWrapper> literal;
          if (expression2 instanceof Literal<?,?>) {
-             literal = (Literal<R, ? extends GeometryWrapper<G>>) expression2;
+             literal = (Literal<R, ? extends GeometryWrapper>) expression2;
          } else if (expression1 instanceof Literal<?,?>) {
-             literal = (Literal<R, ? extends GeometryWrapper<G>>) expression1;
+             literal = (Literal<R, ? extends GeometryWrapper>) expression1;
          } else {
              throw new IllegalStateException();
          }
diff --cc 
core/sis-feature/src/main/java/org/apache/sis/internal/feature/GeometryWrapper.java
index ce16183e7d,2f7d9a14f3..fce3b79a44
--- 
a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/GeometryWrapper.java
+++ 
b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/GeometryWrapper.java
@@@ -127,10 -133,11 +127,10 @@@ public abstract class GeometryWrapper e
  
      /**
       * Returns the geometry bounding box, together with its coordinate 
reference system.
+      * For an empty geometry or a single point, the returned envelope will be 
empty.
       *
       * @return the geometry envelope. Should never be {@code null}.
-      *         Note though that for an empty geometry or a single point, the 
returned envelope will be empty.
       */
 -    @Override
      public abstract GeneralEnvelope getEnvelope();
  
      /**
@@@ -192,13 -200,12 +192,12 @@@
       * @param  context   the preferred CRS and other context to use if 
geometry transformations are needed.
       * @return result of applying the specified predicate.
       * @throws UnsupportedOperationException if the operation cannot be 
performed with current implementation.
 -     * @throws InvalidFilterValueException if an error occurred while 
executing the operation on given geometries.
 +     * @throws IllegalArgumentException if an error occurred while executing 
the operation on given geometries.
       */
-     public final boolean predicate(final DistanceOperatorName type, final 
GeometryWrapper<G> other,
+     public final boolean predicate(final DistanceOperatorName type, final 
GeometryWrapper other,
                                     final Quantity<Length> distance, final 
SpatialOperationContext context)
      {
-         @SuppressWarnings({"unchecked", "rawtypes"})
-         final GeometryWrapper<G>[] geometries = new GeometryWrapper[] {this, 
other};
+         final GeometryWrapper[] geometries = new GeometryWrapper[] {this, 
other};
          try {
              if (context.transform(geometries)) {
                  double dv = distance.getValue().doubleValue();
@@@ -230,13 -237,12 +229,12 @@@
       * @param  context  the preferred CRS and other context to use if 
geometry transformations are needed.
       * @return result of applying the specified predicate.
       * @throws UnsupportedOperationException if the operation cannot be 
performed with current implementation.
 -     * @throws InvalidFilterValueException if an error occurred while 
executing the operation on given geometries.
 +     * @throws IllegalArgumentException if an error occurred while executing 
the operation on given geometries.
       */
-     public final boolean predicate(final SpatialOperatorName type, final 
GeometryWrapper<G> other,
+     public final boolean predicate(final SpatialOperatorName type, final 
GeometryWrapper other,
                                     final SpatialOperationContext context)
      {
-         @SuppressWarnings({"unchecked", "rawtypes"})
-         final GeometryWrapper<G>[] geometries = new GeometryWrapper[] {this, 
other};
+         final GeometryWrapper[] geometries = new GeometryWrapper[] {this, 
other};
          try {
              if (context.transform(geometries)) {
                  return geometries[0].predicateSameCRS(type, geometries[1]);
@@@ -484,7 -490,8 +482,7 @@@
       *
       * @see #getCoordinateReferenceSystem()
       */
-     public GeometryWrapper<G> transform(final CoordinateReferenceSystem 
targetCRS) throws TransformException {
 -    @Override
+     public GeometryWrapper transform(final CoordinateReferenceSystem 
targetCRS) throws TransformException {
          if (targetCRS == null) {
              return this;
          }
diff --cc 
core/sis-feature/src/main/java/org/apache/sis/internal/filter/GeometryConverter.java
index b3a4a96bd7,99281ba329..74ffd6be25
--- 
a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/GeometryConverter.java
+++ 
b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/GeometryConverter.java
@@@ -147,10 -148,10 +147,10 @@@ final class GeometryConverter<R,G> exte
       *
       * @param  input  the geometry to evaluate with this expression.
       * @return the geometry wrapper, or {@code null} if the evaluated value 
is null.
 -     * @throws InvalidFilterValueException if the expression result is not an 
instance of a supported type.
 +     * @throws IllegalArgumentException if the expression result is not an 
instance of a supported type.
       */
      @Override
-     public GeometryWrapper<G> apply(final R input) {
+     public GeometryWrapper apply(final R input) {
          final Object value = expression.apply(input);
          final Envelope envelope;
          if (value instanceof GeographicBoundingBox) {
diff --cc 
core/sis-feature/src/main/java/org/apache/sis/internal/filter/Node.java
index 8c2ccd3bdc,77882fa9c2..c50f4b5292
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/Node.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/Node.java
@@@ -194,8 -196,7 +194,7 @@@ public abstract class Node implements S
       * If the given exception was wrapped by {@link 
#toGeometryWrapper(Geometries, Expression)},
       * returns the original expression. Otherwise returns the given 
expression.
       *
-      * @param  <R>         the type of resources (e.g. {@code Feature}) used 
as inputs.
-      * @param  <G>         the geometry implementation type.
 -     * @param  <R>  the type of resources (e.g. {@link 
org.opengis.feature.Feature}) used as inputs.
++     * @param  <R>  the type of resources (e.g. {@code Feature}) used as 
inputs.
       * @param  expression  the expression to unwrap.
       * @return the unwrapped expression.
       */
@@@ -215,12 -216,11 +214,11 @@@
       * @param  expression   the expression for which to get the geometry 
library.
       * @return the geometry library (never {@code null}).
       */
-     protected static <G> Geometries<G> getGeometryLibrary(final Expression<?, 
GeometryWrapper<G>> expression) {
+     protected static Geometries<?> getGeometryLibrary(final Expression<?, 
GeometryWrapper> expression) {
          if (expression instanceof GeometryConverter<?,?>) {
-             return ((GeometryConverter<?,G>) expression).library;
+             return ((GeometryConverter<?,?>) expression).library;
          }
 -        throw new 
InvalidFilterValueException(Resources.format(Resources.Keys.NotAGeometryAtFirstExpression));
 +        throw new 
IllegalArgumentException(Resources.format(Resources.Keys.NotAGeometryAtFirstExpression));
      }
  
      /**
diff --cc 
core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/GeometryConstructor.java
index 07e52584a7,833821543f..4fa320d224
--- 
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
@@@ -22,9 -22,11 +22,10 @@@ import org.opengis.referencing.crs.Coor
  import org.apache.sis.internal.feature.Geometries;
  import org.apache.sis.internal.feature.GeometryWrapper;
  import org.apache.sis.util.resources.Errors;
+ import org.apache.sis.util.Classes;
  
  // Branch-dependent imports
 -import org.opengis.filter.Expression;
 -import org.opengis.filter.InvalidFilterValueException;
 +import org.apache.sis.filter.Expression;
  
  
  /**
@@@ -122,11 -124,11 +123,11 @@@ class GeometryConstructor<R,G> extends 
              } else {
                  result = 
library.createFromComponents(operation.getGeometryType().get(), value);
              }
-             final Object   geometry = result.implementation();
+             final Object   geometry = library.getGeometry(result);
              final Class<?> expected = operation.getReturnType(library);
              if (!expected.isInstance(geometry)) {
 -                throw new InvalidFilterValueException(Errors.format(
 +                throw new IllegalArgumentException(Errors.format(
-                         Errors.Keys.IllegalArgumentClass_3, "geom", expected, 
geometry.getClass()));
+                         Errors.Keys.IllegalArgumentClass_3, "geom", expected, 
Classes.getClass(geometry)));
              }
              if (srid != null) {
                  final CoordinateReferenceSystem crs = getTargetCRS(input);
diff --cc 
core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/GeometryParser.java
index 635882b939,d126a159c2..23137b26b6
--- 
a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/GeometryParser.java
+++ 
b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/GeometryParser.java
@@@ -20,9 -20,11 +20,10 @@@ import org.opengis.referencing.crs.Coor
  import org.apache.sis.internal.feature.Geometries;
  import org.apache.sis.internal.feature.GeometryWrapper;
  import org.apache.sis.util.resources.Errors;
+ import org.apache.sis.util.Classes;
  
  // Branch-dependent imports
 -import org.opengis.filter.Expression;
 -import org.opengis.filter.InvalidFilterValueException;
 +import org.apache.sis.filter.Expression;
  
  
  /**
@@@ -99,10 -101,10 +100,10 @@@ abstract class GeometryParser<R,G> exte
                      case ST_BdPolyFromText:
                      case ST_BdMPolyFromWKB:
                      case ST_BdMPolyFromText: break;
 -                    default: warning(new 
InvalidFilterValueException(Errors.format(
 +                    default: warning(new 
IllegalArgumentException(Errors.format(
                                              
Errors.Keys.IllegalArgumentClass_3, inputName(),
                                              getValueClass(),
-                                             
result.implementation().getClass())), true);
+                                             
Classes.getClass(library.getGeometry(result)))), true);
                  }
              }
              if (srid != null) {
diff --cc 
core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/OneGeometry.java
index 5f1da923c3,f3ba0a9677..6ebc493f15
--- 
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
@@@ -33,8 -33,7 +33,7 @@@ import org.apache.sis.filter.Expression
   * @author  Martin Desruisseaux (Geomatys)
   * @version 1.4
   *
 - * @param  <R>  the type of resources (e.g. {@link 
org.opengis.feature.Feature}) used as inputs.
 + * @param  <R>  the type of resources (e.g. {@code Feature}) used as inputs.
-  * @param  <G>  the implementation type of geometry objects.
   *
   * @since 1.1
   */
diff --cc 
core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Point.java
index 94f90443f9,282118f134..71f3fd6f38
--- 
a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Point.java
+++ 
b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Point.java
@@@ -46,8 -47,7 +46,7 @@@ import org.apache.sis.filter.Expression
   * @author  Martin Desruisseaux (Geomatys)
   * @version 1.4
   *
 - * @param  <R>  the type of resources (e.g. {@link 
org.opengis.feature.Feature}) used as inputs.
 + * @param  <R>  the type of resources (e.g. {@code Feature}) used as inputs.
-  * @param  <G>  the implementation type of geometry objects.
   *
   * @since 1.1
   */
@@@ -147,11 -147,11 +146,11 @@@ final class ST_Point<R> extends Functio
       *
       * @param  value  the WKB or WKT value to parse. Can be {@code null}.
       * @return the parsed point, or {@code null} if the given value is null.
 -     * @throws InvalidFilterValueException if the value is not a string or 
byte array.
 +     * @throws IllegalArgumentException if the value is not a string or byte 
array.
       * @throws Exception if parsing failed for another reason.
       */
-     private GeometryWrapper<G> parse(final Object value) throws Exception {
-         final GeometryWrapper<G> point;
+     private GeometryWrapper parse(final Object value) throws Exception {
+         final GeometryWrapper point;
          if (value == null) {
              return null;
          } else if (value instanceof byte[]) {
@@@ -161,11 -161,11 +160,11 @@@
          } else if (value instanceof String) {
              point = library.parseWKT((String) value);
          } else {
 -            throw new InvalidFilterValueException(Errors.format(
 +            throw new IllegalArgumentException(Errors.format(
                      Errors.Keys.IllegalArgumentClass_3, "wkt|wkb", 
String.class, value.getClass()));
          }
-         final Object implementation = point.implementation();
-         if (library.pointClass.isInstance(implementation)) {
+         final Object geometry = library.getGeometry(point);
+         if (library.pointClass.isInstance(geometry)) {
              return point;
          } else {
              final String type = (value instanceof String) ? "wkt" : "wkb";
diff --cc 
core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_Transform.java
index 2370a485a4,474f08191e..5b9b2f9305
--- 
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
@@@ -76,9 -77,9 +76,9 @@@ final class ST_Transform<R> extends Fun
       * Creates a new function with the given parameters. It is caller's 
responsibility to ensure
       * that the given array is non-null and does not contain null elements.
       *
 -     * @throws InvalidFilterValueException if CRS cannot be constructed from 
the second expression.
 +     * @throws IllegalArgumentException if CRS cannot be constructed from the 
second expression.
       */
-     ST_Transform(final Expression<R,?>[] parameters, final Geometries<G> 
library) {
+     ST_Transform(final Expression<R,?>[] parameters, final Geometries<?> 
library) {
          super(SQLMM.ST_Transform, parameters, PRESENT);
          geometry = toGeometryWrapper(library, parameters[0]);
      }
diff --cc 
core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/TwoGeometries.java
index cc72136844,591235d679..d6eb55dda6
--- 
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
@@@ -38,8 -39,7 +38,7 @@@ import org.apache.sis.internal.geoapi.f
   * @author  Martin Desruisseaux (Geomatys)
   * @version 1.4
   *
 - * @param  <R>  the type of resources (e.g. {@link 
org.opengis.feature.Feature}) used as inputs.
 + * @param  <R>  the type of resources (e.g. {@code Feature}) used as inputs.
-  * @param  <G>  the implementation type of geometry objects.
   *
   * @since 1.1
   */
diff --cc 
core/sis-feature/src/test/java/org/apache/sis/feature/EnvelopeOperationTest.java
index 011dc0651c,c936c35c1e..cf0fd652e8
--- 
a/core/sis-feature/src/test/java/org/apache/sis/feature/EnvelopeOperationTest.java
+++ 
b/core/sis-feature/src/test/java/org/apache/sis/feature/EnvelopeOperationTest.java
@@@ -155,9 -160,9 +155,9 @@@ public final class EnvelopeOperationTes
  
          if (asCharacteristic) {
              @SuppressWarnings("unchecked")
-             final AbstractAttribute<GeometryWrapper<?>> property =
-                     (AbstractAttribute<GeometryWrapper<?>>) 
feature.getProperty(propertyName);
 -            final Attribute<GeometryWrapper> property =
 -                    (Attribute<GeometryWrapper>) 
feature.getProperty(propertyName);
 -            final Attribute<CoordinateReferenceSystem> crsCharacteristic = 
Features.cast(
++            final AbstractAttribute<GeometryWrapper> property =
++                    (AbstractAttribute<GeometryWrapper>) 
feature.getProperty(propertyName);
 +            final AbstractAttribute<CoordinateReferenceSystem> 
crsCharacteristic = Features.cast(
                      
property.getType().characteristics().get(AttributeConvention.CRS),
                      CoordinateReferenceSystem.class).newInstance();
              crsCharacteristic.setValue(crs);
diff --cc 
core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/QualityParameter.java
index eb98a38311,d49c7fdef4..c2938b3744
--- 
a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/QualityParameter.java
+++ 
b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/QualityParameter.java
@@@ -92,7 -101,8 +98,7 @@@ public final class QualityParameter ext
       * @see #getDescription()
       */
      @XmlElement
-     DefaultMeasureDescription description;
 -    @SuppressWarnings("serial")                 // Most Apache SIS 
implementations are serializable.
 -    public Description description;
++    public DefaultMeasureDescription description;
  
      /**
       * Value type of the data quality parameter (shall be one of the data 
types defined in ISO/TS 19103:2005).
@@@ -102,8 -112,17 +108,9 @@@
       */
      @XmlElement(required = true)
      @XmlJavaTypeAdapter(GO_GenericName.class)   // Not in package-info 
because shall not be applied to getLegacyName().
-     TypeName valueType;
+     @SuppressWarnings("serial")                 // Most Apache SIS 
implementations are serializable.
+     public TypeName valueType;
  
 -    /**
 -     * Structure of the data quality parameter.
 -     *
 -     * @see #getValueClass()
 -     */
 -    @XmlElement
 -    public ValueStructure valueStructure;
 -
      /**
       * Creates an initially empty parameter.
       * This constructor is needed by JAXB at unmarshalling time.
diff --cc 
core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/ServiceParameter.java
index 73dda6ae44,542f170e37..9681cd5ac0
--- 
a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/ServiceParameter.java
+++ 
b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/replace/ServiceParameter.java
@@@ -97,8 -104,17 +102,9 @@@ public final class ServiceParameter ext
       */
      @XmlElement(required=true, name="name")
      @XmlJavaTypeAdapter(GO_GenericName.Since2014.class)
-     MemberName memberName;
+     @SuppressWarnings("serial")                 // Most Apache SIS 
implementations are serializable.
+     public MemberName memberName;
  
 -    /**
 -     * Indication if the parameter is an input to the service, an output or 
both.
 -     *
 -     * @see #getDirection()
 -     */
 -    @XmlElement(required = true)
 -    public ParameterDirection direction;
 -
      /**
       * A narrative explanation of the role of the parameter.
       *
diff --cc core/sis-metadata/src/main/java/org/apache/sis/util/iso/Types.java
index 6ec6d7cf87,9e2a783799..c67e6268c3
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Types.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Types.java
@@@ -292,12 -293,9 +292,9 @@@ public final class Types extends Stati
       * @see #getDescription(Class)
       */
      @OptionalCandidate
 -    public static InternationalString getDescription(final 
ControlledVocabulary code) {
 +    public static InternationalString getDescription(final CodeList<?> code) {
-         if (code != null) {
-             final String resources = 
toResourceName(code.getClass().getName());
-             if (resources != null) {
-                 return new Description(resources, 
Description.resourceKey(code));
-             }
+         if (code != null && hasResources(code.getClass())) {
+             return new Description(Description.resourceKey(code));
          }
          return null;
      }
@@@ -379,7 -365,7 +369,7 @@@
           */
          @Override
          protected ResourceBundle getBundle(final Locale locale) {
-             return ResourceBundle.getBundle(resources, locale, CLASSLOADER);
 -            return ResourceBundles.descriptions(locale);
++            return 
ResourceBundle.getBundle("org.opengis.metadata.Descriptions", locale, 
CLASSLOADER);
          }
  
          /**
@@@ -442,11 -429,19 +432,19 @@@
           *
           * @param  code  the code list for which to create a title.
           */
 -        CodeTitle(final ControlledVocabulary code) {
 +        CodeTitle(final CodeList<?> code) {
-             super(CodeLists.RESOURCES, resourceKey(code));
+             super(resourceKey(code));
              this.code = code;
          }
  
+         /**
+          * Loads the GeoAPI resources. A cache is managed by {@link 
ResourceBundle}.
+          */
+         @Override
+         protected ResourceBundle getBundle(final Locale locale) {
 -            return ResourceBundles.codeLists(locale);
++            return ResourceBundle.getBundle(CodeLists.RESOURCES, locale);
+         }
+ 
          /**
           * Returns a fallback if no resource is found.
           */
diff --cc 
core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultServiceIdentificationTest.java
index 8abc32c730,1fd98a22af..121630ff23
--- 
a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultServiceIdentificationTest.java
+++ 
b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultServiceIdentificationTest.java
@@@ -17,11 -17,17 +17,12 @@@
  package org.apache.sis.metadata.iso.identification;
  
  import java.util.Set;
+ import java.io.InputStream;
  import jakarta.xml.bind.JAXBException;
  import org.opengis.util.NameFactory;
 -import org.opengis.parameter.ParameterDirection;
  import org.opengis.parameter.ParameterDescriptor;
  import org.opengis.metadata.citation.Citation;
 -import org.opengis.metadata.identification.CouplingType;
 -import org.opengis.metadata.identification.CoupledResource;
 -import org.opengis.metadata.identification.OperationMetadata;
 -import org.opengis.metadata.identification.ServiceIdentification;
 -import org.opengis.metadata.identification.DistributedComputingPlatform;
 +import org.apache.sis.internal.geoapi.evolution.UnsupportedCodeList;
  import org.apache.sis.metadata.iso.citation.DefaultCitation;
  import org.apache.sis.metadata.xml.TestUsingFile;
  import org.apache.sis.util.iso.DefaultNameFactory;
@@@ -104,9 -116,9 +110,9 @@@ public final class DefaultServiceIdenti
       */
      @Test
      public void testUnmarshal() throws JAXBException {
-         final DefaultServiceIdentification id = 
unmarshalFile(DefaultServiceIdentification.class, XML2016+FILENAME);
 -        final ServiceIdentification id = 
unmarshalFile(ServiceIdentification.class, openTestFile(Format.XML2016));
++        final DefaultServiceIdentification id = 
unmarshalFile(DefaultServiceIdentification.class, openTestFile(Format.XML2016));
          verify(id);
 -        final CoupledResource resource = 
getSingleton(id.getCoupledResources());
 +        final DefaultCoupledResource resource = 
getSingleton(id.getCoupledResources());
          assertTitleEquals("resourceReference", "WMS specification", 
getSingleton(resource.getResourceReferences()));
      }
  
@@@ -117,9 -129,9 +123,9 @@@
       */
      @Test
      public void testUnmarshalLegacy() throws JAXBException {
-         final DefaultServiceIdentification id = 
unmarshalFile(DefaultServiceIdentification.class, XML2007+FILENAME);
 -        final ServiceIdentification id = 
unmarshalFile(ServiceIdentification.class, openTestFile(Format.XML2007));
++        final DefaultServiceIdentification id = 
unmarshalFile(DefaultServiceIdentification.class, openTestFile(Format.XML2007));
          verify(id);
 -        final CoupledResource resource = 
getSingleton(id.getCoupledResources());
 +        final DefaultCoupledResource resource = 
getSingleton(id.getCoupledResources());
          assertEquals("scopedName", "mySpace:ABC-123", 
String.valueOf(resource.getScopedName()));
      }
  
diff --cc core/sis-metadata/src/test/java/org/apache/sis/util/iso/TypesTest.java
index c65a9431b5,ad72a9692b..b4cbdfd1a3
--- 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
@@@ -142,22 -155,10 +142,13 @@@ public final class TypesTest extends Te
          assertSame(PixelInCell.CELL_CORNER, 
Types.forCodeName(PixelInCell.class, "cellCorner",  false));
          assertSame(PixelInCell.CELL_CENTER, 
Types.forCodeName(PixelInCell.class, "cell center", false));
          assertSame(PixelInCell.CELL_CENTER, 
Types.forCodeName(PixelInCell.class, "cellCenter",  false));
 -        assertSame(PixelInCell.CELL_CENTER, 
Types.forCodeName(PixelInCell.class, "cell centre", false));
 -        assertSame(PixelInCell.CELL_CENTER, 
Types.forCodeName(PixelInCell.class, "cellCentre",  false));
 +
 +        if (PENDING_NEXT_GEOAPI_RELEASE) {
 +            assertSame(PixelInCell.CELL_CENTER, 
Types.forCodeName(PixelInCell.class, "cell centre", false));
 +            assertSame(PixelInCell.CELL_CENTER, 
Types.forCodeName(PixelInCell.class, "cellCentre",  false));
 +        }
      }
  
-     /**
-      * Tests the {@link Types#toResourceName(String)} method.
-      */
-     @Test
-     public void testGetResources() {
-         assertEquals("org.opengis.metadata.Descriptions", 
Types.toResourceName("org.opengis.metadata.Identifier"));
-         assertNull(Types.toResourceName("org.opengis.metadata2.Identifier"));
-     }
- 
      /**
       * Tests the {@link Types#getDescription(Class)} method.
       */
diff --cc 
core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/LinearTransformTest.java
index 2422748819,2595e8e9c4..c52da8ef9b
--- 
a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/LinearTransformTest.java
+++ 
b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/LinearTransformTest.java
@@@ -23,14 -23,9 +23,12 @@@ import org.opengis.referencing.operatio
  
  // Test imports
  import org.junit.Test;
- import org.junit.runner.RunWith;
  import org.apache.sis.test.DependsOn;
- import org.apache.sis.test.TestRunner;
  import static org.opengis.test.Assert.assertInstanceOf;
  
 +// Branch-dependent imports
 +import org.junit.Ignore;
 +
  
  /**
   * Tests various implementation of the {@link LinearTransform} interface by 
inheriting the tests defined
diff --cc 
core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/ProjectiveTransformTest.java
index 0535413d2c,6663f63e7d..e23c2aecc9
--- 
a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/ProjectiveTransformTest.java
+++ 
b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/ProjectiveTransformTest.java
@@@ -34,18 -35,15 +34,16 @@@ import org.apache.sis.math.Fraction
  
  // Test imports
  import org.opengis.test.Validators;
- import org.apache.sis.test.TestRunner;
  import org.apache.sis.test.DependsOn;
- import org.junit.runner.RunWith;
  import org.junit.After;
  import org.junit.Test;
 -import org.opengis.test.Assert;
 -import static org.junit.Assert.*;
 -import static org.opengis.test.Assert.assertInstanceOf;
 +import static org.apache.sis.test.GeoapiAssert.assertMatrixEquals;
 +import static org.opengis.test.Assert.*;
  
  // Branch-dependent imports
 -import org.opengis.test.referencing.AffineTransformTest;
 +import org.junit.Ignore;
 +import org.opengis.referencing.operation.TransformException;
 +import org.opengis.test.referencing.TransformTestCase;
  
  
  /**
@@@ -58,19 -56,8 +56,18 @@@
   * @version 1.4
   * @since   0.5
   */
- @RunWith(TestRunner.class)
  @DependsOn({AbstractMathTransformTest.class, ScaleTransformTest.class})
 -public class ProjectiveTransformTest extends AffineTransformTest {
 +public class ProjectiveTransformTest extends TransformTestCase {
 +    /**
 +     * The factory to use for creating linear transforms.
 +     */
 +    private final MathTransformFactory mtFactory;
 +
 +    /**
 +     * The matrix for the tested transform.
 +     */
 +    private Matrix matrix;
 +
      /**
       * Tolerance factor for strict comparisons.
       */
diff --cc 
core/sis-referencing/src/test/java/org/apache/sis/test/integration/MetadataVerticalTest.java
index 261415dfd0,9da38465c8..3d3f6f436b
--- 
a/core/sis-referencing/src/test/java/org/apache/sis/test/integration/MetadataVerticalTest.java
+++ 
b/core/sis-referencing/src/test/java/org/apache/sis/test/integration/MetadataVerticalTest.java
@@@ -18,6 -18,8 +18,7 @@@ package org.apache.sis.test.integration
  
  import java.net.URI;
  import java.util.Locale;
+ import java.io.InputStream;
 -import java.nio.charset.StandardCharsets;
  import jakarta.xml.bind.JAXBException;
  
  import org.opengis.metadata.*;
@@@ -100,11 -105,11 +105,11 @@@ public class MetadataVerticalTest exten
       */
      @Test
      public void testMetadataWithVerticalCRS() throws JAXBException {
-         final Metadata metadata = unmarshalFile(Metadata.class, XML_FILE);
+         final Metadata metadata = unmarshalFile(Metadata.class, 
openTestFile());
 -        assertEquals("fileIdentifier", "20090901",                     
metadata.getMetadataIdentifier().getCode());
 -        assertEquals("language",       Locale.ENGLISH,                 
getSingleton(metadata.getLocalesAndCharsets().keySet()));
 -        assertEquals("characterSet",   StandardCharsets.UTF_8,         
getSingleton(metadata.getLocalesAndCharsets().values()));
 -        assertEquals("dateStamp",      xmlDate("2014-01-04 00:00:00"), 
getSingleton(metadata.getDateInfo()).getDate());
 +        assertEquals("fileIdentifier", "20090901",                     
metadata.getFileIdentifier());
 +        assertEquals("language",       Locale.ENGLISH,                 
metadata.getLanguage());
 +        assertEquals("characterSet",   CharacterSet.UTF_8,             
metadata.getCharacterSet());
 +        assertEquals("dateStamp",      xmlDate("2014-01-04 00:00:00"), 
metadata.getDateStamp());
          /*
           * <gmd:contact>
           *   <gmd:CI_ResponsibleParty>
diff --cc 
core/sis-utility/src/main/java/org/apache/sis/internal/util/MetadataServices.java
index 6a51e000bc,bbc43df887..c0308a07da
--- 
a/core/sis-utility/src/main/java/org/apache/sis/internal/util/MetadataServices.java
+++ 
b/core/sis-utility/src/main/java/org/apache/sis/internal/util/MetadataServices.java
@@@ -19,6 -19,8 +19,7 @@@ package org.apache.sis.internal.util
  import java.text.Format;
  import java.util.Locale;
  import java.util.TimeZone;
+ import java.util.ServiceLoader;
 -import java.util.MissingResourceException;
  import java.util.function.Supplier;
  import javax.sql.DataSource;
  import java.sql.SQLException;
diff --cc pom.xml
index 9df24882b9,ea39255b3e..aa1a4b6025
--- a/pom.xml
+++ b/pom.xml
@@@ -524,8 -524,13 +524,15 @@@
         =========================================================== -->
    <dependencies>
      <dependency>
-       <groupId>junit</groupId>
-       <artifactId>junit</artifactId>
+       <groupId>org.junit.jupiter</groupId>
+       <artifactId>junit-jupiter-api</artifactId>
++      <version>5.9.3</version>
+       <scope>test</scope>
+     </dependency>
+     <dependency>
+       <groupId>org.junit.vintage</groupId>
+       <artifactId>junit-vintage-engine</artifactId>
++      <version>5.9.3</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
diff --cc 
storage/sis-shapefile/src/test/java/org/apache/sis/storage/shapefile/ShapeFileTest.java
index 4da6f19241,bddd9f5f1b..f30aace1c0
--- 
a/storage/sis-shapefile/src/test/java/org/apache/sis/storage/shapefile/ShapeFileTest.java
+++ 
b/storage/sis-shapefile/src/test/java/org/apache/sis/storage/shapefile/ShapeFileTest.java
@@@ -25,11 -25,9 +25,10 @@@ import java.text.MessageFormat
  import java.util.logging.Logger;
  
  import org.apache.sis.storage.DataStoreException;
- import org.apache.sis.test.TestCase;
  import org.junit.Ignore;
  import org.junit.Test;
 -import org.opengis.feature.Feature;
 +import org.apache.sis.feature.AbstractFeature;
 +import org.apache.sis.feature.AbstractAttribute;
  
  
  /**
diff --cc 
storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
index 5a44f56479,3bc737deea..70c8beeb2a
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
@@@ -234,10 -236,10 +234,10 @@@ final class Store extends URIDataStore 
          super(provider, connector);
          final Reader r = connector.commit(Reader.class, StoreProvider.NAME);
          source     = (r instanceof BufferedReader) ? (BufferedReader) r : new 
LineNumberReader(r);
-         geometries = 
Geometries.implementation(connector.getOption(OptionKey.GEOMETRY_LIBRARY));
+         geometries = 
Geometries.factory(connector.getOption(OptionKey.GEOMETRY_LIBRARY));
          dissociate = 
FoliationRepresentation.FRAGMENTED.equals(connector.getOption(DataOptionKey.FOLIATION_REPRESENTATION));
          GeneralEnvelope envelope    = null;
 -        FeatureType     featureType = null;
 +        DefaultFeatureType featureType = null;
          Foliation       foliation   = null;
          try {
              final List<String> elements = new ArrayList<>();
diff --cc 
storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/ReaderTest.java
index 69183ad663,b5a5663b63..96266047b9
--- 
a/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/ReaderTest.java
+++ 
b/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/ReaderTest.java
@@@ -223,11 -224,11 +224,11 @@@ public final class ReaderTest extends T
      @Test
      @DependsOnMethod("testMetadata100")
      public void testWayPoint100() throws DataStoreException {
-         try (Store reader = create("1.0/waypoint.xml")) {
+         try (Store reader = create(TestData.V1_0, TestData.WAYPOINT)) {
              verifyAlmostEmptyMetadata((Metadata) reader.getMetadata());
              assertEquals("version", StoreProvider.V1_0, reader.getVersion());
 -            try (Stream<Feature> features = reader.features(false)) {
 -                final Iterator<Feature> it = features.iterator();
 +            try (Stream<AbstractFeature> features = reader.features(false)) {
 +                final Iterator<AbstractFeature> it = features.iterator();
                  verifyPoint(it.next(), 0, false);
                  verifyPoint(it.next(), 1, false);
                  verifyPoint(it.next(), 2, false);
@@@ -244,11 -245,11 +245,11 @@@
      @Test
      @DependsOnMethod("testMetadata110")
      public void testWayPoint110() throws DataStoreException {
-         try (Store reader = create("1.1/waypoint.xml")) {
+         try (Store reader = create(TestData.V1_1, TestData.WAYPOINT)) {
              verifyAlmostEmptyMetadata((Metadata) reader.getMetadata());
              assertEquals("version", StoreProvider.V1_1, reader.getVersion());
 -            try (Stream<Feature> features = reader.features(false)) {
 -                final Iterator<Feature> it = features.iterator();
 +            try (Stream<AbstractFeature> features = reader.features(false)) {
 +                final Iterator<AbstractFeature> it = features.iterator();
                  verifyPoint(it.next(), 0, true);
                  verifyPoint(it.next(), 1, true);
                  verifyPoint(it.next(), 2, true);
@@@ -265,11 -266,11 +266,11 @@@
      @Test
      @DependsOnMethod("testWayPoint100")
      public void testRoute100() throws DataStoreException {
-         try (Store reader = create("1.0/route.xml")) {
+         try (Store reader = create(TestData.V1_0, TestData.ROUTE)) {
              verifyAlmostEmptyMetadata((Metadata) reader.getMetadata());
              assertEquals("version", StoreProvider.V1_0, reader.getVersion());
 -            try (Stream<Feature> features = reader.features(false)) {
 -                final Iterator<Feature> it = features.iterator();
 +            try (Stream<AbstractFeature> features = reader.features(false)) {
 +                final Iterator<AbstractFeature> it = features.iterator();
                  verifyRoute(it.next(), false, 1);
                  verifyEmpty(it.next(), "rtept");
                  assertFalse("hasNext", it.hasNext());
@@@ -372,11 -373,11 +373,11 @@@
      @Test
      @DependsOnMethod("testRoute100")
      public void testTrack100() throws DataStoreException {
-         try (Store reader = create("1.0/track.xml")) {
+         try (Store reader = create(TestData.V1_0, TestData.TRACK)) {
              verifyAlmostEmptyMetadata((Metadata) reader.getMetadata());
              assertEquals("version", StoreProvider.V1_0, reader.getVersion());
 -            try (Stream<Feature> features = reader.features(false)) {
 -                final Iterator<Feature> it = features.iterator();
 +            try (Stream<AbstractFeature> features = reader.features(false)) {
 +                final Iterator<AbstractFeature> it = features.iterator();
                  verifyTrack(it.next(), false, 1);
                  verifyEmpty(it.next(), "trkseg");
                  assertFalse("hasNext", it.hasNext());
@@@ -392,11 -393,11 +393,11 @@@
      @Test
      @DependsOnMethod("testRoute110")
      public void testTrack110() throws DataStoreException {
-         try (Store reader = create("1.1/track.xml")) {
+         try (Store reader = create(TestData.V1_1, TestData.TRACK)) {
              verifyAlmostEmptyMetadata((Metadata) reader.getMetadata());
              assertEquals("version", StoreProvider.V1_1, reader.getVersion());
 -            try (Stream<Feature> features = reader.features(false)) {
 -                final Iterator<Feature> it = features.iterator();
 +            try (Stream<AbstractFeature> features = reader.features(false)) {
 +                final Iterator<AbstractFeature> it = features.iterator();
                  verifyTrack(it.next(), true, 3);
                  verifyEmpty(it.next(), "trkseg");
                  assertFalse("hasNext", it.hasNext());

Reply via email to