Package org.jboss.on.embedded.ui.content

Source Code of org.jboss.on.embedded.ui.content.UpdateBackingContentAction

/*
* 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;
    }
}
TOP

Related Classes of org.jboss.on.embedded.ui.content.UpdateBackingContentAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.