home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / applet / AppletClassLoader.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  8.8 KB  |  420 lines

  1. package sun.applet;
  2.  
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.net.HttpURLConnection;
  7. import java.net.URL;
  8. import java.net.URLConnection;
  9. import java.security.Identity;
  10. import java.util.Hashtable;
  11. import java.util.Vector;
  12.  
  13. public class AppletClassLoader extends ClassLoader {
  14.    private static boolean debug;
  15.    Vector archives = new Vector();
  16.    protected boolean verboseClassLoading = false;
  17.    URL base;
  18.    AppletResourceLoader resources;
  19.    AppletThreadGroup threadGroup;
  20.    protected Hashtable rawClasses = new Hashtable();
  21.    private static AppletMessageHandler amh = new AppletMessageHandler("appletclassloader");
  22.  
  23.    protected AppletClassLoader(URL var1) {
  24.       this.base = var1;
  25.       this.resources = new AppletResourceLoader(this);
  26.    }
  27.  
  28.    protected AppletClassLoader(URL var1, AppletResourceLoader var2) {
  29.       this.base = var1;
  30.       this.resources = var2;
  31.    }
  32.  
  33.    protected URL getCodeBase() {
  34.       return this.base;
  35.    }
  36.  
  37.    public void setCodeBase(URL var1) {
  38.       this.base = var1;
  39.    }
  40.  
  41.    private Class loadClass(String var1, URL var2) throws IOException {
  42.       InputStream var3 = null;
  43.  
  44.       Class var4;
  45.       try {
  46.          URLConnection var7 = var2.openConnection();
  47.          var7.setAllowUserInteraction(false);
  48.          var3 = var7.getInputStream();
  49.          int var8 = var7.getContentLength();
  50.          byte[] var9 = new byte[var8 == -1 ? 4096 : var8];
  51.          int var10 = 0;
  52.          Thread var12 = Thread.currentThread();
  53.  
  54.          int var11;
  55.          while((var11 = var3.read(var9, var10, var9.length - var10)) >= 0 && !var12.isInterrupted()) {
  56.             if ((var10 += var11) == var9.length) {
  57.                if (var8 >= 0) {
  58.                   break;
  59.                }
  60.  
  61.                byte[] var13 = new byte[var10 * 2];
  62.                System.arraycopy(var9, 0, var13, 0, var10);
  63.                var9 = var13;
  64.             }
  65.          }
  66.  
  67.          if (var12.isInterrupted()) {
  68.             throw new AppletIOException("loadclass.throw.interrupted", var2);
  69.          }
  70.  
  71.          var4 = ((ClassLoader)this).defineClass(var1, var9, 0, var10);
  72.       } catch (IOException var17) {
  73.          ((Throwable)var17).printStackTrace();
  74.          throw var17;
  75.       } catch (Throwable var18) {
  76.          var18.printStackTrace();
  77.          throw new AppletIOException("loadclass.throw.notloaded", var2);
  78.       } finally {
  79.          if (var3 != null) {
  80.             var3.close();
  81.          }
  82.  
  83.       }
  84.  
  85.       return var4;
  86.    }
  87.  
  88.    public Class loadClass(String var1) throws ClassNotFoundException {
  89.       return this.loadClass(var1, true);
  90.    }
  91.  
  92.    protected Class loadClass(String var1, boolean var2) throws ClassNotFoundException {
  93.       Class var3 = ((ClassLoader)this).findLoadedClass(var1);
  94.       if (var3 == null) {
  95.          SecurityManager var4 = System.getSecurityManager();
  96.          if (var4 != null) {
  97.             int var5 = var1.lastIndexOf(46);
  98.             if (var5 >= 0) {
  99.                var4.checkPackageAccess(var1.substring(0, var5));
  100.             }
  101.          }
  102.  
  103.          try {
  104.             return ((ClassLoader)this).findSystemClass(var1);
  105.          } catch (ClassNotFoundException var6) {
  106.             var3 = this.findClass(var1);
  107.          }
  108.       }
  109.  
  110.       if (var3 == null) {
  111.          throw new ClassNotFoundException(var1);
  112.       } else {
  113.          if (var2) {
  114.             ((ClassLoader)this).resolveClass(var3);
  115.          }
  116.  
  117.          return var3;
  118.       }
  119.    }
  120.  
  121.    private synchronized Class loadCode(String var1, String var2, String var3) throws ClassNotFoundException, IOException {
  122.       Class var4 = ((ClassLoader)this).findLoadedClass(var3);
  123.       if (var4 != null) {
  124.          return var4;
  125.       } else {
  126.          AppletClassEntry var5 = (AppletClassEntry)this.rawClasses.get(var3);
  127.          if (var5 == null) {
  128.             SecurityManager var26 = System.getSecurityManager();
  129.             if (var26 != null) {
  130.                int var7 = var3.lastIndexOf(46);
  131.                if (var7 >= 0) {
  132.                   String var8 = var3.substring(0, var7);
  133.                   var26.checkPackageAccess(var8);
  134.                }
  135.             }
  136.  
  137.             try {
  138.                return ((ClassLoader)this).findSystemClass(var3);
  139.             } catch (ClassNotFoundException var24) {
  140.                try {
  141.                   URL var27 = new URL(this.base, var1 + var2);
  142.                   this.verbose(amh.getMessage("loadcode.verbose", var27.toString(), var3));
  143.                   var4 = this.loadClass(var3, var27);
  144.                } catch (FileNotFoundException var18) {
  145.                   this.errorMsg("filenotfound", var3);
  146.                } catch (ClassFormatError var19) {
  147.                   this.errorMsg("fileformat", var3);
  148.                } catch (IOException var20) {
  149.                   throw var20;
  150.                } catch (Exception var21) {
  151.                   this.errorMsg("fileexception", ((Throwable)var21).toString(), var3);
  152.                } catch (ThreadDeath var22) {
  153.                   this.errorMsg("filedeath", var3);
  154.                   throw var22;
  155.                } catch (Error var23) {
  156.                   this.errorMsg("fileerror", ((Throwable)var23).toString(), var3);
  157.                }
  158.  
  159.                if (var4 != null) {
  160.                   ((ClassLoader)this).resolveClass(var4);
  161.                }
  162.  
  163.                return var4;
  164.             }
  165.          } else {
  166.             Class var6;
  167.             try {
  168.                Class var9 = super.defineClass(var5.classBuf, var5.start, var5.len);
  169.                if (var5.ids != null) {
  170.                   ((ClassLoader)this).setSigners(var9, var5.ids);
  171.                }
  172.  
  173.                var6 = var9;
  174.             } finally {
  175.                this.rawClasses.remove(var3);
  176.             }
  177.  
  178.             return var6;
  179.          }
  180.       }
  181.    }
  182.  
  183.    Class loadCode(String var1) throws ClassNotFoundException {
  184.       this.debug("AppletClassLoader(" + this.base.toString() + ").loadCode(" + var1 + ")");
  185.       String var2 = ".class";
  186.       String var3 = ".java";
  187.       int var6 = var1.lastIndexOf(46);
  188.       String var7 = "";
  189.       if (var6 != -1) {
  190.          var7 = var1.substring(var6);
  191.       }
  192.  
  193.       if (var6 != -1 && var1.indexOf(47) != -1) {
  194.          String var21 = var1.substring(0, var6);
  195.          String var25 = var21.replace('/', '.');
  196.  
  197.          try {
  198.             return this.loadCode(var21, var7, var25);
  199.          } catch (IOException var11) {
  200.             throw new ClassNotFoundException(var25);
  201.          }
  202.       } else if (!var7.equals(var3) && !var7.equals(var2)) {
  203.          String var16 = var1.replace('.', '/');
  204.          var7 = var2;
  205.          String var22 = var16.replace('/', '.');
  206.  
  207.          try {
  208.             return this.loadCode(var16, var7, var22);
  209.          } catch (IOException var12) {
  210.          } catch (ClassNotFoundException var13) {
  211.          }
  212.  
  213.          if (var6 < 0) {
  214.             var6 = var1.length();
  215.          }
  216.  
  217.          var16 = var1.substring(0, var6);
  218.          var16 = var16.replace('.', '/');
  219.          var7 = var1.substring(var6);
  220.          var22 = var16.replace('/', '.');
  221.  
  222.          try {
  223.             return this.loadCode(var16, var7, var22);
  224.          } catch (IOException var9) {
  225.          } catch (ClassNotFoundException var10) {
  226.          }
  227.  
  228.          var16 = var1.substring(0, var6);
  229.          var16 = var16.replace('.', '/');
  230.          var7 = var1.substring(var6);
  231.          var22 = var1.replace('/', '.');
  232.  
  233.          try {
  234.             return this.loadCode(var16, var7, var22);
  235.          } catch (IOException var8) {
  236.             throw new ClassNotFoundException(var22);
  237.          }
  238.       } else {
  239.          String var4 = var1.substring(0, var6);
  240.          var4 = var4.replace('.', '/');
  241.          var7 = var2;
  242.          String var5 = var4.replace('/', '.');
  243.  
  244.          try {
  245.             return this.loadCode(var4, var7, var5);
  246.          } catch (IOException var14) {
  247.             throw new ClassNotFoundException(var5);
  248.          }
  249.       }
  250.    }
  251.  
  252.    public AppletClassEntry defineClassFromBytes(String var1, byte[] var2, int var3, int var4) {
  253.       SecurityManager var5 = System.getSecurityManager();
  254.       String var6 = "";
  255.       int var7 = var1.lastIndexOf(46);
  256.       if (var7 >= 0) {
  257.          var6 = var1.substring(0, var7);
  258.       }
  259.  
  260.       if (var5 != null) {
  261.          var5.checkPackageDefinition(var6);
  262.       }
  263.  
  264.       AppletClassEntry var8 = new AppletClassEntry(var2, var3, var4, var1, (Identity[])null);
  265.       this.rawClasses.put(var8, var8);
  266.       this.rawClasses.put(var1, var8);
  267.       return var8;
  268.    }
  269.  
  270.    void errorMsg(String var1, String var2) {
  271.       System.err.println(amh.getMessage(var1, var2));
  272.    }
  273.  
  274.    void errorMsg(String var1, String var2, String var3) {
  275.       System.err.println(amh.getMessage(var1, var2, var3));
  276.    }
  277.  
  278.    private synchronized Class findClass(String var1) {
  279.       Class var2 = ((ClassLoader)this).findLoadedClass(var1);
  280.       if (var2 != null) {
  281.          return var2;
  282.       } else {
  283.          AppletClassEntry var3 = (AppletClassEntry)this.rawClasses.get(var1);
  284.          if (var3 == null) {
  285.             this.verbose(amh.getMessage("findclass.verbose.findclass", Thread.currentThread().getName(), var1));
  286.             SecurityManager var22 = System.getSecurityManager();
  287.             if (var22 != null) {
  288.                int var5 = var1.lastIndexOf(46);
  289.                if (var5 >= 0) {
  290.                   var22.checkPackageDefinition(var1.substring(0, var5));
  291.                }
  292.             }
  293.  
  294.             String var23 = var1.replace('.', '/') + ".class";
  295.  
  296.             try {
  297.                URL var6 = new URL(this.base, var23);
  298.                this.verbose(amh.getMessage("findclass.verbose.openstream", var6.toString(), var1));
  299.                var2 = this.loadClass(var1, var6);
  300.             } catch (FileNotFoundException var15) {
  301.                this.errorMsg("filenotfound", var1);
  302.             } catch (ClassFormatError var16) {
  303.                this.errorMsg("fileformat", var1);
  304.             } catch (IOException var17) {
  305.                this.errorMsg("fileioexception", var1);
  306.             } catch (Exception var18) {
  307.                this.errorMsg("fileexception", ((Throwable)var18).toString(), var1);
  308.             } catch (ThreadDeath var19) {
  309.                this.errorMsg("filedeath", var1);
  310.                throw var19;
  311.             } catch (Error var20) {
  312.                this.errorMsg("fileerror", ((Throwable)var20).toString(), var1);
  313.             }
  314.  
  315.             return var2;
  316.          } else {
  317.             Class var4;
  318.             try {
  319.                Class var7 = super.defineClass(var3.classBuf, var3.start, var3.len);
  320.                if (var3.ids != null) {
  321.                   ((ClassLoader)this).setSigners(var7, var3.ids);
  322.                }
  323.  
  324.                var4 = var7;
  325.             } finally {
  326.                this.rawClasses.remove(var1);
  327.             }
  328.  
  329.             return var4;
  330.          }
  331.       }
  332.    }
  333.  
  334.    public AppletResourceLoader getResourceLoader() {
  335.       return this.resources;
  336.    }
  337.  
  338.    private boolean resourceExists(URL var1) {
  339.       boolean var2 = true;
  340.  
  341.       try {
  342.          URLConnection var3 = var1.openConnection();
  343.          if (var3 instanceof HttpURLConnection) {
  344.             HttpURLConnection var4 = (HttpURLConnection)var3;
  345.             int var5 = var4.getResponseCode();
  346.             if (var5 == 200) {
  347.                return true;
  348.             }
  349.  
  350.             if (var5 >= 400) {
  351.                return false;
  352.             }
  353.          } else {
  354.             InputStream var7 = var1.openStream();
  355.             var7.close();
  356.          }
  357.       } catch (Exception var6) {
  358.          var2 = false;
  359.       }
  360.  
  361.       return var2;
  362.    }
  363.  
  364.    public URL getResource(String var1) {
  365.       this.verbose(amh.getMessage("getresource.verbose.forname", var1));
  366.       URL var2 = ClassLoader.getSystemResource(var1);
  367.       if (var2 != null) {
  368.          this.verbose(amh.getMessage("getresource.verbose.found", var1));
  369.          return var2;
  370.       } else {
  371.          String var3 = this.resources.getResourceAsName(var1);
  372.  
  373.          try {
  374.             var2 = new URL(var3);
  375.             if (!this.resourceExists(var2)) {
  376.                var2 = null;
  377.             }
  378.          } catch (Exception var4) {
  379.             var2 = null;
  380.          }
  381.  
  382.          return var2;
  383.       }
  384.    }
  385.  
  386.    public InputStream getResourceAsStream(String var1) {
  387.       this.verbose("AppletClassLoader.getResourceAsStream for name: " + var1);
  388.       InputStream var2 = ClassLoader.getSystemResourceAsStream(var1);
  389.       if (var2 != null) {
  390.          this.verbose(amh.getMessage("getresourceasstream.verbose", var1));
  391.          return var2;
  392.       } else {
  393.          return this.resources.getResourceAsStream(var1);
  394.       }
  395.    }
  396.  
  397.    protected synchronized ThreadGroup getThreadGroup() {
  398.       if (this.threadGroup == null || this.threadGroup.isDestroyed()) {
  399.          this.threadGroup = new AppletThreadGroup(this.base + "-threadGroup");
  400.          this.threadGroup.setDaemon(true);
  401.       }
  402.  
  403.       return this.threadGroup;
  404.    }
  405.  
  406.    private void debug(String var1) {
  407.       if (debug) {
  408.          System.err.println(var1);
  409.       }
  410.  
  411.    }
  412.  
  413.    private void verbose(String var1) {
  414.       if (this.verboseClassLoading) {
  415.          System.out.println(var1);
  416.       }
  417.  
  418.    }
  419. }
  420.