Changeset 5622


Ignore:
Timestamp:
May 3, 2011, 2:50:10 PM (10 years ago)
Author:
Nicklas Nordborg
Message:

Fixes #1594: JarClassLoader? support for JARs within JARs

Location:
trunk/src/core/net/sf/basedb
Files:
2 edited

Legend:

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

    r5621 r5622  
    834834    files are stored.
    835835  */
    836   static java.io.File getUserFilesDirectory()
     836  public static java.io.File getUserFilesDirectory()
    837837  {
    838838    return userFilesDirectory;
  • trunk/src/core/net/sf/basedb/util/JarClassLoader.java

    r5394 r5622  
    3838import java.io.InputStream;
    3939import java.io.IOException;
     40import java.io.OutputStream;
    4041import java.net.URL;
    4142import java.net.MalformedURLException;
    4243
     44import net.sf.basedb.core.Application;
    4345import net.sf.basedb.core.InvalidDataException;
    4446
     
    534536            if (cps[i] != null && !cps[i].trim().equals(""))
    535537            {
    536               loadJarFile(new File(file.getParent(), cps[i]), false);
     538              File classPathFile = new File(file.getParent(), cps[i]);
     539              if (!classPathFile.exists())
     540              {
     541                log.debug("Referenced JAR file doesn't exist: '" + cps[i]);
     542                // See if the requested file exists under META-INF
     543                JarEntry entry = jarFile.getJarEntry("META-INF/" + cps[i]);
     544                if (entry != null)
     545                {
     546                  log.debug("Extracting JAR from META-INF/" + cps[i] + " to jar.cache");
     547                  // Extract it to userfiles directory (if we have to)
     548                  classPathFile = new File(Application.getUserFilesDirectory(),
     549                      "jar.cache/" + file.getName() + "/" + classPathFile.getName());
     550                  boolean exists = classPathFile.exists();
     551                  boolean sameTime = exists && classPathFile.lastModified() == entry.getTime();
     552                  boolean sameSize = exists && classPathFile.length() == entry.getSize();
     553                  if (!exists || !sameTime || !sameSize)
     554                  {
     555                    classPathFile.getParentFile().mkdirs();
     556                    InputStream in = null;
     557                    OutputStream out = null;
     558                    try
     559                    {
     560                      in = jarFile.getInputStream(entry);
     561                      out = FileUtil.getOutputStream(classPathFile);
     562                      FileUtil.copy(in, out);
     563                    }
     564                    finally
     565                    {
     566                      FileUtil.close(in);
     567                      FileUtil.close(out);
     568                    }
     569                  }
     570                }
     571              }
     572              loadJarFile(classPathFile, false);
    537573            }
    538574          }
Note: See TracChangeset for help on using the changeset viewer.