001: package com.javujavu.javux.app.compat;
002:
003: import java.io.File;
004: import java.io.IOException;
005: import java.io.InputStream;
006: import java.net.URL;
007: import java.util.Hashtable;
008: import java.util.Vector;
009:
010: import com.javujavu.javux.app.compat.protocol.javuplug1.JavuPlugURLConnection1;
011:
012: public class JavuPlugClassLoader1 extends ClassLoader {
013: protected final Vector jars;
014: protected final Hashtable cache;
015: private final String urlPrefix;
016:
017: public JavuPlugClassLoader1() {
018: jars = new Vector();
019: cache = new Hashtable();
020: urlPrefix = Integer.toString(hashCode(), 16);
021: }
022:
023: private String checkFile(String fileName) {
024: File f = new File(fileName);
025: if (f.isFile()) {
026: try {
027: return f.getCanonicalPath();
028: } catch (IOException e) {
029: }
030: }
031: return null;
032: }
033:
034: public synchronized JavuPlugJarClassLoader1 getJarLoader(
035: String fileName) {
036: fileName = checkFile(fileName);
037: if (fileName != null) {
038: for (int i = 0; i < jars.size(); i++) {
039: JavuPlugJarClassLoader1 jar = (JavuPlugJarClassLoader1) jars
040: .elementAt(i);
041: if (fileName.equals(jar.fileName))
042: return jar;
043: }
044: }
045: return null;
046: }
047:
048: public synchronized JavuPlugJarClassLoader1 loadJar(String fileName) {
049: fileName = checkFile(fileName);
050: if (fileName == null)
051: return null;
052: JavuPlugJarClassLoader1 jar = getJarLoader(fileName);
053: if (jar == null) {
054: try {
055: jar = new JavuPlugJarClassLoader1(fileName, this );
056: jars.addElement(jar);
057:
058: if (jars.size() == 1) {
059: JavuPlugURLConnection1.addHandler(getUrlPrefix(),
060: this );
061: }
062: } catch (IOException e) {
063: }
064: }
065: return jar;
066: }
067:
068: protected String getUrlPrefix() {
069: return urlPrefix;
070: }
071:
072: public synchronized void unloadJar(String fileName) {
073: JavuPlugJarClassLoader1 jar = getJarLoader(fileName);
074: if (jar != null) {
075: jar.closeJar();
076: jars.removeElement(jar);
077: if (jars.size() == 0) {
078: JavuPlugURLConnection1.removeHandler(getUrlPrefix());
079: }
080: cache.clear();
081: }
082: }
083:
084: public synchronized void unloadAllJars() {
085: for (int i = 0; i < jars.size(); i++) {
086: JavuPlugJarClassLoader1 jar = (JavuPlugJarClassLoader1) jars
087: .elementAt(i);
088: jar.closeJar();
089: }
090: jars.removeAllElements();
091: JavuPlugURLConnection1.removeHandler(getUrlPrefix());
092: cache.clear();
093: }
094:
095: protected Class findClass(String name)
096: throws ClassNotFoundException {
097: String path = name.replace('.', '/').concat(".class");
098:
099: for (int i = 0; i < jars.size(); i++) {
100: JavuPlugJarClassLoader1 jar = (JavuPlugJarClassLoader1) jars
101: .elementAt(i);
102:
103: Class c = jar.jarFindClass(name, path);
104: if (c != null) {
105: cache.put(c.getName(), c);
106:
107: return c;
108: }
109: }
110: throw new ClassNotFoundException(name);
111: }
112:
113: protected synchronized Class loadClass(String name, boolean resolve)
114: throws ClassNotFoundException {
115: Class c = null;
116: c = (Class) cache.get(name);
117: if (c == null) {
118: try {
119: c = findSystemClass(name);
120: } catch (ClassNotFoundException e) {
121: }
122: }
123: if (c == null)
124: c = findClass(name);
125: if (resolve) {
126: resolveClass(c);
127: }
128: return c;
129: }
130:
131: public synchronized InputStream getResourceAsStream(String name) {
132: if (name.startsWith("/"))
133: name = name.substring(1);
134:
135: for (int i = 0; i < jars.size(); i++) {
136: JavuPlugJarClassLoader1 jar = (JavuPlugJarClassLoader1) jars
137: .elementAt(i);
138: InputStream is = jar.getResourceAsStream(name);
139: if (is != null)
140: return is;
141: }
142: return null;
143: }
144:
145: public URL getResource(String name) {
146: URL u = getSystemResource(name);
147: if (u != null)
148: return u;
149:
150: synchronized (this ) {
151: for (int i = 0; i < jars.size(); i++) {
152: JavuPlugJarClassLoader1 jar = (JavuPlugJarClassLoader1) jars
153: .elementAt(i);
154: u = jar.findResource(name);
155: if (u != null)
156: return u;
157: }
158: return null;
159: }
160: }
161:
162: ///////////////////////////////////////////////////////////
163:
164: public JavuPlugJarClassLoader1[] listResourceLoaders(String name) {
165: Vector v = new Vector();
166: synchronized (this ) {
167: for (int i = 0; i < jars.size(); i++) {
168: JavuPlugJarClassLoader1 jar = (JavuPlugJarClassLoader1) jars
169: .elementAt(i);
170: if (jar.getResourceEntry(name) != null) {
171: v.addElement(jar);
172: }
173: }
174: }
175: JavuPlugJarClassLoader1[] rr = new JavuPlugJarClassLoader1[v
176: .size()];
177: v.copyInto(rr);
178: return rr;
179: }
180:
181: public JavuPlugJarClassLoader1[] listPluginLoaders(String key) {
182: return listResourceLoaders(key + ".properties");
183: }
184: }
|