in application/org.openjdk.jmc.rjmx/src/main/java/org/openjdk/jmc/rjmx/triggers/internal/NotificationTrigger.java [217:303]
public void triggerOn(IConnectionHandle connectionHandle, TriggerRule rule, MRIValueEvent aspectEvent) {
if (aspectEvent.getValue() == null) {
// if we have no value we shouldn't trigger.
return;
}
Object eventValue = aspectEvent.getValue();
StateStore stateStore = getStateStoreForUID(connectionHandle.getServerDescriptor().getGUID());
if (eventValue instanceof Number) {
MRI mri = aspectEvent.getMRI();
IUnit unit = ExtendedMRIMetadataToolkit.getUnit(connectionHandle, mri);
if (unit != null) {
eventValue = unit.quantity((Number) eventValue);
}
}
boolean triggered;
try {
triggered = getValueEvaluator().triggerOn(eventValue);
} catch (Exception e) {
if (stateStore.m_lastTriggerErrorTimestamp == null || (aspectEvent.getTimestamp()
- stateStore.m_lastTriggerErrorTimestamp >= TRIGGER_ERROR_HANDLING_LIMIT_TIME_MS)) {
stateStore.m_lastTriggerErrorTimestamp = aspectEvent.getTimestamp();
handleException(connectionHandle, rule, e);
}
return;
}
if (stateStore.m_triggerState == STATE_START || getSustainTimeMillis() == 0) {
if (triggered) {
stateStore.m_triggerState = STATE_WAITING_SUSTAIN_HIGH;
} else {
stateStore.m_triggerState = STATE_WAITING_SUSTAIN_LOW;
}
stateStore.m_lastSwitchEventTimestamp = aspectEvent.getTimestamp();
}
switch (stateStore.m_triggerState) {
case STATE_WAITING_SUSTAIN_HIGH:
if (triggered) {
if ((stateStore.m_lastTriggeredState == STATE_TRIGGER_LOW
|| stateStore.m_lastTriggeredState == STATE_START)
&& aspectEvent.getTimestamp()
- stateStore.m_lastSwitchEventTimestamp.longValue() >= getSustainTimeMillis()) {
if (stateStore.m_lastTriggerEventTimestamp == null || (aspectEvent.getTimestamp()
- stateStore.m_lastTriggerEventTimestamp.longValue() >= getLimitTimeMillis())) {
doTrigger(STATE_TRIGGER_HIGH, connectionHandle, rule, aspectEvent,
(getTriggerOn() & TRIGGER_ON_RULE_TRIGGERED) > 0);
}
}
} else {
stateStore.m_lastSwitchEventTimestamp = aspectEvent.getTimestamp();
stateStore.m_triggerState = STATE_WAITING_SUSTAIN_LOW;
}
break;
case STATE_TRIGGER_HIGH:
if (!triggered) {
stateStore.m_lastSwitchEventTimestamp = aspectEvent.getTimestamp();
stateStore.m_triggerState = STATE_WAITING_SUSTAIN_LOW;
}
break;
case STATE_TRIGGER_LOW:
if (triggered) {
stateStore.m_lastSwitchEventTimestamp = aspectEvent.getTimestamp();
stateStore.m_triggerState = STATE_WAITING_SUSTAIN_HIGH;
}
break;
case STATE_WAITING_SUSTAIN_LOW:
if (!triggered) {
if (stateStore.m_lastTriggeredState == STATE_TRIGGER_HIGH && (aspectEvent.getTimestamp()
- stateStore.m_lastSwitchEventTimestamp.longValue() >= getSustainTimeMillis())) {
if (stateStore.m_lastTriggerEventTimestamp == null || (aspectEvent.getTimestamp()
- stateStore.m_lastTriggerEventTimestamp.longValue() >= getLimitTimeMillis())) {
doTrigger(STATE_TRIGGER_LOW, connectionHandle, rule, aspectEvent,
(getTriggerOn() & TRIGGER_ON_RULE_RECOVERED) > 0);
}
}
} else {
stateStore.m_lastSwitchEventTimestamp = aspectEvent.getTimestamp();
stateStore.m_triggerState = STATE_WAITING_SUSTAIN_HIGH;
}
break;
default:
throw new IllegalArgumentException("Trigger entered illegal state!"); //$NON-NLS-1$
}
}