private void handleAddOrUpdate()

in src/main/java/org/apache/sling/event/impl/jobs/scheduling/ScheduledJobHandler.java [413:456]


    private void handleAddOrUpdate(final Map<String, Holder> newScheduledJobs, final Resource rsrc) {
        final String id = ResourceHelper.filterName(rsrc.getName());
        final Holder scheduled = this.scheduledJobs.remove(id);
        boolean read = false;
        if ( scheduled != null ) {
            // check if loading failed and we can retry
            if ( scheduled.info == null || scheduled.read < this.lastBundleActivity.get() ) {
                read = true;
            }
            // check if this is an update
            if ( scheduled.info != null ) {
                final ValueMap vm = ResourceUtil.getValueMap(rsrc);
                final Calendar changed = (Calendar) vm.get(Job.PROPERTY_JOB_CREATED);
                if ( changed != null && scheduled.created.compareTo(changed) < 0 ) {
                    read = true;
                }
            }
            if ( !read ) {
                // nothing changes
                newScheduledJobs.put(id, scheduled);
            }
        } else {
            read = true;
        }
        if ( read ) {
            // read
            final Holder holder = new Holder();
            holder.read = System.currentTimeMillis();

            final Map<String, Object> properties = this.readScheduledJob(rsrc);
            if ( properties != null ) {
                holder.created = (Calendar) properties.get(Job.PROPERTY_JOB_CREATED);
                holder.info = this.addOrUpdateScheduledJob(properties, scheduled != null ? scheduled.info : null);
            }
            newScheduledJobs.put(id, holder);

            if ( holder.info == null && scheduled != null && scheduled.info != null ) {
                this.jobScheduler.unscheduleJob(scheduled.info);
            }
            if ( holder.info != null ) {
                this.jobScheduler.scheduleJob(holder.info);
            }
        }
    }