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/19 17:22:31 UTC
[sis] 02/02: API adjustment in preparation for the addition of "World file" writer.
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 b28d142efb1c927fbd9eb42988570a7403e33870
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Tue Apr 19 19:19:12 2022 +0200
API adjustment in preparation for the addition of "World file" writer.
---
.../org/apache/sis/internal/storage/PRJDataStore.java | 17 ++++++++++-------
.../org/apache/sis/internal/storage/URIDataStore.java | 2 +-
.../sis/internal/storage/WritableResourceSupport.java | 19 +++++++++++++++----
.../sis/internal/storage/ascii/WritableStore.java | 4 ++--
.../sis/internal/storage/image/FormatFilter.java | 5 +++--
5 files changed, 31 insertions(+), 16 deletions(-)
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/PRJDataStore.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/PRJDataStore.java
index d0175e3e3d..f373297557 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/PRJDataStore.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/PRJDataStore.java
@@ -81,7 +81,7 @@ public abstract class PRJDataStore extends URIDataStore {
*
* @see #getComponentFiles()
*/
- private static final String PRJ = "prj";
+ protected static final String PRJ = "prj";
/**
* Character encoding in {@code *.prj} or other auxiliary files,
@@ -366,7 +366,7 @@ public abstract class PRJDataStore extends URIDataStore {
* The default implementation does the same computation as the super-class, then adds the sibling
* file with {@code ".prj"} extension if it exists.
*
- * @return the URI as a path, or an empty array if the URI is null.
+ * @return the main file and auxiliary files as paths, or an empty array if unknown.
* @throws DataStoreException if the URI can not be converted to a {@link Path}.
*/
@Override
@@ -382,6 +382,7 @@ public abstract class PRJDataStore extends URIDataStore {
* This is a helper method for {@link #getComponentFiles()} implementation.
*
* @param auxiliaries filename extension (without leading dot) of all auxiliary files.
+ * Null elements are silently ignored.
* @return the URI as a path, followed by all auxiliary files that exist.
* @throws DataStoreException if the URI can not be converted to a {@link Path}.
*/
@@ -392,12 +393,14 @@ public abstract class PRJDataStore extends URIDataStore {
final Path path = paths[0];
final String base = getBaseFilename(path);
for (final String extension : auxiliaries) {
- final Path p = path.resolveSibling(base.concat(extension));
- if (Files.isRegularFile(p)) {
- if (count >= paths.length) {
- paths = Arrays.copyOf(paths, count + auxiliaries.length);
+ if (extension != null) {
+ final Path p = path.resolveSibling(base.concat(extension));
+ if (Files.isRegularFile(p)) {
+ if (count >= paths.length) {
+ paths = Arrays.copyOf(paths, count + auxiliaries.length);
+ }
+ paths[count++] = p;
}
- paths[count++] = p;
}
}
paths = ArraysExt.resize(paths, count);
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
index 1242721b7c..32b1b139cc 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
@@ -149,7 +149,7 @@ public abstract class URIDataStore extends DataStore implements StoreResource, R
* The default implementation returns the storage specified at construction time if it was
* a {@link Path} or {@link File}, or converts the URI to a {@link Path} otherwise.
*
- * @return the URI as a path, or an empty array if the URI is null.
+ * @return the URI as a path, or an empty array if unknown.
* @throws DataStoreException if the URI can not be converted to a {@link Path}.
*/
@Override
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/WritableResourceSupport.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/WritableResourceSupport.java
index 2fd5c99537..326a0ea3ee 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/WritableResourceSupport.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/WritableResourceSupport.java
@@ -133,7 +133,7 @@ public final class WritableResourceSupport implements Localized {
* or thrown a {@link ResourceAlreadyExistsException} otherwise.</li>
* </ul>
*
- * @param input the channel to test for emptiness.
+ * @param input the channel to test for emptiness, or {@code null} if unknown.
* @return whether the caller should replace ({@code true}) or update ({@code false}) the resource.
* @throws IOException if an error occurred while checking the channel length.
* @throws ResourceAlreadyExistsException if the resource exists and the writer
@@ -142,17 +142,28 @@ public final class WritableResourceSupport implements Localized {
*/
public final boolean replace(final ChannelDataInput input) throws IOException, DataStoreException {
if (update) {
- return input.length() == 0;
- } else if (replace || input.length() == 0) {
+ return isEmpty(input);
+ } else if (replace || isEmpty(input)) {
return true;
} else {
Object identifier = resource.getIdentifier().orElse(null);
- if (identifier == null) identifier = input.filename;
+ if (identifier == null && input != null) identifier = input.filename;
throw new ResourceAlreadyExistsException(Resources.forLocale(getLocale())
.getString(Resources.Keys.ResourceAlreadyExists_1, identifier));
}
}
+ /**
+ * Returns {@code true} if the given channel is empty.
+ * In case of doubt, this method conservatively returns {@code false}.
+ *
+ * @param input the channel to test for emptiness, or {@code null} if unknown.
+ * @return {@code true} if the channel is empty, or {@code false} if not or if unknown.
+ */
+ private static boolean isEmpty(final ChannelDataInput input) throws IOException {
+ return (input != null) && input.length() == 0;
+ }
+
/**
* Reads the current coverage in the resource and updates its content with cell values from the given coverage.
* This method can be used as a simple implementation of {@link WritableGridCoverageResource.CommonOption#UPDATE}.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ascii/WritableStore.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ascii/WritableStore.java
index 4246b2ac5b..e2085e7241 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ascii/WritableStore.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ascii/WritableStore.java
@@ -196,8 +196,8 @@ final class WritableStore extends Store implements WritableGridCoverageResource
final int band = 0; // May become configurable in a future version.
try {
/*
- * If `output` is null, we are in write-only mode and there is no previously existing image.
- * Otherwise an image may exist and the behavior will depends on which options were supplied.
+ * If `output` is non-null, we are in write-only mode and there is no previously existing image.
+ * Otherwise an image may exist and the behavior will depend on which options were supplied.
*/
if (output == null && !h.replace(input().input)) {
coverage = h.update(coverage);
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 3645b98c6b..8b66e05ce0 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
@@ -123,6 +123,7 @@ enum FormatFilter {
/**
* Finds a provider for the given input, or returns {@code null} if none.
+ * This is used by {@link StoreProvider#probeContent(StorageConnector)}.
*
* @param identifier the property value to use as a filtering criterion, or {@code null} if none.
* @param connector provider of the input to be given to the {@code canDecodeInput(…)} method.
@@ -208,7 +209,7 @@ enum FormatFilter {
*
* @param identifier the property value to use as a filtering criterion, or {@code null} if none.
* @param output the output to be given to the new reader instance.
- * @param image the image to write.
+ * @param image the image to write, or {@code null} if unknown.
* @param deferred initially empty map to be populated with providers tested by this method.
* @return the new image writer instance with its output initialized, or {@code null} if none was found.
* @throws DataStoreException if an error occurred while opening a stream from the storage connector.
@@ -221,7 +222,7 @@ enum FormatFilter {
while (it.hasNext()) {
final ImageWriterSpi provider = it.next();
if (deferred.putIfAbsent(provider, Boolean.FALSE) == null) {
- if (provider.canEncodeImage(image)) {
+ if (image == null || provider.canEncodeImage(image)) {
for (final Class<?> type : provider.getOutputTypes()) {
if (ArraysExt.contains(VALID_OUTPUTS, type)) {
final Object output = connector.getStorageAs(type);