You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2018/11/08 00:05:14 UTC

svn commit: r1846088 - in /jackrabbit/commons/filevault/trunk/vault-core/src: main/java/org/apache/jackrabbit/vault/packaging/registry/ main/java/org/apache/jackrabbit/vault/packaging/registry/impl/ test/java/org/apache/jackrabbit/vault/packaging/integ...

Author: tripod
Date: Thu Nov  8 00:05:14 2018
New Revision: 1846088

URL: http://svn.apache.org/viewvc?rev=1846088&view=rev
Log:
JCRVLT-319 Allow building of stacked ExecutionPlans (closes 36)

Modified:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/ExecutionPlanBuilder.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/ExecutionPlanBuilderImpl.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/FSPackageRegistry.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/package-info.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestExecutionPlan.java

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/ExecutionPlanBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/ExecutionPlanBuilder.java?rev=1846088&r1=1846087&r2=1846088&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/ExecutionPlanBuilder.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/ExecutionPlanBuilder.java Thu Nov  8 00:05:14 2018
@@ -19,12 +19,15 @@ package org.apache.jackrabbit.vault.pack
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.List;
+import java.util.Set;
 
 import javax.annotation.Nonnull;
 import javax.jcr.Session;
 
 import org.apache.jackrabbit.vault.fs.api.ProgressTrackerListener;
 import org.apache.jackrabbit.vault.packaging.PackageException;
