Skip to content

Commit

Permalink
Merge pull request #6153 from seadowg/entity-update
Browse files Browse the repository at this point in the history
Don't update entity if it doesn't exist in the list
  • Loading branch information
grzesiek2010 committed May 29, 2024
2 parents e909810 + 4386f50 commit d67e55a
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import org.odk.collect.android.javarosawrapper.JavaRosaFormController
import org.odk.collect.android.utilities.FileUtils
import org.odk.collect.android.utilities.FormUtils
import org.odk.collect.entities.EntitiesRepository
import org.odk.collect.entities.LocalEntityUseCases
import org.odk.collect.forms.Form
import org.odk.collect.forms.FormsRepository
import org.odk.collect.forms.instances.Instance
Expand All @@ -31,7 +32,8 @@ object FormEntryUseCases {
formDefCache: FormDefCache
): Pair<FormDef, Form>? {
val form =
formsRepository.getAllByFormIdAndVersion(instance.formId, instance.formVersion).firstOrNull()
formsRepository.getAllByFormIdAndVersion(instance.formId, instance.formVersion)
.firstOrNull()
return if (form == null) {
null
} else {
Expand Down Expand Up @@ -159,11 +161,10 @@ object FormEntryUseCases {
entitiesRepository: EntitiesRepository
) {
formController.finalizeForm()
formController.getEntities().forEach { entity ->
if (entitiesRepository.getLists().contains(entity.list)) {
entitiesRepository.save(entity)
}
}
LocalEntityUseCases.updateLocalEntitiesFromForm(
formController.getEntities(),
entitiesRepository
)
}

private fun getInstanceFromFormController(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ object ServerFormUseCases {

val dataset = mediaFile.filename.substringBefore(".csv")
if (entitiesRepository.getLists().contains(dataset)) {
LocalEntityUseCases.updateLocalEntities(dataset, tempMediaFile, entitiesRepository)
LocalEntityUseCases.updateLocalEntitiesFromServer(dataset, tempMediaFile, entitiesRepository)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,13 @@ import org.javarosa.core.model.FormIndex
import org.javarosa.core.model.data.IAnswerData
import org.javarosa.core.model.instance.TreeReference
import org.javarosa.core.services.transport.payload.ByteArrayPayload
import org.javarosa.entities.internal.Entities
import org.javarosa.form.api.FormEntryCaption
import org.javarosa.form.api.FormEntryPrompt
import org.odk.collect.android.exception.JavaRosaException
import org.odk.collect.android.formentry.audit.AuditEventLogger
import org.odk.collect.entities.Entity
import java.io.File
import java.io.IOException
import java.util.stream.Stream

interface FormController {
fun getFormDef(): FormDef?
Expand Down Expand Up @@ -335,5 +334,5 @@ interface FormController {

fun getAnswer(treeReference: TreeReference?): IAnswerData?

fun getEntities(): Stream<Entity>
fun getEntities(): Entities?
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,22 +47,20 @@
import org.javarosa.xform.parse.XFormParser;
import org.javarosa.xpath.XPathParseTool;
import org.javarosa.xpath.expr.XPathExpression;
import org.odk.collect.android.exception.JavaRosaException;
import org.odk.collect.android.dynamicpreload.ExternalDataUtil;
import org.odk.collect.android.exception.JavaRosaException;
import org.odk.collect.android.formentry.audit.AsyncTaskAuditEventWriter;
import org.odk.collect.android.formentry.audit.AuditConfig;
import org.odk.collect.android.formentry.audit.AuditEventLogger;
import org.odk.collect.android.utilities.Appearances;
import org.odk.collect.android.utilities.FileUtils;
import org.odk.collect.entities.Entity;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.stream.Stream;

import timber.log.Timber;

Expand Down Expand Up @@ -1111,12 +1109,7 @@ public IAnswerData getAnswer(TreeReference treeReference) {
return getFormDef().getMainInstance().resolveReference(treeReference).getValue();
}

public Stream<Entity> getEntities() {
Entities extra = formEntryController.getModel().getExtras().get(Entities.class);
if (extra != null) {
return extra.getEntities().stream().map(entity -> new Entity(entity.dataset, entity.id, entity.label, entity.version, entity.properties));
} else {
return Stream.empty();
}
public Entities getEntities() {
return formEntryController.getModel().getExtras().get(Entities.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import org.javarosa.core.model.FormIndex
import org.javarosa.core.model.data.IAnswerData
import org.javarosa.core.model.instance.TreeReference
import org.javarosa.core.services.transport.payload.ByteArrayPayload
import org.javarosa.entities.internal.Entities
import org.javarosa.form.api.FormEntryCaption
import org.javarosa.form.api.FormEntryPrompt
import org.odk.collect.android.exception.JavaRosaException
Expand All @@ -13,9 +14,7 @@ import org.odk.collect.android.javarosawrapper.FormController
import org.odk.collect.android.javarosawrapper.InstanceMetadata
import org.odk.collect.android.javarosawrapper.SuccessValidationResult
import org.odk.collect.android.javarosawrapper.ValidationResult
import org.odk.collect.entities.Entity
import java.io.File
import java.util.stream.Stream

open class StubFormController : FormController {
override fun getFormDef(): FormDef? = null
Expand Down Expand Up @@ -157,5 +156,5 @@ open class StubFormController : FormController {

override fun getAnswer(treeReference: TreeReference?): IAnswerData? = null

override fun getEntities(): Stream<Entity> = Stream.empty()
override fun getEntities(): Entities? = null
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,42 @@ package org.odk.collect.entities

import org.javarosa.core.model.instance.CsvExternalInstance
import org.javarosa.core.model.instance.TreeElement
import org.javarosa.entities.EntityAction
import org.javarosa.entities.internal.Entities
import java.io.File

object LocalEntityUseCases {

fun updateLocalEntities(
@JvmStatic
fun updateLocalEntitiesFromForm(
formEntities: Entities?,
entitiesRepository: EntitiesRepository
) {
formEntities?.entities?.forEach { formEntity ->
val id = formEntity.id
if (id != null && entitiesRepository.getLists().contains(formEntity.dataset)) {
if (formEntity.action != EntityAction.UPDATE || entitiesRepository.getEntities(formEntity.dataset).any { it.id == id }) {
val entity = Entity(
formEntity.dataset,
id,
formEntity.label,
formEntity.version,
formEntity.properties
)

entitiesRepository.save(entity)
}
}
}
}

fun updateLocalEntitiesFromServer(
list: String,
onlineList: File,
serverList: File,
entitiesRepository: EntitiesRepository
) {
val root = try {
CsvExternalInstance().parse(list, onlineList.absolutePath)
CsvExternalInstance().parse(list, serverList.absolutePath)
} catch (e: Exception) {
return
}
Expand Down
Loading

0 comments on commit d67e55a

Please sign in to comment.