/* * RHQ Management Platform * Copyright (C) 2005-2011 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.alert.engine.model; import org.rhq.core.domain.alert.AlertConditionOperator; public class MeasurementRangeNumericCacheElement extends MeasurementNumericCacheElement { public MeasurementRangeNumericCacheElement(AlertConditionOperator operator, Double loValue, Double hiValue, int conditionTriggerId) { super(operator, loValue, conditionTriggerId); this.alertConditionOperatorOption = hiValue; } @Override public boolean matches(Double providedValue, Object... extraParams) { // this.alertConditionValue is the low value of the range // this.alertConditionOperationOption is the high value of the range // both must be specified, if either are null, return false (non-match) if (alertConditionValue == null || alertConditionValue.isNaN() || alertConditionValue.isInfinite()) { return false; } if (alertConditionOperatorOption == null) { return false; } if (providedValue == null || providedValue.isNaN() || providedValue.isInfinite()) { return false; } // there are two ways we can check the value compared to the range, each with either inclusivness or exclusivness. // inclusive means if value equals either the lo or hi, it is considered inside the range. // exclusive means if value equals either the lo or hi, it is NOT considered inside the range, it is outside the range // < - if the value is inside the range (i.e. between the low and high values), exclusive // > - if the value is outside the range (i.e. lower than the low value or higher than the high value), exclusive // <= - if the value is inside the range (i.e. between the low and high values), inclusive // >= - if the value is outside the range (i.e. lower than the low value or higher than the high value), inclusive // Example: // Given a value of 20, with a low-high range of 20...50. // < (inside, exclusive) - NO match - 20 is not considered inside the range but we are looking for values inside the range // > (outside, exclusive) - MATCH - 20 is not considered inside the range and we are looking for values outside the range // <= (inside, inclusive) - MATCH - 20 is considered inside the range and we are looking for values inside the range // >= (outside, inclusive) - NO match - 20 is considered inside the range but we are looking for values outside the range if (alertConditionOperator == AlertConditionOperator.LESS_THAN) { if ((providedValue.compareTo(this.alertConditionValue) > 0) && (providedValue.compareTo((Double) this.alertConditionOperatorOption) < 0)) { return true; } } else if (alertConditionOperator == AlertConditionOperator.GREATER_THAN) { if (!((providedValue.compareTo(this.alertConditionValue) > 0) && (providedValue .compareTo((Double) this.alertConditionOperatorOption) < 0))) { return true; } } else if (alertConditionOperator == AlertConditionOperator.LESS_THAN_OR_EQUAL_TO) { if ((providedValue.compareTo(this.alertConditionValue) >= 0) && (providedValue.compareTo((Double) this.alertConditionOperatorOption) <= 0)) { return true; } } else if (alertConditionOperator == AlertConditionOperator.GREATER_THAN_OR_EQUAL_TO) { if (!((providedValue.compareTo(this.alertConditionValue) >= 0) && (providedValue .compareTo((Double) this.alertConditionOperatorOption) <= 0))) { return true; } } return false; } @Override public AlertConditionOperator.Type getOperatorSupportsType(AlertConditionOperator operator) { if ((operator == AlertConditionOperator.GREATER_THAN) || (operator == AlertConditionOperator.LESS_THAN) || (operator == AlertConditionOperator.GREATER_THAN_OR_EQUAL_TO) || (operator == AlertConditionOperator.LESS_THAN_OR_EQUAL_TO)) { return operator.getDefaultType(); } return AlertConditionOperator.Type.NONE; } }