package org.commcare.android.cases; import java.util.HashSet; import java.util.Hashtable; import java.util.Vector; import org.commcare.android.database.DbHelper; import org.commcare.android.database.SqlStorage; import org.commcare.android.database.SqlStorageIterator; import org.commcare.android.database.user.models.ACase; import org.commcare.cases.instance.CaseChildElement; import org.commcare.cases.ledger.Ledger; import org.commcare.cases.ledger.instance.LedgerChildElement; import org.commcare.cases.ledger.instance.LedgerInstanceTreeElement; import org.javarosa.core.model.instance.AbstractTreeElement; import org.javarosa.core.services.storage.IStorageIterator; import org.javarosa.core.util.DataUtil; /** * @author ctsims * */ public class AndroidLedgerInstanceTreeElement extends LedgerInstanceTreeElement { SqlStorageIterator<Ledger> iter; Hashtable<String, Integer> primaryIdMapping; public AndroidLedgerInstanceTreeElement(AbstractTreeElement instanceRoot, SqlStorage<Ledger> storage) { super(instanceRoot, storage); primaryIdMapping = null; } @Override protected Hashtable<String, Integer> getKeyMapping(String keyId) { if(keyId.equals(Ledger.INDEX_ENTITY_ID) && primaryIdMapping != null) { return primaryIdMapping; } else { return null; } } @Override protected synchronized void getLedgers() { if(ledgers != null) { return; } objectIdMapping = new Hashtable<Integer, Integer>(); ledgers = new Vector<LedgerChildElement>(); primaryIdMapping = new Hashtable<String, Integer>(); int mult = 0; for(IStorageIterator i = ((SqlStorage<ACase>)getStorage()).iterate(false, Ledger.INDEX_ENTITY_ID); i.hasMore();) { int id = i.peekID(); ledgers.addElement(new LedgerChildElement(this, id, null, mult)); objectIdMapping.put(DataUtil.integer(id), DataUtil.integer(mult)); primaryIdMapping.put(((SqlStorageIterator)i).getPrimaryId(),DataUtil.integer(id)); mult++; i.nextID(); } } /* * (non-Javadoc) * @see org.commcare.cases.util.StorageBackedTreeRoot#union(java.util.Vector, java.util.Vector) */ @Override protected Vector<Integer> union(Vector<Integer> selectedCases, Vector<Integer> cases) { //This is kind of (ok, so really) awkward looking, but we can't use sets in //ccj2me (Thanks, Nokia!) also, there's no _collections_ interface in //j2me (thanks Sun!) so this is what we get. HashSet<Integer> selected = new HashSet<Integer>(selectedCases); selected.addAll(selectedCases); HashSet<Integer> other = new HashSet<Integer>(); other.addAll(cases); selected.retainAll(other); selectedCases.clear(); selectedCases.addAll(selected); return selectedCases; } }