home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / NotesProgramFilesJavaSupport / rt.jar / sun / applet / AppletResourceLoader.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-04-23  |  8.5 KB  |  323 lines

  1. package sun.applet;
  2.  
  3. import java.applet.AudioClip;
  4. import java.awt.Image;
  5. import java.awt.Toolkit;
  6. import java.io.BufferedInputStream;
  7. import java.io.ByteArrayInputStream;
  8. import java.io.ByteArrayOutputStream;
  9. import java.io.IOException;
  10. import java.io.InputStream;
  11. import java.net.MalformedURLException;
  12. import java.net.URL;
  13. import java.net.URLConnection;
  14. import java.util.Hashtable;
  15. import java.util.zip.ZipInputStream;
  16. import sun.misc.Ref;
  17. import sun.net.www.protocol.http.HttpURLConnection;
  18. import sun.tools.jar.JarImageSource;
  19. import sun.tools.jar.JarVerifierStream;
  20.  
  21. public class AppletResourceLoader {
  22.    static boolean debug;
  23.    static boolean verboseResourceLoading;
  24.    private static Hashtable imgHash = new Hashtable();
  25.    private static Hashtable audioHash = new Hashtable();
  26.    private static Hashtable resourceHash = new Hashtable();
  27.    private static Hashtable mimeHash = new Hashtable();
  28.    AppletClassLoader loader;
  29.  
  30.    private void verbose(String var1) {
  31.       if (verboseResourceLoading) {
  32.          System.out.println(var1);
  33.       }
  34.  
  35.    }
  36.  
  37.    static void debug(String var0) {
  38.       if (debug) {
  39.          System.out.println(var0);
  40.       }
  41.  
  42.    }
  43.  
  44.    static void debug(String var0, Throwable var1) {
  45.       if (debug) {
  46.          var1.printStackTrace();
  47.       }
  48.  
  49.       System.out.println("sun.applet.AppletResourceLoader:::" + var0);
  50.    }
  51.  
  52.    public AppletResourceLoader(AppletClassLoader var1) {
  53.       this.loader = var1;
  54.    }
  55.  
  56.    void loadJar(URL var1, String var2) throws IOException {
  57.       URL var3 = AppletClassLoader.makeRelativeURLWithSecurity(var1, var2);
  58.       URLConnection var4 = var3.openConnection();
  59.       InputStream var5 = HttpURLConnection.openConnectionCheckRedirects(var4);
  60.       this.loadJar(var1, var5);
  61.    }
  62.  
  63.    public void loadJar(URL var1, InputStream var2) throws IOException {
  64.       JarVerifierStream var3 = null;
  65.       Hashtable var4 = new Hashtable();
  66.       byte[] var5 = new byte[8192];
  67.       ByteArrayOutputStream var6 = new ByteArrayOutputStream(2048);
  68.  
  69.       try {
  70.          var3 = new JarVerifierStream(var2);
  71.          Object var9 = null;
  72.  
  73.          while((var21 = var3.getNextEntry()) != null) {
  74.             String var10 = var21.getName();
  75.             String var11 = null;
  76.             Object var12 = null;
  77.             var6.reset();
  78.  
  79.             int var13;
  80.             while((var13 = var3.read(var5, 0, var5.length)) != -1) {
  81.                var6.write(var5, 0, var13);
  82.             }
  83.  
  84.             byte[] var14 = var6.toByteArray();
  85.             if (var11 == null) {
  86.                var11 = this.guessManifestType(var10);
  87.             }
  88.  
  89.             if (var11 == null) {
  90.                ByteArrayInputStream var15 = new ByteArrayInputStream(var14);
  91.                var11 = URLConnection.guessContentTypeFromStream(var15);
  92.             }
  93.  
  94.             if (var11 == null) {
  95.                var11 = "input-stream/input-stream";
  96.             }
  97.  
  98.             debug("loading " + var10 + " (most likely guessed mime-type: " + var11 + ")");
  99.             if (var11.startsWith("image")) {
  100.                this.putLocalResource(new URL(var1, var10), var14, var11);
  101.             } else if (var11.startsWith("audio")) {
  102.                this.putLocalResource(new URL(var1, var10), var14, var11);
  103.                AppletAudioClip var23 = new AppletAudioClip(var14);
  104.                audioHash.put(new URL(var1, var10), var23);
  105.                var12 = var23;
  106.             } else if (!var11.startsWith("application/java-vm") && !var11.startsWith("application/x-java-vm")) {
  107.                if (!var11.equals("manifest/manifest") && !var11.equals("manifest/signature-bin")) {
  108.                   this.putLocalResource(new URL(var1, var10), var14, var11);
  109.                }
  110.             } else {
  111.                this.markLocalClass(new URL(var1, var10));
  112.                String var24 = var10.substring(0, var10.length() - 6).replace('/', '.');
  113.                AppletClassEntry var16 = this.loader.defineClassFromBytes(var24, var14, 0, var14.length);
  114.                var12 = var16;
  115.                var16.ids = var3.getIdentities(var10);
  116.             }
  117.  
  118.             if (var12 != null) {
  119.                var4.put(var10, var12);
  120.                var12 = null;
  121.             }
  122.          }
  123.       } catch (IOException var19) {
  124.          debug("IOException loading archive: " + var19);
  125.          ((Throwable)var19).printStackTrace();
  126.       } finally {
  127.          debug("Closing jar input stream");
  128.          if (var3 != null) {
  129.             ((ZipInputStream)var3).close();
  130.          }
  131.  
  132.       }
  133.  
  134.    }
  135.  
  136.    String guessManifestType(String var1) {
  137.       var1 = var1.toUpperCase();
  138.       if (var1.startsWith("/")) {
  139.          var1 = var1.substring(1);
  140.       }
  141.  
  142.       if (!var1.startsWith("META-INF/")) {
  143.          return null;
  144.       } else if (var1.equalsIgnoreCase("META-INF/MANIFEST.MF")) {
  145.          return "manifest/manifest";
  146.       } else if (!var1.endsWith("DSA") && !var1.endsWith("PK7") && !var1.endsWith("PGP")) {
  147.          return var1.endsWith("SF") ? "manifest/signature-asc" : null;
  148.       } else {
  149.          return "manifest/signature-bin";
  150.       }
  151.    }
  152.  
  153.    public static synchronized AudioClip getAudioClip(URL var0) {
  154.       System.getSecurityManager().checkConnect(var0.getHost(), var0.getPort());
  155.       Object var1 = (AudioClip)audioHash.get(var0);
  156.       if (var1 == null) {
  157.          audioHash.put(var0, var1 = new AppletAudioClip(var0));
  158.       }
  159.  
  160.       return (AudioClip)var1;
  161.    }
  162.  
  163.    public static void flushAudioClips() {
  164.       audioHash = new Hashtable();
  165.    }
  166.  
  167.    Image createImage(byte[] var1, URL var2, String var3, String var4) throws MalformedURLException {
  168.       debug("creating image: " + var3);
  169.       BufferedInputStream var5 = new BufferedInputStream(new ByteArrayInputStream(var1));
  170.       JarImageSource var6 = new JarImageSource(var2, var5, var4);
  171.       Image var7 = Toolkit.getDefaultToolkit().createImage(var6);
  172.       URL var8 = new URL(var2, var3);
  173.       AppletImageRef var9 = new AppletImageRef(var8);
  174.       ((Ref)var9).setThing(var7);
  175.       imgHash.put(var8, var9);
  176.       return var7;
  177.    }
  178.  
  179.    public static synchronized Image getImage(URL var0) {
  180.       return (Image)getImageRef(var0).get();
  181.    }
  182.  
  183.    public static synchronized Ref getImageRef(URL var0) {
  184.       System.getSecurityManager().checkConnect(var0.getHost(), var0.getPort());
  185.       AppletImageRef var1 = (AppletImageRef)imgHash.get(var0);
  186.       if (var1 == null) {
  187.          var1 = new AppletImageRef(var0);
  188.          imgHash.put(var0, var1);
  189.       }
  190.  
  191.       return var1;
  192.    }
  193.  
  194.    public static void flushImages() {
  195.       imgHash = new Hashtable();
  196.    }
  197.  
  198.    private void markLocalClass(URL var1) {
  199.       resourceHash.put(var1, "A CLASS FILE");
  200.       mimeHash.put(var1, "application/java-vm");
  201.    }
  202.  
  203.    private void putLocalResource(URL var1, byte[] var2, String var3) {
  204.       resourceHash.put(var1, var2);
  205.       mimeHash.put(var1, var3);
  206.    }
  207.  
  208.    public static synchronized Object getLocalResource(URL var0) {
  209.       System.getSecurityManager().checkConnect(var0.getHost(), var0.getPort());
  210.       Object var1 = mimeHash.get(var0);
  211.       if (var1 == null) {
  212.          return null;
  213.       } else {
  214.          String var2 = (String)var1;
  215.          if (var2.startsWith("audio") && (var1 = audioHash.get(var0)) != null) {
  216.             return var1;
  217.          } else {
  218.             var1 = resourceHash.get(var0);
  219.             if (var1 instanceof String) {
  220.                throw new AppletSecurityException("getresource.noclassaccess", var0.toString());
  221.             } else {
  222.                byte[] var3 = (byte[])var1;
  223.                BufferedInputStream var4 = new BufferedInputStream(new ByteArrayInputStream(var3));
  224.                if (var2.startsWith("image")) {
  225.                   JarImageSource var5 = new JarImageSource(var0, var4, var2);
  226.                   return var5;
  227.                } else {
  228.                   return var4;
  229.                }
  230.             }
  231.          }
  232.       }
  233.    }
  234.  
  235.    public static InputStream getLocalResourceStream(URL var0) {
  236.       System.getSecurityManager().checkConnect(var0.getHost(), var0.getPort());
  237.       Object var1 = null;
  238.       if ((var1 = resourceHash.get(var0)) != null) {
  239.          if (var1 instanceof String) {
  240.             throw new AppletSecurityException("getresource.noclassaccess", var0.toString());
  241.          } else {
  242.             byte[] var2 = (byte[])var1;
  243.             BufferedInputStream var4 = new BufferedInputStream(new ByteArrayInputStream(var2));
  244.             return (InputStream)var4;
  245.          }
  246.       } else {
  247.          return null;
  248.       }
  249.    }
  250.  
  251.    public String getResourceAsName(String var1) {
  252.       this.verbose("AppletResourceLoader.getResourceAsName for name: " + var1);
  253.       URL var2 = this.loader.getCodeBase();
  254.  
  255.       URL var3;
  256.       try {
  257.          var3 = new URL(var2, var1);
  258.       } catch (Exception var7) {
  259.          return null;
  260.       }
  261.  
  262.       Object var4 = resourceHash.get(var3);
  263.       if (var4 != null) {
  264.          this.verbose("Found resource: " + var1 + " in some jar archive for base: " + var2);
  265.  
  266.          try {
  267.             var3 = new URL("appletresource", var2.getHost(), var2.getPort(), "/" + var2.toExternalForm() + "/+/" + var1);
  268.             return var3.toExternalForm();
  269.          } catch (Exception var6) {
  270.             this.verbose("Exception " + var6 + " while building a resource URL");
  271.             return null;
  272.          }
  273.       } else {
  274.          return var3.toExternalForm();
  275.       }
  276.    }
  277.  
  278.    public InputStream getResourceAsStream(String var1) {
  279.       this.verbose("AppletResourceLoader.getResourceAsStream for name: " + var1);
  280.       URL var2 = this.loader.getCodeBase();
  281.  
  282.       URL var3;
  283.       try {
  284.          var3 = new URL(var2, var1);
  285.       } catch (Exception var9) {
  286.          return null;
  287.       }
  288.  
  289.       InputStream var4 = getLocalResourceStream(var3);
  290.       if (var4 != null) {
  291.          this.verbose("Found resource: " + var1 + " in jar archive file");
  292.          return var4;
  293.       } else {
  294.          this.verbose("Opening stream to: " + var3 + " to get resource " + var1);
  295.  
  296.          try {
  297.             URLConnection var5 = var3.openConnection();
  298.             if (var5 instanceof java.net.HttpURLConnection) {
  299.                java.net.HttpURLConnection var6 = (java.net.HttpURLConnection)var5;
  300.                int var7 = var6.getResponseCode();
  301.                if (var7 == 200) {
  302.                   var4 = var3.openStream();
  303.                }
  304.  
  305.                if (var7 >= 400) {
  306.                   var4 = null;
  307.                }
  308.             } else {
  309.                var4 = var3.openStream();
  310.             }
  311.  
  312.             return var4;
  313.          } catch (Exception var8) {
  314.             return null;
  315.          }
  316.       }
  317.    }
  318.  
  319.    void resetLocalResources() {
  320.       resourceHash.clear();
  321.    }
  322. }
  323.