Looks plausible. Add it to JIRA so it doesn't get lost!

Cheers,
Nick.


Kristian Marinkovic wrote:
Hi howard,

i think i was able to localize the root cause of the exception....
if you confirm it i'll add a JIRA

ComponentPageElementImpl is responsible for calling the render phase methods of the components. It calls the setupRender method on the attached Mixins then the components and then the Mixins that
have a @MixinAfter annotation. If in this phase the setupRender of a
Mixin returns a boolean value that will be saved into the Event object and
in case of a "false" the setupRender calls of the subsequent components will be aborted.
During the "inverse" lifecycle the order is simply reversed and the render
phase method of the Mixin with @MixinAfter annotation is called, then
the render phase method of the component and then the method of the
Mixin is called. The problem is now that the "inverse" render phase methods are getting called without checking whether the corresponding other render phase methods have been executed.
So in my case the cleanupRender method of the Form component gets
called although i have short-circuited the beginRender method with my Mixin
because there is now state available that indicates that the beginRender
method of the Form component has NOT been executed.

private void invoke(boolean reverse, ComponentCallback callback)
{
           ....
Iterator<Component> i = reverse ? InternalUtils.reverseIterator(_components)
                    : _components.iterator();

            while (i.hasNext())
                callback.run(i.next());


A possible solution would be to create a List that contains those components whose render phase methods really have been executed. This list is then used in the "inverse" lifecycle.

g,
kris






Kristian Marinkovic <[EMAIL PROTECTED]> 03.10.2007 17:22
Bitte antworten an
"Tapestry users" <users@tapestry.apache.org>


An
"Tapestry users" <users@tapestry.apache.org>
Kopie

Thema
T5: Mixin on Form does not work as expected






sure... sorry i forgot..

org.apache.tapestry.ioc.internal.util.TapestryException

location
classpath:com/poi/cross/adm/licensing/components/LicenseEditor.tml, line 23, column 35
    18  </tr>
    19  </thead>
    20  <tfoot>
    21  <tr>
    22  <td colspan="5" class="action">
    23  <form t:id="orderForm">
    24  License Ordering:
    25  <input t:id="amount" type="text" maxlength="3" size="4" />
    26  <a t:id="neworder">order</a>
    27  </form>
    28  </td>

17:21:25,075 ERROR License:66 - Render queue error in CleanupRender[License:prodlicense.orderform]: org.apache.tapestry.ioc.internal.util.TapestryException org.apache.tapestry.ioc.internal.util.TapestryException [at classpath:com/poi/cross/adm/licensing/components/LicenseEditor.tml, line 23, column 35] at org.apache.tapestry.internal.structure.ComponentPageElementImpl.invoke(ComponentPageElementImpl.java:935) at org.apache.tapestry.internal.structure.ComponentPageElementImpl.access$0(ComponentPageElementImpl.java:915) at org.apache.tapestry.internal.structure.ComponentPageElementImpl$11.render(ComponentPageElementImpl.java:392) at org.apache.tapestry.internal.services.RenderQueueImpl.run(RenderQueueImpl.java:58) at org.apache.tapestry.internal.services.PageMarkupRendererImpl.renderPageMarkup(PageMarkupRendererImpl.java:40) at $PageMarkupRenderer_11566735535.renderPageMarkup($PageMarkupRenderer_11566735535.java) at org.apache.tapestry.internal.services.PageResponseRendererImpl.renderPageResponse(PageResponseRendererImpl.java:71) at $PageResponseRenderer_11566735509.renderPageResponse($PageResponseRenderer_11566735509.java) at org.apache.tapestry.internal.services.PageRenderRequestHandlerImpl.handle(PageRenderRequestHandlerImpl.java:81) at $PageRenderRequestHandler_11566735501.handle($PageRenderRequestHandler_11566735501.java) at org.apache.tapestry.internal.services.PageRenderDispatcher.dispatch(PageRenderDispatcher.java:72)
    at $Dispatcher_11566735505.dispatch($Dispatcher_11566735505.java)
    at $Dispatcher_115667354f7.dispatch($Dispatcher_115667354f7.java)
at org.apache.tapestry.services.TapestryModule$13.service(TapestryModule.java:1099) at com.poi.cross.adm.licensing.services.AppModule$2.service(AppModule.java:44)
    at $RequestFilter_115667354f5.service($RequestFilter_115667354f5.java)
at $RequestHandler_115667354f8.service($RequestHandler_115667354f8.java) at com.poi.cross.adm.licensing.services.AppModule$1.service(AppModule.java:28)
    at $RequestFilter_115667354f6.service($RequestFilter_115667354f6.java)
at $RequestHandler_115667354f8.service($RequestHandler_115667354f8.java) at org.apache.tapestry.internal.services.LocalizationFilter.service(LocalizationFilter.java:43) at $RequestHandler_115667354f8.service($RequestHandler_115667354f8.java) at org.apache.tapestry.services.TapestryModule$2.service(TapestryModule.java:679) at $RequestHandler_115667354f8.service($RequestHandler_115667354f8.java) at org.apache.tapestry.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:84) at $RequestHandler_115667354f8.service($RequestHandler_115667354f8.java) at org.apache.tapestry.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:97) at org.apache.tapestry.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:1) at org.apache.tapestry.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:77) at org.apache.tapestry.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:110) at $RequestHandler_115667354f8.service($RequestHandler_115667354f8.java) at $RequestHandler_115667354ef.service($RequestHandler_115667354ef.java) at org.apache.tapestry.services.TapestryModule$12.service(TapestryModule.java:1077) at $HttpServletRequestHandler_115667354ee.service($HttpServletRequestHandler_115667354ee.java) at org.apache.tapestry.TapestryFilter.doFilter(TapestryFilter.java:136) at org.mortbay.jetty.servlet.WebApplicationHandler$CachedChain.doFilter(WebApplicationHandler.java:821) at org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationHandler.java:471) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:568)
    at org.mortbay.http.HttpContext.handle(HttpContext.java:1530)
