Error on Loop

Dear Sirs/Madam,
I am currently working on a form which does:

  1. Ask if there are mosquito nets in the household (select1 question,
    YES/NO)
  2. Ask for the number of mosquito nets (int) (relevant if answer to above
    is YES)
  3. Loop for each mosquito net (using the above answer to inform jr:count)
    • Ask mosquito net specific questions.

If the fieldworker goes through the process in a linear fashion (no going
back to amend previous answers) there is no problem. However if the user
goes from step 1-3, then suddenly goes back to step 1 and change the
response from YES to NO (rendering step two irrelevant), there is a crash,
stack trace below:

09-12 13:29:10.480: E/InputEventReceiver(13233): Exception dispatching
input event.
09-12 13:29:10.480: E/MessageQueue-JNI(13233): Exception in MessageQueue
callback: handleReceiveCallback
09-12 13:29:10.490: E/MessageQueue-JNI(13233):
java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
java.util.Vector.arrayIndexOutOfBoundsException(Vector.java:907)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
java.util.Vector.elementAt(Vector.java:328)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.xpath.XPathNodeset.getRefAt(XPathNodeset.java:54)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.xpath.expr.XPathFuncExpr.eval(XPathFuncExpr.java:185)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.xpath.XPathConditional.evalRaw(XPathConditional.java:68)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.core.model.condition.Recalculate.eval(Recalculate.java:53)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.core.model.condition.Triggerable.apply(Triggerable.java:69)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.core.model.FormDef.evaluateTriggerable(FormDef.java:708)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.core.model.FormDef.evaluateTriggerables(FormDef.java:698)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.core.model.FormDef.triggerTriggerables(FormDef.java:671)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.core.model.FormDef.setValue(FormDef.java:305)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.form.api.FormEntryController.commitAnswer(FormEntryController.java:155)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.form.api.FormEntryController.answerQuestion(FormEntryController.java:92)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.odk.collect.android.logic.FormController.answerQuestion(FormController.java:406)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.odk.collect.android.logic.FormController.saveAllScreenAnswers(FormController.java:677)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.odk.collect.android.activities.FormEntryActivity.saveAnswersForCurrentScreen(FormEntryActivity.java:804)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.odk.collect.android.activities.FormEntryActivity.showNextView(FormEntryActivity.java:1166)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.odk.collect.android.activities.FormEntryActivity.onFling(FormEntryActivity.java:2467)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.GestureDetector.onTouchEvent(GestureDetector.java:609)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.odk.collect.android.activities.FormEntryActivity.dispatchTouchEvent(FormEntryActivity.java:1149)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1914)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.View.dispatchPointerEvent(View.java:7564)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.os.MessageQueue.nativePollOnce(Native Method)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.os.MessageQueue.next(MessageQueue.java:132)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.os.Looper.loop(Looper.java:124)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.app.ActivityThread.main(ActivityThread.java:5103)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
java.lang.reflect.Method.invokeNative(Native Method)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
java.lang.reflect.Method.invoke(Method.java:525)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
dalvik.system.NativeStart.main(Native Method)

I believe this is because the jr:count value for the question 3 loop
changes because question 2 is no longer relevant. Does anyone have a
suggestion how this could be implemented? I was trying to do an

PSEUDOCODE:
If(selected(qtn1,'NO') then currentNode=0, else currentNode==userInput)
ACTUAL CODE:
<bind nodeset="/form/agepassed/q23"
calculate="if(selected(/form/agepassed/q22, '0') , 0,'/form/agepassed/q23)"
... />

This resulted in cyclic dependency errors due to the ELSE part of the
conditional. In reality I only want the IF-THEN, I dont need the ELSE..

<bind nodeset="/form/agepassed/q23"
calculate="if(selected(/form/agepassed/q22, '0') , 0)" ... />

But javarosa syntax insists on the ELSE clause.

Any help greatly appreciated

Tumaini

This is likely related to other recently-reported issues with repeat groups
not adjusting for changes in the repeat-count value.

I've created this issue and added you for CC's of updates to it:
http://code.google.com/p/opendatakit/issues/detail?id=913

ยทยทยท On Thu, Sep 12, 2013 at 6:45 AM, Tumaini Kilimba wrote:

