hoichong
hoichong

Reputation: 151

What cause Orbeon Forms to do an endless revalidate on an XForm till it get a stackoverflow

I am using Orbeon Forms CE version orbeon-4.0.0.M11.201210030654-CE.

I had an XForm (XHTML) with multiple instances, and I did a bind with required="true()" on one of the instance and use xxforms-invalid & xxforms-valid to toggle cases. Below are some code samples from my xform.

<xforms:instance id="teaching-load-instance" src="oxf:/apps/uis-common/model/uis-teaching-load-xforms-instance.xml"/>

<xforms:bind nodeset="instance('teaching-load-instance')/teaching_load">
    <xforms:bind nodeset="module_id" required="true()"/>
</xforms:bind>

<xforms:action ev:event="xxforms-invalid" ev:observer="teaching-load-instance">
    <xforms:toggle case="invalid-form-case"/>
</xforms:action>

<xforms:action ev:event="xxforms-valid" ev:observer="teaching-load-instance">
    <xforms:toggle case="valid-form-case"/>
</xforms:action>

When accessing this xform page, a stackoverflow error will be thrown.

Here are the debug logs from orbeon.log file.

2012-10-23 21:42:42,470 DEBUG XFormsServer  -         start dispatching {name: "xxforms-valid", target: "month-instance"}
2012-10-23 21:42:42,470 DEBUG XFormsServer  -           start performing default action {}
2012-10-23 21:42:42,470 DEBUG XFormsServer  -           end performing default action {time (ms): "0"}
2012-10-23 21:42:42,470 DEBUG XFormsServer  -         end dispatching {time (ms): "0"}
2012-10-23 21:42:42,470 DEBUG XFormsServer  -         start dispatching {name: "xxforms-valid", target: "verification-instance"}
2012-10-23 21:42:42,470 DEBUG XFormsServer  -           start performing default action {}
2012-10-23 21:42:42,470 DEBUG XFormsServer  -           end performing default action {time (ms): "0"}
2012-10-23 21:42:42,470 DEBUG XFormsServer  -         end dispatching {time (ms): "0"}
2012-10-23 21:42:42,470 DEBUG XFormsServer  -         start dispatching {name: "xxforms-valid", target: "modules-instance"}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -           start performing default action {}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -           end performing default action {time (ms): "0"}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -         end dispatching {time (ms): "1"}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -         start dispatching {name: "xxforms-invalid", target: "teaching-load-instance"}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -           start handler {name: "xxforms-invalid", phase: "target", observer: "teaching-load-instance"}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -             interpreter - start executing {action name: "xforms:action"}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -               interpreter - start executing {action name: "xforms:toggle"}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -                 start dispatching {name: "xforms-revalidate", target: "xf-2"}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -                   start performing default action {}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -                     validation - start performing revalidate {model id: "xf-2"}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -                       start dispatching {name: "xxforms-valid", target: "triggers-instance"}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -                         start performing default action {}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -                         end performing default action {time (ms): "0"}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -                       end dispatching {time (ms): "0"}
2012-10-23 21:42:42,471 DEBUG XFormsServer  -                       start dispatching {name: "xxforms-valid", target: "parameters-instance"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                         start performing default action {}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                         end performing default action {time (ms): "0"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                       end dispatching {time (ms): "1"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                       start dispatching {name: "xxforms-valid", target: "check-user-instance"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                         start performing default action {}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                         end performing default action {time (ms): "0"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                       end dispatching {time (ms): "0"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                       start dispatching {name: "xxforms-valid", target: "main"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                         start performing default action {}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                         end performing default action {time (ms): "0"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                       end dispatching {time (ms): "0"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                       start dispatching {name: "xxforms-valid", target: "temp"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                         start performing default action {}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                         end performing default action {time (ms): "0"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                       end dispatching {time (ms): "0"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                       start dispatching {name: "xxforms-valid", target: "session"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                         start performing default action {}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                         end performing default action {time (ms): "0"}
2012-10-23 21:42:42,472 DEBUG XFormsServer  -                       end dispatching {time (ms): "0"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                       start dispatching {name: "xxforms-valid", target: "status-instance"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                         start performing default action {}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                         end performing default action {time (ms): "0"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                       end dispatching {time (ms): "1"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                       start dispatching {name: "xxforms-valid", target: "month-instance"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                         start performing default action {}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                         end performing default action {time (ms): "0"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                       end dispatching {time (ms): "0"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                       start dispatching {name: "xxforms-valid", target: "verification-instance"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                         start performing default action {}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                         end performing default action {time (ms): "0"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                       end dispatching {time (ms): "0"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                       start dispatching {name: "xxforms-valid", target: "modules-instance"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                         start performing default action {}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                         end performing default action {time (ms): "0"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                       end dispatching {time (ms): "0"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                       start dispatching {name: "xxforms-invalid", target: "teaching-load-instance"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                         start handler {name: "xxforms-invalid", phase: "target", observer: "teaching-load-instance"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                           interpreter - start executing {action name: "xforms:action"}
2012-10-23 21:42:42,473 DEBUG XFormsServer  -                             interpreter - start executing {action name: "xforms:toggle"}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                               start dispatching {name: "xforms-revalidate", target: "xf-2"}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                                 start performing default action {}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                                   validation - start performing revalidate {model id: "xf-2"}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                                     start dispatching {name: "xxforms-valid", target: "triggers-instance"}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                                       start performing default action {}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                                       end performing default action {time (ms): "0"}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                                     end dispatching {time (ms): "0"}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                                     start dispatching {name: "xxforms-valid", target: "parameters-instance"}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                                       start performing default action {}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                                       end performing default action {time (ms): "0"}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                                     end dispatching {time (ms): "0"}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                                     start dispatching {name: "xxforms-valid", target: "check-user-instance"}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                                       start performing default action {}
2012-10-23 21:42:42,474 DEBUG XFormsServer  -                                       end performing default action {time (ms): "0"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                     end dispatching {time (ms): "1"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                     start dispatching {name: "xxforms-valid", target: "main"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                       start performing default action {}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                       end performing default action {time (ms): "0"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                     end dispatching {time (ms): "0"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                     start dispatching {name: "xxforms-valid", target: "temp"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                       start performing default action {}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                       end performing default action {time (ms): "0"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                     end dispatching {time (ms): "0"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                     start dispatching {name: "xxforms-valid", target: "session"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                       start performing default action {}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                       end performing default action {time (ms): "0"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                     end dispatching {time (ms): "0"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                     start dispatching {name: "xxforms-valid", target: "status-instance"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                       start performing default action {}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                       end performing default action {time (ms): "0"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                     end dispatching {time (ms): "0"}
2012-10-23 21:42:42,475 DEBUG XFormsServer  -                                     start dispatching {name: "xxforms-valid", target: "month-instance"}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                       start performing default action {}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                       end performing default action {time (ms): "0"}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                     end dispatching {time (ms): "1"}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                     start dispatching {name: "xxforms-valid", target: "verification-instance"}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                       start performing default action {}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                       end performing default action {time (ms): "0"}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                     end dispatching {time (ms): "0"}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                     start dispatching {name: "xxforms-valid", target: "modules-instance"}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                       start performing default action {}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                       end performing default action {time (ms): "0"}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                     end dispatching {time (ms): "0"}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                     start dispatching {name: "xxforms-invalid", target: "teaching-load-instance"}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                       start handler {name: "xxforms-invalid", phase: "target", observer: "teaching-load-instance"}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                         interpreter - start executing {action name: "xforms:action"}
2012-10-23 21:42:42,476 DEBUG XFormsServer  -                                           interpreter - start executing {action name: "xforms:toggle"}
2012-10-23 21:42:42,477 DEBUG XFormsServer  -                                             start dispatching {name: "xforms-revalidate", target: "xf-2"}
2012-10-23 21:42:42,477 DEBUG XFormsServer  -                                               start performing default action {}
2012-10-23 21:42:42,477 DEBUG XFormsServer  -                                                 validation - start performing revalidate {model id: "xf-2"}
2012-10-23 21:42:42,477 DEBUG XFormsServer  -                                                   start dispatching {name: "xxforms-valid", target: "triggers-instance"}
2012-10-23 21:42:42,477 DEBUG XFormsServer  -                                                     start performing default action {}
2012-10-23 21:42:42,477 DEBUG XFormsServer  -                                                     end performing default action {time (ms): "0"}
2012-10-23 21:42:42,477 DEBUG XFormsServer  -                                                   end dispatching {time (ms): "0"}
2012-10-23 21:42:42,477 DEBUG XFormsServer  -                                                   start dispatching {name: "xxforms-valid", target: "parameters-instance"}
2012-10-23 21:42:42,477 DEBUG XFormsServer  -                                                     start performing default action {}
2012-10-23 21:42:42,477 DEBUG XFormsServer  -                                                     end performing default action {time (ms): "0"}
2012-10-23 21:42:42,477 DEBUG XFormsServer  -                                                   end dispatching {time (ms): "0"}

Upvotes: 2

Views: 181

Answers (1)

avernet
avernet

Reputation: 31743

You can create infinite loops in XForms, but in this case you seem to have hit a bug in the XForms engine. The xf:toggle should have no effect if the case hasn't changed. I filled an issue for this, which you can track.

This issue is fixed since Orbeon Forms 4.0 M13. With earlier versions, you can work around it by adding an if on the xf:toggle. Assuming your switch id is my-switch:

<xforms:toggle if="xxforms:case('my-switch') != 'invalid-form-case'"
               case="invalid-form-case"/>

Plus an equivalent if added to the other <xforms:toggle case="valid-form-case"/>.

Upvotes: 1

Related Questions