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 9948d7887bf8aa38e1945d662f40f4b1f825f9b8 Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Sat Sep 10 18:15:29 2022 +0200 Keep a reference to the folder data store that produced the aggregation view. This references can be obtained by `StoreUtilities.getSources(aggregation)`. --- .../aggregate/ConcatenatedGridResource.java | 23 +++++++++++++++++++++ .../storage/aggregate/CoverageAggregator.java | 24 +++++++++++++++++++++- .../internal/storage/aggregate/GroupAggregate.java | 10 +++++++++ .../apache/sis/internal/storage/folder/Store.java | 1 + 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/aggregate/ConcatenatedGridResource.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/aggregate/ConcatenatedGridResource.java index 6d7ffd8fc0..2cda0e6a5d 100644 --- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/aggregate/ConcatenatedGridResource.java +++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/aggregate/ConcatenatedGridResource.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Arrays; import java.util.Optional; import org.opengis.geometry.Envelope; +import org.opengis.metadata.Metadata; import org.opengis.referencing.operation.TransformException; import org.apache.sis.coverage.SampleDimension; import org.apache.sis.coverage.grid.GridCoverage; @@ -28,12 +29,14 @@ import org.apache.sis.coverage.grid.GridExtent; import org.apache.sis.coverage.grid.GridGeometry; import org.apache.sis.coverage.grid.GridRoundingMode; import org.apache.sis.geometry.ImmutableEnvelope; +import org.apache.sis.storage.Resource; import org.apache.sis.storage.AbstractGridCoverageResource; import org.apache.sis.storage.DataStoreException; import org.apache.sis.storage.GridCoverageResource; import org.apache.sis.storage.RasterLoadingStrategy; import org.apache.sis.storage.event.StoreListeners; import org.apache.sis.internal.storage.MemoryGridResource; +import org.apache.sis.internal.storage.MetadataBuilder; import org.apache.sis.internal.util.UnmodifiableArrayList; import org.apache.sis.internal.util.CollectionsExt; import org.apache.sis.util.ArraysExt; @@ -97,6 +100,12 @@ final class ConcatenatedGridResource extends AbstractGridCoverageResource { */ private double[][] resolutions; + /** + * An optional resource to declare as the source of this aggregate in lineage metadata. + * This is reset to {@code null} when no longer needed. + */ + Resource sourceMetadata; + /** * Creates a new aggregated resource. * @@ -118,6 +127,20 @@ final class ConcatenatedGridResource extends AbstractGridCoverageResource { this.locator = locator; } + /** + * Creates when first requested the metadata about this resource. + */ + @Override + protected Metadata createMetadata() throws DataStoreException { + final MetadataBuilder builder = new MetadataBuilder(); + builder.addDefaultMetadata(this, listeners); + if (sourceMetadata != null) { + builder.addSources(sourceMetadata); + sourceMetadata = null; + } + return builder.build(); + } + /** * Returns the grid geometry of this aggregated resource. */ diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/aggregate/CoverageAggregator.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/aggregate/CoverageAggregator.java index 194a16f751..43007263c4 100644 --- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/aggregate/CoverageAggregator.java +++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/aggregate/CoverageAggregator.java @@ -58,6 +58,11 @@ public final class CoverageAggregator extends Group<GroupBySample> { */ private final Map<Set<Resource>, Queue<Aggregate>> aggregates; + /** + * An optional resource to declare as the source of this aggregate in lineage metadata. + */ + private Resource sourceMetadata; + /** * Creates an initially empty aggregator. * @@ -182,6 +187,17 @@ public final class CoverageAggregator extends Group<GroupBySample> { return Optional.empty(); } + /** + * Sets the resource to declare as the source in lineage metadata. + * Note that it will cause the aggregation returned by {@link #build()} + * to hold a strong reference to the resource specified to this method. + * + * @param source the resource to declare as the source in lineage metadata. + */ + public void setSourceMetadata(final Resource source) { + sourceMetadata = source; + } + /** * Builds a resource which is the aggregation or concatenation of all components added to this aggregator. * The returned resource will be an instance of {@link GridCoverageResource} if possible, @@ -196,6 +212,12 @@ public final class CoverageAggregator extends Group<GroupBySample> { public Resource build() { final GroupAggregate aggregate = prepareAggregate(listeners); aggregate.fillWithChildAggregates(this, GroupBySample::createComponents); - return aggregate.simplify(this); + final Resource result = aggregate.simplify(this); + if (result instanceof GroupAggregate) { + ((GroupAggregate) result).sourceMetadata = sourceMetadata; + } else if (result instanceof ConcatenatedGridResource) { + ((ConcatenatedGridResource) result).sourceMetadata = sourceMetadata; + } + return result; } } diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/aggregate/GroupAggregate.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/aggregate/GroupAggregate.java index 5da7504221..7a5069f56b 100644 --- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/aggregate/GroupAggregate.java +++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/aggregate/GroupAggregate.java @@ -97,6 +97,12 @@ final class GroupAggregate extends AbstractResource implements Aggregate { */ List<SampleDimension> sampleDimensions; + /** + * An optional resource to declare as the source of this aggregate in lineage metadata. + * This is reset to {@code null} when no longer needed. + */ + Resource sourceMetadata; + /** * Creates a new aggregate with the specified number of components. * One of the {@code fill(…)} methods must be invoked after this constructor. @@ -236,6 +242,10 @@ final class GroupAggregate extends AbstractResource implements Aggregate { builder.addNewBand(band); } } + if (sourceMetadata != null) { + builder.addSources(sourceMetadata); + sourceMetadata = null; + } return builder.build(); } } 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 364a1e4dda..540bd1b6bf 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 @@ -417,6 +417,7 @@ class Store extends DataStore implements StoreResource, UnstructuredAggregate, D if (structuredView == null) { final CoverageAggregator aggregator = new CoverageAggregator(listeners); aggregator.addComponents(this); + aggregator.setSourceMetadata(this); structuredView = aggregator.build(); } return structuredView;