blob: 8145bcad60b6da1b33897b8c400563941ffaaf4e [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 javax.enterprise.deploy.spi.*;
import javax.enterprise.deploy.shared.*;
import java.io.*;
import java.util.*;
import com.sun.ts.lib.implementation.sun.javaee.runtime.SunRIDeploymentInfo;
import com.sun.ts.lib.porting.*;
import com.sun.ts.lib.util.*;
import com.sun.ts.lib.deliverable.*;
import com.sun.ts.lib.harness.ExecutionMode;
/**
*
* This class implements the TSDeploymentInterface. It does so by using the 88
* API's. As of J2EE 1.4, this class should be the standard implementation of
* TSDeploymentInterface. There will be no need of alternative implentations.
* All implementation specific code now exists in TSDeploymentInterface2.
*
* @author Kyle Grucci
* @author Anand Dhingra
*
*/
public class StandardDeployment14 implements TSDeploymentInterface {
protected static final String DEPLOYED_MODULES_FILE = "ts-deployed-modules";
protected static String TEMP_DIR;
protected PrintWriter log; // Log to harness
protected int iPortingSet = 1; // Porting set using this impl
// of TSDeploymentInterface
private String url = "deployer:???:???:999"; // URI for DM
private DeploymentManager depMgr; // for Deployment to manager 1
private DeployTestUtil dtu; // for Deployment to manager 1
private DMProps dmProps; // get these from Propmgr
protected TSDeploymentInterface2 dep2; // our impl of
// TSDeploymentInterface2
protected Hashtable htDeployedModules = // Map ear files to IDs so we
new Hashtable(); // can later undeploy
protected PropertyManagerInterface propMgr; // Properties from ts.jte
protected String sDepNumber = null; // Module ID
protected String deployStateFile;
/**
*
* Static initialization of this class
*
*/
static {
TestUtil.initJavaTest();
TEMP_DIR = System.getProperty("java.io.tmpdir");
if (TEMP_DIR != null && TEMP_DIR.endsWith(File.separator)) {
TEMP_DIR = TEMP_DIR.substring(0, TEMP_DIR.length() - 1);
}
}
/**
*
* Initializes logging output, gets the Deliverable instance
*
* @param writer - PrintWriter for harness tracing
*
*/
public void init(PrintWriter writer) {
this.log = writer;
TestUtil.logHarness("StandardDeployment14.init()");
iPortingSet = TSDeployment.iPortingSet;
TestUtil
.logHarness("StandardDeployment14: Using porting set #" + iPortingSet);
try {
propMgr = DeliverableFactory.getDeliverableInstance()
.getPropertyManager();
try {
String portingString = String.valueOf(iPortingSet);
initDeployTestUtils(portingString);
deployStateFile = TEMP_DIR + File.separator + DEPLOYED_MODULES_FILE
+ "_" + portingString + ".ser";
} catch (TSDeploymentException e) {
TestUtil.logHarness("Unable to initialize the deployment utilities.");
}
htDeployedModules = getDeployedModules();
dumpDeployedMods(htDeployedModules);
TestUtil.logHarnessDebug("Adding shutdown hook for state serialization");
// Handle shutdown gracefully.
Runtime.getRuntime().addShutdownHook(new Thread() {
// When the VM shuts down this method is invoked to undeploy
// all currently deployed applications. Note, this method is
// invoked when a user issues a ctrl-c or the VM shuts down
// normally. No matter which way the VM shuts down, this
// method will honor the harness execute mode specified by
// the user in the ts.jte file (harness.executeMode property).
public void run() {
int harnessExecMode = ExecutionMode.getExecutionMode(propMgr);
// immediately return if we are running in a mode
// where undeploy is not required.
if (harnessExecMode == ExecutionMode.DEPLOY
|| harnessExecMode == ExecutionMode.DEPLOY_RUN) {
try {
TestUtil.logHarness("IN SHUTDOWN HOOK BEFORE WRITE");
dumpDeployedMods(htDeployedModules);
writeMap(htDeployedModules);
} catch (IOException ioe) {
ioe.printStackTrace();
}
return;
} else if (harnessExecMode == ExecutionMode.RUN) {
return;
}
TestUtil.logHarness(
"IN SHUTDOWNHOOK state file is : \"" + deployStateFile + "\"");
dumpDeployedMods(htDeployedModules);
Map deployedModules = (Map) htDeployedModules.clone();
if (deployedModules.size() != 0) {
TestUtil.logHarness("Shutdown requested during test run."
+ " Undeploying previously deployed applications...");
try {
initDeployTestUtils(sDepNumber);
} catch (TSDeploymentException e) {
TestUtil.logHarness("Unable to initialize the deployment"
+ " utilities. Applications will not be undeployed.");
}
for (Iterator i = deployedModules.keySet().iterator(); i
.hasNext();) {
try {
undeploy((String) i.next());
} catch (TSDeploymentException tde) {
TestUtil.logHarness("Unexpected exception while"
+ " undeploying application during shutdown. " + "Cause: "
+ tde.getMessage());
}
}
// Release deployment manager in case we get killed
// We'll also do this with the deploy and undeploy methods
// since this will only be called if a shutdown is received
dtu.releaseDeploymentManager();
deleteDeployedModulesState(); // remove deployed module state
}
}
});
String portClass = "porting.ts.deploy2.class." + iPortingSet;
TestUtil.logHarness("Using " + portClass);
dep2 = TSDeployment2.getDeploymentInstance(log, portClass);
} catch (Exception e) {
e.printStackTrace();
TestUtil.logHarness(
"Creation of TSDeployment2 implementation instance failed."
+ " Please check the values of 'porting.ts.deploy2.class.1' and"
+ " 'porting.ts.deploy2.class.2'");
}
}
public String deploy(DeploymentInfo info) throws TSDeploymentException {
try {
String sArchive = info.getEarFile();
// we need to pass the deployinfo to the new porting package to get the
// plan. For now just use the runtime file
String[] sRunTimeFileArray = info.getRuntimeFiles();
TestUtil.logHarness("StandardDeployment14.deploy()");
sDepNumber = info.getProperty("deployment.props.number");
initDeployTestUtils(sDepNumber);
// start distribute here
TestUtil.logHarness("Starting to distribute: " + sArchive);
File earfile = new File(sArchive);
Object plan = dep2.getDeploymentPlan(info);
TestUtil.logHarness("file: " + earfile.toString());
if (plan != null)
TestUtil.logHarness("plan: " + plan.toString());
else
TestUtil.logHarness("No deployment plan for this archive.");
Target[] targets = dep2.getTargetsToUse(dtu.getTargets(), info);
if (targets == null || targets.length == 0)
throw new TSDeploymentException("Empty Target List: ");
OperationStatus status;
if (plan instanceof InputStream) {
// distribute the module
status = dtu.distributeModuleStreams(targets,
new FileInputStream(earfile), (InputStream) plan);
} else if ((plan instanceof File) || (plan == null)) {
// distribute the module
status = dtu.distributeModuleFiles(targets, earfile, (File) plan);
} else {
throw new TSDeploymentException(
"Object returned from getDeploymentPlan must return either an InputStream or a File."
+ " May also be null in some cases like connectors.");
}
if (status.isFailed()) {
throw new TSDeploymentException(
"Distribute to one or more targets failed " + status.errMessage());
}
TestUtil.logHarness(
"$$$$$$$$$$ Deployment SUCCEEDED for \"" + earfile + "\"");
// Allow the licensee an opportunity to examine the returned
// ProgressObject and
// take any vendor specifc actions that may be necessary.
dep2.postDistribute(status.getProgressObject());
status = dtu.startModule(status.getDeployedTargetIDs());
if (status.isFailed()) {
throw new TSDeploymentException(
"Starting of module failed on one or more targets "
+ status.errMessage());
}
// Allow the licensee an opportunity to examine the returned
// ProgressObject and
// take any vendor specifc actions that may be necessary.
dep2.postStart(status.getProgressObject());
// keep track of filename to TargetmoduleIDs mapping
htDeployedModules.put(getAppName(sArchive),
status.getDeployedTargetIDs());
// Check to see if we're in a test directory that contains
// embedded rars
if (sArchive.indexOf("connector" + File.separator + "deployment"
+ File.separator + "ejb_Deployment.ear") != -1) {
Properties p = new Properties();
p.setProperty("rar_file", sArchive);
dep2.createConnectionFactory(status.getDeployedTargetIDs(), p);
}
if (sArchive.indexOf("xa" + File.separator + "ee" + File.separator + "tsr"
+ File.separator + "ejb_Tsr.ear") != -1) {
Properties p = new Properties();
p.setProperty("rar_file", sArchive);
dep2.createConnectionFactory(status.getDeployedTargetIDs(), p);
}
// if we have a rar file embedded in the ear, then we need to create
// connection factories - needsome naming we can rely on - don't want
// to open every ear file to check
String javaeeLevel = propMgr.getProperty("javaee.level", "full");
if (javaeeLevel.contains("full") && !sArchive.endsWith(".rar")) {
return dep2.getClientClassPath(status.getDeployedTargetIDs(), info,
dtu.getDeploymentManager());
} else {
return "";
}
} catch (Exception e) {
e.printStackTrace();
throw (TSDeploymentException) new TSDeploymentException(
"Deployment Failed.").initCause(e);
}
}
public void undeploy(String moduleId) throws TSDeploymentException {
ModuleType moduleType = getModuleType(moduleId);
TargetModuleID[] idsToUndeploy = (TargetModuleID[]) htDeployedModules
.get(getAppName(moduleId));
TestUtil.logHarnessDebug(
"$$$$$$$$$$$$$ idsToUndeploy.length = " + idsToUndeploy.length);
TestUtil.logHarnessDebug("$$$$$$$$$$$$$ Undeploying Module ID \""
+ idsToUndeploy[0].getModuleID() + "\"");
if (idsToUndeploy == null) {
TestUtil.logHarness(
"idToUndeploy is null. Assuming that the module is not currently deployed");
return;
} else {
TestUtil.logHarness("Undeploying module \"" + moduleId + "\"");
}
OperationStatus status = null;
try {
status = dtu.stopModule(idsToUndeploy);
if (status.isFailed()) {
// log a message but still try to undeploy all the modules
TestUtil.logHarness(
"Stop failed for one or more targets while undeploying module \""
+ moduleId + "\"");
}
// Allow the licensee an opportunity to examine the returned
// ProgressObject and
// take any vendor specifc actions that may be necessary.
dep2.postStop(status.getProgressObject());
status = dtu.undeployModule(idsToUndeploy);
if (status.isFailed()) {
TestUtil.logHarness("Undeploy failed for one or more targets \""
+ status.errMessage() + "\"");
}
// Allow the licensee an opportunity to examine the returned
// ProgressObject and
// take any vendor specifc actions that may be necessary.
dep2.postUndeploy(status.getProgressObject());
htDeployedModules.remove(getAppName(moduleId));
} catch (Exception e) {
e.printStackTrace();
throw new TSDeploymentException("Error while undeploying");
}
if (status.isFailed()) {
throw new TSDeploymentException(
"Undeploy failed for one or more targets \"" + status.errMessage()
+ "\"");
}
}
public void undeploy(Properties p) throws TSDeploymentException {
String sArchive = p.getProperty("ear_file");
TestUtil.logHarness("StandardDeployment14.undeploy()");
initDeployTestUtils(p.getProperty("deployment.props.number"));
// Check to see if we're in a test directory that contains
// embedded rars
if (sArchive
.indexOf("connector" + File.separator + "deployment" + File.separator
+ "ejb_Deployment.ear") != -1
|| sArchive.indexOf("xa" + File.separator + "ee" + File.separator
+ "tsr" + File.separator + "ejb_Tsr.ear") != -1) {
// we must have an embedded ra file in this ear
// we need to remove the connection factory
p.setProperty("rar_file", sArchive);
// call into new porting package to remove connection factories
TargetModuleID[] modulesToUndeploy = (TargetModuleID[]) (htDeployedModules
.get(getAppName(sArchive)));
if (modulesToUndeploy.length == 0) {
TestUtil
.logHarness("undeploy failed for application \"" + sArchive + "\"");
throw new TSDeploymentException(
"undeploy failed for application \"" + sArchive + "\"");
}
dep2.removeConnectionFactory(modulesToUndeploy, p);
}
this.undeploy(sArchive);
}
public boolean isDeployed(Properties p) throws TSDeploymentException {
TestUtil.logHarness("StandardDeployment14.isDeployed()");
String sArchive = p.getProperty("ear_file");
String sAppName = getAppName(sArchive);
// For now just assume that we started with clean servers
// and check our internal state hashtable
if (htDeployedModules == null) {
return false;
}
// resync the list of deployed modules with what the targets actually report
try {
normalizeMap(getTargets());
} catch (Exception e) {
e.printStackTrace();
}
TargetModuleID[] id = (TargetModuleID[]) htDeployedModules.get(sAppName);
if (id != null && id.length > 0) {
TestUtil.logHarnessDebug("StandardDeployment14.isDeployed(): "
+ "After checking hashtable, id = " + sAppName);
return true;
} else {
TestUtil.logHarnessDebug("StandardDeployment14.isDeployed(): "
+ "After checking hashtable, id = null");
return false;
}
}
public void deployConnector(Properties p) throws TSDeploymentException {
TestUtil.logHarness("StandardDeployment14.deployConnector()");
String sRarFileName = p.getProperty("rar_file");
DeploymentInfo info = null;
try {
info = new SunRIDeploymentInfo(sRarFileName, new String[] {});
info.setProperty("deployment.props.number",
p.getProperty("deployment.props.number"));
deploy(info); // adds deployed targets IDs to htDeployedModules
TargetModuleID[] targets = (TargetModuleID[]) (htDeployedModules
.get(getAppName(sRarFileName)));
dep2.createConnectionFactory(targets, p);
} catch (Exception e) {
e.printStackTrace();
throw new TSDeploymentException("Error while deploying Connector");
}
// call into new porting package to create connection factories
// If rar files now have runtime info, we will have to change the harness
// code
// to call deploy if we are using the StandardDeployment class. Our deploy
// method in here can check for rars and handle the connection factory
// logic.
// If old porting impls are used, then the harness wil still call these
// connector methods.
}
public void undeployConnector(Properties p) throws TSDeploymentException {
TestUtil.logHarness("StandardDeployment14.undeployConnector()");
if (isConnectorDeployed(p)) {
String rarFile = p.getProperty("rar_file");
// targets must have a non-empty list of TargetModuleIDs since
// isConnectorDeployed just checked it.
TargetModuleID[] targets = (TargetModuleID[]) (htDeployedModules
.get(getAppName(rarFile)));
dep2.removeConnectionFactory(targets, p);
p.setProperty("ear_file", rarFile);
undeploy(p);
} else {
TestUtil.logHarness(
"StandardDeployment14.undeployConnector() - " + "not undeploying.");
}
}
public boolean isConnectorDeployed(Properties p)
throws TSDeploymentException {
TestUtil.logHarness("StandardDeployment14.isConnectorDeployed()");
p.setProperty("ear_file", p.getProperty("rar_file"));
return isDeployed(p);
}
protected void initDeployTestUtils(String sPropNum)
throws TSDeploymentException {
try {
if (dtu != null) {
return;
}
String sJar = propMgr.getProperty("deployManagerJarFile." + sPropNum);
String sUri = propMgr.getProperty("deployManageruri." + sPropNum);
String sUname = propMgr.getProperty("deployManageruname." + sPropNum);
String sPassword = propMgr.getProperty("deployManagerpasswd." + sPropNum);
TestUtil.logHarnessDebug(
"StandardDeployment14.initDeployTestUtils() + sPropNum = "
+ sPropNum);
TestUtil.logHarnessDebug("deployManagerJarFile: " + sJar);
TestUtil.logHarnessDebug("deployManageruri: " + sUri);
TestUtil.logHarnessDebug("deployManageruname: " + sUname);
TestUtil.logHarnessDebug("deployManagerpasswd: " + sPassword);
// Construct properties object for DM
dmProps = new DMProps(sJar, sUri, sUname, sPassword);
// Utility object for getting depMgr's
// dtu = DeployTestUtil.getDeployTestUtil(dmProps);
dtu = new DeployTestUtil(dmProps);
} catch (Exception e) {
e.printStackTrace();
throw new TSDeploymentException(
"Failed to get DeployTestUtil: " + e.getMessage());
}
// Construct the DM
// always initialize these in case props change in same VM of JavaTest
try {
depMgr = dtu.getDeploymentManager();
} catch (Exception e) {
e.printStackTrace();
TestUtil.logHarness(
"Exception loading DeploymentFactoryManager factories: " + e);
throw new TSDeploymentException(
"Unable to get DeploymentManager: " + e.getMessage());
}
}
public String getAppClientArgs(Properties p) {
return dep2.getAppClientArgs(p);
}
public Hashtable getInteropJNDINames(DeploymentInfo[] infoArray) {
return dep2.getDependentValues(infoArray);
}
private static ModuleType getModuleType(String sArchive) {
String sExtension = sArchive.substring(sArchive.lastIndexOf(".") + 1);
ModuleType mt;
if (sExtension.equalsIgnoreCase("ear"))
mt = ModuleType.EAR;
else if (sExtension.equalsIgnoreCase("rar"))
mt = ModuleType.RAR;
else if (sExtension.equalsIgnoreCase("jar")) {
if (sArchive.indexOf("component") != -1)
mt = ModuleType.EJB;
else
mt = ModuleType.EJB; // Should this be CAR ?
} else if (sExtension.equalsIgnoreCase("war"))
mt = ModuleType.WAR;
else
mt = ModuleType.EAR;
return mt;
}
protected static String getAppName(String path) {
return path.substring(path.lastIndexOf(File.separator) + 1);
}
protected void dumpDeployedMods(Hashtable map) {
StringBuffer message = new StringBuffer("Deployed Modules: \n");
if (map == null || map.keySet() == null) {
TestUtil.logHarness("There are no deployed modules, returning");
return;
}
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
String modName = (String) iter.next();
message.append("\t" + modName + "\n");
}
TestUtil.logHarness(message.toString());
}
protected boolean isValidTargetID(TargetModuleID targModID,
SerializableTargetID[] serTargModIDs) {
boolean result = false;
SerializableTargetID test = new SerializableTargetID(targModID);
for (int i = 0; i < serTargModIDs.length; i++) {
if (serTargModIDs[i].equals(test)) {
result = true;
break;
}
}
return result;
}
protected boolean isValidTargetID(TargetModuleID targModID,
TargetModuleID[] serTargModIDs) {
boolean result = false;
for (int i = 0; i < serTargModIDs.length; i++) {
if (serTargModIDs[i].equals(targModID)) {
result = true;
break;
}
}
return result;
}
protected TargetModuleID[] getRunningTargetModuleIDs(String sModuleName,
Target[] targets) throws Exception {
return depMgr.getRunningModules(getModuleType(sModuleName), targets);
}
/*
* This method is used to update our local hashtable (htDeployedModules) of
* deployed modules with the latest information from the targets that we've
* deployed them to.
*/
protected void normalizeMap(Target[] targets) throws Exception {
List targModIDsList = null;
TestUtil.logHarnessDebug("Target[]");
for (int i = 0; i < targets.length; i++) {
TestUtil.logHarnessDebug("[" + targets[i].getDescription() + ", "
+ targets[i].getName() + "]");
}
Hashtable result = new Hashtable();
Iterator iter = htDeployedModules.keySet().iterator();
while (iter.hasNext()) {
String modName = (String) iter.next();
TargetModuleID[] targModIDs = getRunningTargetModuleIDs(modName, targets);
if (targModIDs == null || targModIDs.length == 0) {
continue;
}
TestUtil.logHarnessDebug("****** Module name = \"" + modName + "\"");
TestUtil
.logHarnessDebug("****** targModIDs.length = " + targModIDs.length);
TestUtil.logHarnessDebug("TargetModuleID[]");
for (int i = 0; i < targModIDs.length; i++) {
TestUtil.logHarnessDebug("[" + targModIDs[i].getModuleID() + ", "
+ targModIDs[i].getTarget().getDescription() + ", "
+ targModIDs[i].getTarget().getName() + "]");
}
TargetModuleID[] savedIDs = (TargetModuleID[]) htDeployedModules
.get(modName);
TestUtil.logHarnessDebug("****** savedIDs.length = " + savedIDs.length);
TestUtil.logHarnessDebug("TargetModuleID[]");
for (int i = 0; i < savedIDs.length; i++) {
TestUtil.logHarnessDebug("[" + savedIDs[i].getModuleID() + "]");
}
targModIDsList = new ArrayList();
for (int i = 0; i < targModIDs.length; i++) {
if (isValidTargetID(targModIDs[i], savedIDs)) {
TestUtil.logHarnessDebug(
"&&&&&&&& Adding = " + targModIDs[i].getModuleID());
targModIDsList.add(targModIDs[i]);
TestUtil.logHarnessDebug(
"&&&&&&&& targModIDsList.size() is " + targModIDsList.size());
break;
}
}
if (targModIDsList.size() > 0) {
TargetModuleID[] validSavedIDs = (TargetModuleID[]) (targModIDsList
.toArray(new TargetModuleID[targModIDsList.size()]));
result.put(modName, validSavedIDs);
} else {
TestUtil.logHarnessDebug(
"$$$$$ We did not find any valid IDs : " + modName);
}
}
TestUtil.logHarnessDebug("DUMP OF RESULT");
dumpDeployedMods(result);
TestUtil.logHarnessDebug("END DUMP OF RESULT END");
htDeployedModules = result;
}
// Read
protected Hashtable normalizeMap(Hashtable map, Target[] targets)
throws Exception {
List targModIDsList = null;
TestUtil.logHarnessDebug("Target[]");
for (int i = 0; i < targets.length; i++) {
TestUtil.logHarnessDebug("[" + targets[i].getDescription() + ", "
+ targets[i].getName() + "]");
}
Hashtable result = new Hashtable();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
String modName = (String) iter.next();
TargetModuleID[] targModIDs = getRunningTargetModuleIDs(modName, targets);
if (targModIDs == null || targModIDs.length == 0) {
continue;
}
TestUtil.logHarnessDebug("****** Module name = \"" + modName + "\"");
TestUtil
.logHarnessDebug("****** targModIDs.length = " + targModIDs.length);
TestUtil.logHarnessDebug("TargetModuleID[]");
for (int i = 0; i < targModIDs.length; i++) {
TestUtil.logHarnessDebug("[" + targModIDs[i].getModuleID() + ", "
+ targModIDs[i].getTarget().getDescription() + ", "
+ targModIDs[i].getTarget().getName() + "]");
}
SerializableTargetID[] serIDs = (SerializableTargetID[]) map.get(modName);
TestUtil.logHarnessDebug("****** serIDs.length = " + serIDs.length);
TestUtil.logHarnessDebug("SerializableTargetModuleID[]");
for (int i = 0; i < serIDs.length; i++) {
TestUtil.logHarnessDebug("[" + serIDs[i].getModuleID() + "]");
}
targModIDsList = new ArrayList();
for (int i = 0; i < targModIDs.length; i++) {
if (isValidTargetID(targModIDs[i], serIDs)) {
TestUtil.logHarnessDebug(
"&&&&&&&& Adding = " + targModIDs[i].getModuleID());
targModIDsList.add(targModIDs[i]);
TestUtil.logHarnessDebug(
"&&&&&&&& targModIDsList.size() is " + targModIDsList.size());
break;
}
}
if (targModIDsList.size() > 0) {
TargetModuleID[] validSerIDs = (TargetModuleID[]) (targModIDsList
.toArray(new TargetModuleID[targModIDsList.size()]));
result.put(modName, validSerIDs);
}
}
TestUtil.logHarnessDebug("DUMP OF RESULT");
dumpDeployedMods(result);
TestUtil.logHarnessDebug("END DUMP OF RESULT END");
return result;
}
// Write
protected Hashtable normalizeMap(Hashtable map) {
Hashtable result = new Hashtable();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
String key = (String) iter.next();
TargetModuleID[] tmid = (TargetModuleID[]) map.get(key);
SerializableTargetID[] serIDs = new SerializableTargetID[tmid.length];
for (int i = 0; i < tmid.length; i++) {
serIDs[i] = new SerializableTargetID(tmid[i]);
}
result.put(key, serIDs);
}
return result;
}
protected void writeMap(Hashtable map) throws IOException {
deleteDeployedModulesState();
ObjectOutputStream oout = null;
Hashtable newMap = normalizeMap(map);
try {
oout = new ObjectOutputStream(new FileOutputStream(deployStateFile));
oout.writeObject(newMap);
} catch (IOException e) {
throw e;
} finally {
try {
oout.close();
} catch (Exception ee) {
}
}
}
protected Hashtable readMap() throws IOException {
Hashtable result = null;
File inFile = new File(deployStateFile);
if (inFile.isFile()) {
ObjectInputStream oin = null;
try {
oin = new ObjectInputStream(new FileInputStream(deployStateFile));
result = (Hashtable) (oin.readObject());
} catch (IOException e) {
throw e;
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
} finally {
try {
oin.close();
} catch (Exception ee) {
}
}
}
return result;
}
protected Hashtable getDeployedModules() {
Hashtable result = null;
Hashtable serMap = null;
try {
serMap = readMap();
} catch (IOException e) {
}
if (serMap == null) {
result = new Hashtable();
} else {
try {
result = normalizeMap(serMap, getTargets());
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
protected void deleteDeployedModulesState() {
try {
File removeMe = new File(
TEMP_DIR + File.separator + DEPLOYED_MODULES_FILE);
removeMe.delete();
} catch (Exception e) {
}
}
protected Target[] getTargets() {
// get the targets
return depMgr.getTargets();
}
protected static class SerializableTarget implements Serializable {
private String description;
private String name;
public SerializableTarget(Target target) {
this.description = target.getDescription();
this.name = target.getName();
}
public String getDescription() {
return description;
}
public String getName() {
return name;
}
public boolean equals(Object obj) {
SerializableTarget that = null;
boolean result = false;
if (this instanceof SerializableTarget) {
that = (SerializableTarget) obj;
result = (description == null) ? that.getDescription() == null
: description.equals(that.getDescription());
result = result && ((name == null) ? that.getName() == null
: name.equals(that.getName()));
}
return result;
}
}
protected static class SerializableTargetID implements Serializable {
private SerializableTarget target;
private String moduleID;
public SerializableTargetID(TargetModuleID id) {
this.moduleID = id.getModuleID();
this.target = new SerializableTarget(id.getTarget());
}
public SerializableTarget getTarget() {
return target;
}
public String getModuleID() {
return moduleID;
}
public boolean equals(Object obj) {
boolean result = false;
SerializableTargetID that = null;
if (obj instanceof SerializableTargetID) {
that = (SerializableTargetID) obj;
result = (moduleID == null) ? that.getModuleID() == null
: moduleID.equals(that.getModuleID());
result = result && ((target == null) ? that.getTarget() == null
: target.equals(that.getTarget()));
}
return result;
}
}
}