use of org.javarosa.core.model.FormDef in project collect by opendatakit.
the class FormController method getSubmissionMetadata.
/**
* Get the OpenRosa required metadata of the portion of the form beng submitted
*/
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");
String instanceId = null;
String instanceName = null;
boolean audit = false;
if (e != null) {
List<TreeElement> v;
// instance id...
v = e.getChildrenWithName(INSTANCE_ID);
if (v.size() == 1) {
IAnswerData sa = v.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();
if (sa != null) {
instanceName = sa.getDisplayText();
}
}
// timing element...
v = e.getChildrenWithName(AUDIT);
if (v.size() == 1) {
audit = true;
IAnswerData answerData = new StringData();
answerData.setValue(AUDIT_FILE_NAME);
v.get(0).setValue(answerData);
}
}
return new InstanceMetadata(instanceId, instanceName, audit);
}
use of org.javarosa.core.model.FormDef in project collect by opendatakit.
the class FormLoaderTask method doInBackground.
/**
* Initialize {@link FormEntryController} with {@link FormDef} from binary or
* from XML. If given an instance, it will be used to fill the {@link FormDef}.
*/
@Override
protected FECWrapper doInBackground(String... path) {
errorMsg = null;
final String formPath = path[0];
final File formXml = new File(formPath);
final FormDef formDef = createFormDefFromCacheOrXml(formXml);
if (errorMsg != null || formDef == null) {
return null;
}
// set paths to /sdcard/odk/forms/formfilename-media/
final String formFileName = formXml.getName().substring(0, formXml.getName().lastIndexOf("."));
final File formMediaDir = new File(formXml.getParent(), formFileName + "-media");
externalDataManager = new ExternalDataManagerImpl(formMediaDir);
// add external data function handlers
ExternalDataHandler externalDataHandlerPull = new ExternalDataHandlerPull(externalDataManager);
formDef.getEvaluationContext().addFunctionHandler(externalDataHandlerPull);
try {
loadExternalData(formMediaDir);
} catch (Exception e) {
Timber.e(e, "Exception thrown while loading external data");
errorMsg = e.getMessage();
return null;
}
if (isCancelled()) {
// that means that the user has cancelled, so no need to go further
return null;
}
// create FormEntryController from formdef
final FormEntryModel fem = new FormEntryModel(formDef);
final FormEntryController fec = new FormEntryController(fem);
boolean usedSavepoint = false;
try {
Timber.i("Initializing form.");
final long start = System.currentTimeMillis();
usedSavepoint = initializeForm(formDef, fec);
Timber.i("Form initialized in %.3f seconds.", (System.currentTimeMillis() - start) / 1000F);
} catch (RuntimeException e) {
Timber.e(e);
if (e.getCause() instanceof XPathTypeMismatchException) {
// this is a case of
// https://bitbucket.org/m
// .sundt/javarosa/commits/e5d344783e7968877402bcee11828fa55fac69de
// the data are imported, the survey will be unusable
// but we should give the option to the user to edit the form
// otherwise the survey will be TOTALLY inaccessible.
Timber.w("We have a syntactically correct instance, but the data threw an " + "exception inside JR. We should allow editing.");
} else {
errorMsg = e.getMessage();
return null;
}
}
// Remove previous forms
ReferenceManager.instance().clearSession();
processItemSets(formMediaDir);
// This should get moved to the Application Class
if (ReferenceManager.instance().getFactories().length == 0) {
// this is /sdcard/odk
ReferenceManager.instance().addReferenceFactory(new FileReferenceFactory(Collect.ODK_ROOT));
}
// Set jr://... to point to /sdcard/odk/forms/filename-media/
ReferenceManager.instance().addSessionRootTranslator(new RootTranslator("jr://images/", "jr://file/forms/" + formFileName + "-media/"));
ReferenceManager.instance().addSessionRootTranslator(new RootTranslator("jr://image/", "jr://file/forms/" + formFileName + "-media/"));
ReferenceManager.instance().addSessionRootTranslator(new RootTranslator("jr://audio/", "jr://file/forms/" + formFileName + "-media/"));
ReferenceManager.instance().addSessionRootTranslator(new RootTranslator("jr://video/", "jr://file/forms/" + formFileName + "-media/"));
final FormController fc = new FormController(formMediaDir, fec, instancePath == null ? null : new File(instancePath));
if (xpath != null) {
// we are resuming after having terminated -- set index to this
// position...
FormIndex idx = fc.getIndexFromXPath(xpath);
fc.jumpToIndex(idx);
}
if (waitingXPath != null) {
FormIndex idx = fc.getIndexFromXPath(waitingXPath);
fc.setIndexWaitingForData(idx);
}
data = new FECWrapper(fc, usedSavepoint);
return data;
}
use of org.javarosa.core.model.FormDef in project collect by opendatakit.
the class InstanceGoogleSheetsUploader method getInstanceElement.
private TreeElement getInstanceElement(String formFilePath, File instanceFile) throws UploadException {
FormDef formDef;
try {
formDef = XFormUtils.getFormFromInputStream(new FileInputStream(new File(formFilePath)));
} catch (FileNotFoundException e) {
throw new UploadException(e);
}
FormLoaderTask.importData(instanceFile, new FormEntryController(new FormEntryModel(formDef)));
return formDef.getMainInstance().getRoot();
}
use of org.javarosa.core.model.FormDef in project javarosa by opendatakit.
the class TreeElementTests method testPopulate_withNodesAttributes.
@Test
public void testPopulate_withNodesAttributes() {
// Given
FormParseInit formParseInit = new FormParseInit();
formParseInit.setFormToParse(Paths.get(PathConst.getTestResourcePath().getAbsolutePath(), "populate-nodes-attributes.xml").toString());
FormEntryController formEntryController = formParseInit.getFormEntryController();
byte[] formInstanceAsBytes = null;
try {
formInstanceAsBytes = Files.readAllBytes(Paths.get(PathConst.getTestResourcePath().getAbsolutePath(), "populate-nodes-attributes-instance.xml"));
} catch (IOException e) {
fail("There was a problem with reading the test data.\n" + e.getMessage());
}
TreeElement savedRoot = XFormParser.restoreDataModel(formInstanceAsBytes, null).getRoot();
FormDef formDef = formEntryController.getModel().getForm();
TreeElement dataRootNode = formDef.getInstance().getRoot().deepCopy(true);
// When
dataRootNode.populate(savedRoot, formDef);
// Then
assertEquals(2, dataRootNode.getNumChildren());
TreeElement freeText1Question = dataRootNode.getChildAt(0);
TreeElement regularGroup = dataRootNode.getChildAt(1);
assertEquals(1, regularGroup.getNumChildren());
TreeElement freeText2Question = regularGroup.getChildAt(0);
assertEquals("free_text_1", freeText1Question.getName());
assertEquals(1, freeText1Question.getAttributeCount());
TreeElement customAttr1 = freeText1Question.getAttribute(null, "custom_attr_1");
assertNotNull(customAttr1);
assertEquals("custom_attr_1", customAttr1.getName());
assertEquals("", customAttr1.getNamespace());
assertEquals("xyz1", customAttr1.getAttributeValue());
assertEquals("regular_group", regularGroup.getName());
assertEquals(1, regularGroup.getAttributeCount());
customAttr1 = regularGroup.getAttribute(null, "custom_attr_1");
assertNotNull(customAttr1);
assertEquals("custom_attr_1", customAttr1.getName());
assertEquals("custom_name_space", customAttr1.getNamespace());
assertEquals("xyz2", customAttr1.getAttributeValue());
assertEquals("free_text_2", freeText2Question.getName());
assertEquals(1, freeText1Question.getAttributeCount());
TreeElement customAttr2 = freeText2Question.getAttribute(null, "custom_attr_2");
assertNotNull(customAttr2);
assertEquals("custom_attr_2", customAttr2.getName());
assertEquals("", customAttr2.getNamespace());
assertEquals("xyz3", customAttr2.getAttributeValue());
}
use of org.javarosa.core.model.FormDef in project javarosa by opendatakit.
the class FormDefConstructionUtils method createSimpleGroupReference.
public static FormDef createSimpleGroupReference() {
FormDef theform = new FormDef();
QuestionDef question1 = new QuestionDef();
GroupDef group1 = new GroupDef();
QuestionDef question11 = new QuestionDef();
QuestionDef question12 = new QuestionDef();
group1.addChild(question11);
group1.addChild(question12);
QuestionDef question2 = new QuestionDef();
theform.addChild(question1);
theform.addChild(group1);
theform.addChild(question2);
return theform;
}
Aggregations