package org.commcare.android.database.user.models; import java.io.FileNotFoundException; import java.util.Date; import java.util.Hashtable; import org.commcare.android.database.EncryptedModel; import org.commcare.android.storage.framework.MetaField; import org.commcare.android.storage.framework.Persisted; import org.commcare.android.storage.framework.Persisting; import org.commcare.android.storage.framework.Table; import org.commcare.android.util.SessionUnavailableException; import org.commcare.dalvik.odk.provider.InstanceProviderAPI.InstanceColumns; import android.content.Context; import android.database.Cursor; import android.net.Uri; /** * @author ctsims * */ @Table(FormRecord.STORAGE_KEY) public class FormRecord extends Persisted implements EncryptedModel { public static final String STORAGE_KEY = "FORMRECORDS"; public static final String META_INSTANCE_URI = "INSTANCE_URI"; public static final String META_STATUS = "STATUS"; public static final String META_UUID = "UUID"; public static final String META_XMLNS = "XMLNS"; public static final String META_LAST_MODIFIED = "DATE_MODIFIED"; /** This form record is a stub that hasn't actually had data saved for it yet */ public static final String STATUS_UNSTARTED = "unstarted"; /** This form has been saved, but has not yet been marked as completed and ready for processing */ public static final String STATUS_INCOMPLETE = "incomplete"; /** User entry on this form has finished, but the form has not been processed yet */ public static final String STATUS_COMPLETE = "complete"; /** The form has been processed and is ready to be sent to the server **/ public static final String STATUS_UNSENT = "unsent"; /** This form has been fully processed and is being retained for viewing in the future */ public static final String STATUS_SAVED = "saved"; /** This form was complete, but something blocked it from processing and it's in a damaged state */ public static final String STATUS_LIMBO = "limbo"; /** This form has been downloaded, but not processed for metadata */ public static final String STATUS_UNINDEXED = "unindexed"; @Persisting(1) @MetaField(META_XMLNS) private String xmlns; @Persisting(2) @MetaField(META_INSTANCE_URI) private String instanceURI; @Persisting(3) @MetaField(META_STATUS) private String status; @Persisting(4) private byte[] aesKey; @Persisting(value=5, nullable=true) @MetaField(META_UUID) private String uuid; @Persisting(6) @MetaField(META_LAST_MODIFIED) private Date lastModified; //Placeholder private Hashtable<String, String> metadata = null; public FormRecord() { } /** * Creates a record of a form entry with the provided data. Note that none * of the parameters can be null... * * @param xmlns * @param path * @param entityId * @param status */ public FormRecord(String instanceURI, String status, String xmlns, byte[] aesKey, String uuid, Date lastModified) { this.instanceURI = instanceURI; this.status = status; this.xmlns = xmlns; this.aesKey = aesKey; this.uuid = uuid; this.lastModified = lastModified; if(lastModified == null) { lastModified = new Date(); } ; } public FormRecord updateStatus(String instanceURI, String newStatus) { FormRecord fr = new FormRecord(instanceURI, newStatus, xmlns, aesKey, uuid, lastModified); fr.recordId = this.recordId; return fr; } public Uri getInstanceURI() { if("".equals(instanceURI)) { return null; } return Uri.parse(instanceURI); } public byte[] getAesKey() { return aesKey; } public String getStatus() { return status; } public String getInstanceID() { return uuid; } public Date lastModified() { return lastModified; } public String getFormNamespace() { return xmlns; } public boolean isEncrypted(String data) { return false; } public boolean isBlobEncrypted() { return true; } String[] cached; private void decache() throws SessionUnavailableException { } /** * Get the file system path to the encrypted XML submission file. * * @param context Android context * @return A string containing the location of the encrypted XML instance for this form * @throws FileNotFoundException If there isn't a record available defining a path for this form */ public String getPath(Context context) throws FileNotFoundException { Uri uri = getInstanceURI(); if(uri == null) { throw new FileNotFoundException("No form instance URI exists for formrecord " + recordId); } Cursor c = context.getContentResolver().query(uri, new String[] {InstanceColumns.INSTANCE_FILE_PATH}, null, null, null); if(!c.moveToFirst()) { throw new FileNotFoundException("No Instances were found at for formrecord " + recordId + " at isntance URI " + uri.toString()); } return c.getString(c.getColumnIndex(InstanceColumns.INSTANCE_FILE_PATH)); } /* * (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return String.format("Form Record[%s][Status: %s]\n[Form: %s]\n[Last Modified: %s]", this.recordId, this.status, this.xmlns, this.lastModified.toString()); } }