This is an automated email from the ASF dual-hosted git repository.

amanin pushed a commit to branch refactor/strict_storage_connector
in repository https://gitbox.apache.org/repos/asf/sis.git

commit c0ad17e06f05116653cc90fd6de21f8c82b3b7f9
Author: Alexis Manin <[email protected]>
AuthorDate: Wed Mar 24 15:38:00 2021 +0100

    refactor(Storage): start removing deprecated StorageConnector method usages.
---
 .../sis/storage/earthobservation/LandsatStore.java |  9 +----
 .../apache/sis/storage/geotiff/GeoTiffStore.java   |  9 +----
 .../org/apache/sis/storage/netcdf/NetcdfStore.java |  7 ++--
 .../org/apache/sis/internal/storage/csv/Store.java |  7 +---
 .../org/apache/sis/internal/storage/wkt/Store.java |  7 +---
 .../org/apache/sis/internal/storage/xml/Store.java | 18 +++------
 .../org/apache/sis/storage/StorageConnector.java   | 44 ++++++++++++++++------
 .../org/apache/sis/storage/UnsafeConnector.java    |  4 ++
 .../sis/storage/UnsupportedStorageException.java   |  6 ++-
 9 files changed, 55 insertions(+), 56 deletions(-)

diff --git 
a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java
 
