/*
* RHQ Management Platform
* Copyright (C) 2014 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.drift;
import java.util.ArrayList;
import java.util.Collection;
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.rpc.RPCResponse;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.ListGridFieldType;
import com.smartgwt.client.widgets.grid.HoverCustomizer;
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.criteria.DriftDefinitionTemplateCriteria;
import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.drift.DriftDefinition;
import org.rhq.core.domain.drift.DriftDefinition.BaseDirectory;
import org.rhq.core.domain.drift.DriftDefinitionTemplate;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.coregui.client.CoreGUI;
import org.rhq.coregui.client.ImageManager;
import org.rhq.coregui.client.LinkManager;
import org.rhq.coregui.client.admin.templates.DriftDefinitionTemplateTypeView;
import org.rhq.coregui.client.gwt.DriftGWTServiceAsync;
import org.rhq.coregui.client.gwt.GWTServiceLookup;
import org.rhq.coregui.client.util.RPCDataSource;
/**
* @author Jay Shaughnessy
* @author John Mazzitelli
*/
public class DriftDefinitionTemplateDataSource extends
RPCDataSource<DriftDefinitionTemplate, DriftDefinitionTemplateCriteria> {
// columns
public static final String ATTR_BASE_DIR_STRING = "baseDirString";
public static final String ATTR_DEFINED_BY = "definedBy";
public static final String ATTR_DRIFT_HANDLING_MODE = "driftHandlingMode";
public static final String ATTR_IS_ENABLED = "isEnabled";
public static final String ATTR_EDIT = "edit";
public static final String ATTR_INTERVAL = "interval";
public static final String ATTR_NAME = "name";
public static final String ATTR_NUM_DEFINITIONS = "numDefinitions";
public static final String ATTR_PINNED = "pinned";
// non-columns
// public static final String ATTR_ENTITY = "object";
public static final String ATTR_ID = "id";
public static final String ATTR_IS_PINNED = "isPinned";
public static final String ATTR_IS_USER_DEFINED = "isUserDefined";
public static final String DRIFT_HANDLING_MODE_NORMAL = MSG.view_drift_table_driftHandlingMode_normal();
public static final String DRIFT_HANDLING_MODE_PLANNED = MSG.view_drift_table_driftHandlingMode_plannedChanges();
private int resourceTypeId;
private DriftGWTServiceAsync driftService = GWTServiceLookup.getDriftService();
public DriftDefinitionTemplateDataSource(int resourceTypeId) {
this.resourceTypeId = resourceTypeId;
addDataSourceFields();
}
/**
* The view that contains the list grid which will display this datasource's data will call this
* method to get the field information which is used to control the display of the data.
*
* @return list grid fields used to display the datasource data
*/
public ArrayList<ListGridField> getListGridFields() {
ArrayList<ListGridField> fields = new ArrayList<ListGridField>(6);
ListGridField nameField = new ListGridField(ATTR_NAME, MSG.common_title_name());
fields.add(nameField);
ListGridField definedByField = new ListGridField(ATTR_DEFINED_BY, MSG.view_adminTemplates_definedBy());
definedByField.setCanSortClientOnly(true);
fields.add(definedByField);
ListGridField numDefinitionsField = new ListGridField(ATTR_NUM_DEFINITIONS, MSG.common_title_definitions());
numDefinitionsField.setCanSortClientOnly(true);
fields.add(numDefinitionsField);
ListGridField pinnedField = new ListGridField(ATTR_PINNED, MSG.view_drift_table_pinned());
pinnedField.setType(ListGridFieldType.IMAGE);
pinnedField.setAlign(Alignment.CENTER);
pinnedField.setCanSortClientOnly(true);
pinnedField.addRecordClickHandler(new RecordClickHandler() {
public void onRecordClick(RecordClickEvent event) {
if (event.getRecord().getAttributeAsBoolean(ATTR_IS_PINNED)) {
CoreGUI.goToView(LinkManager.getAdminTemplatesEditLink(DriftDefinitionTemplateTypeView.VIEW_ID
.getName(), resourceTypeId)
+ "/" + event.getRecord().getAttribute(ATTR_ID) + "/Snapshot");
}
}
});
pinnedField.setShowHover(true);
pinnedField.setHoverCustomizer(new HoverCustomizer() {
public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
return record.getAttributeAsBoolean(ATTR_IS_PINNED) ? MSG.view_drift_table_hover_templatePinned() : MSG
.view_drift_table_hover_templateNotPinned();
}
});
fields.add(pinnedField);
ListGridField enabledField = new ListGridField(ATTR_IS_ENABLED, MSG.common_title_enabled());
enabledField.setType(ListGridFieldType.IMAGE);
enabledField.setAlign(Alignment.CENTER);
definedByField.setCanSortClientOnly(true);
fields.add(enabledField);
ListGridField driftHandlingModeField = new ListGridField(ATTR_DRIFT_HANDLING_MODE, MSG
.view_drift_table_driftHandlingMode());
driftHandlingModeField.setCanSortClientOnly(true);
fields.add(driftHandlingModeField);
ListGridField intervalField = new ListGridField(ATTR_INTERVAL, MSG.common_title_interval());
intervalField.setCanSortClientOnly(true);
fields.add(intervalField);
ListGridField baseDirField = new ListGridField(ATTR_BASE_DIR_STRING, MSG.view_drift_table_baseDir());
baseDirField.setCanSortClientOnly(true);
fields.add(baseDirField);
ListGridField editField = new ListGridField(ATTR_EDIT, MSG.common_title_edit());
editField.setType(ListGridFieldType.IMAGE);
editField.setAlign(Alignment.CENTER);
editField.setCanSort(false);
editField.addRecordClickHandler(new RecordClickHandler() {
public void onRecordClick(RecordClickEvent event) {
CoreGUI.goToView(LinkManager.getAdminTemplatesEditLink(DriftDefinitionTemplateTypeView.VIEW_ID
.getName(), resourceTypeId)
+ "/" + event.getRecord().getAttribute(ATTR_ID) + "/Edit");
}
});
editField.setShowHover(true);
editField.setHoverCustomizer(new HoverCustomizer() {
public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
return MSG.view_drift_table_hover_edit();
}
});
fields.add(editField);
nameField.setWidth("20%");
definedByField.setWidth("10%");
numDefinitionsField.setWidth(70);
pinnedField.setWidth(70);
enabledField.setWidth(60);
driftHandlingModeField.setWidth("10%");
intervalField.setWidth(70);
baseDirField.setWidth("*");
editField.setWidth(70);
return fields;
}
@Override
protected void executeFetch(final DSRequest request, final DSResponse response,
final DriftDefinitionTemplateCriteria criteria) {
driftService.findDriftDefinitionTemplatesByCriteria(criteria,
new AsyncCallback<PageList<DriftDefinitionTemplate>>() {
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(MSG.view_drift_failure_load(), caught);
response.setStatus(RPCResponse.STATUS_FAILURE);
processResponse(request.getRequestId(), response);
}
public void onSuccess(PageList<DriftDefinitionTemplate> result) {
dataRetrieved(result, response, request);
}
});
}
/**
* Additional processing to support entity-specific or cross-resource views, and something that can be overidden.
*/
protected void dataRetrieved(final PageList<DriftDefinitionTemplate> result, final DSResponse response,
final DSRequest request) {
response.setData(buildRecords(result));
setPagingInfo(response, result);
processResponse(request.getRequestId(), response);
}
/**
* Sub-classes can override this to add fine-grained control over the result set size. By default the
* total rows are set to the total result set for the query, allowing proper paging. But some views (portlets)
* may want to limit results to a small set (like most recent).
* @param result
* @param response
* @param request
*
* @return should not exceed result.size().
*/
protected int getTotalRows(final Collection<DriftDefinitionTemplate> result, final DSResponse response,
final DSRequest request) {
return result.size();
}
@Override
protected DriftDefinitionTemplateCriteria getFetchCriteria(DSRequest request) {
DriftDefinitionTemplateCriteria criteria = new DriftDefinitionTemplateCriteria();
criteria.addFilterResourceTypeId(resourceTypeId);
// I'm fetching these only to get the count of defs for the template. If it ends up being too slow
// then we'll probably need to create a criteria method that returns a composite.
criteria.fetchDriftDefinitions(true);
// filter out unsortable fields (i.e. fields sorted client-side only)
PageControl pageControl = getPageControl(request);
pageControl.removeOrderingField(ATTR_DEFINED_BY);
pageControl.removeOrderingField(ATTR_PINNED);
pageControl.removeOrderingField(ATTR_NUM_DEFINITIONS);
pageControl.removeOrderingField(ATTR_IS_ENABLED);
pageControl.removeOrderingField(ATTR_DRIFT_HANDLING_MODE);
pageControl.removeOrderingField(ATTR_INTERVAL);
pageControl.removeOrderingField(ATTR_BASE_DIR_STRING);
criteria.setPageControl(pageControl);
return criteria;
}
@Override
public DriftDefinitionTemplate copyValues(Record from) {
return null;
}
@Override
public ListGridRecord copyValues(DriftDefinitionTemplate from) {
return convert(from);
}
public static ListGridRecord convert(DriftDefinitionTemplate from) {
ListGridRecord record = new ListGridRecord();
DriftDefinition templateDef = from.getTemplateDefinition();
// column attrs
record.setAttribute(ATTR_NAME, from.getName());
record
.setAttribute(ATTR_DEFINED_BY, from.isUserDefined() ? MSG.common_title_user() : MSG.common_title_plugin());
record.setAttribute(ATTR_NUM_DEFINITIONS, String.valueOf(from.getDriftDefinitions().size()));
record.setAttribute(ATTR_PINNED, from.isPinned() ? ImageManager.getPinnedIcon() : ImageManager
.getUnpinnedIcon());
record.setAttribute(ATTR_IS_ENABLED, ImageManager.getAvailabilityIcon(templateDef.isEnabled()));
record.setAttribute(ATTR_DRIFT_HANDLING_MODE, getDriftHandlingModeDisplayName(templateDef
.getDriftHandlingMode()));
record.setAttribute(ATTR_INTERVAL, String.valueOf(templateDef.getInterval()));
record.setAttribute(ATTR_BASE_DIR_STRING, getBaseDirString(templateDef.getBasedir()));
// fixed value, just the edit icon
record.setAttribute(ATTR_EDIT, ImageManager.getEditIcon());
// non-column attrs used in processing
// don't store the entity unless necessary, it's just overhead
// record.setAttribute(ATTR_ENTITY, from);
record.setAttribute(ATTR_ID, from.getId());
record.setAttribute(ATTR_IS_PINNED, from.isPinned());
record.setAttribute(ATTR_IS_USER_DEFINED, from.isUserDefined());
return record;
}
public static String getDriftHandlingModeDisplayName(DriftHandlingMode driftHandlingMode) {
switch (driftHandlingMode) {
case plannedChanges:
return DRIFT_HANDLING_MODE_PLANNED;
default:
return DRIFT_HANDLING_MODE_NORMAL;
}
}
private static String getBaseDirString(BaseDirectory basedir) {
return basedir.getValueContext() + ":" + basedir.getValueName();
}
}