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);