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/12 16:34:30 UTC

[sis] 02/02: Resolve some "TODO" which were waiting for JDK 10 or JDK 11.

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 2c7abea573334f1494fa67aa49815e3a9927eabd
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Mon Dec 12 17:19:35 2022 +0100

    Resolve some "TODO" which were waiting for JDK 10 or JDK 11.
---
 .../apache/sis/internal/feature/j2d/Factory.java   |  4 +--
 .../sis/internal/jaxb/IdentifierMapAdapter.java    |  5 ++--
 .../org/apache/sis/xml/TransformingReader.java     |  1 -
 .../org/apache/sis/internal/util/Numerics.java     | 11 +++++--
 .../org/apache/sis/internal/util/NumericsTest.java | 35 +++++++++++++++++++++-
 .../apache/sis/internal/storage/inflater/ZIP.java  | 31 ++-----------------
 .../internal/storage/inflater/package-info.java    |  2 +-
 .../sis/internal/storage/xml/AbstractProvider.java |  2 +-
 .../storage/aggregate/AggregatedFeatureSet.java    |  2 +-
 .../sis/storage/aggregate/GroupBySample.java       |  2 +-
 10 files changed, 54 insertions(+), 41 deletions(-)

diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/Factory.java b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/Factory.java
index b8a2191ae4..0376a8b10b 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/Factory.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/Factory.java
@@ -253,7 +253,7 @@ public final class Factory extends Geometries<Shape> {
         for (final Shape geometry : shapes) {
             path.append(geometry, false);
         }
-        // path.trimToSize();       // TODO: uncomment with JDK10.
+        path.trimToSize();
         return new Wrapper(path);
     }
 
@@ -309,7 +309,7 @@ public final class Factory extends Geometries<Shape> {
                     }
                 }
             }
-            // path.trimToSize();       // TODO: uncomment with JDK10.
+            path.trimToSize();
             geometry = path;
         }
         return new Wrapper(geometry);
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapAdapter.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapAdapter.java
index e8a3e81a5e..1cf8530f66 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapAdapter.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/IdentifierMapAdapter.java
@@ -21,7 +21,6 @@ import java.util.Set;
 import java.util.List;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.Collection;
 import java.util.AbstractMap;
