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 <martin.desruisse...@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); } /**