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 3f4e03d1e04eb7505fe7dacee336fa0ea44d0363 Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Wed Jan 18 17:46:57 2023 +0100 Writable `SingleImageStore` needs to extent `WritableStore` for being effective. --- .../internal/storage/image/SingleImageStore.java | 37 ++----------- .../sis/internal/storage/image/WorldFileStore.java | 1 + .../storage/image/WorldFileStoreProvider.java | 4 +- ...ageStore.java => WritableSingleImageStore.java} | 61 +++++++++------------- .../sis/internal/storage/image/package-info.java | 2 +- 5 files changed, 35 insertions(+), 70 deletions(-) diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/SingleImageStore.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/SingleImageStore.java index fbcc9a9061..117448ce0d 100644 --- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/SingleImageStore.java +++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/SingleImageStore.java @@ -27,7 +27,6 @@ import org.apache.sis.storage.DataStoreException; import org.apache.sis.storage.GridCoverageResource; import org.apache.sis.storage.RasterLoadingStrategy; import org.apache.sis.storage.UnsupportedQueryException; -import org.apache.sis.storage.WritableGridCoverageResource; import org.apache.sis.storage.Query; @@ -36,11 +35,13 @@ import org.apache.sis.storage.Query; * This class is used for image formats that are restricted to one image per file. * Examples: PNG and BMP image formats. * + * <p>See {@link WritableSingleImageStore} for the writable variant of this class.</p> + * * @author Martin Desruisseaux (Geomatys) - * @version 1.2 + * @version 1.4 * @since 1.2 */ -class SingleImageStore extends WorldFileStore implements GridCoverageResource { +final class SingleImageStore extends WorldFileStore implements GridCoverageResource { /** * The singleton resource in this aggregate. Fetched when first needed. */ @@ -54,7 +55,7 @@ class SingleImageStore extends WorldFileStore implements GridCoverageResource { * @throws IOException if an error occurred while creating the image reader instance. */ SingleImageStore(final FormatFinder format) throws DataStoreException, IOException { - super(format, false); + super(format, true); } /** @@ -159,32 +160,4 @@ class SingleImageStore extends WorldFileStore implements GridCoverageResource { public final boolean setLoadingStrategy(RasterLoadingStrategy strategy) throws DataStoreException { return delegate().setLoadingStrategy(strategy); } - - /** - * The writable variant of {@link MultiImageStore}. - */ - static final class Writable extends SingleImageStore implements WritableGridCoverageResource { - /** - * Creates a new store from the given file, URL or stream. - * - * @param format information about the storage (URL, stream, <i>etc</i>) and the reader/writer to use. - * @throws DataStoreException if an error occurred while opening the stream. - * @throws IOException if an error occurred while creating the image reader instance. - */ - Writable(final FormatFinder format) throws DataStoreException, IOException { - super(format); - } - - /** - * Writes a new coverage in the data store for this resource. If a coverage already exists for this resource, - * then it will be overwritten only if the {@code TRUNCATE} or {@code UPDATE} option is specified. - * - * @param coverage new data to write in the data store for this resource. - * @param options configuration of the write operation. - */ - @Override - public void write(GridCoverage coverage, Option... options) throws DataStoreException { - ((WritableResource) delegate()).write(coverage, options); - } - } } diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileStore.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileStore.java index 54dbb4cd87..3915013420 100644 --- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileStore.java +++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileStore.java @@ -556,6 +556,7 @@ loop: for (int convention=0;; convention++) { * Returns all images in this store. Note that fetching the size of the list is a potentially costly operation. * * @return list of images in this store. + * @throws DataStoreException if an error occurred while fetching components. */ @SuppressWarnings("ReturnOfCollectionOrArrayField") public synchronized Collection<? extends GridCoverageResource> components() throws DataStoreException { diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileStoreProvider.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileStoreProvider.java index 99b1c9430d..3118c5e109 100644 --- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileStoreProvider.java +++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileStoreProvider.java @@ -129,8 +129,8 @@ public final class WorldFileStoreProvider extends PRJDataStore.Provider { } } if (format.isWritable) { - store = isSingleton ? new SingleImageStore.Writable(format) - : new MultiImageStore.Writable(format); + store = isSingleton ? new WritableSingleImageStore(format) + : new MultiImageStore.Writable(format); } else { store = isSingleton ? new SingleImageStore(format) : new MultiImageStore(format); diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/SingleImageStore.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WritableSingleImageStore.java similarity index 75% copy from storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/SingleImageStore.java copy to storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WritableSingleImageStore.java index fbcc9a9061..28cc1fe185 100644 --- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/SingleImageStore.java +++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WritableSingleImageStore.java @@ -23,6 +23,7 @@ import org.opengis.geometry.Envelope; import org.apache.sis.coverage.SampleDimension; import org.apache.sis.coverage.grid.GridCoverage; import org.apache.sis.coverage.grid.GridGeometry; +import org.apache.sis.internal.storage.MemoryGridResource; import org.apache.sis.storage.DataStoreException; import org.apache.sis.storage.GridCoverageResource; import org.apache.sis.storage.RasterLoadingStrategy; @@ -32,19 +33,17 @@ import org.apache.sis.storage.Query; /** - * A world file store which is expected to contain exactly one image. - * This class is used for image formats that are restricted to one image per file. - * Examples: PNG and BMP image formats. + * The writable variant of {@link SingleImageStore}. * * @author Martin Desruisseaux (Geomatys) - * @version 1.2 - * @since 1.2 + * @version 1.4 + * @since 1.4 */ -class SingleImageStore extends WorldFileStore implements GridCoverageResource { +final class WritableSingleImageStore extends WritableStore implements WritableGridCoverageResource { /** * The singleton resource in this aggregate. Fetched when first needed. */ - private volatile WorldFileResource delegate; + private volatile WritableResource delegate; /** * Creates a new store from the given file, URL or stream. @@ -53,8 +52,8 @@ class SingleImageStore extends WorldFileStore implements GridCoverageResource { * @throws DataStoreException if an error occurred while opening the stream. * @throws IOException if an error occurred while creating the image reader instance. */ - SingleImageStore(final FormatFinder format) throws DataStoreException, IOException { - super(format, false); + WritableSingleImageStore(final FormatFinder format) throws DataStoreException, IOException { + super(format); } /** @@ -74,10 +73,10 @@ class SingleImageStore extends WorldFileStore implements GridCoverageResource { * <li>{@link #getMetadata()} because it is richer than {@link WorldFileResource#getMetadata()}.</li> * </ul> */ - final WorldFileResource delegate() throws DataStoreException { - WorldFileResource r = delegate; + final WritableResource delegate() throws DataStoreException { + WritableResource r = delegate; if (r == null) { - delegate = r = ((Components) components()).get(MAIN_IMAGE); + delegate = r = (WritableResource) ((Components) components()).get(MAIN_IMAGE); } return r; } @@ -161,30 +160,22 @@ class SingleImageStore extends WorldFileStore implements GridCoverageResource { } /** - * The writable variant of {@link MultiImageStore}. + * Writes a new coverage in the data store for this resource. If a coverage already exists for this resource, + * then it will be overwritten only if the {@code TRUNCATE} or {@code UPDATE} option is specified. + * + * @param coverage new data to write in the data store for this resource. + * @param options configuration of the write operation. */ - static final class Writable extends SingleImageStore implements WritableGridCoverageResource { - /** - * Creates a new store from the given file, URL or stream. - * - * @param format information about the storage (URL, stream, <i>etc</i>) and the reader/writer to use. - * @throws DataStoreException if an error occurred while opening the stream. - * @throws IOException if an error occurred while creating the image reader instance. - */ - Writable(final FormatFinder format) throws DataStoreException, IOException { - super(format); - } - - /** - * Writes a new coverage in the data store for this resource. If a coverage already exists for this resource, - * then it will be overwritten only if the {@code TRUNCATE} or {@code UPDATE} option is specified. - * - * @param coverage new data to write in the data store for this resource. - * @param options configuration of the write operation. - */ - @Override - public void write(GridCoverage coverage, Option... options) throws DataStoreException { - ((WritableResource) delegate()).write(coverage, options); + @Override + public void write(final GridCoverage coverage, final Option... options) throws DataStoreException { + try { + if (isMultiImages() == 0) { + add(new MemoryGridResource(listeners, coverage)); + } else { + delegate().write(coverage, options); + } + } catch (IOException e) { + throw new DataStoreException(e); } } } diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/package-info.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/package-info.java index 1be3dc8e23..2a34b3bc34 100644 --- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/package-info.java +++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/package-info.java @@ -40,7 +40,7 @@ * then move in a public package with {@code imageio} package name.</p> * * @author Martin Desruisseaux (Geomatys) - * @version 1.3 + * @version 1.4 * * @see <a href="https://en.wikipedia.org/wiki/World_file">World File format description on Wikipedia</a> *