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;
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(uk.ac.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;
* @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.");
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) {
* @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) {
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;
appdName = "User's Appdata";
}
log.debug("getting "+appdName+" as a byte array");
- extractAppData(clientdoc.getVamsasDocument());
+ extractAppData();
AppData object;
if (!clientOrUser) {
object = appsGlobal;
* @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;
}
if (log.isDebugEnabled())
log.debug("getting "+appdName+" as an input stream.");
- extractAppData(clientdoc.getVamsasDocument());
+ extractAppData();
AppData object;
if (!clientOrUser) {
object = appsGlobal;
/* (non-Javadoc)
* @see uk.ac.vamsas.client.IClientAppdata#getClientInputStream()
*/
- public DataInput getClientInputStream() {
+ public AppDataInputStream getClientInputStream() {
return _getappdataInputStream(false);
}
/* (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) {
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 {
/* (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())
/* (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())
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;
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;
}
*/
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;
}