/*
* RHQ Management Platform
* Copyright 2011, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* 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.drift;
import java.util.ArrayList;
import java.util.LinkedHashMap;
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.SelectItem;
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.drift.DriftCategory;
import org.rhq.coregui.client.IconEnum;
import org.rhq.coregui.client.ImageManager;
import org.rhq.coregui.client.LinkManager;
import org.rhq.coregui.client.components.form.DateFilterItem;
import org.rhq.coregui.client.components.form.EnumSelectItem;
import org.rhq.coregui.client.components.table.StringIDTableSection;
import org.rhq.coregui.client.components.table.TimestampCellFormatter;
import org.rhq.coregui.client.components.view.ViewName;
import org.rhq.coregui.client.inventory.resource.AncestryUtil;
/**
* A view that displays a paginated table of {@link org.rhq.core.domain.drift.JPADrift}s, along with the
* ability to filter those drifts, sort those drifts, double-click a row to view full details a drift, and perform
* various actions on the the drifts: delete selected, delete all from source, etc.
* This view fully respects the user's authorization, and will not allow actions on the drifts unless the user is
* either the inventory manager or has MANAGE_DRIFT permission on every resource corresponding to the drifts being
* operated on.
*
* @author Jay Shaughnessy
*/
public class DriftHistoryView extends StringIDTableSection<DriftDataSource> {
public static final ViewName SUBSYSTEM_VIEW_ID = new ViewName("RecentDrifts", MSG.common_title_recent_drifts(),
IconEnum.RECENT_DRIFT);
private static SortSpecifier DEFAULT_SORT_SPECIFIER = new SortSpecifier(DriftDataSource.ATTR_CTIME,
SortDirection.DESCENDING);
public static final Criteria INITIAL_CRITERIA = new Criteria();
protected SelectItem categoryFilter;
protected TextItem definitionFilter;
protected TextItem changeSetFilter;
protected TextItem pathFilter;
protected DateFilterItem startDateFilter;
protected DateFilterItem endDateFilter;
private EntityContext context;
private boolean hasWriteAccess;
protected DriftDataSource dataSource;
static {
DriftCategory[] categoryValues = DriftCategory.values();
String[] categoryNames = new String[categoryValues.length];
int i = 0;
for (DriftCategory c : categoryValues) {
categoryNames[i++] = c.name();
}
INITIAL_CRITERIA.addCriteria(DriftDataSource.FILTER_CATEGORIES, categoryNames);
}
// for subsystem views
public DriftHistoryView() {
this(SUBSYSTEM_VIEW_ID.getTitle(), EntityContext.forSubsystemView(), false, INITIAL_CRITERIA);
}
public DriftHistoryView(EntityContext entityContext) {
this(SUBSYSTEM_VIEW_ID.getTitle(), entityContext, false, INITIAL_CRITERIA);
}
public DriftHistoryView(String tableTitle, EntityContext entityContext) {
this(tableTitle, entityContext, false, INITIAL_CRITERIA);
}
protected DriftHistoryView(String tableTitle, EntityContext entityContext, boolean hasWriteAccess) {
this(tableTitle, entityContext, hasWriteAccess, INITIAL_CRITERIA);
}
protected DriftHistoryView(String tableTitle, EntityContext context, boolean hasWriteAccess,
Criteria initialCriteria) {
super(tableTitle, initialCriteria, new SortSpecifier[] { DEFAULT_SORT_SPECIFIER });
this.context = context;
this.hasWriteAccess = hasWriteAccess;
setInitialCriteriaFixed(false);
setDataSource(getDataSource());
}
@Override
public DriftDataSource getDataSource() {
if (null == this.dataSource) {
this.dataSource = new DriftDataSource(context);
}
return this.dataSource;
}
@Override
protected void configureTableFilters() {
LinkedHashMap<String, String> categories = new LinkedHashMap<String, String>(3);
categories.put(DriftCategory.FILE_ADDED.name(), MSG.view_drift_category_fileAdded());
categories.put(DriftCategory.FILE_CHANGED.name(), MSG.view_drift_category_fileChanged());
categories.put(DriftCategory.FILE_REMOVED.name(), MSG.view_drift_category_fileRemoved());
LinkedHashMap<String, String> categoryIcons = new LinkedHashMap<String, String>(3);
categoryIcons.put(DriftCategory.FILE_ADDED.name(), ImageManager.getDriftCategoryIcon(DriftCategory.FILE_ADDED));
categoryIcons.put(DriftCategory.FILE_CHANGED.name(),
ImageManager.getDriftCategoryIcon(DriftCategory.FILE_CHANGED));
categoryIcons.put(DriftCategory.FILE_REMOVED.name(),
ImageManager.getDriftCategoryIcon(DriftCategory.FILE_REMOVED));
categoryFilter = new EnumSelectItem(DriftDataSource.FILTER_CATEGORIES, MSG.common_title_category(),
DriftCategory.class, categories, categoryIcons);
definitionFilter = new TextItem(DriftDataSource.FILTER_DEFINITION, MSG.common_title_definition());
changeSetFilter = new TextItem(DriftDataSource.FILTER_SNAPSHOT, MSG.view_drift_table_snapshot());
pathFilter = new TextItem(DriftDataSource.FILTER_PATH, MSG.common_title_path());
startDateFilter = new DateFilterItem(DateFilterItem.START_DATE_FILTER, MSG.filter_from_date());
endDateFilter = new DateFilterItem(DateFilterItem.END_DATE_FILTER, MSG.filter_to_date());
if (isShowFilterForm()) {
setFilterFormItems(definitionFilter, changeSetFilter, categoryFilter, startDateFilter, pathFilter,
endDateFilter);
}
}
@Override
protected void configureTable() {
ArrayList<ListGridField> dataSourceFields = getDataSource().getListGridFields();
getListGrid().setFields(dataSourceFields.toArray(new ListGridField[dataSourceFields.size()]));
setupTableInteractions(this.hasWriteAccess);
super.configureTable();
}
@Override
protected String getDetailsLinkColumnName() {
return DriftDataSource.ATTR_CTIME;
}
@Override
protected CellFormatter getDetailsLinkColumnCellFormatter() {
return new CellFormatter() {
public String format(Object value, ListGridRecord record, int i, int i1) {
Integer resourceId = record.getAttributeAsInt(AncestryUtil.RESOURCE_ID);
Integer driftDefId = record.getAttributeAsInt(DriftDataSource.ATTR_CHANGESET_DEF_ID);
String driftId = getId(record);
String url = LinkManager.getDriftCarouselDriftLink(resourceId, driftDefId, driftId);
String formattedValue = TimestampCellFormatter.format(value);
return LinkManager.getHref(url, formattedValue);
}
};
}
protected void setupTableInteractions(final boolean hasWriteAccess) {
// currently no buttons, etc
}
@Override
public Canvas getDetailsView(String driftId) {
return new DriftDetailsView(driftId);
}
public EntityContext getContext() {
return context;
}
}