/*
* Jopr 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, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* 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 and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.jboss.on.common.jbossas;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.transfer.ContentResponseResult;
import org.rhq.core.domain.content.transfer.DeployIndividualPackageResponse;
import org.rhq.core.domain.content.transfer.DeployPackageStep;
import org.rhq.core.domain.content.transfer.DeployPackagesResponse;
import org.rhq.core.domain.content.transfer.RemovePackagesResponse;
import org.rhq.core.domain.content.transfer.ResourcePackageDetails;
import org.rhq.core.pluginapi.content.ContentFacet;
import org.rhq.core.pluginapi.content.ContentServices;
import org.rhq.core.util.exception.ThrowableUtil;
/**
* This is a base class for the ContentFacet implementation delegates for JBoss AS plugins.
*
* Much of the implementation is the same for both the AS 4 and AS5 and is implemented
* here. Subclasses (used in the server component implementations) specialize for the
* specific requirements of the different JBoss AS versions.
*
* @author Lukas Krejci
*/
public abstract class AbstractJBossASContentFacetDelegate implements ContentFacet {
private final Log log = LogFactory.getLog(AbstractJBossASContentFacetDelegate.class);
public static final String PACKAGE_TYPE_PATCH = "cumulativePatch";
public static final String PACKAGE_TYPE_LIBRARY = "library";
private JBPMWorkflowManager workflowManager;
protected AbstractJBossASContentFacetDelegate(JBPMWorkflowManager workflowManager) {
this.workflowManager = workflowManager;
}
/**
* This default implementation supports deploying a single patch. For that the packages set
* must contain a single package with the type name equal to {@link #PACKAGE_TYPE_PATCH}.
* <p>
* Packages of type {@link #PACKAGE_TYPE_LIBRARY} are unsupported, all other package types
* are silently ignored.
*
* @throws UnsupportedOperationException
* if the packages set contains a package of type {@link #PACKAGE_TYPE_LIBRARY}
*
* @return a package response describing th results of the deployment.
*/
public DeployPackagesResponse deployPackages(Set<ResourcePackageDetails> packages, ContentServices contentServices) {
ContentResponseResult overallResult = ContentResponseResult.SUCCESS;
List<DeployIndividualPackageResponse> individualResponses = new ArrayList<DeployIndividualPackageResponse>(
packages.size());
for (ResourcePackageDetails pkg : packages) {
log.info("Attempting to deploy package: " + pkg);
String packageTypeName = pkg.getPackageTypeName();
if (packageTypeName.equals(PACKAGE_TYPE_PATCH)) {
if (packages.size() > 1) {
log.warn("Attempt to install more than one patch at a time, installation aborted.");
DeployPackagesResponse response = new DeployPackagesResponse(ContentResponseResult.FAILURE);
response
.setOverallRequestErrorMessage("When deploying a patch, no other packages may be deployed at the same time.");
return response;
}
try {
DeployIndividualPackageResponse response = workflowManager.run(pkg);
if (response.getResult() == ContentResponseResult.FAILURE) {
overallResult = ContentResponseResult.FAILURE;
}
// just in case response is null, it would throw NPE on the getResult() check above but the item
// would already be a member in individualResponses; moving the add below the check ensures that
// only non-null instances of individualResponses will ever make it into the List
individualResponses.add(response);
} catch (Throwable throwable) {
log.error("Error deploying package: " + pkg, throwable);
// Don't forget to provide an individual response for the failed package.
DeployIndividualPackageResponse response = new DeployIndividualPackageResponse(pkg.getKey(),
ContentResponseResult.FAILURE);
response.setErrorMessage(ThrowableUtil.getStackAsString(throwable));
individualResponses.add(response);
overallResult = ContentResponseResult.FAILURE;
}
} else if (packageTypeName.equals(PACKAGE_TYPE_LIBRARY)) {
throw new UnsupportedOperationException("Deployment of new libraries is not supported by the plugin.");
}
}
DeployPackagesResponse response = new DeployPackagesResponse(overallResult);
response.getPackageResponses().addAll(individualResponses);
return response;
}
/**
* The default implementation of this method merely throws an
* unsupported operation exception.
*
* @throws UnsupportedOperationException
*
* @see ContentFacet#discoverDeployedPackages(PackageType)
*/
public Set<ResourcePackageDetails> discoverDeployedPackages(PackageType type) {
throw new UnsupportedOperationException();
}
public List<DeployPackageStep> generateInstallationSteps(ResourcePackageDetails packageDetails) {
log.info("Translating installation steps for package: " + packageDetails);
List<DeployPackageStep> steps = null;
String packageTypeName = packageDetails.getPackageTypeName();
if (packageTypeName.equals(PACKAGE_TYPE_PATCH)) {
try {
steps = workflowManager.translateSteps(packageDetails);
} catch (Exception e) {
log.error("Error translating installation steps for package: " + packageDetails, e);
}
log.info("Translated number of steps: " + (steps != null ? steps.size() : null));
}
return steps;
}
/**
* The default implementation of this method merely throws an
* unsupported operation exception.
*
* @throws UnsupportedOperationException
*
* @see ContentFacet#removePackages(Set)
*/
public RemovePackagesResponse removePackages(Set<ResourcePackageDetails> packages) {
throw new UnsupportedOperationException();
}
/**
* The default implementation of this method merely throws an
* unsupported operation exception.
*
* @throws UnsupportedOperationException
*
* @see ContentFacet#retrievePackageBits(ResourcePackageDetails)
*/
public InputStream retrievePackageBits(ResourcePackageDetails packageDetails) {
throw new UnsupportedOperationException();
}
/**
* @return the workflow manager
*/
protected JBPMWorkflowManager getWorkflowManager() {
return workflowManager;
}
}