refactored IClientAppdata and implementation has been minimally tested and bugfixed...
[vamsas.git] / src / uk / ac / vamsas / client / simpleclient / SimpleClientAppdata.java
index dcaedee..ececd9e 100644 (file)
@@ -21,11 +21,14 @@ import java.util.jar.JarOutputStream;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.vamsas.client.IClientAppdata;
-import org.vamsas.objects.core.AppData;
-import org.vamsas.objects.core.ApplicationData;
-import org.vamsas.objects.core.User;
-import org.vamsas.objects.utils.AppDataReference;
+
+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;
+import uk.ac.vamsas.objects.core.User;
+import uk.ac.vamsas.objects.utils.AppDataReference;
 
 /**
  * @author jimp
@@ -86,7 +89,7 @@ public class SimpleClientAppdata implements IClientAppdata {
    * gets appropriate app data for the application, if it exists in this dataset
    * Called by every accessor to ensure data has been retrieved from document.
    */
-  private void extractAppData(org.vamsas.objects.core.VamsasDocument doc) {
+  private void extractAppData(uk.ac.vamsas.objects.core.VamsasDocument doc) {
     if (doc==null) {
       log.debug("extractAppData called for null document object");
       return;
@@ -123,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.");
@@ -157,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) {
@@ -190,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) {
@@ -207,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;
@@ -257,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;
@@ -283,35 +286,35 @@ public class SimpleClientAppdata implements IClientAppdata {
     return null;
   }
   /* (non-Javadoc)
-   * @see org.vamsas.client.IClientAppdata#getClientAppdata()
+   * @see uk.ac.vamsas.client.IClientAppdata#getClientAppdata()
    */
   public byte[] getClientAppdata() {
     return _getappdataByteArray(false);
   }
   /* (non-Javadoc)
-   * @see org.vamsas.client.IClientAppdata#getClientInputStream()
+   * @see uk.ac.vamsas.client.IClientAppdata#getClientInputStream()
    */
-  public DataInput getClientInputStream() {
+  public AppDataInputStream getClientInputStream() {
     return _getappdataInputStream(false);
   }
 
   /* (non-Javadoc)
-   * @see org.vamsas.client.IClientAppdata#getUserAppdata()
+   * @see uk.ac.vamsas.client.IClientAppdata#getUserAppdata()
    */
   public byte[] getUserAppdata() {
     return _getappdataByteArray(true);
   }
 
   /* (non-Javadoc)
-   * @see org.vamsas.client.IClientAppdata#getUserInputStream()
+   * @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) {
@@ -389,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 {
@@ -400,9 +404,9 @@ public class SimpleClientAppdata implements IClientAppdata {
     istrm.close();
   }
   /* (non-Javadoc)
-   * @see org.vamsas.client.IClientAppdata#getClientOutputStream()
+   * @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())
@@ -411,9 +415,9 @@ public class SimpleClientAppdata implements IClientAppdata {
   }
 
   /* (non-Javadoc)
-   * @see org.vamsas.client.IClientAppdata#getUserOutputStream()
+   * @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())
@@ -423,27 +427,29 @@ public class SimpleClientAppdata implements IClientAppdata {
   }
 
   /* (non-Javadoc)
-   * @see org.vamsas.client.IClientAppdata#hasClientAppdata()
+   * @see uk.ac.vamsas.client.IClientAppdata#hasClientAppdata()
    */
   public boolean hasClientAppdata() {
     if (clientdoc==null)
       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;
   }
 
   /* (non-Javadoc)
-   * @see org.vamsas.client.IClientAppdata#hasUserAppdata()
+   * @see uk.ac.vamsas.client.IClientAppdata#hasUserAppdata()
    */
   public boolean hasUserAppdata() {
     if (clientdoc==null)
       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;
   }
@@ -460,7 +466,7 @@ public class SimpleClientAppdata implements IClientAppdata {
     return false;
   }
   /* (non-Javadoc)
-   * @see org.vamsas.client.IClientAppdata#setClientAppdata(byte[])
+   * @see uk.ac.vamsas.client.IClientAppdata#setClientAppdata(byte[])
    */
   public void setClientAppdata(byte[] data) {
     if (clientdoc==null)
@@ -476,7 +482,7 @@ public class SimpleClientAppdata implements IClientAppdata {
   }
 
   /* (non-Javadoc)
-   * @see org.vamsas.client.IClientAppdata#setUserAppdata(byte[])
+   * @see uk.ac.vamsas.client.IClientAppdata#setUserAppdata(byte[])
    */
   public void setUserAppdata(byte[] data) {
     if (clientdoc==null)
@@ -515,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;
   }