private void cleanUpInstanceIdFolders()

in src/main/java/org/apache/sling/event/impl/jobs/tasks/CleanUpTask.java [395:458]


    private void cleanUpInstanceIdFolders(final TopologyCapabilities caps, final String assginedJobsPath) {
        final ResourceResolver resolver = this.configuration.createResourceResolver();
        if ( resolver == null ) {
            return;
        }
        try {
            final Resource baseResource = resolver.getResource(assginedJobsPath);
            // sanity check - should never be null
            if ( baseResource != null ) {
                final List<Resource> toDelete = new ArrayList<>();
                // iterate over children == instance id folders
                for(final Resource r : baseResource.getChildren()) {
                    if ( !caps.isActive() ) {
                        // shutdown, stop check
                        toDelete.clear();
                        break;
                    }
                    final String instanceId = r.getName();
                    if ( !caps.isActive(instanceId) ) {
                        // is the resource empty?
                        if ( !hasJobs(caps, r) ) {
                            // check for timestamp
                            final long timestamp = r.getValueMap().get(PROPERTY_LAST_CHECKED, -1L);
                            final long now = currentTimeMillis();
                            if ( timestamp > 0 && (timestamp + KEEP_DURATION <= now) ) {
                                toDelete.add(r);
                                if ( toDelete.size() == MAX_REMOVE_ID_FOLDERS ) {
                                    break;
                                }
                            } else if ( timestamp == -1 ) {
                                final ModifiableValueMap mvm = r.adaptTo(ModifiableValueMap.class);
                                if ( mvm != null ) {
                                    mvm.put(PROPERTY_LAST_CHECKED, now);
                                    resolver.commit();
                                }
                            }
                        } else {
                            // not empty, check if timestamp exists
                            if ( r.getValueMap().containsKey(PROPERTY_LAST_CHECKED) ) {
                                final ModifiableValueMap mvm = r.adaptTo(ModifiableValueMap.class);
                                if ( mvm != null ) {
                                    mvm.remove(PROPERTY_LAST_CHECKED);
                                    resolver.commit();
                                }
                            }
                        }
                    }
                }

                // remove obsolete nodes
                for(final Resource r : toDelete) {
                    if ( caps.isActive() ) {
                        resolver.delete(r);
                        resolver.commit();
                    }
                }
            }
        } catch (final PersistenceException e) {
            // in the case of an error, we just log this as a warning
            this.logger.warn("Exception during job resource tree cleanup.", e);
        } finally {
            resolver.close();
        }
    }