package org.commcare.android.database.user.models; import org.commcare.models.AndroidSessionWrapper; import org.commcare.android.storage.framework.Persisted; import org.commcare.models.framework.Persisting; import org.commcare.models.framework.Table; import org.commcare.modern.models.EncryptedModel; import org.commcare.modern.models.MetaField; import org.commcare.session.SessionDescriptorUtil; import org.javarosa.core.util.MD5; /** * A Session State Descriptor contains all of the information that can be persisted * about a CommCare session. It is immutable and reflects a specific state. * * @author ctsims */ @Table(SessionStateDescriptor.STORAGE_KEY) public class SessionStateDescriptor extends Persisted implements EncryptedModel { public static final String STORAGE_KEY = "android_cc_session"; public static final String META_DESCRIPTOR_HASH = "descriptorhash"; public static final String META_FORM_RECORD_ID = "form_record_id"; @Persisting(1) @MetaField(value = META_FORM_RECORD_ID, unique = true) private int formRecordId = -1; @Persisting(2) private String sessionDescriptor = null; @MetaField(value = META_DESCRIPTOR_HASH) public String getHash() { return MD5.toHex(MD5.hash(sessionDescriptor.getBytes())); } public SessionStateDescriptor() { } public static SessionStateDescriptor buildFromSessionWrapper(AndroidSessionWrapper state) { SessionStateDescriptor descriptor = new SessionStateDescriptor(); descriptor.formRecordId = state.getFormRecordId(); descriptor.sessionDescriptor = SessionDescriptorUtil.createSessionDescriptor(state.getSession()); return descriptor; } @Override public boolean isEncrypted(String data) { return false; } @Override public boolean isBlobEncrypted() { return false; } public int getFormRecordId() { return formRecordId; } public SessionStateDescriptor reMapFormRecordId(int idForNewRecord) { SessionStateDescriptor copy = new SessionStateDescriptor(); copy.formRecordId = idForNewRecord; copy.sessionDescriptor = sessionDescriptor; return copy; } public void fromBundle(String serializedDescriptor) { this.sessionDescriptor = serializedDescriptor; } public String getSessionDescriptor() { return this.sessionDescriptor; } }