blob: 13ad65e1179e9cec5f1c77d07db624a1e882fc98 [file] [log] [blame]
/*
* Copyright (c) 2007, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package org.apache.openejb.cts.deploy;
import java.lang.String;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import java.util.Iterator;
import java.util.Hashtable;
import java.io.*;
import java.util.jar.Manifest;
import java.net.URL;
import java.net.URLClassLoader;
// Harness imports
import com.sun.ts.lib.util.TestUtil;
// J2EE Deployment imports
import javax.enterprise.deploy.spi.*;
import javax.enterprise.deploy.spi.status.*;
import javax.enterprise.deploy.spi.exceptions.*;
import javax.enterprise.deploy.model.*;
import javax.enterprise.deploy.shared.*;
import javax.enterprise.deploy.model.*;
import java.io.*;
import java.util.*;
import javax.enterprise.deploy.shared.factories.*;
import javax.enterprise.deploy.spi.*;
import javax.enterprise.deploy.spi.exceptions.*;
import javax.enterprise.deploy.spi.factories.*;
public class DeployTestUtil {
public static final String DEPLOYMENT_MANIFEST_ENTRY_NAME = "J2EE-DeploymentFactory-Implementation-Class";
public static final String FILE_ARCHIVE = "FILE";
public static final String STREAM_ARCHIVE = "STREAM";
public static final String APPLICATION_ARCHIVE = "APPLICATION";
public static final String STAND_ALONE_ARCHIVE = "STAND_ALONE";
private DeploymentManager dm = null;
private DMProps dmp;
private DeploymentManager disconnectedDM;
/**
*
* Construct a DeployTestUtil object. Load the DeploymentFactories from the
* provided jarfile, and get a DeploymentManager instance.
*
*/
public DeployTestUtil(DMProps dmprops) throws Exception {
dmp = dmprops;
loadDMFactories();
}
public DeploymentManager getDeploymentManager()
throws DeploymentManagerCreationException {
if (dm == null) {
DeploymentFactoryManager dfmanager = DeploymentFactoryManager
.getInstance();
dm = dfmanager.getDeploymentManager(dmp.getURI(), dmp.getUname(),
dmp.getPasswd());
TestUtil.logHarnessDebug(
"$$$$$$$$$$$$$$$[" + dmp.getUname() + ", " + dmp.getPasswd() + "]");
TestUtil.logHarness("amd Obtained FRESH DeploymentManager");
} else {
TestUtil.logHarness("amd Obtained CACHED DeploymentManager");
}
System.out.println(dm);
return dm;
}
public DeploymentManager getDisconnectedDeploymentManager()
throws DeploymentManagerCreationException {
if (disconnectedDM == null) {
TestUtil.logHarness("DeployTestUtil.getDeploymentManager called");
DeploymentFactoryManager dfmanager = DeploymentFactoryManager
.getInstance();
disconnectedDM = dfmanager.getDisconnectedDeploymentManager(dmp.getURI());
}
return (disconnectedDM);
}
public Vector getDeploymentFactoryClassNames() throws Exception {
File deployPlatformJarFile;
try {
deployPlatformJarFile = new File(dmp.getJarFile());
} catch (Exception e) {
throw new Exception(
"Could not contruct file object: " + dmp.getJarFile());
}
// Obtain DeploymentFactory names from manifest and load those entries
TestUtil.logHarness("loadDeploymentFactories loading factories from file:"
+ deployPlatformJarFile.getName());
Manifest mf = new java.util.jar.JarFile(deployPlatformJarFile)
.getManifest();
// This should be rewritten to get multiple class names from the manifest
String dfClassNames = mf.getMainAttributes()
.getValue(DEPLOYMENT_MANIFEST_ENTRY_NAME);
if (dfClassNames == null) {
throw new Exception(
"Invalid Jar File: Jar file does not have entry for Deployment factories");
}
// Parse class names, assuming that class names are separated by space
java.util.StringTokenizer st = new java.util.StringTokenizer(dfClassNames,
" ");
Vector classNames = new Vector();
while (st.hasMoreTokens()) {
classNames.add(st.nextToken());
}
return (classNames);
}
private void loadDMFactories() throws Exception {
TestUtil.logHarness("DeployTestUtil.loadDMFactories called");
TestUtil.logHarness(
"DeployTestUtil.loadDMFactories using jarfile: " + dmp.getJarFile());
loadDeploymentFactories();
}
private void loadDeploymentFactories() throws Exception {
File deployPlatformJarFile;
try {
deployPlatformJarFile = new File(dmp.getJarFile());
} catch (Exception e) {
throw new Exception(
"Could not contruct file object: " + dmp.getJarFile());
}
// Obtain DeploymentFactory names from manifest and load those entries
TestUtil.logHarness("loadDeploymentFactories loading factories from file:"
+ deployPlatformJarFile.getName());
Manifest mf = new java.util.jar.JarFile(deployPlatformJarFile)
.getManifest();
// This should be rewritten to get multiple class names from the manifest
TestUtil.logHarness(
"Looking for manifest entry: " + DEPLOYMENT_MANIFEST_ENTRY_NAME);
String dfClassNames = mf.getMainAttributes()
.getValue(DEPLOYMENT_MANIFEST_ENTRY_NAME);
if (dfClassNames == null) {
throw new Exception("Invalid Jar File: No manifest entry.");
}
// Parse class names, assuming that class names are separated by space
java.util.StringTokenizer st = new java.util.StringTokenizer(dfClassNames,
" ");
Vector classNames = new Vector();
while (st.hasMoreTokens())
classNames.add(st.nextToken());
// Load classes
try {
URL[] urls = new URL[] { deployPlatformJarFile.toURL() };
URLClassLoader urlClassLoader = new URLClassLoader(urls,
this.getClass().getClassLoader());
// Do i need to set the contect class loader ?
TestUtil.logHarness(
"loadDeploymentFactories about to load classes :" + dfClassNames);
Thread.currentThread().setContextClassLoader(urlClassLoader);
// Load all classes
for (int classNameIndex = 0; classNameIndex < classNames
.size(); classNameIndex++) {
Class factory = null;
DeploymentFactory df = null;
try {
factory = urlClassLoader
.loadClass((String) classNames.elementAt(classNameIndex));
df = (DeploymentFactory) factory.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
if (df instanceof DeploymentFactory) {
DeploymentFactoryManager.getInstance()
.registerDeploymentFactory((DeploymentFactory) df);
TestUtil
.logMsg("Registered DeploymentFactory: " + df.getDisplayName());
} else {
throw new Exception("Does not implement DeploymentFactory");
}
// Class.forName((String)classNames.elementAt(classNameIndex),
// true, urlClassLoader);
// Register DeploymentFactory with DeploymentFactoryManager
// DeploymentFactory df = (DeploymentFactory)classNames.elementAt
// (classNameIndex);
}
} catch (Exception ex) {
ex.printStackTrace();
throw new Exception(
"Could not load DeploymentFactory class: " + ex.getMessage());
}
}
public void releaseDeploymentManager() {
if (dm != null) {
TestUtil.logHarness("amd Releasing DeploymentManager amd");
this.dm.release();
}
if (disconnectedDM != null) {
TestUtil.logHarness("amd Releasing DISCONNECTED DeploymentManager amd");
this.disconnectedDM.release();
}
TestUtil.logHarness(" amd Released DeploymentManager amd ");
}
public boolean checkIfModuleExists(TargetModuleID moduleToCheck,
TargetModuleID[] modulesList) {
boolean exists = false;
if (moduleToCheck == null) {
return exists;
}
int numMods = (modulesList == null) ? 0 : modulesList.length;
for (int modIndex = 0; modIndex < numMods; modIndex++) {
if (moduleToCheck.getModuleID()
.equals(modulesList[modIndex].getModuleID())) {
// Also check for same targets.
if (moduleToCheck.getTarget().getName()
.equals(modulesList[modIndex].getTarget().getName())) {
exists = true;
break;
}
}
}
return exists;
}
/*
* If the operation is successful then TargetModuleID is a valid module id.
* Else it will be null
**/
public TargetModuleID distributeModuleArchive(Target[] targets,
File moduleArchive, File deploymentPlan) throws Exception {
DeploymentManager dm = getDeploymentManager();
ProgressHandler progressHandler = new ProgressHandler();
ProgressObject progress = dm.distribute(targets, moduleArchive,
deploymentPlan);
progress.addProgressListener(progressHandler);
progressHandler.start();
// Wait for the progress handler to complete its job
progressHandler.join();
StateType completionState = progressHandler.getCompletionState();
if (completionState.getValue() != StateType.COMPLETED.getValue()) {
// The state must be either FAILED, or RELEASED
return null;
}
TargetModuleID[] resultModuleIDs = progress.getResultTargetModuleIDs();
if (resultModuleIDs.length < 1) {
// There should be atleast one target module id if progress is
// successfully complete
return null;
}
return resultModuleIDs[0];
}
/*
* If the operation is successful then TargetModuleID is a valid module id.
* Else it will be null
**/
public TargetModuleID distributeModuleStream(Target[] targets,
ModuleType moduleType, InputStream moduleArchive,
InputStream deploymentPlan, boolean oneDotFiveApi) throws Exception {
String apiType = (oneDotFiveApi == true) ? "1.5 API" : "deprecated API";
TestUtil.logMsg("Calling distribute(): Using " + apiType);
DeploymentManager dm = getDeploymentManager();
ProgressHandler progressHandler = new ProgressHandler();
ProgressObject progress = dm.distribute(targets, moduleArchive, deploymentPlan);
progress.addProgressListener(progressHandler);
progressHandler.start();
// Wait for the progress handler to complete its job
progressHandler.join();
StateType completionState = progressHandler.getCompletionState();
if (completionState.getValue() != StateType.COMPLETED.getValue()) {
// The state must be either FAILED, or RELEASED
return null;
}
TargetModuleID[] resultModuleIDs = progress.getResultTargetModuleIDs();
if (resultModuleIDs.length < 1) {
// There should be atleast one target module id if progress is
// successfully complete
return null;
}
return resultModuleIDs[0];
}
/*
* If the operation is successful then TargetModuleID is a valid module id.
* Else it will be null
**/
public TargetModuleID startModule(TargetModuleID moduleToStart)
throws Exception {
DeploymentManager dm = getDeploymentManager();
ProgressHandler progressHandler = new ProgressHandler();
ProgressObject progress = dm.start(new TargetModuleID[] { moduleToStart });
progress.addProgressListener(progressHandler);
progressHandler.start();
// Wait for the progress handler to complete its job
progressHandler.join();
StateType completionState = progressHandler.getCompletionState();
if (completionState.getValue() != StateType.COMPLETED.getValue()) {
// The state must be either FAILED, or RELEASED
return null;
}
TargetModuleID[] resultModuleIDs = progress.getResultTargetModuleIDs();
if (resultModuleIDs.length < 1) {
// There should be atleast one target module id if progress is
// successfully complete
return null;
}
return resultModuleIDs[0];
}
/*
* If the operation is successful then TargetModuleID is a valid module id.
* Else it will be null
**/
public TargetModuleID stopModule(TargetModuleID moduleToStop)
throws Exception {
DeploymentManager dm = getDeploymentManager();
ProgressHandler progressHandler = new ProgressHandler();
ProgressObject progress = dm.stop(new TargetModuleID[] { moduleToStop });
progress.addProgressListener(progressHandler);
progressHandler.start();
// Wait for the progress handler to complete its job
progressHandler.join();
StateType completionState = progressHandler.getCompletionState();
if (completionState.getValue() != StateType.COMPLETED.getValue()) {
// The state must be either FAILED, or RELEASED
return null;
}
TargetModuleID[] resultModuleIDs = progress.getResultTargetModuleIDs();
if (resultModuleIDs.length < 1) {
// There should be atleast one target module id if progress is
// successfully complete
return null;
}
return resultModuleIDs[0];
}
/*
* If the operation is successful then TargetModuleID is a valid module id.
* Else it will be null
**/
public TargetModuleID undeployModule(TargetModuleID moduleToUndeploy)
throws Exception {
DeploymentManager dm = getDeploymentManager();
ProgressHandler progressHandler = new ProgressHandler();
ProgressObject progress = dm
.undeploy(new TargetModuleID[] { moduleToUndeploy });
progress.addProgressListener(progressHandler);
progressHandler.start();
// Wait for the progress handler to complete its job
progressHandler.join();
StateType completionState = progressHandler.getCompletionState();
if (completionState.getValue() != StateType.COMPLETED.getValue()) {
// The state must be either FAILED, or RELEASED
return null;
}
TargetModuleID[] resultModuleIDs = progress.getResultTargetModuleIDs();
if (resultModuleIDs.length < 1) {
// There should be atleast one target module id if progress is
// successfully complete
return null;
}
return resultModuleIDs[0];
}
/*
* If the operation is successful then TargetModuleID is a valid module id.
* Else it will be null
**/
public TargetModuleID redeployModuleArchive(TargetModuleID[] targetModuleIds,
File moduleArchive, File deploymentPlan) throws Exception {
DeploymentManager dm = getDeploymentManager();
ProgressHandler progressHandler = new ProgressHandler();
ProgressObject progress = dm.redeploy(targetModuleIds, moduleArchive,
deploymentPlan);
progress.addProgressListener(progressHandler);
progressHandler.start();
// Wait for the progress handler to complete its job
progressHandler.join();
StateType completionState = progressHandler.getCompletionState();
if (completionState.getValue() != StateType.COMPLETED.getValue()) {
// The state must be either FAILED, or RELEASED
return null;
}
TargetModuleID[] resultModuleIDs = progress.getResultTargetModuleIDs();
if (resultModuleIDs.length < 1) {
// There should be atleast one target module id if progress is
// successfully complete
return null;
}
return resultModuleIDs[0];
}
/*
* If the operation is successful then TargetModuleID is a valid module id.
* Else it will be null
**/
public TargetModuleID redeployModuleStream(TargetModuleID[] targetModuleIds,
InputStream moduleArchive, InputStream deploymentPlan) throws Exception {
DeploymentManager dm = getDeploymentManager();
ProgressHandler progressHandler = new ProgressHandler();
ProgressObject progress = dm.redeploy(targetModuleIds, moduleArchive,
deploymentPlan);
progress.addProgressListener(progressHandler);
progressHandler.start();
// Wait for the progress handler to complete its job
progressHandler.join();
StateType completionState = progressHandler.getCompletionState();
if (completionState.getValue() != StateType.COMPLETED.getValue()) {
// The state must be either FAILED, or RELEASED
return null;
}
TargetModuleID[] resultModuleIDs = progress.getResultTargetModuleIDs();
if (resultModuleIDs.length < 1) {
// There should be atleast one target module id if progress is
// successfully complete
return null;
}
return resultModuleIDs[0];
}
public boolean testDistributeModule(ModuleType moduleType, File moduleArchive,
File deploymentPlan, String archiveType, boolean oneDotFiveApi)
throws Exception {
DeploymentManager dm = getDeploymentManager();
Target[] targets = dm.getTargets();
if (targets.length == 0)
return false;
Target targetToDeploy = targets[0];
TargetModuleID distributedModuleID = null;
TargetModuleID[] moduleIDsBeforeDistribute = dm
.getAvailableModules(moduleType, new Target[] { targetToDeploy });
if (archiveType.equals(FILE_ARCHIVE)) {
distributedModuleID = distributeModuleArchive(
new Target[] { targetToDeploy }, moduleArchive, deploymentPlan);
} else {
FileInputStream moduleStream = (moduleArchive == null) ? null
: new FileInputStream(moduleArchive);
FileInputStream planStream = (deploymentPlan == null) ? null
: new FileInputStream(deploymentPlan);
distributedModuleID = distributeModuleStream(
new Target[] { targetToDeploy }, moduleType, moduleStream, planStream,
oneDotFiveApi);
}
// If the distributedModuleID == null, the test is failed
if (distributedModuleID == null)
return false;
// Check if distriburtedModuleID has the same target as deployed target
if (!distributedModuleID.getTarget().getName()
.equals(targetToDeploy.getName()))
return false;
TargetModuleID[] moduleIDsAfterDistribute = dm
.getAvailableModules(moduleType, new Target[] { targetToDeploy });
boolean moduleExistsBeforeDistribute = checkIfModuleExists(
distributedModuleID, moduleIDsBeforeDistribute);
boolean moduleExistsAfterDistribute = checkIfModuleExists(
distributedModuleID, moduleIDsAfterDistribute);
// Clean up....
// undeploy the module
undeployModule(distributedModuleID);
if ((!moduleExistsBeforeDistribute) && moduleExistsAfterDistribute)
return true;
else
return false;
}
public boolean testStartModule(ModuleType moduleType, File moduleArchive,
File deploymentPlan, String archiveType) throws Exception {
DeploymentManager dm = getDeploymentManager();
Target[] targets = dm.getTargets();
if (targets.length == 0)
return false;
Target targetToDeploy = targets[0];
TargetModuleID distributedModuleID = null;
TargetModuleID[] moduleIDsBeforeDistribute = dm
.getAvailableModules(moduleType, new Target[] { targetToDeploy });
if (archiveType.equals(FILE_ARCHIVE)) {
distributedModuleID = distributeModuleArchive(
new Target[] { targetToDeploy }, moduleArchive, deploymentPlan);
} else {
distributedModuleID = distributeModuleStream(
new Target[] { targetToDeploy }, moduleType,
new FileInputStream(moduleArchive),
new FileInputStream(deploymentPlan), true);
}
// If the distributedModuleID == null, the test is failed
if (distributedModuleID == null)
return false;
// Check if distriburtedModuleID has the same target as deployed target
if (!distributedModuleID.getTarget().getName()
.equals(targetToDeploy.getName()))
return false;
TargetModuleID[] moduleIDsAfterDistribute = dm
.getAvailableModules(moduleType, new Target[] { targetToDeploy });
boolean moduleExistsBeforeDistribute = checkIfModuleExists(
distributedModuleID, moduleIDsBeforeDistribute);
boolean moduleExistsAfterDistribute = checkIfModuleExists(
distributedModuleID, moduleIDsAfterDistribute);
if (!((!moduleExistsBeforeDistribute) && moduleExistsAfterDistribute))
return false;
// start the module
TargetModuleID startedModuleID = null;
startedModuleID = startModule(distributedModuleID);
if (startedModuleID == null)
return false;
// Check that the startedModuleID is same as deployed module id
if (!startedModuleID.getModuleID()
.equals(distributedModuleID.getModuleID()))
return false;
TargetModuleID[] runningModules = dm.getRunningModules(moduleType,
new Target[] { targetToDeploy });
boolean result = false;
if (checkIfModuleExists(startedModuleID, runningModules))
result = true;
// Clean up....
// undeploy the module
stopModule(startedModuleID);
undeployModule(startedModuleID);
return result;
}
public boolean testStopModule(ModuleType moduleType, File moduleArchive,
File deploymentPlan, String archiveType) throws Exception {
DeploymentManager dm = getDeploymentManager();
Target[] targets = dm.getTargets();
if (targets.length == 0)
return false;
Target targetToDeploy = targets[0];
TargetModuleID distributedModuleID = null;
TargetModuleID[] moduleIDsBeforeDistribute = dm
.getAvailableModules(moduleType, new Target[] { targetToDeploy });
if (archiveType.equals(FILE_ARCHIVE)) {
distributedModuleID = distributeModuleArchive(
new Target[] { targetToDeploy }, moduleArchive, deploymentPlan);
} else {
distributedModuleID = distributeModuleStream(
new Target[] { targetToDeploy }, moduleType,
new FileInputStream(moduleArchive),
new FileInputStream(deploymentPlan), true);
}
// If the distributedModuleID == null, the test is failed
if (distributedModuleID == null)
return false;
// Check if distriburtedModuleID has the same target as deployed target
if (!distributedModuleID.getTarget().getName()
.equals(targetToDeploy.getName()))
return false;
TargetModuleID[] moduleIDsAfterDistribute = dm
.getAvailableModules(moduleType, new Target[] { targetToDeploy });
boolean moduleExistsBeforeDistribute = checkIfModuleExists(
distributedModuleID, moduleIDsBeforeDistribute);
boolean moduleExistsAfterDistribute = checkIfModuleExists(
distributedModuleID, moduleIDsAfterDistribute);
if (!((!moduleExistsBeforeDistribute) && moduleExistsAfterDistribute))
return false;
// start the module
TargetModuleID startedModuleID = null;
startedModuleID = startModule(distributedModuleID);
if (startedModuleID == null)
return false;
// Check that the startedModuleID is same as deployed module id
if (!startedModuleID.getModuleID()
.equals(distributedModuleID.getModuleID()))
return false;
TargetModuleID[] runningModules = dm.getRunningModules(moduleType,
new Target[] { targetToDeploy });
if (!checkIfModuleExists(startedModuleID, runningModules))
return false;
// stop the module
TargetModuleID stoppedModuleID = null;
stoppedModuleID = stopModule(startedModuleID);
if (stoppedModuleID == null)
return false;
// Check that the startedModuleID is same as redeployed module id
if (!startedModuleID.getModuleID().equals(stoppedModuleID.getModuleID()))
return false;
boolean modExistsInRunningMods = checkIfModuleExists(stoppedModuleID,
dm.getRunningModules(moduleType, new Target[] { targetToDeploy }));
boolean modExistsInNonRunningMods = checkIfModuleExists(stoppedModuleID,
dm.getNonRunningModules(moduleType, new Target[] { targetToDeploy }));
// Clean up....
// undeploy the module
undeployModule(stoppedModuleID);
if ((!modExistsInRunningMods) && modExistsInNonRunningMods)
return true;
else
return false;
}
public boolean testRedeployModule(ModuleType moduleType, File moduleArchive,
File deploymentPlan, String archiveType) throws Exception {
DeploymentManager dm = getDeploymentManager();
Target[] targets = dm.getTargets();
if (targets.length == 0)
return false;
Target targetToDeploy = targets[0];
TargetModuleID distributedModuleID = null;
TargetModuleID[] moduleIDsBeforeDistribute = dm
.getAvailableModules(moduleType, new Target[] { targetToDeploy });
if (archiveType.equals(FILE_ARCHIVE)) {
distributedModuleID = distributeModuleArchive(
new Target[] { targetToDeploy }, moduleArchive, deploymentPlan);
} else {
distributedModuleID = distributeModuleStream(
new Target[] { targetToDeploy }, moduleType,
new FileInputStream(moduleArchive),
new FileInputStream(deploymentPlan), true);
}
// If the distributedModuleID == null, the test is failed
if (distributedModuleID == null)
return false;
// Check if distriburtedModuleID has the same target as deployed target
if (!distributedModuleID.getTarget().getName()
.equals(targetToDeploy.getName()))
return false;
TargetModuleID[] moduleIDsAfterDistribute = dm
.getAvailableModules(moduleType, new Target[] { targetToDeploy });
boolean moduleExistsBeforeDistribute = checkIfModuleExists(
distributedModuleID, moduleIDsBeforeDistribute);
boolean moduleExistsAfterDistribute = checkIfModuleExists(
distributedModuleID, moduleIDsAfterDistribute);
if (!((!moduleExistsBeforeDistribute) && moduleExistsAfterDistribute))
return false;
// start the module
TargetModuleID startedModuleID = null;
startedModuleID = startModule(distributedModuleID);
if (startedModuleID == null)
return false;
// Check that the startedModuleID is same as deployed module id
if (!startedModuleID.getModuleID()
.equals(distributedModuleID.getModuleID()))
return false;
TargetModuleID[] runningModules = dm.getRunningModules(moduleType,
new Target[] { targetToDeploy });
if (!checkIfModuleExists(startedModuleID, runningModules))
return false;
// redeploy the module
TargetModuleID redeployedModuleID = null;
if (archiveType.equals(FILE_ARCHIVE)) {
redeployedModuleID = redeployModuleArchive(
new TargetModuleID[] { startedModuleID }, moduleArchive,
deploymentPlan);
} else {
redeployedModuleID = redeployModuleStream(
new TargetModuleID[] { startedModuleID },
new FileInputStream(moduleArchive),
new FileInputStream(deploymentPlan));
}
if (redeployedModuleID == null)
return false;
// Check that the startedModuleID is same as redeployed module id
if (!startedModuleID.getModuleID().equals(redeployedModuleID.getModuleID()))
return false;
TargetModuleID[] runningModulesAfterRedeploy = dm
.getRunningModules(moduleType, new Target[] { targetToDeploy });
boolean result = false;
if (checkIfModuleExists(redeployedModuleID, runningModulesAfterRedeploy))
result = true;
// Clean up....
// undeploy the module
stopModule(redeployedModuleID);
undeployModule(redeployedModuleID);
return result;
}
public boolean testUndeployModule(ModuleType moduleType, File moduleArchive,
File deploymentPlan, String archiveType) throws Exception {
DeploymentManager dm = getDeploymentManager();
Target[] targets = dm.getTargets();
if (targets.length == 0)
return false;
Target targetToDeploy = targets[0];
TargetModuleID distributedModuleID = null;
TargetModuleID[] moduleIDsBeforeDistribute = dm
.getAvailableModules(moduleType, new Target[] { targetToDeploy });
if (archiveType.equals(FILE_ARCHIVE)) {
distributedModuleID = distributeModuleArchive(
new Target[] { targetToDeploy }, moduleArchive, deploymentPlan);
} else {
distributedModuleID = distributeModuleStream(
new Target[] { targetToDeploy }, moduleType,
new FileInputStream(moduleArchive),
new FileInputStream(deploymentPlan), true);
}
// If the distributedModuleID == null, the test is failed
if (distributedModuleID == null)
return false;
// Check if distriburtedModuleID has the same target as deployed target
if (!distributedModuleID.getTarget().getName()
.equals(targetToDeploy.getName()))
return false;
TargetModuleID[] moduleIDsAfterDistribute = dm
.getAvailableModules(moduleType, new Target[] { targetToDeploy });
boolean moduleExistsBeforeDistribute = checkIfModuleExists(
distributedModuleID, moduleIDsBeforeDistribute);
boolean moduleExistsAfterDistribute = checkIfModuleExists(
distributedModuleID, moduleIDsAfterDistribute);
if (!((!moduleExistsBeforeDistribute) && moduleExistsAfterDistribute))
return false;
// start the module
TargetModuleID undeployedModuleID = null;
undeployedModuleID = undeployModule(distributedModuleID);
if (undeployedModuleID == null)
return false;
// Check that the startedModuleID is same as deployed module id
if (!undeployedModuleID.getModuleID()
.equals(distributedModuleID.getModuleID()))
return false;
if (checkIfModuleExists(undeployedModuleID,
dm.getAvailableModules(moduleType, new Target[] { targetToDeploy })))
return false;
else
return true;
}
// To test TargetModuleID
// Test TargetModuleID
public boolean testTargetModuleID(File moduleArchive, File deploymentPlan,
String archiveType) {
try {
DeploymentManager dm = getDeploymentManager();
Target[] targets = dm.getTargets();
if (targets.length == 0)
return false;
Target targetToDeploy = targets[0];
TargetModuleID distributedModuleID = null;
distributedModuleID = distributeModuleArchive(
new Target[] { targetToDeploy }, moduleArchive, deploymentPlan);
// If the distributedModuleID == null, the test is failed
if (distributedModuleID == null)
return false;
// Check if distriburtedModuleID has the same target as deployed target
if (!distributedModuleID.getTarget().getName()
.equals(targetToDeploy.getName()))
return false;
// Clean up....
// undeploy the module
undeployModule(distributedModuleID);
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
//////
// Porting package 1.4 additions
//////
/*
* Why are we polling on the progress object's state to determine when the
* executed command is actually finished? First, Prakash mentioned that there
* is a case where it is possible for an executed command to finish before the
* user is even returned the progress object. In this case if we register a
* ProgressListener with the ProgressObject and handle events within the
* ProgressListener's handleProgressEvent() we may miss the event that told us
* the executed command had finished. Second, again according to Prakash, the
* spec does not specify how many events are generated when executing a
* command. For instance, if we call stop and pass 4 TargetModuleID objects,
* there is no place in the spec that tells us how many events we should
* expect. There could be a set of one or more events for each target or a
* single event for all the targets. Since the spec doesn't define this, we
* shouldn't assume.
*
* Having said that we decided to simply poll the progress object and ask it
* when it thinks it is finished. This will be denoted by a COMPLETED or
* FAILED state. If the state is FAILED we can use the
* getResultTargetModuleIds method to determine the failed targets. We can
* determine the failed targets by comparing the targets we issued the command
* for against the targets returned by getResultTargetModuleIds. The doc for
* getResultTargetModuleIds says it only returns the IDs of the targets that
* successfully completed the specified command. See the OperationStatus class
* for details on determining the failed targets.
*/
private OperationStatus commandStatus(Target[] targets,
ProgressObject progress) {
OperationStatus status = null;
int sleepCount = 0;
int deployWaitMinutes = getDeployDelay();
final int MAX_SLEEP_COUNT = deployWaitMinutes * 60; // minutes to delay
while (!(progress.getDeploymentStatus().isCompleted()
|| progress.getDeploymentStatus().isFailed())) {
try {
Thread.sleep(1 * 1000); // 1 second
if (++sleepCount >= MAX_SLEEP_COUNT) {
TestUtil.logErr("Error: DeployTestUtil.commandStatus() timed out"
+ " waiting for operation to complete");
status = new OperationStatus(progress, targets, true);
break;
}
} catch (InterruptedException ie) {
break;
}
}
if (status == null) {
status = new OperationStatus(progress, targets);
}
return status;
}
private int getDeployDelay() {
int result = 5;
String delayStr = System.getProperty("DEPLOY_DELAY_IN_MINUTES", "5");
try {
result = Integer.parseInt(delayStr);
} catch (NumberFormatException nfe) {
}
TestUtil.logTrace(
"Maximum wait time for deployment is " + result + " minutes.");
return result;
}
private void writeFile(File aFile) {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream(aFile);
out = new FileOutputStream("/tmp/" + aFile.getName());
byte[] buf = new byte[2048];
int start = 0;
int i = 0;
while ((i = in.read(buf)) != -1) {
out.write(buf, 0, i);
start += i;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (Exception e) {
}
try {
out.close();
} catch (Exception e) {
}
}
}
public OperationStatus distributeModuleStreams(Target[] targets,
InputStream moduleArchive, InputStream deploymentPlan) throws Exception {
ProgressObject progress = null;
try {
progress = getDeploymentManager().distribute(targets, moduleArchive,
deploymentPlan);
} catch (Exception e) {
e.printStackTrace();
if (progress.isCancelSupported()) {
progress.cancel();
}
throw e;
}
OperationStatus result = commandStatus(targets, progress);
delay();
return result;
}
public OperationStatus distributeModuleFiles(Target[] targets,
File moduleArchive, File deploymentPlan) throws Exception {
ProgressObject progress = null;
try {
progress = getDeploymentManager().distribute(targets, moduleArchive,
deploymentPlan);
} catch (Exception e) {
e.printStackTrace();
if (progress.isCancelSupported()) {
progress.cancel();
}
throw e;
}
OperationStatus result = commandStatus(targets, progress);
delay();
return result;
}
public Target[] getTargets() throws Exception {
Target[] result = null;
result = getDeploymentManager().getTargets();
return result;
}
public OperationStatus stopModule(TargetModuleID[] modulesIDsToStop)
throws Exception {
ProgressObject progress = null;
try {
progress = getDeploymentManager().stop(modulesIDsToStop);
} catch (Exception e) {
e.printStackTrace();
// throw e;
}
return commandStatus(convertTargets(modulesIDsToStop), progress);
}
public OperationStatus startModule(TargetModuleID[] modulesIDsToStart)
throws Exception {
ProgressObject progress = null;
try {
progress = getDeploymentManager().start(modulesIDsToStart);
} catch (Exception e) {
e.printStackTrace();
// throw e;
}
return commandStatus(convertTargets(modulesIDsToStart), progress);
}
public OperationStatus undeployModule(TargetModuleID[] modulesIDsToUndeploy)
throws Exception {
ProgressObject progress = null;
try {
progress = getDeploymentManager().undeploy(modulesIDsToUndeploy);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
OperationStatus result = commandStatus(convertTargets(modulesIDsToUndeploy),
progress);
delay();
return result;
}
private void delay() {
try {
int delayTime = Integer
.parseInt(System.getProperty("delay.after.deploy", "0"));
if (delayTime != 0) {
System.err.println("%%%%%%%%% SLEEPING FOR " + delayTime + " SECONDS");
Thread.sleep(delayTime * 1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private Target[] convertTargets(TargetModuleID[] targets) {
if (targets == null) {
return null;
}
Target[] result = new Target[targets.length];
for (int i = 0; i < targets.length; i++) {
result[i] = targets[i].getTarget();
}
return result;
}
//////
// Porting package 1.4 additions
//////
}
class ProgressHandler extends Thread implements ProgressListener {
volatile StateType finalState = null;
public void run() {
while (finalState == null) {
Thread.currentThread().yield();
}
}
public void handleProgressEvent(ProgressEvent event) {
DeploymentStatus ds = event.getDeploymentStatus();
System.out.println(ds.getMessage() + "\n");
if (ds.getState().getValue() != StateType.RUNNING.getValue()) {
finalState = ds.getState();
}
}
public StateType getCompletionState() {
return finalState;
}
}