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/