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