home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 June / CHIPHEFT062001.ISO / browser / nc32lyc / comm.z / java40.jar / netscape / applet / AppletClassLoader.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-08-15  |  17.3 KB  |  936 lines

  1. package netscape.applet;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.File;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.net.MalformedURLException;
  10. import java.net.URL;
  11. import java.net.URLConnection;
  12. import java.util.Enumeration;
  13. import java.util.Hashtable;
  14. import java.util.Vector;
  15. import java.util.zip.ZipEntry;
  16. import java.util.zip.ZipFile;
  17. import netscape.misc.WeakLink;
  18. import netscape.security.AppletSecurity;
  19. import netscape.security.AppletSecurityException;
  20. import netscape.security.Principal;
  21. import netscape.security.PrivilegeManager;
  22. import netscape.security.Target;
  23.  
  24. public class AppletClassLoader extends ClassLoader {
  25.    URL codeBaseURL;
  26.    URL[] archiveURL;
  27.    MozillaAppletContext context;
  28.    static boolean wantTiming;
  29.    long loaderTime;
  30.    String scriptOrigin;
  31.    boolean isReusable;
  32.    Principal codeBasePrincipal;
  33.    Principal[] matchPrincipalAry;
  34.    public static final String MANIFEST_FILENAME = "META-INF/manifest.mf";
  35.    private Hashtable nameToArchive;
  36.    private String[] archiveFile;
  37.    private boolean[] capturedArchive;
  38.    private int[] nativeArchive;
  39.    private int[] nativeZig;
  40.    byte[] inputBuf;
  41.    static Vector classloaders = new Vector(10);
  42.    private static boolean capturingClasses;
  43.    private static final boolean MARIMBA_ENABLED = true;
  44.    private CastanetChannelInfo channelInfo;
  45.    private Hashtable codebaseEnv;
  46.  
  47.    String grabArchiveFile(int var1) throws IOException {
  48.       return this.grabArchiveFile(var1, this.archiveURL[var1]);
  49.    }
  50.  
  51.    private String grabArchiveFile(int var1, URL var2) throws IOException {
  52.       String var3 = var2.getFile();
  53.       if (!var3.endsWith(".jar") && !var3.endsWith(".zip")) {
  54.          return null;
  55.       } else {
  56.          String var4;
  57.          if (capturingClasses) {
  58.             int var5 = var3.lastIndexOf(47);
  59.             String var6 = var3.substring(var5 + 1);
  60.             var4 = this.getCaptureDir() + "/" + var6;
  61.          } else {
  62.             var4 = this.getTempName();
  63.             if (var4 == null) {
  64.                return null;
  65.             }
  66.          }
  67.  
  68.          SecurityManager.enablePrivilege("UniversalFileAccess");
  69.          SecurityManager.enablePrivilege("UniversalConnect");
  70.          FileOutputStream var16 = new FileOutputStream(var4);
  71.          long var17 = 0L;
  72.          if (wantTiming) {
  73.             var17 = System.currentTimeMillis();
  74.          }
  75.  
  76.          InputStream var8 = null;
  77.  
  78.          try {
  79.             URLConnection var11 = var2.openConnection();
  80.             var11.setAllowUserInteraction(false);
  81.             var8 = var11.getInputStream();
  82.             if (this.inputBuf == null) {
  83.                this.inputBuf = new byte[4096];
  84.             }
  85.  
  86.             Thread var13 = Thread.currentThread();
  87.  
  88.             int var12;
  89.             while((var12 = var8.read(this.inputBuf)) >= 0 && !var13.isInterrupted()) {
  90.                var16.write(this.inputBuf, 0, var12);
  91.             }
  92.  
  93.             if (var13.isInterrupted()) {
  94.                throw new IOException("interrupted: " + this);
  95.             }
  96.          } finally {
  97.             if (var8 != null) {
  98.                var8.close();
  99.             }
  100.  
  101.             if (var16 != null) {
  102.                var16.close();
  103.             }
  104.  
  105.          }
  106.  
  107.          SecurityManager.revertPrivilege();
  108.          if (wantTiming) {
  109.             long var9 = System.currentTimeMillis();
  110.             long var18 = var9 - var17;
  111.             this.loaderTime += var18;
  112.             System.err.println("# Archive download time: " + var2 + ": " + var18 + " (total = " + this.loaderTime + ")");
  113.          }
  114.  
  115.          if (capturingClasses) {
  116.             System.err.println("#\tCaptured archive " + var4);
  117.             this.capturedArchive[var1] = true;
  118.          } else if (this.context != null && MozillaAppletContext.debug >= 2) {
  119.             System.err.println("# Loading classes from downloaded archive file: " + var2);
  120.          }
  121.  
  122.          return var4;
  123.       }
  124.    }
  125.  
  126.    native String getTempName();
  127.  
  128.    private native int openArchive0(String var1) throws IOException;
  129.  
  130.    private native byte[] loadFromArchive0(int var1, String var2) throws IOException;
  131.  
  132.    private native void closeArchive0(int var1) throws IOException;
  133.  
  134.    void openArchive(int var1) {
  135.       this.openArchive(var1, this.archiveURL[var1]);
  136.    }
  137.  
  138.    private void openArchive(int var1, URL var2) {
  139.       try {
  140.          this.archiveFile[var1] = this.grabArchiveFile(var1, var2);
  141.          if (this.archiveFile[var1] == null) {
  142.             return;
  143.          }
  144.  
  145.          this.nativeArchive[var1] = this.openArchive0(this.archiveFile[var1]);
  146.          if (this.nativeArchive[var1] != 0) {
  147.             this.nativeZig[var1] = this.setupZignature();
  148.             if (this.nativeZig[var1] != 0) {
  149.                if (!this.loadManifest(this.nativeArchive[var1], this.nativeZig[var1], this.codeBaseURL.getFile()) || this.loadSignatures(this.nativeArchive[var1], this.nativeZig[var1], this.codeBaseURL.getFile()) <= 0) {
  150.                   this.nativeZig[var1] = 0;
  151.                }
  152.  
  153.                return;
  154.             }
  155.          }
  156.       } catch (IOException var4) {
  157.          ((Throwable)var4).printStackTrace();
  158.          System.err.println("# Unable to load archive " + this.archiveURL[var1] + ": " + var4);
  159.          this.nativeZig[var1] = 0;
  160.       }
  161.  
  162.    }
  163.  
  164.    byte[] loadFromArchive(String var1, int var2) throws IOException {
  165.       return this.nativeArchive[var2] != 0 ? this.loadFromArchive0(this.nativeArchive[var2], var1) : null;
  166.    }
  167.  
  168.    void closeArchive() {
  169.       for(int var1 = this.archiveURL.length - 1; var1 >= 0; --var1) {
  170.          if (this.nativeArchive[var1] != 0) {
  171.             try {
  172.                this.closeArchive0(this.nativeArchive[var1]);
  173.                if (this.context != null && MozillaAppletContext.debug >= 5) {
  174.                   System.err.println("# Closed downloaded archive: " + this.archiveURL[var1]);
  175.                }
  176.             } catch (IOException var4) {
  177.                if (this.context != null && MozillaAppletContext.debug >= 5) {
  178.                   System.err.println("# Failed to close downloaded archive: " + this.archiveURL[var1]);
  179.                }
  180.             }
  181.  
  182.             this.nativeArchive[var1] = 0;
  183.             if (!this.capturedArchive[var1]) {
  184.                File var2 = new File(this.archiveFile[var1]);
  185.                SecurityManager.enablePrivilege("UniversalFileRead");
  186.                SecurityManager.enablePrivilege("UniversalFileDelete");
  187.                boolean var3 = var2.delete();
  188.                SecurityManager.revertPrivilege();
  189.                if (this.context != null && MozillaAppletContext.debug >= 5) {
  190.                   if (var3) {
  191.                      System.err.println("# Deleted downloaded archive: " + this.archiveFile[var1]);
  192.                   } else {
  193.                      System.err.println("# Failed to delete downloaded archive: " + this.archiveFile[var1]);
  194.                   }
  195.                }
  196.             }
  197.          }
  198.       }
  199.  
  200.    }
  201.  
  202.    static synchronized AppletClassLoader getClassLoader(MozillaAppletContext var0, URL var1, URL[] var2, String var3, boolean var4) {
  203.       if (var2 == null) {
  204.          var2 = new URL[0];
  205.       }
  206.  
  207.       boolean var5 = false;
  208.       AppletClassLoader var6 = null;
  209.       SecurityManager.enablePrivilege("UniversalConnect");
  210.       String var8 = var1.getFile();
  211.       int var9 = var8.lastIndexOf(47);
  212.       URL var7 = var1;
  213.       if (var9 > 0 && var9 < var8.length() - 1) {
  214.          try {
  215.             var7 = new URL(var1, var8.substring(0, var9 + 1));
  216.          } catch (MalformedURLException var31) {
  217.          }
  218.       }
  219.  
  220.       for(int var10 = 0; var10 < classloaders.size(); ++var10) {
  221.          WeakLink var11 = (WeakLink)classloaders.elementAt(var10);
  222.          AppletClassLoader var12 = (AppletClassLoader)var11.get();
  223.          if (var12 == null) {
  224.             var5 = true;
  225.          } else if (var7.equals(var12.codeBaseURL)) {
  226.             label145: {
  227.                boolean var10000;
  228.                if (var3 == null) {
  229.                   if (var12.scriptOrigin == null) {
  230.                      break label145;
  231.                   }
  232.  
  233.                   var10000 = false;
  234.                } else {
  235.                   var10000 = var3.equals(var12.scriptOrigin);
  236.                }
  237.  
  238.                if (!var10000) {
  239.                   continue;
  240.                }
  241.             }
  242.  
  243.             if ((var3 == null || var0 == var12.context) && var12.isReusable) {
  244.                if (!var4) {
  245.                   var6 = var12;
  246.                   int var13 = var12.archiveURL.length;
  247.                   int var14 = var13 + var2.length;
  248.                   URL[] var15 = new URL[var14];
  249.                   String[] var16 = new String[var14];
  250.                   boolean[] var17 = new boolean[var14];
  251.                   int[] var18 = new int[var14];
  252.                   int[] var19 = new int[var14];
  253.  
  254.                   for(int var20 = var2.length - 1; var20 >= 0; --var20) {
  255.                      var15[var13 + var20] = var2[var20];
  256.                      var16[var13 + var20] = null;
  257.                      var17[var13 + var20] = false;
  258.                      var18[var13 + var20] = 0;
  259.                      var19[var13 + var20] = 0;
  260.  
  261.                      for(int var21 = var13 - 1; var21 >= 0; --var21) {
  262.                         if (var6.archiveURL[var21] != null && var2[var20].getFile().equals(var6.archiveURL[var21].getFile())) {
  263.                            var15[var13 + var20] = null;
  264.                            --var14;
  265.                            break;
  266.                         }
  267.                      }
  268.                   }
  269.  
  270.                   for(int var34 = var13 - 1; var34 >= 0; --var34) {
  271.                      var15[var34] = var6.archiveURL[var34];
  272.                      var16[var34] = var6.archiveFile[var34];
  273.                      var17[var34] = var6.capturedArchive[var34];
  274.                      var18[var34] = var6.nativeArchive[var34];
  275.                      var19[var34] = var6.nativeZig[var34];
  276.                   }
  277.  
  278.                   URL[] var22 = new URL[var14];
  279.                   String[] var23 = new String[var14];
  280.                   boolean[] var24 = new boolean[var14];
  281.                   int[] var25 = new int[var14];
  282.                   int[] var26 = new int[var14];
  283.                   int var27 = var14 - 1;
  284.  
  285.                   for(int var28 = var15.length - 1; var28 >= 0; --var28) {
  286.                      if (var15[var28] != null) {
  287.                         var22[var27] = var15[var28];
  288.                         var23[var27] = var16[var28];
  289.                         var24[var27] = var17[var28];
  290.                         var25[var27] = var18[var28];
  291.                         var26[var27] = var19[var28];
  292.                         --var27;
  293.                      }
  294.                   }
  295.  
  296.                   var6.archiveFile = var23;
  297.                   var6.capturedArchive = var24;
  298.                   var6.nativeArchive = var25;
  299.                   var6.nativeZig = var26;
  300.  
  301.                   for(int var29 = var13; var29 < var22.length; ++var29) {
  302.                      var6.openArchive(var29, var22[var29]);
  303.                   }
  304.  
  305.                   var6.archiveURL = var22;
  306.                   if (MozillaAppletContext.debug >= 8) {
  307.                      System.err.println("#   reusing class loader " + var6 + "\n" + "#\tcontext = " + var0 + "\n" + "#\tcodebase = " + var7);
  308.  
  309.                      for(int var30 = 0; var30 < var6.archiveURL.length; ++var30) {
  310.                         System.err.println("#\tarchive = " + var6.archiveURL[var30]);
  311.                      }
  312.  
  313.                      System.err.println("#\tscriptOrigin = " + var3);
  314.                   }
  315.                   break;
  316.                }
  317.  
  318.                if (MozillaAppletContext.debug >= 8) {
  319.                   System.err.println("#   preventing reuse of " + var12);
  320.                }
  321.  
  322.                var12.isReusable = false;
  323.             }
  324.          }
  325.       }
  326.  
  327.       SecurityManager.revertPrivilege();
  328.       if (var6 == null) {
  329.          var6 = new AppletClassLoader(var0, var1, var2);
  330.          var6.scriptOrigin = var3;
  331.          classloaders.addElement(new WeakLink(var6));
  332.       }
  333.  
  334.       if (var5) {
  335.          for(int var32 = classloaders.size() - 1; var32 >= 0; --var32) {
  336.             WeakLink var33 = (WeakLink)classloaders.elementAt(var32);
  337.             if (var33.get() == null) {
  338.                classloaders.removeElementAt(var32);
  339.             }
  340.  
  341.             if (MozillaAppletContext.debug >= 8) {
  342.                System.err.println("#   classloader was removed");
  343.             }
  344.          }
  345.       }
  346.  
  347.       return var6;
  348.    }
  349.  
  350.    AppletClassLoader(MozillaAppletContext var1, URL var2, URL[] var3) {
  351.       this.nameToArchive = new Hashtable();
  352.       System.getSecurityManager().checkCreateClassLoader();
  353.       this.scriptOrigin = null;
  354.       this.isReusable = true;
  355.       this.codeBasePrincipal = new Principal(var2);
  356.       String var4 = var2.getFile();
  357.       int var5 = var4.lastIndexOf(47);
  358.       if (var5 > 0 && var5 < var4.length() - 1) {
  359.          try {
  360.             var2 = new URL(var2, var4.substring(0, var5 + 1));
  361.          } catch (MalformedURLException var8) {
  362.          }
  363.       }
  364.  
  365.       this.codeBaseURL = var2;
  366.       if (var3 == null) {
  367.          var3 = new URL[0];
  368.       }
  369.  
  370.       this.archiveURL = var3;
  371.       this.context = var1;
  372.       int var6 = var3.length;
  373.       this.archiveFile = new String[var6];
  374.       this.capturedArchive = new boolean[var6];
  375.       this.nativeArchive = new int[var6];
  376.       this.nativeZig = new int[var6];
  377.  
  378.       for(int var9 = var6 - 1; var9 >= 0; --var9) {
  379.          this.archiveFile[var9] = null;
  380.          this.capturedArchive[var9] = false;
  381.          this.nativeArchive[var9] = 0;
  382.          this.nativeZig[var9] = 0;
  383.       }
  384.  
  385.       if (MozillaAppletContext.debug > 5) {
  386.          System.err.println("#   new class loader " + this + "\n" + "#\tcontext = " + var1 + "\n" + "#\tcodebase = " + var2);
  387.  
  388.          for(int var7 = 0; var7 < var6; ++var7) {
  389.             System.err.println("#\tarchive = " + var3[var7]);
  390.          }
  391.       }
  392.  
  393.       for(int var10 = var6 - 1; var10 >= 0; --var10) {
  394.          if (this.archiveURL[var10] != null) {
  395.             this.openArchive(var10);
  396.          }
  397.       }
  398.  
  399.    }
  400.  
  401.    void close() {
  402.       if (this.archiveURL != null) {
  403.          this.closeArchive();
  404.       }
  405.  
  406.       if (this.channelInfo != null) {
  407.          this.channelInfo.closeZips();
  408.       }
  409.  
  410.    }
  411.  
  412.    protected void finalize() {
  413.       this.close();
  414.       if (MozillaAppletContext.debug >= 8) {
  415.          System.err.println("# finalized: " + this);
  416.       }
  417.  
  418.    }
  419.  
  420.    protected AppletClassLoader(URL var1) {
  421.       this((MozillaAppletContext)null, var1, (URL[])null);
  422.       System.getSecurityManager().checkCreateClassLoader();
  423.    }
  424.  
  425.    String getScriptOrigin() {
  426.       return this.scriptOrigin;
  427.    }
  428.  
  429.    public URL getCodeBase() {
  430.       return this.codeBaseURL;
  431.    }
  432.  
  433.    private Class loadClass(String var1, URL var2, String var3) throws IOException {
  434.       SecurityManager.enablePrivilege("UniversalConnect");
  435.       byte[] var4 = var2.getData();
  436.       SecurityManager.revertPrivilege();
  437.       if (capturingClasses) {
  438.          this.captureClassFile(var1, var4);
  439.       }
  440.  
  441.       return ((ClassLoader)this).defineClass(var1, var4, 0, var4.length, 0, var3);
  442.    }
  443.  
  444.    public Class loadClass(String var1) throws ClassNotFoundException {
  445.       return this.loadClass(var1, true);
  446.    }
  447.  
  448.    protected final Class loadClass(String var1, boolean var2) throws ClassNotFoundException {
  449.       Class var3;
  450.       if (wantTiming) {
  451.          long var4 = System.currentTimeMillis();
  452.          var3 = this.loadClass1(var1, var2);
  453.          long var6 = System.currentTimeMillis();
  454.          long var8 = var6 - var4;
  455.          this.loaderTime += var8;
  456.          System.err.println("# Class load time: " + var1 + ": " + var8 + " (total = " + this.loaderTime + ")");
  457.       } else {
  458.          var3 = this.loadClass1(var1, var2);
  459.       }
  460.  
  461.       return var3;
  462.    }
  463.  
  464.    private Class loadClass1(String var1, boolean var2) throws ClassNotFoundException {
  465.       Class var3 = ((ClassLoader)this).findLoadedClass(var1);
  466.       if (var3 == null) {
  467.          SecurityManager var4 = System.getSecurityManager();
  468.          if (var4 != null) {
  469.             int var5 = var1.lastIndexOf(46);
  470.             if (var5 >= 0) {
  471.                var4.checkPackageAccess(var1.substring(0, var5));
  472.             }
  473.          }
  474.  
  475.          try {
  476.             return ((ClassLoader)this).findSystemClass(var1);
  477.          } catch (NoClassDefFoundError var8) {
  478.             if (this.channelInfo == null) {
  479.                throw var8;
  480.             }
  481.          } catch (ClassNotFoundException var9) {
  482.          }
  483.  
  484.          var3 = this.findClass(var1);
  485.       }
  486.  
  487.       if (var3 == null) {
  488.          throw new ClassNotFoundException(var1);
  489.       } else {
  490.          Integer var10 = (Integer)this.nameToArchive.get(var1);
  491.          if (var10 != null) {
  492.             int var11 = var10;
  493.             if (var11 != -1 && this.nativeArchive[var11] != 0) {
  494.                System.getSecurityManager().checkURLConnect(this.codeBaseURL, this.archiveURL[var11]);
  495.             }
  496.          }
  497.  
  498.          if (var2) {
  499.             try {
  500.                ((ClassLoader)this).resolveClass(var3);
  501.             } catch (NoClassDefFoundError var6) {
  502.                if (this.channelInfo == null) {
  503.                   throw var6;
  504.                }
  505.  
  506.                throw new ClassNotFoundException(var1);
  507.             } catch (UnknownError var7) {
  508.                if (this.channelInfo == null) {
  509.                   throw var7;
  510.                }
  511.  
  512.                throw new ClassNotFoundException(var1);
  513.             }
  514.          }
  515.  
  516.          return var3;
  517.       }
  518.    }
  519.  
  520.    private synchronized Class findClass(String var1) throws ClassNotFoundException {
  521.       boolean var3 = true;
  522.       Class var4 = ((ClassLoader)this).findLoadedClass(var1);
  523.       if (var4 != null) {
  524.          return var4;
  525.       } else {
  526.          if (MozillaAppletContext.debug >= 2) {
  527.             System.err.println("# Loading class " + var1);
  528.          }
  529.  
  530.          SecurityManager var5 = System.getSecurityManager();
  531.          if (var5 != null) {
  532.             int var6 = var1.lastIndexOf(46);
  533.             if (var6 >= 0) {
  534.                var5.checkPackageDefinition(var1.substring(0, var6));
  535.             }
  536.          }
  537.  
  538.          String var15 = var1.replace('.', '/') + ".class";
  539.  
  540.          int var2;
  541.          for(var2 = this.archiveURL.length - 1; var2 >= 0; --var2) {
  542.             if (this.nativeArchive[var2] != 0) {
  543.                try {
  544.                   byte[] var7 = this.loadFromArchive(var15, var2);
  545.                   if (var7 != null) {
  546.                      var4 = ((ClassLoader)this).defineClass(var1, var7, 0, var7.length, this.nativeZig[var2], var15);
  547.                      if (var4 != null && this.context != null && MozillaAppletContext.debug >= 2) {
  548.                         System.err.println("# Loaded " + var15 + " from " + this.archiveURL[var2]);
  549.                      }
  550.  
  551.                      var3 = false;
  552.                      if (var4 != null) {
  553.                         this.nameToArchive.put(var1, new Integer(var2));
  554.                         break;
  555.                      }
  556.                   }
  557.                } catch (IOException var13) {
  558.                   if (MozillaAppletContext.debug >= 2) {
  559.                      System.err.println("# Failed to load " + var15 + " from " + this.archiveURL[var2]);
  560.                   }
  561.                }
  562.             }
  563.          }
  564.  
  565.          if (var4 == null) {
  566.             var2 = -1;
  567.  
  568.             URL var16;
  569.             try {
  570.                var16 = new URL(this.codeBaseURL, var15);
  571.             } catch (MalformedURLException var10) {
  572.                throw new ClassNotFoundException(var1);
  573.             }
  574.  
  575.             if (this.context != null && MozillaAppletContext.debug >= 5) {
  576.                System.err.println("# Fetching " + var16);
  577.             }
  578.  
  579.             try {
  580.                var4 = this.loadClass(var1, var16, var15);
  581.                var3 = false;
  582.             } catch (IOException var11) {
  583.                if (this.channelInfo != null) {
  584.                   try {
  585.                      var4 = this.marimbaLoad(var1);
  586.                      var3 = false;
  587.                   } catch (IOException var9) {
  588.                   }
  589.                }
  590.  
  591.                if (var4 == null) {
  592.                   throw new ClassNotFoundException(var1);
  593.                }
  594.             } catch (SecurityException var12) {
  595.                if (this.context != null && MozillaAppletContext.debug >= 5) {
  596.                   System.err.println("# Exception while loading " + var15 + " from downloaded archive " + var16.toString() + "\n#   Exception: " + ((Throwable)var12).toString());
  597.                }
  598.  
  599.                throw var12;
  600.             }
  601.          }
  602.  
  603.          if (!var1.equals(var4.getName())) {
  604.             Object var14 = null;
  605.             throw new ClassFormatError(var1 + " != " + var4.getName());
  606.          } else {
  607.             if (!var3) {
  608.                this.setPrincipalAry(var4, var15, var2);
  609.             }
  610.  
  611.             return var4;
  612.          }
  613.       }
  614.    }
  615.  
  616.    static boolean getCaptureClassFiles() {
  617.       return capturingClasses;
  618.    }
  619.  
  620.    static void setCaptureClassFiles(boolean var0) {
  621.       capturingClasses = var0;
  622.    }
  623.  
  624.    String getCaptureDir() throws IOException {
  625.       String var1 = this.codeBaseURL.toString();
  626.       if (var1.startsWith("http://")) {
  627.          var1 = var1.substring(7);
  628.       }
  629.  
  630.       if (var1.endsWith("/")) {
  631.          var1 = var1.substring(0, var1.length() - 1);
  632.       }
  633.  
  634.       var1 = var1.replace('/', '_').replace(':', '_');
  635.       SecurityManager.enablePrivilege("UniversalFileRead");
  636.       SecurityManager.enablePrivilege("UniversalFileWrite");
  637.       File var2 = new File(var1);
  638.       if ((!var2.exists() || !var2.isDirectory()) && !var2.mkdir()) {
  639.          throw new IOException(var2 + " is not a directory");
  640.       } else {
  641.          return var1;
  642.       }
  643.    }
  644.  
  645.    void captureClassFile(String var1, byte[] var2) {
  646.       try {
  647.          String var3 = this.getCaptureDir();
  648.          SecurityManager.enablePrivilege("UniversalFileRead");
  649.          SecurityManager.enablePrivilege("UniversalFileWrite");
  650.  
  651.          File var6;
  652.          do {
  653.             int var4 = var1.indexOf(46);
  654.             if (var4 == -1) {
  655.                File var9 = new File(var3 + "/" + var1 + ".class");
  656.                FileOutputStream var10 = new FileOutputStream(var9);
  657.                var10.write(var2, 0, var2.length);
  658.                System.err.println("#\tCaptured class " + var9);
  659.                var10.close();
  660.                return;
  661.             }
  662.  
  663.             String var5 = var1.substring(0, var4);
  664.             var1 = var1.substring(var4 + 1);
  665.             var3 = var3 + "/" + var5;
  666.             var6 = new File(var3);
  667.          } while(var6.exists() && var6.isDirectory() || var6.mkdir());
  668.  
  669.          throw new IOException("Can't create " + var6);
  670.       } catch (SecurityException var7) {
  671.          System.err.println("#\tCan't capture class: " + var7);
  672.       } catch (IOException var8) {
  673.          System.err.println("#\tCan't capture class: " + var8);
  674.       }
  675.    }
  676.  
  677.    byte[] getResource(URL var1) {
  678.       byte[] var2 = null;
  679.       String var3 = var1.getFile();
  680.       String var4 = this.codeBaseURL.getFile();
  681.       if (!var3.startsWith(var4)) {
  682.          return null;
  683.       } else {
  684.          String var5 = var3.substring(var4.length());
  685.  
  686.          for(int var6 = this.archiveURL.length - 1; var6 >= 0; --var6) {
  687.             try {
  688.                var2 = this.loadFromArchive(var5, var6);
  689.                if (var2 != null && this.context != null && MozillaAppletContext.debug >= 5) {
  690.                   System.err.println("# Loaded " + var5 + " from " + this.archiveURL[var6]);
  691.                }
  692.  
  693.                if (var2 != null) {
  694.                   break;
  695.                }
  696.  
  697.                if (var2 == null && this.context != null && MozillaAppletContext.debug >= 5) {
  698.                   System.err.println("# " + var5 + " in " + this.archiveURL[var6] + " not found.");
  699.                }
  700.             } catch (IOException var7) {
  701.                if (MozillaAppletContext.debug >= 5) {
  702.                   System.err.println("# Failed to load " + var5 + " from " + this.archiveURL[var6]);
  703.                }
  704.             }
  705.          }
  706.  
  707.          return var2;
  708.       }
  709.    }
  710.  
  711.    public InputStream getResourceAsStream(String var1) {
  712.       System.getSecurityManager().checkResourceAccess(var1);
  713.       Object var2 = null;
  714.  
  715.       try {
  716.          URL var5 = new URL(this.codeBaseURL, var1);
  717.          byte[] var3 = this.getResource(var5);
  718.          return var3 == null ? null : new ByteArrayInputStream(var3);
  719.       } catch (MalformedURLException var4) {
  720.          return null;
  721.       }
  722.    }
  723.  
  724.    private boolean setPrincipalAry(Class var1, String var2) {
  725.       return this.setPrincipalAry(var1, var2, 0);
  726.    }
  727.  
  728.    private boolean setPrincipalAry(Class var1, String var2, int var3) {
  729.       Object var4 = null;
  730.       int var5 = 1;
  731.       Object[] var6 = null;
  732.       if (var3 >= 0 && var3 < this.archiveURL.length) {
  733.          var6 = getCertificates(this.nativeZig[var3], var1, var2);
  734.          if (var6 != null) {
  735.             var5 += var6.length;
  736.          }
  737.       }
  738.  
  739.       Principal[] var13 = new Principal[var5];
  740.  
  741.       for(int var7 = var5 - 1; var7-- > 0; var13[var7] = new Principal(14, (byte[])var6[var7], var1)) {
  742.       }
  743.  
  744.       var13[var5 - 1] = this.codeBasePrincipal;
  745.  
  746.       try {
  747.          if (this.matchPrincipalAry != null) {
  748.             PrivilegeManager var10 = AppletSecurity.getPrivilegeManager();
  749.             if (var10 != null && var10.comparePrincipalArray(var13, this.matchPrincipalAry) == 1) {
  750.                var13 = new Principal[]{this.codeBasePrincipal};
  751.                throw new AppletSecurityException("mismatch of principals");
  752.             }
  753.          }
  754.       } finally {
  755.          this.setPrincipals(var1, var13);
  756.       }
  757.  
  758.       return true;
  759.    }
  760.  
  761.    public boolean checkMatchPrincipalAlways(int var1) {
  762.       PrivilegeManager var5 = AppletSecurity.getPrivilegeManager();
  763.       if (var5 == null) {
  764.          return true;
  765.       } else {
  766.          this.matchPrincipalAry = var5.getClassPrincipalsFromStack(var1 + 1);
  767.          Enumeration var2 = ((ClassLoader)this).getClassNames();
  768.  
  769.          while(var2.hasMoreElements()) {
  770.             String var4 = (String)var2.nextElement();
  771.             Class var3 = ((ClassLoader)this).findLoadedClass(var4);
  772.             if (var3 != null && !var5.checkMatchPrincipal(var3, var1 + 1)) {
  773.                return false;
  774.             }
  775.          }
  776.  
  777.          return true;
  778.       }
  779.    }
  780.  
  781.    private native int setupZignature();
  782.  
  783.    private native int destroyZignature(int var1);
  784.  
  785.    private native boolean loadManifest(int var1, int var2, String var3);
  786.  
  787.    private native int loadSignatures(int var1, int var2, String var3);
  788.  
  789.    private native boolean verifySignature(int var1, Class var2, String var3);
  790.  
  791.    private static native Object[] getCertificates(int var0, Class var1, String var2);
  792.  
  793.    private native void setPrincipals(Class var1, Principal[] var2);
  794.  
  795.    public AppletClassLoader(URL var1, CastanetChannelInfo var2) {
  796.       this((MozillaAppletContext)null, var1, (URL[])null);
  797.       System.getSecurityManager().checkCreateClassLoader();
  798.       this.channelInfo = var2;
  799.    }
  800.  
  801.    public Class classFromBytes(byte[] var1, String var2) {
  802.       if (this.channelInfo == null) {
  803.          return null;
  804.       } else {
  805.          Class var3 = ((ClassLoader)this).findLoadedClass(var2);
  806.          if (var3 != null) {
  807.             return var3;
  808.          } else {
  809.             try {
  810.                var3 = ((ClassLoader)this).findSystemClass(var2);
  811.                if (var3 != null) {
  812.                   return var3;
  813.                }
  814.             } catch (NoClassDefFoundError var8) {
  815.             } catch (ClassNotFoundException var9) {
  816.             }
  817.  
  818.             SecurityManager var4 = System.getSecurityManager();
  819.             if (var4 != null) {
  820.                int var5 = var2.lastIndexOf(46);
  821.                if (var5 >= 0) {
  822.                   var4.checkPackageDefinition(var2.substring(0, var5));
  823.                }
  824.             }
  825.  
  826.             PrivilegeManager var12 = PrivilegeManager.getPrivilegeManager();
  827.             if (var12 != null) {
  828.                Target var6 = Target.findTarget("MarimbaInternalTarget");
  829.                if (var6 == null) {
  830.                   throw new AppletSecurityException("classFromBytes call denied");
  831.                }
  832.  
  833.                var12.checkPrivilegeEnabled(var6);
  834.             }
  835.  
  836.             try {
  837.                var3 = ((ClassLoader)this).defineClass(var2, var1, 0, var1.length);
  838.                return var3;
  839.             } catch (NoClassDefFoundError var7) {
  840.                return null;
  841.             }
  842.          }
  843.       }
  844.    }
  845.  
  846.    private Class marimbaLoad(String var1) throws IOException, ClassNotFoundException {
  847.       if (this.channelInfo == null) {
  848.          return null;
  849.       } else {
  850.          Class var2 = null;
  851.          int var3 = this.channelInfo.getPathlen();
  852.          if (var3 != 0) {
  853.             String var4 = var1.replace('.', '/') + ".class";
  854.  
  855.             for(int var5 = 0; var5 < var3; ++var5) {
  856.                URL var6 = this.channelInfo.getURL(var5);
  857.                if (var6 != null) {
  858.                   try {
  859.                      var2 = this.loadClass(var1, new URL(var6, var4), var4);
  860.                      if (var2 != null) {
  861.                         return var2;
  862.                      }
  863.                   } catch (NoClassDefFoundError var14) {
  864.                   } catch (MalformedURLException var15) {
  865.                   } catch (FileNotFoundException var16) {
  866.                   }
  867.                }
  868.  
  869.                ZipFile var7 = this.channelInfo.getZip(var5);
  870.                if (var7 != null) {
  871.                   ZipEntry var8 = var7.getEntry(var4);
  872.                   if (var8 != null) {
  873.                      int var9 = (int)var8.getSize();
  874.                      byte[] var10 = new byte[var9];
  875.                      InputStream var11 = var7.getInputStream(var8);
  876.  
  877.                      for(int var12 = 0; var12 < var9; var12 += var11.read(var10, var12, var9 - var12)) {
  878.                      }
  879.  
  880.                      var11.close();
  881.  
  882.                      try {
  883.                         var2 = ((ClassLoader)this).defineClass(var1, var10, 0, var10.length);
  884.                      } catch (NoClassDefFoundError var13) {
  885.                      }
  886.  
  887.                      if (var2 != null) {
  888.                         return var2;
  889.                      }
  890.                   }
  891.                }
  892.             }
  893.          }
  894.  
  895.          return null;
  896.       }
  897.    }
  898.  
  899.    public boolean marimbaCheckRead(String var1, boolean var2) {
  900.       return this.channelInfo != null ? this.channelInfo.checkRead(var1, var2) : false;
  901.    }
  902.  
  903.    public boolean marimbaCheckWrite(String var1, boolean var2) {
  904.       return this.channelInfo != null ? this.channelInfo.checkWrite(var1, var2) : false;
  905.    }
  906.  
  907.    public String marimbaGetHost() {
  908.       return this.channelInfo != null ? this.channelInfo.getHost() : null;
  909.    }
  910.  
  911.    boolean marimbaCheckThreadGroup(ThreadGroup var1) {
  912.       return this.channelInfo == null ? false : this.channelInfo.checkThreadGroup(var1);
  913.    }
  914.  
  915.    void marimbaCheckTopLevelWindow(Object var1) {
  916.       if (this.channelInfo != null) {
  917.          this.channelInfo.checkTopLevelWindow(var1);
  918.       }
  919.    }
  920.  
  921.    Hashtable getCodebaseEnv() {
  922.       if (this.codebaseEnv == null) {
  923.          this.initCodebaseEnv();
  924.       }
  925.  
  926.       return this.codebaseEnv;
  927.    }
  928.  
  929.    synchronized void initCodebaseEnv() {
  930.       if (this.codebaseEnv == null) {
  931.          this.codebaseEnv = new Hashtable();
  932.       }
  933.  
  934.    }
  935. }
  936.