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());