Skip to content

Commit

Permalink
Refactor entityLoaderTask to use a helper class
Browse files Browse the repository at this point in the history
  • Loading branch information
shubham1g5 committed Dec 5, 2024
1 parent d4d32c8 commit 7652bc4
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 45 deletions.
65 changes: 65 additions & 0 deletions app/src/org/commcare/tasks/EntityLoaderHelper.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package org.commcare.tasks

import android.util.Pair
import io.reactivex.functions.Cancellable
import org.commcare.activities.EntitySelectActivity
import org.commcare.cases.entity.AsyncNodeEntityFactory
import org.commcare.cases.entity.Entity
import org.commcare.cases.entity.EntityStorageCache
import org.commcare.cases.entity.NodeEntityFactory
import org.commcare.models.database.user.models.CommCareEntityStorageCache
import org.commcare.preferences.DeveloperPreferences
import org.commcare.suite.model.Detail
import org.javarosa.core.model.condition.EvaluationContext
import org.javarosa.core.model.instance.TreeReference

class EntityLoaderHelper(
detail: Detail,
evalCtx: EvaluationContext
) : Cancellable {

var focusTargetIndex: Int = -1
private var stopLoading: Boolean = false
var factory: NodeEntityFactory

init {
evalCtx.addFunctionHandler(EntitySelectActivity.getHereFunctionHandler())
if (detail.useAsyncStrategy()) {
val entityStorageCache: EntityStorageCache = CommCareEntityStorageCache("case")
factory = AsyncNodeEntityFactory(detail, evalCtx, entityStorageCache)
} else {
factory = NodeEntityFactory(detail, evalCtx)
if (DeveloperPreferences.collectAndDisplayEntityTraces()) {
factory.activateDebugTraceOutput()
}
}
}

fun loadEntities(nodeset: TreeReference): Pair<List<Entity<TreeReference>>, List<TreeReference>>? {
val references = factory.expandReferenceList(nodeset)
val full: MutableList<Entity<TreeReference>> = ArrayList()
focusTargetIndex = -1
var indexInFullList = 0
for (ref in references) {
if (stopLoading) {
return null
}
val e = factory.getEntity(ref)
if (e != null) {
full.add(e)
if (e.shouldReceiveFocus()) {
focusTargetIndex = indexInFullList
}
indexInFullList++
}
}

factory.prepareEntities(full)
factory.printAndClearTraces("build")
return Pair<List<Entity<TreeReference>>, List<TreeReference>>(full, references)
}

override fun cancel() {
stopLoading = true
}
}
56 changes: 11 additions & 45 deletions app/src/org/commcare/tasks/EntityLoaderTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,16 @@

import android.util.Pair;

import org.commcare.activities.EntitySelectActivity;
import org.commcare.android.logging.ForceCloseLogger;
import org.commcare.cases.entity.AsyncNodeEntityFactory;
import org.commcare.cases.entity.Entity;
import org.commcare.cases.entity.EntityStorageCache;
import org.commcare.cases.entity.NodeEntityFactory;
import org.commcare.logging.XPathErrorLogger;
import org.commcare.models.database.user.models.CommCareEntityStorageCache;
import org.commcare.preferences.DeveloperPreferences;
import org.commcare.suite.model.Detail;
import org.commcare.tasks.templates.ManagedAsyncTask;
import org.javarosa.core.model.condition.EvaluationContext;
import org.javarosa.core.model.instance.TreeReference;
import org.javarosa.core.services.Logger;
import org.javarosa.xpath.XPathException;

import java.util.ArrayList;
import java.util.List;

/**
Expand All @@ -30,53 +23,20 @@ public class EntityLoaderTask
private final static Object lock = new Object();
private static EntityLoaderTask pendingTask = null;

private final NodeEntityFactory factory;
private EntityLoaderListener listener;
private final EntityLoaderHelper entityLoaderHelper;
private Exception mException = null;
private int focusTargetIndex;

public EntityLoaderTask(Detail detail, EvaluationContext evalCtx) {
evalCtx.addFunctionHandler(EntitySelectActivity.getHereFunctionHandler());
if (detail.useAsyncStrategy()) {
EntityStorageCache entityStorageCache = new CommCareEntityStorageCache("case");
this.factory = new AsyncNodeEntityFactory(detail, evalCtx, entityStorageCache);
} else {
this.factory = new NodeEntityFactory(detail, evalCtx);
if (DeveloperPreferences.collectAndDisplayEntityTraces()) {
this.factory.activateDebugTraceOutput();
}
}
entityLoaderHelper = new EntityLoaderHelper(detail, evalCtx);
}

@Override
protected Pair<List<Entity<TreeReference>>, List<TreeReference>> doInBackground(TreeReference... nodeset) {
try {
List<TreeReference> references = factory.expandReferenceList(nodeset[0]);

List<Entity<TreeReference>> full = new ArrayList<>();
focusTargetIndex = -1;
int indexInFullList = 0;
for (TreeReference ref : references) {
if (this.isCancelled()) {
return null;
}

Entity<TreeReference> e = factory.getEntity(ref);
if (e != null) {
full.add(e);
if (e.shouldReceiveFocus()) {
focusTargetIndex = indexInFullList;
}
indexInFullList++;
}
}

factory.prepareEntities(full);
factory.printAndClearTraces("build");
return new Pair<>(full, references);
return entityLoaderHelper.loadEntities(nodeset[0]);
} catch (XPathException xe) {
XPathErrorLogger.INSTANCE.logErrorToCurrentApp(xe);
xe.printStackTrace();
Logger.exception("Error during EntityLoaderTask: " + ForceCloseLogger.getStackTrace(xe), xe);
mException = xe;
return null;
Expand All @@ -99,8 +59,8 @@ protected void onPostExecute(Pair<List<Entity<TreeReference>>, List<TreeReferenc
return;
}

listener.deliverLoadResult(result.first, result.second, factory, focusTargetIndex);

listener.deliverLoadResult(result.first, result.second, entityLoaderHelper.getFactory(),
entityLoaderHelper.getFocusTargetIndex());
return;
}
}
Expand Down Expand Up @@ -142,4 +102,10 @@ public void attachListener(EntityLoaderListener listener) {
this.listener = listener;
listener.attachLoader(this);
}

@Override
protected void onCancelled() {
super.onCancelled();
entityLoaderHelper.cancel();
}
}

0 comments on commit 7652bc4

Please sign in to comment.