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;

Reply via email to