synchronized from quantum plugin
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.quantum.sql / src / com / quantum / util / JarUtil.java
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
new file mode 100644 (file)
index 0000000..c30bdad
--- /dev/null
@@ -0,0 +1,93 @@
+package com.quantum.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.sql.Driver;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+
+/**
+ * @author BC Holmes
+ */
+public class JarUtil {
+
+    private static Hashtable classLoaderCache = new Hashtable();
+       
+       public static Driver loadDriver(String driverFile, String className) {
+               Driver result = null;
+               try {
+               File file = new File(driverFile);
+               if (file.exists() && file.isFile()) {
+                       URLClassLoader loader = getURLClassLoader(file);
+                       Class driverClass = loader.loadClass(className);
+                   try {
+                       result = (Driver) driverClass.newInstance();
+                   } catch (ClassCastException e) {
+                   }
+               }
+               } catch (MalformedURLException e) {
+               } catch (ClassNotFoundException e) {
+               } catch (InstantiationException e) {
+               } catch (IllegalAccessException e) {
+               }
+               return result;
+       }
+       
+       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) {
+                                       }
+                               }
+                       }
+               } catch (IOException e) {
+               }
+               return (String[]) list.toArray(new String[list.size()]);
+       }
+       
+       private static String getClassNameFromFileName(String name) {
+               String result = null;
+               if (name.endsWith(".class")) {
+                       result = name.substring(0, name.length()-6).replace('/', '.').replace('\\', '.' );
+               }
+               return result;
+       }
+
+       /**
+        * @param file
+        * @return
+        * @throws MalformedURLException
+        */
+       private static URLClassLoader getURLClassLoader(File file) throws MalformedURLException {
+               String driverFile = file.getAbsolutePath();
+               URLClassLoader loader =
+                   (URLClassLoader) classLoaderCache.get(driverFile);
+               if (loader == null) {
+                   URL urls[] = new URL[1];
+                   urls[0] = file.toURL();
+                   loader = new URLClassLoader(urls);
+                   classLoaderCache.put(driverFile, loader);
+               }
+               return loader;
+       }
+}