Search in sources :

Example 1 with ExternalDataHandlerPull

use of org.odk.collect.android.externaldata.handler.ExternalDataHandlerPull 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];
    if (formPath == null) {
        Timber.e("formPath is null");
        errorMsg = "formPath is null, please email support@getodk.org with a description of what you were doing when this happened.";
        return null;
    }
    final File formXml = new File(formPath);
    final File formMediaDir = FileUtils.getFormMediaDir(formXml);
    setupReferenceManagerForForm(ReferenceManager.instance(), formMediaDir);
    FormDef formDef = null;
    try {
        formDef = createFormDefFromCacheOrXml(formPath, formXml);
    } catch (StackOverflowError e) {
        Timber.e(e);
        errorMsg = getLocalizedString(Collect.getInstance(), R.string.too_complex_form);
    } catch (Exception | Error e) {
        Timber.w(e);
        errorMsg = "An unknown error has occurred. Please ask your project leadership to email support@getodk.org with information about this form.";
        errorMsg += "\n\n" + e.getMessage();
    }
    if (errorMsg != null || formDef == null) {
        Timber.w("No exception loading form but errorMsg set");
        return null;
    }
    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 (IOException | 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;
        }
    }
    processItemSets(formMediaDir);
    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);
        if (idx != null) {
            fc.jumpToIndex(idx);
        }
    }
    if (waitingXPath != null) {
        FormIndex idx = fc.getIndexFromXPath(waitingXPath);
        if (idx != null) {
            fc.setIndexWaitingForData(idx);
        }
    }
    data = new FECWrapper(fc, usedSavepoint);
    return data;
}
Also used : FormController(org.odk.collect.android.javarosawrapper.FormController) FormEntryController(org.javarosa.form.api.FormEntryController) FormEntryModel(org.javarosa.form.api.FormEntryModel) LocalizedApplicationKt.getLocalizedString(org.odk.collect.strings.localization.LocalizedApplicationKt.getLocalizedString) IOException(java.io.IOException) ExternalDataHandlerPull(org.odk.collect.android.externaldata.handler.ExternalDataHandlerPull) ExternalDataHandler(org.odk.collect.android.externaldata.ExternalDataHandler) CsvValidationException(com.opencsv.exceptions.CsvValidationException) IOException(java.io.IOException) SQLException(android.database.SQLException) XPathTypeMismatchException(org.javarosa.xpath.XPathTypeMismatchException) ExternalDataManagerImpl(org.odk.collect.android.externaldata.ExternalDataManagerImpl) FormDef(org.javarosa.core.model.FormDef) FormIndex(org.javarosa.core.model.FormIndex) XPathTypeMismatchException(org.javarosa.xpath.XPathTypeMismatchException) File(java.io.File)

Aggregations

SQLException (android.database.SQLException)1 CsvValidationException (com.opencsv.exceptions.CsvValidationException)1 File (java.io.File)1 IOException (java.io.IOException)1 FormDef (org.javarosa.core.model.FormDef)1 FormIndex (org.javarosa.core.model.FormIndex)1 FormEntryController (org.javarosa.form.api.FormEntryController)1 FormEntryModel (org.javarosa.form.api.FormEntryModel)1 XPathTypeMismatchException (org.javarosa.xpath.XPathTypeMismatchException)1 ExternalDataHandler (org.odk.collect.android.externaldata.ExternalDataHandler)1 ExternalDataManagerImpl (org.odk.collect.android.externaldata.ExternalDataManagerImpl)1 ExternalDataHandlerPull (org.odk.collect.android.externaldata.handler.ExternalDataHandlerPull)1 FormController (org.odk.collect.android.javarosawrapper.FormController)1 LocalizedApplicationKt.getLocalizedString (org.odk.collect.strings.localization.LocalizedApplicationKt.getLocalizedString)1