You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2021/06/04 10:45:20 UTC

[sling-org-apache-sling-feature] branch feature/switch-to-nio-files created (now 1483b78)

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

kwin pushed a change to branch feature/switch-to-nio-files
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature.git.


      at 1483b78  SLING-10458 use NIO files

This branch includes the following new commits:

     new 1483b78  SLING-10458 use NIO files

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[sling-org-apache-sling-feature] 01/01: SLING-10458 use NIO files

Posted by kw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch feature/switch-to-nio-files
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature.git

commit 1483b78cda048e5a71c111c36387b3b8f5aded17
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Fri Jun 4 12:45:08 2021 +0200

    SLING-10458 use NIO files
---
 .../feature/io/artifacts/ArtifactHandler.java      | 14 ++++
 .../feature/io/artifacts/ArtifactManager.java      | 98 ++++++++--------------
 .../sling/feature/io/artifacts/package-info.java   |  2 +-
 .../feature/io/artifacts/spi/package-info.java     |  2 +-
 4 files changed, 52 insertions(+), 64 deletions(-)

diff --git a/src/main/java/org/apache/sling/feature/io/artifacts/ArtifactHandler.java b/src/main/java/org/apache/sling/feature/io/artifacts/ArtifactHandler.java
index 07ed587..7bc35bc 100644
--- a/src/main/java/org/apache/sling/feature/io/artifacts/ArtifactHandler.java
+++ b/src/main/java/org/apache/sling/feature/io/artifacts/ArtifactHandler.java
@@ -19,6 +19,7 @@ package org.apache.sling.feature.io.artifacts;
 import java.io.File;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.nio.file.Path;
 
 /**
  * A handler provides a file object for an artifact.
@@ -46,12 +47,25 @@ public class ArtifactHandler {
      * @param file The file for the artifact
      * @throws MalformedURLException If the file name cannot be converted to a URL.
      * @since 1.1.0
+     * @deprecated Use {@link #ArtifactHandler(Path)} instead
      */
