X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fuk%2Fac%2Fvamsas%2Fclient%2Fsimpleclient%2FSimpleClientAppdata.java;h=7ea7ddafa807e73208b69d2b6a41b4b0f588b057;hb=158cc8e5d75ba0b94f2eed62b85f2b39038aadd1;hp=705f024773f725fa8dae83f9504af29acefaa5e8;hpb=ea8b10ee787a2b1e2b35f2acb4dccaf12fd2a6fd;p=vamsas.git diff --git a/src/uk/ac/vamsas/client/simpleclient/SimpleClientAppdata.java b/src/uk/ac/vamsas/client/simpleclient/SimpleClientAppdata.java index 705f024..7ea7dda 100644 --- a/src/uk/ac/vamsas/client/simpleclient/SimpleClientAppdata.java +++ b/src/uk/ac/vamsas/client/simpleclient/SimpleClientAppdata.java @@ -21,12 +21,14 @@ import java.util.jar.JarOutputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -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 @@ -84,10 +86,19 @@ public class SimpleClientAppdata implements IClientAppdata { this.clientdoc = clientdoc; } /** + * ensures that the appData information for this client + * instance has been extracted from the vamsas document provided by clientdoc. + */ + private void extractAppData() + { + if (!accessedDocument) + _extractAppData(clientdoc.getVamsasDocument()); + } + /** * 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; @@ -124,16 +135,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 +167,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 +202,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 +219,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; @@ -236,7 +247,7 @@ public class SimpleClientAppdata implements IClientAppdata { appdName = "User's Appdata"; } log.debug("getting "+appdName+" as a byte array"); - extractAppData(clientdoc.getVamsasDocument()); + extractAppData(); AppData object; if (!clientOrUser) { object = appsGlobal; @@ -258,7 +269,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; @@ -269,7 +280,7 @@ public class SimpleClientAppdata implements IClientAppdata { } if (log.isDebugEnabled()) log.debug("getting "+appdName+" as an input stream."); - extractAppData(clientdoc.getVamsasDocument()); + extractAppData(); AppData object; if (!clientOrUser) { object = appsGlobal; @@ -292,7 +303,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 +317,15 @@ 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) { + // Must access document to get any existing references + extractAppData(); String apdname; SessionFile apdfile=null; if (!clientOrUser) { @@ -390,6 +403,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 +417,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 +428,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()) @@ -429,8 +443,9 @@ public class SimpleClientAppdata implements IClientAppdata { public boolean hasClientAppdata() { if (clientdoc==null) throw new Error("Implementation error, Improperly initialized SimpleClientAppdata."); - extractAppData(clientdoc.getVamsasDocument()); + extractAppData(); // 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; @@ -442,9 +457,10 @@ public class SimpleClientAppdata implements IClientAppdata { public boolean hasUserAppdata() { if (clientdoc==null) throw new Error("Implementation error, Improperly initialized SimpleClientAppdata."); - extractAppData(clientdoc.getVamsasDocument()); + extractAppData(); // 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 +532,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; }