/*
* RHQ Management Platform
* Copyright (C) 2005-2008 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.dashboard.portlets.recent.imported;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
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.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.composite.RecentlyAddedResourceComposite;
import org.rhq.coregui.client.CoreGUI;
import org.rhq.coregui.client.ImageManager;
import org.rhq.coregui.client.Messages;
import org.rhq.coregui.client.UserSessionManager;
import org.rhq.coregui.client.dashboard.Portlet;
import org.rhq.coregui.client.gwt.GWTServiceLookup;
import org.rhq.coregui.client.util.Log;
import org.rhq.coregui.client.util.MeasurementUtility;
public class RecentlyAddedResourceDS extends DataSource {
private static final Messages MSG = CoreGUI.getMessages();
private Portlet portlet;
private int maximumRecentlyAddedToDisplay;
private int maximumRecentlyAddedWithinHours;
private long oldestDate = -1;
public RecentlyAddedResourceDS(Portlet recentlyAddedPortlet) {
this.portlet = recentlyAddedPortlet;
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
.dataSource_measurementOob_field_parentName()
+ " " + MSG.dataSource_users_field_id());
parentIdField.setForeignKey("id");
DataSourceTextField resourceNameField = new DataSourceTextField("name", MSG.common_title_resource_name());
resourceNameField.setPrimaryKey(true);
DataSourceTextField timestampField = new DataSourceTextField("timestamp", MSG.common_title_timestamp());
setFields(idField, parentIdField, resourceNameField, timestampField);
}
@Override
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();
}
public void executeFetch(final DSRequest request, final DSResponse response) {
long ctime = -1;
int maxItems = -1;
//retrieve current portlet display settings
if ((this.portlet != null) && (this.portlet instanceof RecentlyAddedResourcesPortlet)) {
RecentlyAddedResourcesPortlet recentAdditionsPortlet = (RecentlyAddedResourcesPortlet) this.portlet;
if (recentAdditionsPortlet != null) {
if (getMaximumRecentlyAddedToDisplay() > 0) {
maxItems = getMaximumRecentlyAddedToDisplay();
}
//define the time window
if (getMaximumRecentlyAddedWithinHours() > 0) {
ctime = System.currentTimeMillis()
- (getMaximumRecentlyAddedWithinHours() * MeasurementUtility.HOURS);
setOldestDate(ctime);
}
}
}
// TODO: spinder: revisit this later. ResourceCriteria mechanism does not work. Not sure if it's better?
// ResourceCriteria c = new ResourceCriteria();
//
// String p = request.getCriteria().getAttribute("parentId");
//
// if (p == null) {
// c.addFilterResourceCategory(ResourceCategory.PLATFORM);
// c.fetchChildResources(true);
// } else {
// c.addFilterParentResourceId(Integer.parseInt(p));
// }
// TODO GH: Enhance resourceCriteria query to support itime based filtering for
// "Recently imported" resources
//if logged in then proceed making server side calls
if (UserSessionManager.isLoggedIn()) {
GWTServiceLookup.getResourceService().findRecentlyAddedResources(ctime, maxItems,
new AsyncCallback<List<RecentlyAddedResourceComposite>>() {
public void onFailure(Throwable throwable) {
CoreGUI.getErrorHandler().handleError(MSG.view_portlet_recentlyAdded_error1(), throwable);
}
public void onSuccess(List<RecentlyAddedResourceComposite> recentlyAddedList) {
List<RecentlyAddedResourceComposite> list = new ArrayList<RecentlyAddedResourceComposite>();
for (RecentlyAddedResourceComposite recentlyAdded : recentlyAddedList) {
list.add(recentlyAdded);
list.addAll(recentlyAdded.getChildren());
}
response.setData(buildNodes(list));
response.setTotalRows(list.size());
processResponse(request.getRequestId(), response);
}
});
} else {//
Log.debug("user is not logged in. Not fetching recently added resource now.");
//answer the datasource
response.setTotalRows(0);
processResponse(request.getRequestId(), response);
}
}
private TreeNode[] buildNodes(List<RecentlyAddedResourceComposite> list) {
TreeNode[] treeNodes = new TreeNode[list.size()];
for (int i = 0; i < list.size(); ++i) {
treeNodes[i] = new RecentlyAddedTreeNode(list.get(i));
}
return treeNodes;
}
public static class RecentlyAddedTreeNode extends TreeNode {
private RecentlyAddedResourceComposite recentlyAdded;
private RecentlyAddedTreeNode(RecentlyAddedResourceComposite c) {
recentlyAdded = c;
Date dateAdded = new Date(recentlyAdded.getCtime());
String id = String.valueOf(recentlyAdded.getId());
String parentId = recentlyAdded.getParentId() == 0 ? null : String.valueOf((recentlyAdded.getParentId()));
setID(id);
setParentID(parentId);
setAttribute("id", id);
setAttribute("parentId", parentId);
setAttribute("name", recentlyAdded.getName());
setAttribute("timestamp", dateAdded);
setIsFolder(recentlyAdded.getParentId() == 0);
}
}
public static class ResourceTreeNode extends TreeNode {
private Resource resource;
private ResourceTreeNode(Resource resource) {
this.resource = resource;
String id = String.valueOf(resource.getId());
String parentId = resource.getParentResource() == null ? null : String.valueOf((resource
.getParentResource().getId()));
setID(id);
setParentID(parentId);
setAttribute("id", id);
setAttribute("parentId", parentId);
setAttribute("name", resource.getName());
setAttribute("timestamp", "");//String.valueOf(resource.getItime())); // Seems to be null
setAttribute("currentAvailability", ImageManager.getAvailabilityIconFromAvailType(resource
.getCurrentAvailability().getAvailabilityType()));
}
public Resource getResource() {
return resource;
}
public void setResource(Resource resource) {
this.resource = resource;
}
public ResourceType getResourceType() {
return resource.getResourceType();
}
public String getParentId() {
return getAttribute("parentId");
}
}
public int getMaximumRecentlyAddedToDisplay() {
return maximumRecentlyAddedToDisplay;
}
public void setMaximumRecentlyAddedToDisplay(int maximumRecentlyAddedToDisplay) {
this.maximumRecentlyAddedToDisplay = maximumRecentlyAddedToDisplay;
}
public int getMaximumRecentlyAddedWithinHours() {
return maximumRecentlyAddedWithinHours;
}
public void setMaximumRecentlyAddedWithinHours(int maximumRecentlyAddedWithinHours) {
this.maximumRecentlyAddedWithinHours = maximumRecentlyAddedWithinHours;
}
public long getOldestDate() {
return oldestDate;
}
public void setOldestDate(long oldestDate) {
this.oldestDate = oldestDate;
}
}