package com.javujavu.javux.app.compat;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Hashtable;
import java.util.Vector;
import com.javujavu.javux.app.compat.protocol.javuplug1.JavuPlugURLConnection1;
public class JavuPlugClassLoader1 extends ClassLoader
{
protected final Vector jars;
protected final Hashtable cache;
private final String urlPrefix;
public JavuPlugClassLoader1()
{
jars= new Vector();
cache= new Hashtable();
urlPrefix= Integer.toString(hashCode(), 16);
}
private String checkFile(String fileName)
{
File f= new File(fileName);
if(f.isFile())
{
try { return f.getCanonicalPath(); }
catch(IOException e) {}
}
return null;
}
public synchronized JavuPlugJarClassLoader1 getJarLoader(String fileName)
{
fileName= checkFile(fileName);
if(fileName!=null)
{
for(int i= 0; i<jars.size(); i++)
{
JavuPlugJarClassLoader1 jar= (JavuPlugJarClassLoader1)jars.elementAt(i);
if(fileName.equals(jar.fileName)) return jar;
}
}
return null;
}
public synchronized JavuPlugJarClassLoader1 loadJar(String fileName)
{
fileName= checkFile(fileName);
if(fileName==null) return null;
JavuPlugJarClassLoader1 jar= getJarLoader(fileName);
if(jar==null)
{
try
{
jar= new JavuPlugJarClassLoader1(fileName, this);
jars.addElement(jar);
if(jars.size()==1)
{
JavuPlugURLConnection1.addHandler(getUrlPrefix(), this);
}
}
catch(IOException e) {}
}
return jar;
}
protected String getUrlPrefix()
{
return urlPrefix;
}
public synchronized void unloadJar(String fileName)
{
JavuPlugJarClassLoader1 jar= getJarLoader(fileName);
if(jar!=null)
{
jar.closeJar();
jars.removeElement(jar);
if(jars.size()==0)
{
JavuPlugURLConnection1.removeHandler(getUrlPrefix());
}
cache.clear();
}
}
public synchronized void unloadAllJars()
{
for(int i= 0; i<jars.size(); i++)
{
JavuPlugJarClassLoader1 jar= (JavuPlugJarClassLoader1)jars.elementAt(i);
jar.closeJar();
}
jars.removeAllElements();
JavuPlugURLConnection1.removeHandler(getUrlPrefix());
cache.clear();
}
protected Class findClass(String name)
throws ClassNotFoundException
{
String path= name.replace('.', '/').concat(".class");
for(int i= 0; i<jars.size(); i++)
{
JavuPlugJarClassLoader1 jar= (JavuPlugJarClassLoader1)jars.elementAt(i);
Class c= jar.jarFindClass(name, path);
if(c!=null)
{
cache.put(c.getName(), c);
return c;
}
}
throw new ClassNotFoundException(name);
}
protected synchronized Class loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
Class c= null;
c= (Class)cache.get(name);
if(c==null)
{
try { c= findSystemClass(name); }
catch (ClassNotFoundException e) {}
}
if(c==null) c= findClass(name);
if(resolve)
{
resolveClass(c);
}
return c;
}
public synchronized InputStream getResourceAsStream(String name)
{
if(name.startsWith("/")) name= name.substring(1);
for(int i= 0; i<jars.size(); i++)
{
JavuPlugJarClassLoader1 jar= (JavuPlugJarClassLoader1)jars.elementAt(i);
InputStream is= jar.getResourceAsStream(name);
if(is!=null) return is;
}
return null;
}
public URL getResource(String name)
{
URL u= getSystemResource(name);
if(u!=null) return u;
synchronized(this)
{
for(int i= 0; i<jars.size(); i++)
{
JavuPlugJarClassLoader1 jar= (JavuPlugJarClassLoader1)jars.elementAt(i);
u= jar.findResource(name);
if(u!=null) return u;
}
return null;
}
}
///////////////////////////////////////////////////////////
public JavuPlugJarClassLoader1[] listResourceLoaders(String name)
{
Vector v= new Vector();
synchronized(this)
{
for(int i= 0; i<jars.size(); i++)
{
JavuPlugJarClassLoader1 jar= (JavuPlugJarClassLoader1)jars.elementAt(i);
if(jar.getResourceEntry(name)!=null)
{
v.addElement(jar);
}
}
}
JavuPlugJarClassLoader1[] rr= new JavuPlugJarClassLoader1[v.size()];
v.copyInto(rr);
return rr;
}
public JavuPlugJarClassLoader1[] listPluginLoaders(String key)
{
return listResourceLoaders(key+".properties");
}
}
|