home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD 31 / SUPERCDa.iso / Inet / HotJava / hjava.exe / InstallerData / lax.jar / com / zerog / lax / DynamicClassLoader.class (.txt) next >
Encoding:
Java Class File  |  1999-01-21  |  4.2 KB  |  150 lines

  1. package com.zerog.lax;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.InputStream;
  6. import java.util.Enumeration;
  7. import java.util.Hashtable;
  8. import java.util.Vector;
  9. import java.util.zip.ZipFile;
  10.  
  11. public class DynamicClassLoader extends ClassLoader {
  12.    private Hashtable classes = new Hashtable();
  13.    private Vector dynamicPathAsText = new Vector();
  14.    private Vector dynamicPathAsObjects = new Vector();
  15.    private static Vector loaders = new Vector();
  16.  
  17.    public DynamicClassLoader() {
  18.       new Integer(4);
  19.       new StringBuffer();
  20.       loaders.addElement(this);
  21.  
  22.       try {
  23.          this.dynamicPathAsText.addElement("lax.jar");
  24.          this.dynamicPathAsObjects.addElement(new ZipFile("lax.jar"));
  25.          System.out.println("      >>>> Create new loader");
  26.       } catch (Exception var2) {
  27.          ((Throwable)var2).printStackTrace();
  28.       }
  29.  
  30.    }
  31.  
  32.    public static void addDynamicPath(Class var0, String var1) {
  33.       new Integer(4);
  34.       new StringBuffer();
  35.       DynamicClassLoader var2 = findLoader(var0);
  36.       if (var2 == null) {
  37.          throw new IllegalArgumentException("The Class passed as namespace wasn't loaded with a DynamicClassLoader");
  38.       } else {
  39.          File var3 = new File(var1);
  40.  
  41.          try {
  42.             if (!var3.isFile() || !var1.endsWith(".zip") && !var1.endsWith(".jar")) {
  43.                var2.dynamicPathAsObjects.addElement(var3);
  44.             } else {
  45.                var2.dynamicPathAsObjects.addElement(new ZipFile(var1));
  46.             }
  47.  
  48.             var2.dynamicPathAsText.addElement(var1);
  49.          } catch (Exception var5) {
  50.             ((Throwable)var5).printStackTrace();
  51.          }
  52.  
  53.       }
  54.    }
  55.  
  56.    public static DynamicClassLoader findLoader(Class var0) {
  57.       new Integer(4);
  58.       new StringBuffer();
  59.       Enumeration var1 = loaders.elements();
  60.  
  61.       while(var1.hasMoreElements()) {
  62.          DynamicClassLoader var2 = (DynamicClassLoader)var1.nextElement();
  63.          System.out.println("      >>>>> findLoader searching " + var2);
  64.          System.out.println("      >>>>> findLoader class " + var0.getClassLoader());
  65.          System.out.println("      >>>>> findLoader 1st " + ((Class)var2.classes.get("com.zerog.lax.LAX")).getClassLoader());
  66.          System.out.println("      >>>>> findLoader comp " + var2.classes.get("com.zerog.lax.LAX").equals(var0));
  67.          if (var2.classes.contains(var0)) {
  68.             System.out.println("      >>>>> findLoader found " + var2);
  69.             return var2;
  70.          }
  71.       }
  72.  
  73.       System.out.println("      >>>>> findLoader not found");
  74.       return null;
  75.    }
  76.  
  77.    private byte[] getClassCode(String var1) {
  78.       new Integer(4);
  79.       new StringBuffer();
  80.       var1 = var1.replace('.', '/') + ".class";
  81.       System.out.println("        >>>>>> Fetching the implementation of " + var1);
  82.       byte[] var2 = null;
  83.  
  84.       try {
  85.          Enumeration var3 = this.dynamicPathAsObjects.elements();
  86.  
  87.          while(var3.hasMoreElements()) {
  88.             Object var4 = var3.nextElement();
  89.             System.out.println("        >>>>>> Object " + var4);
  90.             Object var5;
  91.             if (var4 instanceof File) {
  92.                File var6 = (File)var4;
  93.                var5 = new FileInputStream(new File(var6, var1));
  94.             } else {
  95.                ZipFile var9 = (ZipFile)var4;
  96.                var5 = var9.getInputStream(var9.getEntry(var1));
  97.             }
  98.  
  99.             var2 = new byte[((InputStream)var5).available()];
  100.             ((InputStream)var5).read(var2);
  101.             ((InputStream)var5).close();
  102.          }
  103.  
  104.          return var2;
  105.       } catch (Exception var7) {
  106.          ((Throwable)var7).printStackTrace();
  107.          return null;
  108.       }
  109.    }
  110.  
  111.    public synchronized Class loadClass(String var1, boolean var2) throws ClassNotFoundException {
  112.       new Integer(4);
  113.       new StringBuffer();
  114.       System.out.println("        >>>>>> Load class : " + var1);
  115.       Class var3 = (Class)this.classes.get(var1);
  116.       if (var3 != null) {
  117.          System.out.println("        >>>>>> returning cached result.");
  118.          return var3;
  119.       } else {
  120.          if (!var1.equals("com.zerog.lax.LAX")) {
  121.             try {
  122.                var3 = super.findSystemClass(var1);
  123.                System.out.println("        >>>>>> returning system class (in CLASSPATH).");
  124.                return var3;
  125.             } catch (ClassNotFoundException var5) {
  126.                System.out.println("        >>>>>> Not a system class.");
  127.             }
  128.          }
  129.  
  130.          byte[] var4 = this.getClassCode(var1);
  131.          if (var4 == null) {
  132.             throw new ClassNotFoundException();
  133.          } else {
  134.             var3 = ((ClassLoader)this).defineClass(var4, 0, var4.length);
  135.             if (var3 == null) {
  136.                throw new ClassFormatError();
  137.             } else {
  138.                if (var2) {
  139.                   ((ClassLoader)this).resolveClass(var3);
  140.                }
  141.  
  142.                this.classes.put(var1, var3);
  143.                System.out.println("        >>>>>> Returning newly loaded class.");
  144.                return var3;
  145.             }
  146.          }
  147.       }
  148.    }
  149. }
  150.