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 / tools / jar / Manifest.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  5.2 KB  |  212 lines

  1. package sun.tools.jar;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.ByteArrayInputStream;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.OutputStream;
  10. import java.io.PrintStream;
  11. import java.security.MessageDigest;
  12. import java.security.NoSuchAlgorithmException;
  13. import java.util.Enumeration;
  14. import java.util.Hashtable;
  15. import java.util.Vector;
  16. import sun.misc.BASE64Encoder;
  17. import sun.misc.CharacterEncoder;
  18. import sun.net.www.MessageHeader;
  19.  
  20. public class Manifest {
  21.    private Vector entries;
  22.    private byte[] tmpbuf;
  23.    private Hashtable tableEntries;
  24.    static final String[] hashes = new String[]{"SHA", "MD5"};
  25.    static final byte[] EOL = new byte[]{13, 10};
  26.    static final boolean debug = false;
  27.    static final String VERSION = "1.0";
  28.  
  29.    static final void debug(String var0) {
  30.    }
  31.  
  32.    public Manifest() {
  33.       this.entries = new Vector();
  34.       this.tmpbuf = new byte[512];
  35.       this.tableEntries = new Hashtable();
  36.    }
  37.  
  38.    public Manifest(byte[] var1) throws IOException {
  39.       this(new ByteArrayInputStream(var1), false);
  40.    }
  41.  
  42.    public Manifest(InputStream var1) throws IOException {
  43.       this(var1, true);
  44.    }
  45.  
  46.    public Manifest(InputStream var1, boolean var2) throws IOException {
  47.       this.entries = new Vector();
  48.       this.tmpbuf = new byte[512];
  49.       this.tableEntries = new Hashtable();
  50.       if (!((InputStream)var1).markSupported()) {
  51.          var1 = new BufferedInputStream((InputStream)var1);
  52.       }
  53.  
  54.       while(true) {
  55.          ((InputStream)var1).mark(1);
  56.          if (((InputStream)var1).read() == -1) {
  57.             return;
  58.          }
  59.  
  60.          ((InputStream)var1).reset();
  61.          MessageHeader var3 = new MessageHeader((InputStream)var1);
  62.          if (var2) {
  63.             this.doHashes(var3);
  64.          }
  65.  
  66.          this.addEntry(var3);
  67.       }
  68.    }
  69.  
  70.    public Manifest(String[] var1) throws IOException {
  71.       this.entries = new Vector();
  72.       this.tmpbuf = new byte[512];
  73.       this.tableEntries = new Hashtable();
  74.       MessageHeader var2 = new MessageHeader();
  75.       var2.add("Manifest-Version", "1.0");
  76.       this.addEntry(var2);
  77.       this.addFiles((File)null, var1);
  78.    }
  79.  
  80.    public void addEntry(MessageHeader var1) {
  81.       this.entries.addElement(var1);
  82.       String var2 = var1.findValue("Name");
  83.       debug("addEntry for name: " + var2);
  84.       if (var2 != null) {
  85.          this.tableEntries.put(var2, var1);
  86.       }
  87.  
  88.    }
  89.  
  90.    public MessageHeader getEntry(String var1) {
  91.       return (MessageHeader)this.tableEntries.get(var1);
  92.    }
  93.  
  94.    public MessageHeader entryAt(int var1) {
  95.       return (MessageHeader)this.entries.elementAt(var1);
  96.    }
  97.  
  98.    public Enumeration entries() {
  99.       return this.entries.elements();
  100.    }
  101.  
  102.    public void addFiles(File var1, String[] var2) throws IOException {
  103.       if (var2 != null) {
  104.          for(int var3 = 0; var3 < var2.length; ++var3) {
  105.             File var4;
  106.             if (var1 == null) {
  107.                var4 = new File(var2[var3]);
  108.             } else {
  109.                var4 = new File(var1, var2[var3]);
  110.             }
  111.  
  112.             if (var4.isDirectory()) {
  113.                this.addFiles(var4, var4.list());
  114.             } else {
  115.                this.addFile(var4);
  116.             }
  117.          }
  118.  
  119.       }
  120.    }
  121.  
  122.    private final String stdToLocal(String var1) {
  123.       return var1.replace('/', File.separatorChar);
  124.    }
  125.  
  126.    private final String localToStd(String var1) {
  127.       return var1.replace(File.separatorChar, '/');
  128.    }
  129.  
  130.    public void addFile(File var1) throws IOException {
  131.       String var2 = this.localToStd(var1.getPath());
  132.       if (this.tableEntries.get(var2) == null) {
  133.          MessageHeader var3 = new MessageHeader();
  134.          var3.add("Name", var2);
  135.          this.doHashes(var3);
  136.          this.addEntry(var3);
  137.       }
  138.  
  139.    }
  140.  
  141.    public void doHashes(MessageHeader var1) throws IOException {
  142.       String var2 = var1.findValue("Name");
  143.       if (var2 != null) {
  144.          BASE64Encoder var3 = new BASE64Encoder();
  145.          String var4 = new String();
  146.  
  147.          for(int var5 = 0; var5 < hashes.length; ++var5) {
  148.             var4 = var4 + hashes[var5] + " ";
  149.          }
  150.  
  151.          var1.set("Digest-Algorithms", var4);
  152.  
  153.          for(int var6 = 0; var6 < hashes.length; ++var6) {
  154.             FileInputStream var7 = new FileInputStream(this.stdToLocal(var2));
  155.  
  156.             try {
  157.                MessageDigest var10 = MessageDigest.getInstance(hashes[var6]);
  158.  
  159.                int var11;
  160.                while((var11 = ((InputStream)var7).read(this.tmpbuf, 0, this.tmpbuf.length)) != -1) {
  161.                   var10.update(this.tmpbuf, 0, var11);
  162.                }
  163.  
  164.                var1.set(hashes[var6] + "-Digest", ((CharacterEncoder)var3).encode(var10.digest()));
  165.             } catch (NoSuchAlgorithmException var14) {
  166.                throw new JarException("Digest algorithm " + hashes[var6] + " not available.");
  167.             } finally {
  168.                ((InputStream)var7).close();
  169.             }
  170.          }
  171.  
  172.       }
  173.    }
  174.  
  175.    public void stream(OutputStream var1) throws IOException {
  176.       PrintStream var2;
  177.       if (var1 instanceof PrintStream) {
  178.          var2 = (PrintStream)var1;
  179.       } else {
  180.          var2 = new PrintStream(var1);
  181.       }
  182.  
  183.       MessageHeader var3 = (MessageHeader)this.entries.elementAt(0);
  184.       if (var3.findValue("Manifest-Version") == null) {
  185.          if (var3.findValue("Name") == null) {
  186.             var3.prepend("Manifest-Version", "1.0");
  187.          } else {
  188.             var2.print("Manifest-Version: 1.0\r\n\r\n");
  189.          }
  190.  
  191.          var2.flush();
  192.       }
  193.  
  194.       var3.print(var2);
  195.  
  196.       for(int var4 = 1; var4 < this.entries.size(); ++var4) {
  197.          MessageHeader var5 = (MessageHeader)this.entries.elementAt(var4);
  198.          var5.print(var2);
  199.       }
  200.  
  201.    }
  202.  
  203.    public static boolean isManifestName(String var0) {
  204.       if (var0.charAt(0) == '/') {
  205.          var0 = var0.substring(1, var0.length());
  206.       }
  207.  
  208.       var0 = var0.toUpperCase();
  209.       return var0.equals("META-INF/MANIFEST.MF");
  210.    }
  211. }
  212.