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
Expand Up @@ -17,12 +17,13 @@ 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.LocalEntityUseCases
import org.odk.collect.entities.debug.EntityEvent
import org.odk.collect.entities.storage.EntitiesRepository
import org.odk.collect.forms.Form
import org.odk.collect.forms.FormsRepository
import org.odk.collect.forms.instances.Instance
import org.odk.collect.forms.instances.InstancesRepository
import org.odk.collect.shared.DebugLogger
import org.odk.collect.shared.debug.DebugLogger
import java.io.File

object FormEntryUseCases {
Expand Down Expand Up @@ -124,7 +125,7 @@ object FormEntryUseCases {
formController: FormController,
instancesRepository: InstancesRepository,
entitiesRepository: EntitiesRepository,
debugLogger: DebugLogger
debugLogger: DebugLogger<EntityEvent>
): Instance? {
val instance =
getInstanceFromFormController(formController, instancesRepository)!!
Expand Down Expand Up @@ -159,7 +160,7 @@ object FormEntryUseCases {
formController: FormController,
instancesRepository: InstancesRepository,
entitiesRepository: EntitiesRepository,
debugLogger: DebugLogger
debugLogger: DebugLogger<EntityEvent>
): Instance? {
formController.finalizeForm()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import org.odk.collect.android.utilities.MediaUtils;
import org.odk.collect.entities.storage.EntitiesRepository;
import org.odk.collect.forms.instances.InstancesRepository;
import org.odk.collect.shared.DebugLogger;
import org.odk.collect.shared.debug.DebugLogger;

import java.util.ArrayList;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
import org.odk.collect.forms.instances.InstancesRepository;
import org.odk.collect.forms.savepoints.SavepointsRepository;
import org.odk.collect.material.MaterialProgressDialogFragment;
import org.odk.collect.shared.DebugLogger;
import org.odk.collect.shared.debug.DebugLogger;
import org.odk.collect.shared.strings.Md5;
import org.odk.collect.utilities.Result;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import org.odk.collect.android.utilities.MediaUtils;
import org.odk.collect.entities.storage.EntitiesRepository;
import org.odk.collect.forms.instances.InstancesRepository;
import org.odk.collect.shared.DebugLogger;
import org.odk.collect.shared.debug.DebugLogger;

import java.util.ArrayList;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,18 @@ package org.odk.collect.android.injection.config

import org.odk.collect.android.entities.EntitiesRepositoryProvider
import org.odk.collect.android.formmanagement.OpenRosaClientProvider
import org.odk.collect.android.projects.FileDebugLogger
import org.odk.collect.android.projects.ProjectDependencyModule
import org.odk.collect.android.storage.StoragePathProvider
import org.odk.collect.android.storage.StoragePaths
import org.odk.collect.android.utilities.ChangeLockProvider
import org.odk.collect.android.utilities.FormsRepositoryProvider
import org.odk.collect.android.utilities.InstancesRepositoryProvider
import org.odk.collect.android.utilities.SavepointsRepositoryProvider
import org.odk.collect.entities.debug.EntitiesDebugLogger
import org.odk.collect.entities.debug.EntityEvent
import org.odk.collect.projects.ProjectDependencyFactory
import org.odk.collect.settings.SettingsProvider
import org.odk.collect.shared.DebugLogger
import org.odk.collect.shared.debug.DebugLogger
import java.io.File
import javax.inject.Inject

Expand Down Expand Up @@ -44,8 +45,8 @@ class ProjectDependencyModuleFactory @Inject constructor(
}

private class DebugLoggerFactory(private val storagePathProvider: ProjectDependencyFactory<StoragePaths>) :
ProjectDependencyFactory<DebugLogger> {
override fun create(projectId: String): DebugLogger {
return FileDebugLogger(File(storagePathProvider.create(projectId).rootDir, "debug.log"))
ProjectDependencyFactory<DebugLogger<EntityEvent>> {
override fun create(projectId: String): DebugLogger<EntityEvent> {
return EntitiesDebugLogger(File(storagePathProvider.create(projectId).rootDir, "debug.log"))
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.odk.collect.android.projects

import org.odk.collect.android.storage.StoragePaths
import org.odk.collect.android.utilities.ChangeLocks
import org.odk.collect.entities.debug.EntityEvent
import org.odk.collect.entities.server.EntitySource
import org.odk.collect.entities.storage.EntitiesRepository
import org.odk.collect.forms.FormSource
Expand All @@ -10,7 +11,7 @@ import org.odk.collect.forms.instances.InstancesRepository
import org.odk.collect.forms.savepoints.SavepointsRepository
import org.odk.collect.projects.ProjectDependencyFactory
import org.odk.collect.projects.projectDependency
import org.odk.collect.shared.DebugLogger
import org.odk.collect.shared.debug.DebugLogger
import org.odk.collect.shared.settings.Settings

/**
Expand All @@ -28,7 +29,7 @@ data class ProjectDependencyModule(
private val savepointsRepositoryFactory: ProjectDependencyFactory<SavepointsRepository>,
private val entitiesRepositoryFactory: ProjectDependencyFactory<EntitiesRepository>,
private val entitySourceFactory: ProjectDependencyFactory<EntitySource>,
private val debugLoggerFactory: ProjectDependencyFactory<DebugLogger>
private val debugLoggerFactory: ProjectDependencyFactory<DebugLogger<EntityEvent>>
) {
val generalSettings by projectDependency(projectId, settingsFactory)
val formsRepository by projectDependency(projectId, formsRepositoryFactory)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
import org.odk.collect.forms.instances.Instance;
import org.odk.collect.forms.instances.InstancesRepository;
import org.odk.collect.maps.MapPoint;
import org.odk.collect.shared.DebugLogger;
import org.odk.collect.shared.debug.DebugLogger;
import org.odk.collect.shared.files.FileExt;

import java.io.File;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
import org.odk.collect.formstest.InMemInstancesRepository;
import org.odk.collect.formstest.InMemSavepointsRepository;
import org.odk.collect.projects.Project;
import org.odk.collect.shared.DebugLogger;
import org.odk.collect.shared.debug.DebugLogger;
import org.odk.collect.shared.TempFiles;
import org.odk.collect.testshared.FakeScheduler;
import org.odk.collect.utilities.Result;
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,16 +2,18 @@ package org.odk.collect.entities

import org.apache.commons.csv.CSVRecord
import org.javarosa.core.model.instance.SecondaryInstanceCSVParserBuilder
import org.odk.collect.entities.debug.EntityEvent
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
import org.odk.collect.entities.storage.Entity
import org.odk.collect.entities.storage.findEntityById
import org.odk.collect.forms.MediaFile
import org.odk.collect.shared.DebugLogger
import org.odk.collect.shared.debug.DebugLogger
import java.io.File
import java.util.UUID

Expand All @@ -21,50 +23,55 @@ object LocalEntityUseCases {
fun updateLocalEntitiesFromForm(
formEntities: EntitiesExtra?,
entitiesRepository: EntitiesRepository,
debugLogger: DebugLogger? = null
debugLogger: DebugLogger<EntityEvent>? = 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?.log(EntityEvent.UpdateNoMatch(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()) {
EntityEvent.NoId(formEntity)
} else {
EntityEvent.InvalidId(formEntity)
}

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

private fun saveNewEntity(
formEntity: FormEntity,
entitiesRepository: EntitiesRepository,
debugLogger: DebugLogger? = null
debugLogger: DebugLogger<EntityEvent>? = null
) {
if (formEntity.label.isNotBlank()) {
val list = entitiesRepository.getList(formEntity.dataset)
if (list != null && !list.needsApproval) {
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?.log(EntityEvent.CreateNoLabel(formEntity))
}
}

Expand Down
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
@@ -0,0 +1,44 @@
package org.odk.collect.entities.debug

import org.odk.collect.analytics.Analytics
import org.odk.collect.entities.BuildConfig
import org.odk.collect.entities.analytics.AnalyticsEvents
import org.odk.collect.shared.debug.DebugLogger
import java.io.File
import java.time.LocalDateTime

/**
* A [DebugLogger] that writes each [EntityEvent] both as a line in a debug log file (in debug
* builds) and as an analytics event.
*/
class EntitiesDebugLogger(private val file: File) : DebugLogger<EntityEvent> {

override fun log(event: EntityEvent) {
if (BuildConfig.DEBUG) {
val line = "${LocalDateTime.now()} Entities \"${getLogMessage(event)}\"\n"
file.appendText(line)
}

Analytics.log(getAnalyticsEvent(event), "form")
}

private fun getLogMessage(event: EntityEvent): String {
val action = when (event) {
is EntityEvent.CreateNoLabel -> "create"
is EntityEvent.UpdateNoMatch -> "update"
is EntityEvent.NoId, is EntityEvent.InvalidId -> "create/update"
}

val formEntity = event.formEntity
return "Failed to $action dataset=${formEntity.dataset}, id=${formEntity.id}, label=${formEntity.label}"
}

private fun getAnalyticsEvent(event: EntityEvent): String {
return when (event) {
is EntityEvent.CreateNoLabel -> AnalyticsEvents.ENTITY_CREATE_NO_LABEL
is EntityEvent.UpdateNoMatch -> AnalyticsEvents.ENTITY_UPDATE_NO_MATCH
is EntityEvent.NoId -> AnalyticsEvents.ENTITY_WITH_NO_ID
is EntityEvent.InvalidId -> AnalyticsEvents.ENTITY_WITH_INVALID_ID
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.odk.collect.entities.debug

import org.odk.collect.entities.javarosa.finalization.FormEntity

sealed class EntityEvent {

abstract val formEntity: FormEntity

data class CreateNoLabel(override val formEntity: FormEntity) : EntityEvent()

data class UpdateNoMatch(override val formEntity: FormEntity) : EntityEvent()

data class NoId(override val formEntity: FormEntity) : EntityEvent()

data class InvalidId(override val formEntity: FormEntity) : EntityEvent()
}
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()
)
Loading