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 6b8b00c6a2e8dc23149191e0ff429b5ce2077aa1
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Wed May 4 13:06:59 2022 +0200

    Add a boolean argument to `AbstractResource` for making possible to use the 
parent listeners directly.
    The use case for direct use is when the resource is only a proxy for a 
"real" resource.
---
 .../MultiResolutionCoverageLoaderTest.java         |  2 +-
 .../org/apache/sis/storage/landsat/BandGroup.java  |  2 +-
 .../sis/storage/landsat/MetadataReaderTest.java    |  2 +-
 .../sis/internal/netcdf/DiscreteSampling.java      |  2 +-
 .../apache/sis/internal/netcdf/RasterResource.java |  2 +-
 .../org/apache/sis/internal/netcdf/TestCase.java   |  2 +-
 .../org/apache/sis/internal/sql/feature/Table.java |  4 ++--
 .../sis/internal/storage/AggregatedFeatureSet.java |  2 +-
 .../sis/internal/storage/MemoryFeatureSet.java     |  2 +-
 .../sis/internal/storage/MemoryGridResource.java   |  2 +-
 .../sis/internal/storage/TiledGridResource.java    |  2 +-
 .../internal/storage/image/WorldFileResource.java  |  2 +-
 .../org/apache/sis/storage/AbstractFeatureSet.java | 20 +++++++++++++-----
 .../sis/storage/AbstractGridCoverageResource.java  | 20 +++++++++++++-----
 .../org/apache/sis/storage/AbstractResource.java   | 24 +++++++++++++++++-----
 .../org/apache/sis/storage/CoverageSubset.java     |  2 +-
 .../java/org/apache/sis/storage/FeatureSubset.java |  2 +-
 .../apache/sis/storage/event/StoreListeners.java   |  2 +-
 .../sis/internal/storage/RangeArgumentTest.java    |  2 +-
 .../org/apache/sis/storage/GridResourceMock.java   |  2 +-
 20 files changed, 67 insertions(+), 33 deletions(-)

diff --git 
a/core/sis-portrayal/src/test/java/org/apache/sis/internal/map/coverage/MultiResolutionCoverageLoaderTest.java
 
