This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-io.git
The following commit(s) were added to refs/heads/master by this push: new 364c89e Add FileSystemProviders. 364c89e is described below commit 364c89efc6f5f772f10f34a3df6fbe7e619ea549 Author: Gary Gregory <gardgreg...@gmail.com> AuthorDate: Sun Sep 27 10:16:53 2020 -0400 Add FileSystemProviders. --- src/changes/changes.xml | 5 +- .../commons/io/file/spi/FileSystemProviders.java | 112 +++++++++++++++++++++ .../org/apache/commons/io/file/spi/package.html | 22 ++++ .../io/file/spi/FileSystemProvidersTest.java | 67 ++++++++++++ 4 files changed, 205 insertions(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index d7a38d3..139d345 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -47,12 +47,15 @@ The <action> type attribute can be add,update,fix,remove. <body> <!-- The release date is the date RC is cut --> <release version="2.9.0" date="2020-MM-DD" description="Java 8 required."> - <action issue="686" dev="ggregory" type="add" due-to="Alan Moffat, Gary Gregory"> + <action issue="IO-686" dev="ggregory" type="add" due-to="Alan Moffat, Gary Gregory"> IOUtils.toByteArray(InputStream) Javadoc does not match code </action> <action issue="IO-689" dev="aherbert" type="fix" due-to="Uwe Schindler"> FileUtils: Remove Instant->ZonedDateTime->Instant round-trip. </action> + <action dev="ggregory" type="add" due-to="Gary Gregory"> + Add FileSystemProviders. + </action> <!-- UPDATES --> <action dev="ggregory" type="update" due-to="Dependabot"> Update junit-jupiter from 5.6.2 to 5.7.0 #153. diff --git a/src/main/java/org/apache/commons/io/file/spi/FileSystemProviders.java b/src/main/java/org/apache/commons/io/file/spi/FileSystemProviders.java new file mode 100644 index 0000000..27c42c5 --- /dev/null +++ b/src/main/java/org/apache/commons/io/file/spi/FileSystemProviders.java @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.commons.io.file.spi; + +import java.net.URI; +import java.net.URL; +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.nio.file.spi.FileSystemProvider; +import java.util.List; +import java.util.Objects; + +/** + * Helps working with {@link FileSystemProvider}. + * + * @since 2.9.0 + */ +public class FileSystemProviders { + + private static FileSystemProviders INSTALLED = new FileSystemProviders(FileSystemProvider.installedProviders()); + + /** + * Gets the {@link FileSystemProvider} for the given Path. + * + * @param path The Path to query + * @return the {@link FileSystemProvider} for the given Path. + */ + @SuppressWarnings("resource") // FileSystem is not allocated here. + public static FileSystemProvider getFileSystemProvider(final Path path) { + return Objects.requireNonNull(path, "path").getFileSystem().provider(); + } + + /** + * Returns the instance for the installed providers. + * + * @return the instance for the installed providers. + * @see FileSystemProvider#installedProviders() + */ + public static FileSystemProviders installed() { + return INSTALLED; + } + + private final List<FileSystemProvider> providers; + + /* + * Might make public later. + */ + private FileSystemProviders(List<FileSystemProvider> providers) { + super(); + this.providers = providers; + } + + /** + * Gets the {@link FileSystemProvider} for the given scheme. + * + * @param scheme The scheme to query. + * @return the {@link FileSystemProvider} for the given URI or null. + */ + @SuppressWarnings("resource") // FileSystems.getDefault() returns a constant. + public FileSystemProvider getFileSystemProvider(final String scheme) { + Objects.requireNonNull(scheme, "scheme"); + // Check default provider first to avoid loading of installed providers. + if (scheme.equalsIgnoreCase("file")) { + return FileSystems.getDefault().provider(); + } + // Find provider. + if (providers != null) { + for (final FileSystemProvider provider : providers) { + if (provider.getScheme().equalsIgnoreCase(scheme)) { + return provider; + } + } + } + return null; + } + + /** + * Gets the {@link FileSystemProvider} for the given URI. + * + * @param uri The URI to query + * @return the {@link FileSystemProvider} for the given URI or null. + */ + public FileSystemProvider getFileSystemProvider(final URI uri) { + return getFileSystemProvider(Objects.requireNonNull(uri, "uri").getScheme()); + } + + /** + * Gets the {@link FileSystemProvider} for the given URL. + * + * @param url The URL to query + * @return the {@link FileSystemProvider} for the given URI or null. + */ + public FileSystemProvider getFileSystemProvider(final URL url) { + return getFileSystemProvider(Objects.requireNonNull(url, "url").getProtocol()); + } + +} diff --git a/src/main/java/org/apache/commons/io/file/spi/package.html b/src/main/java/org/apache/commons/io/file/spi/package.html new file mode 100644 index 0000000..7f9ee23 --- /dev/null +++ b/src/main/java/org/apache/commons/io/file/spi/package.html @@ -0,0 +1,22 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--> +<html> +<body> + <p>This package provides extensions in the realm of java.nio.file.spi.</p> +</body> +</html> diff --git a/src/test/java/org/apache/commons/io/file/spi/FileSystemProvidersTest.java b/src/test/java/org/apache/commons/io/file/spi/FileSystemProvidersTest.java new file mode 100644 index 0000000..bdb0e55 --- /dev/null +++ b/src/test/java/org/apache/commons/io/file/spi/FileSystemProvidersTest.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.commons.io.file.spi; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Paths; +import java.nio.file.spi.FileSystemProvider; +import java.util.List; + +import org.junit.jupiter.api.Test; + +public class FileSystemProvidersTest { + + private static final String FILE_PATH = "file:///foo.txt"; + + @Test + public void testGetFileSystemProvider_all() throws URISyntaxException { + final List<FileSystemProvider> installedProviders = FileSystemProvider.installedProviders(); + for (FileSystemProvider fileSystemProvider : installedProviders) { + final String scheme = fileSystemProvider.getScheme(); + final URI uri = new URI(scheme, "ssp", "fragment"); + assertEquals(scheme, FileSystemProviders.installed().getFileSystemProvider(uri).getScheme()); + } + } + + @Test + public void testGetFileSystemProvider_filePath() { + assertNotNull(FileSystemProviders.getFileSystemProvider(Paths.get(URI.create(FILE_PATH)))); + } + + @Test + public void testGetFileSystemProvider_fileScheme() { + assertNotNull(FileSystemProviders.installed().getFileSystemProvider("file")); + } + + @Test + public void testGetFileSystemProvider_fileURI() { + assertNotNull(FileSystemProviders.installed().getFileSystemProvider(URI.create(FILE_PATH))); + } + + @Test + public void testGetFileSystemProvider_fileURL() throws MalformedURLException { + assertNotNull(FileSystemProviders.installed().getFileSystemProvider(new URL(FILE_PATH))); + } + +}