/* * 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