|
From: Samuele P. <ped...@us...> - 2001-01-15 04:52:06
|
Update of /cvsroot/jython/jython/Lib/jxxload_help
In directory usw-pr-cvs1:/tmp/cvs-serv22086
Added Files:
DiscardHelp.java PackageManager.java PathVFS.java
PathVFSJavaLoader.java
Log Message:
experimental java classes reload support (0.1).
--- NEW FILE ---
// Copyright 2000 Samuele Pedroni
package jxxload_help;
import org.python.core.PyJavaClass;
public class DiscardHelp extends Object {
private DiscardHelp() {
}
private static boolean check(Class c,ClassLoader loader,java.util.Vector interfaces) {
try {
Class s = c;
do {
if (s.getClassLoader() == loader) return true;
s = s.getSuperclass();
} while (s != null);
for(java.util.Enumeration enum=interfaces.elements(); enum.hasMoreElements();) {
Class intf = (Class)enum.nextElement();
if (intf.isAssignableFrom(c)) return true;
}
} catch(SecurityException e) {
}
return false;
}
// clearly not thread safe
public static void discard(ClassLoader loader,java.util.Vector interfaces) {
org.python.core.InternalTables tbl = PyJavaClass.getInternalTables();
tbl._beginCanonical();
PyJavaClass jc;
while ((jc = (PyJavaClass)tbl._next()) != null ) {
Class c = (Class)jc.__tojava__(Class.class);
if(check(c,loader,interfaces)) tbl._flushCurrent();
}
tbl._beginOverAdapterClasses();
Class c;
while ((c = (Class)tbl._next()) != null) {
if(interfaces.contains(c)) tbl._flushCurrent();
}
tbl._beginOverAdapters();
while ((c = (Class)tbl._next()) != null) {
if(interfaces.contains(c)) tbl._flushCurrent();
}
}
}
--- NEW FILE ---
// Copyright 2000 Samuele Pedroni
package jxxload_help;
public class PackageManager extends org.python.core.PathPackageManager {
private ClassLoader parent;
private ClassLoader loader;
public PathVFS vfs;
public synchronized ClassLoader getLoader() {
if (loader == null) loader = new PathVFSJavaLoader(vfs,parent);
return loader;
}
public synchronized void resetLoader() {
loader = null;
}
// ??pending add cache support?
public PackageManager(org.python.core.PyList path,ClassLoader parent) {
vfs = new PathVFS();
this.parent = parent;
for (int i = 0; i < path.__len__(); i++) {
String entry = path.__finditem__(i).toString();
if (entry.endsWith(".jar") || entry.endsWith(".zip")) {
addJarToPackages(new java.io.File(entry),false);
} else {
java.io.File dir = new java.io.File(entry);
if (entry.length() == 0 || dir.isDirectory()) addDirectory(dir);
}
vfs.addVFS(entry);
}
}
public Class findClass(String pkg,String name,String reason) {
if (pkg != null && pkg.length()>0) name = pkg + '.' + name;
try {
return getLoader().loadClass(name);
}
catch(ClassNotFoundException e) {
return null;
}
catch (LinkageError e) {
throw org.python.core.Py.JavaError(e);
}
}
}
--- NEW FILE ---
// Copyright 2000 Samuele Pedroni
package jxxload_help;
import java.util.Vector;
import java.util.Hashtable;
import java.util.Enumeration;
import java.util.zip.ZipFile;
import java.util.zip.ZipEntry;
import java.io.*;
public class PathVFS extends Object {
public interface VFS {
public InputStream open(String id);
}
public static class JarVFS implements VFS {
private ZipFile zipfile;
public JarVFS(String fname) throws IOException {
zipfile = new ZipFile(fname);
}
public InputStream open(String id) {
ZipEntry ent = zipfile.getEntry(id);
if (ent == null) return null;
try {
return zipfile.getInputStream(ent);
} catch(IOException e) {
return null;
}
}
}
public static class DirVFS implements VFS {
private String prefix;
public DirVFS(String dir) {
if (dir.length() == 0)
prefix = null;
else
prefix = dir;
}
public InputStream open(String id) {
File file = new File(prefix,id.replace('/',File.separatorChar));
if (file.isFile()) {
try {
return new BufferedInputStream(new FileInputStream(file));
} catch(IOException e) {
return null;
}
}
return null;
}
}
private Vector vfs = new Vector();
private Hashtable once = new Hashtable();
private final static Object PRESENT = new Object();
public void addVFS(String fname) {
if (fname.length() == 0) {
if (!once.containsKey("")) {
once.put("",PRESENT);
vfs.addElement(new DirVFS(""));
}
return;
}
try {
File file = new File(fname);
String canon = file.getCanonicalPath().toString();
if (!once.containsKey(canon)) {
once.put(canon,PRESENT);
if (file.isDirectory()) vfs.addElement(new DirVFS(fname));
else if (file.exists() && (fname.endsWith(".jar") || fname.endsWith(".zip"))) {
vfs.addElement(new JarVFS(fname));
}
}
} catch(IOException e) {}
}
public InputStream open(String id) {
for(Enumeration enum = vfs.elements(); enum.hasMoreElements();) {
VFS v = (VFS)enum.nextElement();
InputStream stream = v.open(id);
if (stream != null) return stream;
}
return null;
}
}
--- NEW FILE ---
// Copyright 2000 Samuele Pedroni
package jxxload_help;
public class PathVFSJavaLoader extends ClassLoader {
private ClassLoader parent;
private PathVFS vfs;
public java.util.Vector interfaces = new java.util.Vector();
public PathVFSJavaLoader(PathVFS vfs,ClassLoader parent) {
this.vfs = vfs;
this.parent = parent;
}
protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
Class c;
c = findLoadedClass(name);
if (c != null) return c;
try {
if (parent != null) return parent.loadClass(name);
} catch(ClassNotFoundException e) {
}
java.io.InputStream in = vfs.open(name.replace('.','/')+".class");
if (in == null) throw new ClassNotFoundException(name);
try {
int av = in.available();
byte[] buf = new byte[av];
in.read(buf);
in.close();
return loadClassFromBytes(name,buf);
} catch(java.io.IOException e) {
throw new ClassNotFoundException(name);
}
}
private Class loadClassFromBytes(String name, byte[] data) {
Class c = defineClass(name, data, 0, data.length);
resolveClass(c);
if (c.isInterface()) interfaces.addElement(c);
if (!org.python.core.Options.skipCompile) {
Compiler.compileClass(c);
}
return c;
}
}
|