/* * 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.ArrayList; import java.util.LinkedHashMap; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.RadioGroupItem; import com.smartgwt.client.widgets.form.fields.SelectItem; 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 org.rhq.core.domain.alert.AlertDefinition; import org.rhq.core.domain.criteria.AlertDefinitionCriteria; import org.rhq.core.domain.util.PageList; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.Messages; import org.rhq.coregui.client.components.form.SortedSelectItem; import org.rhq.coregui.client.gwt.GWTServiceLookup; /** * @author John Mazzitelli */ public class RecoveryAlertDefinitionForm extends DynamicForm implements EditAlertDefinitionForm { protected Messages MSG = CoreGUI.getMessages(); private AlertDefinition alertDefinition; private AbstractAlertDefinitionsDataSource alertDataSource; private ArrayList<AlertDefinition> allAlertDefinitions; private SelectItem recoverAlertSelection; private StaticTextItem recoverAlertStatic; private RadioGroupItem disableWhenFiredSelection; private StaticTextItem disableWhenFiredStatic; private boolean formBuilt = false; public RecoveryAlertDefinitionForm(AbstractAlertDefinitionsDataSource dataSource) { this(dataSource, null); } public RecoveryAlertDefinitionForm(AbstractAlertDefinitionsDataSource dataSource, AlertDefinition alertDefinition) { super(); this.alertDataSource = dataSource; this.alertDefinition = alertDefinition; } @Override protected void onInit() { super.onInit(); if (!formBuilt) { setAlertDefinition(alertDefinition); makeViewOnly(); } } @Override public AlertDefinition getAlertDefinition() { return alertDefinition; } @Override public void setAlertDefinition(AlertDefinition alertDef) { alertDefinition = alertDef; buildForm(); if (alertDef == null) { clearFormValues(); } else { refreshWidgets(allAlertDefinitions); disableWhenFiredSelection.setValue(alertDef.getWillRecover() ? "yes" : "no"); disableWhenFiredStatic.setValue(alertDef.getWillRecover() ? MSG.common_val_yes() : MSG.common_val_no()); } markForRedraw(); } @Override public void makeEditable() { recoverAlertSelection.show(); disableWhenFiredSelection.show(); recoverAlertStatic.hide(); disableWhenFiredStatic.hide(); markForRedraw(); } @Override public void makeViewOnly() { recoverAlertSelection.hide(); disableWhenFiredSelection.hide(); recoverAlertStatic.show(); disableWhenFiredStatic.show(); markForRedraw(); } @Override public void saveAlertDefinition() { // this silliness is to workaround the validation that AlertDefinition setters try to do alertDefinition.setRecoveryId(0); alertDefinition.setWillRecover(false); alertDefinition.setRecoveryId(Integer.valueOf(recoverAlertSelection.getValue().toString())); if (alertDefinition.getRecoveryId() != 0) { alertDefinition.setWillRecover(false); } else { alertDefinition.setWillRecover("yes".equals(disableWhenFiredSelection.getValue())); } } @Override public void clearFormValues() { recoverAlertSelection.clearValue(); disableWhenFiredSelection.clearValue(); recoverAlertStatic.clearValue(); disableWhenFiredStatic.clearValue(); markForRedraw(); } @Override public boolean isResetMatching() { return false; } private void buildForm() { if (!formBuilt) { disableWhenFiredSelection = new RadioGroupItem("disableWhenFired", MSG.view_alert_definition_recovery_editor_disable_when_fired()); LinkedHashMap<String, String> yesNo = new LinkedHashMap<String, String>(2); yesNo.put("yes", MSG.common_val_yes()); yesNo.put("no", MSG.common_val_no()); disableWhenFiredSelection.setValueMap(yesNo); disableWhenFiredSelection.setDefaultValue("no"); disableWhenFiredSelection.setWrapTitle(false); disableWhenFiredSelection.setWidth(300); disableWhenFiredSelection.setHoverWidth(300); disableWhenFiredSelection .setTooltip(MSG.view_alert_definition_recovery_editor_disable_when_fired_tooltip()); disableWhenFiredStatic = new StaticTextItem("disableWhenFiredStatic", MSG.view_alert_definition_recovery_editor_disable_when_fired()); disableWhenFiredStatic.setWrapTitle(false); recoverAlertSelection = new SortedSelectItem("recoveryAlert", MSG.view_alert_definition_recovery_editor_recovery_alert()); recoverAlertSelection.setDefaultValue("0"); recoverAlertSelection.setWrapTitle(false); recoverAlertSelection.setHoverWidth(300); recoverAlertSelection.setTooltip(MSG.view_alert_definition_recovery_editor_recovery_alert_tooltip()); recoverAlertStatic = new StaticTextItem("recoveryAlertStatic", MSG.view_alert_definition_recovery_editor_recovery_alert()); recoverAlertStatic.setDefaultValue(getNoRecoveryMenuItemTitle()); recoverAlertStatic.setWrapTitle(false); recoverAlertStatic.setWidth(300); // if a recovery alert is set, then this alert definition must not disable itself when fired // because it will be needed to recover its recovery alert the next time it fires. disabling is only // for non-recoverable alerts or for alerts that will themselves be recovered. // therefore, force the disableWhenFired selection to go to no and do not allow it to be changed when appropriate recoverAlertSelection.addChangedHandler(new ChangedHandler() { @Override public void onChanged(ChangedEvent event) { String recoveryAlertDefId = event.getItem().getValue().toString(); refreshDisableWhenFiredSelection(recoveryAlertDefId); } }); refreshWidgets(null); // for it to at least show the initial "no-op" entry loadAllAlertDefinitionsAndRefreshRecoverAlertSelection(); // this gets the real entries asynchronously setFields(recoverAlertSelection, recoverAlertStatic, disableWhenFiredSelection, disableWhenFiredStatic); formBuilt = true; } } private AlertDefinition lookupAlertDefinition(Integer id) { if (id != null && id.intValue() != 0) { if (this.allAlertDefinitions != null) { for (AlertDefinition def : this.allAlertDefinitions) { if (def.getId() == id.intValue()) { return def; } } } } return null; } private void loadAllAlertDefinitionsAndRefreshRecoverAlertSelection() { if (allAlertDefinitions == null) { AlertDefinitionCriteria criteria = alertDataSource.getSimpleCriteriaForAll(); GWTServiceLookup.getAlertDefinitionService().findAlertDefinitionsByCriteria(criteria, new AsyncCallback<PageList<AlertDefinition>>() { public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError(MSG.view_alert_definition_recovery_editor_loadFailed(), caught); } public void onSuccess(PageList<AlertDefinition> result) { allAlertDefinitions = result; refreshWidgets(allAlertDefinitions); } }); } else { // we already got the values before, just refresh the menu (in case this.alertDef changed) refreshWidgets(allAlertDefinitions); } } private void refreshWidgets(ArrayList<AlertDefinition> allDefs) { int allDefsSize = (allDefs != null) ? allDefs.size() : 0; LinkedHashMap<String, String> alertMap = new LinkedHashMap<String, String>(allDefsSize + 1); alertMap.put("0", getNoRecoveryMenuItemTitle()); if (allDefs != null) { for (AlertDefinition def : allDefs) { if (alertDefinition == null || alertDefinition.getId() != def.getId()) { alertMap.put(String.valueOf(def.getId()), def.getName()); } } } recoverAlertSelection.setValueMap(alertMap); if (alertDefinition != null) { AlertDefinition recoveryAlert = lookupAlertDefinition(alertDefinition.getRecoveryId()); if (recoveryAlert != null) { String recoveryIdStr = String.valueOf(recoveryAlert.getId()); recoverAlertSelection.setValue(recoveryIdStr); recoverAlertStatic.setValue(recoveryAlert.getName()); refreshDisableWhenFiredSelection(recoveryIdStr); } else { recoverAlertSelection.setValue("0"); recoverAlertStatic.setValue(getNoRecoveryMenuItemTitle()); refreshDisableWhenFiredSelection("0"); } } markForRedraw(); } private void refreshDisableWhenFiredSelection(String recoveryAlertDefId) { if ("0".equals(recoveryAlertDefId)) { disableWhenFiredSelection.setDisabled(false); } else { disableWhenFiredSelection.setValue("no"); disableWhenFiredSelection.setDisabled(true); } markForRedraw(); } private String getNoRecoveryMenuItemTitle() { StringBuilder str = new StringBuilder(); str.append("-- "); str.append(MSG.common_val_none()); str.append(" --"); return str.toString(); } }