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