refactored IClientAppdata and implementation has been minimally tested and bugfixed...
[vamsas.git] / src / uk / ac / vamsas / client / simpleclient / SimpleClientAppdata.java
index 18f7d2e..ececd9e 100644 (file)
@@ -22,6 +22,8 @@ import java.util.jar.JarOutputStream;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import uk.ac.vamsas.client.AppDataInputStream;
+import uk.ac.vamsas.client.AppDataOutputStream;
 import uk.ac.vamsas.client.IClientAppdata;
 import uk.ac.vamsas.objects.core.AppData;
 import uk.ac.vamsas.objects.core.ApplicationData;
@@ -124,16 +126,14 @@ public class SimpleClientAppdata implements IClientAppdata {
    * @param docreader
    * @return
    */
-  private JarInputStream getAppDataStream(AppData appdata, VamsasArchiveReader docreader) {
+  private InputStream getAppDataStream(AppData appdata, VamsasArchiveReader docreader) {
     String entryRef = appdata.getDataReference();
     if (entryRef!=null) {
       log.debug("Resolving appData reference +"+entryRef);
       InputStream entry = docreader.getAppdataStream(entryRef);
       if (entry!=null) {
-        if (entry instanceof JarInputStream) {
-          return (JarInputStream) entry;
-        }
-        log.warn("Implementation problem - docreader didn't return a JarInputStream entry.");
+        return entry;
+        // log.warn("Implementation problem - docreader didn't return a JarInputStream entry.");
       }
     } else {
       log.debug("GetAppDataStream called for an AppData without a data reference.");
@@ -158,15 +158,17 @@ public class SimpleClientAppdata implements IClientAppdata {
         return null;
       }
       // resolve and load data
-      JarInputStream entry = getAppDataStream(appdata, docreader); 
+      InputStream entry = getAppDataStream(appdata, docreader); 
       ByteArrayOutputStream bytes = new ByteArrayOutputStream();
       try {
         byte buff[] = new byte[_TRANSFER_BUFFER];
         int olen=0;
-        while (entry.available()>0) {
-          int len = entry.read(buff, olen, _TRANSFER_BUFFER);
-          bytes.write(buff, 0, len);
-          olen+=len;
+        while (entry!=null && entry.available()>0) {
+          int len = entry.read(buff, 0, _TRANSFER_BUFFER);
+          if (len>-1)
+          { bytes.write(buff, 0, len);
+            olen+=len;
+          }
         }
         buff=null;
       } catch (Exception e) {
@@ -191,7 +193,7 @@ public class SimpleClientAppdata implements IClientAppdata {
    * @param docreader
    * @return data in object or null if no data is accessible
    */
-  private DataInput getAppDataAsDataInputStream(AppData appdata, VamsasArchiveReader docreader) {
+  private AppDataInputStream getAppDataAsDataInputStream(AppData appdata, VamsasArchiveReader docreader) {
     if (appdata!=null && docreader!=null) {
       String entryRef = appdata.getDataReference();
       if (entryRef!=null) {
@@ -208,7 +210,7 @@ public class SimpleClientAppdata implements IClientAppdata {
         byte[] data=appdata.getData();
         if (data.length>0) {
           ByteArrayInputStream stream = new ByteArrayInputStream(data);
-          return new DataInputStream(stream);
+          return new AppDataInputStream(stream);
         } else {
           log.debug("Returning null input stream for empty Appdata data block in id="+appdata.getVorbaId());
           return null;
@@ -258,7 +260,7 @@ public class SimpleClientAppdata implements IClientAppdata {
    * @param clientOrUser - the appData to resolve - false for client, true for user appdata.
    * @return null or the DataInputStream desired.
    */
-  private DataInput _getappdataInputStream(boolean clientOrUser) {
+  private AppDataInputStream _getappdataInputStream(boolean clientOrUser) {
     if (clientdoc==null)
       throw new Error("Implementation error, Improperly initialized SimpleClientAppdata.");
     String appdName;
@@ -292,7 +294,7 @@ public class SimpleClientAppdata implements IClientAppdata {
   /* (non-Javadoc)
    * @see uk.ac.vamsas.client.IClientAppdata#getClientInputStream()
    */
-  public DataInput getClientInputStream() {
+  public AppDataInputStream getClientInputStream() {
     return _getappdataInputStream(false);
   }
 
@@ -306,13 +308,13 @@ public class SimpleClientAppdata implements IClientAppdata {
   /* (non-Javadoc)
    * @see uk.ac.vamsas.client.IClientAppdata#getUserInputStream()
    */
-  public DataInput getUserInputStream() {
+  public AppDataInputStream getUserInputStream() {
     return _getappdataInputStream(true);
   }
   /**
    * methods for writing new AppData entries.
    */
-  private DataOutput _getAppdataOutputStream(boolean clientOrUser) {
+  private AppDataOutputStream _getAppdataOutputStream(boolean clientOrUser) {
     String apdname;
     SessionFile apdfile=null;
     if (!clientOrUser) {
@@ -390,6 +392,7 @@ public class SimpleClientAppdata implements IClientAppdata {
       if (ref==null) {
         throw new IOException("Null AppData.DataReference passed.");
       }
+      log.debug("Writing appData_entry.dat as "+ref);
       if (vdoc.writeAppdataFromStream(ref, istrm)) {
         log.debug("Entry updated successfully.");
       } else {
@@ -403,7 +406,7 @@ public class SimpleClientAppdata implements IClientAppdata {
   /* (non-Javadoc)
    * @see uk.ac.vamsas.client.IClientAppdata#getClientOutputStream()
    */
-  public DataOutput getClientOutputStream() {
+  public AppDataOutputStream getClientOutputStream() {
     if (clientdoc==null)
       throw new Error("Implementation error, Improperly initialized SimpleClientAppdata.");
     if (log.isDebugEnabled())
@@ -414,7 +417,7 @@ public class SimpleClientAppdata implements IClientAppdata {
   /* (non-Javadoc)
    * @see uk.ac.vamsas.client.IClientAppdata#getUserOutputStream()
    */
-  public DataOutput getUserOutputStream() {
+  public AppDataOutputStream getUserOutputStream() {
     if (clientdoc==null)
       throw new Error("Implementation error, Improperly initialized SimpleClientAppdata.");
     if (log.isDebugEnabled())
@@ -431,6 +434,7 @@ public class SimpleClientAppdata implements IClientAppdata {
       throw new Error("Implementation error, Improperly initialized SimpleClientAppdata.");
     extractAppData(clientdoc.getVamsasDocument());
     // LATER - check validity of a DataReference before we return true
+    // TODO: return true if usersData is null but we have already written a new data stream 
     if ((appsGlobal!=null) && (appsGlobal.getDataReference()!=null || appsGlobal.getData()!=null))
       return true;
     return false;
@@ -444,7 +448,8 @@ public class SimpleClientAppdata implements IClientAppdata {
       throw new Error("Implementation error, Improperly initialized SimpleClientAppdata.");
     extractAppData(clientdoc.getVamsasDocument());
     // LATER - check validity of a DataReference before we return true
-    if ((appsGlobal!=null) && (appsGlobal.getDataReference()!=null || appsGlobal.getData()!=null))
+    // TODO: return true if usersData is null but we have already written a new data stream 
+    if ((usersData!=null) && (usersData.getDataReference()!=null || usersData.getData()!=null))
       return true;
     return false;
   }
@@ -516,7 +521,7 @@ public class SimpleClientAppdata implements IClientAppdata {
    */
   protected boolean isModified() {
     // LATER differentiate between core xml modification and Jar Entry modification.
-    if (newAppData.sessionFile.exists() || newUserData.sessionFile.exists())
+    if ((newAppData!=null && newAppData.sessionFile.exists()) || (newUserData!=null && newUserData.sessionFile.exists()))
       return true;
     return false;
   }