/*
* RHQ Management Platform
* Copyright (C) 2005-2011 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.report;
import static org.rhq.coregui.client.inventory.resource.ResourceDataSourceField.NAME;
import java.util.EnumSet;
import java.util.List;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.widgets.events.DoubleClickEvent;
import com.smartgwt.client.widgets.events.DoubleClickHandler;
import com.smartgwt.client.widgets.grid.CellFormatter;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.drift.DriftComplianceStatus;
import org.rhq.core.domain.drift.DriftDefinition;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageControl;
import org.rhq.coregui.client.CoreGUI;
import org.rhq.coregui.client.ImageManager;
import org.rhq.coregui.client.LinkManager;
import org.rhq.coregui.client.components.table.IconField;
import org.rhq.coregui.client.inventory.resource.ResourceDataSourceField;
import org.rhq.coregui.client.inventory.resource.ResourceDatasource;
import org.rhq.coregui.client.inventory.resource.ResourceSearchView;
import org.rhq.coregui.client.inventory.resource.detail.ResourceDetailView;
import org.rhq.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.coregui.client.util.RPCDataSource;
import org.rhq.coregui.client.util.StringUtility;
/**
* Extends the ResourceSearchView with drift compliance information.
*
* @author Jay Shaughnessy
* @author John Sanda
*/
public class DriftComplianceReportResourceSearchView extends ResourceSearchView {
private final int resourceTypeId;
public DriftComplianceReportResourceSearchView(Criteria criteria, boolean exportable) {
super(criteria, exportable);
setInitialCriteriaFixed(true);
this.resourceTypeId = criteria.getAttributeAsInt(ResourceDataSourceField.TYPE.propertyName());
};
// suppress unchecked warnings because the superclass has different generic types for the datasource
@SuppressWarnings("unchecked")
@Override
protected RPCDataSource getDataSourceInstance() {
return new DataSource();
}
@Override
protected List<ListGridField> createFields() {
List<ListGridField> fields = super.createFields();
// replace the cell formatter on the name field to go directly to drift tab
ListGridField nameField = null;
for (ListGridField field : fields) {
if (NAME.propertyName().equals(field.getName())) {
nameField = field;
break;
}
}
nameField.setCellFormatter(new CellFormatter() {
public String format(Object value, ListGridRecord record, int rowNum, int colNum) {
String url = LinkManager.getResourceTabLink(record.getAttributeAsInt("id"),
ResourceDetailView.Tab.Drift.NAME, null);
String name = StringUtility.escapeHtml(value.toString());
return LinkManager.getHref(url, name);
}
});
IconField inComplianceField = new IconField(DataSource.ATTR_IN_COMPLIANCE, MSG.common_title_in_compliance(), 95);
inComplianceField.setCanSortClientOnly(true);
fields.add(inComplianceField);
return fields;
}
@Override
protected void configureTable() {
super.configureTable();
// replace the doubleClickHandler to go directly to drift tab
setListGridDoubleClickHandler(new DoubleClickHandler() {
public void onDoubleClick(DoubleClickEvent event) {
ListGrid listGrid = (ListGrid) event.getSource();
ListGridRecord[] selectedRows = listGrid.getSelectedRecords();
if (selectedRows != null && selectedRows.length == 1) {
String selectedId = selectedRows[0].getAttribute("id");
CoreGUI.goToView(LinkManager.getResourceTabLink(Integer.valueOf(selectedId),
ResourceDetailView.Tab.Drift.NAME, null));
}
}
});
}
private class DataSource extends ResourceDatasource {
private static final String ATTR_IN_COMPLIANCE = "inCompliance";
private ResourceType resourceType;
@Override
public void executeFetch(final DSRequest request, final DSResponse response, final ResourceCriteria criteria) {
if (null == resourceType) {
ResourceTypeRepository.Cache.getInstance().getResourceTypes(resourceTypeId,
EnumSet.of(ResourceTypeRepository.MetadataType.driftDefinitionTemplates),
new ResourceTypeRepository.TypeLoadedCallback() {
public void onTypesLoaded(ResourceType type) {
resourceType = type;
DataSource.super.executeFetch(request, response, criteria);
}
});
} else {
super.executeFetch(request, response, criteria);
}
}
@Override
protected ResourceCriteria getFetchCriteria(DSRequest request) {
ResourceCriteria criteria = super.getFetchCriteria(request);
criteria.fetchDriftDefinitions(true);
// filter out unsortable fields (i.e. fields sorted client-side only)
PageControl pageControl = getPageControl(request);
pageControl.removeOrderingField(ATTR_IN_COMPLIANCE);
criteria.setPageControl(pageControl);
return criteria;
}
@Override
public ListGridRecord copyValues(Resource from) {
ListGridRecord record = super.copyValues(from);
if (!resourceType.getDriftDefinitionTemplates().isEmpty()) {
record.setAttribute(ATTR_IN_COMPLIANCE, ImageManager.getAvailabilityIcon(!isOutOfCompliance(from)));
}
return record;
}
private boolean isOutOfCompliance(Resource resource) {
for (DriftDefinition def : resource.getDriftDefinitions()) {
if (def.getComplianceStatus() != DriftComplianceStatus.IN_COMPLIANCE) {
return true;
}
}
return false;
}
}
}