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; }
