/* * 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.inventory.common.event; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.data.Criteria; import com.smartgwt.client.data.SortSpecifier; import com.smartgwt.client.types.SortDirection; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.form.fields.SpacerItem; import com.smartgwt.client.widgets.form.fields.TextItem; 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.common.EntityContext; import org.rhq.core.domain.event.EventSeverity; import org.rhq.core.domain.resource.composite.ResourceComposite; import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.ImageManager; import org.rhq.coregui.client.LinkManager; import org.rhq.coregui.client.components.form.DateTimeFilterItem; import org.rhq.coregui.client.components.form.EnumSelectItem; 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.components.table.TimestampCellFormatter; import org.rhq.coregui.client.gwt.GWTServiceLookup; 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; /** * @author Joseph Marques */ public class EventCompositeHistoryView extends TableSection<EventCompositeDatasource> { private static final SortSpecifier DEFAULT_SORT_SPECIFIER = new SortSpecifier("timestamp", SortDirection.DESCENDING); private static final Criteria INITIAL_CRITERIA = new Criteria(); private EntityContext context; private boolean hasWriteAccess; protected DateTimeFilterItem startDateFilter; protected DateTimeFilterItem endDateFilter; static { EventSeverity[] severityValues = EventSeverity.values(); String[] severityNames = new String[severityValues.length]; int i = 0; for (EventSeverity s : severityValues) { severityNames[i++] = s.name(); } INITIAL_CRITERIA.addCriteria(EventCompositeDatasource.FILTER_SEVERITIES, severityNames); } public static EventCompositeHistoryView get(ResourceGroupComposite composite) { String tableTitle = MSG.view_inventory_eventHistory_groupEventHistory(); EntityContext context = EntityContext.forGroup(composite.getResourceGroup().getId()); boolean hasWriteAccess = composite.getResourcePermission().isEvent(); return new EventCompositeHistoryView(tableTitle, context, hasWriteAccess); } public static EventCompositeHistoryView get(ResourceComposite composite) { String tableTitle = MSG.view_inventory_eventHistory_resourceEventHistory(); EntityContext context = EntityContext.forResource(composite.getResource().getId()); boolean hasWriteAccess = composite.getResourcePermission().isEvent(); return new EventCompositeHistoryView(tableTitle, context, hasWriteAccess); } public EventCompositeHistoryView(String tableTitle, EntityContext context, boolean hasWriteAccess) { super(tableTitle, INITIAL_CRITERIA, new SortSpecifier[] { DEFAULT_SORT_SPECIFIER }); this.context = context; this.hasWriteAccess = hasWriteAccess; setInitialCriteriaFixed(false); setDataSource(new EventCompositeDatasource(this.context)); } @Override protected void onInit() { setFlexRowDisplay(false); super.onInit(); } @Override protected void configureTableFilters() { final TextItem sourceFilter = new TextItem("source", MSG.view_inventory_eventHistory_sourceFilter()); final TextItem detailsFilter = new TextItem("detail", MSG.view_inventory_eventHistory_detailsFilter()); LinkedHashMap<String, String> severities = new LinkedHashMap<String, String>(5); severities.put(EventSeverity.DEBUG.name(), MSG.common_severity_debug()); severities.put(EventSeverity.INFO.name(), MSG.common_severity_info()); severities.put(EventSeverity.WARN.name(), MSG.common_severity_warn()); severities.put(EventSeverity.ERROR.name(), MSG.common_severity_error()); severities.put(EventSeverity.FATAL.name(), MSG.common_severity_fatal()); LinkedHashMap<String, String> severityIcons = new LinkedHashMap<String, String>(5); severityIcons.put(EventSeverity.DEBUG.name(), ImageManager.getEventSeverityBadge(EventSeverity.DEBUG)); severityIcons.put(EventSeverity.INFO.name(), ImageManager.getEventSeverityBadge(EventSeverity.INFO)); severityIcons.put(EventSeverity.WARN.name(), ImageManager.getEventSeverityBadge(EventSeverity.WARN)); severityIcons.put(EventSeverity.ERROR.name(), ImageManager.getEventSeverityBadge(EventSeverity.ERROR)); severityIcons.put(EventSeverity.FATAL.name(), ImageManager.getEventSeverityBadge(EventSeverity.FATAL)); final EnumSelectItem severityFilter = new EnumSelectItem(EventCompositeDatasource.FILTER_SEVERITIES, MSG.view_inventory_eventHistory_severityFilter(), EventSeverity.class, severities, severityIcons); startDateFilter = new DateTimeFilterItem(DateTimeFilterItem.START_DATE_FILTER, MSG.filter_from_date()); endDateFilter = new DateTimeFilterItem(DateTimeFilterItem.END_DATE_FILTER, MSG.filter_to_date()); SpacerItem spacerItem = new SpacerItem(); spacerItem.setColSpan(2); if (isShowFilterForm()) { setFilterFormItems(sourceFilter, detailsFilter, severityFilter, startDateFilter, spacerItem, endDateFilter); } } @Override protected void configureTable() { ArrayList<ListGridField> dataSourceFields = getDataSource().getListGridFields(); getListGrid().setFields(dataSourceFields.toArray(new ListGridField[dataSourceFields.size()])); setupTableInteractions(); super.configureTable(); } protected String getDetailsLinkColumnName() { return "timestamp"; } protected CellFormatter getDetailsLinkColumnCellFormatter() { return new CellFormatter() { public String format(Object value, ListGridRecord record, int rowNum, int colNum) { Integer recordId = getId(record); String detailsUrl = "#" + getBasePath() + "/" + recordId; return LinkManager.getHref(detailsUrl, TimestampCellFormatter.format(value)); } }; } private void setupTableInteractions() { if (canSupportDeleteAndPurgeAll()) { TableActionEnablement singleTargetEnablement = hasWriteAccess ? TableActionEnablement.ANY : TableActionEnablement.NEVER; addTableAction(MSG.common_button_delete(), MSG.common_msg_areYouSure(), ButtonColor.RED, new AbstractTableAction(singleTargetEnablement) { public void executeAction(ListGridRecord[] selection, Object actionValue) { deleteButtonPressed(selection); } }); TableActionEnablement multipleTargetEnablement = hasWriteAccess ? TableActionEnablement.ALWAYS : TableActionEnablement.NEVER; addTableAction(MSG.common_button_purgeAll(), MSG.common_msg_areYouSure(), ButtonColor.RED, new AbstractTableAction(multipleTargetEnablement) { public void executeAction(ListGridRecord[] selection, Object actionValue) { purgeButtonPressed(); } }); } } private void deleteButtonPressed(ListGridRecord[] selection) { List<Integer> eventIds = new ArrayList<Integer>(); for (ListGridRecord nextRecord : selection) { eventIds.add(nextRecord.getAttributeAsInt("id")); } GWTServiceLookup.getEventService().deleteEventsForContext(context, eventIds, new AsyncCallback<Integer>() { @Override public void onSuccess(Integer result) { CoreGUI.getMessageCenter().notify( new Message(MSG.view_inventory_eventHistory_deleteSuccessful(result.toString(), context.toShortString()), Severity.Info)); refresh(); } @Override public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError( MSG.view_inventory_eventHistory_deleteFailed(context.toShortString()), caught); } }); } private void purgeButtonPressed() { GWTServiceLookup.getEventService().purgeEventsForContext(context, new AsyncCallback<Integer>() { @Override public void onSuccess(Integer result) { CoreGUI.getMessageCenter().notify( new Message(MSG.view_inventory_eventHistory_purgeSuccessful(result.toString(), context.toShortString()), Severity.Info)); refresh(); } @Override public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError( MSG.view_inventory_eventHistory_purgeFailed(context.toShortString()), caught); } }); } public EntityContext getContext() { return context; } /** * Subclasses can override this to indicate they do not support * deleting and purge all the events. Portlet subclasses * that only trim their views to the top N events can override this to * return false so they don't delete events that aren't displayed * to the user. * * @return this default implementation returns true */ protected boolean canSupportDeleteAndPurgeAll() { return true; } @Override public Canvas getDetailsView(Integer eventId) { return EventCompositeDetailsView.getInstance(); } }