You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2022/04/18 18:08:17 UTC
[sis] 02/03: Be more specific about the types of accepted inputs/outputs and about the formats for which we have an entry in the `SpatialMetadata` database.
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 ca02662a4e873bf6000ff8e05e69605ee857c846
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Sat Apr 16 14:26:16 2022 +0200
Be more specific about the types of accepted inputs/outputs and about the
formats for which we have an entry in the `SpatialMetadata` database.
---
.../sis/internal/storage/image/FormatFilter.java | 21 +++++++--------
.../apache/sis/internal/storage/image/Store.java | 30 ++++++++++++++--------
2 files changed, 31 insertions(+), 20 deletions(-)
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/FormatFilter.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/FormatFilter.java
index 610c34eed0..3645b98c6b 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/FormatFilter.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/FormatFilter.java
@@ -41,7 +41,6 @@ import javax.imageio.stream.ImageOutputStream;
import org.apache.sis.storage.StorageConnector;
import org.apache.sis.storage.DataStoreException;
import org.apache.sis.util.ArraysExt;
-import org.apache.sis.util.Classes;
/**
@@ -76,19 +75,21 @@ enum FormatFilter {
private final Function<ImageReaderWriterSpi, String[]> property;
/**
- * Valid types of inputs accepted by this class.
+ * Types of image inputs that are accepted by {@link StorageConnector}. An input type is accepted if
+ * it is equal to one of those types. We do not use {@link Class#isAssignableFrom(Class)} because if
+ * an image reader requests a sub-type, we can probably not provide it ourselves.
*/
private static final Class<?>[] VALID_INPUTS = {
- // ImageInputStream case included by DataInput.
- DataInput.class, InputStream.class, File.class, Path.class, URL.class, URI.class
+ ImageInputStream.class, DataInput.class, InputStream.class, File.class, Path.class, URL.class, URI.class
};
/**
- * Valid types of outputs accepted by this class.
+ * Types of image outputs that are accepted by {@link StorageConnector}. An output type is accepted
+ * if it is equal to one of those types. We do not use {@link Class#isAssignableFrom(Class)} because
+ * if an image reader requests a sub-type, we can probably not provide it ourselves.
*/
private static final Class<?>[] VALID_OUTPUTS = {
- // ImageOutputStream case included by DataOutput.
- DataOutput.class, OutputStream.class, File.class, Path.class, URL.class, URI.class
+ ImageOutputStream.class, DataOutput.class, OutputStream.class, File.class, Path.class, URL.class, URI.class
};
/**
@@ -138,7 +139,7 @@ enum FormatFilter {
final ImageReaderSpi provider = it.next();
if (done.add(provider)) {
for (final Class<?> type : provider.getInputTypes()) {
- if (Classes.isAssignableToAny(type, VALID_INPUTS)) {
+ if (ArraysExt.contains(VALID_INPUTS, type)) {
final Object input = connector.getStorageAs(type);
if (input != null) {
/*
@@ -179,7 +180,7 @@ enum FormatFilter {
final ImageReaderSpi provider = it.next();
if (deferred.putIfAbsent(provider, Boolean.FALSE) == null) {
for (final Class<?> type : provider.getInputTypes()) {
- if (Classes.isAssignableToAny(type, VALID_INPUTS)) {
+ if (ArraysExt.contains(VALID_INPUTS, type)) {
final Object input = connector.getStorageAs(type);
if (input != null) {
if (provider.canDecodeInput(input)) {
@@ -222,7 +223,7 @@ enum FormatFilter {
if (deferred.putIfAbsent(provider, Boolean.FALSE) == null) {
if (provider.canEncodeImage(image)) {
for (final Class<?> type : provider.getOutputTypes()) {
- if (Classes.isAssignableToAny(type, VALID_OUTPUTS)) {
+ if (ArraysExt.contains(VALID_OUTPUTS, type)) {
final Object output = connector.getStorageAs(type);
if (output != null) {
connector.closeAllExcept(output);
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/Store.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/Store.java
index 1a5510b1fc..a19b90927b 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/Store.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/Store.java
@@ -37,9 +37,9 @@ import org.opengis.metadata.maintenance.ScopeCode;
import org.opengis.referencing.datum.PixelInCell;
import org.apache.sis.coverage.grid.GridExtent;
import org.apache.sis.coverage.grid.GridGeometry;
-import org.apache.sis.storage.Resource;
import org.apache.sis.storage.Aggregate;
import org.apache.sis.storage.StorageConnector;
+import org.apache.sis.storage.GridCoverageResource;
import org.apache.sis.storage.DataStoreException;
import org.apache.sis.storage.DataStoreClosedException;
import org.apache.sis.storage.DataStoreContentException;
@@ -68,6 +68,13 @@ import org.apache.sis.setup.OptionKey;
* @module
*/
final class Store extends PRJDataStore implements Aggregate {
+ /**
+ * Image I/O format names (ignoring case) for which we have an entry in the {@code SpatialMetadata} database.
+ */
+ private static final String[] KNOWN_FORMATS = {
+ "PNG"
+ };
+
/**
* Index of the main image. This is relevant only with formats capable to store an arbitrary amount of images.
* Current implementation assumes that the main image is always the first one, but it may become configurable
@@ -343,15 +350,18 @@ loop: for (int convention=0;; convention++) {
if (metadata == null) try {
final MetadataBuilder builder = new MetadataBuilder();
String format = reader().getFormatName();
- if (format.equalsIgnoreCase("tif")) {
- format = "TIFF";
- }
- try {
- builder.setPredefinedFormat(format);
- } catch (MetadataStoreException e) {
- builder.addFormatName(format);
- listeners.warning(Level.FINE, null, e);
+ for (final String key : KNOWN_FORMATS) {
+ if (key.equalsIgnoreCase(format)) {
+ try {
+ builder.setPredefinedFormat(key);
+ format = null;
+ } catch (MetadataStoreException e) {
+ listeners.warning(Level.FINE, null, e);
+ }
+ break;
+ }
}
+ builder.addFormatName(format); // Does nothing if `format` is null.
builder.addResourceScope(ScopeCode.COVERAGE, null);
builder.addSpatialRepresentation(null, getGridGeometry(MAIN_IMAGE), true);
addTitleOrIdentifier(builder);
@@ -368,7 +378,7 @@ loop: for (int convention=0;; convention++) {
*/
@Override
@SuppressWarnings("ReturnOfCollectionOrArrayField")
- public final synchronized Collection<? extends Resource> components() throws DataStoreException {
+ public final synchronized Collection<? extends GridCoverageResource> components() throws DataStoreException {
if (components == null) try {
components = new Components();
} catch (IOException e) {