/*
* 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 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.enterprise.gui.legacy.action.resource.group.inventory;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.LabelValueBean;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.composite.DisambiguationReport;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.util.IntExtractor;
import org.rhq.enterprise.gui.inventory.resource.DisambiguatedResourceLineageComponent;
import org.rhq.enterprise.gui.legacy.Constants;
import org.rhq.enterprise.gui.legacy.util.DisambiguatedResourceListUtil;
import org.rhq.enterprise.gui.legacy.util.RequestUtils;
import org.rhq.enterprise.gui.legacy.util.SessionUtils;
import org.rhq.enterprise.gui.util.WebUtility;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* An Action that retrieves data from the BizApp to facilitate display of the <em>AddGroupResources</em> form.
*/
public class AddGroupResourcesFormPrepareAction extends Action {
private static final String CATEGORY_ALL = "None";
private static final IntExtractor<Resource> RESOURCE_ID_EXTRACTOR = new IntExtractor<Resource>() {
public int extract(Resource object) {
return object.getId();
}
};
/**
* Retrieve this data and store it in the specified request parameters:
*
* <ul>
* <li><code>GroupValue</code> object identified by <code>Constants.RESOURCE_PARAM</code> request parameter in
* <code>Constants.RESOURCE_ATTR</code></li>
* <li><code>List</code> of available <code>AppdefResourceValue</code> objects (those not already associated with
* the group) in <code>Constants.AVAIL_RESOURCES_ATTR</code></li>
* <li><code>Integer</code> number of available roles in <code>Constants.NUM_AVAIL_RESOURCES_ATTR</code></li>
* <li><code>List</code> of pending <code>OwnedRoleValue</code> objects (those in queue to be associated with the
* resource) in <code>Constants.PENDING_RESOURCES_ATTR</code></li>
* <li><code>Integer</code> number of pending resources in <code>Constants.NUM_PENDING_RESOURCES_ATTR</code></li>
* <li><code>List</code> of pending <code>AppdefResourceValue</code> ids (those in queue to be associated with the
* resource) in <code>Constants.PENDING_RESOURCES_SES_ATTR</code></li>
* </ul>
*
* This Action edits 2 lists of Resources: pending, and available.
*/
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
Log log = LogFactory.getLog(AddGroupResourcesFormPrepareAction.class);
Subject user = RequestUtils.getSubject(request);
AddGroupResourcesForm addForm = (AddGroupResourcesForm) form;
Integer groupId = addForm.getGroupId();
PageControl pcAvail = WebUtility.getPageControl(request, "a");
PageControl pcPending = WebUtility.getPageControl(request, "p");
log.trace("available page control: " + pcAvail);
log.trace("pending page control: " + pcPending);
log.trace("getting group [" + groupId + "]");
/*
* pending resources are those on the right side of the "add to list" widget that are awaiting association with
* the group when the form's "ok" button is clicked.
*/
List<String> pendingResourceIdStrings = SessionUtils.getListAsListStr(request.getSession(),
Constants.PENDING_RESOURCES_SES_ATTR);
int[] pendingResourceIds = new int[pendingResourceIdStrings.size()];
for (int i = 0, sz = pendingResourceIdStrings.size(); i < sz; i++) {
pendingResourceIds[i] = Integer.parseInt(pendingResourceIdStrings.get(i));
}
ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
ResourceGroupManagerLocal resourceGroupManager = LookupUtil.getResourceGroupManager();
log.trace("getting pending resources for group [" + groupId + "]");
// pass true so that the parent is each resource is connected
PageList<Resource> pendingResources = resourceManager.findResourceByIds(user, pendingResourceIds, true,
pcPending);
PageList<DisambiguationReport<Resource>> disambiguatedpeningResources =
DisambiguatedResourceListUtil.disambiguate(resourceManager, pendingResources, RESOURCE_ID_EXTRACTOR);
request.setAttribute(Constants.PENDING_RESOURCES_ATTR, disambiguatedpeningResources);
request.setAttribute(Constants.NUM_PENDING_RESOURCES_ATTR, disambiguatedpeningResources.size());
/*
* available resources are all resources in the system that are not associated with the user and are not pending
*/
log.trace("getting available resources for group [" + groupId + "]");
String nameFilter = RequestUtils.getStringParameter(request, "nameFilter", null);
ResourceGroup resourceGroup = resourceGroupManager.getResourceGroupById(user, groupId, null);
PageList<Resource> availableResources = null;
if (resourceGroup.getGroupCategory() == GroupCategory.COMPATIBLE) {
ResourceType compatibleTypeFilter = resourceGroup.getResourceType();
availableResources = resourceManager.findAvailableResourcesForResourceGroup(user, groupId,
compatibleTypeFilter, null, nameFilter, pendingResourceIds, pcAvail);
} else if (resourceGroup.getGroupCategory() == GroupCategory.MIXED) {
ResourceCategory resourceCategory = getResourceCategory(addForm.getFilterBy());
availableResources = resourceManager.findAvailableResourcesForResourceGroup(user, groupId, null,
resourceCategory, nameFilter, pendingResourceIds, pcAvail);
addForm.setAvailResourceTypes(buildResourceTypes());
} else {
throw new IllegalArgumentException("AddGroupResourcesFormPrepareAction " + "does not support '"
+ resourceGroup.getClass().getSimpleName() + " group type");
}
PageList<DisambiguationReport<Resource>> disambiguatedAvailResources =
DisambiguatedResourceListUtil.disambiguate(resourceManager, availableResources, RESOURCE_ID_EXTRACTOR);
request.setAttribute(Constants.AVAIL_RESOURCES_ATTR, disambiguatedAvailResources);
request.setAttribute(Constants.NUM_AVAIL_RESOURCES_ATTR, disambiguatedAvailResources.size());
return null;
}
private ResourceCategory getResourceCategory(String categoryFilter) {
if ((categoryFilter == null) || categoryFilter.equals(CATEGORY_ALL)) {
return null;
} else {
return ResourceCategory.valueOf(categoryFilter);
}
}
/**
* builds a list of resource types (platform, server, service).
*
* @return a list of group types from the list
*/
private static List<LabelValueBean> buildResourceTypes() {
List<LabelValueBean> resourceCategoryTypes = new ArrayList<LabelValueBean>();
resourceCategoryTypes.add(new LabelValueBean(CATEGORY_ALL, CATEGORY_ALL));
for (ResourceCategory category : ResourceCategory.values()) {
resourceCategoryTypes.add(new LabelValueBean(category.toString(), category.name()));
}
return resourceCategoryTypes;
}
}