/*
* 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.groups.detail.configuration;
import java.util.EnumSet;
import java.util.HashMap;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.ListGridFieldType;
import com.smartgwt.client.widgets.grid.HoverCustomizer;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.configuration.AbstractConfigurationUpdate;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.resource.composite.ResourcePermission;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
import org.rhq.coregui.client.CoreGUI;
import org.rhq.coregui.client.ErrorMessageWindow;
import org.rhq.coregui.client.ImageManager;
import org.rhq.coregui.client.LinkManager;
import org.rhq.coregui.client.components.table.AbstractTableAction;
import org.rhq.coregui.client.components.table.Table;
import org.rhq.coregui.client.components.table.TableActionEnablement;
import org.rhq.coregui.client.components.table.TimestampCellFormatter;
import org.rhq.coregui.client.gwt.ConfigurationGWTServiceAsync;
import org.rhq.coregui.client.gwt.GWTServiceLookup;
import org.rhq.coregui.client.util.enhanced.EnhancedIButton.ButtonColor;
import org.rhq.coregui.client.util.message.Message;
/**
* Table showing group resource configuration history.
*
* @author John Mazzitelli
*/
public class HistoryGroupResourceConfigurationTable extends Table<GroupResourceConfigurationDataSource> {
private final ResourceGroup group;
private final ResourcePermission groupPerms;
public HistoryGroupResourceConfigurationTable(ResourceGroupComposite groupComposite) {
super(MSG.view_group_resConfig_table_title());
this.group = groupComposite.getResourceGroup();
this.groupPerms = groupComposite.getResourcePermission();
setDataSource(new GroupResourceConfigurationDataSource(this.group.getId()));
}
@Override
protected void configureTable() {
ListGridField fieldId = new ListGridField(GroupResourceConfigurationDataSource.Field.ID,
MSG.common_title_version());
ListGridField fieldDateCreated = new ListGridField(GroupResourceConfigurationDataSource.Field.DATECREATED,
MSG.common_title_dateCreated());
ListGridField fieldLastUpdated = new ListGridField(GroupResourceConfigurationDataSource.Field.LASTUPDATED,
MSG.common_title_lastUpdated());
ListGridField fieldStatus = new ListGridField(GroupResourceConfigurationDataSource.Field.STATUS,
MSG.common_title_status());
ListGridField fieldUser = new ListGridField(GroupResourceConfigurationDataSource.Field.USER,
MSG.common_title_user());
TimestampCellFormatter.prepareDateField(fieldDateCreated);
TimestampCellFormatter.prepareDateField(fieldLastUpdated);
fieldId.setWidth("10%");
fieldDateCreated.setWidth("35%");
fieldLastUpdated.setWidth("35%");
fieldStatus.setWidth("10%");
fieldUser.setWidth("*");
fieldStatus.setType(ListGridFieldType.ICON);
HashMap<String, String> statusIcons = new HashMap<String, String>(4);
statusIcons.put(ConfigurationUpdateStatus.SUCCESS.name(),
ImageManager.getResourceConfigurationIcon(ConfigurationUpdateStatus.SUCCESS));
statusIcons.put(ConfigurationUpdateStatus.FAILURE.name(),
ImageManager.getResourceConfigurationIcon(ConfigurationUpdateStatus.FAILURE));
statusIcons.put(ConfigurationUpdateStatus.INPROGRESS.name(),
ImageManager.getResourceConfigurationIcon(ConfigurationUpdateStatus.INPROGRESS));
statusIcons.put(ConfigurationUpdateStatus.NOCHANGE.name(),
ImageManager.getResourceConfigurationIcon(ConfigurationUpdateStatus.NOCHANGE));
fieldStatus.setValueIcons(statusIcons);
fieldStatus.addRecordClickHandler(new RecordClickHandler() {
@Override
public void onRecordClick(RecordClickEvent event) {
new ErrorMessageWindow(MSG.common_severity_error(), getStatusHtmlString(event.getRecord())).show();
}
});
fieldStatus.setShowHover(true);
fieldStatus.setHoverCustomizer(new HoverCustomizer() {
@Override
public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
String html = getStatusHtmlString(record);
return html;
}
});
ListGrid listGrid = getListGrid();
listGrid.setFields(fieldId, fieldDateCreated, fieldLastUpdated, fieldStatus, fieldUser);
addTableAction(MSG.common_button_delete(), MSG.common_msg_areYouSure(), ButtonColor.RED,
new AbstractTableAction(this.groupPerms.isInventory() ? TableActionEnablement.ANY
: TableActionEnablement.NEVER) {
@Override
public void executeAction(final ListGridRecord[] selection, Object actionValue) {
if (selection == null || selection.length == 0) {
return;
}
ConfigurationGWTServiceAsync service = GWTServiceLookup.getConfigurationService();
Integer groupId = HistoryGroupResourceConfigurationTable.this.group.getId();
Integer[] updateIds = new Integer[selection.length];
int i = 0;
for (ListGridRecord record : selection) {
updateIds[i++] = record.getAttributeAsInt(GroupResourceConfigurationDataSource.Field.ID);
}
service.deleteGroupResourceConfigurationUpdate(groupId, updateIds, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
refresh();
Message message = new Message(MSG.view_group_resConfig_table_deleteSuccessful(String
.valueOf(selection.length)), Message.Severity.Info, EnumSet
.of(Message.Option.Transient));
CoreGUI.getMessageCenter().notify(message);
}
@Override
public void onFailure(Throwable caught) {
refreshTableInfo();
CoreGUI.getErrorHandler().handleError(MSG.view_group_resConfig_table_deleteFailure(),
caught);
}
});
}
});
addTableAction(MSG.view_group_resConfig_table_viewSettings(), ButtonColor.BLUE, new AbstractTableAction(
TableActionEnablement.SINGLE) {
@Override
public void executeAction(ListGridRecord[] selection, Object actionValue) {
CoreGUI.goToView(LinkManager.getGroupResourceConfigurationUpdateHistoryLink(
EntityContext.forGroup(HistoryGroupResourceConfigurationTable.this.group), null)
+ "/" + selection[0].getAttribute(GroupResourceConfigurationDataSource.Field.ID) + "/Settings");
refreshTableInfo();
}
});
addTableAction(MSG.view_group_resConfig_table_viewMemberHistory(), new AbstractTableAction(
TableActionEnablement.SINGLE) {
@Override
public void executeAction(ListGridRecord[] selection, Object actionValue) {
CoreGUI.goToView(LinkManager.getGroupResourceConfigurationUpdateHistoryLink(
EntityContext.forGroup(HistoryGroupResourceConfigurationTable.this.group), null)
+ "/" + selection[0].getAttribute(GroupResourceConfigurationDataSource.Field.ID) + "/Members");
refreshTableInfo();
}
});
}
private String getStatusHtmlString(Record record) {
String html = null;
AbstractConfigurationUpdate obj = (AbstractConfigurationUpdate) record
.getAttributeAsObject(GroupResourceConfigurationDataSource.Field.OBJECT);
switch (obj.getStatus()) {
case SUCCESS: {
html = MSG.view_group_resConfig_table_statusSuccess();
break;
}
case INPROGRESS: {
html = "<p>" + MSG.view_group_resConfig_table_statusInprogress() + "</p><p>"
+ MSG.view_group_resConfig_table_msg1() + "</p>";
break;
}
case NOCHANGE: {
html = MSG.view_group_resConfig_table_statusNochange();
break;
}
case FAILURE: {
html = obj.getErrorMessage();
if (html == null) {
html = "<p>" + MSG.view_group_resConfig_table_statusFailure() + "</p><p>"
+ MSG.view_group_resConfig_table_msg1() + "</p>";
} else {
if (html.length() > 80) {
// this was probably an error stack trace, snip it so the tooltip isn't too big
html = "<pre>" + html.substring(0, 80) + "...</pre><p>"
+ MSG.view_group_resConfig_table_clickStatusIcon() + "</p>";
} else {
html = "<pre>" + html + "</pre>";
}
html = html + "<p>" + MSG.view_group_resConfig_table_msg1() + "</p>";
}
break;
}
}
return html;
}
}