/*
* 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.inventory;
import java.util.ArrayList;
import java.util.Date;
import java.util.EnumSet;
import java.util.HashMap;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
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.configuration.group.GroupPluginConfigurationUpdate;
import org.rhq.core.domain.criteria.GroupPluginConfigurationUpdateCriteria;
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.core.domain.util.PageList;
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.RPCDataSource;
import org.rhq.coregui.client.util.enhanced.EnhancedIButton.ButtonColor;
import org.rhq.coregui.client.util.message.Message;
/**
* Table showing group plugin configuration history.
*
* @author John Mazzitelli
*/
public class HistoryGroupPluginConfigurationTable extends Table<HistoryGroupPluginConfigurationTable.DataSource> {
private final ResourceGroup group;
private final ResourcePermission groupPerms;
public HistoryGroupPluginConfigurationTable(ResourceGroupComposite groupComposite) {
super(MSG.view_group_pluginConfig_table_title());
this.group = groupComposite.getResourceGroup();
this.groupPerms = groupComposite.getResourcePermission();
setDataSource(new DataSource());
}
@Override
protected void configureTable() {
ListGridField fieldId = new ListGridField(DataSource.Field.ID, MSG.common_title_version());
ListGridField fieldDateCreated = new ListGridField(DataSource.Field.DATECREATED, MSG.common_title_dateCreated());
ListGridField fieldLastUpdated = new ListGridField(DataSource.Field.LASTUPDATED, MSG.common_title_lastUpdated());
ListGridField fieldStatus = new ListGridField(DataSource.Field.STATUS, MSG.common_title_status());
ListGridField fieldUser = new ListGridField(DataSource.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.getPluginConfigurationIcon(ConfigurationUpdateStatus.SUCCESS));
statusIcons.put(ConfigurationUpdateStatus.FAILURE.name(),
ImageManager.getPluginConfigurationIcon(ConfigurationUpdateStatus.FAILURE));
statusIcons.put(ConfigurationUpdateStatus.INPROGRESS.name(),
ImageManager.getPluginConfigurationIcon(ConfigurationUpdateStatus.INPROGRESS));
statusIcons.put(ConfigurationUpdateStatus.NOCHANGE.name(),
ImageManager.getPluginConfigurationIcon(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 = HistoryGroupPluginConfigurationTable.this.group.getId();
Integer[] updateIds = new Integer[selection.length];
int i = 0;
for (ListGridRecord record : selection) {
updateIds[i++] = record.getAttributeAsInt(DataSource.Field.ID);
}
service.deleteGroupPluginConfigurationUpdate(groupId, updateIds, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
refresh();
Message message = new Message(MSG.view_group_pluginConfig_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_pluginConfig_table_deleteFailure(),
caught);
}
});
}
});
addTableAction(MSG.view_group_pluginConfig_table_viewSettings(), ButtonColor.BLUE, new AbstractTableAction(
TableActionEnablement.SINGLE) {
@Override
public void executeAction(ListGridRecord[] selection, Object actionValue) {
CoreGUI.goToView(LinkManager.getGroupPluginConfigurationUpdateHistoryLink(
EntityContext.forGroup(HistoryGroupPluginConfigurationTable.this.group), null)
+ "/" + selection[0].getAttribute(DataSource.Field.ID) + "/Settings");
refreshTableInfo();
}
});
addTableAction(MSG.view_group_pluginConfig_table_viewMemberHistory(), new AbstractTableAction(
TableActionEnablement.SINGLE) {
@Override
public void executeAction(ListGridRecord[] selection, Object actionValue) {
CoreGUI.goToView(LinkManager.getGroupPluginConfigurationUpdateHistoryLink(
EntityContext.forGroup(HistoryGroupPluginConfigurationTable.this.group), null)
+ "/" + selection[0].getAttribute(DataSource.Field.ID) + "/Members");
refreshTableInfo();
}
});
}
private String getStatusHtmlString(Record record) {
String html = null;
AbstractConfigurationUpdate obj = (AbstractConfigurationUpdate) record
.getAttributeAsObject(DataSource.Field.OBJECT);
switch (obj.getStatus()) {
case SUCCESS: {
html = MSG.view_group_pluginConfig_table_statusSuccess();
break;
}
case INPROGRESS: {
html = "<p>" + MSG.view_group_pluginConfig_table_statusInprogress() + "</p><p>"
+ MSG.view_group_pluginConfig_table_msg1() + "</p>";
break;
}
case NOCHANGE: {
html = MSG.view_group_pluginConfig_table_statusNochange();
break;
}
case FAILURE: {
html = obj.getErrorMessage();
if (html == null) {
html = "<p>" + MSG.view_group_pluginConfig_table_statusFailure() + "</p><p>"
+ MSG.view_group_pluginConfig_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_pluginConfig_table_clickStatusIcon() + "</p>";
} else {
html = "<pre>" + html + "</pre>";
}
html = html + "<p>" + MSG.view_group_pluginConfig_table_msg1() + "</p>";
}
break;
}
}
return html;
}
class DataSource extends RPCDataSource<GroupPluginConfigurationUpdate, GroupPluginConfigurationUpdateCriteria> {
public class Field {
public static final String ID = "id";
public static final String DATECREATED = "createdTime";
public static final String LASTUPDATED = "modifiedTime";
public static final String STATUS = "status";
public static final String USER = "subjectName";
public static final String OBJECT = "object";
}
@Override
public GroupPluginConfigurationUpdate copyValues(Record from) {
return (GroupPluginConfigurationUpdate) from.getAttributeAsObject(DataSource.Field.OBJECT);
}
@Override
public ListGridRecord copyValues(GroupPluginConfigurationUpdate from) {
ListGridRecord record = new ListGridRecord();
record.setAttribute(Field.ID, from.getId());
record.setAttribute(Field.DATECREATED, new Date(from.getCreatedTime()));
record.setAttribute(Field.LASTUPDATED, new Date(from.getModifiedTime()));
record.setAttribute(Field.STATUS, from.getStatus().name());
record.setAttribute(Field.USER, from.getSubjectName());
record.setAttribute(Field.OBJECT, from);
return record;
}
@Override
protected void executeFetch(final DSRequest request, final DSResponse response,
final GroupPluginConfigurationUpdateCriteria criteria) {
ConfigurationGWTServiceAsync configurationService = GWTServiceLookup.getConfigurationService();
configurationService.findGroupPluginConfigurationUpdatesByCriteria(criteria,
new AsyncCallback<PageList<GroupPluginConfigurationUpdate>>() {
@Override
public void onSuccess(PageList<GroupPluginConfigurationUpdate> result) {
response.setData(buildRecords(result));
response.setTotalRows(result.getTotalSize());
processResponse(request.getRequestId(), response);
}
@Override
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(MSG.view_group_pluginConfig_table_failFetch(), caught);
response.setStatus(DSResponse.STATUS_FAILURE);
processResponse(request.getRequestId(), response);
}
});
}
@Override
protected GroupPluginConfigurationUpdateCriteria getFetchCriteria(final DSRequest request) {
GroupPluginConfigurationUpdateCriteria criteria = new GroupPluginConfigurationUpdateCriteria();
ArrayList<Integer> groupList = new ArrayList<Integer>(1);
groupList.add(HistoryGroupPluginConfigurationTable.this.group.getId());
criteria.addFilterResourceGroupIds(groupList);
return criteria;
}
}
}