You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2022/05/04 17:00:49 UTC
[sis] 02/03: 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.
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 <ma...@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());