This is an automated email from the ASF dual-hosted git repository.
kwin pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-packageinit.git
The following commit(s) were added to refs/heads/master by this push:
new 5e224d6 SLING-10202 prevent double execution of plans irrespective of
order (#5)
5e224d6 is described below
commit 5e224d601bc9fda181d6238c5ddc689c92df3c2e
Author: Konrad Windszus <[email protected]>
AuthorDate: Tue Mar 16 16:16:54 2021 +0100
SLING-10202 prevent double execution of plans irrespective of order (#5)
---
.../impl/ExecutionPlanRepoInitializer.java | 41 ++++++----------------
.../ExecutionPlanRepoInitializerTest.java | 5 ++-
2 files changed, 14 insertions(+), 32 deletions(-)
diff --git
a/src/main/java/org/apache/sling/jcr/packageinit/impl/ExecutionPlanRepoInitializer.java
b/src/main/java/org/apache/sling/jcr/packageinit/impl/ExecutionPlanRepoInitializer.java
index 828763c..3bc93cb 100644
---
a/src/main/java/org/apache/sling/jcr/packageinit/impl/ExecutionPlanRepoInitializer.java
+++
b/src/main/java/org/apache/sling/jcr/packageinit/impl/ExecutionPlanRepoInitializer.java
@@ -48,8 +48,10 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Iterator;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
@Component(service = {SlingRepositoryInitializer.class},
property = {"service.ranking:Integer=200"})
@@ -98,13 +100,13 @@ public class ExecutionPlanRepoInitializer implements
SlingRepositoryInitializer
}
if (statusFile.exists()) {
// in case statusFile already exists read all hashes
- List<Integer> executedHashes = new ArrayList<>();
+ Set<Integer> executedHashes = new HashSet<>();
try (BufferedReader br = new BufferedReader(new
FileReader(statusFile))) {
for (String line; (line = br.readLine()) != null;) {
executedHashes.add(Integer.parseInt(line));
}
}
- processCandidates(epCandidates, executedHashes);
+ this.executionPlans.addAll(filterCandidates(epCandidates,
executedHashes));
} else {
this.executionPlans.addAll(epCandidates);
}
@@ -112,36 +114,13 @@ public class ExecutionPlanRepoInitializer implements
SlingRepositoryInitializer
this.context = context;
}
- private void processCandidates(List<String> epCandidates, List<Integer>
executedHashes) {
- Iterator<String> candidateIt = epCandidates.iterator();
- Iterator<Integer> executedHashesIt = executedHashes.iterator();
- // iterate over candidates and crosscheck next found hash
- while (candidateIt.hasNext()) {
- String candidate = candidateIt.next();
- boolean foundDifference = false;
- if (!executedHashesIt.hasNext() || foundDifference) {
- // if no further hashes are present add candidate
- // (will iterate over rest and add rest)
- executionPlans.add(candidate);
- } else {
- // another hash was found & no difference
- Integer executedHash = executedHashesIt.next();
- if (isCandidateProcessed(candidate, executedHash)) {
- // already processed so no need to add - check
- // next plan
- continue;
- } else {
- executionPlans.add(candidate);
- String msg = "Found difference in hashed executionplans -
queueing executionplan for processing.";
- logger.info(msg);
- foundDifference = true;
- }
- }
- }
+ private static List<String> filterCandidates(List<String> epCandidates,
Set<Integer> executedHashes) {
+ // only add those candidates which have not been processed yet
+ return epCandidates.stream().filter(candidate ->
!isCandidateProcessed(candidate, executedHashes)).collect(Collectors.toList());
}
- private boolean isCandidateProcessed(String candidate, Integer
executedHash) {
- return executedHash.equals(Integer.valueOf(candidate.hashCode()));
+ private static boolean isCandidateProcessed(String candidate, Set<Integer>
executedHashes) {
+ return executedHashes.contains(Integer.valueOf(candidate.hashCode()));
}
@Override
diff --git
a/src/test/java/org/apache/sling/jcr/packageinit/ExecutionPlanRepoInitializerTest.java
b/src/test/java/org/apache/sling/jcr/packageinit/ExecutionPlanRepoInitializerTest.java
index 3627f52..36aa215 100644
---
a/src/test/java/org/apache/sling/jcr/packageinit/ExecutionPlanRepoInitializerTest.java
+++
b/src/test/java/org/apache/sling/jcr/packageinit/ExecutionPlanRepoInitializerTest.java
@@ -44,6 +44,7 @@ import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.ArrayUtils;
import org.apache.jackrabbit.vault.packaging.PackageException;
import org.apache.jackrabbit.vault.packaging.PackageId;
import org.apache.jackrabbit.vault.packaging.registry.ExecutionPlan;
@@ -193,7 +194,9 @@ public class ExecutionPlanRepoInitializerTest {
when(registry.createExecutionPlan()).thenReturn(builder2);
MockOsgi.deactivate(initializer, context.bundleContext());
- initializer = registerRepoInitializer(EXECUTIONSPLANS);
+ // 2nd time register in inverted order
+ initializer = registerRepoInitializer(new String[] { EXECUTIONPLAN_2,
EXECUTIONPLAN_1 });
+ cdl = new CountDownLatch(1);
processRepository(initializer, cdl, foundExceptions);
cdl.await(500, TimeUnit.MILLISECONDS);