/* * 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 javax.faces.application.FacesMessage; import javax.faces.component.UIData; import javax.faces.model.DataModel; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.content.Package; import org.rhq.core.domain.content.PackageVersion; import org.rhq.core.domain.content.composite.PackageVersionComposite; import org.rhq.core.domain.resource.InvalidPackageTypeException; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.core.gui.util.FacesContextUtility; import org.rhq.enterprise.gui.common.framework.PagedDataTableUIBean; import org.rhq.enterprise.gui.common.paging.PageControlView; import org.rhq.enterprise.gui.common.paging.PagedListDataModel; 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; /** * Bean responsible for the end of the deploy package workflow. This bean will provide the list of packages that * have been selected (and ultimately configured by the user) to be deployed to the agent. This bean also provides * the action to perform the actual deployment. * * @author Jason Dobies */ public class DeployPackagesUIBean extends PagedDataTableUIBean { public static final String MANAGED_BEAN_NAME = "DeployPackagesUIBean"; private int[] selectedPackageIds; private UIData packagesToDeployData; private String notes; private final Log log = LogFactory.getLog(this.getClass()); /** * JSF action that will actually make the call to deploy the packages in the workflow. * * @return navigation outcome */ public String deployPackages() { if (notes != null && notes.length() > 512) { FacesContextUtility .addMessage(FacesMessage.SEVERITY_ERROR, "Package notes must be 512 characters or less."); return null; } HttpServletRequest request = FacesContextUtility.getRequest(); HttpSession session = request.getSession(); int[] packageIds = (int[]) session.getAttribute("selectedPackages"); // Going forward, we'll need to create this earlier and store the user entered configuration in these // objects. jdobies, Mar 3, 2008 // The following code is completely unnecessary as the package version ids are already // stored in session. ContentUIManagerLocal contentUIManager = LookupUtil.getContentUIManager(); int[] packagesVersionsIdsToDeploy = new int[packageIds.length]; for (int iterator = 0; iterator < packageIds.length; iterator++) { PackageVersion packageVersion = contentUIManager.getPackageVersion(packageIds[iterator]); packagesVersionsIdsToDeploy[iterator] = packageVersion.getId(); } Subject subject = EnterpriseFacesContextUtility.getSubject(); Resource resource = EnterpriseFacesContextUtility.getResource(); try { ContentManagerLocal contentManager = LookupUtil.getContentManager(); contentManager.deployPackagesWithNote(subject, new int[] { resource.getId() }, packagesVersionsIdsToDeploy, notes); } catch (InvalidPackageTypeException e) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, e.getMessage()); return null; } catch (Exception e) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Could not send deploy request to agent", e); return null; } return "successOrFailure"; } public DataModel getDataModel() { if (dataModel == null) { dataModel = new DeployPackagesDataModel(PageControlView.PackagesToDeployList, MANAGED_BEAN_NAME); } return dataModel; } public UIData getPackagesToDeployData() { return packagesToDeployData; } public void setPackagesToDeployData(UIData packagesToDeployData) { this.packagesToDeployData = packagesToDeployData; } public String getNotes() { if (notes == null) { HttpServletRequest request = FacesContextUtility.getRequest(); HttpSession session = request.getSession(); int[] packageIds = (int[]) session.getAttribute("selectedPackages"); ContentUIManagerLocal contentUIManager = LookupUtil.getContentUIManager(); StringBuffer sb = new StringBuffer("Packages: "); int counter = 0; for (int pkgId : packageIds) { PackageVersion packageVersion = contentUIManager.getPackageVersion(pkgId); 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 != (packageIds.length - 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++ < (packageIds.length - 1)) sb.append(", "); } notes = sb.toString(); } return notes; } public void setNotes(String notes) { this.notes = notes; } public int[] getSelectedPackageIds() { if (selectedPackageIds == null) { selectedPackageIds = (int[]) FacesContextUtility.getRequest().getSession().getAttribute("selectedPackages"); } return selectedPackageIds; } private class DeployPackagesDataModel extends PagedListDataModel<PackageVersionComposite> { private DeployPackagesDataModel(PageControlView view, String beanName) { super(view, beanName); } public PageList<PackageVersionComposite> fetchPage(PageControl pc) { Subject subject = EnterpriseFacesContextUtility.getSubject(); ContentUIManagerLocal contentUIManager = LookupUtil.getContentUIManager(); PageList<PackageVersionComposite> results = contentUIManager.getPackageVersionComposites(subject, getSelectedPackageIds(), pc); return results; } } }