/* * 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 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.inventory.resource.detail.configuration; import java.util.ArrayList; import java.util.List; import com.smartgwt.client.data.Criteria; import com.smartgwt.client.data.DSCallback; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse; import com.smartgwt.client.data.Record; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.grid.CellFormatter; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.grid.ListGridRecord; import org.rhq.core.domain.configuration.AbstractResourceConfigurationUpdate; import org.rhq.core.domain.criteria.AbstractResourceConfigurationUpdateCriteria; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.ImageManager; import org.rhq.coregui.client.LinkManager; import org.rhq.coregui.client.components.configuration.ConfigurationComparisonView; import org.rhq.coregui.client.components.table.AbstractTableAction; import org.rhq.coregui.client.components.table.TableActionEnablement; import org.rhq.coregui.client.components.table.TableSection; import org.rhq.coregui.client.util.enhanced.EnhancedIButton.ButtonColor; import org.rhq.coregui.client.util.message.Message; import org.rhq.coregui.client.util.message.Message.Severity; /** * The superclass to the main plugin/resource views that lists all configuration history items. * * @author Greg Hinkle * @author John Mazzitelli */ public abstract class AbstractConfigurationHistoryListView<T extends AbstractConfigurationHistoryDataSource<? extends AbstractResourceConfigurationUpdate, ? extends AbstractResourceConfigurationUpdateCriteria>> extends TableSection<T> { private Integer resourceId; private boolean hasWritePerm; // can delete history or rollback to a previous config /** * Use this constructor to view config histories for all viewable Resources. */ public AbstractConfigurationHistoryListView(String title, boolean hasWritePerm) { super(title); this.hasWritePerm = hasWritePerm; this.resourceId = null; } /** * Use this constructor to view the config history for the Resource with the specified ID. * * @param resourceId a Resource ID */ public AbstractConfigurationHistoryListView(String title, boolean hasWritePerm, int resourceId) { super(title, createCriteria(resourceId)); this.hasWritePerm = hasWritePerm; this.resourceId = resourceId; } private static Criteria createCriteria(int resourceId) { Criteria criteria = new Criteria(); criteria.addCriteria(AbstractConfigurationHistoryDataSource.CriteriaField.RESOURCE_ID, resourceId); return criteria; } public Integer getResourceId() { return resourceId; } public boolean hasWritePermission() { return hasWritePerm; } @Override protected void configureTable() { List<ListGridField> fields = getDataSource().getListGridFields(this.resourceId == null); setListGridFields(true, fields.toArray(new ListGridField[fields.size()])); // true = always show the ID field addTableAction(MSG.common_button_delete(), MSG.common_msg_areYouSure(), ButtonColor.RED, new AbstractTableAction(hasWritePerm ? TableActionEnablement.ANY : TableActionEnablement.NEVER) { public void executeAction(ListGridRecord[] selection, Object actionValue) { if (selection != null && selection.length > 0) { int[] doomedIds = new int[selection.length]; int i = 0; for (ListGridRecord selected : selection) { doomedIds[i++] = selected.getAttributeAsInt(AbstractConfigurationHistoryDataSource.Field.ID); if (selected.getAttribute(AbstractConfigurationHistoryDataSource.Field.GROUP_CONFIG_UPDATE_ID) != null) { CoreGUI.getMessageCenter().notify( new Message(MSG.view_configurationHistoryList_cannotDeleteGroupItems(), Severity.Warning)); return; // abort } if (Boolean.parseBoolean(selected .getAttribute(AbstractConfigurationHistoryDataSource.Field.CURRENT_CONFIG))) { CoreGUI.getMessageCenter().notify( new Message(MSG.view_configurationHistoryList_cannotDeleteCurrent(), Severity.Warning)); return; // abort } } delete(doomedIds); } } }); addTableAction(MSG.common_button_compare(), null, ButtonColor.BLUE, new AbstractTableAction( TableActionEnablement.MULTIPLE) { public void executeAction(ListGridRecord[] selection, Object actionValue) { // The config updates do not have their Configurations fetched, so we need to reload the selected // config updates, specifying that their Configurations should be fetched, in order to compare the // Configurations. List<Integer> updateIds = new ArrayList<Integer>(); for (ListGridRecord record : selection) { int updateId = record.getAttributeAsInt(AbstractConfigurationHistoryDataSource.Field.ID); updateIds.add(updateId); } Criteria criteria = new Criteria(); criteria.addCriteria(AbstractConfigurationHistoryDataSource.CriteriaField.IDS, updateIds.toArray(new Integer[updateIds.size()])); DSRequest requestProperties = new DSRequest(); requestProperties.setAttribute( AbstractConfigurationHistoryDataSource.RequestProperty.FETCH_CONFIGURATION, true); getDataSource().fetchData(criteria, new DSCallback() { public void execute(DSResponse response, Object rawData, DSRequest request) { ArrayList<AbstractResourceConfigurationUpdate> updatesWithConfigs = new ArrayList<AbstractResourceConfigurationUpdate>(); Record[] records = response.getData(); for (Record record : records) { AbstractResourceConfigurationUpdate update = (AbstractResourceConfigurationUpdate) record .getAttributeAsObject(AbstractConfigurationHistoryDataSource.Field.OBJECT); updatesWithConfigs.add(update); } ConfigurationComparisonView.displayComparisonDialog(updatesWithConfigs); } }, requestProperties); } }); if (getResourceId() != null) { addTableAction(MSG.view_configurationHistoryList_rollback(), MSG.common_msg_areYouSure(), ButtonColor.RED, new AbstractTableAction(hasWritePerm ? TableActionEnablement.SINGLE : TableActionEnablement.NEVER) { public void executeAction(ListGridRecord[] selection, Object actionValue) { if (selection != null && selection.length == 1) { ListGridRecord record = selection[0]; int configHistoryIdToRollbackTo = record .getAttributeAsInt(AbstractConfigurationHistoryDataSource.Field.ID); rollback(configHistoryIdToRollbackTo); } } }); } super.configureTable(); } @Override protected String getDetailsLinkColumnName() { return AbstractConfigurationHistoryDataSource.Field.ID; } @Override protected CellFormatter getDetailsLinkColumnCellFormatter() { return new CellFormatter() { public String format(Object value, ListGridRecord record, int i, int i1) { Integer recordId = getId(record); String detailsUrl = "#" + getBasePath() + "/" + recordId; String cellHtml = LinkManager.getHref(detailsUrl, value.toString()); String isCurrentConfig = record .getAttribute(AbstractConfigurationHistoryDataSource.Field.CURRENT_CONFIG); if (Boolean.parseBoolean(isCurrentConfig)) { cellHtml = Canvas.imgHTML(ImageManager.getApproveIcon()) + cellHtml; } return cellHtml; } }; } protected abstract void rollback(int configHistoryIdToRollbackTo); protected abstract void delete(int[] doomedIds); }