home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 July / Chip_1998-07_cd.bin / zkuste / JBuilder / BDK / Win / bdk_sep97.exe / _SETUP.1 / Manifest.java < prev    next >
Encoding:
Java Source  |  1997-09-10  |  3.3 KB  |  146 lines

  1. package sun.beanbox;
  2.  
  3. import java.io.*;
  4. import java.util.*;
  5.  
  6. /**
  7.  *
  8.  * @version           1.15, 96/11/19
  9.  * @author           David Brown
  10.  * @author           Benjamin Renaud
  11.  */
  12.  
  13. public class Manifest {
  14.  
  15.     /* list of headers that all pertain to a particular
  16.      * file in the archive
  17.      */
  18.     private Vector entries = new Vector();
  19.  
  20.     static final boolean debug = false;
  21.     static final void debug(String s) {
  22.     if (debug)
  23.         System.out.println("man> " + s);
  24.     }
  25.  
  26.     public Manifest() {}
  27.  
  28.     public Manifest(byte[] bytes) throws IOException {
  29.     this(new ByteArrayInputStream(bytes));
  30.     }
  31.  
  32.     /**
  33.      * Parse a manifest from a stream
  34.      */
  35.     public Manifest(InputStream is) throws IOException {
  36.     while (is.available() != 0) {
  37.         MessageHeader m = new MessageHeader(is);
  38.         entries.addElement(m);
  39.     }
  40.     }
  41.  
  42.  
  43.     /* recursively generate manifests from directory tree */
  44.     public Manifest(String[] files) throws IOException {
  45.     MessageHeader globals = new MessageHeader();
  46.     globals.add("Manifest-Version", "1.0");
  47.     addEntry(globals);
  48.     addFiles(null, files);
  49.     }
  50.  
  51.     public void addEntry(MessageHeader entry) {
  52.     entries.addElement(entry);
  53.     }
  54.  
  55.     public MessageHeader getEntry(String name) {
  56.     Enumeration enum = entries();
  57.     while(enum.hasMoreElements()) {
  58.         MessageHeader mh = (MessageHeader)enum.nextElement();
  59.         String nameVal = mh.findValue("Name");
  60.         if (nameVal != null && nameVal.equals(name)) {
  61.         return mh;
  62.         }
  63.     }
  64.     return null;
  65.     }
  66.  
  67.     public MessageHeader entryAt(int i) {
  68.     return (MessageHeader) entries.elementAt(i);
  69.     }
  70.  
  71.     public Enumeration entries() {
  72.     return entries.elements();
  73.     }
  74.     
  75.     public void addFiles(File dir, String[] files) throws IOException {
  76.     if (files == null)
  77.         return;
  78.     for (int i = 0; i < files.length; i++) {
  79.         File file;
  80.         if (dir == null) {
  81.         file = new File(files[i]);
  82.         } else {
  83.         file = new File(dir, files[i]);
  84.         }
  85.         if (file.isDirectory()) {
  86.         addFiles(file, file.list());
  87.         } else {
  88.         addFile(file);
  89.         }
  90.     }
  91.     }
  92.  
  93.     public void addFile(File f) throws IOException {
  94.     MessageHeader mh = new MessageHeader();
  95.     mh.add("Name", f.getPath());
  96.     addEntry(mh);
  97.     }
  98.  
  99.     /* Add a manifest file at current position in a stream
  100.      */
  101.     public void stream(OutputStream os, Vector extraFiles) 
  102.     throws IOException {
  103.  
  104.     /* the first header in the file should be the global one.
  105.      * It should say "Manifest-Version: x.x"; barf if not
  106.      */
  107.     MessageHeader globals = (MessageHeader) entries.elementAt(0);
  108.     if (globals.findValue("Manifest-Version") == null) {
  109.         throw new IOException("Manifest file requires " +
  110.                 "Manifest-Version: 1.0 in 1st header");
  111.     }
  112.  
  113.     PrintWriter ps = new PrintWriter(os);
  114.     globals.print(ps);
  115.  
  116.     for (int i = 1; i < entries.size(); ++i) {
  117.         MessageHeader mh = (MessageHeader) entries.elementAt(i);
  118.  
  119.         mh.print(ps);
  120.  
  121.         /* REMIND: could be adding files twice!!! */
  122.         String name = mh.findValue("name");
  123.         if (extraFiles != null && name != null) {
  124.         extraFiles.addElement(name);
  125.         }
  126.     }
  127.     }
  128.  
  129.     public static boolean isManifestName(String name) {
  130.     
  131.     // remove leading /
  132.     if (name.charAt(0) == '/') {
  133.         name = name.substring(1, name.length());
  134.     }
  135.     // case insensitive
  136.     name = name.toUpperCase();
  137.     
  138.     if (name.equals("META-INF/MANIFEST.MF")) {
  139.         return true;
  140.     }
  141.     return false;
  142.     }
  143.  
  144.                           
  145. }
  146.