+    @Deprecated
     public ArtifactHandler(final File file) throws MalformedURLException {
         this(file.toURI().toString(), file.toURI().toURL());
     }
 
     /**
+     * Create a new handler.
+     *
+     * @param file The file for the artifact
+     * @throws MalformedURLException If the file name cannot be converted to a URL.
+     * @since 1.2.0
+     */
+    public ArtifactHandler(final Path file) throws MalformedURLException {
+        this(file.toUri().toString(), file.toUri().toURL());
+    }
+
+    /**
      * Get the url of the artifact
      *
      * @return The url.
diff --git a/src/main/java/org/apache/sling/feature/io/artifacts/ArtifactManager.java b/src/main/java/org/apache/sling/feature/io/artifacts/ArtifactManager.java
index 021be9a..aa1d6f6 100644
--- a/src/main/java/org/apache/sling/feature/io/artifacts/ArtifactManager.java
+++ b/src/main/java/org/apache/sling/feature/io/artifacts/ArtifactManager.java
@@ -17,13 +17,9 @@
 package org.apache.sling.feature.io.artifacts;
 
 import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.io.OutputStream;
 import java.io.Reader;
 import java.lang.ProcessBuilder.Redirect;
 import java.net.MalformedURLException;
@@ -33,6 +29,7 @@ import java.net.URLConnection;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Base64;
 import java.util.Comparator;
@@ -40,6 +37,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.ServiceLoader;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Feature;
@@ -215,8 +214,8 @@ public class ArtifactManager
 
         } else {
             // file (either relative or absolute)
-            final File f = new File(url);
-            if ( !f.exists()) {
+            final Path f = Paths.get(url);
+            if ( !Files.exists(f)) {
                 throw new IOException("Artifact " + url + " not found.");
             }
             return new ArtifactHandler(f);
@@ -284,7 +283,7 @@ public class ArtifactManager
         // if we have an artifact id and using mvn is enabled, we try this as a last
         // resort
         if (artifactId != null && this.config.isUseMvn()) {
-            final File file = getArtifactFromMvn(artifactId);
+            final Path file = getArtifactFromMvn(artifactId);
             if (file != null) {
                 return new ArtifactHandler(file);
             }
@@ -343,7 +342,7 @@ public class ArtifactManager
 
         private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
-        private File cacheDir;
+        private Path cacheDir;
 
         private ArtifactProviderContext config;
 
@@ -354,7 +353,7 @@ public class ArtifactManager
 
         @Override
         public void init(final ArtifactProviderContext config) throws IOException {
-            this.cacheDir = config.getCacheDirectory();
+            this.cacheDir = config.getCacheDirectory().toPath();
             this.config = config;
         }
 
@@ -369,10 +368,10 @@ public class ArtifactManager
             logger.debug("Checking url to be local file {}", url);
             // check if this is already a local file
             try {
-                final File f = new File(new URL(url).toURI());
-                if (f.exists()) {
+                final Path f = Paths.get(new URL(url).toURI());
+                if (Files.exists(f)) {
                     this.config.incLocalArtifacts();
-                    return f.toURI().toURL();
+                    return f.toUri().toURL();
                 }
                 return null;
             } catch ( final URISyntaxException ise) {
@@ -395,11 +394,9 @@ public class ArtifactManager
                 if(pos >= 0) {
                     adjustedRelativePath = adjustedRelativePath.substring(pos + 2);
                 }
-                final String filePath = (this.cacheDir.getAbsolutePath() + File.separatorChar + adjustedRelativePath).replace('/', File.separatorChar);
-                final File cacheFile = new File(filePath);
-
-                if ( !cacheFile.exists() ) {
-                    cacheFile.getParentFile().mkdirs();
+                Path cacheFile = cacheDir.resolve(adjustedRelativePath.replace("/", java.nio.file.FileSystems.getDefault().getSeparator()));
+                if (!Files.exists(cacheFile) ) {
+                    Files.createDirectories(cacheFile.getParent());
                     final URL u = new URL(url);
                     final URLConnection con = u.openConnection();
                     final String userInfo = u.getUserInfo();
@@ -408,9 +405,8 @@ public class ArtifactManager
                     }
                     con.connect();
 
-                    final InputStream readIS = con.getInputStream();
-                    try {
-                        copyFileContent(readIS, cacheFile, 32768);
+                    try (InputStream input = con.getInputStream()){
+                        Files.copy(input, cacheFile);
                     } catch(IOException e) {
                         //TODO: Remove this logging statement when it settled down
                         logger.debug("Failed to copy file", e);
@@ -420,11 +416,7 @@ public class ArtifactManager
                 } else {
                     this.config.incCachedArtifacts();
                 }
-                return cacheFile.toURI().toURL();
-            } catch ( final FileNotFoundException e) {
-                logger.trace("File not found here (keep on looking): '{}'", url);
-                // Do not report if the file does not exist as we cycle through the various sources
-                return null;
+                return cacheFile.toUri().toURL();
             } catch ( final Exception e) {
                 logger.info("Artifact not found in one repository", e);
                 // ignore for now
@@ -436,52 +428,25 @@ public class ArtifactManager
         public String toString() {
             return "DefaultArtifactHandler";
         }
-
-        private void copyFileContent(InputStream readIS, File cacheFile, int bufferSize) throws IOException {
-            final byte[] buffer = new byte[bufferSize];
-            int l;
-            OutputStream os = null;
-            try {
-                os = new FileOutputStream(cacheFile);
-                while ( (l = readIS.read(buffer)) >= 0 ) {
-                    os.write(buffer, 0, l);
-                }
-            } finally {
-                try {
-                    readIS.close();
-                } catch ( final IOException ignore) {
-                    // ignore
-                }
-                if ( os != null ) {
-                    try {
-                        os.close();
-                    } catch ( final IOException ignore ) {
-                        // ignore
-                    }
-                }
-            }
-        }
     }
 
-    private File getArtifactFromMvn(final ArtifactId artifactId) {
-        final String filePath = this.config.getMvnHome()
-                .concat(artifactId.toMvnPath().replace('/', File.separatorChar));
+    private Path getArtifactFromMvn(final ArtifactId artifactId) {
+        final Path filePath = Paths.get(config.getMvnHome(), artifactId.toMvnPath().replace("/", java.nio.file.FileSystems.getDefault().getSeparator()));
         logger.debug("Trying to fetch artifact {} from local mvn repository {}", artifactId.toMvnId(), filePath);
-        final File f = new File(filePath);
-        if (!f.exists() || !f.isFile() || !f.canRead()) {
+        if (!Files.exists(filePath) || !Files.isRegularFile(filePath) || Files.isReadable(filePath)) {
             logger.debug("Trying to download {}", artifactId.toMvnId());
             try {
                 this.downloadArtifact(artifactId);
             } catch (final IOException ioe) {
                 logger.debug("Error downloading file.", ioe);
             }
-            if (!f.exists() || !f.isFile() || !f.canRead()) {
+            if (!Files.exists(filePath) || !Files.isRegularFile(filePath) || !Files.isReadable(filePath)) {
                 logger.info("Artifact not found {}", artifactId.toMvnId());
 
                 return null;
             }
         }
-        return f;
+        return filePath;
     }
 
     /**
@@ -518,15 +483,15 @@ public class ArtifactManager
             logger.debug("Writing pom to {}", dir);
             Files.write(dir.resolve("pom.xml"), lines, Charset.forName("UTF-8"));
 
-            final File output = dir.resolve("output.txt").toFile();
-            final File error = dir.resolve("error.txt").toFile();
+            final Path output = dir.resolve("output.txt");
+            final Path error = dir.resolve("error.txt");
 
             // invoke maven
             logger.debug("Invoking mvn...");
             final ProcessBuilder pb = new ProcessBuilder("mvn", "verify");
             pb.directory(dir.toFile());
-            pb.redirectOutput(Redirect.to(output));
-            pb.redirectError(Redirect.to(error));
+            pb.redirectOutput(Redirect.to(output.toFile()));
+            pb.redirectError(Redirect.to(error.toFile()));
 
             final Process p = pb.start();
             try {
@@ -536,7 +501,16 @@ public class ArtifactManager
             }
 
         } finally {
-            Files.walk(dir).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
+            deleteDirectoryRecursively(dir);
+        }
+    }
+
+    private static void deleteDirectoryRecursively(Path directory) throws IOException {
+        try (Stream<Path> filesStream = Files.walk(directory)) {
+            final List<Path> pathsToDelete = filesStream.sorted(Comparator.reverseOrder()).collect(Collectors.toList());
+            for(Path path : pathsToDelete) {
+                Files.deleteIfExists(path);
+            }
         }
     }
 }
diff --git a/src/main/java/org/apache/sling/feature/io/artifacts/package-info.java b/src/main/java/org/apache/sling/feature/io/artifacts/package-info.java
index f2229fb..ea278cf 100644
--- a/src/main/java/org/apache/sling/feature/io/artifacts/package-info.java
+++ b/src/main/java/org/apache/sling/feature/io/artifacts/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@org.osgi.annotation.versioning.Version("1.1.0")
+@org.osgi.annotation.versioning.Version("1.2.0")
 package org.apache.sling.feature.io.artifacts;
 
 
diff --git a/src/main/java/org/apache/sling/feature/io/artifacts/spi/package-info.java b/src/main/java/org/apache/sling/feature/io/artifacts/spi/package-info.java
index bb0c1f0..3978a73 100644
--- a/src/main/java/org/apache/sling/feature/io/artifacts/spi/package-info.java
+++ b/src/main/java/org/apache/sling/feature/io/artifacts/spi/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@org.osgi.annotation.versioning.Version("1.0.0")
+@org.osgi.annotation.versioning.Version("2.0.0")
 package org.apache.sling.feature.io.artifacts.spi;