/*
* Jopr Management Platform
* Copyright (C) 2005-2011 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.rhq.plugins.jbossas5.util;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.deployers.spi.management.deploy.DeploymentManager;
import org.jboss.deployers.spi.management.deploy.DeploymentProgress;
import org.jboss.deployers.spi.management.deploy.DeploymentStatus;
import org.jboss.profileservice.spi.DeploymentOption;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.plugins.jbossas5.AbstractManagedDeploymentComponent;
/**
* A set of utility methods for deploying applications.
*
* @author Ian Springer
*/
public class DeploymentUtils {
private static final Log LOG = LogFactory.getLog(DeploymentUtils.class);
public static boolean hasCorrectExtension(String archiveFileName, ResourceType resourceType) {
Configuration defaultPluginConfig = ResourceTypeUtils.getDefaultPluginConfiguration(resourceType);
String expectedExtension = defaultPluginConfig.getSimple(AbstractManagedDeploymentComponent.EXTENSION_PROPERTY)
.getStringValue();
if (expectedExtension == null)
throw new IllegalStateException("No value was defined for the required '"
+ AbstractManagedDeploymentComponent.EXTENSION_PROPERTY + "' plugin config prop for " + resourceType);
int lastPeriod = archiveFileName.lastIndexOf(".");
String extension = (lastPeriod != -1) ? archiveFileName.substring(lastPeriod + 1) : null;
// Use File.equals() to compare the extensions so case-sensitivity is correct for this platform.
return (extension != null && new File(extension).equals(new File(expectedExtension)));
}
/**
* Deploys (i.e. distributes then starts) the specified archive file.
*
* @param deploymentManager
* @param archiveFile
* @param deployExploded
*
* @return
*
* @throws Exception if the deployment fails for any reason
*/
public static String[] deployArchive(DeploymentManager deploymentManager, File archiveFile, boolean deployExploded)
throws Exception {
String archiveFileName = archiveFile.getName();
LOG.debug("Deploying '" + archiveFileName + "' (deployExploded=" + deployExploded + ")...");
URL contentURL;
try {
contentURL = archiveFile.toURI().toURL();
} catch (MalformedURLException e) {
throw new IllegalArgumentException("Failed to convert archive file path '" + archiveFile + "' to URL.", e);
}
List<DeploymentOption> deploymentOptions = new ArrayList<DeploymentOption>();
if (deployExploded) {
deploymentOptions.add(DeploymentOption.Explode);
}
DeploymentProgress progress = null;
DeploymentStatus distributeStatus;
Exception distributeFailure = null;
try {
progress = deploymentManager.distribute(archiveFileName, contentURL,
deploymentOptions.toArray(new DeploymentOption[deploymentOptions.size()]));
distributeStatus = run(progress);
if (distributeStatus.isFailed()) {
distributeFailure = (distributeStatus.getFailure() != null) ? distributeStatus.getFailure()
: new Exception("Distribute failed for unknown reason.");
}
} catch (Exception e) {
distributeFailure = e;
}
if (distributeFailure != null) {
throw new Exception("Failed to distribute '" + contentURL + "' to '" + archiveFileName + "' - cause: "
+ ThrowableUtil.getAllMessages(distributeFailure));
}
// Now that we've successfully distributed the deployment, try to start it.
String[] deploymentNames = progress.getDeploymentID().getRepositoryNames();
DeploymentStatus startStatus;
Exception startFailure = null;
try {
progress = deploymentManager.start(deploymentNames);
startStatus = run(progress);
if (startStatus.isFailed()) {
startFailure = (startStatus.getFailure() != null) ? startStatus.getFailure() : new Exception(
"Start failed for unknown reason.");
}
} catch (Exception e) {
startFailure = e;
}
if (startFailure != null) {
// There are times when the user expects the app to fail to start, so just log a warning.
LOG.warn("Failed to start deployment " + Arrays.asList(deploymentNames) + " during deployment of '"
+ archiveFileName + "'.", startFailure);
}
return deploymentNames;
}
public static DeploymentStatus run(DeploymentProgress progress) {
progress.run();
return progress.getDeploymentStatus();
}
private DeploymentUtils() {
}
}