/*
* 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.content;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.content.InstalledPackage;
import org.rhq.core.domain.content.Package;
import org.rhq.core.domain.content.PackageVersion;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.content.ContentManagerLocal;
import org.rhq.enterprise.server.content.ContentUIManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* @author Jason Dobies
*/
public class DeletePackagesUIBean {
private Resource resource;
private String[] packageIdsToDelete;
private List<InstalledPackage> packagesToDelete;
private String notes;
public String beginDeleteWorkflow() {
getPackageIdsToDelete();
return "beginDeleteWorkflow";
}
public String deleteSelectedInstalledPackages() {
if (notes != null && notes.length() > 512) {
FacesContextUtility
.addMessage(FacesMessage.SEVERITY_ERROR, "Package notes must be 512 characters or less.");
return null;
}
Subject subject = EnterpriseFacesContextUtility.getSubject();
resource = EnterpriseFacesContextUtility.getResource();
String[] selectedPackages = (String[]) FacesContextUtility.getRequest().getSession().getAttribute(
"packageIdsToDelete");
// Load installed packages for call to EJB
int[] installedPackageIds = new int[selectedPackages.length];
for (int i = 0; i < selectedPackages.length; i++) {
installedPackageIds[i] = Integer.parseInt(selectedPackages[i]);
}
// Execute the delete
try {
ContentManagerLocal contentManager = LookupUtil.getContentManager();
contentManager.deletePackages(subject, resource.getId(), installedPackageIds, notes);
} catch (Exception e) {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Failed to delete packages. Cause: " + e);
}
// Sleep just enough to let "fast" operations complete before being redirected
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
// Let this thread be interrupted without user warning
}
return "successOrFailure";
}
public Resource getResource() {
if (resource == null) {
resource = EnterpriseFacesContextUtility.getResource();
}
return resource;
}
public void setResource(Resource resource) {
this.resource = resource;
}
public List<InstalledPackage> getPackagesToDelete() {
if (packagesToDelete == null) {
if (getPackageIdsToDelete() == null)
return Collections.EMPTY_LIST;
packagesToDelete = new ArrayList<InstalledPackage>(packageIdsToDelete.length);
ContentUIManagerLocal contentUIManager = LookupUtil.getContentUIManager();
for (String installedPackageId : packageIdsToDelete) {
int iInstalledPackageId = Integer.parseInt(installedPackageId);
InstalledPackage installedPackage = contentUIManager.getInstalledPackage(iInstalledPackageId);
packagesToDelete.add(installedPackage);
}
}
return packagesToDelete;
}
public void setPackagesToDelete(List<InstalledPackage> packagesToDelete) {
this.packagesToDelete = packagesToDelete;
}
public String[] getPackageIdsToDelete() {
HttpServletRequest request = FacesContextUtility.getRequest();
HttpSession session = request.getSession();
if (request.getParameterValues("selectedPackages") != null) {
packageIdsToDelete = request.getParameterValues("selectedPackages");
session.setAttribute("packageIdsToDelete", packageIdsToDelete);
} else {
packageIdsToDelete = (String[]) session.getAttribute("packageIdsToDelete");
}
return packageIdsToDelete;
}
public void setPackageIdsToDelete(String[] packageIdsToDelete) {
this.packageIdsToDelete = packageIdsToDelete;
}
public String getNotes() {
if (notes == null) {
List<InstalledPackage> installedPackages = getPackagesToDelete();
StringBuffer sb = new StringBuffer("Packages: ");
int counter = 0;
for (InstalledPackage installedPackage : installedPackages) {
PackageVersion packageVersion = installedPackage.getPackageVersion();
Package generalPackage = packageVersion.getGeneralPackage();
String version = packageVersion.getDisplayVersion() != null ? packageVersion.getDisplayVersion()
: packageVersion.getVersion();
String packageToAppend = generalPackage.getName() + " " + version;
// Don't generate notes that would fail our own validation
if (sb.toString().length() + packageToAppend.length() > 508) {
// If we're not at the last package yet, add ... to show there were more
if (counter != (installedPackages.size() - 1)) {
sb.append("...");
break;
}
// If we are at the last package, see if this one will fit, otherwise add ...
if (sb.toString().length() + packageToAppend.length() <= 511) {
sb.append(packageToAppend);
} else {
sb.append("...");
}
break;
}
sb.append(packageToAppend);
if (counter++ < (installedPackages.size() - 1))
sb.append(", ");
}
notes = sb.toString();
}
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
}