/* * 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.coregui.client.alert.definitions; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.data.Criteria; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.grid.ListGridRecord; import org.rhq.core.domain.alert.AlertDampening; import org.rhq.core.domain.alert.AlertDefinition; import org.rhq.core.domain.alert.AlertPriority; import org.rhq.core.domain.alert.BooleanExpression; import org.rhq.core.domain.criteria.AlertDefinitionCriteria; import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.util.PageList; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.components.table.AbstractTableAction; import org.rhq.coregui.client.components.table.EscapedHtmlCellFormatter; import org.rhq.coregui.client.components.table.TableActionEnablement; import org.rhq.coregui.client.components.table.TableSection; import org.rhq.coregui.client.gwt.GWTServiceLookup; import org.rhq.coregui.client.util.enhanced.EnhancedIButton.ButtonColor; /** * Superclass to the different alert definition views. This should be subclassed * to obtain resource, group, and template alert definition views. * * @author John Mazzitelli */ public abstract class AbstractAlertDefinitionsView extends TableSection<AbstractAlertDefinitionsDataSource> { public AbstractAlertDefinitionsView(String tableTitle, Criteria initialCriteria) { super(tableTitle, initialCriteria); setEscapeHtmlInDetailsLinkColumn(true); } @Override protected void configureTable() { ListGrid listGrid = getListGrid(); AbstractAlertDefinitionsDataSource ds = getAlertDefinitionDataSource(); setDataSource(ds); listGrid.setDataSource(ds); listGrid.setFields(ds.getListGridFields().toArray(new ListGridField[0])); listGrid.setUseAllDataSourceFields(true); listGrid.setWrapCells(true); listGrid.setFixedRecordHeights(false); //listGrid.getField("id").setWidth(55); // name and description are user-editable, so escape HTML to prevent XSS attacks ListGridField nameField = listGrid.getField(AbstractAlertDefinitionsDataSource.FIELD_NAME); nameField.setCellFormatter(new EscapedHtmlCellFormatter()); ListGridField descriptionField = listGrid.getField(AbstractAlertDefinitionsDataSource.FIELD_DESCRIPTION); descriptionField.setCellFormatter(new EscapedHtmlCellFormatter()); final boolean isAuthorized = isAuthorizedToModifyAlertDefinitions(); addTableAction(MSG.common_button_new(), null, ButtonColor.BLUE, new AbstractTableAction() { public boolean isEnabled(ListGridRecord[] selection) { return super.isEnabled(selection) && isAuthorized; } public void executeAction(ListGridRecord[] selection, Object actionValue) { newButtonPressed(selection); } }); addTableAction(MSG.common_button_enable(), MSG.view_alert_definitions_enable_confirm(), new AbstractTableAction(TableActionEnablement.ANY) { public boolean isEnabled(ListGridRecord[] selection) { return super.isEnabled(selection) && isAuthorized; } public void executeAction(ListGridRecord[] selection, Object actionValue) { enableButtonPressed(selection); refresh(); } }); addTableAction(MSG.common_button_disable(), MSG.view_alert_definitions_disable_confirm(), new AbstractTableAction(TableActionEnablement.ANY) { public boolean isEnabled(ListGridRecord[] selection) { return super.isEnabled(selection) && isAuthorized; } public void executeAction(ListGridRecord[] selection, Object actionValue) { disableButtonPressed(selection); refresh(); } }); addTableAction(MSG.common_button_delete(), MSG.view_alert_definitions_delete_confirm(), ButtonColor.RED, new AbstractTableAction(TableActionEnablement.ANY) { public boolean isEnabled(ListGridRecord[] selection) { return super.isEnabled(selection) && isAuthorized; } public void executeAction(ListGridRecord[] selection, Object actionValue) { deleteButtonPressed(selection); } }); super.configureTable(); } @Override public Canvas getDetailsView(ListGridRecord record) { if (record == null) { return getDetailsView(0); } AlertDefinition alertDef = getAlertDefinitionDataSource().copyValues(record); SingleAlertDefinitionView singleAlertDefinitionView = new SingleAlertDefinitionView(this, alertDef); return singleAlertDefinitionView; } @Override public SingleAlertDefinitionView getDetailsView(final Integer id) { final SingleAlertDefinitionView singleAlertDefinitionView = new SingleAlertDefinitionView(this); if (id == 0) { // create an empty one with all defaults AlertDefinition newAlertDef = new AlertDefinition(); newAlertDef.setDeleted(false); newAlertDef.setEnabled(true); newAlertDef.setPriority(AlertPriority.MEDIUM); newAlertDef.setParentId(0); newAlertDef.setConditionExpression(BooleanExpression.ANY); newAlertDef.setWillRecover(false); newAlertDef.setRecoveryId(0); newAlertDef.setAlertDampening(new AlertDampening(AlertDampening.Category.NONE)); newAlertDef.setNotifyFiltered(false); newAlertDef.setControlFiltered(false); singleAlertDefinitionView.setAlertDefinition(newAlertDef); singleAlertDefinitionView.makeEditable(); } else { final AlertDefinitionCriteria criteria = getDetailCriteria(); criteria.addFilterId(id); criteria.fetchGroupAlertDefinition(true); criteria.fetchConditions(true); criteria.fetchAlertNotifications(true); GWTServiceLookup.getAlertDefinitionService().findAlertDefinitionsByCriteria(criteria, new AsyncCallback<PageList<AlertDefinition>>() { public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError( MSG.view_alert_definitions_loadFailed_single(String.valueOf(id)), caught); } public void onSuccess(PageList<AlertDefinition> result) { if (result.size() > 0) { singleAlertDefinitionView.setAlertDefinition(result.get(0)); } } }); } return singleAlertDefinitionView; } /** * Override to add any criteria that must be present when fetching the alert definition detail. * @return */ protected AlertDefinitionCriteria getDetailCriteria() { return new AlertDefinitionCriteria(); } protected abstract void commitAlertDefinition(final AlertDefinition alertDefinition, boolean resetMatching, final AsyncCallback<AlertDefinition> resultReceiver); protected abstract ResourceType getResourceType(); protected abstract AbstractAlertDefinitionsDataSource getAlertDefinitionDataSource(); protected abstract boolean isAuthorizedToModifyAlertDefinitions(); protected abstract void newButtonPressed(ListGridRecord[] selection); protected abstract void deleteButtonPressed(ListGridRecord[] selection); protected abstract void enableButtonPressed(ListGridRecord[] selection); protected abstract void disableButtonPressed(ListGridRecord[] selection); }