home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML Instance.sea / XML Instance / Required / extplugin.jar / com / extensibility / plugin / PluginClassLoader.class (.txt) next >
Encoding:
Java Class File  |  2000-07-31  |  3.0 KB  |  159 lines

  1. package com.extensibility.plugin;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import java.util.Enumeration;
  9. import java.util.Hashtable;
  10. import java.util.zip.ZipEntry;
  11. import java.util.zip.ZipFile;
  12.  
  13. class PluginClassLoader extends ClassLoader {
  14.    private Hashtable classes = new Hashtable();
  15.    private Hashtable unloadedClasses = new Hashtable();
  16.  
  17.    public String enumerateClasses(File var1) throws IOException {
  18.       ZipFile var2 = new ZipFile(var1);
  19.       Enumeration var3 = var2.entries();
  20.       String var4 = null;
  21.  
  22.       while(var3.hasMoreElements()) {
  23.          ZipEntry var5 = (ZipEntry)var3.nextElement();
  24.          String var6 = var5.getName();
  25.          String var7 = var6.toLowerCase();
  26.          if (var7.endsWith(".mf")) {
  27.             var4 = this.extractMainClassFromManifest(var2, var5);
  28.          } else {
  29.             String var8 = var5.getName();
  30.             if (var7.endsWith(".class")) {
  31.                var8 = var8.replace('/', '.');
  32.                var8 = var8.substring(0, var8.length() - 6);
  33.             }
  34.  
  35.             PluginClassInfo var10000 = new PluginClassInfo;
  36.             if (this == null) {
  37.                throw null;
  38.             }
  39.  
  40.             var10000.<init>(this);
  41.             PluginClassInfo var9 = var10000;
  42.             var9.file = var2;
  43.             var9.entry = var5;
  44.             this.unloadedClasses.put(var8, var9);
  45.          }
  46.       }
  47.  
  48.       return var4;
  49.    }
  50.  
  51.    protected String extractMainClassFromManifest(ZipFile var1, ZipEntry var2) throws IOException {
  52.       BufferedReader var3 = new BufferedReader(new InputStreamReader(var1.getInputStream(var2)));
  53.       String var4 = null;
  54.  
  55.       try {
  56.          boolean var5 = false;
  57.  
  58.          while(!var5) {
  59.             String var6 = var3.readLine();
  60.             if (var6 == null) {
  61.                break;
  62.             }
  63.  
  64.             if (var6.startsWith("Main-Class:")) {
  65.                var4 = var6.substring(11).trim();
  66.                var5 = true;
  67.             }
  68.          }
  69.       } catch (Exception var7) {
  70.       }
  71.  
  72.       var3.close();
  73.       return var4;
  74.    }
  75.  
  76.    protected byte[] loadClassData(String var1) {
  77.       Object var2 = this.unloadedClasses.get(var1);
  78.       byte[] var3 = null;
  79.       if (var2 != null) {
  80.          PluginClassInfo var4 = (PluginClassInfo)var2;
  81.          ZipEntry var5 = var4.entry;
  82.          int var6 = (int)var5.getSize();
  83.          var3 = new byte[var6];
  84.  
  85.          try {
  86.             InputStream var7 = var4.file.getInputStream(var5);
  87.             int var8 = 0;
  88.  
  89.             for(int var9 = 0; var6 > 0 && var9 >= 0; var8 += var9) {
  90.                var9 = var7.read(var3, var8, var6);
  91.                var6 -= var9;
  92.             }
  93.  
  94.             var7.close();
  95.          } catch (Exception var10) {
  96.             var3 = null;
  97.          }
  98.  
  99.          this.unloadedClasses.remove(var1);
  100.       }
  101.  
  102.       return var3;
  103.    }
  104.  
  105.    public InputStream getResourceAsStream(String var1) {
  106.       Object var2 = this.unloadedClasses.get(var1);
  107.       InputStream var3 = null;
  108.       if (var2 != null) {
  109.          PluginClassInfo var4 = (PluginClassInfo)var2;
  110.          ZipEntry var5 = var4.entry;
  111.  
  112.          try {
  113.             var3 = var4.file.getInputStream(var5);
  114.          } catch (IOException var7) {
  115.             var3 = null;
  116.          }
  117.       }
  118.  
  119.       if (var3 == null) {
  120.          var3 = super.getResourceAsStream(var1);
  121.       }
  122.  
  123.       return var3;
  124.    }
  125.  
  126.    public synchronized Class loadClass(String var1, boolean var2) throws ClassNotFoundException {
  127.       Class var3 = (Class)this.classes.get(var1);
  128.       if (var3 != null) {
  129.          return var3;
  130.       } else {
  131.          try {
  132.             var3 = super.findSystemClass(var1);
  133.             return var3;
  134.          } catch (Exception var7) {
  135.             if (var1.startsWith("java.")) {
  136.                throw new ClassNotFoundException();
  137.             } else {
  138.                byte[] var4 = this.loadClassData(var1);
  139.                if (var4 == null) {
  140.                   throw new ClassNotFoundException();
  141.                } else {
  142.                   try {
  143.                      var3 = ((ClassLoader)this).defineClass(var1, var4, 0, var4.length);
  144.                   } catch (Error var6) {
  145.                      throw var6;
  146.                   }
  147.  
  148.                   if (var2) {
  149.                      ((ClassLoader)this).resolveClass(var3);
  150.                   }
  151.  
  152.                   return var3;
  153.                }
  154.             }
  155.          }
  156.       }
  157.    }
  158. }
  159.