Changeset 4393


Ignore:
Timestamp:
Aug 13, 2008, 1:22:16 PM (14 years ago)
Author:
Nicklas Nordborg
Message:

Fixes #1085: Implement JarClassLoader?.findResources method

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/core/net/sf/basedb/util/JarClassLoader.java

    r4391 r4393  
    3131import java.util.HashMap;
    3232import java.util.Enumeration;
     33import java.util.Vector;
    3334import java.util.jar.JarFile;
    3435import java.util.jar.JarEntry;
     
    178179    the class implementation can be found.
    179180  */
    180   private final Map<String, File> classPath;
     181  private final Map<String, List<File>> classPath;
    181182 
    182183  /**
     
    215216    this.jarTimeStamp = mainJarFile.lastModified();
    216217    this.jarSize = mainJarFile.length();
    217     classPath = new HashMap<String, File>();
     218    classPath = new HashMap<String, List<File>>();
    218219    jarFiles = new ArrayList<JarInfo>();
    219220    loadJarFile(mainJarFile, true);
     
    229230  {
    230231    log.debug("findClass: " + name);
    231     File file = classPath.get(classNameToPath(name));
    232     if (file == null)
     232    List<File> files = classPath.get(classNameToPath(name));
     233    if (files == null || files.isEmpty())
    233234    {
    234235      throw new ClassNotFoundException(name);
    235236    }
    236     byte[] b = loadClassData(file, name);
     237    byte[] b = loadClassData(files.get(0), name);
    237238    return defineClass(name, b, 0, b.length);
    238239  }
     
    245246    try
    246247    {
    247       File file = classPath.get(name);
    248       if (file != null)
    249       {
    250         String newUrl = "jar:"+file.toURI().toURL()+"!/"+name;
     248      List<File> files = classPath.get(name);
     249      if (files != null && files.size() > 0)
     250      {
     251        if (log.isDebugEnabled()) log.debug("Found: " + files);
     252        String newUrl = "jar:"+files.get(0).toURI().toURL()+"!/"+name;
    251253        url = new URL(newUrl);
     254      }
     255      else
     256      {
     257        log.debug("Not found: " + name);
     258      }
     259    }
     260    catch (MalformedURLException ex)
     261    {
     262      ex.printStackTrace();
     263    }
     264    return url;
     265  }
     266 
     267  @Override
     268  protected Enumeration<URL> findResources(String name)
     269  {
     270    log.debug("findResources: " + name);
     271    Enumeration<URL> url = null;
     272    try
     273    {
     274      List<File> files = classPath.get(name);
     275      if (files != null && files.size() > 0)
     276      {
     277        if (log.isDebugEnabled()) log.debug("Found: " + files);
     278        Vector<URL> v = new Vector<URL>();
     279        for (File f : files)
     280        {
     281          String newUrl = "jar:"+f.toURI().toURL()+"!/"+name;
     282          v.add(new URL(newUrl));
     283        }
     284        url = v.elements();
    252285      }
    253286      else
     
    276309    if (log.isDebugEnabled()) log.debug("getResource: " + name);
    277310    return super.getResource(name);
     311  }
     312 
     313  @Override
     314  public Enumeration<URL> getResources(String name)
     315    throws IOException
     316  {
     317    if (log.isDebugEnabled()) log.debug("getResources: " + name);
     318    return super.getResources(name);
    278319  }
    279320  // -------------------------------------------
     
    347388      if (jarEntry.isDirectory()) continue;
    348389      String name = jarEntry.getName();
    349       if (!classPath.containsKey(name))
    350       {
    351         log.trace("Adding: " + name);
    352         classPath.put(name, file);
    353       }
    354       else
    355       {
    356         log.warn("Duplicate resource: '" + name + "' in '" + file + "'; also exists in '"
    357             + classPath.get(name) + "'");
    358       }
     390      log.trace("Adding: " + name);
     391      List<File> list = classPath.get(name);
     392      if (list == null)
     393      {
     394        list = new ArrayList<File>();
     395        classPath.put(name, list);
     396      }
     397      list.add(file);
    359398    }
    360399    if (followClassPath)
Note: See TracChangeset for help on using the changeset viewer.