Tapestry 5
  1. Tapestry 5
  2. TAP5-290

Namespace error when partial-updating a zone with a block

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 5.0.15
    • Fix Version/s: 5.0.16
    • Component/s: tapestry-core
    • Labels:
      None

      Description

      I have a zone that contains two components in its body that i'd like to update on a given event.
      Because i can't return more than one component to update from the event listener method i created a block inside the zone and outside the two components and now return the block from the event listener method. Something like this:

      <t:zone>
      <t:delegate to="myblock"/>
      <t:block>
      <t:component1>
      ...
      </t:component1>
      <t:component2>
      ...
      </t:component2>
      <div>whatever</div>
      </t:block>
      </t:zone>

      I use the delegate to because i want the block content to be visible when the whole page is rendered and not just after the update event.
      So, the page renders just fine. But, when the event is executed i get the following error logged and nothing is updated on the UI:

      [ERROR] TapestryModule.RequestExceptionHandler Processing of request failed with uncaught exception: Namespace prefix for URI 'http://www.w3.org/1999/xhtml' is not defined.
      java.lang.RuntimeException: Namespace prefix for URI 'http://www.w3.org/1999/xhtml' is not defined.
      at org.apache.tapestry5.dom.Element.toNamespacePrefix(Element.java:502)
      at org.apache.tapestry5.dom.Element.toNamespacePrefix(Element.java:504)
      at org.apache.tapestry5.dom.Element.toPrefixedName(Element.java:366)
      at org.apache.tapestry5.dom.Element.toMarkup(Element.java:300)
      at org.apache.tapestry5.dom.Node.toMarkup(Node.java:149)
      at org.apache.tapestry5.dom.Node.writeChildMarkup(Node.java:103)
      at org.apache.tapestry5.dom.Node.getChildMarkup(Node.java:113)
      at org.apache.tapestry5.internal.services.PageRenderQueueImpl.renderPartial(PageRenderQueueImpl.java:150)

      Although the block rendered fine the first time it seems to fail to render upon the partial-update. After some digging i found out that the only way that i could get this to work was to only include tapestry namespace tags inside the block. So if i have something like:

      <div>whatever</div>

      inside the block i get the error. But if i change it to:

      <t:any element="div">whatever</t:any>

      it works just fine.

      Again, the exact same block renders just fine when the page loads.

        Issue Links

          Activity

          Hide
          Howard M. Lewis Ship added a comment -

          A tough nut to crack, but I think this will do it.

          Show
          Howard M. Lewis Ship added a comment - A tough nut to crack, but I think this will do it.
          Hide
          Howard M. Lewis Ship added a comment -

          Ok, I think I can do this by forcing the element to the default (no prefix) namespace. The issue is that, in the highly dynamic space, it hard to connect the element that content that is rendering to the enclosing elements (outside of the rendering block/component) that are defining the namespaces.

          Show
          Howard M. Lewis Ship added a comment - Ok, I think I can do this by forcing the element to the default (no prefix) namespace. The issue is that, in the highly dynamic space, it hard to connect the element that content that is rendering to the enclosing elements (outside of the rendering block/component) that are defining the namespaces.
          Hide
          Hugo Palma added a comment -

          The namespace error is gone.

          Still, the fix changes the the root tag from the original one to something like "<ns0:div>"
          This can force the developer to change a lot of css definitions that are tied to the HTML tag and not only the css class.

          I don't think the developer should have to change it's approach to the page css because of this.
          Isn't there any other way you can do this without changing the root element tag ?

          Show
          Hugo Palma added a comment - The namespace error is gone. Still, the fix changes the the root tag from the original one to something like "<ns0:div>" This can force the developer to change a lot of css definitions that are tied to the HTML tag and not only the css class. I don't think the developer should have to change it's approach to the page css because of this. Isn't there any other way you can do this without changing the root element tag ?
          Hide
          Howard M. Lewis Ship added a comment -

          Didn't create a specific test for the Ajax use case, but now for both complete renders and partial renders, Element will automatically generate namespace definitions if they aren't provided explicitly.

          Show
          Howard M. Lewis Ship added a comment - Didn't create a specific test for the Ajax use case, but now for both complete renders and partial renders, Element will automatically generate namespace definitions if they aren't provided explicitly.
          Hide
          Howard M. Lewis Ship added a comment -

          The solution I'm working on is to automatically define namespaces as needed, when performing a partial render.

          Show
          Howard M. Lewis Ship added a comment - The solution I'm working on is to automatically define namespaces as needed, when performing a partial render.

            People

            • Assignee:
              Howard M. Lewis Ship
              Reporter:
              Hugo Palma
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development