Skip to content

Commit 65b52b3

Browse files
authored
Merge pull request #819 from grzesiek2010/form_state
Add `deprecatedID` and update `instanceID` when editing a finalized form.
2 parents 7986aba + 2f45b69 commit 65b52b3

File tree

13 files changed

+140
-135
lines changed

13 files changed

+140
-135
lines changed

src/main/java/org/javarosa/core/model/FormDef.java

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,14 @@
2929
import org.javarosa.core.model.data.IAnswerData;
3030
import org.javarosa.core.model.data.MultipleItemsData;
3131
import org.javarosa.core.model.data.SelectOneData;
32+
import org.javarosa.core.model.data.StringData;
3233
import org.javarosa.core.model.data.helper.AnswerDataUtil;
3334
import org.javarosa.core.model.data.helper.Selection;
3435
import org.javarosa.core.model.instance.DataInstance;
3536
import org.javarosa.core.model.instance.ExternalDataInstance;
3637
import org.javarosa.core.model.instance.FormInstance;
37-
import org.javarosa.core.model.instance.InstanceInitializationFactory;
3838
import org.javarosa.core.model.instance.InvalidReferenceException;
39+
import org.javarosa.core.model.instance.InstanceInitializationFactory;
3940
import org.javarosa.core.model.instance.TreeElement;
4041
import org.javarosa.core.model.instance.TreeReference;
4142
import org.javarosa.core.model.utils.QuestionPreloader;
@@ -44,6 +45,7 @@
4445
import org.javarosa.core.services.storage.IMetaData;
4546
import org.javarosa.core.services.storage.Persistable;
4647
import org.javarosa.core.util.Extras;
48+
import org.javarosa.core.util.PropertyUtils;
4749
import org.javarosa.core.util.externalizable.DeserializationException;
4850
import org.javarosa.core.util.externalizable.ExtUtil;
4951
import org.javarosa.core.util.externalizable.ExtWrapListPoly;
@@ -1085,23 +1087,48 @@ private static void getElementsFromReferences(Set<TreeReference> referencesRemai
10851087
*
10861088
* @param newInstance true if the form is to be used for a new entry interaction,
10871089
* false if it is using an existing IDataModel
1090+
*
1091+
* @deprecated Use {@link #initialize(FormInitializationMode)} instead.
10881092
*/
1093+
@Deprecated
10891094
public void initialize(boolean newInstance, InstanceInitializationFactory factory) {
1095+
initialize(newInstance ? FormInitializationMode.NEW_FORM : FormInitializationMode.DRAFT_FORM_EDIT);
1096+
}
1097+
1098+
/**
1099+
* meant to be called after deserialization and initialization of handlers
1100+
*
1101+
* @param formInitializationMode The mode in which the form is being initialized.
1102+
* See {@link FormInitializationMode] for available options.
1103+
* Note: {@link FormInitializationMode#FINALIZED_FORM_EDIT} populates `deprecatedId`.
1104+
*/
1105+
public void initialize(FormInitializationMode formInitializationMode) {
10901106
HashMap<String, DataInstance> formInstances = getFormInstances();
10911107
for (String instanceId : formInstances.keySet()) {
10921108
DataInstance instance = formInstances.get(instanceId);
1093-
instance.initialize(factory, instanceId);
1109+
instance.initialize(instanceId);
10941110
}
1095-
if (newInstance) {// only preload new forms (we may have to revisit
1096-
// this)
1111+
if (formInitializationMode == FormInitializationMode.NEW_FORM) {
1112+
// Preload data only for new forms. Existing forms should retain their current state.
10971113
preloadInstance(mainInstance.getRoot());
1114+
} else if (formInitializationMode == FormInitializationMode.FINALIZED_FORM_EDIT) {
1115+
TreeElement metaSection = mainInstance.getRoot().getFirstChild("meta");
1116+
if (metaSection != null) {
1117+
TreeElement instanceId = metaSection.getFirstChild("instanceID");
1118+
if (instanceId != null) {
1119+
TreeElement deprecatedId = new TreeElement("deprecatedID");
1120+
metaSection.addChild(deprecatedId);
1121+
deprecatedId.setAnswer(instanceId.getValue());
1122+
instanceId.setAnswer(new StringData("uuid:" + PropertyUtils.genUUID()));
1123+
}
1124+
}
10981125
}
10991126

11001127
if (getLocalizer() != null && getLocalizer().getLocale() == null) {
11011128
getLocalizer().setToDefault();
11021129
}
11031130

1104-
if (newInstance) {
1131+
if (formInitializationMode == FormInitializationMode.NEW_FORM) {
11051132
actionController.triggerActionsFromEvent(Actions.EVENT_ODK_INSTANCE_FIRST_LOAD, elementsWithActionTriggeredByToplevelEvent, this);
11061133

11071134
// xforms-ready is marked as deprecated as of JavaRosa 2.14.0 but is still dispatched for compatibility with
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.javarosa.core.model;
2+
3+
public enum FormInitializationMode {
4+
NEW_FORM, DRAFT_FORM_EDIT, FINALIZED_FORM_EDIT
5+
}

src/main/java/org/javarosa/core/model/instance/DataInstance.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ public void setID(int recordid) {
303303

304304

305305

306-
public abstract void initialize(InstanceInitializationFactory initializer, String instanceId);
306+
public abstract void initialize(String instanceId);
307307

308308
public void replacePartialElements(List<TreeElement> elements) {
309309
for (TreeElement element : elements) {

src/main/java/org/javarosa/core/model/instance/ExternalDataInstance.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ private void setRoot(TreeElement topLevel) {
116116
}
117117

118118
@Override
119-
public void initialize(InstanceInitializationFactory initializer, String instanceId) {
119+
public void initialize(String instanceId) {
120120
}
121121

122122
@Override

src/main/java/org/javarosa/core/model/instance/FormInstance.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ public static boolean isHomogeneous(TreeElement a, TreeElement b) {
387387
}
388388
}
389389

390-
public void initialize(InstanceInitializationFactory initializer, String instanceId) {
390+
public void initialize(String instanceId) {
391391
setInstanceId(instanceId);
392392
root.setInstanceName(instanceId);
393393
}

src/main/java/org/javarosa/core/model/instance/InstanceInitializationFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ public class InstanceInitializationFactory {
1111
public AbstractTreeElement generateRoot(DataInstance instance) {
1212
return null;
1313
}
14-
}
14+
}

src/main/java/org/javarosa/model/xform/DataModelSerializer.java

Lines changed: 0 additions & 107 deletions
This file was deleted.

src/main/java/org/javarosa/test/Scenario.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@
3535
import org.javarosa.core.model.data.StringData;
3636
import org.javarosa.core.model.data.helper.Selection;
3737
import org.javarosa.core.model.instance.FormInstance;
38-
import org.javarosa.core.model.instance.InstanceInitializationFactory;
3938
import org.javarosa.core.model.instance.TreeElement;
4039
import org.javarosa.core.model.instance.TreeReference;
40+
import org.javarosa.core.model.FormInitializationMode;
4141
import org.javarosa.core.services.PrototypeManager;
4242
import org.javarosa.core.services.locale.Localizer;
4343
import org.javarosa.core.services.storage.StorageManager;
@@ -143,20 +143,20 @@ private Scenario(FormDef formDef, Function<FormDef, FormEntryController> control
143143
this.blankInstance = blankInstance;
144144
}
145145

146-
private static Scenario from(FormDef formDef, boolean newInstance) {
147-
return from(formDef, newInstance, formDef1 -> new FormEntryController(new FormEntryModel(formDef1)));
146+
public static Scenario from(FormDef formDef, FormInitializationMode formInitializationMode) {
147+
return from(formDef, formInitializationMode, formDef1 -> new FormEntryController(new FormEntryModel(formDef1)));
148148
}
149149

150-
private static Scenario from(FormDef formDef, boolean newInstance, Function<FormDef, FormEntryController> controllerSupplier) {
150+
private static Scenario from(FormDef formDef, FormInitializationMode formInitializationMode, Function<FormDef, FormEntryController> controllerSupplier) {
151151
Scenario scenario = new Scenario(formDef, controllerSupplier, formDef.getEvaluationContext(), formDef.getMainInstance().clone());
152-
scenario.init(newInstance);
152+
scenario.init(formInitializationMode);
153153
return scenario;
154154
}
155155

156-
public void init(boolean newInstance) {
156+
public void init(FormInitializationMode formInitializationMode) {
157157
controller = controllerSupplier.apply(formDef);
158158
model = controller.getModel();
159-
formDef.initialize(newInstance, new InstanceInitializationFactory());
159+
formDef.initialize(formInitializationMode);
160160
}
161161

162162
// region Miscellaneous
@@ -239,7 +239,7 @@ public static TreeReference getRef(String xpath) {
239239
*/
240240
public void newInstance() {
241241
formDef.setInstance(blankInstance.clone());
242-
init(true);
242+
init(FormInitializationMode.NEW_FORM);
243243
evaluationContext = formDef.getEvaluationContext();
244244
}
245245

@@ -284,7 +284,7 @@ public Scenario serializeAndDeserializeForm() throws IOException, Deserializatio
284284
);
285285

286286
tempFile.delete();
287-
return Scenario.from(deserializedFormDef, false);
287+
return Scenario.from(deserializedFormDef, FormInitializationMode.DRAFT_FORM_EDIT);
288288
}
289289

290290
// The fact that we need to pass in the same raw form definition that the current scenario is built around suggests
@@ -302,7 +302,7 @@ public Scenario serializeAndDeserializeInstance(XFormsElement form) throws IOExc
302302
XFormParser parser = new XFormParser(formReader, instanceReader);
303303
FormDef restoredFormDef = parser.parse();
304304

305-
return Scenario.from(restoredFormDef, false);
305+
return Scenario.from(restoredFormDef, FormInitializationMode.DRAFT_FORM_EDIT);
306306
}
307307

308308
/**
@@ -476,16 +476,16 @@ public static Scenario init(String formFileName) throws XFormParser.ParseExcepti
476476
*/
477477
public static Scenario init(File formFile) throws XFormParser.ParseException {
478478
FormDef formDef = createFormDef(formFile);
479-
return Scenario.from(formDef, true);
479+
return Scenario.from(formDef, FormInitializationMode.NEW_FORM);
480480
}
481481

482482
private static Scenario init(File formFile, Function<FormDef, FormEntryController> controllerSupplier) throws XFormParser.ParseException {
483483
FormDef formDef = createFormDef(formFile);
484-
return Scenario.from(formDef, true, controllerSupplier);
484+
return Scenario.from(formDef, FormInitializationMode.NEW_FORM, controllerSupplier);
485485
}
486486

487487
public static Scenario init(FormDef formDef) throws XFormParser.ParseException {
488-
return Scenario.from(formDef, true);
488+
return Scenario.from(formDef, FormInitializationMode.NEW_FORM);
489489
}
490490

491491
@NotNull

src/main/java/org/javarosa/test/XFormsElement.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ static XFormsElement mainInstance(XFormsElement... children) {
128128
return t("instance", children);
129129
}
130130

131+
static XFormsElement meta(XFormsElement... children) {
132+
return t("meta", children);
133+
}
134+
131135
static XFormsElement instance(String name, XFormsElement... children) {
132136
return t("instance id=\"" + name + "\"", t("root", children));
133137
}

src/test/java/org/javarosa/core/model/condition/RecalculateTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import org.javarosa.core.model.FormDef;
77
import org.javarosa.core.model.FormIndex;
8-
import org.javarosa.core.model.instance.InstanceInitializationFactory;
8+
import org.javarosa.core.model.FormInitializationMode;
99
import org.javarosa.test.FormParseInit;
1010
import org.javarosa.form.api.FormEntryPrompt;
1111
import org.javarosa.xform.parse.XFormParser;
@@ -18,7 +18,7 @@ public class RecalculateTest {
1818
public void setUp() throws XFormParser.ParseException {
1919
FormParseInit fpi = new FormParseInit(r("calculate-now.xml"));
2020
formDef = fpi.getFormDef();
21-
formDef.initialize(true, new InstanceInitializationFactory());
21+
formDef.initialize(FormInitializationMode.NEW_FORM);
2222
}
2323

2424
@Test

0 commit comments

Comments
 (0)