webwork/src/main/webwork/util/classloader BytesURLConnection.java,NONE,1.1 BytesURLStreamHandler.java,NONE,1.1 DirectoryClassLoader.java,NONE,1.1 JarClassLoader.java,NONE,1.1 WebworkClassLoader.java,NONE,1.1

[email protected] Sun, 09 Nov 2003 13:02:19 -0800
Newsgroups gmane.comp.java.open-symphony.cvs
Message-ID <[email protected]>
Update of /cvsroot/opensymphony/webwork/src/main/webwork/util/classloader
In directory sc8-pr-cvs1:/tmp/cvs-serv27771/src/main/webwork/util/classloader

Added Files:
	BytesURLConnection.java BytesURLStreamHandler.java 
	DirectoryClassLoader.java JarClassLoader.java 
	WebworkClassLoader.java 
Log Message:
Webwork classloader to handle action reloading

--- NEW FILE: BytesURLConnection.java ---
package webwork.util.classloader;

import java.net.URLConnection;
import java.net.URL;
import java.io.InputStream;
import java.io.ByteArrayInputStream;

/**
 * @author Hani Suleiman ([email protected])
 * Date: Oct 20, 2003
 * Time: 12:46:01 AM
 */
public class BytesURLConnection extends URLConnection
{
  protected byte[] content;
  protected int offset;
  protected int length;

  public BytesURLConnection(URL url, byte[] content)
  {
    super(url);
    this.content = content;
  }

  public void connect()
  {
  }

  public InputStream getInputStream()
  {
    return new ByteArrayInputStream(content);
  }
}

--- NEW FILE: BytesURLStreamHandler.java ---
package webwork.util.classloader;

import java.net.URLStreamHandler;
import java.net.URLConnection;
import java.net.URL;

/**
 * @author Hani Suleiman ([email protected])
 * Date: Oct 20, 2003
 * Time: 12:45:18 AM
 */
public class BytesURLStreamHandler extends URLStreamHandler
{
  byte[] content;
  int offset;
  int length;

  public BytesURLStreamHandler(byte[] content)
  {
    this.content = content;
  }

  public URLConnection openConnection(URL url)
  {
    return new BytesURLConnection(url, content);
  }
}
--- NEW FILE: DirectoryClassLoader.java ---
package webwork.util.classloader;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import webwork.util.ClassLoaderUtils;

/**
 * User: Hani Suleiman
 * Date: Oct 22, 2003
 * Time: 3:57:08 PM
 */
public class DirectoryClassLoader extends WebworkClassLoader
{
  private File directory;
  private Map timestamps = new HashMap();

  public DirectoryClassLoader(File file, ClassLoader parent)
  {
    super(parent);
    this.directory = file;
  }

  public boolean isStale()
  {
    Iterator iter = timestamps.entrySet().iterator();
    while(iter.hasNext())
    {
      Map.Entry entry = (Map.Entry)iter.next();
      File toCheck = new File(directory, (String)entry.getKey());
      long time = ((Long)entry.getValue()).longValue();
      if(toCheck.lastModified() > time)
      {
        return true;
      }
    }
    return false;
  }

  protected URL getDataURL(String name, byte[] data) throws MalformedURLException
  {
    return new URL(null, directory.toURL().toExternalForm() + '/' + name, new BytesURLStreamHandler(data));
  }

  public byte[] getFile(String path)
  {
    try
    {
      InputStream in = null;
      int size = 0;

      File f = new File(directory, path);
      if(!f.exists()) return null;
        size = (int)f.length();
        in = new FileInputStream(f);
        //we're ok not storing timestamps for jars, since the whole jar
        //will be modified in that case.
        timestamps.put(path, new Long(f.lastModified()));

      byte[] data = ClassLoaderUtils.readStream(in, size);
      return data;
    }
    catch(IOException e)
    {
      return null;
    }
  }

  public Object clone()
  {
    DirectoryClassLoader loader = new DirectoryClassLoader(directory, getParent());
    loader.packages = packages;
    return loader;
  }
}

--- NEW FILE: JarClassLoader.java ---
package webwork.util.classloader;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;

import webwork.util.ClassLoaderUtils;

/**
 * User: Hani Suleiman
 * Date: Oct 22, 2003
 * Time: 3:56:56 PM
 */
