001: package org.objectweb.salome_tmf.plugins;
002:
003: import java.io.ByteArrayInputStream;
004: import java.io.File;
005: import java.io.IOException;
006: import java.io.InputStream;
007: import java.io.OutputStream;
008: import java.io.PrintWriter;
009: import java.util.Enumeration;
010: import java.util.Vector;
011:
012: public class ManifestWrapper {
013:
014: /* list of headers that all pertain to a particular
015: * file in the archive
016: */
017: private Vector entries = new Vector();
018:
019: static final boolean debug = false;
020:
021: static final void debug(String s) {
022: if (debug)
023: System.out.println("man> " + s);
024: }
025:
026: public ManifestWrapper() {
027: }
028:
029: public ManifestWrapper(byte[] bytes) throws IOException {
030: this (new ByteArrayInputStream(bytes));
031: }
032:
033: /**
034: * Parse a manifest from a stream
035: */
036: public ManifestWrapper(InputStream is) throws IOException {
037: while (is.available() != 0) {
038: MessageHeader m = new MessageHeader(is);
039: entries.addElement(m);
040: }
041: }
042:
043: /* recursively generate manifests from directory tree */
044: public ManifestWrapper(String[] files) throws IOException {
045: MessageHeader globals = new MessageHeader();
046: globals.add("Manifest-Version", "1.0");
047: addEntry(globals);
048: addFiles(null, files);
049: }
050:
051: public void addEntry(MessageHeader entry) {
052: entries.addElement(entry);
053: }
054:
055: public MessageHeader getEntry(String name) {
056: Enumeration e = entries();
057: while (e.hasMoreElements()) {
058: MessageHeader mh = (MessageHeader) e.nextElement();
059: String nameVal = mh.findValue("Name");
060: if (nameVal != null && nameVal.equals(name)) {
061: return mh;
062: }
063: }
064: return null;
065: }
066:
067: public MessageHeader entryAt(int i) {
068: return (MessageHeader) entries.elementAt(i);
069: }
070:
071: public Enumeration entries() {
072: return entries.elements();
073: }
074:
075: public void addFiles(File dir, String[] files) throws IOException {
076: if (files == null)
077: return;
078: for (int i = 0; i < files.length; i++) {
079: File file;
080: if (dir == null) {
081: file = new File(files[i]);
082: } else {
083: file = new File(dir, files[i]);
084: }
085: if (file.isDirectory()) {
086: addFiles(file, file.list());
087: } else {
088: addFile(file);
089: }
090: }
091: }
092:
093: public void addFile(File f) throws IOException {
094: MessageHeader mh = new MessageHeader();
095: mh.add("Name", f.getPath());
096: addEntry(mh);
097: }
098:
099: /* 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: }
|