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

dklco pushed a commit to branch SLING-9841-jcr-contentloader-runmode
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-contentloader.git

commit 83c743722a4cedb2ffdf1c677ae7fd35cd23e0b1
Author: Dan Klco <dk...@apache.org>
AuthorDate: Mon Oct 19 14:45:05 2020 -0400

    SLING-9841: Adding support for skipping the loading of a path when a 
runmode matches
---
 .../internal/BundleContentLoader.java              | 22 +++++++++++++---
 .../internal/ContentLoaderService.java             |  5 +++-
 .../jcr/contentloader/internal/PathEntry.java      | 20 +++++++++++++--
 .../internal/BundleContentLoaderTest.java          | 30 +++++++++++++++++++++-
 4 files changed, 70 insertions(+), 7 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/jcr/contentloader/internal/BundleContentLoader.java
 
b/src/main/java/org/apache/sling/jcr/contentloader/internal/BundleContentLoader.java
index 84dbeb6..d8160e9 100644
--- 
a/src/main/java/org/apache/sling/jcr/contentloader/internal/BundleContentLoader.java
+++ 
b/src/main/java/org/apache/sling/jcr/contentloader/internal/BundleContentLoader.java
@@ -33,6 +33,7 @@ import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.StringTokenizer;
 
 import javax.jcr.Item;
