/** * */ package org.commcare.android.util; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Vector; import org.commcare.android.tasks.LogSubmissionTask; import org.commcare.dalvik.R; import org.commcare.dalvik.application.CommCareApplication; import org.javarosa.core.model.instance.ExternalDataInstance; import org.javarosa.core.model.instance.FormInstance; import org.javarosa.core.model.instance.TreeReference; import org.javarosa.core.services.storage.IStorageUtilityIndexed; import org.javarosa.core.util.ArrayUtilities; import org.javarosa.model.xform.DataModelSerializer; import org.javarosa.xpath.expr.XPathExpression; import android.content.Context; import android.content.SharedPreferences; import android.widget.Toast; /** * Basically Copy+Paste code from CCJ2ME that needs to be unified or re-indexed to somewhere more reasonable. * * @author ctsims * */ public class CommCareUtil { public static FormInstance loadFixture(String refId, String userId) { IStorageUtilityIndexed<FormInstance> userFixtureStorage = CommCareApplication._().getUserStorage("fixture", FormInstance.class); IStorageUtilityIndexed<FormInstance> appFixtureStorage = CommCareApplication._().getAppStorage("fixture", FormInstance.class); Vector<Integer> userFixtures = userFixtureStorage.getIDsForValue(FormInstance.META_ID, refId); ///... Nooooot so clean. if(userFixtures.size() == 1) { //easy case, one fixture, use it return (FormInstance)userFixtureStorage.read(userFixtures.elementAt(0).intValue()); //TODO: Userid check anyway? } else if(userFixtures.size() > 1){ //intersect userid and fixtureid set. //TODO: Replace context call here with something from the session, need to stop relying on that coupling Vector<Integer> relevantUserFixtures = userFixtureStorage.getIDsForValue(FormInstance.META_XMLNS, userId); if(relevantUserFixtures.size() != 0) { Integer userFixture = ArrayUtilities.intersectSingle(userFixtures, relevantUserFixtures); if(userFixture != null) { return (FormInstance)userFixtureStorage.read(userFixture.intValue()); } } } //ok, so if we've gotten here there were no fixtures for the user, let's try the app fixtures. Vector<Integer> appFixtures = appFixtureStorage.getIDsForValue(FormInstance.META_ID, refId); Integer globalFixture = ArrayUtilities.intersectSingle(appFixtureStorage.getIDsForValue(FormInstance.META_XMLNS, ""), appFixtures); if(globalFixture != null) { return (FormInstance)appFixtureStorage.read(globalFixture.intValue()); } else { //See if we have one manually placed in the suite Integer userFixture = ArrayUtilities.intersectSingle(appFixtureStorage.getIDsForValue(FormInstance.META_XMLNS, userId), appFixtures); if(userFixture != null) { return (FormInstance)appFixtureStorage.read(userFixture.intValue()); } //Otherwise, nothing return null; } } /** * Used around to count up the degree of specificity for this reference * * @param reference * @return */ public static int countPreds(TreeReference reference) { int preds = 0; for(int i =0 ; i < reference.size(); ++i) { Vector<XPathExpression> predicates = reference.getPredicate(i); if(predicates != null) { preds += predicates.size(); } } return preds; } public static void printInstance(String instanceRef) { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataModelSerializer s = new DataModelSerializer(bos, new CommCareInstanceInitializer(null)); s.serialize(new ExternalDataInstance(instanceRef,"instance"), null); System.out.println(new String(bos.toByteArray())); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void triggerLogSubmission(Context c) { SharedPreferences settings = CommCareApplication._().getCurrentApp().getAppPreferences(); String url = settings.getString("PostURL", null); if(url == null) { //This is mostly for dev purposes Toast.makeText(c, "Couldn't submit logs! Invalid submission URL...", Toast.LENGTH_LONG).show(); } else { LogSubmissionTask reportSubmitter = new LogSubmissionTask(CommCareApplication._(), true, CommCareApplication._().getSession().startDataSubmissionListener(R.string.submission_logs_title), url); reportSubmitter.execute(); } } }