at org.mortbay.jetty.servlet.WebApplicationContext.handle(WebApplicationContext.java:633)
    at org.mortbay.http.HttpContext.handle(HttpContext.java:1482)
    at org.mortbay.http.HttpServer.service(HttpServer.java:909)
    at org.mortbay.http.HttpConnection.service(HttpConnection.java:820)
    at org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:986)
    at org.mortbay.http.HttpConnection.handle(HttpConnection.java:837)
at org.mortbay.http.SocketListener.handleConnection(SocketListener.java:245)
    at org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:357)
    at org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:534)
Caused by: java.util.NoSuchElementException
    at java.util.LinkedList.remove(LinkedList.java:644)
    at java.util.LinkedList.removeFirst(LinkedList.java:134)
at org.apache.tapestry.internal.services.EnvironmentImpl.pop(EnvironmentImpl.java:85)
    at $Environment_11566735537.pop($Environment_11566735537.java)
    at $Environment_115667354dd.pop($Environment_115667354dd.java)
at org.apache.tapestry.corelib.components.Form.cleanupRender(Form.java:296) at org.apache.tapestry.corelib.components.Form.cleanupRender(Form.java) at org.apache.tapestry.internal.structure.ComponentPageElementImpl$11$1.run(ComponentPageElementImpl.java:388) at org.apache.tapestry.internal.structure.ComponentPageElementImpl.invoke(Compo

A stack trace would be helpful.


An: users@tapestry.apache.org
Von: Kristian Marinkovic <[EMAIL PROTECTED]>
Datum: 03.10.2007 03:52PM
Thema: T5: Mixin on Form does not work as expected

hi,

i get an exception from the Form.cleanupRender method although
i have a Mixin attached that returns false on setupRender.

as i understand the documentation correctly the Form component
should never enter the cleanupRender method/event...
can someone point me to my error?

i'm trying to short-circuit the form rendering when a certain state
occurs
thanks
g,
kris

code:
page:
@Component(parameters={"tracker=tracker","Editable.edit=display"}) @MixinClasses(Editable.class)
   private Form orderForm;



Editable Mixin:
public class Editable {
...

@Parameter(defaultPrefix=TapestryConstants.PROP_BINDING_PREFIX,value="true")
   private boolean edit;

   boolean setupRender(MarkupWriter writer) {
       if(!edit)
           writer.write(value);
       return edit;
   }
} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to