@@ -62,10 +63,13 @@ public class BundleContentLoader extends BaseImportLoader {
     // bundles whose registration failed and should be retried
     private List<Bundle> delayedBundles;
 
-    public BundleContentLoader(BundleHelper bundleHelper, 
ContentReaderWhiteboard contentReaderWhiteboard) {
+    private Set<String> runmodes;
+
+    public BundleContentLoader(BundleHelper bundleHelper, 
ContentReaderWhiteboard contentReaderWhiteboard, Set<String> runmodes) {
         super(contentReaderWhiteboard);
         this.bundleHelper = bundleHelper;
         this.delayedBundles = new LinkedList<>();
+        this.runmodes = runmodes;
     }
 
     public void dispose() {
@@ -215,7 +219,7 @@ public class BundleContentLoader extends BaseImportLoader {
         try {
             while (pathIter.hasNext()) {
                 final PathEntry pathEntry = pathIter.next();
-                if (!contentAlreadyLoaded || pathEntry.isOverwrite()) {
+                if (validRunmode(pathEntry) && (!contentAlreadyLoaded || 
pathEntry.isOverwrite())) {
                     String workspace = pathEntry.getWorkspace();
                     final Session targetSession;
                     if (workspace != null) {
@@ -290,13 +294,25 @@ public class BundleContentLoader extends BaseImportLoader 
{
     }
 
     /**
+     * Checks if the path entry has a runmode restriction set and the runmode 
isn't set in the Sling instance.
+     * 
+     * @param pathEntry the path entry to check
+     * @return true if the required runmode setting is not set or the instance 
runmodes doesn't contain the runmode
+     */
+    private boolean validRunmode(PathEntry pathEntry) {
+        return pathEntry.getSkipRunmode() == null || 
"".equals(pathEntry.getSkipRunmode())
+            || !runmodes.contains(pathEntry.getSkipRunmode());
+    }
+
+    /**
      * Handle content installation for a single path.
      *
      * @param bundle        The bundle containing the content.
      * @param path          The path
      * @param configuration
      * @param parent        The parent node.
-     * @param createdNodes  An optional list to store all new nodes. This list 
is used for an uninstall
+     * @param createdNodes  An optional list to store all new nodes. This list 
is
+     *                      used for an uninstall
      * @throws RepositoryException
      */
     private void installFromPath(final Bundle bundle, final String path, final 
PathEntry configuration, final Node parent, final List<String> createdNodes, 
final DefaultContentCreator contentCreator) throws RepositoryException {
diff --git 
a/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoaderService.java
 
b/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoaderService.java
index d68d605..a9874aa 100644
--- 
a/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoaderService.java
+++ 
b/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoaderService.java
@@ -94,6 +94,9 @@ public class ContentLoaderService implements 
SynchronousBundleListener, BundleHe
     @Reference
     private ContentReaderWhiteboard contentReaderWhiteboard;
 
+    @Reference
+    private SlingSettingsService slingSettings;
+
     /**
      * The initial content loader which is called to load initial content up
      * into the repository when the providing bundle is installed.
@@ -222,7 +225,7 @@ public class ContentLoaderService implements 
SynchronousBundleListener, BundleHe
     @Activate
     protected synchronized void activate(BundleContext bundleContext) {
         this.slingId = this.settingsService.getSlingId();
-        this.bundleContentLoader = new BundleContentLoader(this, 
contentReaderWhiteboard);
+        this.bundleContentLoader = new BundleContentLoader(this, 
contentReaderWhiteboard, slingSettings.getRunModes());
 
         bundleContext.addBundleListener(this);
 
diff --git 
a/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java 
b/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java
index 38898ae..4bf7d78 100644
--- a/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java
+++ b/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java
@@ -93,6 +93,14 @@ public class PathEntry extends ImportOptions {
      */
     public static final String IGNORE_CONTENT_READERS_DIRECTIVE = 
"ignoreImportProviders";
 
+    /**
+     * If the content should be skipped with a particular runmode. By
+     * default this will be an empty string which means the content will be
+     * installed regardless of the runmode
+     * @since 2.4.0
+     */
+    public static final String SKIP_RUNMODE = "skipRunmode";
+
     private final boolean propertyMerge;
     
     private final boolean nodeMerge;
@@ -106,6 +114,9 @@ public class PathEntry extends ImportOptions {
     /** Should existing content properties be overwritten? */
     private final boolean overwriteProperties;
 
+    /** The content at the path will be skipped for this runmode */
+    private final String skipRunmode;
+
     /** Should existing content be uninstalled? */
     private final boolean uninstall;
 
@@ -233,6 +244,9 @@ public class PathEntry extends ImportOptions {
         }
 
         // workspace directive
+        this.skipRunmode = entry.getDirectiveValue(SKIP_RUNMODE);
+
+        // workspace directive
         final String workspaceValue = 
entry.getDirectiveValue(WORKSPACE_DIRECTIVE);
         if (pathValue != null) {
             this.workspace = workspaceValue;
@@ -293,6 +307,10 @@ public class PathEntry extends ImportOptions {
         return this.ignoreContentReaders.contains(extension);
     }
 
+    public String getSkipRunmode(){
+        return this.skipRunmode;
+    }
+
     public String getTarget() {
         return target;
     }
@@ -301,12 +319,10 @@ public class PathEntry extends ImportOptions {
         return workspace;
     }
 
-
     public boolean isPropertyMerge() {
         return this.propertyMerge;
     }
 
-
     public boolean isMerge() {
         return this.nodeMerge;
     }
diff --git 
a/src/test/java/org/apache/sling/jcr/contentloader/internal/BundleContentLoaderTest.java
 
b/src/test/java/org/apache/sling/jcr/contentloader/internal/BundleContentLoaderTest.java
index a985701..5004254 100644
--- 
a/src/test/java/org/apache/sling/jcr/contentloader/internal/BundleContentLoaderTest.java
+++ 
b/src/test/java/org/apache/sling/jcr/contentloader/internal/BundleContentLoaderTest.java
@@ -21,8 +21,11 @@ package org.apache.sling.jcr.contentloader.internal;
 import static java.util.Collections.singletonMap;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.nullValue;
 import static org.junit.Assert.assertThat;
 
+import java.util.Collections;
+
 import javax.jcr.Session;
 
 import org.apache.sling.api.resource.Resource;
@@ -60,7 +63,7 @@ public class BundleContentLoaderTest {
 
         ContentReaderWhiteboard whiteboard = 
context.getService(ContentReaderWhiteboard.class);
 
-        contentLoader = new BundleContentLoader(bundleHelper, whiteboard);
+        contentLoader = new BundleContentLoader(bundleHelper, whiteboard, 
Collections.singleton("seed"));
     }
 
 
@@ -77,6 +80,31 @@ public class BundleContentLoaderTest {
         assertThat("sling:resourceType was not properly set", 
imported.getResourceType(), equalTo("sling:Folder"));
     }
 
+
+    @Test
+    public void skippedRunmode() throws Exception {
+        Bundle mockBundle = 
newBundleWithInitialContent("SLING-INF/libs/app/skipped;path:=/libs/app/skipped;skipRunmode:=seed");
+        
contentLoader.registerBundle(context.resourceResolver().adaptTo(Session.class), 
mockBundle, false);
+        Resource imported = 
context.resourceResolver().getResource("/libs/app/skipped");
+        assertThat("Import should have been skipped", imported, nullValue());
+    }
+
+    @Test
+    public void passedRunmode() throws Exception {
+        Bundle mockBundle = 
newBundleWithInitialContent("SLING-INF/libs/app/passed;path:=/libs/app/passed;skipRunmode:=runtime");
+        
contentLoader.registerBundle(context.resourceResolver().adaptTo(Session.class), 
mockBundle, false);
+        Resource imported = 
context.resourceResolver().getResource("/libs/app/passed");
+        assertThat("Resource was not imported", imported, notNullValue());
+    }
+
+    @Test
+    public void emptyRunmode() throws Exception {
+        Bundle mockBundle = 
newBundleWithInitialContent("SLING-INF/libs/app/empty;path:=/libs/app/empty");
+        
contentLoader.registerBundle(context.resourceResolver().adaptTo(Session.class), 
mockBundle, false);
+        Resource imported = 
context.resourceResolver().getResource("/libs/app/empty");
+        assertThat("Resource was not imported", imported, notNullValue());
+    }
+
     @Test
     public void loadContentWithRootPath() throws Exception {
 

Reply via email to