b/core/sis-portrayal/src/test/java/org/apache/sis/internal/map/coverage/MultiResolutionCoverageLoaderTest.java
index e12505c98a..1368203d67 100644
--- 
a/core/sis-portrayal/src/test/java/org/apache/sis/internal/map/coverage/MultiResolutionCoverageLoaderTest.java
+++ 
b/core/sis-portrayal/src/test/java/org/apache/sis/internal/map/coverage/MultiResolutionCoverageLoaderTest.java
@@ -105,7 +105,7 @@ public final strictfp class 
MultiResolutionCoverageLoaderTest extends TestCase {
     private static final class DummyResource extends 
AbstractGridCoverageResource {
         /** Creates a dummy resource. */
         DummyResource() {
-            super(null);
+            super(null, false);
         }
 
         /** Returns the preferred resolutions in units of CRS axes. */
diff --git 
a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/landsat/BandGroup.java
 
b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/landsat/BandGroup.java
index 9b28c581c6..6cb675acdc 100644
--- 
a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/landsat/BandGroup.java
+++ 
b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/landsat/BandGroup.java
@@ -70,7 +70,7 @@ final class BandGroup extends AbstractResource implements 
Aggregate {
     private BandGroup(final StoreListeners parent, final BandGroupName group,
                       final Band[] resources, final int count)
     {
-        super(parent);
+        super(parent, false);
         this.group = group;
         int n = 0;
         Band[] components = new Band[resources.length];
diff --git 
a/storage/sis-earth-observation/src/test/java/org/apache/sis/storage/landsat/MetadataReaderTest.java
 
b/storage/sis-earth-observation/src/test/java/org/apache/sis/storage/landsat/MetadataReaderTest.java
index a02db92183..fda6250105 100644
--- 
a/storage/sis-earth-observation/src/test/java/org/apache/sis/storage/landsat/MetadataReaderTest.java
+++ 
b/storage/sis-earth-observation/src/test/java/org/apache/sis/storage/landsat/MetadataReaderTest.java
@@ -269,7 +269,7 @@ public class MetadataReaderTest extends TestCase {
         final class DummyResource extends AbstractResource {
             /** Creates a dummy resource without parent. */
             DummyResource() {
-                super(null);
+                super(null, false);
             }
 
             /** Makes listeners accessible to this package. */
diff --git 
a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/DiscreteSampling.java
 
b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/DiscreteSampling.java
index 1ede6de9fb..2da2f47c92 100644
--- 
a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/DiscreteSampling.java
+++ 
b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/DiscreteSampling.java
@@ -58,7 +58,7 @@ public abstract class DiscreteSampling extends 
AbstractFeatureSet {
      * @throws IllegalArgumentException if the given library is non-null but 
not available.
      */
     protected DiscreteSampling(final GeometryLibrary library, final 
StoreListeners listeners, final Object lock) {
-        super(listeners);
+        super(listeners, false);
         factory = Geometries.implementation(library);
         this.lock = lock;
     }
diff --git 
a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/RasterResource.java
 
b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/RasterResource.java
index 87eba30b96..25ca8e6a05 100644
--- 
a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/RasterResource.java
+++ 
b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/RasterResource.java
@@ -188,7 +188,7 @@ public final class RasterResource extends 
AbstractGridCoverageResource implement
     private RasterResource(final Decoder decoder, final String name, final 
GridGeometry grid, final List<Variable> bands,
             final int numBands, final int bandDim, final Object lock)
     {
-        super(decoder.listeners);
+        super(decoder.listeners, false);
         this.lock     = lock;
         gridGeometry  = grid;
         bandDimension = bandDim;
diff --git 
a/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/TestCase.java 
b/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/TestCase.java
index 5cbab55a27..bd2adecb2c 100644
--- 
a/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/TestCase.java
+++ 
b/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/TestCase.java
@@ -124,7 +124,7 @@ public abstract strictfp class TestCase extends 
org.apache.sis.test.TestCase {
         final class DummyResource extends AbstractResource {
             /** Creates a dummy resource without parent. */
             DummyResource() {
-                super(null);
+                super(null, false);
             }
 
             /** Makes listeners accessible to this package. */
diff --git 
a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/Table.java
 
b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/Table.java
index 05b889d543..6e5b40c17e 100644
--- 
a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/Table.java
+++ 
b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/Table.java
@@ -173,7 +173,7 @@ final class Table extends AbstractFeatureSet {
      *                   the table identified by {@link #name}.
      */
     Table(final Database<?> database, final FeatureAnalyzer analyzer, final 
String query) throws Exception {
-        super(database.listeners);
+        super(database.listeners, false);
         this.database = database;
         this.query    = query;
         name          = analyzer.id;
@@ -194,7 +194,7 @@ final class Table extends AbstractFeatureSet {
      *       A starting point is {@link 
org.apache.sis.storage.FeatureQuery#expectedType(FeatureType)}.
      */
     Table(final Table parent) {
-        super(parent.listeners);
+        super(parent.listeners, false);
         database = parent.database;
         query    = parent.query;
         name     = parent.name;
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AggregatedFeatureSet.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AggregatedFeatureSet.java
index f71a6dc628..44870f51d6 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AggregatedFeatureSet.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AggregatedFeatureSet.java
@@ -69,7 +69,7 @@ abstract class AggregatedFeatureSet extends 
AbstractFeatureSet {
      *         that created this resource.
      */
     protected AggregatedFeatureSet(final StoreListeners parent) {
-        super(parent);
+        super(parent, false);
     }
 
     /**
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MemoryFeatureSet.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MemoryFeatureSet.java
index 46d842eb46..7249bbbb6c 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MemoryFeatureSet.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MemoryFeatureSet.java
@@ -60,7 +60,7 @@ public class MemoryFeatureSet extends AbstractFeatureSet {
      * @param features   collection of stored features. This collection will 
not be copied.
      */
     public MemoryFeatureSet(final StoreListeners parent, final FeatureType 
type, final Collection<Feature> features) {
-        super(parent);
+        super(parent, false);
         ArgumentChecks.ensureNonNull("type",     type);
         ArgumentChecks.ensureNonNull("features", features);
         this.type     = type;
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MemoryGridResource.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MemoryGridResource.java
index 9e352e3c26..bc28cec023 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MemoryGridResource.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MemoryGridResource.java
@@ -57,7 +57,7 @@ public class MemoryGridResource extends 
AbstractGridCoverageResource {
      * @param  coverage  stored coverage retained as-is (not copied). Can not 
be null.
      */
     public MemoryGridResource(final StoreListeners parent, final GridCoverage 
coverage) {
-        super(parent);
+        super(parent, false);
         ArgumentChecks.ensureNonNull("coverage", coverage);
         this.coverage = coverage;
     }
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridResource.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridResource.java
index 200f531923..09dc84c23a 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridResource.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridResource.java
@@ -125,7 +125,7 @@ public abstract class TiledGridResource extends 
AbstractGridCoverageResource {
      *         that created this resource.
      */
     protected TiledGridResource(final StoreListeners parent) {
-        super(parent);
+        super(parent, false);
         rasters = new WeakValueHashMap<>(CacheKey.class);
     }
 
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileResource.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileResource.java
index 467cce78cc..05da7f95f6 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileResource.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileResource.java
@@ -117,7 +117,7 @@ class WorldFileResource extends 
AbstractGridCoverageResource implements StoreRes
     WorldFileResource(final WorldFileStore store, final StoreListeners parent,
                       final int imageIndex, final GridGeometry gridGeometry)
     {
-        super(parent);
+        super(parent, false);
         this.store        = store;
         this.imageIndex   = imageIndex;
         this.gridGeometry = gridGeometry;
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/AbstractFeatureSet.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/AbstractFeatureSet.java
index e8c094b156..be5fd48eb3 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/AbstractFeatureSet.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/AbstractFeatureSet.java
@@ -51,14 +51,24 @@ import org.opengis.feature.FeatureType;
  */
 public abstract class AbstractFeatureSet extends AbstractResource implements 
FeatureSet {
     /**
-     * Creates a new resource. This resource will have its own set of 
listeners,
-     * but the listeners of the data store that created this resource will be 
notified as well.
+     * Creates a new resource which can send notifications to the given set of 
listeners.
+     * If {@code hidden} is {@code false} (the recommended value), then this 
resource will have its own set of
+     * listeners with this resource declared as the {@linkplain 
StoreListeners#getSource() source of events}.
+     * It will be possible to add and remove listeners independently from the 
set of parent listeners.
+     * Conversely if {@code hidden} is {@code true}, then the given listeners 
will be used directly
+     * and this resource will not appear as the source of any event.
      *
-     * @param  parent  listeners of the parent resource or data store, or 
{@code null} if none.
+     * <p>In any cases, the listeners of all parents (ultimately the data 
store that created this resource)
+     * will always be notified, either directly if {@code hidden} is {@code 
true}
+     * or indirectly if {@code hidden} is {@code false}.</p>
+     *
+     * @param  parentListeners  listeners of the parent resource, or {@code 
null} if none.
      *         This is usually the listeners of the {@link DataStore} that 
created this resource.
+     * @param  hidden  {@code false} if this resource shall use its own {@link 
StoreListeners}
+     *         with the specified parent, or {@code true} for using {@code 
parentListeners} directly.
      */
-    protected AbstractFeatureSet(final StoreListeners parent) {
-        super(parent);
+    protected AbstractFeatureSet(final StoreListeners parentListeners, final 
boolean hidden) {
+        super(parentListeners, hidden);
     }
 
     /**
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/AbstractGridCoverageResource.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/AbstractGridCoverageResource.java
index 09650502fb..f188e9fd4f 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/AbstractGridCoverageResource.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/AbstractGridCoverageResource.java
@@ -67,14 +67,24 @@ import org.apache.sis.internal.storage.Resources;
  */
 public abstract class AbstractGridCoverageResource extends AbstractResource 
implements GridCoverageResource {
     /**
-     * Creates a new resource. This resource will have its own set of 
listeners,
-     * but the listeners of the data store that created this resource will be 
notified as well.
+     * Creates a new resource which can send notifications to the given set of 
listeners.
+     * If {@code hidden} is {@code false} (the recommended value), then this 
resource will have its own set of
+     * listeners with this resource declared as the {@linkplain 
StoreListeners#getSource() source of events}.
+     * It will be possible to add and remove listeners independently from the 
set of parent listeners.
+     * Conversely if {@code hidden} is {@code true}, then the given listeners 
will be used directly
+     * and this resource will not appear as the source of any event.
      *
-     * @param  parent  listeners of the parent resource or data store, or 
{@code null} if none.
+     * <p>In any cases, the listeners of all parents (ultimately the data 
store that created this resource)
+     * will always be notified, either directly if {@code hidden} is {@code 
true}
+     * or indirectly if {@code hidden} is {@code false}.</p>
+     *
+     * @param  parentListeners  listeners of the parent resource, or {@code 
null} if none.
      *         This is usually the listeners of the {@link DataStore} that 
created this resource.
+     * @param  hidden  {@code false} if this resource shall use its own {@link 
StoreListeners}
+     *         with the specified parent, or {@code true} for using {@code 
parentListeners} directly.
      */
-    protected AbstractGridCoverageResource(final StoreListeners parent) {
-        super(parent);
+    protected AbstractGridCoverageResource(final StoreListeners 
parentListeners, final boolean hidden) {
+        super(parentListeners, hidden);
     }
 
     /**
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/AbstractResource.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/AbstractResource.java
index 4cf0f90984..38c2f29891 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/AbstractResource.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/AbstractResource.java
@@ -75,14 +75,28 @@ public abstract class AbstractResource implements Resource {
     private volatile Metadata metadata;
 
     /**
-     * Creates a new resource. This resource will have its own set of 
listeners,
-     * but the listeners of the data store that created this resource will be 
notified as well.
+     * Creates a new resource which can send notifications to the given set of 
listeners.
+     * If {@code hidden} is {@code false} (the recommended value), then this 
resource will have its own set of
+     * listeners with this resource declared as the {@linkplain 
StoreListeners#getSource() source of events}.
+     * It will be possible to add and remove listeners independently from the 
set of parent listeners.
+     * Conversely if {@code hidden} is {@code true}, then the given listeners 
will be used directly
+     * and this resource will not appear as the source of any event.
      *
-     * @param  parent  listeners of the parent resource or data store, or 
{@code null} if none.
+     * <p>In any cases, the listeners of all parents (ultimately the data 
store that created this resource)
+     * will always be notified, either directly if {@code hidden} is {@code 
true}
+     * or indirectly if {@code hidden} is {@code false}.</p>
+     *
+     * @param  parentListeners  listeners of the parent resource, or {@code 
null} if none.
      *         This is usually the listeners of the {@link DataStore} that 
created this resource.
+     * @param  hidden  {@code false} if this resource shall use its own {@link 
StoreListeners}
+     *         with the specified parent, or {@code true} for using {@code 
parentListeners} directly.
      */
-    protected AbstractResource(final StoreListeners parent) {
-        listeners = new StoreListeners(parent, this);
+    protected AbstractResource(final StoreListeners parentListeners, final 
boolean hidden) {
+        if (hidden && parentListeners != null) {
+            listeners = parentListeners;
+        } else {
+            listeners = new StoreListeners(parentListeners, this);
+        }
     }
 
     /**
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/CoverageSubset.java 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/CoverageSubset.java
index 6e8e290de6..a5a6c7bd00 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/CoverageSubset.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/CoverageSubset.java
@@ -61,7 +61,7 @@ final class CoverageSubset extends 
AbstractGridCoverageResource {
      * @param query   the domain and range to read from the {@code source} 
coverage.
      */
     CoverageSubset(final GridCoverageResource source, final CoverageQuery 
query) {
-        super(source instanceof StoreListeners ? (StoreListeners) source : 
null);
+        super(source instanceof StoreListeners ? (StoreListeners) source : 
null, false);
         this.source = source;
         this.query  = query;
     }
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureSubset.java 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureSubset.java
index ea99c4433c..8823cfa2cb 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureSubset.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureSubset.java
@@ -64,7 +64,7 @@ final class FeatureSubset extends AbstractFeatureSet {
      * This given query is stored as-is (it is not cloned neither optimized).
      */
     FeatureSubset(final FeatureSet source, final FeatureQuery query) {
-        super(source instanceof StoreListeners ? (StoreListeners) source : 
null);
+        super(source instanceof StoreListeners ? (StoreListeners) source : 
null, false);
         this.source = source;
         this.query = query;
     }
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 cf338bb321..8e4e4ac2d9 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
@@ -93,7 +93,7 @@ public class StoreListeners implements Localized {
     /**
      * The declared source of events. This is not necessarily the real source,
      * but this is the source that the implementer wants to declare as public 
API.
-     * Never {@code null} but may be {@code this}.
+     * Shall not be {@code null}.
      */
     private final Resource source;
 
diff --git 
a/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/RangeArgumentTest.java
 
b/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/RangeArgumentTest.java
index 9a5ea5540e..b1a89ec116 100644
--- 
a/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/RangeArgumentTest.java
+++ 
b/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/RangeArgumentTest.java
@@ -42,7 +42,7 @@ public final strictfp class RangeArgumentTest extends 
TestCase implements Locali
     /**
      * A resource performing no operation.
      */
-    private final AbstractGridCoverageResource resource = new 
AbstractGridCoverageResource(null) {
+    private final AbstractGridCoverageResource resource = new 
AbstractGridCoverageResource(null, false) {
         @Override public GridGeometry          getGridGeometry()     {throw 
new UnsupportedOperationException();}
         @Override public List<SampleDimension> getSampleDimensions() {throw 
new UnsupportedOperationException();}
         @Override public GridCoverage read(GridGeometry d, int... r) {throw 
new UnsupportedOperationException();}
diff --git 
a/storage/sis-storage/src/test/java/org/apache/sis/storage/GridResourceMock.java
 
b/storage/sis-storage/src/test/java/org/apache/sis/storage/GridResourceMock.java
index 004c33b832..08cc9f6573 100644
--- 
a/storage/sis-storage/src/test/java/org/apache/sis/storage/GridResourceMock.java
+++ 
b/storage/sis-storage/src/test/java/org/apache/sis/storage/GridResourceMock.java
@@ -55,7 +55,7 @@ final strictfp class GridResourceMock extends 
AbstractGridCoverageResource {
      * Creates a resource mock with the given grid geometry.
      */
     GridResourceMock(final GridGeometry gridGeometry) {
-        super(null);
+        super(null, false);
         assertNotNull(gridGeometry);
         this.gridGeometry     = gridGeometry;
         this.sampleDimensions = Collections.singletonList(new 
SampleDimension.Builder().setName(0).build());

Reply via email to