/*********************************************************************
*
* Use, duplication, or disclosure by the Government is subject to
* restricted rights as set forth in the DFARS.
*
* BBNT Solutions LLC A Part of Verizon 10 Moulton Street Cambridge,
* MA 02138 (617) 873-3000
*
* Copyright (C) 2002 by BBNT Solutions, LLC All Rights Reserved.
* **********************************************************************
*/
package com.bbn.openmap.tools.beanbox;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Vector;
/*
* Stores a list of headers that all pertain to a particular file in
* the archive
*/
public class Manifest {
private Vector entries = new Vector();
static final boolean debug = false;
static final void debug(String s) {
if (debug)
System.out.println("man> " + s);
}
public Manifest() {}
public Manifest(byte[] bytes) throws IOException {
this(new ByteArrayInputStream(bytes));
}
/**
* Parse a manifest from a stream
*/
public Manifest(InputStream is) throws IOException {
while (is.available() != 0) {
MessageHeader m = new MessageHeader(is);
entries.addElement(m);
}
}
/* recursively generate manifests from directory tree */
public Manifest(String[] files) throws IOException {
MessageHeader globals = new MessageHeader();
globals.add("Manifest-Version", "1.0");
addEntry(globals);
addFiles(null, files);
}
public void addEntry(MessageHeader entry) {
entries.addElement(entry);
}
public MessageHeader getEntry(String name) {
Enumeration enumeration = entries();
while (enumeration.hasMoreElements()) {
MessageHeader mh = (MessageHeader) enumeration.nextElement();
String nameVal = mh.findValue("Name");
if (nameVal != null && nameVal.equals(name)) {
return mh;
}
}
return null;
}
public MessageHeader entryAt(int i) {
return (MessageHeader) entries.elementAt(i);
}
public Enumeration entries() {
return entries.elements();
}
public void addFiles(File dir, String[] files) throws IOException {
if (files == null)
return;
for (int i = 0; i < files.length; i++) {
File file;
if (dir == null) {
file = new File(files[i]);
} else {
file = new File(dir, files[i]);
}
if (file.isDirectory()) {
addFiles(file, file.list());
} else {
addFile(file);
}
}
}
public void addFile(File f) throws IOException {
MessageHeader mh = new MessageHeader();
mh.add("Name", f.getPath());
addEntry(mh);
}
/*
* Add a manifest file at current position in a stream
*/
public void stream(OutputStream os, Vector extraFiles) throws IOException {
/*
* the first header in the file should be the global one. It
* should say "Manifest-Version: x.x"; barf if not
*/
MessageHeader globals = (MessageHeader) entries.elementAt(0);
if (globals.findValue("Manifest-Version") == null) {
throw new IOException("Manifest file requires "
+ "Manifest-Version: 1.0 in 1st header");
}
PrintWriter ps = new PrintWriter(os);
globals.print(ps);
for (int i = 1; i < entries.size(); ++i) {
MessageHeader mh = (MessageHeader) entries.elementAt(i);
mh.print(ps);
/* REMIND: could be adding files twice!!! */
String name = mh.findValue("name");
if (extraFiles != null && name != null) {
extraFiles.addElement(name);
}
}
}
public static boolean isManifestName(String name) {
// remove leading /
if (name.charAt(0) == '/') {
name = name.substring(1, name.length());
}
// case insensitive
name = name.toUpperCase();
if (name.equals("META-INF/MANIFEST.MF")) {
return true;
}
return false;
}
}