X-Git-Url: http://git.phpeclipse.com diff --git a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/util/JarUtil.java b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/util/JarUtil.java index 2519891..528221e 100644 --- a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/util/JarUtil.java +++ b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/util/JarUtil.java @@ -21,10 +21,10 @@ public class JarUtil { private static Hashtable classLoaderCache = new Hashtable(); - public static Driver loadDriver(String driverFile, String className) { + public static Driver loadDriver(String[] driverFiles, String className) { Driver result = null; try { - Class driverClass = loadDriverClass(driverFile, className); + Class driverClass = loadDriverClass(driverFiles, className); if (driverClass != null) { try { result = (Driver) driverClass.newInstance(); @@ -33,51 +33,100 @@ public class JarUtil { } } catch (InstantiationException e) { } catch (IllegalAccessException e) { + } catch (NoClassDefFoundError e) { + } catch (RuntimeException e) { } return result; } - public static Class loadDriverClass(String driverFile, String className) { + public static Class loadDriverClass(String[] driverFiles, String className) { Class result = null; - if (driverFile != null && className != null) { + if (driverFiles != null && driverFiles.length > 0 + && driverFiles[0].trim().length() > 0 && className != null) { try { - File file = new File(driverFile); - if (file.exists() && file.isFile()) { - URLClassLoader loader = getURLClassLoader(file); - Class driverClass = loader.loadClass(className); - result = Driver.class.isAssignableFrom(driverClass) ? driverClass : null; - } + File[] files = getFiles(driverFiles); + URLClassLoader loader = getURLClassLoader(files); + result = loadDriverClass(className, loader); } catch (MalformedURLException e) { } catch (ClassNotFoundException e) { + } catch (NoClassDefFoundError e) { + } catch (RuntimeException e) { + } + } else if (className != null) { + try { + result = loadDriverClass(className, JarUtil.class.getClassLoader()); + } catch (ClassNotFoundException e) { + } catch (NoClassDefFoundError e) { + } catch (RuntimeException e) { } } return result; } - public static String[] getAllDriverNames(String driverFile) { + /** + * @param driverFiles + * @return + */ + private static File[] getFiles(String[] driverFiles) { + List list = new ArrayList(); + + for (int i = 0, length = driverFiles == null ? 0 : driverFiles.length; i < length; i++) { + File file = new File(driverFiles[i]); + if (file.exists() && file.isFile()) { + list.add(file); + } + } + return (File[]) list.toArray(new File[list.size()]); + } + + /** + * @param className + * @param loader + * @return + * @throws ClassNotFoundException + */ + private static Class loadDriverClass(String className, ClassLoader loader) throws ClassNotFoundException { + Class driverClass = loader.loadClass(className); + return Driver.class.isAssignableFrom(driverClass) ? driverClass : null; + } + + public static String[] getAllDriverNames(String[] driverFile) { List list = new ArrayList(); try { - File file = new File(driverFile); - URLClassLoader loader = getURLClassLoader(file); - JarFile jar = new JarFile(file); - for (Enumeration e = jar.entries(); e.hasMoreElements(); ) { - JarEntry entry = (JarEntry) e.nextElement(); - String className = getClassNameFromFileName(entry.getName()); - if (className != null) { - try { - Class driverClass = loader.loadClass(className); - if (Driver.class.isAssignableFrom(driverClass)) { - list.add(className); - } - } catch (ClassNotFoundException ex) { - } - } + File[] files = getFiles(driverFile); + URLClassLoader loader = getURLClassLoader(files); + for (int i = 0, length = files == null ? 0 : files.length; i < length; i++) { + JarFile jar = new JarFile(files[i]); + addCandidateDriversToList(list, loader, jar); } } catch (IOException e) { } return (String[]) list.toArray(new String[list.size()]); } + /** + * @param list + * @param loader + * @param jar + */ + private static void addCandidateDriversToList(List list, URLClassLoader loader, JarFile jar) { + for (Enumeration e = jar.entries(); e.hasMoreElements(); ) { + JarEntry entry = (JarEntry) e.nextElement(); + String className = getClassNameFromFileName(entry.getName()); + if (className != null) { + try { + Class driverClass = loadDriverClass(className, loader); + if (driverClass != null) { + list.add(className); + } + } catch (NoClassDefFoundError ex) { + } catch (ClassNotFoundException ex) { + } catch (RuntimeException ex) { + } + } + } + } + private static String getClassNameFromFileName(String name) { String result = null; if (name.endsWith(".class")) { @@ -91,16 +140,36 @@ public class JarUtil { * @return * @throws MalformedURLException */ - private static URLClassLoader getURLClassLoader(File file) throws MalformedURLException { - String driverFile = file.getAbsolutePath(); + private static URLClassLoader getURLClassLoader(File[] files) throws MalformedURLException { + + String driverPath = getFilePath(files); URLClassLoader loader = - (URLClassLoader) classLoaderCache.get(driverFile); + (URLClassLoader) classLoaderCache.get(driverPath); if (loader == null) { - URL urls[] = new URL[1]; - urls[0] = file.toURL(); - loader = new URLClassLoader(urls); - classLoaderCache.put(driverFile, loader); + URL urls[] = new URL[files == null ? 0 : files.length]; + for (int i = 0, length = urls.length; i < length; i++) { + urls[i] = files[i].toURL(); + } + loader = urls.length > 0 ? new URLClassLoader(urls) : null; + if (loader != null) { + classLoaderCache.put(driverPath, loader); + } } return loader; } + + /** + * @param files + * @return + */ + private static String getFilePath(File[] files) { + StringBuffer buffer = new StringBuffer(); + for (int i = 0, length = files == null ? 0 : files.length; i < length; i++) { + buffer.append(files[i].getAbsolutePath()); + if (i < length-1) { + buffer.append(File.pathSeparator); + } + } + return buffer.toString(); + } }