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 c721af1a4387936794cbb8db296f4c23b34bfaf3
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Sat Mar 26 16:07:18 2022 +0100

    Do not freeze `DefaultMetadata` too early for giving a chance to subclasses 
to modify.
---
 .../org/apache/sis/storage/landsat/BandGroup.java  |  2 +-
 .../apache/sis/storage/landsat/MetadataReader.java |  2 +-
 .../apache/sis/storage/geotiff/GeoTiffStore.java   |  2 +-
 .../sis/storage/geotiff/ImageFileDirectory.java    |  3 +--
 .../sis/storage/geotiff/XMLMetadataTest.java       |  4 +--
 .../apache/sis/internal/netcdf/RasterResource.java |  2 +-
 .../apache/sis/storage/netcdf/MetadataReader.java  |  2 +-
 .../java/org/apache/sis/storage/sql/SQLStore.java  |  2 +-
 .../sis/internal/storage/AbstractFeatureSet.java   |  3 ++-
 .../sis/internal/storage/AbstractGridResource.java |  3 ++-
 .../sis/internal/storage/AbstractResource.java     |  6 ++++-
 .../sis/internal/storage/AggregatedFeatureSet.java |  2 +-
 .../sis/internal/storage/MetadataBuilder.java      | 31 +++++++++++++---------
 .../org/apache/sis/internal/storage/csv/Store.java |  2 +-
 .../apache/sis/internal/storage/folder/Store.java  |  2 +-
 .../org/apache/sis/internal/storage/wkt/Store.java |  2 +-
 .../org/apache/sis/internal/storage/xml/Store.java |  2 +-
 .../sis/internal/storage/MetadataBuilderTest.java  |  4 +--
 .../org/apache/sis/internal/storage/gpx/Types.java |  2 +-
 19 files changed, 44 insertions(+), 34 deletions(-)

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 1ec0a31..4f357a0 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
@@ -115,7 +115,7 @@ final class BandGroup extends AbstractResource implements 
Aggregate {
         final MetadataBuilder metadata = new MetadataBuilder();
         metadata.addTitle(group.title);             // Must be before 
`addDefaultMetadata(…)`.
         metadata.addDefaultMetadata(this, listeners);
-        return metadata.build(true);
+        return metadata.build();
     }
 
     /**
diff --git 
a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/landsat/MetadataReader.java
 
b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/landsat/MetadataReader.java
index ce215e7..4b0f2be 100644
--- 
a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/landsat/MetadataReader.java
+++ 
b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/landsat/MetadataReader.java
@@ -913,7 +913,7 @@ final class MetadataReader extends MetadataBuilder {
          * bands are splitted in 3 different AttributeGroups based on their 
grid size.
          */
         setISOStandards(true);
-        final DefaultMetadata result = build(false);
+        final DefaultMetadata result = build();
         /*
          * Set information about all non-null bands. The bands are categorized 
in three groups:
          * PANCHROMATIC, REFLECTIVE and THERMAL.
diff --git 
a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
 
b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
index e71c44f..d404dff 100644
--- 
a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
+++ 
b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
@@ -327,7 +327,7 @@ public class GeoTiffStore extends DataStore implements 
Aggregate {
              */
             getIdentifier().ifPresent((id) -> 
builder.addTitleOrIdentifier(id.toString(), MetadataBuilder.Scope.ALL));
             builder.setISOStandards(true);
-            final DefaultMetadata md = builder.build(false);
+            final DefaultMetadata md = builder.build();
             metadata = customizer.customize(-1, md);
             if (metadata == null) metadata = md;
             md.transitionTo(DefaultMetadata.State.FINAL);
diff --git 
a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java
 
