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:50 UTC

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

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);