Skip to content

Commit 6ce1352

Browse files
authored
Merge pull request #802 from grzesiek2010/fixed_partial_elements
Fixed detecting partial elements that should be populated
2 parents 3efbb35 + 4102e51 commit 6ce1352

File tree

2 files changed

+65
-34
lines changed

2 files changed

+65
-34
lines changed

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,6 @@ public T resolveReference(TreeReference ref) {
8181
AbstractTreeElement<T> node = getBase();
8282
T result = null;
8383
for (int i = 0; i < ref.size(); i++) {
84-
if (node instanceof TreeElement && ((TreeElement) node).isPartial()) {
85-
throw new PartialElementEncounteredException();
86-
}
87-
8884
String name = ref.getName(i);
8985
int mult = ref.getMultiplicity(i);
9086

@@ -110,7 +106,13 @@ public T resolveReference(TreeReference ref) {
110106
}
111107
}
112108

113-
return (node == getBase() ? null : result); // never return a reference to '/'
109+
if (node == getBase() || result == null) {
110+
return null; // never return a reference to '/'
111+
} else if (((TreeElement) result).isPartial()) {
112+
throw new PartialElementEncounteredException();
113+
} else {
114+
return result;
115+
}
114116
}
115117

116118
public List<AbstractTreeElement<T>> explodeReference(TreeReference ref) {

src/test/java/org/javarosa/plugins/InstancePluginTest.java

Lines changed: 58 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -83,24 +83,39 @@ public void instanceProvider_supportsPartialElements() throws IOException, XForm
8383
assertThat(fakeInstance.getRoot().getNumChildren(), equalTo(2));
8484

8585
TreeElement firstItem = (TreeElement) fakeInstance.getRoot().getChild("item", 0);
86-
assertThat(firstItem.isPartial(), equalTo(true));
86+
assertThat(firstItem.isPartial(), equalTo(false));
8787
assertThat(firstItem.getNumChildren(), equalTo(2));
8888
assertThat(firstItem.getChildAt(0).getName(), equalTo("value"));
89-
assertThat(firstItem.getChildAt(0).getValue(), equalTo(null));
89+
assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0")));
9090
assertThat(firstItem.getChildAt(1).getName(), equalTo("label"));
91-
assertThat(firstItem.getChildAt(1).getValue(), equalTo(null));
91+
assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0")));
92+
93+
TreeElement secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1);
94+
assertThat(secondItem.isPartial(), equalTo(true));
95+
assertThat(secondItem.getNumChildren(), equalTo(0));
9296

9397
List<SelectChoice> selectChoices = scenario.choicesOf("/data/question");
9498
assertThat(selectChoices.size(), equalTo(2));
95-
99+
assertThat(selectChoices.get(0).getLabelInnerText(), equalTo("Item 0"));
96100
assertThat(selectChoices.get(0).getValue(), equalTo("0"));
101+
assertThat(selectChoices.get(1).getLabelInnerText(), equalTo("Item 1"));
102+
assertThat(selectChoices.get(1).getValue(), equalTo("1"));
103+
97104
firstItem = (TreeElement) fakeInstance.getRoot().getChild("item", 0);
98105
assertThat(firstItem.isPartial(), equalTo(false));
99106
assertThat(firstItem.getNumChildren(), equalTo(2));
100107
assertThat(firstItem.getChildAt(0).getName(), equalTo("value"));
101108
assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0")));
102109
assertThat(firstItem.getChildAt(1).getName(), equalTo("label"));
103110
assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0")));
111+
112+
secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1);
113+
assertThat(secondItem.isPartial(), equalTo(false));
114+
assertThat(secondItem.getNumChildren(), equalTo(2));
115+
assertThat(secondItem.getChildAt(0).getName(), equalTo("value"));
116+
assertThat(secondItem.getChildAt(0).getValue(), equalTo(new StringData("1")));
117+
assertThat(secondItem.getChildAt(1).getName(), equalTo("label"));
118+
assertThat(secondItem.getChildAt(1).getValue(), equalTo(new StringData("Item 1")));
104119
}
105120

106121
@Test
@@ -137,24 +152,39 @@ public void fileInstanceParser_supportsPartialElements() throws IOException, XFo
137152
assertThat(fakeInstance.getRoot().getNumChildren(), equalTo(2));
138153

139154
TreeElement firstItem = (TreeElement) fakeInstance.getRoot().getChild("item", 0);
140-
assertThat(firstItem.isPartial(), equalTo(true));
155+
assertThat(firstItem.isPartial(), equalTo(false));
141156
assertThat(firstItem.getNumChildren(), equalTo(2));
142157
assertThat(firstItem.getChildAt(0).getName(), equalTo("value"));
143-
assertThat(firstItem.getChildAt(0).getValue(), equalTo(null));
158+
assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0")));
144159
assertThat(firstItem.getChildAt(1).getName(), equalTo("label"));
145-
assertThat(firstItem.getChildAt(1).getValue(), equalTo(null));
160+
assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0")));
161+
162+
TreeElement secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1);
163+
assertThat(secondItem.isPartial(), equalTo(true));
164+
assertThat(secondItem.getNumChildren(), equalTo(0));
146165

