This is an automated email from the ASF dual-hosted git repository. pauls pushed a commit to branch issues/SLING-8421 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-io.git
commit 188623887e5db718aa2cb9bfb0f9d5595f07d6dc Author: Karl Pauls <[email protected]> AuthorDate: Thu May 16 15:13:21 2019 +0200 SLING-8421: Allow artifact providers that work with URLs instead of Files --- .../sling/feature/io/file/ArtifactHandler.java | 14 +++++++ ...tHandler.java => ArtifactHandlerDecorator.java} | 41 ++++++++----------- .../sling/feature/io/file/ArtifactManager.java | 46 ++++++++++------------ .../feature/io/file/spi/ArtifactProvider.java | 14 +++++++ .../sling/feature/io/file/ArtifactManagerTest.java | 6 +-- 5 files changed, 67 insertions(+), 54 deletions(-) diff --git a/src/main/java/org/apache/sling/feature/io/file/ArtifactHandler.java b/src/main/java/org/apache/sling/feature/io/file/ArtifactHandler.java index e1d4ab0..61ea4ee 100644 --- a/src/main/java/org/apache/sling/feature/io/file/ArtifactHandler.java +++ b/src/main/java/org/apache/sling/feature/io/file/ArtifactHandler.java @@ -17,6 +17,8 @@ package org.apache.sling.feature.io.file; import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; /** * A handler provides a file object for an artifact. @@ -55,4 +57,16 @@ public class ArtifactHandler { public File getFile() { return file; } + + public URL getLocalURL() { + File result = getFile(); + try + { + return result != null ? file.toURI().toURL() : null; + } + catch (MalformedURLException e) + { + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/org/apache/sling/feature/io/file/ArtifactHandler.java b/src/main/java/org/apache/sling/feature/io/file/ArtifactHandlerDecorator.java similarity index 67% copy from src/main/java/org/apache/sling/feature/io/file/ArtifactHandler.java copy to src/main/java/org/apache/sling/feature/io/file/ArtifactHandlerDecorator.java index e1d4ab0..009cf10 100644 --- a/src/main/java/org/apache/sling/feature/io/file/ArtifactHandler.java +++ b/src/main/java/org/apache/sling/feature/io/file/ArtifactHandlerDecorator.java @@ -17,42 +17,33 @@ package org.apache.sling.feature.io.file; import java.io.File; +import java.net.URL; -/** - * A handler provides a file object for an artifact. - */ -public class ArtifactHandler { - - private final String url; - - private final File file; +class ArtifactHandlerDecorator extends ArtifactHandler +{ + private final ArtifactHandler file; /** * Create a new handler. - * + * * @param url The url of the artifact * @param file The file for the artifact */ - public ArtifactHandler(final String url, final File file) { - this.url = url; + public ArtifactHandlerDecorator(String url, ArtifactHandler file) + { + super(url, null); this.file = file; } - /** - * Get the url of the artifact - * - * @return The url. - */ - public String getUrl() { - return url; + @Override + public File getFile() + { + return this.file.getFile(); } - /** - * Get a file for the artifact - * - * @return The file - */ - public File getFile() { - return file; + @Override + public URL getLocalURL() + { + return this.file.getLocalURL(); } } diff --git a/src/main/java/org/apache/sling/feature/io/file/ArtifactManager.java b/src/main/java/org/apache/sling/feature/io/file/ArtifactManager.java index 0db5c51..7476691 100644 --- a/src/main/java/org/apache/sling/feature/io/file/ArtifactManager.java +++ b/src/main/java/org/apache/sling/feature/io/file/ArtifactManager.java @@ -16,16 +16,17 @@ */ package org.apache.sling.feature.io.file; +import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; -import java.nio.file.Files; import java.util.Base64; import java.util.HashMap; import java.util.Map; @@ -109,7 +110,7 @@ public class ArtifactManager implements AutoCloseable { shutdown(); } - private final File getArtifactFromProviders(final String url, final String relativeCachePath) throws IOException { + private final ArtifactHandler getArtifactFromProviders(final String url, final String relativeCachePath) throws IOException { final int pos = url.indexOf(":"); final String scheme = url.substring(0, pos); @@ -120,7 +121,10 @@ public class ArtifactManager implements AutoCloseable { if ( provider == null ) { throw new IOException("No URL provider found for " + url); } - return provider.getArtifact(url, relativeCachePath); + + logger.debug("Checking {} to get artifact from {}", provider, url); + + return provider.getArtifactHandler(url, relativeCachePath); } /** @@ -149,11 +153,11 @@ public class ArtifactManager implements AutoCloseable { while ( url.charAt(pos) == '/') { pos++; } - final File file = this.getArtifactFromProviders(url, url.substring(pos)); - if ( file == null || !file.exists()) { + final ArtifactHandler file = this.getArtifactFromProviders(url, url.substring(pos)); + if ( file == null ) { throw new IOException("Artifact " + url + " not found."); } - return new ArtifactHandler(url, file); + return file; } else { // file (either relative or absolute) @@ -172,23 +176,12 @@ public class ArtifactManager implements AutoCloseable { builder.append(path); final String artifactUrl = builder.toString(); - final int pos = artifactUrl.indexOf(":"); - final String scheme = artifactUrl.substring(0, pos); - ArtifactProvider handler = this.providers.get(scheme); - if ( handler == null ) { - handler = this.providers.get("*"); - } - if ( handler == null ) { - throw new IOException("No URL handler found for " + artifactUrl); - } + ArtifactHandler handler = getArtifactFromProviders(artifactUrl, path); - logger.debug("Checking {} to get artifact from {}", handler, artifactUrl); - - final File file = handler.getArtifact(artifactUrl, path); - if ( file != null ) { + if ( handler != null ) { logger.debug("Found artifact {}", artifactUrl); - return new ArtifactHandler(artifactUrl, file); + return handler; } // check for SNAPSHOT @@ -211,11 +204,11 @@ public class ArtifactManager implements AutoCloseable { while ( fullURL.charAt(pos2) == '/') { pos2++; } - final File file2 = this.getArtifactFromProviders(fullURL, path); - if ( file2 == null || !file2.exists()) { + final ArtifactHandler file2 = this.getArtifactFromProviders(fullURL, path); + if ( file2 == null) { throw new IOException("Artifact " + fullURL + " not found."); } - return new ArtifactHandler(artifactUrl, file2); + return new ArtifactHandlerDecorator(artifactUrl, file2); } } catch ( final IOException ignore ) { // we ignore this but report the original 404 @@ -228,10 +221,11 @@ public class ArtifactManager implements AutoCloseable { protected String getFileContents(final ArtifactHandler handler) throws IOException { final StringBuilder sb = new StringBuilder(); - for(final String line : Files.readAllLines(handler.getFile().toPath())) { - sb.append(line).append('\n'); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(handler.getLocalURL().openStream(), "UTF-8"))) { + for (String line = reader.readLine(); line != null; line = reader.readLine()) { + sb.append(line).append('\n'); + } } - return sb.toString(); } diff --git a/src/main/java/org/apache/sling/feature/io/file/spi/ArtifactProvider.java b/src/main/java/org/apache/sling/feature/io/file/spi/ArtifactProvider.java index 75ccd85..62d418c 100644 --- a/src/main/java/org/apache/sling/feature/io/file/spi/ArtifactProvider.java +++ b/src/main/java/org/apache/sling/feature/io/file/spi/ArtifactProvider.java @@ -18,6 +18,10 @@ package org.apache.sling.feature.io.file.spi; import java.io.File; import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; + +import org.apache.sling.feature.io.file.ArtifactHandler; /** * The artifact provider is an extension point for providing artifacts @@ -52,4 +56,14 @@ public interface ArtifactProvider { * @return A file if the artifact exists or {@code null} */ File getArtifact(String url, String relativeCachePath); + + default ArtifactHandler getArtifactHandler(String url, String relativeCachePath) { + File result = getArtifact(url, relativeCachePath); + if (result != null && result.exists()) { + return new ArtifactHandler(url, result); + } + else { + return null; + } + } } diff --git a/src/test/java/org/apache/sling/feature/io/file/ArtifactManagerTest.java b/src/test/java/org/apache/sling/feature/io/file/ArtifactManagerTest.java index 69d9d32..d9aa0f1 100644 --- a/src/test/java/org/apache/sling/feature/io/file/ArtifactManagerTest.java +++ b/src/test/java/org/apache/sling/feature/io/file/ArtifactManagerTest.java @@ -76,9 +76,9 @@ public class ArtifactManagerTest { when(artifactFile.exists()).thenReturn(true); final ArtifactProvider provider = mock(ArtifactProvider.class); - when(provider.getArtifact(REPO + "/group/artifact/1.0.0-SNAPSHOT/artifact-1.0.0-SNAPSHOT.txt", "group/artifact/1.0.0-SNAPSHOT/artifact-1.0.0-SNAPSHOT.txt")).thenReturn(null); - when(provider.getArtifact(REPO + "/group/artifact/1.0.0-SNAPSHOT/maven-metadata.xml", "org.apache.sling/group/artifact/1.0.0-SNAPSHOT/maven-metadata.xml")).thenReturn(metadataFile); - when(provider.getArtifact(REPO + "/group/artifact/1.0.0-SNAPSHOT/artifact-1.0.0-20160321.103951-1.txt", "group/artifact/1.0.0-SNAPSHOT/artifact-1.0.0-SNAPSHOT.txt")).thenReturn(artifactFile); + when(provider.getArtifactHandler(REPO + "/group/artifact/1.0.0-SNAPSHOT/artifact-1.0.0-SNAPSHOT.txt", "group/artifact/1.0.0-SNAPSHOT/artifact-1.0.0-SNAPSHOT.txt")).thenReturn(null); + when(provider.getArtifactHandler(REPO + "/group/artifact/1.0.0-SNAPSHOT/maven-metadata.xml", "org.apache.sling/group/artifact/1.0.0-SNAPSHOT/maven-metadata.xml")).thenReturn(new ArtifactHandler(REPO + "/group/artifact/1.0.0-SNAPSHOT/maven-metadata.xml", metadataFile)); + when(provider.getArtifactHandler(REPO + "/group/artifact/1.0.0-SNAPSHOT/artifact-1.0.0-20160321.103951-1.txt", "group/artifact/1.0.0-SNAPSHOT/artifact-1.0.0-SNAPSHOT.txt")).thenReturn(new ArtifactHandler(REPO + "/group/artifact/1.0.0-SNAPSHOT/artifact-1.0.0-20160321.103951-1.txt", artifactFile)); final Map<String, ArtifactProvider> providers = new HashMap<>(); providers.put("*", provider);
