Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.odk.collect.android.projects

import org.odk.collect.analytics.Analytics
import org.odk.collect.android.BuildConfig
import org.odk.collect.shared.DebugLogger
import java.io.File
Expand All @@ -8,6 +9,15 @@ import java.time.LocalDateTime
class FileDebugLogger(private val file: File) : DebugLogger {

override fun log(tag: String, message: String) {
logToFile(tag, message)
}

override fun logWithAnalytics(tag: String, message: String, analyticsEvent: String, analyticsKey: String) {
logToFile(tag, message)
Analytics.log(analyticsEvent, analyticsKey)
}

private fun logToFile(tag: String, message: String) {
if (enabled) {
val line = "${LocalDateTime.now()} $tag \"$message\"\n"
file.appendText(line)
Expand Down
1 change: 1 addition & 0 deletions entities/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ dependencies {
implementation(project(":strings"))
implementation(project(":shared"))
implementation(project(":androidshared"))
implementation(project(":analytics"))
implementation(project(":material"))
implementation(project(":async"))
implementation(project(":lists"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ package org.odk.collect.entities

import org.apache.commons.csv.CSVRecord
import org.javarosa.core.model.instance.SecondaryInstanceCSVParserBuilder
import org.odk.collect.entities.analytics.AnalyticsEvents
import org.odk.collect.entities.javarosa.finalization.EntitiesExtra
import org.odk.collect.entities.javarosa.finalization.FormEntity
import org.odk.collect.entities.javarosa.parse.EntitySchema
import org.odk.collect.entities.javarosa.parse.isV4UUID
import org.odk.collect.entities.javarosa.spec.EntityAction
import org.odk.collect.entities.server.EntitySource
import org.odk.collect.entities.storage.EntitiesRepository
Expand All @@ -24,32 +26,37 @@ object LocalEntityUseCases {
debugLogger: DebugLogger? = null
) {
formEntities?.entities?.forEach { formEntity ->
when (formEntity.action) {
EntityAction.CREATE -> saveNewEntity(formEntity, entitiesRepository, debugLogger)

EntityAction.UPDATE -> {
val existing = entitiesRepository.findEntityById(formEntity.dataset, formEntity.id)
if (existing != null) {
saveUpdatedEntity(formEntity, existing, entitiesRepository)
if (formEntity.id.isV4UUID()) {
when (formEntity.action) {
EntityAction.CREATE -> saveNewEntity(formEntity, entitiesRepository, debugLogger)

EntityAction.UPDATE -> {
val existing = entitiesRepository.findEntityById(formEntity.dataset, formEntity.id)
if (existing != null) {
saveUpdatedEntity(formEntity, existing, entitiesRepository)
} else {
debugLogger?.logInvalidEntity(AnalyticsEvents.ENTITY_UPDATE_NO_MATCH, formEntity)
}
}
}

EntityAction.UPSERT -> {
val existing = entitiesRepository.findEntityById(formEntity.dataset, formEntity.id)
if (existing == null) {
saveNewEntity(formEntity, entitiesRepository, debugLogger)
} else {
saveUpdatedEntity(formEntity, existing, entitiesRepository)
EntityAction.UPSERT -> {
val existing = entitiesRepository.findEntityById(formEntity.dataset, formEntity.id)
if (existing == null) {
saveNewEntity(formEntity, entitiesRepository, debugLogger)
} else {
saveUpdatedEntity(formEntity, existing, entitiesRepository)
}
}
}
}
}
} else {
val event = if (formEntity.id.isNullOrBlank()) {
AnalyticsEvents.ENTITY_WITH_NO_ID
} else {
AnalyticsEvents.ENTITY_WITH_INVALID_ID
}

formEntities?.invalidEntities?.forEach {
debugLogger?.log(
"Entities",
"Failed to create/update dataset=${it.dataset}, id=${it.id}, label=${it.label}"
)
debugLogger?.logInvalidEntity(event, formEntity)
}
}
}

Expand All @@ -64,7 +71,7 @@ object LocalEntityUseCases {
entitiesRepository.save(
formEntity.dataset,
Entity.New(
formEntity.id,
formEntity.id!!,
formEntity.label,
1,
formEntity.properties,
Expand All @@ -73,10 +80,7 @@ object LocalEntityUseCases {
)
}
} else {
debugLogger?.log(
"Entities",
"Failed to create dataset=${formEntity.dataset}, id=${formEntity.id}, label=${formEntity.label}"
)
debugLogger?.logInvalidEntity(AnalyticsEvents.ENTITY_CREATE_NO_LABEL, formEntity)
}
}

Expand Down Expand Up @@ -228,3 +232,14 @@ private fun <T> Map<String, T>.removeReservedProperties(): Map<String, T> {
it.key == EntitySchema.ID || it.key == EntitySchema.LABEL || it.key.startsWith("__")
}
}

private fun DebugLogger.logInvalidEntity(event: String, formEntity: FormEntity) {
val action = when (event) {
AnalyticsEvents.ENTITY_CREATE_NO_LABEL -> "create"
AnalyticsEvents.ENTITY_UPDATE_NO_MATCH -> "update"
else -> "create/update"
}
val message = "Failed to $action dataset=${formEntity.dataset}, id=${formEntity.id}, label=${formEntity.label}"

this.logWithAnalytics("Entities", message, event, "form")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.odk.collect.entities.analytics

object AnalyticsEvents {
/**
* Tracks how often an entity update is attempted but no entity with a matching ID is found.
*/
const val ENTITY_UPDATE_NO_MATCH = "EntityUpdateNoMatch"

/**
* Tracks how often an entity creation is attempted but the label is blank.
*/
const val ENTITY_CREATE_NO_LABEL = "EntityCreateNoLabel"

/**
* Tracks how often an entity is defined in a form but has no ID.
*/
const val ENTITY_WITH_NO_ID = "EntityWithNoId"

/**
* Tracks how often an entity is defined in a form but has an invalid ID (not a V4 UUID).
*/
const val ENTITY_WITH_INVALID_ID = "EntityWithInvalidId"
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,4 @@ package org.odk.collect.entities.javarosa.finalization

data class EntitiesExtra(
val entities: List<FormEntity> = emptyList(),
val invalidEntities: List<InvalidEntity> = emptyList()
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import org.javarosa.form.api.FormEntryFinalizationProcessor
import org.javarosa.form.api.FormEntryModel
import org.odk.collect.entities.javarosa.parse.EntityFormExtra
import org.odk.collect.entities.javarosa.parse.SaveTo
import org.odk.collect.entities.javarosa.parse.isV4UUID
import org.odk.collect.entities.javarosa.spec.EntityAction
import org.odk.collect.entities.javarosa.spec.EntityFormParser

Expand Down Expand Up @@ -37,12 +36,7 @@ class EntityFormFinalizationProcessor : FormEntryFinalizationProcessor {
mainInstance
)

if (entity != null) {
extra.copy(entities = extra.entities + entity)
} else {
val invalidEntity = InvalidEntity(dataset, id, label)
extra.copy(invalidEntities = extra.invalidEntities + invalidEntity)
}
extra.copy(entities = extra.entities + entity)
} else {
extra
}
Expand All @@ -60,7 +54,7 @@ class EntityFormFinalizationProcessor : FormEntryFinalizationProcessor {
saveTos: List<SaveTo>,
action: EntityAction,
mainInstance: FormInstance
): FormEntity? {
): FormEntity {
val entityGroupRef = elementRef.getParentRef().getParentRef()
val fields = saveTos.mapNotNull { saveTo ->
if (!entityGroupRef.genericize().equals(saveTo.entityGroupReference)) {
Expand All @@ -79,10 +73,6 @@ class EntityFormFinalizationProcessor : FormEntryFinalizationProcessor {
}
}

return if (id.isV4UUID()) {
FormEntity(action, dataset, id, label, fields)
} else {
null
}
return FormEntity(action, dataset, id, label, fields)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import org.odk.collect.entities.javarosa.spec.EntityAction
data class FormEntity(
@JvmField val action: EntityAction,
@JvmField val dataset: String,
@JvmField val id: String,
@JvmField val id: String?,
@JvmField val label: String,
@JvmField val properties: List<Pair<String, String>>
)

This file was deleted.

Loading