147166
List<SelectChoice> selectChoices = scenario.choicesOf("/data/question");
148167
assertThat(selectChoices.size(), equalTo(2));
149-
168+
assertThat(selectChoices.get(0).getLabelInnerText(), equalTo("Item 0"));
150169
assertThat(selectChoices.get(0).getValue(), equalTo("0"));
170+
assertThat(selectChoices.get(1).getLabelInnerText(), equalTo("Item 1"));
171+
assertThat(selectChoices.get(1).getValue(), equalTo("1"));
172+
151173
firstItem = (TreeElement) fakeInstance.getRoot().getChild("item", 0);
152174
assertThat(firstItem.isPartial(), equalTo(false));
153175
assertThat(firstItem.getNumChildren(), equalTo(2));
154176
assertThat(firstItem.getChildAt(0).getName(), equalTo("value"));
155177
assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0")));
156178
assertThat(firstItem.getChildAt(1).getName(), equalTo("label"));
157179
assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0")));
180+
181+
secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1);
182+
assertThat(secondItem.isPartial(), equalTo(false));
183+
assertThat(secondItem.getNumChildren(), equalTo(2));
184+
assertThat(secondItem.getChildAt(0).getName(), equalTo("value"));
185+
assertThat(secondItem.getChildAt(0).getValue(), equalTo(new StringData("1")));
186+
assertThat(secondItem.getChildAt(1).getName(), equalTo("label"));
187+
assertThat(secondItem.getChildAt(1).getValue(), equalTo(new StringData("Item 1")));
158188
}
159189

160190
@Test
@@ -189,29 +219,26 @@ public void supportsReplacingPartialElements() throws IOException, XFormParser.P
189219
HashMap<String, DataInstance> instances = scenario.getFormDef().getFormInstances();
190220
DataInstance fakeInstance = instances.get("fake-instance");
191221

192-
TreeElement item = new TreeElement("item", 0);
222+
TreeElement secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1);
223+
assertThat(secondItem.isPartial(), equalTo(true));
224+
assertThat(secondItem.getNumChildren(), equalTo(0));
225+
226+
TreeElement item = new TreeElement("item", 1);
193227
TreeElement value = new TreeElement("value");
194228
TreeElement label = new TreeElement("label");
195-
value.setValue(new StringData("0"));
196-
label.setValue(new StringData("Item 0"));
229+
value.setValue(new StringData("1"));
230+
label.setValue(new StringData("Item 1"));
197231
item.addChild(value);
198232
item.addChild(label);
199233
fakeInstance.replacePartialElements(asList(item));
200234

201-
TreeElement firstItem = (TreeElement) fakeInstance.getRoot().getChild("item", 0);
202-
assertThat(firstItem.isPartial(), equalTo(false));
203-
assertThat(firstItem.getNumChildren(), equalTo(2));
204-
assertThat(firstItem.getChildAt(0).getName(), equalTo("value"));
205-
assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0")));
206-
assertThat(firstItem.getChildAt(1).getName(), equalTo("label"));
207-
assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0")));
208-
TreeElement secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1);
209-
assertThat(secondItem.isPartial(), equalTo(true));
235+
secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1);
236+
assertThat(secondItem.isPartial(), equalTo(false));
210237
assertThat(secondItem.getNumChildren(), equalTo(2));
211238
assertThat(secondItem.getChildAt(0).getName(), equalTo("value"));
212-
assertThat(secondItem.getChildAt(0).getValue(), equalTo(null));
239+
assertThat(secondItem.getChildAt(0).getValue(), equalTo(new StringData("1")));
213240
assertThat(secondItem.getChildAt(1).getName(), equalTo("label"));
214-
assertThat(secondItem.getChildAt(1).getValue(), equalTo(null));
241+
assertThat(secondItem.getChildAt(1).getValue(), equalTo(new StringData("Item 1")));
215242
}
216243

217244
@Test
@@ -327,21 +354,23 @@ public boolean isSupported(@NotNull String instanceId, @NotNull String instanceS
327354
}
328355

329356
private @NotNull TreeElement createRoot(boolean partial) {
330-
boolean isPartial = partialParse && partial;
331357
TreeElement root = new TreeElement("root", 0);
332358

333359
for (int i = 0; i < items.size(); i++) {
334-
TreeElement value = new TreeElement("value");
335-
TreeElement label = new TreeElement("label");
360+
boolean isPartial = partialParse && partial && i != 0;
361+
362+
TreeElement item = new TreeElement("item", i, isPartial);
336363

337364
if (!isPartial) {
365+
TreeElement value = new TreeElement("value");
366+
TreeElement label = new TreeElement("label");
367+
338368
value.setValue(new StringData(items.get(i).getFirst()));
339369
label.setValue(new StringData(items.get(i).getSecond()));
340-
}
341370

342-
TreeElement item = new TreeElement("item", i, isPartial);
343-
item.addChild(value);
344-
item.addChild(label);
371+
item.addChild(value);
372+
item.addChild(label);
373+
}
345374

346375
root.addChild(item);
347376
}

0 commit comments

Comments
 (0)