diff --git a/collect_app/src/main/java/org/odk/collect/android/javarosawrapper/InstanceMetadata.java b/collect_app/src/main/java/org/odk/collect/android/javarosawrapper/InstanceMetadata.java deleted file mode 100644 index bc34bd8284f..00000000000 --- a/collect_app/src/main/java/org/odk/collect/android/javarosawrapper/InstanceMetadata.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.odk.collect.android.javarosawrapper; - -import org.odk.collect.android.formentry.audit.AuditConfig; -import org.odk.collect.android.utilities.FormNameUtils; - -/** - * OpenRosa metadata of a form instance. - *

- * Contains the values for the required metadata - * fields and nothing else. - * - * @author mitchellsundt@gmail.com - */ -public class InstanceMetadata { - public final String instanceId; - public final String instanceName; - public final AuditConfig auditConfig; - - public InstanceMetadata(String instanceId, String instanceName, AuditConfig auditConfig) { - this.instanceId = instanceId; - this.instanceName = FormNameUtils.normalizeFormName(instanceName, false); - this.auditConfig = auditConfig; - } -} diff --git a/collect_app/src/main/java/org/odk/collect/android/javarosawrapper/InstanceMetadata.kt b/collect_app/src/main/java/org/odk/collect/android/javarosawrapper/InstanceMetadata.kt new file mode 100644 index 00000000000..bd602aa9576 --- /dev/null +++ b/collect_app/src/main/java/org/odk/collect/android/javarosawrapper/InstanceMetadata.kt @@ -0,0 +1,12 @@ +package org.odk.collect.android.javarosawrapper + +import org.odk.collect.android.formentry.audit.AuditConfig +import org.odk.collect.android.utilities.FormNameUtils + +data class InstanceMetadata( + @JvmField val instanceId: String?, + private val rawInstanceName: String?, + @JvmField val auditConfig: AuditConfig? +) { + @JvmField val instanceName: String? = FormNameUtils.normalizeFormName(rawInstanceName, false) +} diff --git a/collect_app/src/main/java/org/odk/collect/android/javarosawrapper/JavaRosaFormController.java b/collect_app/src/main/java/org/odk/collect/android/javarosawrapper/JavaRosaFormController.java index b46fdee5d9b..ab58fda76a8 100644 --- a/collect_app/src/main/java/org/odk/collect/android/javarosawrapper/JavaRosaFormController.java +++ b/collect_app/src/main/java/org/odk/collect/android/javarosawrapper/JavaRosaFormController.java @@ -1010,76 +1010,41 @@ public ByteArrayPayload getSubmissionXml() throws IOException { getSubmissionDataReference()); } - /** - * Traverse the submission looking for the first matching tag in depth-first order. - */ - private TreeElement findDepthFirst(TreeElement parent, String name) { - int len = parent.getNumChildren(); - for (int i = 0; i < len; ++i) { - TreeElement e = parent.getChildAt(i); - if (name.equals(e.getName())) { - return e; - } else if (e.getNumChildren() != 0) { - TreeElement v = findDepthFirst(e, name); - if (v != null) { - return v; - } - } - } - return null; - } - public InstanceMetadata getSubmissionMetadata() { FormDef formDef = formEntryController.getModel().getForm(); TreeElement rootElement = formDef.getInstance().getRoot(); - - TreeElement trueSubmissionElement; - // Determine the information about the submission... - SubmissionProfile p = formDef.getSubmissionProfile(); - if (p == null || p.getRef() == null) { - trueSubmissionElement = rootElement; - } else { - IDataReference ref = p.getRef(); - trueSubmissionElement = formDef.getInstance().resolveReference(ref); - // resolveReference returns null if the reference is to the root element... - if (trueSubmissionElement == null) { - trueSubmissionElement = rootElement; - } - } - - // and find the depth-first meta block in this... - TreeElement e = findDepthFirst(trueSubmissionElement, "meta"); + TreeElement meta = rootElement.getFirstChild("meta"); String instanceId = null; String instanceName = null; AuditConfig auditConfig = null; - if (e != null) { - List v; + if (meta != null) { + List metaElements; // instance id... - v = e.getChildrenWithName(INSTANCE_ID); - if (v.size() == 1) { - IAnswerData sa = v.get(0).getValue(); + metaElements = meta.getChildrenWithName(INSTANCE_ID); + if (metaElements.size() == 1) { + IAnswerData sa = metaElements.get(0).getValue(); if (sa != null) { instanceId = sa.getDisplayText(); } } // instance name... - v = e.getChildrenWithName(INSTANCE_NAME); - if (v.size() == 1) { - IAnswerData sa = v.get(0).getValue(); + metaElements = meta.getChildrenWithName(INSTANCE_NAME); + if (metaElements.size() == 1) { + IAnswerData sa = metaElements.get(0).getValue(); if (sa != null) { instanceName = sa.getDisplayText(); } } // timing element... - v = e.getChildrenWithName(AUDIT); - if (v.size() == 1) { + metaElements = meta.getChildrenWithName(AUDIT); + if (metaElements.size() == 1) { - TreeElement auditElement = v.get(0); + TreeElement auditElement = metaElements.get(0); String locationPriority = auditElement.getBindAttributeValue(XML_OPENDATAKIT_NAMESPACE, "location-priority"); String locationMinInterval = auditElement.getBindAttributeValue(XML_OPENDATAKIT_NAMESPACE, "location-min-interval"); diff --git a/collect_app/src/test/java/org/odk/collect/android/javarosawrapper/FormControllerTest.java b/collect_app/src/test/java/org/odk/collect/android/javarosawrapper/FormControllerTest.java index 7e6236b51c5..c555ad00b89 100644 --- a/collect_app/src/test/java/org/odk/collect/android/javarosawrapper/FormControllerTest.java +++ b/collect_app/src/test/java/org/odk/collect/android/javarosawrapper/FormControllerTest.java @@ -121,6 +121,11 @@ public void whenInstanceFileAndAuditConfigNull_getAuditEventLogger_isNotNull() t assertThat(formController.getAuditEventLogger(), notNullValue()); } + @Test + public void getSubmissionMetadata_usesTopLevelMeta_whenMultipleMetaSectionsExist() throws Exception { + FormController formController = createFormController(MULTIPLE_META_SECTIONS); + assertThat(formController.getSubmissionMetadata().instanceName, is(notNullValue())); + } //region indexIsInFieldList @Test @@ -149,6 +154,7 @@ private FormController createFormController(String xform) throws IOException, XF ByteArrayInputStream inputStream = new ByteArrayInputStream(xform.getBytes()); final FormEntryModel fem = new FormEntryModel(XFormUtils.getFormFromInputStream(inputStream)); final FormEntryController formEntryController = new FormEntryController(fem); + formEntryController.getModel().getForm().initialize(true, null); return new JavaRosaFormController(Files.createTempDir(), formEntryController, File.createTempFile("instance", "")); } @@ -293,4 +299,40 @@ private FormController createFormController(String xform) throws IOException, XF " \n" + " \n" + "\n"; + + private static final String MULTIPLE_META_SECTIONS = "\n" + + "\n" + + " \n" + + " Multiple meta sections\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " xxx\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n"; }