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