/*
* RHQ Management Platform
* Copyright (C) 2005-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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package org.rhq.coregui.client.inventory.resource.selection;
import static org.rhq.coregui.client.inventory.resource.ResourceDataSourceField.CATEGORY;
import static org.rhq.coregui.client.inventory.resource.ResourceDataSourceField.NAME;
import static org.rhq.coregui.client.inventory.resource.ResourceDataSourceField.PLUGIN;
import static org.rhq.coregui.client.inventory.resource.ResourceDataSourceField.TYPE;
import java.util.LinkedHashMap;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.IPickTreeItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.grid.HoverCustomizer;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.coregui.client.components.selector.AbstractSelector;
import org.rhq.coregui.client.inventory.resource.AncestryUtil;
import org.rhq.coregui.client.inventory.resource.ResourceDatasource;
import org.rhq.coregui.client.inventory.resource.type.ResourceTypePluginTreeDataSource;
import org.rhq.coregui.client.util.RPCDataSource;
/**
* @author Greg Hinkle
*/
public class ResourceSelector extends AbstractSelector<Resource, ResourceCriteria> {
private ResourceType resourceTypeFilter;
private boolean forceResourceTypeFilter;
private IPickTreeItem typeSelectItem;
public ResourceSelector() {
this(null, false);
}
public ResourceSelector(ResourceType resourceTypeFilter, boolean forceResourceTypeFilter) {
super();
this.resourceTypeFilter = resourceTypeFilter;
this.forceResourceTypeFilter = forceResourceTypeFilter;
}
@Override
protected DynamicForm getAvailableFilterForm() {
if (null == availableFilterForm) {
availableFilterForm = new DynamicForm();
availableFilterForm.setNumCols(6);
availableFilterForm.setWidth("75%");
final TextItem search = new TextItem("search", MSG.common_title_search());
final SelectItem categorySelect;
typeSelectItem = new IPickTreeItem("type", MSG.common_title_type());
typeSelectItem.setDataSource(new ResourceTypePluginTreeDataSource(false));
typeSelectItem.setValueField("itemId");
typeSelectItem.setCanSelectParentItems(true);
typeSelectItem.setLoadDataOnDemand(false);
if (this.forceResourceTypeFilter) {
typeSelectItem.setDisabled(true);
}
categorySelect = new SelectItem("category", MSG.common_title_category());
LinkedHashMap<String, String> valueMap = buildResourceCategoryValueMap();
categorySelect.setValueMap(valueMap);
categorySelect.setAllowEmptyValue(true);
availableFilterForm.setItems(search, categorySelect, typeSelectItem);
}
return availableFilterForm;
}
private LinkedHashMap<String, String> buildResourceCategoryValueMap() {
LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
ResourceCategory[] categories = ResourceCategory.values();
for (ResourceCategory category : categories) {
valueMap.put(category.name(), category.getDisplayName());
}
return valueMap;
}
@Override
protected RPCDataSource<Resource, ResourceCriteria> getDataSource() {
if (null == datasource) {
datasource = new SelectedResourceDataSource();
}
return datasource;
}
@Override
protected Criteria getLatestCriteria(DynamicForm availableFilterForm) {
String search = (String) availableFilterForm.getValue("search");
String type = availableFilterForm.getValueAsString("type");
String category = (String) availableFilterForm.getValue("category");
Criteria criteria = new Criteria();
if (null != search) {
criteria.addCriteria(NAME.propertyName(), search);
}
if (null != type) {
// If type is a number its a typeId, otherwise a plugin name
try {
Integer.parseInt(type);
criteria.addCriteria(TYPE.propertyName(), type);
} catch (NumberFormatException nfe) {
criteria.addCriteria(PLUGIN.propertyName(), type);
}
}
if (null != category) {
criteria.addCriteria(CATEGORY.propertyName(), category);
}
return criteria;
}
@Override
protected String getItemTitle() {
return "resource";
}
@Override
protected HoverCustomizer getNameHoverCustomizer() {
return new HoverCustomizer() {
@Override
public String hoverHTML(Object value, ListGridRecord listGridRecord, int rowNum, int colNum) {
return AncestryUtil.getAncestryHoverHTML(listGridRecord, 0);
}
};
}
@Override
protected boolean supportsNameHoverCustomizer() {
return true;
}
protected class SelectedResourceDataSource extends ResourceDatasource {
@Override
protected ResourceCriteria getFetchCriteria(final DSRequest request) {
// if specified seed with an initial type filter
if (null != ResourceSelector.this.resourceTypeFilter) {
ResourceSelector.this.typeSelectItem.setValue(resourceTypeFilter.getId());
request.getCriteria().addCriteria(TYPE.propertyName(), String.valueOf(resourceTypeFilter.getId()));
ResourceSelector.this.resourceTypeFilter = null;
}
ResourceCriteria criteria = super.getFetchCriteria(request);
criteria.setStrictFilterPluginName(true);
// additional return data
criteria.fetchResourceType(true);
return criteria;
}
}
}