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;