Orbeon stackoverflow有太多型号

时间:2013-09-18 09:45:40

标签: java orbeon stack-overflow

我正在使用Orbeon Forms 3.8.0.201005141856 CE。

当页面上的模型太多时,Orbeon会抛出堆栈溢出错误。在初始化期间,在主模型上完成xforms-rebuild,然后在每个模型上启动rebuild / revalidate / recalculate。

如果模型太多,由于堆栈溢出,它永远不会完成。

我可以理解有一些递归,也许第一个模型没有完成验证,除非所有其他模型也是如此,但堆栈是这样的:

前几行是随机的,这些是在溢出时实际调用的方法,其余的是无限循环:

  

org.orbeon.oxf.xforms.xbl.XBLContainer synchronizeAndRefresh     XBLContainer.java 696 org.orbeon.oxf.xforms.xbl.XBLContainer     endOutermostActionHandler XBLContainer.java 669   org.orbeon.oxf.xforms.XFormsModel     rebuildRecalculateRevalidateIfNeeded XFormsModel.java 1120   org.orbeon.oxf.xforms.xbl.XBLContainer     rebuildRecalculateRevalidateIfNeeded XBLContainer.java 723   org.orbeon.oxf.xforms.xbl.XBLContainer     rebuildRecalculateRevalidateIfNeeded XBLContainer.java 733   org.orbeon.oxf.xforms.xbl.XBLContainer     rebuildRecalculateRevalidateIfNeeded XBLContainer.java 733   org.orbeon.oxf.xforms.xbl.XBLContainer     rebuildRecalculateRevalidateIfNeeded XBLContainer.java 733

这里可以避免某些级别的递归?

无论如何,我怀疑我能解决这个问题。但也许我可以在我的表格上修改一些东西。我想确认这是一个太多的模型问题。

我的情况有点特别,因为我的表单是动态构建的,没有关于将使用的数据的信息。稍微简化它看起来像这样(这只是伪代码给出一个想法)。

我有定义可能数据的模板,可以有severa模板,每个模板都可以包含多个属性。

<!-- This defines data templates, known at form creation -->
<xf:instance>
  <templates>
    <template id="template_1">
      <attribute id="attribute_1_1" type="string" />
      <attribute id="attribute_1_2" type="date" />
    </template>
    <template id="template_2">
      <attribute id="attribute_2_1" type="int" />
      <attribute id="attribute_2_2" type="dateTime" />
    </template>
  </templates>
</xf:instance>

然后是数据。可以有多个对象,每个对象使用上面的模板之一。它可以包含模板中的属性,但可能不是全部。它还可以包含不会被忽略的模板的属性。可以有多个对象使用相同的模板。可以存在任何对象都不使用的模板。

<!-- This is the data, unknown at form creation -->
<xf:instance id="objects">
  <data>
    <object template="template_1">
      <attribute name="attribute_1_1">value</attribute>
      <attribute name="unknownAttribute">value</attribute>
    </object>
    ...
  </data>
</xf:instance>

现在显示:

<!-- Repeat on objects -->
<xf:repeat nodeset="instance('objects')/object">

  <!-- A XBL that can display a template from its template definition node
  <fr:templateDisplay template="instance('templates')/template[@id = ./@template]" />
</xf:repeat>

XBL本身在模板级别做同样的事情:

<xbl:binding id="templateDisplay" />
  <xbl:implementation>
    <xf:model>
      ...
    </xf:model>
  </xbl:implementation>

  <xbl:template>
    <!-- A repeat on the attribute definition of the attributes -->
    <xf:repeat>
      <!-- A XBL that changes its control depending on datatype -->
      <fr:genericInput type="" data=""/>
    </xf:repeat>
  <xbl:template>
</xbl:binding>

genericInput XBL在输入上包含不同类型,具体取决于数据类型,它可以在绑定上使用不同的@type,它可以是简单的xbl,它可以是一个日期选择器等。它可以是读写/只读,它可以是单个/多值的。

问题是如果我有一个包含5个属性的模板,它会按对象生成(至少)6个XBL,因此需要重建6个模型。

一开始我可以在崩溃之前管理20个对象。我还有一个本地化xbl被所有其他xbl使用(所以至少12 xbl /模型按对象),我删除了那些和其他一些东西,我在崩溃之前达到了60个对象,但目标是200。 / p>

我想过可能在我的xbl中使用xsl来尝试删除genericInput。但我不熟悉XSL,我想确定它会导致改进。

或者是否可以过滤这些重建并具有静止功能的形式?一种减少递归的方法吗?

或许我错了,这不是一些模型问题?

任何暗示都会受到赞赏。

0 个答案:

没有答案