@@ -131,10 +130,10 @@ public class IdentifierMapAdapter extends AbstractMap<Citation,String> implement
     public final Collection<Identifier> getIdentifiers(final Class<?> type) {
         if (!type.isInstance(identifiers)) {
             if (type.isAssignableFrom(Set.class)) {
-                return new HashSet<>(identifiers);      // TODO: use Set.copyOf in JDK10.
+                return Set.copyOf(identifiers);
             }
             if (type.isAssignableFrom(List.class)) {
-                return new ArrayList<>(identifiers);    // TODO: use List.copyOf in JDK10.
+                return List.copyOf(identifiers);
             }
         }
         return identifiers;
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/xml/TransformingReader.java b/core/sis-metadata/src/main/java/org/apache/sis/xml/TransformingReader.java
index b3e7a0383d..21dacce17d 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/xml/TransformingReader.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/xml/TransformingReader.java
@@ -99,7 +99,6 @@ final class TransformingReader extends Transformer implements XMLEventReader {
      * This map is initialized only once and should not be modified after that point.
      */
     private static final Map<String, Map<String,String>> NAMESPACES = load(false, FILENAME, LEGACY_NAMESPACES, 260);
-    // TODO: use Set.copyOf(…) with JDK10.
 
     /**
      * Returns the namespace for the given ISO type, or {@code null} if unknown.
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 ca272ef6ce..a16dabd699 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
@@ -21,6 +21,7 @@ import java.util.HashMap;
 import java.text.Format;
 import java.text.DecimalFormat;
 import java.util.function.BiFunction;
+import java.math.BigInteger;
 import org.apache.sis.util.Debug;
 import org.apache.sis.util.Static;
 import org.apache.sis.util.Workaround;
@@ -39,7 +40,7 @@ import static java.lang.Math.ulp;
  * Miscellaneous utilities methods working on floating point numbers.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.3
+ * @version 1.4
  * @since   0.3
  * @module
  */
@@ -270,7 +271,13 @@ 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) {
-        return Math.multiplyExact(value, multiplier) / divisor;
+        try {
+            return Math.multiplyExact(value, multiplier) / divisor;
+        } catch (ArithmeticException e) {
+            // We do not have a better algorithm at this time.
+            return BigInteger.valueOf(value).multiply(BigInteger.valueOf(multiplier))
+                             .divide(BigInteger.valueOf(divisor)).longValueExact();
+        }
     }
 
     /**
diff --git a/core/sis-utility/src/test/java/org/apache/sis/internal/util/NumericsTest.java b/core/sis-utility/src/test/java/org/apache/sis/internal/util/NumericsTest.java
index db3dedbec3..21f9ce7933 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/internal/util/NumericsTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/internal/util/NumericsTest.java
@@ -17,6 +17,7 @@
 package org.apache.sis.internal.util;
 
 import java.util.Random;
+import java.math.BigInteger;
 import org.apache.sis.math.MathFunctions;
 import org.apache.sis.test.TestUtilities;
 import org.apache.sis.test.TestCase;
@@ -34,7 +35,7 @@ import static org.junit.Assert.*;
  * Tests the {@link Numerics} class.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.3
+ * @version 1.4
  * @since   0.3
  * @module
  */
@@ -84,6 +85,38 @@ public final strictfp class NumericsTest extends TestCase {
         assertEquals(-2L, ceilDiv( -8L, 3L));
     }
 
+    /**
+     * Tests {@link Numerics#multiplyDivide(long, long, long)}.
+     * This method uses {@link BigInteger} as a reference.
+     */
+    @Test
+    public void testMultiplyDivide() {
+        final Random random = TestUtilities.createRandomNumberGenerator();
+        for (int i=0; i<10; i++) {
+            final long value      = random.nextLong();
+            final long multiplier = random.nextLong();
+            final long divisor    = random.nextLong();              // Accepted also 0.
+            final long expected;
+            try {
+                // ArithmeticException may occur because of overflow or division by 0.
+                expected = BigInteger.valueOf(value).multiply(BigInteger.valueOf(multiplier))
+                                     .divide(BigInteger.valueOf(divisor)).longValueExact();
+            } catch (ArithmeticException e) {
+                // If BigInteger fails, then `multiplyDivide(…)` shall also fail.
+                try {
+                    Numerics.multiplyDivide(value, multiplier, divisor);
+                    fail("Expected " + e);
+                } catch (ArithmeticException ex) {
+                    // Expected exception.
+                    continue;
+                }
+                throw e;
+            }
+            final long actual = Numerics.multiplyDivide(value, multiplier, divisor);
+            assertEquals(expected, actual);
+        }
+    }
+
     /**
      * Tests {@link Numerics#saturatingAdd(long, int)}.
      */
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/ZIP.java b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/ZIP.java
index a66e4080f7..4275c8ebd2 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/ZIP.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/ZIP.java
@@ -30,7 +30,7 @@ import org.apache.sis.internal.storage.io.ChannelDataInput;
  *
  * @author  Rémi Marechal (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.3
+ * @version 1.4
  * @since   1.1
  * @module
  */
@@ -83,13 +83,13 @@ final class ZIP extends CompressionChannel {
         int required = 0;
         try {
             int n;
-            while ((n = inflate(target)) == 0) {
+            while ((n = inflater.inflate(target)) == 0) {
                 if (inflater.needsInput()) {
                     if (++required >= input.buffer.capacity()) {
                         throw new BufferOverflowException();
                     }
                     input.ensureBufferContains(required);
-                    setInput(input.buffer);
+                    inflater.setInput(input.buffer);
                 } else if (inflater.finished()) {
                     return -1;
                 } else {
@@ -102,31 +102,6 @@ final class ZIP extends CompressionChannel {
         return target.position() - start;
     }
 
-    /**
-     * Placeholder for {@code Inflater.inflate(ByteBuffer)}.
-     *
-     * @todo Remove after migration to JDK11.
-     */
-    private int inflate(final ByteBuffer target) throws DataFormatException {
-//      return inflater.inflate(target);        // JDK11
-        final int p = target.position();
-        final int n = inflater.inflate(target.array(), p, target.remaining());
-        target.position(p + n);
-        return n;
-    }
-
-    /**
-     * Placeholder for {@code Inflater.setInput(ByteBuffer)}.
-     *
-     * @todo Remove after migration to JDK11.
-     */
-    private void setInput(final ByteBuffer target) throws DataFormatException {
-//      inflater.setInput(target);        // JDK11
-        final byte[] b = new byte[target.remaining()];
-        target.get(b);
-        inflater.setInput(b);
-    }
-
     /**
      * Releases resources used by the inflater.
      */
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/package-info.java b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/package-info.java
index 2f90f2c480..78c31299c4 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/package-info.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/package-info.java
@@ -42,7 +42,7 @@
  * </dl>
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.3
+ * @version 1.4
  * @since   1.1
  * @module
  */
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/AbstractProvider.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/AbstractProvider.java
index 6588e2ea90..ad42518dd5 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/AbstractProvider.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/AbstractProvider.java
@@ -115,7 +115,7 @@ public abstract class AbstractProvider extends DocumentedStoreProvider {
             }
             // Quick check for "<?xml " header.
             for (int i=0; i<HEADER.length; i++) {
-                if (buffer.get() != HEADER[i]) {              // TODO: use ByteBuffer.mismatch(…) with JDK11.
+                if (buffer.get() != HEADER[i]) {
                     return ProbeResult.UNSUPPORTED_STORAGE;
                 }
             }
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/AggregatedFeatureSet.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/AggregatedFeatureSet.java
index b05db5c0f3..56c6be896a 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/AggregatedFeatureSet.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/AggregatedFeatureSet.java
@@ -100,7 +100,7 @@ abstract class AggregatedFeatureSet extends AbstractFeatureSet {
                 }
             } else {
                 final Optional<Envelope> e = fs.getEnvelope();
-                if (!e.isPresent()) return false;                   // TODO: use isEmpty() with JDK11.
+                if (e.isEmpty()) return false;
                 addTo.add(e.get());
             }
         }
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/GroupBySample.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/GroupBySample.java
index 1f5f859905..dc7d4bda5a 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/GroupBySample.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/GroupBySample.java
@@ -47,7 +47,7 @@ final class GroupBySample extends Group<GroupByCRS<GroupByTransform>> {
      * @param  ranges  the sample dimensions of this group.
      */
     private GroupBySample(final List<SampleDimension> ranges) {
-        this.ranges = ranges;       // TODO: use List.copyOf(…) with JDK10.
+        this.ranges = List.copyOf(ranges);
     }
 
     /**