home *** CD-ROM | disk | FTP | other *** search
- package com.extensibility.plugin;
-
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.zip.ZipEntry;
- import java.util.zip.ZipFile;
-
- class PluginClassLoader extends ClassLoader {
- private Hashtable classes = new Hashtable();
- private Hashtable unloadedClasses = new Hashtable();
-
- public String enumerateClasses(File var1) throws IOException {
- ZipFile var2 = new ZipFile(var1);
- Enumeration var3 = var2.entries();
- String var4 = null;
-
- while(var3.hasMoreElements()) {
- ZipEntry var5 = (ZipEntry)var3.nextElement();
- String var6 = var5.getName();
- String var7 = var6.toLowerCase();
- if (var7.endsWith(".class")) {
- String var8 = var5.getName().replace('/', '.');
- var8 = var8.substring(0, var8.length() - 6);
- PluginClassInfo var9 = new PluginClassInfo((PluginClassLoader)null);
- var9.file = var2;
- var9.entry = var5;
- this.unloadedClasses.put(var8, var9);
- } else if (var7.endsWith(".mf")) {
- var4 = this.extractMainClassFromManifest(var2, var5);
- }
- }
-
- return var4;
- }
-
- protected String extractMainClassFromManifest(ZipFile var1, ZipEntry var2) throws IOException {
- BufferedReader var3 = new BufferedReader(new InputStreamReader(var1.getInputStream(var2)));
- String var4 = null;
-
- try {
- boolean var5 = false;
-
- while(!var5) {
- String var6 = var3.readLine();
- if (var6.startsWith("Main-Class:")) {
- var4 = var6.substring(11).trim();
- var5 = true;
- }
- }
- } catch (Exception var7) {
- }
-
- var3.close();
- return var4;
- }
-
- protected byte[] loadClassData(String var1) {
- Object var2 = this.unloadedClasses.get(var1);
- byte[] var3 = null;
- if (var2 != null) {
- PluginClassInfo var4 = (PluginClassInfo)var2;
- ZipEntry var5 = var4.entry;
- int var6 = (int)var5.getSize();
- var3 = new byte[var6];
-
- try {
- InputStream var7 = var4.file.getInputStream(var5);
- int var8 = 0;
-
- for(int var9 = 0; var6 > 0 && var9 >= 0; var8 += var9) {
- var9 = var7.read(var3, var8, var6);
- var6 -= var9;
- }
-
- var7.close();
- } catch (Exception var10) {
- var3 = null;
- }
-
- this.unloadedClasses.remove(var1);
- }
-
- return var3;
- }
-
- public synchronized Class loadClass(String var1, boolean var2) throws ClassNotFoundException {
- Class var3 = (Class)this.classes.get(var1);
- if (var3 != null) {
- return var3;
- } else {
- try {
- var3 = super.findSystemClass(var1);
- return var3;
- } catch (Exception var7) {
- if (var1.startsWith("java.")) {
- throw new ClassNotFoundException();
- } else {
- byte[] var4 = this.loadClassData(var1);
- if (var4 == null) {
- throw new ClassNotFoundException();
- } else {
- try {
- var3 = ((ClassLoader)this).defineClass(var1, var4, 0, var4.length);
- } catch (Error var6) {
- throw var6;
- }
-
- if (var2) {
- ((ClassLoader)this).resolveClass(var3);
- }
-
- return var3;
- }
- }
- }
- }
- }
- }
-