use of org.javarosa.core.model.instance.DataInstance in project javarosa by opendatakit.
the class FormDef method populateDynamicChoices.
/**
* Identify the itemset in the backend model, and create a set of
* SelectChoice objects at the current question reference based on the data
* in the model.
* <p/>
* Will modify the itemset binding to contain the relevant choices
*
* @param itemset The binding for an itemset, where the choices will be populated
* @param curQRef A reference to the current question's element, which will be
* used to determine the values to be chosen from.
*/
public void populateDynamicChoices(ItemsetBinding itemset, TreeReference curQRef) {
getEventNotifier().publishEvent(new Event("Dynamic choices", new EvaluationResult(curQRef, null)));
List<SelectChoice> choices = new ArrayList<SelectChoice>();
List<TreeReference> matches = itemset.nodesetExpr.evalNodeset(this.getMainInstance(), new EvaluationContext(exprEvalContext, itemset.contextRef.contextualize(curQRef)));
DataInstance fi = null;
if (// We're not dealing
itemset.nodesetRef.getInstanceName() != null) // with the default
// instance
{
fi = getNonMainInstance(itemset.nodesetRef.getInstanceName());
if (fi == null) {
throw new XPathException("Instance " + itemset.nodesetRef.getInstanceName() + " not found");
}
} else {
fi = getMainInstance();
}
if (matches == null) {
throw new XPathException("Could not find references depended on by" + itemset.nodesetRef.getInstanceName());
}
for (int i = 0; i < matches.size(); i++) {
TreeReference item = matches.get(i);
// String label =
// itemset.labelExpr.evalReadable(this.getMainInstance(), new
// EvaluationContext(exprEvalContext, item));
String label = itemset.labelExpr.evalReadable(fi, new EvaluationContext(exprEvalContext, item));
String value = null;
TreeElement copyNode = null;
if (itemset.copyMode) {
copyNode = this.getMainInstance().resolveReference(itemset.copyRef.contextualize(item));
}
if (itemset.valueRef != null) {
// value = itemset.valueExpr.evalReadable(this.getMainInstance(),
// new EvaluationContext(exprEvalContext, item));
value = itemset.valueExpr.evalReadable(fi, new EvaluationContext(exprEvalContext, item));
}
// SelectChoice choice = new
// SelectChoice(labelID,labelInnerText,value,isLocalizable);
SelectChoice choice = new SelectChoice(label, value != null ? value : "dynamic:" + i, itemset.labelIsItext);
choice.setIndex(i);
if (itemset.copyMode)
choice.copyNode = copyNode;
choices.add(choice);
}
if (choices.size() == 0) {
// throw new
// RuntimeException("dynamic select question has no choices! [" +
// itemset.nodesetRef + "]");
// When you exit a survey mid way through and want to save it, it seems
// that Collect wants to
// go through all the questions. Well of course not all the questions
// are going to have answers
// to chose from if the user hasn't filled them out. So I'm just going
// to make a note of this
// and not throw an exception.
Std.out.println("Dynamic select question has no choices! [" + itemset.nodesetRef + "]. If this occurs while filling out a form (and not while saving an incomplete form), the filter condition may have eliminated all the choices. Is that what you intended?\n");
}
itemset.clearChoices();
itemset.setChoices(choices, this.getLocalizer());
}
use of org.javarosa.core.model.instance.DataInstance in project javarosa by opendatakit.
the class XFormParserTest method parsesExternalSecondaryInstanceForm.
@Test
public void parsesExternalSecondaryInstanceForm() throws IOException, XPathSyntaxException {
FormDef formDef = parse(EXTERNAL_SECONDARY_INSTANCE_XML).formDef;
assertEquals("Form with external secondary instance", formDef.getTitle());
TreeReference treeReference = ((XPathPathExpr) parseXPath("instance('towns')/data_set")).getReference();
EvaluationContext evaluationContext = formDef.getEvaluationContext();
List<TreeReference> treeReferences = evaluationContext.expandReference(treeReference);
assertEquals(1, treeReferences.size());
DataInstance townInstance = formDef.getNonMainInstance("towns");
AbstractTreeElement tiRoot = townInstance.getRoot();
assertEquals("towndata", tiRoot.getName());
assertEquals(1, tiRoot.getNumChildren());
AbstractTreeElement dataSetChild = tiRoot.getChild("data_set", 0);
assertEquals("us_east", dataSetChild.getValue().getDisplayText());
}
Aggregations