b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java
index 9ad8b50..f9dfbcd 100644
--- 
a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java
+++ 
b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java
@@ -1349,10 +1349,9 @@ final class ImageFileDirectory extends DataCube {
          * End of metadata construction from TIFF tags.
          */
         metadata.finish(this, listeners);
-        final DefaultMetadata md = metadata.build(false);
+        final DefaultMetadata md = metadata.build();
         if (isIndexValid) {
             final Metadata c = reader.store.customizer.customize(index, md);
-            md.transitionTo(DefaultMetadata.State.FINAL);
             if (c != null) return c;
         }
         return md;
diff --git 
a/storage/sis-geotiff/src/test/java/org/apache/sis/storage/geotiff/XMLMetadataTest.java
 
b/storage/sis-geotiff/src/test/java/org/apache/sis/storage/geotiff/XMLMetadataTest.java
index 0ebe0ca..ab2b262 100644
--- 
a/storage/sis-geotiff/src/test/java/org/apache/sis/storage/geotiff/XMLMetadataTest.java
+++ 
b/storage/sis-geotiff/src/test/java/org/apache/sis/storage/geotiff/XMLMetadataTest.java
@@ -126,7 +126,7 @@ public final strictfp class XMLMetadataTest extends 
TestCase {
         XMLMetadata xml = new XMLMetadata(GDAL_METADATA, true);
         MetadataBuilder builder = new MetadataBuilder();
         assertNull(xml.appendTo(builder));
-        DefaultMetadata metadata = builder.build(false);
+        DefaultMetadata metadata = builder.build();
         assertMultilinesEquals(
                 "Metadata\n" +
                 "  └─Identification info\n" +
@@ -147,7 +147,7 @@ public final strictfp class XMLMetadataTest extends 
TestCase {
         XMLMetadata xml = new XMLMetadata(GEO_METADATA, false);
         MetadataBuilder builder = new MetadataBuilder();
         assertNull(xml.appendTo(builder));
-        DefaultMetadata metadata = builder.build(false);
+        DefaultMetadata metadata = builder.build();
         assertMultilinesEquals(
                 "Metadata\n" +
                 "  └─Identification info\n" +
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 9ba27aa..2638644 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
@@ -403,7 +403,7 @@ public final class RasterResource extends 
AbstractGridResource implements Resour
             
metadata.addTitle(CharSequences.camelCaseToSentence(title).toString());
         }
         metadata.addDefaultMetadata(this, listeners);
-        return metadata.build(true);
+        return metadata.build();
     }
 
     /**
diff --git 
a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
 
b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
index 85b081f..4d9ebe0 100644
--- 
a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
+++ 
b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
@@ -1078,7 +1078,7 @@ split:  while ((start = 
CharSequences.skipLeadingWhitespaces(value, start, lengt
             addSource(stringValue(SOURCE), null, null);
         }
         decoder.setSearchPath(searchPath);
-        final DefaultMetadata metadata = build(false);
+        final DefaultMetadata metadata = build();
         addCompleteMetadata(createURI(stringValue(METADATA_LINK)));
         metadata.transitionTo(DefaultMetadata.State.FINAL);
         return metadata;
diff --git 
a/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java 
b/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java
index 0b5bdf1..0656678 100644
--- 
a/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java
+++ 
b/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java
@@ -279,7 +279,7 @@ public class SQLStore extends DataStore implements 
Aggregate {
                     throw new DataStoreException(Exceptions.unwrap(e));
                 }
             }
-            metadata = builder.build(true);
+            metadata = builder.buildAndFreeze();
         }
         return metadata;
     }
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractFeatureSet.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractFeatureSet.java
index 49ae01f..8c1d3d8 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractFeatureSet.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractFeatureSet.java
@@ -95,6 +95,7 @@ public abstract class AbstractFeatureSet extends 
AbstractResource implements Fea
      * {@link #getType()         getType()} and
      * {@link #getFeatureCount() getFeatureCount()}.
      * Subclasses should override if they can provide more information.
+     * The default value can be completed by casting to {@link 
org.apache.sis.metadata.iso.DefaultMetadata}.
      *
      * @return the newly created metadata, or {@code null} if unknown.
      * @throws DataStoreException if an error occurred while reading metadata 
from this resource.
@@ -103,6 +104,6 @@ public abstract class AbstractFeatureSet extends 
AbstractResource implements Fea
     protected Metadata createMetadata() throws DataStoreException {
         final MetadataBuilder builder = new MetadataBuilder();
         builder.addDefaultMetadata(this, listeners);
-        return builder.build(true);
+        return builder.build();
     }
 }
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractGridResource.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractGridResource.java
index 9f8aa04..162902b 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractGridResource.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractGridResource.java
@@ -105,6 +105,7 @@ public abstract class AbstractGridResource extends 
AbstractResource implements G
      * {@link #getGridGeometry()     getGridGeometry()} and
      * {@link #getSampleDimensions() getSampleDimensions()}.
      * Subclasses should override if they can provide more information.
+     * The default value can be completed by casting to {@link 
org.apache.sis.metadata.iso.DefaultMetadata}.
      *
      * @return the newly created metadata, or {@code null} if unknown.
      * @throws DataStoreException if an error occurred while reading metadata 
from this resource.
@@ -113,7 +114,7 @@ public abstract class AbstractGridResource extends 
AbstractResource implements G
     protected Metadata createMetadata() throws DataStoreException {
         final MetadataBuilder builder = new MetadataBuilder();
         builder.addDefaultMetadata(this, listeners);
-        return builder.build(true);
+        return builder.build();
     }
 
     /**
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java
index 007322b..f40704e 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java
@@ -23,6 +23,7 @@ import org.opengis.metadata.Metadata;
 import org.opengis.geometry.Envelope;
 import org.opengis.referencing.operation.TransformException;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.apache.sis.metadata.iso.DefaultMetadata;
 import org.apache.sis.referencing.IdentifiedObjects;
 import org.apache.sis.geometry.Envelopes;
 import org.apache.sis.referencing.CRS;
@@ -126,6 +127,8 @@ public abstract class AbstractResource implements Resource {
                     md = createMetadata();
                     if (md == null) {
                         md = NilReason.UNKNOWN.createNilObject(Metadata.class);
+                    } else if (md instanceof DefaultMetadata) {
+                        ((DefaultMetadata) 
md).transitionTo(DefaultMetadata.State.FINAL);
                     }
                     metadata = md;
                 }
@@ -139,6 +142,7 @@ public abstract class AbstractResource implements Resource {
      * The default implementation populates metadata based on information
      * provided by {@link #getIdentifier()} and {@link #getEnvelope()}.
      * Subclasses should override if they can provide more information.
+     * The default value can be completed by casting to {@link 
DefaultMetadata}.
      *
      * @return the newly created metadata, or {@code null} if unknown.
      * @throws DataStoreException if an error occurred while reading metadata 
from this resource.
@@ -146,7 +150,7 @@ public abstract class AbstractResource implements Resource {
     protected Metadata createMetadata() throws DataStoreException {
         final MetadataBuilder builder = new MetadataBuilder();
         builder.addDefaultMetadata(this, listeners);
-        return builder.build(true);
+        return builder.build();
     }
 
     /**
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 184f715..b0f33f4 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
@@ -150,7 +150,7 @@ abstract class AggregatedFeatureSet extends 
AbstractFeatureSet {
             metadata.addSource(fs.getMetadata(), ScopeCode.FEATURE_TYPE,
                     (type == null) ? null : new CharSequence[] 
{type.getName().toInternationalString()});
         }
-        return metadata.build(true);
+        return metadata.build();
     }
 
     /**
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java
index 99a9885..9ed5d7d 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java
@@ -180,7 +180,7 @@ public class MetadataBuilder {
      * Creates the metadata object if it does not already exists, then returns 
it.
      *
      * @return the metadata (never {@code null}).
-     * @see #build(boolean)
+     * @see #build()
      */
     private DefaultMetadata metadata() {
         if (metadata == null) {
@@ -3298,7 +3298,7 @@ parse:      for (int i = 0; i < length;) {
      * The given source should be an instance of {@link Metadata},
      * but some types of metadata components are accepted as well.
      *
-     * <p>This method should be invoked last, just before the call to {@link 
#build(boolean)}.
+     * <p>This method should be invoked last, just before the call to {@link 
#build()}.
      * Any identification information, responsible party, extent, coverage 
description, <i>etc.</i>
      * added after this method call will be stored in new metadata object (not 
merged).</p>
      *
@@ -3357,14 +3357,11 @@ parse:      for (int i = 0; i < length;) {
     }
 
     /**
-     * Returns the metadata, optionally as an unmodifiable object.
-     * If {@code freeze} is {@code true}, then the returned metadata instance 
can not be modified.
+     * Returns the metadata as a modifiable object.
      *
-     * @param  freeze  {@code true} if this method should set the returned 
metadata to
-     *                 {@link DefaultMetadata.State#FINAL}, or {@code false} 
for leaving the metadata editable.
-     * @return the metadata, never {@code null}.
+     * @return the metadata (never {@code null}).
      */
-    public final DefaultMetadata build(final boolean freeze) {
+    public final DefaultMetadata build() {
         flush();
         final DefaultMetadata md = metadata();
         if (standardISO != 0) {
@@ -3374,9 +3371,17 @@ parse:      for (int i = 0; i < length;) {
             }
             md.setMetadataStandards(c);
         }
-        if (freeze) {
-            md.transitionTo(DefaultMetadata.State.FINAL);
-        }
+        return md;
+    }
+
+    /**
+     * Returns the metadata as an unmodifiable object.
+     *
+     * @return the metadata (never {@code null}).
+     */
+    public final DefaultMetadata buildAndFreeze() {
+        final DefaultMetadata md = build();
+        md.transitionTo(DefaultMetadata.State.FINAL);
         return md;
     }
 
@@ -3395,7 +3400,7 @@ parse:      for (int i = 0; i < length;) {
     /**
      * Returns a shared instance of the given value.
      * This is a helper method for callers who want to set themselves some 
additional
-     * metadata values on the instance returned by {@link #build(boolean)}.
+     * metadata values on the instance returned by {@link #build()}.
      *
      * @param   value  a double value.
      * @return  the given value, but as an existing instance if possible.
@@ -3409,7 +3414,7 @@ parse:      for (int i = 0; i < length;) {
     /**
      * Returns a shared instance of the given value.
      * This is a helper method for callers who want to set themselves some 
additional
-     * metadata values on the instance returned by {@link #build(boolean)}.
+     * metadata values on the instance returned by {@link #build()}.
      *
      * @param   value  an integer value.
      * @return  the same value, but as an existing instance if possible.
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
index 7bb6765..0398172 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
@@ -655,7 +655,7 @@ final class Store extends URIDataStore implements 
FeatureSet {
             builder.addFeatureType(featureType, -1);
             addTitleOrIdentifier(builder);
             builder.setISOStandards(false);
-            metadata = builder.build(true);
+            metadata = builder.buildAndFreeze();
         }
         return metadata;
     }
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 2042aac..d7b5ae5 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
@@ -279,7 +279,7 @@ class Store extends DataStore implements StoreResource, 
Aggregate, DirectoryStre
                 name = super.getDisplayName();              // User-specified 
folder (root of this resource).
             }
             mb.addTitleOrIdentifier(name, MetadataBuilder.Scope.RESOURCE);
-            metadata = mb.build(true);
+            metadata = mb.buildAndFreeze();
         }
         return metadata;
     }
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/wkt/Store.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/wkt/Store.java
index 1c346dc..d6d21ad 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/wkt/Store.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/wkt/Store.java
@@ -167,7 +167,7 @@ final class Store extends URIDataStore {
             } else {
                 addTitleOrIdentifier(builder);
             }
-            metadata = builder.build(true);
+            metadata = builder.buildAndFreeze();
         }
         return metadata;
     }
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java
index 659a52f..d4ec9e1 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java
@@ -211,7 +211,7 @@ final class Store extends URIDataStore implements Filter {
                 final MetadataBuilder builder = new MetadataBuilder();
                 builder.addReferenceSystem((ReferenceSystem) object);
                 builder.addTitle(getDisplayName());
-                metadata = builder.build(true);
+                metadata = builder.buildAndFreeze();
             }
         }
         return metadata;
diff --git 
a/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/MetadataBuilderTest.java
 
b/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/MetadataBuilderTest.java
index deacdb4..24dfdf5 100644
--- 
a/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/MetadataBuilderTest.java
+++ 
b/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/MetadataBuilderTest.java
@@ -84,7 +84,7 @@ public final strictfp class MetadataBuilderTest extends 
TestCase {
         final MetadataBuilder builder = new MetadataBuilder();
         builder.parseLegalNotice(notice);
         final LegalConstraints constraints = (LegalConstraints) 
getSingleton(getSingleton(
-                
builder.build(false).getIdentificationInfo()).getResourceConstraints());
+                
builder.build().getIdentificationInfo()).getResourceConstraints());
 
         assertEquals("useConstraints", Restriction.COPYRIGHT, 
getSingleton(constraints.getUseConstraints()));
         final Citation ref = getSingleton(constraints.getReferences());
@@ -144,7 +144,7 @@ public final strictfp class MetadataBuilderTest extends 
TestCase {
         final GenericName name = builder.addFeatureType(dataType, 
valueToInsert);
         assertNotNull(name);
 
-        final DefaultMetadata metadata = builder.build(true);
+        final DefaultMetadata metadata = builder.build();
         if (valueToInsert == 0) {
             assertTrue(metadata.getContentInfo().isEmpty());
         } else {
diff --git 
a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java
 
b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java
index 242f82a..29461d5 100644
--- 
a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java
+++ 
b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java
@@ -293,7 +293,7 @@ final class Types {
         fc.define(route);
         fc.define(track);
         fc.define(wayPoint);
-        metadata = fc.build(true).getContentInfo();
+        metadata = fc.buildAndFreeze().getContentInfo();
         names = fc.features;
     }
 

Reply via email to