/*
* Embedded Jopr Project
* Copyright (C) 2006-2009 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 Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser 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.jboss.on.embedded.ui.content;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.faces.application.FacesMessage;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.domain.content.PackageDetailsKey;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.clientapi.server.content.ContentDiscoveryReport;
import org.rhq.core.domain.content.transfer.DeployIndividualPackageResponse;
import org.rhq.core.clientapi.server.content.DeployPackagesRequest;
import org.rhq.core.domain.content.transfer.DeployPackagesResponse;
import org.rhq.core.domain.content.transfer.ResourcePackageDetails;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pc.PluginContainer;
import org.rhq.core.pc.content.ContentManager;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.on.embedded.ui.nav.JONTreeNode;
import org.jboss.on.embedded.ui.nav.ResourceTreeNode;
import org.jboss.on.embedded.util.ContentUtility;
/**
* A Seam action for updating the file backing a content-backed Resource (e.g. a WAR or an EAR).
*
* @author Ian Springer
*/
@Name("updateBackingContentAction")
@Scope(ScopeType.CONVERSATION)
public class UpdateBackingContentAction extends AbstractFileUploadAction implements Serializable
{
private final Log log = LogFactory.getLog(this.getClass());
@Out
private ResourceType resourceType;
@Out
private Resource resource;
@Out
private PackageType packageType;
@Out
private ResourcePackageDetails packageDetails;
@Begin(join = true)
public String init()
{
log.debug("Initializing updateBackingContentAction Seam component...");
JONTreeNode selectedNode = this.navigationAction.getSelectedNode();
ResourceTreeNode resourceTreeNode = (ResourceTreeNode)selectedNode;
this.resource = resourceTreeNode.getResource();
log.debug("Current Resource is " + this.resource);
this.resourceType = this.resource.getResourceType();
this.packageType = ContentUtility.getCreationPackageType(this.resourceType);
if (this.packageType == null)
{
log.error(this.resourceType + " has no associated creation package type.");
facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_ERROR, "content.resourceInstance.create.resourceTypeHasNoCreationPackageType");
return FAILURE_OUTCOME;
}
try
{
this.packageDetails = getBackingPackage();
}
catch (Exception e)
{
facesMessages.add(FacesMessage.SEVERITY_ERROR, e.getLocalizedMessage());
return FAILURE_OUTCOME;
}
return SUCCESS_OUTCOME;
}
@End(ifOutcome = {"success"})
public String updateBackingContent()
{
// NOTE: This check is necessary, because the "required" attribute of the Seam FileUpload component doesn't
// work.
if (getFileName() == null)
{
log.error("No file was specified in request to update backing file for " + this.resource + ".");
facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_ERROR,
"content.resourceInstance.update.noFileSelected");
return FAILURE_OUTCOME;
}
if (!getFileName().equals(this.packageDetails.getFileName()))
{
log.error("Specified file '" + getFileName() + "' does not have same filename as existing file '"
+ this.packageDetails.getFileName() + "' for " + this.resource + ".");
facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_WARN,
"content.resourceInstance.update.wrongFileName", this.packageType.getDisplayName(),
this.packageDetails.getFileName());
return FAILURE_OUTCOME;
}
log.debug("Updating content-backed " + this.resourceType + " Resource " + getFileName() + "...");
File tempFile;
try
{
tempFile = writeTempFile();
}
catch (IOException e)
{
return FAILURE_OUTCOME;
}
// TODO: Allow user to specify version?
String version = String.valueOf(System.currentTimeMillis());
PackageDetailsKey key = new PackageDetailsKey(tempFile.getPath(), version, this.packageType.getName(),
PACKAGE_ARCHITECTURE);
ResourcePackageDetails detail = new ResourcePackageDetails(key);
//detail.setDeploymentTimeConfiguration(this.packageDetails.getDeploymentTimeConfiguration());
Set<ResourcePackageDetails> packageDetails = new HashSet<ResourcePackageDetails>();
packageDetails.add(detail);
DeployPackagesRequest deployPackagesRequest = new DeployPackagesRequest(1, this.resource.getId(), packageDetails);
ContentManager contentManager = PluginContainer.getInstance().getContentManager();
DeployIndividualPackageResponse deployPackageResponse;
try
{
DeployPackagesResponse deployPackagesResponse = contentManager.deployPackagesImmediately(deployPackagesRequest);
deployPackageResponse = deployPackagesResponse.getPackageResponses().iterator().next();
}
catch (Exception e)
{
facesMessages.add(FacesMessage.SEVERITY_FATAL, e.getLocalizedMessage());
return FAILURE_OUTCOME;
}
switch (deployPackageResponse.getResult())
{
case SUCCESS:
facesMessages.add(FacesMessage.SEVERITY_INFO, "{0} {1} updated.", this.packageType.getDisplayName(),
this.packageDetails.getFileName());
return SUCCESS_OUTCOME;
default:
String cause = (deployPackageResponse.getErrorMessage() != null) ?
deployPackageResponse.getErrorMessage() : "unknown";
facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_ERROR, "content.resourceInstance.update.failure",
getFileName(), cause);
return FAILURE_OUTCOME;
}
}
private ResourcePackageDetails getBackingPackage() throws Exception
{
ContentDiscoveryReport report;
try
{
report = PluginContainer.getInstance().getContentManager().executeResourcePackageDiscoveryImmediately(
this.resource.getId(), this.packageType.getName());
if (report.getDeployedPackages().isEmpty())
throw new IllegalStateException("Backing " + this.packageType.getName() + " package not found for "
+ this.resource + ".");
if (report.getDeployedPackages().size() > 1)
throw new IllegalStateException("More than one " + this.packageType.getName() + " package found for "
+ this.resource + ".");
}
catch (PluginContainerException e)
{
throw new Exception("Failed to discover underlying " + this.packageType.getName() + " package for "
+ this.resourceType.getName() + " Resource.", e);
}
ResourcePackageDetails packageDetails = report.getDeployedPackages().iterator().next();
log.debug("Backing package for " + this.resource + " is " + packageDetails + ".");
return packageDetails;
}
}