in src/main/java/org/apache/sling/jcr/packageinit/impl/ExecutionPlanRepoInitializer.java [128:174]
public void processRepository(SlingRepository slingRepository) throws Exception {
if (!executionPlans.isEmpty()) {
ServiceTracker<PackageRegistry, ?> st = new ServiceTracker<>(context, PackageRegistry.class, null);
try {
st.open();
logger.info("Waiting for PackageRegistry.");
PackageRegistry registry = (PackageRegistry) st.waitForService(0);
logger.info("PackageRegistry found - starting execution of execution plan");
ExecutionPlanBuilder builder = registry.createExecutionPlan();
@SuppressWarnings("deprecation")
Session session = slingRepository.loginAdministrative(null);
try (BufferedWriter writer = new BufferedWriter(new FileWriter(statusFile))) {
for (String plan : executionPlans) {
builder.load(new ByteArrayInputStream(plan.getBytes(StandardCharsets.UTF_8)));
builder.with(session);
ExecutionPlan xplan = builder.execute();
if (xplan.getTasks().size() > 0) {
if (xplan.hasErrors()) {
IllegalStateException ex = new IllegalStateException("Execution plan contained errors - cannot complete repository initialization.");
for (PackageTask task : xplan.getTasks()) {
if (PackageTask.State.ERROR.equals(task.getState())){
ex.addSuppressed(task.getError());
}
}
throw ex;
}
logger.info("Execution plan executed with {} entries", xplan.getTasks().size());
} else {
logger.info("No tasks found in execution plan - no additional packages installed.");
}
// save hashes to file for crosscheck on subsequent startup to avoid double processing
writer.write(String.valueOf(plan.hashCode()));
writer.newLine();
}
} finally {
session.logout();
}
} finally {
st.close();
}
} else {
logger.info("No execution plans configured - skipping init.");
}
}