Changed StartServer to use CRCClassloader. The latter now allows extra jars to be added. Another constructor added to Update.

This commit is contained in:
Travis Burtrum 2010-03-20 02:16:09 -04:00 committed by moparisthebest
parent 63641659e9
commit 70a4c73f10
1 changed files with 20 additions and 7 deletions

View File

@ -56,7 +56,6 @@ public class CRCClassLoader extends ClassLoader {
* the provided location and tries again. If it fails again, an IOException is thrown. * the provided location and tries again. If it fails again, an IOException is thrown.
* *
* @param jarFileLoc The location of the jar file to load on the disk * @param jarFileLoc The location of the jar file to load on the disk
*
*/ */
public CRCClassLoader(String jarFileLoc, String backupURL, long expectedCRC) throws IOException { public CRCClassLoader(String jarFileLoc, String backupURL, long expectedCRC) throws IOException {
super(); super();
@ -94,15 +93,27 @@ public class CRCClassLoader extends ClassLoader {
throw new IOException("CRC checksum failed. crc:" + getCRC() + " expected:" + expectedCRC); throw new IOException("CRC checksum failed. crc:" + getCRC() + " expected:" + expectedCRC);
} }
public void addJar(String jarFileLoc) throws IOException {
this.setup(jarFileLoc, false);
}
private void setup(String jarFileLoc) throws IOException { private void setup(String jarFileLoc) throws IOException {
this.setup(jarFileLoc, true);
}
private void setup(String jarFileLoc, boolean updateCRC) throws IOException {
JarFile jf = new JarFile(jarFileLoc); JarFile jf = new JarFile(jarFileLoc);
Enumeration entries = jf.entries(); Enumeration entries = jf.entries();
classes = new HashMap<String, byte[]>(); classes = new HashMap<String, byte[]>();
crcVal = 0;
CRC32 crc = new CRC32(); CRC32 crc = null;
if (updateCRC) {
crcVal = 0;
crc = new CRC32();
}
byte[] buffer = new byte[1024]; byte[] buffer = new byte[1024];
while (entries.hasMoreElements()) { while (entries.hasMoreElements()) {
@ -120,7 +131,8 @@ public class CRCClassLoader extends ClassLoader {
// update crc // update crc
byte[] classArr = baos.toByteArray(); byte[] classArr = baos.toByteArray();
crc.update(classArr); if (updateCRC)
crc.update(classArr);
String className = entry.getName().substring(0, entry.getName().lastIndexOf(".")).replaceAll("/", "."); String className = entry.getName().substring(0, entry.getName().lastIndexOf(".")).replaceAll("/", ".");
// save class // save class
@ -129,7 +141,8 @@ public class CRCClassLoader extends ClassLoader {
} }
jf.close(); jf.close();
crcVal = crc.getValue(); if (updateCRC)
crcVal = crc.getValue();
} }
public long getCRC() { public long getCRC() {
@ -146,8 +159,8 @@ public class CRCClassLoader extends ClassLoader {
public Class<?> findClass(String name) throws ClassNotFoundException { public Class<?> findClass(String name) throws ClassNotFoundException {
// System.out.println("CRCClassLoader: Requesting class " + name); // System.out.println("CRCClassLoader: Requesting class " + name);
byte[] classBytes = classes.get(name); byte[] classBytes = classes.get(name);
if (classBytes == null){ if (classBytes == null) {
if(parent == null) if (parent == null)
throw new ClassNotFoundException("Couldn't find class " + name); throw new ClassNotFoundException("Couldn't find class " + name);
//System.out.println("Couldn't find class " + name + " trying parent class loader."); //System.out.println("Couldn't find class " + name + " trying parent class loader.");
return parent.loadClass(name); return parent.loadClass(name);