public class JarClassLoader extends WebworkClassLoader
{
  private JarFile jar;
  private File file;
  private long jarLastModified;

  public JarClassLoader(File file, ClassLoader parent)
  {
    super(parent);
    this.file = file;
  }

  public boolean isStale()
  {
    return new File(jar.getName()).lastModified() > jarLastModified;
  }

  protected URL getDataURL(String name, byte[] data) throws MalformedURLException
  {
    return new URL(null, file.toURL().toExternalForm() + '!' + name, new BytesURLStreamHandler(data));
  }

  private void openJar() throws IOException
  {
    if(jar == null)
    {
      jar = new JarFile(file);
      jarLastModified = file.lastModified();
    }
  }

  public synchronized byte[] getFile(String path)
  {
    try
    {
      openJar();
      ZipEntry entry = jar.getEntry(path);

      if(entry == null) return null;
      InputStream in = jar.getInputStream(entry);
      int size = (int)entry.getSize();
      byte[] data = ClassLoaderUtils.readStream(in, size);
      return data;
    }
    catch(IOException e)
    {
      return null;
    }
  }

  public Object clone()
  {
    JarClassLoader loader = new JarClassLoader(file, getParent());
    loader.packages = packages;
    return loader;
  }
}

--- NEW FILE: WebworkClassLoader.java ---
package webwork.util.classloader;

import java.security.*;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.*;
import java.util.*;

/**
 * @author Hani Suleiman ([email protected])
 * Date: Oct 19 2003
 * Time: 11:16:12 PM
 */
public abstract class WebworkClassLoader extends SecureClassLoader implements Cloneable
{
  protected String[] packages = null;
  private Map cache = new HashMap();

  protected WebworkClassLoader()
  {
    this(ClassLoader.getSystemClassLoader());
  }

  protected WebworkClassLoader(ClassLoader parent)
  {
    super(parent);
  }

  public void setPackages(String[] p)
  {
    this.packages = p;
  }

  protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException
  {
    Class c = (Class)cache.get(name);
    if(c!=null) return c;
    boolean handles = false;
    if(packages!=null)
    {
      for(int i = 0; i < packages.length; i++)
      {
        if(name.startsWith(packages[i]))
        {
          handles = true;
          break;
        }
      }
    }
    if(!handles)
    {
      return super.loadClass(name, resolve);
    }
    try
    {
      c = findClass(name);
    }
    catch(ClassNotFoundException ex)
    {
      return super.loadClass(name, resolve);
    }
    cache.put(name, c);
    return c;
  }

  protected Class findClass(String name) throws ClassNotFoundException
  {
    String path = name.replace('.', '/').concat(".class");
    byte[] data = getFile(path);
    if(data == null)
      throw new ClassNotFoundException();

    return defineClass(name, data, 0, data.length);
  }

  protected URL findResource(String name)
  {
    byte[] data = this.getFile(name);

    if(data == null)
      return null;
    try
    {
      return getDataURL(name, data);
    }
    catch(MalformedURLException e)
    {
      return null;
    }
  }

  protected abstract URL getDataURL(String name, byte[] data) throws MalformedURLException;

  protected Enumeration findResources(String name)
  {
    URL url = this.findResource(name);

    if(url == null)
      return null;

    return Collections.enumeration(Collections.singleton(url));
  }

  public abstract boolean isStale();

  protected abstract byte[] getFile(String path);

  public static WebworkClassLoader getInstance(URL url)
  {
    return getInstance(url, ClassLoader.getSystemClassLoader());
  }

  public static WebworkClassLoader getInstance(URL url, ClassLoader parent)
  {
    WebworkClassLoader loader;
    File file = new File(url.getFile());
    if(file.isDirectory())
    {
      loader = new DirectoryClassLoader(file, parent);
    }
    else
    {
      loader = new JarClassLoader(file, parent);
    }
    return loader;
  }

  public abstract Object clone();
}




-------------------------------------------------------
This SF.Net email sponsored by: ApacheCon 2003,
16-19 November in Las Vegas. Learn firsthand the latest
developments in Apache, PHP, Perl, XML, Java, MySQL,
WebDAV, and more! http://www.apachecon.com/