Dear Sirs/Madam,
I am currently working on a form which does:

  1. Ask if there are mosquito nets in the household (select1 question,
    YES/NO)
  2. Ask for the number of mosquito nets (int) (relevant if answer to above
    is YES)
  3. Loop for each mosquito net (using the above answer to inform jr:count)
    • Ask mosquito net specific questions.

If the fieldworker goes through the process in a linear fashion (no going
back to amend previous answers) there is no problem. However if the user
goes from step 1-3, then suddenly goes back to step 1 and change the
response from YES to NO (rendering step two irrelevant), there is a crash,
stack trace below:

09-12 13:29:10.480: E/InputEventReceiver(13233): Exception dispatching
input event.
09-12 13:29:10.480: E/MessageQueue-JNI(13233): Exception in MessageQueue
callback: handleReceiveCallback
09-12 13:29:10.490: E/MessageQueue-JNI(13233):
java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
java.util.Vector.arrayIndexOutOfBoundsException(Vector.java:907)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
java.util.Vector.elementAt(Vector.java:328)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.xpath.XPathNodeset.getRefAt(XPathNodeset.java:54)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.xpath.expr.XPathFuncExpr.eval(XPathFuncExpr.java:185)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.xpath.XPathConditional.evalRaw(XPathConditional.java:68)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.core.model.condition.Recalculate.eval(Recalculate.java:53)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.core.model.condition.Triggerable.apply(Triggerable.java:69)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.core.model.FormDef.evaluateTriggerable(FormDef.java:708)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.core.model.FormDef.evaluateTriggerables(FormDef.java:698)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.core.model.FormDef.triggerTriggerables(FormDef.java:671)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.core.model.FormDef.setValue(FormDef.java:305)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.form.api.FormEntryController.commitAnswer(FormEntryController.java:155)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.javarosa.form.api.FormEntryController.answerQuestion(FormEntryController.java:92)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.odk.collect.android.logic.FormController.answerQuestion(FormController.java:406)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.odk.collect.android.logic.FormController.saveAllScreenAnswers(FormController.java:677)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.odk.collect.android.activities.FormEntryActivity.saveAnswersForCurrentScreen(FormEntryActivity.java:804)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.odk.collect.android.activities.FormEntryActivity.showNextView(FormEntryActivity.java:1166)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.odk.collect.android.activities.FormEntryActivity.onFling(FormEntryActivity.java:2467)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.GestureDetector.onTouchEvent(GestureDetector.java:609)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
org.odk.collect.android.activities.FormEntryActivity.dispatchTouchEvent(FormEntryActivity.java:1149)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1914)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.View.dispatchPointerEvent(View.java:7564)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.os.MessageQueue.nativePollOnce(Native Method)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.os.MessageQueue.next(MessageQueue.java:132)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.os.Looper.loop(Looper.java:124)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
android.app.ActivityThread.main(ActivityThread.java:5103)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
java.lang.reflect.Method.invokeNative(Native Method)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
java.lang.reflect.Method.invoke(Method.java:525)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-12 13:29:10.490: E/MessageQueue-JNI(13233): at
dalvik.system.NativeStart.main(Native Method)

I believe this is because the jr:count value for the question 3 loop
changes because question 2 is no longer relevant. Does anyone have a
suggestion how this could be implemented? I was trying to do an

PSEUDOCODE:
If(selected(qtn1,'NO') then currentNode=0, else currentNode==userInput)
ACTUAL CODE:
<bind nodeset="/form/agepassed/q23"
calculate="if(selected(/form/agepassed/q22, '0') , 0,'/form/agepassed/q23)"
... />

This resulted in cyclic dependency errors due to the ELSE part of the
conditional. In reality I only want the IF-THEN, I dont need the ELSE..

<bind nodeset="/form/agepassed/q23"
calculate="if(selected(/form/agepassed/q22, '0') , 0)" ... />

But javarosa syntax insists on the ELSE clause.

Any help greatly appreciated

Tumaini

--

Post: opendatakit@googlegroups.com
Unsubscribe: opendatakit+unsubscribe@googlegroups.com
Options: http://groups.google.com/group/opendatakit?hl=en


You received this message because you are subscribed to the Google Groups
"ODK Community" group.
To unsubscribe from this group and stop receiving emails from it, send an
email to opendatakit+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

--
Mitch Sundt
Software Engineer
University of Washington
mitchellsundt@gmail.com