added new constructor and File object accessor to make VamsasFile usable with VamsasA...
[vamsas.git] / src / org / vamsas / client / simpleclient / VamsasArchive.java
index ceaf401..f065d04 100644 (file)
@@ -15,6 +15,7 @@ import java.util.Iterator;
 import java.util.Vector;
 import java.util.jar.JarEntry;
 import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -187,6 +188,25 @@ public class VamsasArchive {
     this(archive, overwrite, vamsasdocument, null);
   }
   /**
+   * Constructor for accessing Files under file-lock management (ie a session file)
+   * @param archive
+   * @param vamsasdocument
+   * @param overwrite
+   * @throws IOException
+   */
+  public VamsasArchive(VamsasFile archive, boolean vamsasdocument, boolean overwrite) throws IOException {
+    this(archive.sessionFile, overwrite, vamsasdocument, archive);
+    // log.debug("using non-functional lock-IO stream jar access constructor");
+  }
+  /**
+   * read and write to archive - will not overwrite original contents, and will always write an up to date vamsas document structure.
+   * @param archive
+   * @throws IOException
+   */
+  public VamsasArchive(VamsasFile archive) throws IOException {
+    this(archive, true, false); 
+  }
+  /**
    * 
    * @param archive file to write
    * @param overwrite true if original contents should be deleted
@@ -205,10 +225,13 @@ public class VamsasArchive {
     this.vamsasdocument = vamsasdocument;
     if (archive.exists() && !overwrite) {
       this.original = archive;
-      if (extantLock!=null)
+      if (extantLock!=null) {
         this.odoclock = extantLock;
-      else 
-        this.odoclock = new SessionFile(archive); 
+        if (odoclock.fileLock==null || !odoclock.fileLock.isLocked())
+          odoclock.lockFile();
+      } else { 
+        this.odoclock = new SessionFile(archive);
+      }
       odoclock.lockFile(); // lock the file *immediatly*
       this.archive = null;       // archive will be a temp file when the open method is called
       virginArchive=false;
@@ -225,7 +248,7 @@ public class VamsasArchive {
       else
         rchive = new SessionFile(archive);
       rchive.lockFile();
-      if (rchive.fileLock==null || rchive.fileLock.rafile==null)
+      if (rchive.fileLock==null || rchive.fileLock.rafile==null || !rchive.fileLock.isLocked())
         throw new IOException("Lock failed for new archive"+archive);
       rchive.fileLock.rafile.setLength(0); // empty the archive.
       virginArchive = true;
@@ -243,6 +266,7 @@ public class VamsasArchive {
       odoclock.lockFile();
       if (odoc == null) 
         odoc = new VamsasArchiveReader(original);
+        // this constructor is not implemented yet odoc = new VamsasArchiveReader(odoclock.fileLock);
     }
   }
   
@@ -269,6 +293,7 @@ public class VamsasArchive {
     JarEntry je = new JarEntry(entry);
     if (!addEntry(entry))
       return false;
+    newarchive.flush();
     newarchive.putNextEntry(je);
     return true;
   }
@@ -354,10 +379,11 @@ public class VamsasArchive {
    */
   public void closeArchive() throws IOException {
     if (newarchive!=null) {
+      newarchive.flush();
       newarchive.closeEntry();
       if (!isDocumentWritten())
         log.warn("Premature closure of archive '"+archive.getAbsolutePath()+"': No document has been written.");
-      newarchive.close();
+      newarchive.close(); // use newarchive.finish(); for a stream IO
       updateOriginal();
       closeAndReset();
     } else {
@@ -536,7 +562,10 @@ public class VamsasArchive {
       rchive = new SessionFile(archive);
     if (!rchive.lockFile()) 
       throw new IOException("Failed to get lock on file "+archive);
-    newarchive = new JarOutputStream(rchive.fileLock.getBufferedOutputStream(true));  
+    // LATER: locked IO stream based access.
+    //Manifest newmanifest = new Manifest();
+    //newarchive = new JarOutputStream(rchive.fileLock.getBufferedOutputStream(true), newmanifest);  
+    newarchive = new JarOutputStream(new BufferedOutputStream(new java.io.FileOutputStream(archive)));  
     entries = new Hashtable();
   }
   public void putVamsasDocument(VamsasDocument doc) throws IOException, 
@@ -546,6 +575,8 @@ public class VamsasArchive {
   
   public void putVamsasDocument(VamsasDocument doc, VorbaIdFactory vorba) throws IOException, 
   org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException {
+    if (vamsasdocument)
+      doc.setVersion(VersionEntries.latestVersion()); // LATER: ensure this does the correct thing.
     VorbaXmlBinder.putVamsasDocument(getDocumentOutputStream(), vorba, doc);
   }