418 lines
9.5 KiB
Plaintext
418 lines
9.5 KiB
Plaintext
|
/***********************************************************************
|
||
|
*
|
||
|
* 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>
|
||
|
*
|
||
|
***********************************************************************/
|
||
|
|
||
|
package UpdateWarFile;
|
||
|
|
||
|
import java.lang.Throwable;
|
||
|
import java.lang.NullPointerException;
|
||
|
import com.zerog.ia.api.pub.*;
|
||
|
import java.util.*;
|
||
|
import java.net.*;
|
||
|
import java.io.*;
|
||
|
import java.util.zip.*;
|
||
|
import java.util.jar.*;
|
||
|
|
||
|
/**
|
||
|
* Summary description for Program
|
||
|
*/
|
||
|
public class Program
|
||
|
{
|
||
|
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)
|
||
|
{
|
||
|
Program p = new Program(args);
|
||
|
}
|
||
|
|
||
|
Program(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("return code = " + 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)
|
||
|
{
|
||
|
}
|
||
|
}
|
||
|
}
|