psmith      2004/06/14 15:55:51

  Added:       src/java/org/apache/log4j/chainsaw/plugins
                        PluginClassLoaderFactory.java
  Log:
  An initial attempt to work around some classloader issues within Web start.  This 
classloader
  will be able to reference jars & classes etc in a sub-directory of a users chainsaw 
home directory.
  
  Hopefully this will allow things like the weblogic.jar to be referenced, but I have 
not completed formal testing
  at this stage, but it does not have any impact on existing functionality so it seems 
safe to commit it
  in it's current state. (touching wood).
  
  Revision  Changes    Path
  1.1                  
logging-log4j/src/java/org/apache/log4j/chainsaw/plugins/PluginClassLoaderFactory.java
  
  Index: PluginClassLoaderFactory.java
  ===================================================================
  
  package org.apache.log4j.chainsaw.plugins;
  
  import java.io.File;
  import java.io.FilenameFilter;
  import java.net.URL;
  import java.net.URLClassLoader;
  import java.util.ArrayList;
  import java.util.List;
  
  import org.apache.log4j.helpers.LogLog;
  
  /**
   * A factory class to create a Classloader that can refenerence 
jars/classes/resources
   * within a users plugin directory.
   * 
   * Currently a work in progress to see if this allows external jars required by
   * some 3rd party vendors for things like the JMSReceiver.
   *  
   * @author psmith
   *
   * 
   */
  public class PluginClassLoaderFactory {
  
        /**
         * @param urls
         */
        private PluginClassLoaderFactory() {
        }
      
      /**
       * Creates a Classloader that will be able to access any of the classes found
       * in any .JAR file contained within the specified directory path, PLUS
       * the actual Plugin directory itself, so it acts like the WEB-INF/classes 
directory,
       * any class file in the directory will be accessible
       * 
       * @param pluginDirectory
       * @throws IllegalArgumentException if the pluginDirectory is null, does not 
exist, or cannot be read
       * @throws RuntimeException if turning a File into a URL failed, which would be 
very unexpected
       * @return
       */
      public static final ClassLoader create(File pluginDirectory) {
          if(pluginDirectory == null || !pluginDirectory.exists() || 
!pluginDirectory.canRead()) {
           throw new IllegalArgumentException("pluginDirectory cannot be null, and it 
must exist and must be readable");   
          }
          
          String[] strings = pluginDirectory.list(new FilenameFilter() {
  
                        public boolean accept(File dir, String name) {
                  return name.toUpperCase().endsWith(".JAR");
                        }});
          
        
          List list = new ArrayList();
          // add the plugin directory as a resource loading path
          try {
                        list.add(pluginDirectory.toURL());
                } catch (Exception e) {
                        throw new RuntimeException(e);
                }
          if (strings !=null) {
                        for (int i = 0; i < strings.length; i++) {
                                String name = strings[i];
                                File file = new File(pluginDirectory, name);
                                try {
                                        list.add(file.toURL());
                                        LogLog.info("Added " + file.getAbsolutePath()
                                                        + " to Plugin class loader 
list");
                                } catch (Exception e) {
                                        LogLog.error("Failed to retrieve the URL for 
file: "
                                                        + file.getAbsolutePath());
                                        throw new RuntimeException(e);
                                }
                        }
                }
          URL[] urls = (URL[]) list.toArray(new URL[list.size()]);
          return new URLClassLoader(urls);
      }
  
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to