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 2019/09/14 12:15:23 UTC

[sis] branch 1.0-RC updated (c56e277 -> 04e45b8)

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

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


    from c56e277  Bug fix: MetadataCopier.copy(type, metadata) should accept a type which is a super-type of the interface implemented by the given metadata instance.
     new 887371c  Rename "ModifiableMetadata.transition" to "transitionTo". The previous name was a bit ambiguous.
     new 36f1a43  API change before 1.0 release: Reverse the argument order in DataStore.addListener/removeListener. The intent is to be consistent with similar methods elsewhere in SIS, which put the Class<T> argument first.
     new 04e45b8  Clarification about whether a DataStore.getFoo() method can return null. Contain one last-minute API change before 1.0 release: getOpenParameters() return Optional.

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


Summary of changes:
 .../org/apache/sis/coverage/grid/GridGeometry.java |  2 +-
 .../internal/metadata/TransformationAccuracy.java  |  2 +-
 .../apache/sis/metadata/ModifiableMetadata.java    | 14 +++++-----
 .../java/org/apache/sis/metadata/StateChanger.java |  6 ++--
 .../org/apache/sis/metadata/iso/ISOMetadata.java   |  4 +--
 .../apache/sis/metadata/iso/extent/Extents.java    |  4 +--
 .../DefaultRepresentativeFraction.java             |  2 +-
 .../org/apache/sis/metadata/sql/Dispatcher.java    |  2 +-
 .../apache/sis/metadata/sql/MetadataFallback.java  |  2 +-
 .../sis/metadata/ModifiableMetadataTest.java       | 10 +++----
 .../metadata/iso/citation/DefaultCitationTest.java |  6 ++--
 .../metadata/iso/citation/HardCodedCitations.java  |  8 +++---
 .../DefaultRepresentativeFractionTest.java         |  4 +--
 .../referencing/PositionalAccuracyConstant.java    |  2 +-
 .../sis/referencing/ImmutableIdentifier.java       |  4 +--
 .../apache/sis/referencing/NamedIdentifier.java    |  4 +--
 .../referencing/factory/sql/EPSGDataAccess.java    |  4 +--
 .../storage/earthobservation/LandsatReader.java    |  2 +-
 .../sis/storage/earthobservation/LandsatStore.java | 31 ++++++++++++---------
 .../org/apache/sis/storage/gdal/Proj4Factory.java  |  2 +-
 .../apache/sis/storage/geotiff/GeoTiffStore.java   | 16 +++++------
 .../apache/sis/storage/netcdf/MetadataReader.java  |  2 +-
 .../org/apache/sis/storage/netcdf/NetcdfStore.java | 10 +++----
 .../java/org/apache/sis/storage/sql/SQLStore.java  | 10 +++----
 .../sis/internal/storage/AbstractResource.java     |  4 +--
 .../sis/internal/storage/MetadataBuilder.java      |  2 +-
 .../apache/sis/internal/storage/URIDataStore.java  | 11 ++++----
 .../apache/sis/internal/storage/folder/Store.java  |  8 +++---
 .../java/org/apache/sis/storage/DataStore.java     | 32 ++++++++++++----------
 .../org/apache/sis/storage/DataStoreProvider.java  |  2 +-
 .../main/java/org/apache/sis/storage/Resource.java | 10 +++----
 .../apache/sis/storage/event/StoreListener.java    |  4 +--
 .../apache/sis/storage/event/StoreListeners.java   | 20 +++++++-------
 .../java/org/apache/sis/storage/DataStoreMock.java |  7 +++--
 .../sis/storage/event/StoreListenersTest.java      | 14 +++++-----
 35 files changed, 139 insertions(+), 128 deletions(-)


[sis] 01/03: Rename "ModifiableMetadata.transition" to "transitionTo". The previous name was a bit ambiguous.

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

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

commit 887371c3d1d3af278500b317ed574f31faf570ca
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Sat Sep 14 14:06:13 2019 +0200

    Rename "ModifiableMetadata.transition" to "transitionTo". The previous name was a bit ambiguous.
---
 .../java/org/apache/sis/coverage/grid/GridGeometry.java    |  2 +-
 .../sis/internal/metadata/TransformationAccuracy.java      |  2 +-
 .../java/org/apache/sis/metadata/ModifiableMetadata.java   | 14 +++++++-------
 .../main/java/org/apache/sis/metadata/StateChanger.java    |  6 +++---
 .../main/java/org/apache/sis/metadata/iso/ISOMetadata.java |  4 ++--
 .../java/org/apache/sis/metadata/iso/extent/Extents.java   |  4 ++--
 .../iso/identification/DefaultRepresentativeFraction.java  |  2 +-
 .../main/java/org/apache/sis/metadata/sql/Dispatcher.java  |  2 +-
 .../java/org/apache/sis/metadata/sql/MetadataFallback.java |  2 +-
 .../org/apache/sis/metadata/ModifiableMetadataTest.java    | 10 +++++-----
 .../sis/metadata/iso/citation/DefaultCitationTest.java     |  6 +++---
 .../sis/metadata/iso/citation/HardCodedCitations.java      |  8 ++++----
 .../identification/DefaultRepresentativeFractionTest.java  |  4 ++--
 .../internal/referencing/PositionalAccuracyConstant.java   |  2 +-
 .../org/apache/sis/referencing/ImmutableIdentifier.java    |  4 ++--
 .../java/org/apache/sis/referencing/NamedIdentifier.java   |  4 ++--
 .../apache/sis/referencing/factory/sql/EPSGDataAccess.java |  4 ++--
 .../apache/sis/storage/earthobservation/LandsatReader.java |  2 +-
 .../java/org/apache/sis/storage/gdal/Proj4Factory.java     |  2 +-
 .../java/org/apache/sis/storage/netcdf/MetadataReader.java |  2 +-
 .../org/apache/sis/internal/storage/MetadataBuilder.java   |  2 +-
 21 files changed, 44 insertions(+), 44 deletions(-)

diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java
index 12169c1..9caedb6 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java
@@ -849,7 +849,7 @@ public class GridGeometry implements Serializable {
             if (getCoordinateReferenceSystem(envelope) != null && !envelope.isAllNaN()) {
                 try {
                     final DefaultGeographicBoundingBox db = ReferencingServices.getInstance().setBounds(envelope, null, null);
-                    db.transition(DefaultGeographicBoundingBox.State.EDITABLE);
+                    db.transitionTo(DefaultGeographicBoundingBox.State.EDITABLE);
                     bbox = db;
                 } catch (TransformException e) {
                     bbox = NilReason.INAPPLICABLE.createNilObject(GeographicBoundingBox.class);
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/TransformationAccuracy.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/TransformationAccuracy.java
index c93558b..334fcfd 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/TransformationAccuracy.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/TransformationAccuracy.java
@@ -79,7 +79,7 @@ public final class TransformationAccuracy extends Static {
                     new DefaultAbsoluteExternalPositionalAccuracy(result);
             element.setNamesOfMeasure(Collections.singleton(TRANSFORMATION_ACCURACY));
             element.setEvaluationMethodType(EvaluationMethodType.DIRECT_EXTERNAL);
-            element.transition(DefaultAbsoluteExternalPositionalAccuracy.State.FINAL);
+            element.transitionTo(DefaultAbsoluteExternalPositionalAccuracy.State.FINAL);
 
             p = CACHE.putIfAbsent(accuracy, element);
             if (p == null) {
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/ModifiableMetadata.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/ModifiableMetadata.java
index a6a196f..b1c0d86 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/ModifiableMetadata.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/ModifiableMetadata.java
@@ -104,7 +104,7 @@ public abstract class ModifiableMetadata extends AbstractMetadata {
     private static final byte STAGED = 1;
 
     /**
-     * A value for {@link #state} meaning that execution of {@code transition(…)} is in progress.
+     * A value for {@link #state} meaning that execution of {@code transitionTo(…)} is in progress.
      * Must be greater than all other values except {@link #COMPLETABLE} and {@link #FINAL}.
      */
     private static final byte FREEZING = 2;
@@ -117,7 +117,7 @@ public abstract class ModifiableMetadata extends AbstractMetadata {
     private static final byte COMPLETABLE = 3;
 
     /**
-     * A value for {@link #state} meaning that {@code transition(State.FINAL)} has been invoked.
+     * A value for {@link #state} meaning that {@code transitionTo(State.FINAL)} has been invoked.
      * Must be greater than all other values.
      */
     private static final byte FINAL = 4;
@@ -152,7 +152,7 @@ public abstract class ModifiableMetadata extends AbstractMetadata {
     /**
      * Whether the metadata is still editable or has been made final.
      * New {@link ModifiableMetadata} instances are initially {@link #EDITABLE}
-     * and can be made {@link #FINAL} after construction by a call to {@link ModifiableMetadata#transition(State)}.
+     * and can be made {@link #FINAL} after construction by a call to {@link ModifiableMetadata#transitionTo(State)}.
      *
      * <div class="note"><b>Note:</b>
      * more states may be added in future Apache SIS versions. On possible candidate is {@code STAGED}.
@@ -218,7 +218,7 @@ public abstract class ModifiableMetadata extends AbstractMetadata {
     /**
      * Tells whether this instance of metadata is editable.
      * This is initially {@link State#EDITABLE} for new {@code ModifiableMetadata} instances,
-     * but can be changed by a call to {@link #transition(State)}.
+     * but can be changed by a call to {@link #transitionTo(State)}.
      *
      * <p>{@link State#FINAL} implies that all properties are also final.
      * This recursivity does not necessarily apply to other states. For example {@link State#EDITABLE}
@@ -278,7 +278,7 @@ public abstract class ModifiableMetadata extends AbstractMetadata {
      *
      * @since 1.0
      */
-    public boolean transition(final State target) {
+    public boolean transitionTo(final State target) {
         if (target.code < state) {
             throw new UnmodifiableMetadataException(Resources.format(Resources.Keys.UnmodifiableMetadata));
         }
@@ -385,7 +385,7 @@ public abstract class ModifiableMetadata extends AbstractMetadata {
      */
     @Deprecated
     public void freeze() {
-        transition(State.FINAL);
+        transitionTo(State.FINAL);
     }
 
     /**
@@ -541,7 +541,7 @@ public abstract class ModifiableMetadata extends AbstractMetadata {
         if (source != target) {
             if (state == FREEZING) {
                 /*
-                 * transition(State.FINAL) is under progress. The source collection is already
+                 * transitionTo(State.FINAL) is under progress. The source collection is already
                  * an unmodifiable instance created by StateChanger.
                  */
                 assert (useSet != null) || collectionType(elementType).isInstance(source) : elementType;
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/StateChanger.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/StateChanger.java
index c68d89d..f9305cf 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/StateChanger.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/StateChanger.java
@@ -30,7 +30,7 @@ import org.apache.sis.metadata.iso.identification.DefaultRepresentativeFraction;
 
 
 /**
- * Invokes {@link ModifiableMetadata#transition(ModifiableMetadata.State)} recursively on metadata elements.
+ * Invokes {@link ModifiableMetadata#transitionTo(ModifiableMetadata.State)} recursively on metadata elements.
  *
  * As of Apache SIS 1.0, this class is used only for {@link ModifiableMetadata.State#FINAL}.
  * But a future version may use this object for other states too.
@@ -122,7 +122,7 @@ final class StateChanger extends MetadataVisitor<Boolean> {
      *
      * <ul>
      *   <li>If the specified object is an instance of {@code ModifiableMetadata}, then
-     *       {@link ModifiableMetadata#transition(ModifiableMetadata.State)} is invoked on that object.</li>
+     *       {@link ModifiableMetadata#transitionTo(ModifiableMetadata.State)} is invoked on that object.</li>
      *   <li>Otherwise, if the object is a {@linkplain Collection collection}, then the
      *       content is copied into a new collection of similar type, with values replaced
      *       by their unmodifiable variant.</li>
@@ -140,7 +140,7 @@ final class StateChanger extends MetadataVisitor<Boolean> {
          *          It may have its own algorithm for changing its state.
          */
         if (object instanceof ModifiableMetadata) {
-            ((ModifiableMetadata) object).transition(target);
+            ((ModifiableMetadata) object).transitionTo(target);
             return object;
         }
         if (object instanceof DefaultRepresentativeFraction) {
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ISOMetadata.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ISOMetadata.java
index 653e016..756b771 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ISOMetadata.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/ISOMetadata.java
@@ -223,9 +223,9 @@ public class ISOMetadata extends ModifiableMetadata implements IdentifiedObject,
      * {@inheritDoc}
      */
     @Override
-    public boolean transition(final State target) {
+    public boolean transitionTo(final State target) {
         final Collection<Identifier> p = identifiers;
-        final boolean changed = super.transition(target);
+        final boolean changed = super.transitionTo(target);
         if (changed) {
             /*
              * The 'identifiers' collection will have been replaced by an unmodifiable collection if
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java
index eea7dee..11c38e6 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java
@@ -87,10 +87,10 @@ public final class Extents extends Static {
     public static final Extent WORLD;
     static {
         final DefaultGeographicBoundingBox box = new DefaultGeographicBoundingBox(-180, 180, -90, 90);
-        box.transition(DefaultGeographicBoundingBox.State.FINAL);
+        box.transitionTo(DefaultGeographicBoundingBox.State.FINAL);
         final DefaultExtent world = new DefaultExtent(
                 Vocabulary.formatInternational(Vocabulary.Keys.World), box, null, null);
-        world.transition(DefaultExtent.State.FINAL);
+        world.transitionTo(DefaultExtent.State.FINAL);
         WORLD = world;
     }
 
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFraction.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFraction.java
index e6cbf94..f6abb5a 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFraction.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFraction.java
@@ -283,7 +283,7 @@ public class DefaultRepresentativeFraction extends Number implements Representat
      * Makes this representative fraction unmodifiable. After invocation to this method,
      * any call to a setter method will throw an {@link UnmodifiableMetadataException}.
      *
-     * @see ModifiableMetadata#transition(ModifiableMetadata.State)
+     * @see ModifiableMetadata#transitionTo(ModifiableMetadata.State)
      *
      * @since 0.7
      */
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/Dispatcher.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/Dispatcher.java
index 996096c..c9d5fe6 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/Dispatcher.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/Dispatcher.java
@@ -244,7 +244,7 @@ final class Dispatcher implements InvocationHandler {
                             }
                             cache = impl.newInstance();
                             if (cache instanceof ModifiableMetadata) {
-                                ((ModifiableMetadata) cache).transition(ModifiableMetadata.State.COMPLETABLE);
+                                ((ModifiableMetadata) cache).transitionTo(ModifiableMetadata.State.COMPLETABLE);
                             }
                             /*
                              * We do not use AtomicReference because it is okay if the cache is instantiated twice.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/MetadataFallback.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/MetadataFallback.java
index f428206..3ebed51 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/MetadataFallback.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/MetadataFallback.java
@@ -217,7 +217,7 @@ final class MetadataFallback extends MetadataSource {
         if (copyFrom != null) {
             c.setCitedResponsibleParties(createCitation(copyFrom).getCitedResponsibleParties());
         }
-        c.transition(DefaultCitation.State.FINAL);
+        c.transitionTo(DefaultCitation.State.FINAL);
         return c;
     }
 
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/ModifiableMetadataTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/ModifiableMetadataTest.java
index 1bc1cd2..f40095b 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/ModifiableMetadataTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/ModifiableMetadataTest.java
@@ -85,7 +85,7 @@ public final strictfp class ModifiableMetadataTest extends TestCase {
      */
     @Test
     public void testStateEditable() {
-        assertFalse("transition", md.transition(ModifiableMetadata.State.EDITABLE));        // Shall be a no-op.
+        assertFalse("transitionTo", md.transitionTo(ModifiableMetadata.State.EDITABLE));        // Shall be a no-op.
         assertEquals("state", ModifiableMetadata.State.EDITABLE, md.state());
         assertEquals("identifier.state", ModifiableMetadata.State.EDITABLE, identifierState());
         /*
@@ -105,11 +105,11 @@ public final strictfp class ModifiableMetadataTest extends TestCase {
      */
     @Test
     public void testStateCompletable() {
-        assertTrue("transition", md.transition(ModifiableMetadata.State.COMPLETABLE));
+        assertTrue("transitionTo", md.transitionTo(ModifiableMetadata.State.COMPLETABLE));
         assertEquals("state", ModifiableMetadata.State.COMPLETABLE, md.state());
         assertEquals("identifier.state", ModifiableMetadata.State.COMPLETABLE, identifierState());
         try {
-            md.transition(ModifiableMetadata.State.EDITABLE);
+            md.transitionTo(ModifiableMetadata.State.EDITABLE);
             fail("Shall not be allowed to transition back to editable state.");
         } catch (UnmodifiableMetadataException e) {
             verifyUnmodifiableException(e);
@@ -147,11 +147,11 @@ public final strictfp class ModifiableMetadataTest extends TestCase {
      */
     @Test
     public void testStateFinal() {
-        assertTrue("transition", md.transition(ModifiableMetadata.State.FINAL));
+        assertTrue("transitionTo", md.transitionTo(ModifiableMetadata.State.FINAL));
         assertEquals("state", ModifiableMetadata.State.FINAL, md.state());
         assertEquals("identifier.state", ModifiableMetadata.State.FINAL, identifierState());
         try {
-            md.transition(ModifiableMetadata.State.EDITABLE);
+            md.transitionTo(ModifiableMetadata.State.EDITABLE);
             fail("Shall not be allowed to transition back to editable state.");
         } catch (UnmodifiableMetadataException e) {
             verifyUnmodifiableException(e);
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultCitationTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultCitationTest.java
index 136b0ea..bd12553 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultCitationTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/DefaultCitationTest.java
@@ -132,13 +132,13 @@ public final strictfp class DefaultCitationTest extends TestUsingFile {
     }
 
     /**
-     * Tests {@link DefaultCitation#transition(DefaultCitation.State)} to the final state.
+     * Tests {@link DefaultCitation#transitionTo(DefaultCitation.State)} to the final state.
      */
     @Test
     public void testTransitionToFinal() {
         final DefaultCitation original = create();
         final DefaultCitation clone = create();
-        clone.transition(DefaultCitation.State.FINAL);
+        clone.transitionTo(DefaultCitation.State.FINAL);
         assertEquals("original.state", DefaultCitation.State.EDITABLE, original.state());
         assertEquals("clone.state",    DefaultCitation.State.FINAL,    clone.state());
         assertEquals(original, clone);
@@ -216,7 +216,7 @@ public final strictfp class DefaultCitationTest extends TestUsingFile {
      * Verifies that {@code actual} is an unmodifiable copy of {@code expected}.
      */
     private static <T> void assertCopy(final Collection<T> expected, final Collection<T> actual) {
-        assertNotSame("ModifiableMetadata.transition(FINAL) shall have copied the collection.", expected, actual);
+        assertNotSame("ModifiableMetadata.transitionTo(FINAL) shall have copied the collection.", expected, actual);
         assertEquals("The copied collection shall have the same content than the original.", expected, actual);
         try {
             actual.add(null);
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/HardCodedCitations.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/HardCodedCitations.java
index db17faf..f23a5eb 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/HardCodedCitations.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/citation/HardCodedCitations.java
@@ -51,7 +51,7 @@ public final strictfp class HardCodedCitations extends Static {
         c.getAlternateTitles().add(new SimpleInternationalString("ISO 19111"));
         c.getIdentifiers().add(new DefaultIdentifier("ISO", "19111", null));
         c.getPresentationForms().add(PresentationForm.DOCUMENT_DIGITAL);
-        c.transition(DefaultCitation.State.FINAL);
+        c.transitionTo(DefaultCitation.State.FINAL);
         ISO_19111 = c;
     }
 
@@ -62,7 +62,7 @@ public final strictfp class HardCodedCitations extends Static {
     static {
         final DefaultCitation c = new DefaultCitation("ISO 19115");
         c.getPresentationForms().add(PresentationForm.DOCUMENT_DIGITAL);
-        c.transition(DefaultCitation.State.FINAL);
+        c.transitionTo(DefaultCitation.State.FINAL);
         ISO_19115 = c;
     }
 
@@ -101,7 +101,7 @@ public final strictfp class HardCodedCitations extends Static {
         c.getPresentationForms().add(PresentationForm.TABLE_DIGITAL);
         c.getIdentifiers().add(new DefaultIdentifier(Constants.EPSG));
         c.getCitedResponsibleParties().add(p);
-        c.transition(DefaultCitation.State.FINAL);
+        c.transitionTo(DefaultCitation.State.FINAL);
         EPSG = c;
     }
 
@@ -111,7 +111,7 @@ public final strictfp class HardCodedCitations extends Static {
     public static final DefaultCitation SIS;
     static {
         final DefaultCitation c = new DefaultCitation(Constants.SIS);
-        c.transition(DefaultCitation.State.FINAL);
+        c.transitionTo(DefaultCitation.State.FINAL);
         SIS = c;
     }
 
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFractionTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFractionTest.java
index 700f075..2eaefbc 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFractionTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFractionTest.java
@@ -111,7 +111,7 @@ public final strictfp class DefaultRepresentativeFractionTest extends TestCase {
 
     /**
      * Tests indirectly {@link DefaultRepresentativeFraction#freeze()}.
-     * This method verifies that a call to {@code DefaultResolution.transition(FINAL)}
+     * This method verifies that a call to {@code DefaultResolution.transitionTo(FINAL)}
      * implies a call to {@link DefaultRepresentativeFraction#freeze()}.
      *
      * @since 0.7
@@ -120,7 +120,7 @@ public final strictfp class DefaultRepresentativeFractionTest extends TestCase {
     public void testFreeze() {
         final DefaultRepresentativeFraction fraction = new DefaultRepresentativeFraction(1000);
         final DefaultResolution resolution = new DefaultResolution(fraction);
-        resolution.transition(DefaultResolution.State.FINAL);
+        resolution.transitionTo(DefaultResolution.State.FINAL);
         assertSame(fraction, resolution.getEquivalentScale());
         try {
             fraction.setDenominator(10);
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/PositionalAccuracyConstant.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/PositionalAccuracyConstant.java
index d3a1b04..a510fae 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/PositionalAccuracyConstant.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/PositionalAccuracyConstant.java
@@ -112,7 +112,7 @@ public final class PositionalAccuracyConstant extends DefaultAbsoluteExternalPos
         setMeasureDescription(measureDescription);
         setEvaluationMethodDescription(evaluationMethodDescription);
         setEvaluationMethodType(EvaluationMethodType.DIRECT_INTERNAL);
-        transition(State.FINAL);
+        transitionTo(State.FINAL);
     }
 
     /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/ImmutableIdentifier.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/ImmutableIdentifier.java
index 1f5c710..b17ca1b 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/ImmutableIdentifier.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/ImmutableIdentifier.java
@@ -52,8 +52,8 @@ import static org.apache.sis.util.collection.Containers.property;
  * <div class="section">Immutability and thread safety</div>
  * This class is immutable and thus inherently thread-safe if the {@link Citation} and {@link InternationalString}
  * arguments given to the constructor are also immutable. It is caller's responsibility to ensure that those
- * conditions hold, for example by invoking {@link org.apache.sis.metadata.iso.citation.DefaultCitation#transition
- * DefaultCitation.transition(DefaultCitation.State.FINAL)} before passing the arguments to the constructor.
+ * conditions hold, for example by invoking {@link org.apache.sis.metadata.iso.citation.DefaultCitation#transitionTo
+ * DefaultCitation.transitionTo(DefaultCitation.State.FINAL)} before passing the arguments to the constructor.
  * Subclasses shall make sure that any overridden methods remain safe to call from multiple threads and do not change
  * any public {@code ImmutableIdentifier} state.
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java
index a1e9f5a..ae0ce7d 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java
@@ -79,8 +79,8 @@ import org.apache.sis.util.ArgumentChecks;
  * <div class="section">Immutability and thread safety</div>
  * This class is immutable and thus inherently thread-safe if the {@link Citation} and {@link InternationalString}
  * arguments given to the constructor are also immutable. It is caller's responsibility to ensure that those
- * conditions hold, for example by invoking {@link org.apache.sis.metadata.iso.citation.DefaultCitation#transition
- * DefaultCitation.transition(DefaultCitation.State.FINAL)} before passing the arguments to the constructor.
+ * conditions hold, for example by invoking {@link org.apache.sis.metadata.iso.citation.DefaultCitation#transitionTo
+ * DefaultCitation.transitionTo(DefaultCitation.State.FINAL)} before passing the arguments to the constructor.
  * Subclasses shall make sure that any overridden methods remain safe to call from multiple threads and do not change
  * any public {@code NamedIdentifier} state.
  *
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
index 7811ec8..c2e730c 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
@@ -491,7 +491,7 @@ addURIs:    for (int i=0; ; i++) {
         } catch (SQLException exception) {
             unexpectedException("getAuthority", exception);
         } finally {
-            c.transition(DefaultCitation.State.FINAL);
+            c.transitionTo(DefaultCitation.State.FINAL);
         }
         return c;
     }
@@ -2082,7 +2082,7 @@ codes:  for (int i=0; i<codes.length; i++) {
                 }
                 if (description != null || bbox != null) {
                     DefaultExtent extent = new DefaultExtent(description, bbox, null, null);
-                    extent.transition(DefaultExtent.State.FINAL);
+                    extent.transitionTo(DefaultExtent.State.FINAL);
                     returnValue = ensureSingleton(extent, returnValue, code);
                 }
             }
diff --git a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatReader.java b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatReader.java
index 9f307d7..92d0f1d 100644
--- a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatReader.java
+++ b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatReader.java
@@ -974,7 +974,7 @@ final class LandsatReader extends MetadataBuilder {
                     }
                 }
             }
-            result.transition(DefaultMetadata.State.FINAL);
+            result.transitionTo(DefaultMetadata.State.FINAL);
         }
         return result;
     }
diff --git a/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Proj4Factory.java b/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Proj4Factory.java
index efbf468..ce1e8fb 100644
--- a/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Proj4Factory.java
+++ b/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Proj4Factory.java
@@ -257,7 +257,7 @@ public class Proj4Factory extends GeodeticAuthorityFactory implements CRSAuthori
             if (release != null) {
                 final DefaultCitation df = new DefaultCitation(c);
                 df.setEdition(new SimpleInternationalString(release));
-                df.transition(DefaultCitation.State.FINAL);
+                df.transitionTo(DefaultCitation.State.FINAL);
                 c = df;
             }
             authority = c;
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
index e47d42c..ddb865c 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
@@ -1068,7 +1068,7 @@ split:  while ((start = CharSequences.skipLeadingWhitespaces(value, start, lengt
         decoder.setSearchPath(searchPath);
         final DefaultMetadata metadata = build(false);
         addCompleteMetadata(createURI(stringValue(METADATA_LINK)));
-        metadata.transition(DefaultMetadata.State.FINAL);
+        metadata.transitionTo(DefaultMetadata.State.FINAL);
         return metadata;
     }
 }
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java
index c6a31a7..ebfe86a 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java
@@ -3038,7 +3038,7 @@ parse:      for (int i = 0; i < length;) {
                 md.setMetadataStandards(c);
             }
             if (freeze) {
-                md.transition(DefaultMetadata.State.FINAL);
+                md.transitionTo(DefaultMetadata.State.FINAL);
             }
         }
         return md;


[sis] 02/03: API change before 1.0 release: Reverse the argument order in DataStore.addListener/removeListener. The intent is to be consistent with similar methods elsewhere in SIS, which put the Class argument first.

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

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

commit 36f1a43af29e47e3d3579553aebb0e5f028c3f2a
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Sat Sep 14 14:11:08 2019 +0200

    API change before 1.0 release: Reverse the argument order in DataStore.addListener/removeListener. The intent is to be consistent with similar methods elsewhere in SIS, which put the Class<T> argument first.
---
 .../sis/storage/earthobservation/LandsatStore.java   |  4 ++--
 .../org/apache/sis/storage/geotiff/GeoTiffStore.java |  4 ++--
 .../org/apache/sis/storage/netcdf/NetcdfStore.java   |  4 ++--
 .../java/org/apache/sis/storage/sql/SQLStore.java    |  4 ++--
 .../sis/internal/storage/AbstractResource.java       |  4 ++--
 .../apache/sis/internal/storage/URIDataStore.java    |  4 ++--
 .../apache/sis/internal/storage/folder/Store.java    |  4 ++--
 .../main/java/org/apache/sis/storage/DataStore.java  | 18 +++++++++---------
 .../main/java/org/apache/sis/storage/Resource.java   | 10 +++++-----
 .../org/apache/sis/storage/event/StoreListener.java  |  4 ++--
 .../org/apache/sis/storage/event/StoreListeners.java | 20 ++++++++++----------
 .../apache/sis/storage/event/StoreListenersTest.java | 14 +++++++-------
 12 files changed, 47 insertions(+), 47 deletions(-)

diff --git a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java
index 37b8672..02bcaf6 100644
--- a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java
+++ b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java
@@ -177,10 +177,10 @@ public class LandsatStore extends DataStore {
      * any listener specified for another kind of events will be ignored.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
index c98525a..3778951 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
@@ -347,10 +347,10 @@ public class GeoTiffStore extends DataStore implements Aggregate {
      * any listener specified for another kind of events will be ignored.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
index 9eed48a..6094911 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
@@ -221,10 +221,10 @@ public class NetcdfStore extends DataStore implements Aggregate {
      * any listener specified for another kind of events will be ignored.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 
diff --git a/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java b/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java
index 38d7966..4ecf249 100644
--- a/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java
+++ b/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java
@@ -262,10 +262,10 @@ public class SQLStore extends DataStore implements Aggregate {
      * any listener specified for another kind of events will be ignored.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java
index e4fbc2d..40f2f50 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java
@@ -139,10 +139,10 @@ public class AbstractResource extends StoreListeners implements Resource {
      * (at least the read-only ones) produce no change events.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 }
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
index 7db0fbb..26525c3 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
@@ -273,10 +273,10 @@ public abstract class URIDataStore extends DataStore implements StoreResource, R
      * (at least the read-only ones) produce no change events.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 }
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java
index 97401ea..a147a4e 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java
@@ -409,10 +409,10 @@ class Store extends DataStore implements StoreResource, Aggregate, DirectoryStre
      * any listener specified for another kind of events will be ignored.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
index 59905cf..3c258c6 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
@@ -440,7 +440,7 @@ public abstract class DataStore implements Resource, Localized, AutoCloseable {
      * on individual resources of this data store.</p>
      *
      * <p>If this data store may produce events of the given type, then the given listener is kept by strong reference;
-     * it will not be garbage collected unless {@linkplain #removeListener(StoreListener, Class) explicitly removed}
+     * it will not be garbage collected unless {@linkplain #removeListener(Class, StoreListener) explicitly removed}
      * or unless this {@code DataStore} is itself garbage collected. However if the given type of events can never
      * happen with this data store, then this method is not required to keep a reference to the given listener.</p>
      *
@@ -451,14 +451,14 @@ public abstract class DataStore implements Resource, Localized, AutoCloseable {
      * warnings in its own way, for example by showing warnings in a widget.
      *
      * @param  <T>        compile-time value of the {@code eventType} argument.
-     * @param  listener   listener to notify about events.
      * @param  eventType  type of {@link StoreEvent} to listen (can not be {@code null}).
+     * @param  listener   listener to notify about events.
      *
      * @since 1.0
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
-        listeners.addListener(listener, eventType);
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
+        listeners.addListener(eventType, listener);
     }
 
     /**
@@ -468,8 +468,8 @@ public abstract class DataStore implements Resource, Localized, AutoCloseable {
      * children resources.
      *
      * <p>If the same listener has been registered many times for the same even type, then this method removes only
-     * the most recent registration. In other words if {@code addListener(ls, type)} has been invoked twice, then
-     * {@code removeListener(ls, type)} needs to be invoked twice in order to remove all instances of that listener.
+     * the most recent registration. In other words if {@code addListener(type, ls)} has been invoked twice, then
+     * {@code removeListener(type, ls)} needs to be invoked twice in order to remove all instances of that listener.
      * If the given listener is not found, then this method does nothing (no exception is thrown).</p>
      *
      * <div class="section">Warning events</div>
@@ -478,14 +478,14 @@ public abstract class DataStore implements Resource, Localized, AutoCloseable {
      * then this {@code DataStore} will send future warnings to the loggers.
      *
      * @param  <T>        compile-time value of the {@code eventType} argument.
-     * @param  listener   listener to stop notifying about events.
      * @param  eventType  type of {@link StoreEvent} which were listened (can not be {@code null}).
+     * @param  listener   listener to stop notifying about events.
      *
      * @since 1.0
      */
     @Override
-    public <T extends StoreEvent> void removeListener(StoreListener<? super T> listener, Class<T> eventType) {
-        listeners.removeListener(listener, eventType);
+    public <T extends StoreEvent> void removeListener(Class<T> eventType, StoreListener<? super T> listener) {
+        listeners.removeListener(eventType, listener);
     }
 
     /**
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java
index fe1680c..250cd44 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java
@@ -145,7 +145,7 @@ public interface Resource {
      * on different resources in the same tree, for example a parent and its children.</p>
      *
      * <p>If this resource may produce events of the given type, then the given listener is kept by strong reference;
-     * it will not be garbage collected unless {@linkplain #removeListener(StoreListener, Class) explicitly removed}
+     * it will not be garbage collected unless {@linkplain #removeListener(Class, StoreListener) explicitly removed}
      * or unless this {@code Resource} is itself garbage collected. However if the given type of events can never
      * happen with this resource, then this method is not required to keep a reference to the given listener.</p>
      *
@@ -159,7 +159,7 @@ public interface Resource {
      * @param  listener   listener to notify about events.
      * @param  eventType  type of {@link StoreEvent} to listen (can not be {@code null}).
      */
-    <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType);
+    <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener);
 
     /**
      * Unregisters a listener previously added to this resource for the given type of events.
@@ -168,8 +168,8 @@ public interface Resource {
      * parent resources.
      *
      * <p>If the same listener has been registered many times for the same even type, then this method removes only
-     * the most recent registration. In other words if {@code addListener(ls, type)} has been invoked twice, then
-     * {@code removeListener(ls, type)} needs to be invoked twice in order to remove all instances of that listener.
+     * the most recent registration. In other words if {@code addListener(type, ls)} has been invoked twice, then
+     * {@code removeListener(type, ls)} needs to be invoked twice in order to remove all instances of that listener.
      * If the given listener is not found, then this method does nothing (no exception is thrown).</p>
      *
      * <div class="section">Warning events</div>
@@ -181,5 +181,5 @@ public interface Resource {
      * @param  listener   listener to stop notifying about events.
      * @param  eventType  type of {@link StoreEvent} which were listened (can not be {@code null}).
      */
-    <T extends StoreEvent> void removeListener(StoreListener<? super T> listener, Class<T> eventType);
+    <T extends StoreEvent> void removeListener(Class<T> eventType, StoreListener<? super T> listener);
 }
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListener.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListener.java
index 7d49d22..9be960b 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListener.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListener.java
@@ -28,7 +28,7 @@ import org.apache.sis.storage.Resource;
  *
  * <p>{@link Resource} implementations are responsible for instantiating the most specific
  * {@code StoreEvent} subclass for the type of events. Then, all {@code StoreListener}s that
- * {@linkplain Resource#addListener(StoreListener, Class) declared an interest} for
+ * {@linkplain Resource#addListener(Class, StoreListener) declared an interest} for
  * {@code StoreEvent}s of that kind are notified, including listeners in parent resources.
  * Each listener is notified only once per event even if the listener is registered twice.</p>
  *
@@ -38,7 +38,7 @@ import org.apache.sis.storage.Resource;
  * @param  <T>  the type of events of interest to this listener.
  *
  * @see StoreEvent
- * @see Resource#addListener(StoreListener, Class)
+ * @see Resource#addListener(Class, StoreListener)
  *
  * @since 1.0
  * @module
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java
index 01521cb..7d3492c 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java
@@ -537,13 +537,13 @@ public class StoreListeners extends org.apache.sis.util.logging.WarningListeners
      * warnings in its own way, for example by showing warnings in a widget.
      *
      * @param  <T>        compile-time value of the {@code eventType} argument.
-     * @param  listener   listener to notify about events.
      * @param  eventType  type of {@link StoreEvent} to listen (can not be {@code null}).
+     * @param  listener   listener to notify about events.
      *
-     * @see Resource#addListener(StoreListener, Class)
+     * @see Resource#addListener(Class, StoreListener)
      */
     @SuppressWarnings("unchecked")
-    public synchronized <T extends StoreEvent> void addListener(final StoreListener<? super T> listener, final Class<T> eventType) {
+    public synchronized <T extends StoreEvent> void addListener(final Class<T> eventType, final StoreListener<? super T> listener) {
         ArgumentChecks.ensureNonNull("listener",  listener);
         ArgumentChecks.ensureNonNull("eventType", eventType);
         ForType<T> ce = null;
@@ -567,8 +567,8 @@ public class StoreListeners extends org.apache.sis.util.logging.WarningListeners
      * parent manager.
      *
      * <p>If the same listener has been registered many times for the same even type, then this method removes only
-     * the most recent registration. In other words if {@code addListener(ls, type)} has been invoked twice, then
-     * {@code removeListener(ls, type)} needs to be invoked twice in order to remove all instances of that listener.
+     * the most recent registration. In other words if {@code addListener(type, ls)} has been invoked twice, then
+     * {@code removeListener(type, ls)} needs to be invoked twice in order to remove all instances of that listener.
      * If the given listener is not found, then this method does nothing (no exception is thrown).</p>
      *
      * <div class="section">Warning events</div>
@@ -577,13 +577,13 @@ public class StoreListeners extends org.apache.sis.util.logging.WarningListeners
      * to the loggers.
      *
      * @param  <T>        compile-time value of the {@code eventType} argument.
-     * @param  listener   listener to stop notifying about events.
      * @param  eventType  type of {@link StoreEvent} which were listened (can not be {@code null}).
+     * @param  listener   listener to stop notifying about events.
      *
-     * @see Resource#removeListener(StoreListener, Class)
+     * @see Resource#removeListener(Class, StoreListener)
      */
     @SuppressWarnings("unchecked")
-    public synchronized <T extends StoreEvent> void removeListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public synchronized <T extends StoreEvent> void removeListener(Class<T> eventType, StoreListener<? super T> listener) {
         ArgumentChecks.ensureNonNull("listener",  listener);
         ArgumentChecks.ensureNonNull("eventType", eventType);
         for (ForType<?> e = listeners; e != null; e = e.next) {
@@ -634,7 +634,7 @@ public class StoreListeners extends org.apache.sis.util.logging.WarningListeners
     @Override
     @Deprecated
     public void addWarningListener(final WarningListener listener) {
-        addListener(new Legacy(listener), WarningEvent.class);
+        addListener(WarningEvent.class, new Legacy(listener));
     }
 
     /**
@@ -649,7 +649,7 @@ public class StoreListeners extends org.apache.sis.util.logging.WarningListeners
                 if (list != null) {
                     for (final StoreListener<?> c : list) {
                         if (c instanceof Legacy && ((Legacy) c).delegate == listener) {
-                            removeListener((StoreListener<WarningEvent>) c, WarningEvent.class);
+                            removeListener(WarningEvent.class, (StoreListener<WarningEvent>) c);
                             break;
                         }
                     }
diff --git a/storage/sis-storage/src/test/java/org/apache/sis/storage/event/StoreListenersTest.java b/storage/sis-storage/src/test/java/org/apache/sis/storage/event/StoreListenersTest.java
index 9185879..7d1fc6d 100644
--- a/storage/sis-storage/src/test/java/org/apache/sis/storage/event/StoreListenersTest.java
+++ b/storage/sis-storage/src/test/java/org/apache/sis/storage/event/StoreListenersTest.java
@@ -66,18 +66,18 @@ public final strictfp class StoreListenersTest extends TestCase implements Store
     }
 
     /**
-     * Tests {@link StoreListeners#addListener(StoreListener, Class)} followed by
-     * {@link StoreListeners#removeListener(StoreListener, Class)}.
+     * Tests {@link StoreListeners#addListener(Class, StoreListener)} followed by
+     * {@link StoreListeners#removeListener(Class, StoreListener)}.
      */
     @Test
     public void testAddAndRemoveStoreListener() {
         final StoreListeners listeners = store.listeners();
         assertFalse("hasListeners()", listeners.hasListeners(WarningEvent.class));
-        listeners.addListener(this, WarningEvent.class);
+        listeners.addListener(WarningEvent.class, this);
         assertTrue("hasListeners()", listeners.hasListeners(WarningEvent.class));
-        listeners.removeListener(this, WarningEvent.class);
+        listeners.removeListener(WarningEvent.class, this);
         assertFalse("hasListeners()", listeners.hasListeners(WarningEvent.class));
-        listeners.removeListener(this, WarningEvent.class);         // Should be no-op.
+        listeners.removeListener(WarningEvent.class, this);         // Should be no-op.
     }
 
     /**
@@ -87,7 +87,7 @@ public final strictfp class StoreListenersTest extends TestCase implements Store
     @DependsOnMethod("testAddAndRemoveStoreListener")
     public void testWarning() {
         final LogRecord record = new LogRecord(Level.WARNING, "The message");
-        store.addListener(this, WarningEvent.class);
+        store.addListener(WarningEvent.class, this);
         store.listeners().warning(record);
         assertSame(record, warning);
     }
@@ -99,7 +99,7 @@ public final strictfp class StoreListenersTest extends TestCase implements Store
     @Test
     @DependsOnMethod("testWarning")
     public void testWarningWithAutoSource() {
-        store.addListener(this, WarningEvent.class);
+        store.addListener(WarningEvent.class, this);
         store.simulateWarning("The message");
         assertNotNull("Listener has not been notified.", warning);
         assertEquals(DataStoreMock.class.getName(), warning.getSourceClassName());


[sis] 03/03: Clarification about whether a DataStore.getFoo() method can return null. Contain one last-minute API change before 1.0 release: getOpenParameters() return Optional.

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

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

commit 04e45b87ecd8f8169d28e6197fc281e24577e6ff
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Sat Sep 14 14:14:49 2019 +0200

    Clarification about whether a DataStore.getFoo() method can return null.
    Contain one last-minute API change before 1.0 release: getOpenParameters() return Optional.
---
 .../sis/storage/earthobservation/LandsatStore.java | 27 +++++++++++++---------
 .../apache/sis/storage/geotiff/GeoTiffStore.java   | 12 +++++-----
 .../org/apache/sis/storage/netcdf/NetcdfStore.java |  6 ++---
 .../java/org/apache/sis/storage/sql/SQLStore.java  |  6 ++---
 .../apache/sis/internal/storage/URIDataStore.java  |  7 +++---
 .../apache/sis/internal/storage/folder/Store.java  |  4 ++--
 .../java/org/apache/sis/storage/DataStore.java     | 14 +++++++----
 .../org/apache/sis/storage/DataStoreProvider.java  |  2 +-
 .../java/org/apache/sis/storage/DataStoreMock.java |  7 +++---
 9 files changed, 48 insertions(+), 37 deletions(-)

diff --git a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java
index 02bcaf6..770b330 100644
--- a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java
+++ b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java
@@ -20,6 +20,7 @@ import java.io.Reader;
 import java.io.BufferedReader;
 import java.io.LineNumberReader;
 import java.io.IOException;
+import java.nio.file.StandardOpenOption;
 import java.net.URI;
 import java.util.Optional;
 import org.opengis.metadata.Metadata;
@@ -28,6 +29,7 @@ import org.opengis.util.FactoryException;
 import org.opengis.parameter.ParameterValueGroup;
 import org.apache.sis.storage.DataStore;
 import org.apache.sis.storage.DataStoreException;
+import org.apache.sis.storage.DataStoreClosedException;
 import org.apache.sis.storage.DataStoreReferencingException;
 import org.apache.sis.storage.UnsupportedStorageException;
 import org.apache.sis.storage.StorageConnector;
@@ -114,18 +116,18 @@ public class LandsatStore extends DataStore {
 
     /**
      * Returns the parameters used to open this Landsat data store.
-     * If non-null, the parameters are described by {@link LandsatStoreProvider#getOpenParameters()} and contains at
-     * least a parameter named {@value org.apache.sis.storage.DataStoreProvider#LOCATION} with a {@link URI} value.
-     * This method may return {@code null} if the storage input can not be described by a URI
+     * The parameters are described by {@link LandsatStoreProvider#getOpenParameters()} and contains at least
+     * a parameter named {@value org.apache.sis.storage.DataStoreProvider#LOCATION} with a {@link URI} value.
+     * The return value may be empty if the storage input can not be described by a URI
      * (for example a Landsat file reading directly from a {@link java.nio.channels.ReadableByteChannel}).
      *
-     * @return parameters used for opening this data store, or {@code null} if not available.
+     * @return parameters used for opening this data store.
      *
      * @since 0.8
      */
     @Override
-    public ParameterValueGroup getOpenParameters() {
-        return URIDataStore.parameters(provider, location);
+    public Optional<ParameterValueGroup> getOpenParameters() {
+        return Optional.ofNullable(URIDataStore.parameters(provider, location));
     }
 
     /**
@@ -156,17 +158,20 @@ public class LandsatStore extends DataStore {
      */
     @Override
     public synchronized Metadata getMetadata() throws DataStoreException {
-        if (metadata == null && source != null) try {
+        if (metadata == null) {
+            if (source == null) {
+                throw new DataStoreClosedException(getLocale(), LandsatStoreProvider.NAME, StandardOpenOption.READ);
+            }
             try (BufferedReader reader = (source instanceof BufferedReader) ? (BufferedReader) source : new LineNumberReader(source)) {
                 source = null;      // Will be closed at the end of this try-finally block.
                 final LandsatReader parser = new LandsatReader(getDisplayName(), listeners);
                 parser.read(reader);
                 metadata = parser.getMetadata();
+            } catch (IOException e) {
+                throw new DataStoreException(e);
+            } catch (FactoryException e) {
+                throw new DataStoreReferencingException(e);
             }
-        } catch (IOException e) {
-            throw new DataStoreException(e);
-        } catch (FactoryException e) {
-            throw new DataStoreReferencingException(e);
         }
         return metadata;
     }
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
index 3778951..a3707ea 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
@@ -154,16 +154,16 @@ public class GeoTiffStore extends DataStore implements Aggregate {
 
     /**
      * Returns the parameters used to open this GeoTIFF data store.
-     * If non-null, the parameters are described by {@link GeoTiffStoreProvider#getOpenParameters()} and contains at
-     * least a parameter named {@value org.apache.sis.storage.DataStoreProvider#LOCATION} with a {@link URI} value.
-     * This method may return {@code null} if the storage input can not be described by a URI
+     * The parameters are described by {@link GeoTiffStoreProvider#getOpenParameters()} and contains at least
+     * a parameter named {@value org.apache.sis.storage.DataStoreProvider#LOCATION} with a {@link URI} value.
+     * The return value may be empty if the storage input can not be described by a URI
      * (for example a GeoTIFF file reading directly from a {@link java.nio.channels.ReadableByteChannel}).
      *
-     * @return parameters used for opening this data store, or {@code null} if not available.
+     * @return parameters used for opening this data store.
      */
     @Override
-    public ParameterValueGroup getOpenParameters() {
-        return URIDataStore.parameters(provider, location);
+    public Optional<ParameterValueGroup> getOpenParameters() {
+        return Optional.ofNullable(URIDataStore.parameters(provider, location));
     }
 
     /**
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
index 6094911..afaf805 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
@@ -129,13 +129,13 @@ public class NetcdfStore extends DataStore implements Aggregate {
      * This method may return {@code null} if the storage input can not be described by a URI
      * (for example a netCDF file reading directly from a {@link java.nio.channels.ReadableByteChannel}).
      *
-     * @return parameters used for opening this data store, or {@code null} if not available.
+     * @return parameters used for opening this data store.
      *
      * @since 0.8
      */
     @Override
-    public ParameterValueGroup getOpenParameters() {
-        return URIDataStore.parameters(provider, location);
+    public Optional<ParameterValueGroup> getOpenParameters() {
+        return Optional.ofNullable(URIDataStore.parameters(provider, location));
     }
 
     /**
diff --git a/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java b/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java
index 4ecf249..67a7c0d 100644
--- a/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java
+++ b/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java
@@ -135,14 +135,14 @@ public class SQLStore extends DataStore implements Aggregate {
      * @return parameters used for opening this data store.
      */
     @Override
-    public ParameterValueGroup getOpenParameters() {
+    public Optional<ParameterValueGroup> getOpenParameters() {
         if (provider == null) {
-            return null;
+            return Optional.empty();
         }
         final ParameterValueGroup pg = provider.getOpenParameters().createValue();
         pg.parameter(SQLStoreProvider.LOCATION).setValue(source);
         pg.parameter(SQLStoreProvider.TABLES).setValue(tableNames);
-        return pg;
+        return Optional.of(pg);
     }
 
     /**
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
index 26525c3..069e503 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
@@ -17,6 +17,7 @@
 package org.apache.sis.internal.storage;
 
 import java.net.URI;
+import java.util.Optional;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.FileSystemNotFoundException;
@@ -103,11 +104,11 @@ public abstract class URIDataStore extends DataStore implements StoreResource, R
     /**
      * Returns the parameters used to open this data store.
      *
-     * @return parameters used for opening this {@code DataStore}, or {@code null} if not available.
+     * @return parameters used for opening this {@code DataStore}.
      */
     @Override
-    public ParameterValueGroup getOpenParameters() {
-        return parameters(provider, location);
+    public Optional<ParameterValueGroup> getOpenParameters() {
+        return Optional.ofNullable(parameters(provider, location));
     }
 
     /**
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java
index a147a4e..d331551 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java
@@ -210,7 +210,7 @@ class Store extends DataStore implements StoreResource, Aggregate, DirectoryStre
      * Returns the parameters used to open this data store.
      */
     @Override
-    public ParameterValueGroup getOpenParameters() {
+    public Optional<ParameterValueGroup> getOpenParameters() {
         final String format = StoreUtilities.getFormatName(componentProvider);
         final ParameterValueGroup pg = (provider != null ? provider.getOpenParameters() : FolderStoreProvider.PARAMETERS).createValue();
         pg.parameter(DataStoreProvider.LOCATION).setValue(location);
@@ -218,7 +218,7 @@ class Store extends DataStore implements StoreResource, Aggregate, DirectoryStre
         if (timezone != null) pg.parameter("timezone").setValue(timezone);
         if (encoding != null) pg.parameter("encoding").setValue(encoding);
         if (format   != null) pg.parameter("format"  ).setValue(format);
-        return pg;
+        return Optional.of(pg);
     }
 
     /**
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
index 3c258c6..9eb0c0f 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
@@ -121,7 +121,7 @@ public abstract class DataStore implements Resource, Localized, AutoCloseable {
 
     /**
      * Creates a new instance for the given storage (typically file or database).
-     * The {@code provider} argument is an optional information.
+     * The {@code provider} argument is an optional but recommended information.
      * The {@code connector} argument is mandatory.
      *
      * @param  provider   the factory that created this {@code DataStore} instance, or {@code null} if unspecified.
@@ -175,6 +175,10 @@ public abstract class DataStore implements Resource, Localized, AutoCloseable {
      * The provider gives additional information on this {@code DataStore} such as a format description
      * and a list of parameters that can be used for opening data stores of the same class.
      *
+     * <p>The return value should never be null if this {@code DataStore} has been created by
+     * {@link DataStores#open(Object)} or by a {@link DataStoreProvider} {@code open(…)} method.
+     * However it may be null if this object has been instantiated by a direct call to its constructor.</p>
+     *
      * @return the factory that created this {@code DataStore} instance, or {@code null} if unspecified.
      *
      * @see #provider
@@ -198,15 +202,15 @@ public abstract class DataStore implements Resource, Localized, AutoCloseable {
      *
      * <p>In some cases, for stores reading in-memory data or other inputs that can not fit with
      * {@code ParameterDescriptorGroup} requirements (for example an {@link java.io.InputStream}
-     * connected to unknown or no {@link java.net.URL}), this method may return null.</p>
+     * connected to unknown or no {@link java.net.URL}), this method may return an empty value.</p>
      *
-     * @return parameters used for opening this {@code DataStore}, or {@code null} if not available.
+     * @return parameters used for opening this {@code DataStore}.
      *
      * @see DataStoreProvider#getOpenParameters()
      *
      * @since 0.8
      */
-    public abstract ParameterValueGroup getOpenParameters();
+    public abstract Optional<ParameterValueGroup> getOpenParameters();
 
     /**
      * Sets the locale to use for formatting warnings and other messages.
@@ -351,7 +355,7 @@ public abstract class DataStore implements Resource, Localized, AutoCloseable {
      * contact information about the creator or distributor, data quality, update frequency, usage constraints,
      * file format and more.
      *
-     * @return information about resources in the data store, or {@code null} if none.
+     * @return information about resources in the data store. Should not be {@code null}.
      * @throws DataStoreException if an error occurred while reading the data.
      *
      * @see #getIdentifier()
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreProvider.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreProvider.java
index fd206c5..d8091d3 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreProvider.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreProvider.java
@@ -199,7 +199,7 @@ public abstract class DataStoreProvider {
      * <p>Implementers are responsible for declaring all parameters and whether they are mandatory or optional.
      * It is recommended to define at least a parameter named {@value #LOCATION}, completed by {@value #CREATE}
      * if the data store supports write operations.
-     * That parameter will be recognized by the default {@code DataStoreProvider} methods and used whenever a
+     * Those parameters will be recognized by the default {@code DataStoreProvider} methods and used whenever a
      * {@link StorageConnector} is required.</p>
      *
      * <div class="note"><b>Alternative:</b>
diff --git a/storage/sis-storage/src/test/java/org/apache/sis/storage/DataStoreMock.java b/storage/sis-storage/src/test/java/org/apache/sis/storage/DataStoreMock.java
index cbbce51..d14b8c5 100644
--- a/storage/sis-storage/src/test/java/org/apache/sis/storage/DataStoreMock.java
+++ b/storage/sis-storage/src/test/java/org/apache/sis/storage/DataStoreMock.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.storage;
 
+import java.util.Optional;
 import org.opengis.metadata.Metadata;
 import org.opengis.parameter.ParameterValueGroup;
 import org.apache.sis.storage.event.StoreListeners;
@@ -53,11 +54,11 @@ public final strictfp class DataStoreMock extends DataStore {
     }
 
     /**
-     * Returns {@code null} since there is no open parameters.
+     * Returns empty optional since there is no open parameters.
      */
     @Override
-    public ParameterValueGroup getOpenParameters() {
-        return null;
+    public Optional<ParameterValueGroup> getOpenParameters() {
+        return Optional.empty();
     }
 
     /**