You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2021/08/26 19:49:46 UTC
[sling-org-apache-sling-testing-sling-mock] 02/02: SLING-10756
sling-mock: Unify classpath/file references in ContentLoader
This is an automated email from the ASF dual-hosted git repository.
sseifert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-sling-mock.git
commit 5a203e19831e2afd447679df6ff25bf997b90700
Author: Stefan Seifert <st...@users.noreply.github.com>
AuthorDate: Thu Aug 26 21:44:58 2021 +0200
SLING-10756 sling-mock: Unify classpath/file references in ContentLoader
---
.../testing/mock/sling/loader/ContentLoader.java | 157 ++++++++-------------
.../loader/AbstractContentLoaderBinaryTest.java | 8 ++
2 files changed, 65 insertions(+), 100 deletions(-)
diff --git a/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java b/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java
index 29148b6..8f271b7 100644
--- a/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java
+++ b/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java
@@ -28,6 +28,7 @@ import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
+import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -159,33 +160,24 @@ public final class ContentLoader {
/**
* Import content of JSON file into repository.
- * @param classpathResource Classpath resource URL for JSON content
+ * @param classpathResourceOrFile Classpath resource URL or file path for JSON content
* @param parentResource Parent resource
* @param childName Name of child resource to create with JSON content
* @return Resource
*/
- public @NotNull Resource json(@NotNull String classpathResource, @NotNull Resource parentResource, @NotNull String childName) {
- return json(classpathResource, parentResource.getPath() + "/" + childName);
+ public @NotNull Resource json(@NotNull String classpathResourceOrFile, @NotNull Resource parentResource, @NotNull String childName) {
+ return json(classpathResourceOrFile, parentResource.getPath() + "/" + childName);
}
/**
* Import content of JSON file into repository. Auto-creates parent
* hierarchies as nt:unstrucured nodes if missing.
- * @param classpathResource Classpath resource URL for JSON content
+ * @param classpathResourceOrFile Classpath resource URL or file path for JSON content
* @param destPath Path to import the JSON content to
* @return Resource
*/
- public @NotNull Resource json(@NotNull String classpathResource, @NotNull String destPath) {
- InputStream is = ContentLoader.class.getResourceAsStream(classpathResource);
- if (is == null) {
- throw new IllegalArgumentException("Classpath resource not found: " + classpathResource);
- }
- try {
- return json(is, destPath);
- }
- finally {
- IOUtils.closeQuietly(is);
- }
+ public @NotNull Resource json(@NotNull String classpathResourceOrFile, @NotNull String destPath) {
+ return processInputStreamFromClasspathOrFilesystem(classpathResourceOrFile, is -> json(is, destPath));
}
/**
@@ -212,33 +204,24 @@ public final class ContentLoader {
/**
* Import content of FileVault XML file into repository.
- * @param filePath File path to single FileVault XML file (usually <code>.content.xml</code>)
+ * @param classpathResourceOrFile Classpath resource URL or file path to single FileVault XML file (usually <code>.content.xml</code>)
* @param parentResource Parent resource
* @param childName Name of child resource to create with Filevault content
* @return Resource
*/
- public @NotNull Resource fileVaultXml(@NotNull String filePath, @NotNull Resource parentResource, @NotNull String childName) {
- return fileVaultXml(filePath, parentResource.getPath() + "/" + childName);
+ public @NotNull Resource fileVaultXml(@NotNull String classpathResourceOrFile, @NotNull Resource parentResource, @NotNull String childName) {
+ return fileVaultXml(classpathResourceOrFile, parentResource.getPath() + "/" + childName);
}
/**
* Import content of FileVault XML file into repository. Auto-creates parent
* hierarchies as nt:unstrucured nodes if missing.
- * @param filePath File path to single FileVault XML file (usually <code>.content.xml</code>)
+ * @param classpathResourceOrFile Classpath resource URL or file path to single FileVault XML file (usually <code>.content.xml</code>)
* @param destPath Path to import the Filevault content to
* @return Resource
*/
- public @NotNull Resource fileVaultXml(@NotNull String filePath, @NotNull String destPath) {
- File file = new File(filePath);
- try (InputStream is = new FileInputStream(file)) {
- return fileVaultXml(is, destPath);
- }
- catch (FileNotFoundException ex) {
- throw new IllegalArgumentException("File not found: " + file.getAbsolutePath());
- }
- catch (IOException ex) {
- throw new RuntimeException(ex);
- }
+ public @NotNull Resource fileVaultXml(@NotNull String classpathResourceOrFile, @NotNull String destPath) {
+ return processInputStreamFromClasspathOrFilesystem(classpathResourceOrFile, is -> fileVaultXml(is, destPath));
}
/**
@@ -315,51 +298,27 @@ public final class ContentLoader {
/**
* Import binary file as nt:file binary node into repository. Auto-creates
* parent hierarchies as nt:unstrucured nodes if missing. Mime type is
- * auto-detected from either {@code classpathResource} or {@code path}.
- * @param classpathResource Classpath resource URL for binary file.
+ * auto-detected from either {@code classpathResourceOrFile} or {@code path}.
+ * @param classpathResourceOrFile Classpath resource URL or file path for binary file.
* @param path Path to mount binary data to (parent nodes created
* automatically)
* @return Resource with binary data
*/
- public @NotNull Resource binaryFile(@NotNull String classpathResource, @NotNull String path) {
- InputStream is = ContentLoader.class.getResourceAsStream(classpathResource);
- if (is == null) {
- throw new IllegalArgumentException("Classpath resource not found: " + classpathResource);
- }
- try {
- return binaryFile(is, path, detectMimeTypeFromNames(classpathResource, path));
- } finally {
- try {
- is.close();
- } catch (IOException ex) {
- // ignore
- }
- }
+ public @NotNull Resource binaryFile(@NotNull String classpathResourceOrFile, @NotNull String path) {
+ return binaryFile(classpathResourceOrFile, path, detectMimeTypeFromNames(classpathResourceOrFile, path));
}
/**
* Import binary file as nt:file binary node into repository. Auto-creates
* parent hierarchies as nt:unstrucured nodes if missing.
- * @param classpathResource Classpath resource URL for binary file.
+ * @param classpathResourceOrFile Classpath resource URL or file path for binary file.
* @param path Path to mount binary data to (parent nodes created
* automatically)
* @param mimeType Mime type of binary data
* @return Resource with binary data
*/
- public @NotNull Resource binaryFile(@NotNull String classpathResource, @NotNull String path, @NotNull String mimeType) {
- InputStream is = ContentLoader.class.getResourceAsStream(classpathResource);
- if (is == null) {
- throw new IllegalArgumentException("Classpath resource not found: " + classpathResource);
- }
- try {
- return binaryFile(is, path, mimeType);
- } finally {
- try {
- is.close();
- } catch (IOException ex) {
- // ignore
- }
- }
+ public @NotNull Resource binaryFile(@NotNull String classpathResourceOrFile, @NotNull String path, @NotNull String mimeType) {
+ return processInputStreamFromClasspathOrFilesystem(classpathResourceOrFile, is -> binaryFile(is, path, mimeType));
}
/**
@@ -439,51 +398,25 @@ public final class ContentLoader {
/**
* Import binary file as nt:resource binary node into repository.
* Auto-creates parent hierarchies as nt:unstrucured nodes if missing. Mime
- * type is auto-detected from {@code classpathResource} or {@code path}.
- * @param classpathResource Classpath resource URL for binary file.
- * @param path Path to mount binary data to (parent nodes created
- * automatically)
+ * type is auto-detected from {@code classpathResourceOrFile} or {@code path}.
+ * @param classpathResourceOrFile Classpath resource URL or file path for binary file.
+ * @param path Path to mount binary data to (parent nodes created automatically)
* @return Resource with binary data
*/
- public @NotNull Resource binaryResource(@NotNull String classpathResource, @NotNull String path) {
- InputStream is = ContentLoader.class.getResourceAsStream(classpathResource);
- if (is == null) {
- throw new IllegalArgumentException("Classpath resource not found: " + classpathResource);
- }
- try {
- return binaryResource(is, path, detectMimeTypeFromNames(classpathResource, path));
- } finally {
- try {
- is.close();
- } catch (IOException ex) {
- // ignore
- }
- }
+ public @NotNull Resource binaryResource(@NotNull String classpathResourceOrFile, @NotNull String path) {
+ return binaryResource(classpathResourceOrFile, path, detectMimeTypeFromNames(classpathResourceOrFile, path));
}
/**
* Import binary file as nt:resource binary node into repository.
* Auto-creates parent hierarchies as nt:unstrucured nodes if missing.
- * @param classpathResource Classpath resource URL for binary file.
- * @param path Path to mount binary data to (parent nodes created
- * automatically)
+ * @param classpathResourceOrFile Classpath resource URL or file path for binary file.
+ * @param path Path to mount binary data to (parent nodes created automatically)
* @param mimeType Mime type of binary data
* @return Resource with binary data
*/
- public @NotNull Resource binaryResource(@NotNull String classpathResource, @NotNull String path, @NotNull String mimeType) {
- InputStream is = ContentLoader.class.getResourceAsStream(classpathResource);
- if (is == null) {
- throw new IllegalArgumentException("Classpath resource not found: " + classpathResource);
- }
- try {
- return binaryResource(is, path, mimeType);
- } finally {
- try {
- is.close();
- } catch (IOException ex) {
- // ignore
- }
- }
+ public @NotNull Resource binaryResource(@NotNull String classpathResourceOrFile, @NotNull String path, @NotNull String mimeType) {
+ return processInputStreamFromClasspathOrFilesystem(classpathResourceOrFile, is -> binaryResource(is, path, mimeType));
}
/**
@@ -582,7 +515,7 @@ public final class ContentLoader {
}
/**
- * Mount a folder containing content in JSON (Sling-Inital-Content) format in repository.
+ * Mount a folder (file system) containing content in JSON (Sling-Inital-Content) format in repository.
* @param mountFolderPath Root folder path to mount
* @param parentResource Parent resource
* @param childName Name of child resource to mount folder into
@@ -592,7 +525,7 @@ public final class ContentLoader {
}
/**
- * Mount a folder containing content in JSON (Sling-Inital-Content) format in repository.
+ * Mount a folder (file system) containing content in JSON (Sling-Inital-Content) format in repository.
* @param mountFolder Root folder path to mount
* @param destPath Path to mount folder into
*/
@@ -631,7 +564,7 @@ public final class ContentLoader {
}
/**
- * Mount a folder containing content in FileVault XML format in repository.
+ * Mount a folder (file system) containing content in FileVault XML format in repository.
* @param mountFolderPath Root folder path to mount. Path needs to point to the root folder of the content package structure.
* @param parentResource Parent resource
* @param childName Name of child resource to mount folder into
@@ -641,7 +574,7 @@ public final class ContentLoader {
}
/**
- * Mount a folder containing content in FileVault XML format in repository.
+ * Mount a folder (file system) containing content in FileVault XML format in repository.
* @param mountFolder Root folder path to mount. Path needs to point to the root folder of the content package structure.
* @param destPath Path to mount folder into
*/
@@ -678,4 +611,28 @@ public final class ContentLoader {
bundleContext.registerService(ResourceProvider.class, service, serviceProperties);
}
+ /**
+ * Get input stream for a resource either from classpath (preferred) or from filesystem (fallback).
+ * @param classpathResourceOrFile Classpath resource URL or file path
+ * @param processor Processes input stream
+ */
+ @SuppressWarnings("null")
+ private <T> @NotNull T processInputStreamFromClasspathOrFilesystem(@NotNull String classpathResourceOrFile, @NotNull Function<InputStream,T> processor) {
+ InputStream is = ContentLoader.class.getResourceAsStream(classpathResourceOrFile);
+ if (is == null) {
+ try {
+ is = new FileInputStream(classpathResourceOrFile);
+ }
+ catch (FileNotFoundException ex) {
+ throw new IllegalArgumentException("Classpath resource or file not found: " + classpathResourceOrFile);
+ }
+ }
+ try {
+ return processor.apply(is);
+ }
+ finally {
+ IOUtils.closeQuietly(is);
+ }
+ }
+
}
diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderBinaryTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderBinaryTest.java
index d2ca3df..8887393 100644
--- a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderBinaryTest.java
+++ b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderBinaryTest.java
@@ -21,6 +21,7 @@ package org.apache.sling.testing.mock.sling.loader;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
import java.io.IOException;
import java.io.InputStream;
@@ -98,6 +99,13 @@ public abstract class AbstractContentLoaderBinaryTest {
assertMimeType(fileResource, "mime/test");
}
+ @Test
+ public void testInvalidPath() {
+ assertThrows(IllegalArgumentException.class, () -> {
+ context.load().binaryFile("/non-existing.xyz", path + "/non-existing.xyz");
+ });
+ }
+
static void assertSampleImageFileSize(Resource resource) throws IOException {
try (InputStream is = resource.adaptTo(InputStream.class)) {
assertNotNull("InputSteam is null for " + resource.getPath(), is);