blob: bc2076952ed2a20e5863638fa1307c5785eac05d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.harmony.sql.tests.java.sql;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class TestHelper_ClassLoader extends ClassLoader {
public TestHelper_ClassLoader() {
super();
}
/**
* Loads a class specified by its name
* <p>
* This classloader makes the assumption that any class it is asked to load
* is in the current directory....
*/
@Override
public Class<?> findClass(String className) throws ClassNotFoundException {
Class<?> theClass = null;
if (!className.equals("org.apache.harmony.sql.tests.java.sql.TestHelper_DriverManager")) {
return null;
}
String classNameAsFile = className.replace('.', '/') + ".class";
// System.out.println("findClass - class filename = " + classNameAsFile
// );
String classPath = System.getProperty("java.class.path");
// System.out.println("Test class loader - classpath = " + classPath );
String theSeparator = String.valueOf(File.pathSeparatorChar);
String[] theClassPaths = classPath.split(theSeparator);
for (int i = 0; (i < theClassPaths.length) && (theClass == null); i++) {
// Ignore jar files...
if (theClassPaths[i].endsWith(".jar")) {
theClass = loadClassFromJar(theClassPaths[i], className,
classNameAsFile);
} else {
theClass = loadClassFromFile(theClassPaths[i], className,
classNameAsFile);
} // end if
} // end for
return theClass;
} // end method findClass( String )
@Override
public Class<?> loadClass(String className) throws ClassNotFoundException {
// Allowed classes:
String[] disallowedClasses = { "org.apache.harmony.sql.tests.java.sql.TestHelper_Driver1",
"org.apache.harmony.sql.tests.java.sql.TestHelper_Driver2",
"org.apache.harmony.sql.tests.java.sql.TestHelper_Driver4",
"org.apache.harmony.sql.tests.java.sql.TestHelper_Driver5" };
Class<?> theClass;
theClass = findLoadedClass(className);
if (theClass != null) {
return theClass;
}
theClass = this.findClass(className);
if (theClass == null) {
for (String element : disallowedClasses) {
if (element.equals(className)) {
return null;
} // end if
} // end for
theClass = Class.forName(className);
} // end if
return theClass;
} // end method loadClass( String )
private Class<?> loadClassFromFile(String pathName, String className,
String classNameAsFile) {
Class<?> theClass = null;
FileInputStream theInput = null;
File theFile = null;
try {
theFile = new File(pathName, classNameAsFile);
if (theFile.exists()) {
int length = (int) theFile.length();
theInput = new FileInputStream(theFile);
byte[] theBytes = new byte[length + 100];
int dataRead = 0;
while (dataRead < length) {
int count = theInput.read(theBytes, dataRead,
theBytes.length - dataRead);
if (count == -1) {
break;
}
dataRead += count;
}
if (dataRead > 0) {
// Create the class from the bytes read in...
theClass = this.defineClass(className, theBytes, 0, dataRead);
ClassLoader testClassLoader = theClass.getClassLoader();
if (testClassLoader != this) {
System.out.println("findClass - wrong classloader!!");
}
}
}
} catch (Exception e) {
System.out.println("findClass - exception reading class file.");
e.printStackTrace();
} finally {
try {
if (theInput != null) {
theInput.close();
}
} catch (Exception e) {
}
}
return theClass;
}
/*
* Loads a named class from a specified JAR file
*/
private Class<?> loadClassFromJar(String jarfileName, String className,
String classNameAsFile) {
Class<?> theClass = null;
// First, try to open the Jar file
JarFile theJar = null;
try {
theJar = new JarFile(jarfileName);
JarEntry theEntry = theJar.getJarEntry(classNameAsFile);
if (theEntry == null) {
// System.out.println("TestHelper_Classloader - did not find
// class file in Jar " + jarfileName );
return theClass;
} // end if
theEntry.getMethod();
InputStream theStream = theJar.getInputStream(theEntry);
long size = theEntry.getSize();
if (size < 0) {
size = 100000;
}
byte[] theBytes = new byte[(int) size + 100];
int dataRead = 0;
while (dataRead < size) {
int count = theStream.read(theBytes, dataRead, theBytes.length
- dataRead);
if (count == -1) {
break;
}
dataRead += count;
} // end while
// System.out.println("loadClassFromJar: read " + dataRead + " bytes
// from class file");
if (dataRead > 0) {
// Create the class from the bytes read in...
theClass = this.defineClass(className, theBytes, 0, dataRead);
/* System.out.println("findClass: created Class object."); */
ClassLoader testClassLoader = theClass.getClassLoader();
if (testClassLoader != this) {
System.out.println("findClass - wrong classloader!!");
} else {
System.out
.println("Testclassloader loaded class from jar: "
+ className);
} // end if
} // end if
} catch (IOException ie) {
System.out
.println("TestHelper_ClassLoader: IOException opening Jar "
+ jarfileName);
} catch (Exception e) {
System.out
.println("TestHelper_ClassLoader: Exception loading class from Jar ");
} catch (ClassFormatError ce) {
System.out
.println("TestHelper_ClassLoader: ClassFormatException loading class from Jar ");
} finally {
try {
if (theJar != null) {
theJar.close();
}
} catch (Exception e) {
} // end try
} // end try
return theClass;
} // end method loadClassFromJar(
} // end class TestHelper_ClassLoader