+import org.apache.jackrabbit.vault.packaging.PackageId;
 import org.osgi.annotation.versioning.ProviderType;
 
 /**
@@ -84,6 +87,25 @@ public interface ExecutionPlanBuilder {
     @Nonnull
     ExecutionPlanBuilder with(@Nonnull ProgressTrackerListener listener);
 
+    
+    /**
+     * Sets packages handled externally ahead of execution for prevalidation of plan
+     * @param externalPackages Set of package ids handled by other builder
+     * @return this.
+     */
+    @Nonnull
+    ExecutionPlanBuilder with(@Nonnull Set<PackageId> externalPackages);
+
+    /**
+     * Triggers Validation and returns PackageIds of all packages to be installed
+     * by this builder
+     * @return Set of packages to be installed by this builder.
+     * @throws IOException if an I/O error occurrs.
+     * @throws PackageException if the plan is not valid.
+     */
+    @Nonnull
+    Set<PackageId> preview() throws IOException, PackageException;
+    
     /**
      * builds an executes the plan synchronously.
      * @return the execution plan.

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/ExecutionPlanBuilderImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/ExecutionPlanBuilderImpl.java?rev=1846088&r1=1846087&r2=1846088&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/ExecutionPlanBuilderImpl.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/ExecutionPlanBuilderImpl.java Thu Nov  8 00:05:14 2018
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -90,6 +91,8 @@ public class ExecutionPlanBuilderImpl im
 
     private ExecutionPlanImpl plan;
 
+    private Set<PackageId> externalPackages = Collections.emptySet();
+
     ExecutionPlanBuilderImpl(PackageRegistry registry) {
         this.registry = registry;
     }
@@ -233,7 +236,7 @@ public class ExecutionPlanBuilderImpl im
         packageTasks.addAll(removeTasks.values());
 
         for (PackageId id: installTasks.keySet().toArray(new PackageId[installTasks.size()])) {
-            resolveInstall(id, packageTasks, installTasks, new HashSet<PackageId>());
+            resolveInstall(id, packageTasks, installTasks, new HashSet<PackageId>(), installTasks.get(id).getType());
         }
 
         for (PackageTask task: packageTasks) {
@@ -244,7 +247,7 @@ public class ExecutionPlanBuilderImpl im
         return this;
     }
 
-    private void resolveInstall(PackageId id, List<PackageTask> packageTasks, Map<PackageId, PackageTask> installTasks, Set<PackageId> resolved) throws IOException, PackageException {
+    private void resolveInstall(PackageId id, List<PackageTask> packageTasks, Map<PackageId, PackageTask> installTasks, Set<PackageId> resolved, PackageTask.Type type) throws IOException, PackageException {
         if (resolved.contains(id)) {
             throw new CyclicDependencyException("Package has cyclic dependencies: " + id);
         }
@@ -264,18 +267,21 @@ public class ExecutionPlanBuilderImpl im
                     continue;
                 }
             }
-            resolveInstall(depId, packageTasks, installTasks, resolved);
+            resolveInstall(depId, packageTasks, installTasks, resolved, type);
         }
         PackageTask task = installTasks.get(id);
         if (task == PackageTaskImpl.MARKER) {
             // task was added during resolution
             return;
         }
-        if (task == null) {
-            // package is not registered in plan, but need to be installed due to dependency
-            task = new PackageTaskImpl(id, PackageTask.Type.INSTALL);
+        if (!externalPackages.contains(id)) {
+            if (task == null) {
+                // package is not registered in plan, but need to be installed
+                // due to dependency
+                task = new PackageTaskImpl(id, type);
+            }
+            packageTasks.add(task);
         }
-        packageTasks.add(task);
         // mark as processed
         installTasks.put(id, PackageTaskImpl.MARKER);
     }
@@ -345,4 +351,24 @@ public class ExecutionPlanBuilderImpl im
             return ExecutionPlanBuilderImpl.this;
         }
     }
+
+    @Override
+    public ExecutionPlanBuilder with(Set<PackageId> externalPackages) {
+        this.externalPackages = new HashSet<>(externalPackages);
+        return ExecutionPlanBuilderImpl.this;
+    }
+
+    @Override
+    public Set<PackageId> preview() throws IOException, PackageException {
+        validate();
+        if (plan.getTasks().size() == 0) {
+            return Collections.emptySet();
+        } else {
+            Set<PackageId> packages = new HashSet<>();
+            for(PackageTask task : plan.getTasks()) {
+                packages.add(task.getPackageId());
+            }
+            return packages;
+        }
+    }
 }
\ No newline at end of file

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/FSPackageRegistry.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/FSPackageRegistry.java?rev=1846088&r1=1846087&r2=1846088&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/FSPackageRegistry.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/FSPackageRegistry.java Thu Nov  8 00:05:14 2018
@@ -20,7 +20,6 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collection;
@@ -145,15 +144,11 @@ public class FSPackageRegistry extends A
 
     @Activate
     private void activate(BundleContext context, Config config) throws IOException {
-        Path homePath = Paths.get(config.homePath());
-        if (homePath.isAbsolute()) {
-            this.homeDir = homePath.toFile();
+        String repoHome = context.getProperty(REPOSITORY_HOME);
+        if (repoHome == null) {
+            this.homeDir = context.getDataFile(config.homePath());
         } else {
-            String repoHome = context.getProperty(REPOSITORY_HOME);
-            if (repoHome == null) {
-                throw new IOException("Can't lookup relative path when property repository.home is not set");
-            }
-            this.homeDir = new File(repoHome + "/" + homePath.toString());
+            this.homeDir = new File(repoHome + "/" + config.homePath());
             if (!homeDir.exists()) {
                 homeDir.mkdirs();
             }

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/package-info.java?rev=1846088&r1=1846087&r2=1846088&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/package-info.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/package-info.java Thu Nov  8 00:05:14 2018
@@ -14,5 +14,5 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@org.osgi.annotation.versioning.Version("1.2.0")
+@org.osgi.annotation.versioning.Version("1.3.0")
 package org.apache.jackrabbit.vault.packaging.registry;

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestExecutionPlan.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestExecutionPlan.java?rev=1846088&r1=1846087&r2=1846088&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestExecutionPlan.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestExecutionPlan.java Thu Nov  8 00:05:14 2018
@@ -20,6 +20,7 @@ package org.apache.jackrabbit.vault.pack
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.util.List;
 
 import org.apache.jackrabbit.vault.packaging.CyclicDependencyException;
 import org.apache.jackrabbit.vault.packaging.DependencyException;
@@ -322,5 +323,45 @@ public class TestExecutionPlan extends I
         assertTrue("package C is installed", registry.open(idC).isInstalled());
     }
 
+    @Test
+    public void testStackedExecutionPlans() throws IOException, PackageException {
+        PackageId idA = registry.register(getStream(TEST_PACKAGE_A_10), false);
+        PackageId idB = registry.register(getStream(TEST_PACKAGE_B_10), false);
+        PackageId idC = registry.register(getStream(TEST_PACKAGE_C_10), false);
+        
+        assertFalse("package A is not installed", registry.open(idA).isInstalled());
+        assertFalse("package B is not installed", registry.open(idB).isInstalled());
+        assertFalse("package C is not installed", registry.open(idC).isInstalled());
 
+        ExecutionPlanBuilder builder1 = registry.createExecutionPlan()
+                .addTask().with(idB).with(PackageTask.Type.EXTRACT)
+                .addTask().with(idC).with(PackageTask.Type.EXTRACT)
+                .with(admin)
+                .with(getDefaultOptions().getListener());
+        
+        
+        // create new executionPlanBuilder for package A
+        ExecutionPlanBuilder builder2 = registry.createExecutionPlan()
+                .addTask().with(idA).with(PackageTask.Type.EXTRACT)
+                .with(admin)
+                .with(getDefaultOptions().getListener());
+        assertEquals("builder2 contains all packageTasks", 3, builder2.preview().size());
+        
+        // If calculatedIds of builder1 are declared external idB & idC should be removed
+        builder2.with(builder1.preview());
+        assertEquals("builder2 only contains 1 PackageTask", 1, builder2.preview().size());
+        assertEquals("builder2 handles only idA", builder2.preview().iterator().next(), idA);
+        
+        ExecutionPlan plan = builder2.execute();
+        assertTrue("builder2 should fail before builder1 is executed.",plan.hasErrors());
+        
+        builder1.execute();
+        
+        // revalidate builder2 to reset error state (calculate implicitly validates)
+        assertEquals("builder2 only contains 1 PackageTask", 1, builder2.preview().size());
+        
+        ExecutionPlan plan2 = builder2.execute();
+        assertFalse("builder2 should succeed after builder1 has been executed.", plan2.hasErrors());
+        
+    }
 }
\ No newline at end of file