/* * RHQ Management Platform * Copyright (C) 2005-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.definitions; import java.util.LinkedHashMap; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.SelectItem; import com.smartgwt.client.widgets.form.fields.SpinnerItem; import com.smartgwt.client.widgets.form.fields.StaticTextItem; import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; import com.smartgwt.client.widgets.form.fields.events.ItemHoverEvent; import com.smartgwt.client.widgets.form.fields.events.ItemHoverHandler; import org.rhq.core.domain.alert.AlertDampening; import org.rhq.core.domain.alert.AlertDampening.Category; import org.rhq.core.domain.alert.AlertDampening.TimeUnits; import org.rhq.core.domain.alert.AlertDefinition; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.Messages; /** * @author John Mazzitelli */ public class DampeningAlertDefinitionForm extends DynamicForm implements EditAlertDefinitionForm { protected Messages MSG = CoreGUI.getMessages(); private AlertDefinition alertDefinition; private boolean formBuilt = false; private SelectItem dampeningRuleSelection; private StaticTextItem dampeningRuleStatic; private SpinnerItem consecutiveOccurrencesSpinner; private StaticTextItem consecutiveOccurrencesStatic; private SpinnerItem partialOccurrencesSpinner; private StaticTextItem partialOccurrencesStatic; private SpinnerItem partialEvaluationsSpinner; private StaticTextItem partialEvaluationsStatic; private SpinnerItem durationOccurrencesSpinner; private StaticTextItem durationOccurrencesStatic; private SpinnerItem durationTimePeriodSpinner; private StaticTextItem durationTimePeriodStatic; private SelectItem durationTimeUnitsSelection; private StaticTextItem durationTimeUnitsStatic; private boolean updated; public DampeningAlertDefinitionForm() { this(null); } public DampeningAlertDefinitionForm(AlertDefinition alertDefinition) { super(); this.alertDefinition = alertDefinition; this.updated = false; } @Override protected void onInit() { super.onInit(); if (!formBuilt) { buildForm(); setAlertDefinition(alertDefinition); makeViewOnly(); } } @Override public AlertDefinition getAlertDefinition() { return alertDefinition; } @Override public void setAlertDefinition(AlertDefinition alertDef) { alertDefinition = alertDef; buildForm(); if (alertDef == null) { clearFormValues(); } else { clearFormValues(); AlertDampening alertDampening = alertDef.getAlertDampening(); if (alertDampening == null) { alertDampening = new AlertDampening(AlertDampening.Category.NONE); alertDefinition.setAlertDampening(alertDampening); } Category category = alertDampening.getCategory(); dampeningRuleSelection.setValue(category.name()); dampeningRuleStatic.setValue(getCategoryTitle(category)); dampeningRuleStatic.setTooltip(getCategoryHelp(category.name())); switch (category) { case NONE: { break; } case CONSECUTIVE_COUNT: { consecutiveOccurrencesSpinner.setValue(alertDampening.getValue()); consecutiveOccurrencesStatic.setValue(alertDampening.getValue()); break; } case PARTIAL_COUNT: { partialOccurrencesSpinner.setValue(alertDampening.getValue()); partialOccurrencesStatic.setValue(alertDampening.getValue()); partialEvaluationsSpinner.setValue(alertDampening.getPeriod()); partialEvaluationsStatic.setValue(alertDampening.getPeriod()); break; } case DURATION_COUNT: { durationOccurrencesSpinner.setValue(alertDampening.getValue()); durationOccurrencesStatic.setValue(alertDampening.getValue()); durationTimePeriodSpinner.setValue(alertDampening.getPeriod()); durationTimePeriodStatic.setValue(alertDampening.getPeriod()); durationTimeUnitsSelection.setValue(alertDampening.getPeriodUnits().name()); durationTimeUnitsStatic.setValue(getTimeUnitsTitle(alertDampening.getPeriodUnits())); break; } default: { throw new IllegalStateException(MSG.view_alert_common_tab_invalid_dampening_category(category.name())); // should never happen } } } markForRedraw(); } @Override public void makeEditable() { dampeningRuleSelection.show(); dampeningRuleStatic.hide(); AlertDampening.Category cat = AlertDampening.Category.valueOf(dampeningRuleSelection.getValue().toString()); switch (cat) { case NONE: { consecutiveOccurrencesSpinner.hide(); consecutiveOccurrencesStatic.hide(); partialOccurrencesSpinner.hide(); partialOccurrencesStatic.hide(); partialEvaluationsSpinner.hide(); partialEvaluationsStatic.hide(); durationOccurrencesSpinner.hide(); durationOccurrencesStatic.hide(); durationTimePeriodSpinner.hide(); durationTimePeriodStatic.hide(); durationTimeUnitsSelection.hide(); durationTimeUnitsStatic.hide(); break; } case CONSECUTIVE_COUNT: { consecutiveOccurrencesSpinner.show(); consecutiveOccurrencesStatic.hide(); partialOccurrencesSpinner.hide(); partialOccurrencesStatic.hide(); partialEvaluationsSpinner.hide(); partialEvaluationsStatic.hide(); durationOccurrencesSpinner.hide(); durationOccurrencesStatic.hide(); durationTimePeriodSpinner.hide(); durationTimePeriodStatic.hide(); durationTimeUnitsSelection.hide(); durationTimeUnitsStatic.hide(); break; } case PARTIAL_COUNT: { partialOccurrencesSpinner.show(); partialOccurrencesStatic.hide(); partialEvaluationsSpinner.show(); partialEvaluationsStatic.hide(); consecutiveOccurrencesSpinner.hide(); consecutiveOccurrencesStatic.hide(); durationOccurrencesSpinner.hide(); durationOccurrencesStatic.hide(); durationTimePeriodSpinner.hide(); durationTimePeriodStatic.hide(); durationTimeUnitsSelection.hide(); durationTimeUnitsStatic.hide(); break; } case DURATION_COUNT: { durationOccurrencesSpinner.show(); durationOccurrencesStatic.hide(); durationTimePeriodSpinner.show(); durationTimePeriodStatic.hide(); durationTimeUnitsSelection.show(); durationTimeUnitsStatic.hide(); consecutiveOccurrencesSpinner.hide(); consecutiveOccurrencesStatic.hide(); partialOccurrencesSpinner.hide(); partialOccurrencesStatic.hide(); partialEvaluationsSpinner.hide(); partialEvaluationsStatic.hide(); break; } default: { throw new IllegalStateException(MSG.view_alert_common_tab_invalid_dampening_category(cat.name())); // should never happen } } markForRedraw(); } @Override public void makeViewOnly() { updated = false; dampeningRuleSelection.hide(); dampeningRuleStatic.show(); AlertDampening.Category cat = AlertDampening.Category.valueOf(dampeningRuleSelection.getValue().toString()); switch (cat) { case NONE: { consecutiveOccurrencesSpinner.hide(); consecutiveOccurrencesStatic.hide(); partialOccurrencesSpinner.hide(); partialOccurrencesStatic.hide(); partialEvaluationsSpinner.hide(); partialEvaluationsStatic.hide(); durationOccurrencesSpinner.hide(); durationOccurrencesStatic.hide(); durationTimePeriodSpinner.hide(); durationTimePeriodStatic.hide(); durationTimeUnitsSelection.hide(); durationTimeUnitsStatic.hide(); break; } case CONSECUTIVE_COUNT: { consecutiveOccurrencesSpinner.hide(); consecutiveOccurrencesStatic.show(); partialOccurrencesSpinner.hide(); partialOccurrencesStatic.hide(); partialEvaluationsSpinner.hide(); partialEvaluationsStatic.hide(); durationOccurrencesSpinner.hide(); durationOccurrencesStatic.hide(); durationTimePeriodSpinner.hide(); durationTimePeriodStatic.hide(); durationTimeUnitsSelection.hide(); durationTimeUnitsStatic.hide(); break; } case PARTIAL_COUNT: { partialOccurrencesSpinner.hide(); partialOccurrencesStatic.show(); partialEvaluationsSpinner.hide(); partialEvaluationsStatic.show(); consecutiveOccurrencesSpinner.hide(); consecutiveOccurrencesStatic.hide(); durationOccurrencesSpinner.hide(); durationOccurrencesStatic.hide(); durationTimePeriodSpinner.hide(); durationTimePeriodStatic.hide(); durationTimeUnitsSelection.hide(); durationTimeUnitsStatic.hide(); break; } case DURATION_COUNT: { durationOccurrencesSpinner.hide(); durationOccurrencesStatic.show(); durationTimePeriodSpinner.hide(); durationTimePeriodStatic.show(); durationTimeUnitsSelection.hide(); durationTimeUnitsStatic.show(); consecutiveOccurrencesSpinner.hide(); consecutiveOccurrencesStatic.hide(); partialOccurrencesSpinner.hide(); partialOccurrencesStatic.hide(); partialEvaluationsSpinner.hide(); partialEvaluationsStatic.hide(); break; } default: { throw new IllegalStateException(MSG.view_alert_common_tab_invalid_dampening_category(cat.name())); // should never happen } } markForRedraw(); } @Override public void saveAlertDefinition() { updated = false; AlertDampening.Category cat = AlertDampening.Category.valueOf(dampeningRuleSelection.getValue().toString()); AlertDampening alertDampening = new AlertDampening(cat); switch (cat) { case NONE: { // each time condition set is true alertDampening.setValue(0); alertDampening.setValueUnits(null); alertDampening.setPeriod(0); alertDampening.setPeriodUnits(null); break; } case CONSECUTIVE_COUNT: { // once every N times condition set is true consecutively alertDampening.setValue(Integer.valueOf(consecutiveOccurrencesSpinner.getValue().toString())); alertDampening.setValueUnits(null); alertDampening.setPeriod(0); alertDampening.setPeriodUnits(null); break; } case PARTIAL_COUNT: { // once every N times condition set is true during the last M evaluations alertDampening.setValue(Integer.valueOf(partialOccurrencesSpinner.getValue().toString())); alertDampening.setValueUnits(null); alertDampening.setPeriod(Integer.valueOf(partialEvaluationsSpinner.getValue().toString())); alertDampening.setPeriodUnits(null); break; } case DURATION_COUNT: { // once every N times condition set is true within a time period of M {mins, hours, days, weeks} alertDampening.setValue(Integer.valueOf(durationOccurrencesSpinner.getValue().toString())); alertDampening.setValueUnits(null); alertDampening.setPeriod(Integer.valueOf(durationTimePeriodSpinner.getValue().toString())); alertDampening.setPeriodUnits(TimeUnits.valueOf(durationTimeUnitsSelection.getValue().toString())); break; } default: { throw new IllegalStateException(MSG.view_alert_common_tab_invalid_dampening_category(cat.name())); // should never happen } } alertDefinition.setAlertDampening(alertDampening); } @Override public void clearFormValues() { dampeningRuleSelection.clearValue(); consecutiveOccurrencesSpinner.clearValue(); partialOccurrencesSpinner.clearValue(); partialEvaluationsSpinner.clearValue(); durationOccurrencesSpinner.clearValue(); durationTimePeriodSpinner.clearValue(); durationTimeUnitsSelection.clearValue(); dampeningRuleStatic.clearValue(); consecutiveOccurrencesStatic.clearValue(); partialOccurrencesStatic.clearValue(); partialEvaluationsStatic.clearValue(); durationOccurrencesStatic.clearValue(); durationTimePeriodStatic.clearValue(); durationTimeUnitsStatic.clearValue(); markForRedraw(); } @Override public boolean isResetMatching() { return updated; } private void buildForm() { if (!formBuilt) { dampeningRuleSelection = new SelectItem("dampeningRule", MSG.view_alert_common_tab_dampening()); LinkedHashMap<String, String> rules = new LinkedHashMap<String, String>(4); rules.put(AlertDampening.Category.NONE.name(), getCategoryTitle(AlertDampening.Category.NONE)); rules.put(AlertDampening.Category.CONSECUTIVE_COUNT.name(), getCategoryTitle(AlertDampening.Category.CONSECUTIVE_COUNT)); rules.put(AlertDampening.Category.PARTIAL_COUNT.name(), getCategoryTitle(AlertDampening.Category.PARTIAL_COUNT)); rules.put(AlertDampening.Category.DURATION_COUNT.name(), getCategoryTitle(AlertDampening.Category.DURATION_COUNT)); dampeningRuleSelection.setValueMap(rules); dampeningRuleSelection.setDefaultValue(AlertDampening.Category.NONE.name()); dampeningRuleSelection.setWrapTitle(false); dampeningRuleSelection.setRedrawOnChange(true); dampeningRuleSelection.setHoverWidth(300); dampeningRuleSelection.addItemHoverHandler(new ItemHoverHandler() { @Override public void onItemHover(ItemHoverEvent event) { String selection = dampeningRuleSelection.getValue().toString(); dampeningRuleSelection.setTooltip(getCategoryHelp(selection)); } }); dampeningRuleStatic = new StaticTextItem("dampeningRuleStatic", MSG.view_alert_common_tab_dampening()); dampeningRuleStatic.setWrapTitle(false); dampeningRuleStatic.setHoverWidth(300); // NONE // nothing to do - the none category has no ui components to render // CONSECUTIVE_COUNT consecutiveOccurrencesSpinner = new SpinnerItem("consecutiveOccurrencesSpinner", MSG.view_alert_common_tab_dampening_consecutive_occurrences_label()); consecutiveOccurrencesSpinner.setWrapTitle(false); consecutiveOccurrencesSpinner.setMin(1); consecutiveOccurrencesSpinner.setMax(999999); consecutiveOccurrencesSpinner.setStep(1); consecutiveOccurrencesSpinner.setDefaultValue(1); consecutiveOccurrencesSpinner.setHoverWidth(300); consecutiveOccurrencesSpinner.setTooltip(MSG .view_alert_common_tab_dampening_consecutive_occurrences_label_tooltip()); consecutiveOccurrencesStatic = new StaticTextItem("consecutiveOccurrencesStatic", MSG.view_alert_common_tab_dampening_consecutive_occurrences_label()); consecutiveOccurrencesStatic.setWrapTitle(false); consecutiveOccurrencesSpinner.addChangedHandler(new ChangedHandler() { public void onChanged(ChangedEvent event) { updated = true; } }); // PARTIAL_COUNT partialOccurrencesSpinner = new SpinnerItem("partialOccurrencesSpinner", MSG.view_alert_common_tab_dampening_partial_occurrences_label()); partialOccurrencesSpinner.setWrapTitle(false); partialOccurrencesSpinner.setMin(1); partialOccurrencesSpinner.setMax(999999); partialOccurrencesSpinner.setStep(1); partialOccurrencesSpinner.setDefaultValue(1); partialOccurrencesSpinner.setHoverWidth(300); partialOccurrencesSpinner.setTooltip(MSG .view_alert_common_tab_dampening_partial_occurrences_label_tooltip()); partialOccurrencesStatic = new StaticTextItem("partialOccurrencesStatic", MSG.view_alert_common_tab_dampening_partial_occurrences_label()); partialOccurrencesStatic.setWrapTitle(false); partialOccurrencesSpinner.addChangedHandler(new ChangedHandler() { public void onChanged(ChangedEvent event) { updated = true; } }); partialEvaluationsSpinner = new SpinnerItem("partialEvaluationsSpinner", MSG.view_alert_common_tab_dampening_partial_evalatuions_label()); partialEvaluationsSpinner.setWrapTitle(false); partialEvaluationsSpinner.setMin(1); partialEvaluationsSpinner.setMax(999999); partialEvaluationsSpinner.setStep(1); partialEvaluationsSpinner.setDefaultValue(1); partialEvaluationsSpinner.setHoverWidth(300); partialEvaluationsSpinner.setTooltip(MSG .view_alert_common_tab_dampening_partial_evalatuions_label_tooltip()); partialEvaluationsStatic = new StaticTextItem("partialEvaluationStatic", MSG.view_alert_common_tab_dampening_partial_evalatuions_label()); partialEvaluationsStatic.setWrapTitle(false); partialEvaluationsSpinner.addChangedHandler(new ChangedHandler() { public void onChanged(ChangedEvent event) { updated = true; } }); // DURATION_COUNT durationOccurrencesSpinner = new SpinnerItem("durationOccurrencesSpinner", MSG.view_alert_common_tab_dampening_duration_occurrences_label()); durationOccurrencesSpinner.setWrapTitle(false); durationOccurrencesSpinner.setMin(1); durationOccurrencesSpinner.setMax(999999); durationOccurrencesSpinner.setStep(1); durationOccurrencesSpinner.setDefaultValue(1); durationOccurrencesSpinner.setHoverWidth(300); durationOccurrencesSpinner.setTooltip(MSG .view_alert_common_tab_dampening_duration_occurrences_label_tooltip()); durationOccurrencesStatic = new StaticTextItem("durationOccurrencesStatic", MSG.view_alert_common_tab_dampening_duration_occurrences_label()); durationOccurrencesStatic.setWrapTitle(false); durationOccurrencesSpinner.addChangedHandler(new ChangedHandler() { public void onChanged(ChangedEvent event) { updated = true; } }); durationTimePeriodSpinner = new SpinnerItem("durationTimePeriodSpinner", MSG.view_alert_common_tab_dampening_duration_period_label()); durationTimePeriodSpinner.setWrapTitle(false); durationTimePeriodSpinner.setMin(1); durationTimePeriodSpinner.setMax(999999); durationTimePeriodSpinner.setStep(1); durationTimePeriodSpinner.setDefaultValue(1); durationTimePeriodSpinner.setHoverWidth(300); durationTimePeriodSpinner.setTooltip(MSG.view_alert_common_tab_dampening_duration_period_label_tooltip()); durationTimePeriodStatic = new StaticTextItem("durationTimePeriodStatic", MSG.view_alert_common_tab_dampening_duration_period_label()); durationTimePeriodStatic.setWrapTitle(false); durationTimePeriodSpinner.addChangedHandler(new ChangedHandler() { public void onChanged(ChangedEvent event) { updated = true; } }); durationTimeUnitsSelection = new SelectItem("durationTimeUnits", ""); LinkedHashMap<String, String> units = new LinkedHashMap<String, String>(4); units.put(AlertDampening.TimeUnits.MINUTES.name(), getTimeUnitsTitle(AlertDampening.TimeUnits.MINUTES)); units.put(AlertDampening.TimeUnits.HOURS.name(), getTimeUnitsTitle(AlertDampening.TimeUnits.HOURS)); units.put(AlertDampening.TimeUnits.DAYS.name(), getTimeUnitsTitle(AlertDampening.TimeUnits.DAYS)); units.put(AlertDampening.TimeUnits.WEEKS.name(), getTimeUnitsTitle(AlertDampening.TimeUnits.WEEKS)); durationTimeUnitsSelection.setValueMap(units); durationTimeUnitsSelection.setDefaultValue(AlertDampening.TimeUnits.MINUTES.name()); durationTimeUnitsStatic = new StaticTextItem("durationTimeUnitsStatic", ""); durationTimeUnitsSelection.addChangedHandler(new ChangedHandler() { public void onChanged(ChangedEvent event) { updated = true; } }); dampeningRuleSelection.addChangedHandler(new ChangedHandler() { @Override public void onChanged(ChangedEvent event) { updated = true; Category cat = AlertDampening.Category.valueOf(event.getValue().toString()); switch (cat) { case NONE: { consecutiveOccurrencesSpinner.hide(); partialOccurrencesSpinner.hide(); partialEvaluationsSpinner.hide(); durationOccurrencesSpinner.hide(); durationTimePeriodSpinner.hide(); durationTimeUnitsSelection.hide(); break; } case CONSECUTIVE_COUNT: { consecutiveOccurrencesSpinner.show(); partialOccurrencesSpinner.hide(); partialEvaluationsSpinner.hide(); durationOccurrencesSpinner.hide(); durationTimePeriodSpinner.hide(); durationTimeUnitsSelection.hide(); break; } case PARTIAL_COUNT: { consecutiveOccurrencesSpinner.hide(); partialOccurrencesSpinner.show(); partialEvaluationsSpinner.show(); durationOccurrencesSpinner.hide(); durationTimePeriodSpinner.hide(); durationTimeUnitsSelection.hide(); break; } case DURATION_COUNT: { consecutiveOccurrencesSpinner.hide(); partialOccurrencesSpinner.hide(); partialEvaluationsSpinner.hide(); durationOccurrencesSpinner.show(); durationTimePeriodSpinner.show(); durationTimeUnitsSelection.show(); break; } default: { throw new IllegalStateException( MSG.view_alert_common_tab_invalid_dampening_category(cat.name())); // should never happen } } markForRedraw(); } }); // put all the fields in the form now setFields(dampeningRuleSelection, dampeningRuleStatic, consecutiveOccurrencesSpinner, consecutiveOccurrencesStatic, partialOccurrencesSpinner, partialOccurrencesStatic, partialEvaluationsSpinner, partialEvaluationsStatic, durationOccurrencesSpinner, durationOccurrencesStatic, durationTimePeriodSpinner, durationTimePeriodStatic, durationTimeUnitsSelection, durationTimeUnitsStatic); formBuilt = true; } } private String getCategoryTitle(AlertDampening.Category category) { switch (category) { case NONE: { return MSG.common_val_none(); } case CONSECUTIVE_COUNT: { return MSG.view_alert_common_tab_dampening_category_consecutive_count(); } case PARTIAL_COUNT: { return MSG.view_alert_common_tab_dampening_category_partial_count(); } case DURATION_COUNT: { return MSG.view_alert_common_tab_dampening_category_duration_count(); } default: { throw new IllegalStateException(MSG.view_alert_common_tab_invalid_dampening_category(category.name())); // should never happen } } } private String getTimeUnitsTitle(AlertDampening.TimeUnits units) { switch (units) { case MINUTES: { return MSG.common_unit_minutes(); } case HOURS: { return MSG.common_unit_hours(); } case DAYS: { return MSG.common_unit_days(); } case WEEKS: { return MSG.common_unit_weeks(); } default: { throw new IllegalStateException(MSG.view_alert_common_tab_invalid_time_units(units.name())); // should never happen } } } private String getCategoryHelp(String categorySelection) { if (AlertDampening.Category.NONE.name().equals(categorySelection)) { return MSG.view_alert_common_tab_dampening_category_none_tooltip(); } else if (AlertDampening.Category.CONSECUTIVE_COUNT.name().equals(categorySelection)) { return MSG.view_alert_common_tab_dampening_category_consecutive_count_tooltip(); } else if (AlertDampening.Category.PARTIAL_COUNT.name().equals(categorySelection)) { return MSG.view_alert_common_tab_dampening_category_partial_count_tooltip(); } else if (AlertDampening.Category.DURATION_COUNT.name().equals(categorySelection)) { return MSG.view_alert_common_tab_dampening_category_duration_count_tooltip(); } return null; // should never happen } }