CASA/CASA-auth-token/server-java/package/windows/UpdateWarFile/UpdateWarFile.java
Greg Richardson c3aa5727fc 1. Changed jsharp files to java files
2. Added CommandLauncher to allow java classes to be invoked from msi install
2007-01-24 07:18:15 +00:00

416 lines
9.1 KiB
Java

/***********************************************************************
*
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
*
* This library 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; version 2.1
* of the License.
*
* This library 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
* Library Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, Novell, Inc.
*
* To contact Novell about this file by physical or electronic mail,
* you may find current contact information at www.novell.com.
*
* Author: Juan Carlos Luciani <jluciani@novell.com>
*
***********************************************************************/
import java.lang.Throwable;
import java.lang.NullPointerException;
import java.util.*;
import java.net.*;
import java.io.*;
import java.util.zip.*;
import java.util.jar.*;
/**
* Summary description for UpdateWarFile
*/
public class UpdateWarFile
{
final static String INSTALL_DIR_PARAM = "ATS_INSTALL_DIR=";
final static int ERROR_NO_ERROR = 0;
final static int ERROR_IO_EXCEPTION = -1;
final static int ERROR_INVALID_NUMBER_OF_PARAMS = -2;
final static int ERROR_BAD_INSTALL_DIR_PARAM = -3;
final static int ERROR_MISSING_INSTALL_DIR = -4;
final static int ERROR_INSTALL_DIR_NOT_A_DIR = -5;
final static int ERROR_MISSING_INSTALL_DIR_PARAM = -6;
final static int ERROR_WAR_TEMPLATE_FILE_MISSING = -7;
final static int ERROR_NEW_JAR_CANNOT_BE_REPLACED = -8;
final static int ERROR_JAR_COPY_FAILED = -9;
final static int ERROR_CREATE_WAR_FILE_FAILED = -10;
final static int ERROR_CREATE_WAR_FOS_FAILED = -11;
final static int ERROR_OPEN_JAR_TEMPLATE_FAILED = -12;
final static int ERROR_JOS_FLUSH_FAILED = -13;
final static int ERROR_ADD_FILE_TO_JAR_FAILED = -14;
final static int ERROR_JOS_CLOSE_FAILED = -15;
final static int ERROR_FOS_CLOSE_FAILED = -16;
final static int ERROR_JFTEMPLATE_CLOSE_FAILED = -17;
String sInstallDir;
File file;
FileWriter fw;
public static void main(String[] args)
{
UpdateWarFile p = new UpdateWarFile(args);
}
UpdateWarFile(String[] args)
{
int rc = ERROR_NO_ERROR;
sInstallDir = null;
try
{
file = new File("c:\\test3.log");
fw = new FileWriter(file);
log("Here we go: " + args.length);
for (int i = 0; i < args.length; i++)
{
log("Arg " + i + " = " + args[i]);
}
// Process the arguments
if (ERROR_NO_ERROR == (rc = processArgs(args)))
{
// Create the modified war file
rc = createWarFile();
}
}
catch (IOException e)
{
rc = ERROR_IO_EXCEPTION;
}
finally
{
try
{
log(rc);
fw.flush();
fw.close();
}
catch (Exception e1)
{
}
}
System.exit(rc);
}
int processArgs(String[] args)
{
File fileInstallDir = null;
int i;
// Validate the number of parameters
if (args.length != 1)
{
return ERROR_INVALID_NUMBER_OF_PARAMS;
}
for (i = 0; i < args.length; i++)
{
log("arg[" + i + "] = " + args[i]);
// is this the install dir param?
if (args[i].startsWith(INSTALL_DIR_PARAM))
{
// Make sure it is more than the param tag
if (args[i].length() <= INSTALL_DIR_PARAM.length())
{
return ERROR_BAD_INSTALL_DIR_PARAM;
}
sInstallDir = args[i].substring(INSTALL_DIR_PARAM.length()).trim();
fileInstallDir = new File(sInstallDir);
// Make sure the install dir can be found
if (!fileInstallDir.exists())
{
return ERROR_MISSING_INSTALL_DIR;
}
// Make sure the install dir is a directory
if (!fileInstallDir.isDirectory())
{
return ERROR_INSTALL_DIR_NOT_A_DIR;
}
}
}
// Make sure we got an install dir
if (null == fileInstallDir)
{
return ERROR_MISSING_INSTALL_DIR_PARAM;
}
return ERROR_NO_ERROR;
}
int createWarFile()
{
String sWarTemplate = sInstallDir + "ats\\etc\\svc\\templates\\CasaAuthTokenSvc.war";
String sWarNew = sInstallDir + "ats\\catalinabase\\webapps\\CasaAuthTokenSvc.war";
File fileWarTemplate = new File(sWarTemplate);;
File fileWarNew = new File(sWarNew);
FileOutputStream fosWarNew = null;
ZipOutputStream josWarNew = null;
ZipFile jfTemplate = null;
int rc = ERROR_NO_ERROR;
// Ensure that the war template exists
log("looking for war template: " + sWarTemplate);
if (!fileWarTemplate.exists())
{
rc = ERROR_WAR_TEMPLATE_FILE_MISSING;
}
if (rc == ERROR_NO_ERROR)
{
// Ensure that the new jar name does not exist
if (fileWarNew.exists())
{
log("war file already exists: " + sWarNew);
if (!fileWarNew.delete())
{
log("could not delete war file: " + sWarNew);
rc = ERROR_NEW_JAR_CANNOT_BE_REPLACED;
}
}
}
if (rc == ERROR_NO_ERROR)
{
// Create/open the new jar
try
{
log("create new war file output stream: " + sWarNew);
fosWarNew = new FileOutputStream(fileWarNew);
josWarNew = new ZipOutputStream(fosWarNew);
}
catch (IOException ioe0)
{
log(ioe0.toString());
rc = ERROR_CREATE_WAR_FOS_FAILED;
}
}
if (rc == ERROR_NO_ERROR)
{
// Open the old jar
try
{
jfTemplate = new ZipFile(sWarTemplate);
}
catch (IOException ioe1)
{
rc = ERROR_OPEN_JAR_TEMPLATE_FAILED;
}
}
if (rc == ERROR_NO_ERROR)
{
// Transfer the files
rc = moveFilesFromJarToJar(josWarNew, jfTemplate);
}
// Add the files
if (rc == ERROR_NO_ERROR)
{
int i;
String [] rgsFilesToAdd = new String[1];
rgsFilesToAdd[0] = sInstallDir + "ats\\etc\\svc\\templates\\crypto.properties";
String [] rgsNames = new String[1];
rgsNames[0] = "WEB-INF/classes/crypto.properties";
for (i = 0; i < rgsFilesToAdd.length; i++)
{
log("Adding file: " + rgsFilesToAdd[i] + " with name " + rgsNames[i]);
rc = addFileToJar(rgsFilesToAdd[i], rgsNames[i], josWarNew);
}
}
// Close up
if (null != josWarNew)
{
try
{
josWarNew.flush();
}
catch (IOException ioe2)
{
rc = ERROR_JOS_FLUSH_FAILED;
}
try
{
josWarNew.close();
}
catch (IOException ioe3)
{
rc = ERROR_JOS_CLOSE_FAILED;
}
try
{
fosWarNew.close();
}
catch (IOException ioe4)
{
rc = ERROR_FOS_CLOSE_FAILED;
}
}
if (null != jfTemplate)
{
try
{
jfTemplate.close();
}
catch (IOException ioe5)
{
rc = ERROR_JFTEMPLATE_CLOSE_FAILED;
}
}
return rc;
}
int moveFilesFromJarToJar(ZipOutputStream josDst, ZipFile jfSrc)
{
int rc = ERROR_NO_ERROR;
try
{
Enumeration entries = jfSrc.entries();
ZipEntry jeLoop;
InputStream isLoop;
ZipEntry zeIndex;
int bRead;
byte [] b = new byte[4096];
while (entries.hasMoreElements())
{
jeLoop = (ZipEntry)entries.nextElement();
// Skip WEB-INF/classes/cypto.properties
if (jeLoop.getName().equalsIgnoreCase("WEB-INF/classes/crypto.properties"))
{
log("skipping: " + "WEB-INF/classes/crypto.properties");
continue;
}
// Move the rest of the files over
else
{
log("Transferring jar file: " + jeLoop.getName());
// Create the input stream
isLoop = jfSrc.getInputStream(jeLoop);
// Set up the output stream
zeIndex = new ZipEntry(jeLoop.getName());
josDst.putNextEntry( zeIndex);
// Transfer the file contents
while (-1 != (bRead = isLoop.read(b)))
{
josDst.write(b, 0, bRead);
}
// all done
josDst.closeEntry();
isLoop.close();
}
}
}
catch (Exception e)
{
rc = ERROR_JAR_COPY_FAILED;
}
return rc;
}
int addFileToJar(String sFilename, String sName, ZipOutputStream josJarNew)
{
FileInputStream fis;
ZipEntry je;
int bRead;
byte [] b = new byte[4096];
int rc = ERROR_NO_ERROR;
try
{
// Create the input stream
fis = new FileInputStream(sFilename);
// Set up the output stream
je = new ZipEntry(sName);
josJarNew.putNextEntry(je);
// Tansfer the contents of the file
while (-1 != (bRead = fis.read(b)))
{
josJarNew.write(b, 0, bRead);
}
// All done
fis.close();
josJarNew.closeEntry();
}
catch (Exception e)
{
log(e.toString());
rc = ERROR_ADD_FILE_TO_JAR_FAILED;
}
return rc;
}
void log(int err)
{
log(err, null);
}
void log(int err, String s)
{
String sMessage = "";
switch (err)
{
case ERROR_NO_ERROR:
sMessage = "No error";
break;
case ERROR_INVALID_NUMBER_OF_PARAMS:
sMessage = "Invalid number of parameters: 4 expected";
break;
default:
sMessage = "Unknown error: " + err;
break;
}
if (null != s)
{
sMessage = sMessage + s;
}
log(sMessage);
}
void log(String s)
{
try
{
fw.write(this.getClass().getName() + ": " + s + "\r\n");
}
catch (IOException ioe)
{
}
}
}