/*
* 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.type;
import java.util.HashSet;
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.DataSource;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.types.DSDataFormat;
import com.smartgwt.client.types.DSProtocol;
import com.smartgwt.client.widgets.tree.TreeNode;
import org.rhq.core.domain.criteria.ResourceTypeCriteria;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
import org.rhq.core.domain.util.ResourceTypeUtility;
import org.rhq.coregui.client.CoreGUI;
import org.rhq.coregui.client.Messages;
import org.rhq.coregui.client.gwt.GWTServiceLookup;
import org.rhq.coregui.client.gwt.ResourceTypeGWTServiceAsync;
/**
* @author Greg Hinkle
*/
public class ResourceTypeTreeDataSource extends DataSource {
private Messages MSG = CoreGUI.getMessages();
private ResourceTypeGWTServiceAsync resourceTypeService = GWTServiceLookup.getResourceTypeGWTService();
private final boolean showIgnoredResourceTypes;
public ResourceTypeTreeDataSource(boolean showIgnoredResourceTypes) {
this.showIgnoredResourceTypes = showIgnoredResourceTypes;
setClientOnly(false);
setDataProtocol(DSProtocol.CLIENTCUSTOM);
setDataFormat(DSDataFormat.CUSTOM);
DataSourceTextField idField = new DataSourceTextField("id", MSG.common_title_id());
idField.setPrimaryKey(true);
DataSourceTextField parentIdField = new DataSourceTextField("parentId", MSG.view_type_parentId());
parentIdField.setForeignKey("id");
DataSourceTextField resourceNameField = new DataSourceTextField("name", MSG.common_title_name());
DataSourceTextField resourceKeyField = new DataSourceTextField("plugin", MSG.common_title_plugin());
DataSourceTextField resourceTypeField = new DataSourceTextField("category", MSG.common_title_category());
setFields(idField, parentIdField, resourceNameField, resourceKeyField, resourceTypeField);
}
protected Object transformRequest(DSRequest request) {
DSResponse response = new DSResponse();
response.setAttribute("clientContext", request.getAttributeAsObject("clientContext"));
// Asume success
response.setStatus(0);
switch (request.getOperationType()) {
case FETCH:
executeFetch(request, response);
break;
default:
break;
}
return request.getData();
}
protected void executeFetch(final DSRequest request, final DSResponse response) {
String parentIdString = request.getCriteria().getAttributeAsString("parentId");
if (parentIdString != null) {
processResponse(request.getRequestId(), response);
} else {
ResourceTypeCriteria criteria = new ResourceTypeCriteria();
criteria.addFilterIgnored((showIgnoredResourceTypes ? (Boolean) null : Boolean.FALSE));
criteria.fetchParentResourceTypes(true);
criteria.setPageControl(PageControl.getUnlimitedInstance());
resourceTypeService.findResourceTypesByCriteria(criteria, new AsyncCallback<PageList<ResourceType>>() {
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(MSG.view_type_typeTreeLoadFailure(), caught);
}
public void onSuccess(PageList<ResourceType> result) {
response.setData(buildNodes(result));
processResponse(request.getRequestId(), response);
}
});
}
}
public static TreeNode[] buildNodes(PageList<ResourceType> result) {
HashSet<TreeNode> nodes = new HashSet<TreeNode>();
HashSet<ResourceType> platforms = new HashSet<ResourceType>();
HashSet<ResourceType> noParentNonPlatformNodes = new HashSet<ResourceType>();
for (ResourceType type : result) {
if (type.getCategory() != ResourceCategory.PLATFORM
&& (type.getParentResourceTypes() == null || type.getParentResourceTypes().isEmpty())) {
noParentNonPlatformNodes.add(type);
} else if (type.getParentResourceTypes() == null || type.getParentResourceTypes().isEmpty()) {
platforms.add(type);
nodes.add(new ResourceTypeTreeNode(type, type.getPlugin()));
} else {
for (ResourceType parent : type.getParentResourceTypes()) {
nodes.add(new ResourceTypeTreeNode(type, String.valueOf(parent.getId())));
}
}
}
for (ResourceType platform : platforms) {
for (ResourceType platformChild : noParentNonPlatformNodes) {
nodes.add(new ResourceTypeTreeNode(platformChild, String.valueOf(platform.getId())));
}
}
TreeNode[] treeNodes = nodes.toArray(new TreeNode[nodes.size()]);
return treeNodes;
}
/**
* Returns a prepopulated PageControl based on the provided DSRequest. This will set sort fields,
* pagination, but *not* filter fields.
*
* @param request the request to turn into a page control
* @return the page control for passing to criteria and other queries
*/
protected PageControl getPageControl(DSRequest request) {
// Initialize paging.
PageControl pageControl;
if (request.getStartRow() == null || request.getEndRow() == null) {
pageControl = new PageControl();
} else {
pageControl = PageControl.getExplicitPageControl(request.getStartRow(), request.getEndRow()
- request.getStartRow());
}
// Initialize sorting.
String sortBy = request.getAttribute("sortBy");
if (sortBy != null) {
String[] sorts = sortBy.split(",");
for (String sort : sorts) {
PageOrdering ordering = (sort.startsWith("-")) ? PageOrdering.DESC : PageOrdering.ASC;
String columnName = (ordering == PageOrdering.DESC) ? sort.substring(1) : sort;
pageControl.addDefaultOrderingField(columnName, ordering);
}
}
return pageControl;
}
public static class PluginTreeNode extends TreeNode {
String id;
PluginTreeNode(String pluginName) {
setID(pluginName);
this.id = pluginName;
setParentID(null);
setAttribute("name", pluginName);
// setAttribute("plugin",pluginName);
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
PluginTreeNode that = (PluginTreeNode) o;
if (!id.equals(that.id))
return false;
return true;
}
@Override
public int hashCode() {
return id.hashCode();
}
}
public static class ResourceTypeTreeNode extends TreeNode {
private ResourceType resourceType;
String id;
String parentId;
private ResourceTypeTreeNode(ResourceType resourceType, String parentId) {
this.resourceType = resourceType;
String id = String.valueOf(resourceType.getId());
setID(id);
this.id = id;
setParentID(parentId);
this.parentId = parentId;
setAttribute("id", id);
setAttribute("parentId", parentId);
setAttribute("name", ResourceTypeUtility.displayName(resourceType));
setAttribute("plugin", resourceType.getPlugin());
setAttribute("category", resourceType.getCategory().getDisplayName());
setIsFolder(true);
}
public ResourceType getResourceType() {
return resourceType;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
ResourceTypeTreeNode that = (ResourceTypeTreeNode) o;
if (!id.equals(that.id))
return false;
if (parentId != null ? !parentId.equals(that.parentId) : that.parentId != null)
return false;
return true;
}
@Override
public int hashCode() {
int result = id.hashCode();
result = 31 * result + (parentId != null ? parentId.hashCode() : 0);
return result;
}
}
}