public void processRepository()

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.");
        }
    }