Mega Code Archive

 
Categories / Java / Reflection
 

Classpath Utils

/**  * Redistribution and use of this software and associated documentation  * ("Software"), with or without modification, are permitted provided  * that the following conditions are met:  *  * 1. Redistributions of source code must retain copyright  *    statements and notices.  Redistributions must also contain a  *    copy of this document.  *  * 2. Redistributions in binary form must reproduce the  *    above copyright notice, this list of conditions and the  *    following disclaimer in the documentation and/or other  *    materials provided with the distribution.  *  * 3. The name "OpenEJB" must not be used to endorse or promote  *    products derived from this Software without prior written  *    permission of The OpenEJB Group.  For written permission,  *    please contact openejb-group@openejb.sf.net.  *  * 4. Products derived from this Software may not be called "OpenEJB"  *    nor may "OpenEJB" appear in their names without prior written  *    permission of The OpenEJB Group. OpenEJB is a registered  *    trademark of The OpenEJB Group.  *  * 5. Due credit should be given to the OpenEJB Project  *    (http://openejb.sf.net/).  *  * THIS SOFTWARE IS PROVIDED BY THE OPENEJB GROUP AND CONTRIBUTORS  * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT  * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL  * THE OPENEJB GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED  * OF THE POSSIBILITY OF SUCH DAMAGE.  *  * Copyright 2001 (C) The OpenEJB Group. All Rights Reserved.  *  * $Id: ClasspathUtils.java 1076 2004-03-01 07:17:26Z dblevins $  */ import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java.security.AccessController; import java.security.PrivilegedAction; /**  */ public class ClasspathUtils{          private static Loader tomcatLoader = new ClasspathUtils().new TomcatLoader();     private static Loader sysLoader = new ClasspathUtils().new SystemLoader();     private static Loader ctxLoader = new ClasspathUtils().new ContextLoader();              public static void addJarToPath(final File jar) throws Exception {         addJarToPath( jar.toURI().toURL() );     }            public static void addJarToPath(final URL jar) throws Exception {         getLoader().addJarToPath( jar );     }                       public static void addJarToPath(final File jar, String loaderName) throws Exception {         addJarToPath( jar.toURI().toURL() , loaderName);     }            public static void addJarToPath(final URL jar, String loaderName) throws Exception {         getLoader(loaderName).addJarToPath( jar );     }                       public static void addJarsToPath(final File dir) throws Exception {         if ( dir == null ) return;         getLoader().addJarsToPath( dir );     }                      public static void addJarsToPath(final File dir, String loaderName) throws Exception {         getLoader(loaderName).addJarsToPath( dir );     }                /**      * Appends the jar to the classpath of the classloader passed in.      *      * @param url the URL to be added to the search path of URLs      */     public static void addJarToSystemPath(final File jar) throws Exception {         addJarToSystemPath( jar.toURI().toURL() );     }            /**      * Appends the jar to the classpath of the classloader passed in.      *      * @param url the URL to be added to the search path of URLs      */     public static void addJarToSystemPath(final URL jar) throws Exception {     }                 protected static Loader getLoader(){         String name = getContextClassLoader().getClass().getName();         if (name.startsWith("org.apache.catalina.loader")) {             return tomcatLoader;         } else if (name.startsWith("org.apache.jasper.servlet")) {             return tomcatLoader;         } else if (name.startsWith( "sun.misc.Launcher" )) {             return sysLoader;         } else {             return ctxLoader;         }     }          protected static Loader getLoader(String name){         if (name.equalsIgnoreCase("tomcat")) {             return tomcatLoader;         } else if (name.equalsIgnoreCase("bootstrap")) {             return sysLoader;         } else if (name.equalsIgnoreCase("system")) {             return sysLoader;         } else if (name.equalsIgnoreCase("thread")) {             return ctxLoader;         } else if (name.equalsIgnoreCase("context")) {             return ctxLoader;         } else {             return ctxLoader;         }     }          public static ClassLoader getContextClassLoader() {         return (ClassLoader) java.security.AccessController.doPrivileged(             new java.security.PrivilegedAction() {                 public Object run() {                     return Thread.currentThread().getContextClassLoader();                 }             }         );     }     public static void rebuildJavaClassPathVariable() throws Exception{     }     interface Loader {         public void addJarsToPath(File dir) throws Exception;         public void addJarToPath(URL dir) throws Exception;     }          class BasicURLLoader implements Loader{         public void addJarsToPath(File dir) throws Exception {         }                  public void addJarToPath(URL jar) throws Exception {         }              private java.lang.reflect.Field ucpField;                       protected void addJarToPath(final URL jar, final URLClassLoader loader) throws Exception {             this.getURLClassPath(loader).addURL( jar );         }              protected void addJarsToPath(final File dir, final URLClassLoader loader) throws Exception {         //System.out.println("DIR "+dir);         // Get the list of jars and zips         String[] jarNames = dir.list(new java.io.FilenameFilter(){             public boolean accept(File dir, String name) {                 //System.out.println("FILE "+name);                 return (name.endsWith(".jar") ||name.endsWith(".zip"));             }         });         // Create URLs from them         final URL[] jars = new URL[jarNames.length];         for (int j=0; j < jarNames.length; j++){             jars[j] = new File( dir, jarNames[j]).toURI().toURL();             }                  sun.misc.URLClassPath path = getURLClassPath(loader);         for (int i=0; i < jars.length; i++){             //System.out.println("URL "+jars[i]);             path.addURL( jars[i] );         }     }         protected sun.misc.URLClassPath getURLClassPath(URLClassLoader loader) throws Exception{         return (sun.misc.URLClassPath)getUcpField().get(loader);     }         private java.lang.reflect.Field getUcpField() throws Exception{         if (ucpField == null) {             // Add them to the URLClassLoader's classpath             ucpField = (java.lang.reflect.Field)AccessController.doPrivileged(                 new PrivilegedAction(){                     public Object run() {                          java.lang.reflect.Field ucp = null;                         try{                         ucp = URLClassLoader.class.getDeclaredField("ucp");                         ucp.setAccessible(true);                         } catch (Exception e2){                             e2.printStackTrace();                         }                         return ucp;                     }                 }             );         }                  return ucpField;     } }     /*-------------------------------------------------------*/     /*    System ClassLoader Support                         */     /*-------------------------------------------------------*/     class SystemLoader extends BasicURLLoader{                  private URLClassLoader sysLoader;              public void addJarsToPath(File dir) throws Exception {             this.addJarsToPath( dir , getSystemLoader() );             this.rebuildJavaClassPathVariable();         }                  public void addJarToPath(URL jar) throws Exception {             //System.out.println("[|] SYSTEM "+jar.toExternalForm());             this.addJarToPath( jar, getSystemLoader() );             this.rebuildJavaClassPathVariable();         }              private URLClassLoader getSystemLoader() throws Exception{             if (sysLoader == null) {                 sysLoader = (java.net.URLClassLoader)ClassLoader.getSystemClassLoader();             }             return sysLoader;         }                  private void rebuildJavaClassPathVariable() throws Exception{             sun.misc.URLClassPath cp = getURLClassPath(getSystemLoader());             URL[] urls = cp.getURLs();             //for (int i=0; i < urls.length; i++){             //    System.out.println(urls[i].toExternalForm());             //}             if (urls.length < 1) return;                  StringBuffer path = new StringBuffer(urls.length*32);                          File s = new File( urls[0].getFile() );             path.append( s.getPath() );             //System.out.println(s.getPath());                  for (int i=1; i < urls.length; i++){                 path.append( File.pathSeparator );                                  s = new File( urls[i].getFile() );                 //System.out.println(s.getPath());                 path.append( s.getPath() );             }             try{                 System.setProperty("java.class.path", path.toString() );             } catch (Exception e){}         }     }          /*-------------------------------------------------------*/     /*    Thread Context ClassLoader Support                 */     /*-------------------------------------------------------*/     class ContextLoader extends BasicURLLoader{                  public void addJarsToPath(File dir) throws Exception {             URLClassLoader loader = (URLClassLoader)ClasspathUtils.getContextClassLoader();             this.addJarsToPath( dir , loader );         }                  public void addJarToPath(URL jar) throws Exception {             URLClassLoader loader = (URLClassLoader)ClasspathUtils.getContextClassLoader();             this.addJarToPath( jar, loader );         }     }          /*-------------------------------------------------------*/     /*    Tomcat ClassLoader Support                         */     /*-------------------------------------------------------*/     class TomcatLoader extends BasicURLLoader{              /**          * The Tomcat Common ClassLoader          */         private ClassLoader tomcatLoader;                   /**          * The addRepository(String jar) method of the Tomcat Common ClassLoader          */         private java.lang.reflect.Method addRepositoryMethod;                  public void addJarsToPath(File dir) throws Exception {             String[] jarNames = dir.list(new java.io.FilenameFilter(){                 public boolean accept(File dir, String name) {                     //System.out.println("FILE "+name);                     return (name.endsWith(".jar") ||name.endsWith(".zip"));                 }             });                      for (int j=0; j < jarNames.length; j++){                 this.addJarToPath( new File( dir, jarNames[j]).toURL() );             }             rebuild();         }                  public void addJarToPath(URL jar) throws Exception {             //System.out.println("[|] TOMCAT "+jar.toExternalForm());             this._addJarToPath(jar);             rebuild();         }         public void _addJarToPath(URL jar) throws Exception {             String path = jar.toExternalForm();             //System.out.println("[] PATH "+path);           //if (path.startsWith("file:/C")) {           //    path = path.substring("file:/C".length());           //    path = "file:C"+path;           //}             this.addRepository( path );           //ClassLoader cl = ClasspathUtils.getContextClassLoader();           //cl = getCommonLoader(cl);           //System.out.println("[] "+cl.getClass().getName());           //System.out.println("[] "+cl);           //           ////Reloader loader = (Reloader)cl.getParent();           //cl = cl.getParent();           //java.lang.reflect.Method m = getAddRepositoryMethod( cl.getClass());                   //m.invoke( cl, new Object[]{jar.toExternalForm()});           ////loader.addRepository( jar.toExternalForm() );         }                  public void addRepository(String path) throws Exception{             this.getAddRepositoryMethod().invoke(getCommonLoader(), new Object[]{path});                 }              private void rebuild(){             try{             sun.misc.URLClassPath cp = getURLClassPath((URLClassLoader)getCommonLoader());             URL[] urls = cp.getURLs();             //for (int i=0; i < urls.length; i++){             //    System.out.println(urls[i].toExternalForm());             //}             if (urls.length < 1) return;                          StringBuffer path = new StringBuffer(urls.length*32);                          File s = new File( urls[0].getFile() );             path.append( s.getPath() );             //System.out.println(s.getPath());                          for (int i=1; i < urls.length; i++){                 path.append( File.pathSeparator );                              s = new File( urls[i].getFile() );                 //System.out.println(s.getPath());                 path.append( s.getPath() );             }             System.setProperty("java.class.path", path.toString() );             } catch (Exception e){}         }         private ClassLoader getCommonLoader(){             if (tomcatLoader == null) {                 tomcatLoader = this.getCommonLoader(ClasspathUtils.getContextClassLoader()).getParent();             }             return tomcatLoader;         }              private ClassLoader getCommonLoader(ClassLoader loader){             if (loader.getClass().getName().equals("org.apache.catalina.loader.StandardClassLoader")) {                 return loader;                             } else {                 return this.getCommonLoader(loader.getParent());             }         }              /**          * This method gets the Tomcat StandardClassLoader.addRepository method via          * reflection.  This allows us to call the addRepository method for Tomcat          * integration, but doesn't require us to include or ship any Tomcat           * libraries.          *           * @param clazz          * @return           * @exception Exception          */         private java.lang.reflect.Method getAddRepositoryMethod()          throws Exception{             if (addRepositoryMethod == null) {                 final Class clazz = getCommonLoader().getClass();                 this.addRepositoryMethod = (java.lang.reflect.Method)AccessController.doPrivileged(                     new PrivilegedAction(){                         public Object run() {                              java.lang.reflect.Method method = null;                             try{                                 method = clazz.getDeclaredMethod("addRepository",                                                                   new Class[]{String.class});                                 method.setAccessible(true);                             } catch (Exception e2){                                 e2.printStackTrace();                             }                             return method;                         }                     }                 );             }                          return addRepositoryMethod;         }     } }