/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.view.worker.trigger;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Combines multiple {@link ViewCycleTrigger} instances and applies rules to form an overall trigger result.
*/
public class CombinedViewCycleTrigger implements ViewCycleTrigger {
private static final Logger s_logger = LoggerFactory.getLogger(CombinedViewCycleTrigger.class);
private List<ViewCycleTrigger> _triggers = new ArrayList<ViewCycleTrigger>();
@Override
public ViewCycleTriggerResult query(long cycleTimeNanos) {
s_logger.debug("Querying triggers for cycle time {}", cycleTimeNanos);
// Use a 'not bothered' result as the base which neither prevents nor forces a cycle and indicates no future state change
ViewCycleTriggerResult mergedResult = new ViewCycleTriggerResult(ViewCycleEligibility.ELIGIBLE, ViewCycleType.DELTA, Long.MAX_VALUE);
for (ViewCycleTrigger trigger : _triggers) {
ViewCycleTriggerResult triggerResult = trigger.query(cycleTimeNanos);
s_logger.debug("Trigger {} returned result {}", trigger, triggerResult);
mergedResult = mergeTriggerResults(mergedResult, triggerResult);
}
return mergedResult;
}
@Override
public void cycleTriggered(long cycleTimeNanos, ViewCycleType cycleType) {
for (ViewCycleTrigger trigger : _triggers) {
trigger.cycleTriggered(cycleTimeNanos, cycleType);
}
}
//-------------------------------------------------------------------------
public void addTrigger(ViewCycleTrigger trigger) {
_triggers.add(trigger);
}
//-------------------------------------------------------------------------
private ViewCycleTriggerResult mergeTriggerResults(ViewCycleTriggerResult a, ViewCycleTriggerResult b) {
if (a == null) {
return b;
}
if (b == null) {
return a;
}
ViewCycleEligibility mergedCycleEligibility = ViewCycleEligibility.merge(a.getCycleEligibility(), b.getCycleEligibility());
ViewCycleType mergedCycleType = ViewCycleType.merge(a.getCycleType(), b.getCycleType());
Long mergedNextStateChangeNanos = mergeNextStateChangeNanos(a, b);
return new ViewCycleTriggerResult(mergedCycleEligibility, mergedCycleType, mergedNextStateChangeNanos);
}
private Long mergeNextStateChangeNanos(ViewCycleTriggerResult a, ViewCycleTriggerResult b) {
if (a.getNextStateChangeNanos() == null) {
return b.getNextStateChangeNanos();
}
if (b.getNextStateChangeNanos() == null) {
return a.getNextStateChangeNanos();
}
return Math.min(a.getNextStateChangeNanos(), b.getNextStateChangeNanos());
}
}