This commit is contained in:
@@ -0,0 +1,417 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* 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)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user