/* * RHQ Management Platform * Copyright (C) 2010 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, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * 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 and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.coregui.client.alert; import org.rhq.core.domain.alert.Alert; import org.rhq.core.domain.alert.AlertCondition; import org.rhq.core.domain.alert.AlertConditionCategory; import org.rhq.core.domain.alert.AlertConditionOperator; import org.rhq.core.domain.alert.AlertDefinition; import org.rhq.core.domain.measurement.MeasurementUnits; import org.rhq.core.domain.measurement.composite.MeasurementNumericValueAndUnits; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.Messages; import org.rhq.coregui.client.util.MeasurementConverterClient; /** * The methods in this class are ported from AlertDefUtil from portal-war and MeasurementFormatter from * server-jar. * * @author Ian Springer * @author John Mazzitelli */ public class AlertFormatUtility { static Messages MSG = CoreGUI.getMessages(); private AlertFormatUtility() { } public static String formatAlertConditionForDisplay(AlertCondition condition) { StringBuilder str = new StringBuilder(); AlertConditionCategory category = condition.getCategory(); switch (category) { case AVAILABILITY: { str.append(MSG.common_title_availability()); str.append(" ["); AlertConditionOperator operator = AlertConditionOperator.valueOf(condition.getName().toUpperCase()); switch (operator) { case AVAIL_GOES_DISABLED: str.append(MSG.view_alert_definition_condition_editor_operator_availability_goesDisabled()); break; case AVAIL_GOES_DOWN: str.append(MSG.view_alert_definition_condition_editor_operator_availability_goesDown()); break; case AVAIL_GOES_UNKNOWN: str.append(MSG.view_alert_definition_condition_editor_operator_availability_goesUnknown()); break; case AVAIL_GOES_UP: str.append(MSG.view_alert_definition_condition_editor_operator_availability_goesUp()); break; case AVAIL_GOES_NOT_UP: str.append(MSG.view_alert_definition_condition_editor_operator_availability_goesNotUp()); break; default: str.append("*ERROR*"); } str.append("]"); break; } case AVAIL_DURATION: { str.append(MSG.view_alert_definition_condition_editor_availabilityDuration()); str.append(" ["); AlertConditionOperator operator = AlertConditionOperator.valueOf(condition.getName().toUpperCase()); switch (operator) { case AVAIL_DURATION_DOWN: str.append(MSG.view_alert_definition_condition_editor_operator_availability_durationDown()); break; case AVAIL_DURATION_NOT_UP: str.append(MSG.view_alert_definition_condition_editor_operator_availability_durationNotUp()); break; default: str.append("*ERROR*"); } str.append(" For "); long longValue = Long.valueOf(condition.getOption()); MeasurementNumericValueAndUnits valueWithUnits; if (longValue % 3600 == 0) { if (longValue == 3600) { valueWithUnits = new MeasurementNumericValueAndUnits(1.0d, MeasurementUnits.HOURS); } else { valueWithUnits = MeasurementConverterClient.fit((double) longValue, MeasurementUnits.SECONDS, MeasurementUnits.HOURS, MeasurementUnits.HOURS); } } else if (longValue == 60) { valueWithUnits = new MeasurementNumericValueAndUnits(1.0d, MeasurementUnits.MINUTES); } else { valueWithUnits = MeasurementConverterClient.fit((double) longValue, MeasurementUnits.SECONDS, MeasurementUnits.MINUTES, MeasurementUnits.MINUTES); } String formatted = MeasurementConverterClient.format(String.valueOf(valueWithUnits.getValue()), valueWithUnits.getUnits()); str.append(formatted); str.append("]"); break; } case THRESHOLD: { double value = condition.getThreshold(); MeasurementUnits units = condition.getMeasurementDefinition().getUnits(); String formatted = MeasurementConverterClient.format(value, units, true); if (condition.getOption() == null) { str.append(MSG.view_alert_common_tab_conditions_type_metric_threshold()); str.append(" ["); str.append(condition.getName()); str.append(" "); str.append(condition.getComparator()); str.append(" "); str.append(formatted); str.append("]"); } else { // this is a calltime threshold condition str.append(MSG.view_alert_common_tab_conditions_type_metric_calltime_threshold()); str.append(" ["); if (condition.getMeasurementDefinition() != null) { str.append(condition.getMeasurementDefinition().getDisplayName()); str.append(" "); } str.append(condition.getOption()); // MIN, MAX, AVG (never null) str.append(" "); str.append(condition.getComparator()); // <, >, = str.append(" "); str.append(formatted); str.append("]"); if (condition.getName() != null && condition.getName().length() > 0) { str.append(" "); str.append(MSG.view_alert_common_tab_conditions_type_metric_calltime_destination()); str.append(" '"); str.append(condition.getName()); str.append("'"); } } break; } case BASELINE: { str.append(MSG.view_alert_common_tab_conditions_type_metric_baseline()); str.append(" ["); str.append(condition.getName()); str.append(" "); str.append(condition.getComparator()); str.append(" "); double value = condition.getThreshold(); MeasurementUnits units = MeasurementUnits.PERCENTAGE; String formatted = MeasurementConverterClient.format(value, units, true); str.append(formatted); str.append(" ").append(MSG.view_alert_common_tab_conditions_type_metric_baseline_verb()).append(" "); str.append(condition.getOption()); str.append("]"); break; } case CHANGE: { if (condition.getOption() == null) { str.append(MSG.view_alert_common_tab_conditions_type_metric_change()); str.append(" ["); str.append(condition.getName()); str.append("]"); } else { // this is a calltime change condition str.append(MSG.view_alert_common_tab_conditions_type_metric_calltime_change()); str.append(" ["); if (condition.getMeasurementDefinition() != null) { str.append(condition.getMeasurementDefinition().getDisplayName()); str.append(" "); } str.append(condition.getOption()); // MIN, MAX, AVG (never null) str.append(" "); str.append(getCalltimeChangeComparator(condition.getComparator())); // LO, HI, CH str.append(" "); str.append(MSG.view_alert_common_tab_conditions_type_metric_calltime_change_verb()); str.append(" "); double value = condition.getThreshold(); MeasurementUnits units = MeasurementUnits.PERCENTAGE; String formatted = MeasurementConverterClient.format(value, units, true); str.append(formatted); str.append("]"); if (condition.getName() != null && condition.getName().length() > 0) { str.append(" "); str.append(MSG.view_alert_common_tab_conditions_type_metric_calltime_destination()); str.append(" '"); str.append(condition.getName()); str.append("'"); } } break; } case TRAIT: { str.append(MSG.view_alert_common_tab_conditions_type_metric_trait_change()); str.append(" ["); str.append(condition.getName()); str.append("]"); if (condition.getOption() != null && condition.getOption().length() > 0) { str.append(" "); str.append(MSG.view_alert_common_tab_conditions_type_metric_trait_matching()); str.append(" '"); str.append(condition.getOption()); str.append("'"); } break; } case CONTROL: { str.append(MSG.view_alert_common_tab_conditions_type_operation()); str.append(" ["); str.append(condition.getName()); str.append("] "); str.append(MSG.view_alert_common_tab_conditions_type_operation_status()); str.append(" ["); str.append(condition.getOption()); str.append("]"); break; } case RESOURCE_CONFIG: { str.append(MSG.view_alert_common_tab_conditions_type_resource_configuration()); break; } case EVENT: { str.append(MSG.view_alert_common_tab_conditions_type_event()); str.append(" ["); str.append(condition.getName()); str.append("]"); if (condition.getOption() != null && condition.getOption().length() > 0) { String eventDetailsRegexValue = "", eventSourcePathRegexValue = ""; if (condition.getOption().contains(AlertCondition.ADHOC_SEPARATOR)) { String[] regexes = condition.getOption().split(AlertCondition.ADHOC_SEPARATOR); if (regexes.length > 0) { eventDetailsRegexValue = regexes[0]; if (regexes.length > 1) { eventSourcePathRegexValue = regexes[1]; } } } else { eventDetailsRegexValue = condition.getOption(); // old approach -> probably working with db before rhq 4.13 } if (!eventSourcePathRegexValue.isEmpty()) { str.append(" "); str.append(MSG.view_alert_common_tab_conditions_type_event_matching()); str.append(" '"); str.append(eventSourcePathRegexValue); str.append("'"); } if (!eventDetailsRegexValue.isEmpty()) { str.append(" "); str.append(MSG.view_alert_common_tab_conditions_type_event_details_matching()); str.append(" '"); str.append(eventDetailsRegexValue); str.append("'"); } } break; } case DRIFT: { String configNameRegex = condition.getName(); String pathNameRegex = condition.getOption(); if (configNameRegex == null || configNameRegex.length() == 0) { if (pathNameRegex == null || pathNameRegex.length() == 0) { // neither a config name regex nor path regex was specified str.append(MSG.view_alert_common_tab_conditions_type_drift()); } else { // a path name regex was specified, but not a config name regex str.append(MSG.view_alert_common_tab_conditions_type_drift_onlypaths(pathNameRegex)); } } else { if (pathNameRegex == null || pathNameRegex.length() == 0) { // a config name regex was specified, but not a path name regex str.append(MSG.view_alert_common_tab_conditions_type_drift_onlyconfig(configNameRegex)); } else { // both a config name regex and a path regex was specified str.append(MSG.view_alert_common_tab_conditions_type_drift_configpaths(pathNameRegex, configNameRegex)); } } break; } case RANGE: { String metricName = condition.getName(); MeasurementUnits units = condition.getMeasurementDefinition().getUnits(); double loValue = condition.getThreshold(); String formattedLoValue = MeasurementConverterClient.format(loValue, units, true); String formattedHiValue = condition.getOption(); try { double hiValue = Double.parseDouble(formattedHiValue); formattedHiValue = MeasurementConverterClient.format(hiValue, units, true); } catch (Exception e) { formattedHiValue = "?[" + formattedHiValue + "]?"; // signify something is wrong with the value } // < means "inside the range", > means "outside the range" - exclusive // <= means "inside the range", >= means "outside the range" - inclusive if (condition.getComparator().equals("<")) { str.append(MSG.view_alert_common_tab_conditions_type_metric_range_inside_exclusive(metricName, formattedLoValue, formattedHiValue)); } else if (condition.getComparator().equals(">")) { str.append(MSG.view_alert_common_tab_conditions_type_metric_range_outside_exclusive(metricName, formattedLoValue, formattedHiValue)); } else if (condition.getComparator().equals("<=")) { str.append(MSG.view_alert_common_tab_conditions_type_metric_range_inside_inclusive(metricName, formattedLoValue, formattedHiValue)); } else if (condition.getComparator().equals(">=")) { str.append(MSG.view_alert_common_tab_conditions_type_metric_range_outside_inclusive(metricName, formattedLoValue, formattedHiValue)); } else { str.append("BAD COMPARATOR! Report this bug: " + condition.getComparator()); } break; } default: { str.append(MSG.view_alert_common_tab_invalid_condition_category(category.name())); break; } } return str.toString(); } private static String getCalltimeChangeComparator(String comparator) { if ("HI".equals(comparator)) { return MSG.view_alert_common_tab_conditions_type_metric_calltime_delta_grows(); } else if ("LO".equals(comparator)) { return MSG.view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks(); } else { // CH return MSG.view_alert_common_tab_conditions_type_metric_calltime_delta_other(); } } public static String getAlertRecoveryInfo(Alert alert) { String recoveryInfo; AlertDefinition recoveryAlertDefinition = alert.getRecoveryAlertDefinition(); if (recoveryAlertDefinition != null && recoveryAlertDefinition.getId() != 0) { int resourceId = alert.getAlertDefinition().getResource().getId(); String otherAlertDef = "<a href=\"/alerts/Config.do?mode=viewRoles&id=" + resourceId + "&ad=" + recoveryAlertDefinition.getId() + "\">" + recoveryAlertDefinition.getName() + "</a>"; recoveryInfo = MSG.view_alert_common_tab_conditions_recovery_enabled(otherAlertDef); } else if (alert.getWillRecover()) { recoveryInfo = MSG.view_alert_common_tab_conditions_recovery_disabled(); } else { recoveryInfo = MSG.common_val_na(); } return recoveryInfo; } }