Skip to content

Commit

Permalink
Executing triggers according to their execution time (from oldest to …
Browse files Browse the repository at this point in the history
…most current).
  • Loading branch information
mederly committed Feb 9, 2017
1 parent afa61af commit 819173f
Showing 1 changed file with 16 additions and 9 deletions.
Expand Up @@ -29,6 +29,7 @@
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.result.OperationConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.MiscSchemaUtil;
Expand Down Expand Up @@ -180,26 +181,32 @@ private void fireTriggers(AbstractScannerResultHandler<ObjectType> handler, Pris
LOGGER.warn("Strange thing, attempt to fire triggers on {}, but it does not have any triggers in trigger container", object);
} else {
LOGGER.trace("Firing triggers for {} ({} triggers)", object, triggerCVals.size());
for (PrismContainerValue<TriggerType> triggerCVal: triggerCVals) {
TriggerType triggerType = triggerCVal.asContainerable();
XMLGregorianCalendar timestamp = triggerType.getTimestamp();
List<TriggerType> triggers = getSortedTriggers(triggerCVals);
for (TriggerType trigger: triggers) {
XMLGregorianCalendar timestamp = trigger.getTimestamp();
if (timestamp == null) {
LOGGER.warn("Trigger without a timestamp in {}", object);
} else {
if (isHot(handler, timestamp)) {
fireTrigger(triggerType, object, workerTask, coordinatorTask, result);
removeTrigger(object, triggerCVal, workerTask);
fireTrigger(trigger, object, workerTask, coordinatorTask, result);
removeTrigger(object, trigger.asPrismContainerValue(), workerTask, triggerContainer.getDefinition());
} else {
LOGGER.trace("Trigger {} is not hot (timestamp={}, thisScanTimestamp={}, lastScanTimestamp={})",
triggerType, timestamp,
handler.getThisScanTimestamp(), handler.getLastScanTimestamp());
trigger, timestamp, handler.getThisScanTimestamp(), handler.getLastScanTimestamp());
}
}
}
}
}
}

private List<TriggerType> getSortedTriggers(List<PrismContainerValue<TriggerType>> triggerCVals) {
List<TriggerType> rv = new ArrayList<>();
triggerCVals.forEach(cval -> rv.add(cval.clone().asContainerable()));
rv.sort(Comparator.comparingLong(t -> XmlTypeConverter.toMillis(t.getTimestamp())));
return rv;
}

/**
* Returns true if the timestamp is in the "range of interest" for this scan run.
*/
Expand Down Expand Up @@ -234,8 +241,8 @@ private void fireTrigger(TriggerType trigger, PrismObject<ObjectType> object, Ta
}
}

private void removeTrigger(PrismObject<ObjectType> object, PrismContainerValue<TriggerType> triggerCVal, Task task) {
PrismContainerDefinition<TriggerType> triggerContainerDef = triggerCVal.getParent().getDefinition();
private void removeTrigger(PrismObject<ObjectType> object, PrismContainerValue<TriggerType> triggerCVal, Task task,
PrismContainerDefinition<TriggerType> triggerContainerDef) {
ContainerDelta<TriggerType> triggerDelta = triggerContainerDef.createEmptyDelta(new ItemPath(F_TRIGGER));
triggerDelta.addValuesToDelete(triggerCVal.clone());
Collection<? extends ItemDelta> modifications = MiscSchemaUtil.createCollection(triggerDelta);
Expand Down

0 comments on commit 819173f

Please sign in to comment.