b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java
index 770b330..df2806c 100644
--- 
a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java
+++ 
b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java
@@ -105,13 +105,8 @@ public class LandsatStore extends DataStore {
      */
     public LandsatStore(final LandsatStoreProvider provider, final 
StorageConnector connector) throws DataStoreException {
         super(provider, connector);
-        location = connector.getStorageAs(URI.class);
-        source = connector.getStorageAs(Reader.class);
-        connector.closeAllExcept(source);
-        if (source == null) {
-            throw new UnsupportedStorageException(super.getLocale(), 
LandsatStoreProvider.NAME,
-                    connector.getStorage(), 
connector.getOption(OptionKey.OPEN_OPTIONS));
-        }
+        location = connector.getURI().orElse(null);
+        source = connector.commit(Reader.class, LandsatStoreProvider.NAME, 
super.getLocale());
     }
 
     /**
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 d8175b6..a792b3c 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
@@ -122,13 +122,8 @@ public class GeoTiffStore extends DataStore implements 
Aggregate {
         super(provider, connector);
         final Charset encoding = connector.getOption(OptionKey.ENCODING);
         this.encoding = (encoding != null) ? encoding : 
StandardCharsets.US_ASCII;
-        final ChannelDataInput input = 
connector.getStorageAs(ChannelDataInput.class);
-        if (input == null) {
-            throw new UnsupportedStorageException(super.getLocale(), 
Constants.GEOTIFF,
-                    connector.getStorage(), 
connector.getOption(OptionKey.OPEN_OPTIONS));
-        }
-        location = connector.getStorageAs(URI.class);
-        connector.closeAllExcept(input);
+        final ChannelDataInput input = 
connector.commit(ChannelDataInput.class, Constants.GEOTIFF, super.getLocale());
+        location = connector.getURI().orElse(null);
         try {
             reader = new Reader(this, input);
         } catch (IOException e) {
diff --git 
a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
 
b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
index 3f6f801..5d681bf 100644
--- 
a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
+++ 
b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
@@ -103,16 +103,15 @@ public class NetcdfStore extends DataStore implements 
Aggregate {
      */
     public NetcdfStore(final NetcdfStoreProvider provider, final 
StorageConnector connector) throws DataStoreException {
         super(provider, connector);
-        location = connector.getStorageAs(URI.class);
-        final Path path = connector.getStorageAs(Path.class);
+        location = connector.getURI().orElse(null);
+        final Path path = connector.getPath().orElse(null);
         try {
             decoder = NetcdfStoreProvider.decoder(listeners, connector);
         } catch (IOException | ArithmeticException e) {
             throw new DataStoreException(e);
         }
         if (decoder == null) {
-            throw new UnsupportedStorageException(super.getLocale(), 
NetcdfStoreProvider.NAME,
-                    connector.getStorage(), 
connector.getOption(OptionKey.OPEN_OPTIONS));
+            throw connector.unsupported(super.getLocale(), 
NetcdfStoreProvider.NAME);
         }
         decoder.location = path;
         String id = Strings.trimOrNull(decoder.stringValue(ACDD.id));
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 9829e26..4a819c2 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
@@ -235,12 +235,7 @@ final class Store extends URIDataStore implements 
FeatureSet {
      */
     public Store(final StoreProvider provider, final StorageConnector 
connector) throws DataStoreException {
         super(provider, connector);
-        final Reader r = connector.getStorageAs(Reader.class);
-        connector.closeAllExcept(r);
-        if (r == null) {
-            throw new UnsupportedStorageException(super.getLocale(), 
StoreProvider.NAME,
-                    connector.getStorage(), 
connector.getOption(OptionKey.OPEN_OPTIONS));
-        }
+        final Reader r = connector.commit(Reader.class);
         source     = (r instanceof BufferedReader) ? (BufferedReader) r : new 
LineNumberReader(r);
         geometries = 
Geometries.implementation(connector.getOption(OptionKey.GEOMETRY_LIBRARY));
         dissociate = 
FoliationRepresentation.FRAGMENTED.equals(connector.getOption(DataOptionKey.FOLIATION_REPRESENTATION));
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 00c9308..6d324ba 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
@@ -85,12 +85,7 @@ final class Store extends URIDataStore {
     public Store(final StoreProvider provider, final StorageConnector 
connector) throws DataStoreException {
         super(provider, connector);
         objects = new ArrayList<>();
-        source  = connector.getStorageAs(Reader.class);
-        connector.closeAllExcept(source);
-        if (source == null) {
-            throw new UnsupportedStorageException(super.getLocale(), 
StoreProvider.NAME,
-                    connector.getStorage(), 
connector.getOption(OptionKey.OPEN_OPTIONS));
-        }
+        source  = connector.commit(Reader.class);
         library = connector.getOption(OptionKey.GEOMETRY_LIBRARY);
     }
 
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 94504d7..709e964 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
@@ -87,20 +87,12 @@ final class Store extends URIDataStore implements Filter {
      */
     public Store(final StoreProvider provider, final StorageConnector 
connector) throws DataStoreException {
         super(provider, connector);
-        final InputStream in = connector.getStorageAs(InputStream.class);
-        if (in != null) {
+        try {
+            final InputStream in = connector.commit(InputStream.class);
             source = new StreamSource(in);
-        } else {
-            final Reader reader = connector.getStorageAs(Reader.class);
-            if (reader != null) {
-                source = new StreamSource(reader);
-            }
-        }
-        final Closeable c = input(source);
-        connector.closeAllExcept(c);
-        if (c == null) {
-            throw new UnsupportedStorageException(super.getLocale(), 
StoreProvider.NAME,
-                    connector.getStorage(), 
connector.getOption(OptionKey.OPEN_OPTIONS));
+        } catch (UnsupportedStorageException e) {
+            final Reader reader = connector.commit(Reader.class);
+            source = new StreamSource(reader);
         }
     }
 
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/StorageConnector.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/StorageConnector.java
index 7211bb9..1c905fa 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/StorageConnector.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/StorageConnector.java
@@ -3,11 +3,13 @@ package org.apache.sis.storage;
 import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
+import java.io.UncheckedIOException;
 import java.lang.ref.WeakReference;
 import java.net.URI;
 import java.nio.ByteBuffer;
 import java.nio.channels.SeekableByteChannel;
 import java.nio.file.Path;
+import java.util.Locale;
 import java.util.Optional;
 import java.util.concurrent.Callable;
 import java.util.function.Function;
@@ -179,7 +181,7 @@ public class StorageConnector implements AutoCloseable {
 
     private <I, O> O use(Class<I> storageType, ControlStrategy<I> control, 
StorageOperatingFunction<? super I, ? extends O> action) throws IOException, 
DataStoreException {
         return doUnderControl(() -> {
-            final I rawInput = getOrFail(storageType);
+            final I rawInput = getOrFail(storageType, null, null);
             final ControlOperator<I> op = control.init(rawInput);
             try ( Closeable controlAfterUse = op::postControl ) {
                 return action.apply(op.getStorage());
@@ -237,22 +239,29 @@ public class StorageConnector implements AutoCloseable {
      * @param <T> Type of the wanted storage connection.
      * @return Underlying storage in the requested form. Never null.
      *
-     * @throws IOException If anything goes wrong while initializing storage 
access.
      * @throws DataStoreException If this connector is used concurrently, or 
if any problem occurs while initializing view.
      * @throws IllegalStateException If this connector is already closed.
      */
-    public <T> T commit(Class<T> target) throws IOException, 
DataStoreException {
-        return doUnderControl(() -> {
-            final T result = getOrFail(target);
-            concurrentFlag = -1; //close flag
-            storage.closeAllExcept(result);
-            return result;
-        });
+    public <T> T commit(Class<T> target) throws DataStoreException {
+        return commit(target, null, null);
+    }
+
+    public <T> T commit(Class<T> target, String caller, Locale errorLocale) 
throws DataStoreException {
+        try {
+            return doUnderControl(() -> {
+                final T result = getOrFail(target, caller, errorLocale);
+                concurrentFlag = -1; //close flag
+                storage.closeAllExcept(result);
+                return result;
+            });
+        } catch (IOException e) {
+            throw new DataStoreException(e); // TODO: define a better handling
+        }
     }
 
-    private <T> T getOrFail(Class<T> target) throws DataStoreException {
+    private <T> T getOrFail(Class<T> target, String caller, Locale 
errorLocale) throws DataStoreException {
         T view = storage.getStorageAs(target);
-        if (view == null) throw new UnsupportedStorageException();
+        if (view == null) throw unsupported(target, errorLocale, caller);
         return view;
     }
 
@@ -316,6 +325,19 @@ public class StorageConnector implements AutoCloseable {
         return storage.getStorage();
     }
 
+    public UnsupportedStorageException unsupported(final Locale errorLocale, 
final String caller) {
+        return unsupported(unsafe().type(), errorLocale, caller);
+    }
+
+    UnsupportedStorageException unsupported(final Object storage, final Locale 
errorLocale, final String caller) {
+        return new UnsupportedStorageException(
+                errorLocale == null ? Locale.ROOT : errorLocale,
+                caller == null ? "Unidentified caller" : caller,
+                storage,
+                getOption(OptionKey.OPEN_OPTIONS)
+        );
+    }
+
     /**
      * Please try to use {@link #useAs(Class, StorageOperatingFunction)} 
instead. Only call this if safe methods do not
      * support the storage type you require.
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/UnsafeConnector.java 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/UnsafeConnector.java
index fbee6e1..034e116 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/UnsafeConnector.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/UnsafeConnector.java
@@ -1391,4 +1391,8 @@ public class UnsafeConnector implements Serializable {
         }
         return table.toString();
     }
+
+    Object type() {
+        return UnsupportedStorageException.type(storage);
+    }
 }
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/UnsupportedStorageException.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/UnsupportedStorageException.java
index e8edb6a..a66706e 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/UnsupportedStorageException.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/UnsupportedStorageException.java
@@ -113,8 +113,10 @@ public class UnsupportedStorageException extends 
IllegalOpenParameterException {
      * ("Relax constraint on placement of this()/super() call in 
constructors").
      */
     @Workaround(library="JDK", version="10")
-    private static Object type(final Object storage) {
-        if ((storage instanceof File && ((File) storage).isDirectory()) ||
+    static Object type(final Object storage) {
+        if (storage instanceof Class) {
+            return storage;
+        } else if ((storage instanceof File && ((File) storage).isDirectory()) 
||
             (storage instanceof Path && Files.isDirectory((Path) storage)))
         {
             return "Directory";

Reply via email to