1 package org.vamsas.client.simpleclient;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.io.RandomAccessFile;
7 import java.util.Enumeration;
8 import java.util.Iterator;
9 import java.util.Vector;
10 import java.util.jar.JarEntry;
11 import java.util.jar.JarFile;
12 import java.util.jar.JarInputStream;
13 import java.util.jar.JarOutputStream;
15 import org.apache.commons.logging.Log;
16 import org.apache.commons.logging.LogFactory;
18 * Basic methods for accessing an existing Vamsas Archive,
19 * and Jar entry names for creating new vamsas archives.
24 public class VamsasArchiveReader {
25 private static Log log = LogFactory.getLog(VamsasArchiveReader.class);
27 boolean stream=false; // true if we are seeking on the stream.
28 RandomAccessFile rfile;
29 JarInputStream jstream;
30 public VamsasArchiveReader(File vamsasfile) {
32 if (vamsasfile.exists()) {
34 jfile=new JarFile(vamsasfile);
37 log.debug("non-serious? couldn't open new JarFile on "+vamsasfile,e);
44 * in an ideal world - this constructor will create a reader object
45 * for the locked file's random access stream.
49 public VamsasArchiveReader(Lock vamsaslock) {
50 rfile = vamsaslock.rafile;
52 // TODO: Implement stream based JarFile access
53 log.error("NOT IMPLEMENTED STREAM-BASED JAR ACCESS");
54 throw new Error("Can't access a locked VamsasArchive file as a random access stream yet.");
59 * the vamsas document version(s) handled by this Reader
61 final public static String DOCUMENT_VERSION="0.1";
63 * name of the jarEntry containing a well formatted vamsas XML Document
66 final public static String VAMSASDOC="vamsasDocument.xml";
69 * name of the jarEntry containing a root VAMSAS element, and containing a
70 * random sequence of VAMSAS DataSet elements
73 final public static String VAMSASXML="vamsas.xml";
77 * @return JarEntry for VamsasArchiveReader.VAMSASDOC
79 protected JarEntry getVamsasDocumentEntry() {
81 return jfile.getJarEntry(VAMSASDOC);
86 * @return JarEntry for VamsasArchiveReader.VAMSASXML
88 protected JarEntry getVamsasXmlEntry() {
90 return jfile.getJarEntry(VAMSASXML);
94 * Test for valid vamsas document archive
95 * @return true if getVamsasDocumentStream will return a stream likely to contain valid XML
97 public boolean isValid() {
99 // TODO: check if VAMSASDOC is well formed (follows www.vamsas.ac.uk/schemas/vamsasDocument.xsd) and all appData references are resolvable - preferably as jar entries
100 return (getVamsasDocumentEntry()!=null);
105 protected JarEntry getAppdataEntry(String AppdataRef) {
107 if (jfile==null || !isValid() || (entry=jfile.getJarEntry(AppdataRef))==null)
112 public InputStream getAppdataStream(String AppdataRef) {
113 JarEntry entry=getAppdataEntry(AppdataRef);
116 return jfile.getInputStream(entry);
117 } catch (IOException e) {
118 System.err.println("Failed when opening AppdataStream for "+AppdataRef);
119 e.printStackTrace(System.err);
124 * get the VamsasDocument input stream, if it exists.
125 * @return null or valid input stream
127 public InputStream getVamsasDocumentStream() {
129 if (jfile==null || !isValid())
132 vdoc = jfile.getInputStream(getVamsasDocumentEntry());
133 } catch (IOException e) {
134 e.printStackTrace(System.err);
141 * get the VamsasXML input stream, if it exists.
142 * Note: Deprecated beyond our prealpha testing.
143 * @return null or valid input stream.
146 public InputStream getVamsasXmlStream() {
147 // log.warn("Deprecated call");
148 JarEntry xmle=getVamsasXmlEntry();
153 vdoc = jfile.getInputStream(xmle);
154 } catch (IOException e) {
155 e.printStackTrace(System.err);
162 * silently close the jar file.
165 public void close() {
169 } catch (IOException e) {
170 e.printStackTrace(System.err);
176 * returns all entries not matching the filespec of a vamsas xml entry
177 * @return array of entries.
179 public Vector getExtraEntries() {
180 if (jfile==null || !isValid())
182 Enumeration entries = jfile.entries();
183 if (entries!=null && entries.hasMoreElements()) {
184 Vector e = new Vector();
186 JarEntry el = (JarEntry) entries.nextElement();
187 if (!el.getName().equals(VAMSASDOC) && !el.getName().equals(VAMSASXML))
188 e.add(new String(el.getName())); // avoid references
189 } while (entries.hasMoreElements());