public void triggerOn()

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$
		}
	}