/* * 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 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.inventory.resource.selection; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Set; import com.smartgwt.client.data.Criteria; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.Record; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.SelectItem; import com.smartgwt.client.widgets.form.fields.SpacerItem; import com.smartgwt.client.widgets.form.fields.TextItem; import com.smartgwt.client.widgets.grid.ListGridRecord; import org.rhq.core.domain.criteria.ResourceGroupCriteria; import org.rhq.core.domain.resource.group.GroupCategory; import org.rhq.core.domain.resource.group.ResourceGroup; import org.rhq.coregui.client.components.selector.AbstractSelector; import org.rhq.coregui.client.inventory.groups.ResourceGroupDataSourceField; import org.rhq.coregui.client.inventory.groups.ResourceGroupsDataSource; import org.rhq.coregui.client.util.RPCDataSource; /** * @author Greg Hinkle */ public class ResourceGroupSelector extends AbstractSelector<ResourceGroup, ResourceGroupCriteria> { private static LinkedHashMap<String, String> CATEGORY_VALUE_MAP = new LinkedHashMap<String, String>(); GroupCategory categoryFilter; static { CATEGORY_VALUE_MAP.put(GroupCategory.COMPATIBLE.getName(), MSG.view_group_summary_compatible()); CATEGORY_VALUE_MAP.put(GroupCategory.MIXED.getName(), MSG.view_group_summary_mixed()); } public ResourceGroupSelector() { this(false); } public ResourceGroupSelector(boolean isReadOnly) { this(null, isReadOnly); } public ResourceGroupSelector(GroupCategory categoryFilter, boolean isReadOnly) { super(isReadOnly); this.categoryFilter = categoryFilter; } protected DynamicForm getAvailableFilterForm() { DynamicForm availableFilterForm = new DynamicForm(); availableFilterForm.setWidth100(); availableFilterForm.setNumCols(4); final TextItem search = new TextItem("search", MSG.common_title_search()); SelectItem groupCategorySelect = new SelectItem("groupCategory", MSG.widget_resourceSelector_groupCategory()); groupCategorySelect.setValueMap(CATEGORY_VALUE_MAP); if (null == categoryFilter) { groupCategorySelect.setAllowEmptyValue(true); } else { switch (categoryFilter) { case COMPATIBLE: groupCategorySelect.setValue(GroupCategory.COMPATIBLE.getName()); break; case MIXED: groupCategorySelect.setValue(GroupCategory.MIXED.getName()); break; } groupCategorySelect.setDisabled(true); } availableFilterForm.setItems(search, groupCategorySelect, new SpacerItem()); return availableFilterForm; } protected RPCDataSource<ResourceGroup, ResourceGroupCriteria> getDataSource() { return new SelectedResourceGroupsDataSource(); } // TODO: Until http://code.google.com/p/smartgwt/issues/detail?id=490 is fixed, avoid AdvancedCriteria and always // use server-side fetch and simple criteria. When fixed, use the commented version below. Also see // AbstractSelector and ResourceGroupDataSource. protected Criteria getLatestCriteria(DynamicForm availableFilterForm) { String search = (String) availableFilterForm.getValue("search"); String category = (String) availableFilterForm.getValue("groupCategory"); Criteria criteria = new Criteria(); if (null != search) { criteria.addCriteria(ResourceGroupDataSourceField.NAME.propertyName(), search); } if (null != category) { criteria.addCriteria(ResourceGroupDataSourceField.CATEGORY.propertyName(), category); } return criteria; } @Override protected String getItemTitle() { return MSG.common_title_resourceGroups(); } // protected Criteria getLatestCriteria(DynamicForm availableFilterForm) { // String search = (String) availableFilterForm.getValue("search"); // String category = (String) availableFilterForm.getValue("groupCategory"); // ArrayList<Criterion> criteria = new ArrayList<Criterion>(2); // if (null != search) { // criteria.add(new Criterion("name", OperatorId.CONTAINS, search)); // } // if (null != category) { // criteria.add(new Criterion("category", OperatorId.EQUALS, category)); // } // AdvancedCriteria latestCriteria = new AdvancedCriteria(OperatorId.AND, criteria.toArray(new Criterion[criteria // .size()])); // // return latestCriteria; // } public class SelectedResourceGroupsDataSource extends ResourceGroupsDataSource { @Override protected ResourceGroupCriteria getFetchCriteria(final DSRequest request) { ResourceGroupCriteria result = super.getFetchCriteria(request); if (null != result) { result.setStrict(false); } return result; } } }