Simon, I still can't figure out your dilemma, but I notice something interesting.. In the stacktrace that you provided, it looks like this time getStatus() is being called before getTicket..
Maybe some of the folks that are more familiar w/ the guts of T5 can look at this. It doesn't look like this is due to anything you're doing, looks like a race condition of some type. I think it would be helpful if you provide some more details on the environment that you run your app in : e.g. JVM version, app server . Btw, does this happen consistently if you run it on a different box (e.g. I've had non-tapestry related stuff sometimes behave differently in terms of threading on a single CPU vs dual core box) ? Maybe you can try different JVMs as well, just to check that this is not JVM or version specific. Cheers, Alex kotchnev On Mon, Mar 2, 2009 at 4:23 PM, Simon Raveh <simon.ra...@icann.org> wrote: > Hi, > > Thanks for your help. > I'm still trying to figure out why getTicketNumber() is being called before > the parameter was set. From debugging this it seems that it is being called > when the Index page is being render. Bellow you can find a thread dump: > > [INFO] Started Jetty Server > 2009-03-02 13:09:48.951::INFO: Started > selectchannelconnec...@0.0.0.0:8080 > [DEBUG] components.ViewTicket [ENTER] beforeRenderTamplate() > [DEBUG] components.ViewTicket [ EXIT] beforeRenderTamplate > java.lang.Exception: Stack trace > at java.lang.Thread.dumpStack(Thread.java:1224) > at > org.iana.ietf.ticketstatus.components.ViewTicket._$advised$getStatus(ViewTicket.java:36) > [DEBUG] components.ViewTicket [ENTER] getStatus() > at > org.iana.ietf.ticketstatus.components.ViewTicket$getStatus$invocation_11fc909007b.invokeAdvisedMethod(ViewTicket$getStatus$invocation_11fc909007b.java) > at > org.apache.tapestry5.internal.services.AbstractComponentMethodInvocation.proceed(AbstractComponentMethodInvocation.java:71) > at > org.apache.tapestry5.ioc.internal.services.LoggingAdvice.advise(LoggingAdvice.java:45) > at > org.apache.tapestry5.internal.transform.LogWorker$1.advise(LogWorker.java:54) > at > org.apache.tapestry5.internal.services.AbstractComponentMethodInvocation.proceed(AbstractComponentMethodInvocation.java:80) > at > org.iana.ietf.ticketstatus.components.ViewTicket.getStatus(ViewTicket.java) > at $PropertyConduit_11fc9056327.get($PropertyConduit_11fc9056327.java) > at > org.apache.tapestry5.internal.bindings.PropBinding.get(PropBinding.java:53) > at > org.apache.tapestry5.internal.structure.ExpansionPageElement.render(ExpansionPageElement.java:47) > at > org.apache.tapestry5.internal.services.RenderQueueImpl.run(RenderQueueImpl.java:72) > at > org.apache.tapestry5.internal.services.PageRenderQueueImpl.render(PageRenderQueueImpl.java:121) > at > $PageRenderQueue_11fc9056337.render($PageRenderQueue_11fc9056337.java) > at > $PageRenderQueue_11fc905632f.render($PageRenderQueue_11fc905632f.java) > at > org.apache.tapestry5.services.TapestryModule$19.renderMarkup(TapestryModule.java:1200) > at > org.apache.tapestry5.services.TapestryModule$29.renderMarkup(TapestryModule.java:1580) > at > $MarkupRenderer_11fc905633b.renderMarkup($MarkupRenderer_11fc905633b.java) > at > org.apache.tapestry5.services.TapestryModule$28.renderMarkup(TapestryModule.java:1561) > at > $MarkupRenderer_11fc905633b.renderMarkup($MarkupRenderer_11fc905633b.java) > at > org.apache.tapestry5.services.TapestryModule$27.renderMarkup(TapestryModule.java:1543) > at > $MarkupRenderer_11fc905633b.renderMarkup($MarkupRenderer_11fc905633b.java) > at > org.apache.tapestry5.services.TapestryModule$26.renderMarkup(TapestryModule.java:1525) > at > $MarkupRenderer_11fc905633b.renderMarkup($MarkupRenderer_11fc905633b.java) > at > org.apache.tapestry5.services.TapestryModule$25.renderMarkup(TapestryModule.java:1495) > at > $MarkupRenderer_11fc905633b.renderMarkup($MarkupRenderer_11fc905633b.java) > at > $MarkupRenderer_11fc9056335.renderMarkup($MarkupRenderer_11fc9056335.java) > at > org.apache.tapestry5.internal.services.PageMarkupRendererImpl.renderPageMarkup(PageMarkupRendererImpl.java:64) > at > $PageMarkupRenderer_11fc9056333.renderPageMarkup($PageMarkupRenderer_11fc9056333.java) > at > org.apache.tapestry5.internal.services.PageResponseRendererImpl.renderPageResponse(PageResponseRendererImpl.java:57) > at > $PageResponseRenderer_11fc90562f0.renderPageResponse($PageResponseRenderer_11fc90562f0.java) > at > org.apache.tapestry5.internal.services.PageRenderRequestHandlerImpl.handle(PageRenderRequestHandlerImpl.java:59) > at > org.apache.tapestry5.services.TapestryModule$35.handle(TapestryModule.java:1779) > at > $PageRenderRequestHandler_11fc90562f1.handle($PageRenderRequestHandler_11fc90562f1.java) > at > $PageRenderRequestHandler_11fc90562e4.handle($PageRenderRequestHandler_11fc90562e4.java) > at > org.apache.tapestry5.internal.services.PageRenderDispatcher.process(PageRenderDispatcher.java:92) > at > org.apache.tapestry5.internal.services.PageRenderDispatcher.dispatch(PageRenderDispatcher.java:81) > at $Dispatcher_11fc90562ea.dispatch($Dispatcher_11fc90562ea.java) > at $Dispatcher_11fc90562dd.dispatch($Dispatcher_11fc90562dd.java) > at > org.apache.tapestry5.services.TapestryModule$17.service(TapestryModule.java:1029) > at > org.iana.ietf.ticketstatus.services.AppModule$1.service(AppModule.java:77) > at $RequestFilter_11fc90562dc.service($RequestFilter_11fc90562dc.java) > at $RequestHandler_11fc90562de.service($RequestHandler_11fc90562de.java) > at > org.apache.tapestry5.internal.services.LocalizationFilter.service(LocalizationFilter.java:42) > at $RequestHandler_11fc90562de.service($RequestHandler_11fc90562de.java) > at > org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26) > at $RequestHandler_11fc90562de.service($RequestHandler_11fc90562de.java) > at > org.apache.tapestry5.services.TapestryModule$3.service(TapestryModule.java:621) > at $RequestHandler_11fc90562de.service($RequestHandler_11fc90562de.java) > at > org.apache.tapestry5.services.TapestryModule$2.service(TapestryModule.java:611) > at $RequestHandler_11fc90562de.service($RequestHandler_11fc90562de.java) > at > org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:85) > at $RequestHandler_11fc90562de.service($RequestHandler_11fc90562de.java) > at > org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:93) > at > org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:84) > at > org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:83) > at > org.apache.tapestry5.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:106) > at $RequestHandler_11fc90562de.service($RequestHandler_11fc90562de.java) > at $RequestHandler_11fc90562d4.service($RequestHandler_11fc90562d4.java) > at > org.apache.tapestry5.services.TapestryModule$16.service(TapestryModule.java:1007) > at > org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62) > at > $HttpServletRequestFilter_11fc90562d3.service($HttpServletRequestFilter_11fc90562d3.java) > at > $HttpServletRequestHandler_11fc90562d5.service($HttpServletRequestHandler_11fc90562d5.java) > at > $HttpServletRequestHandler_11fc90562d2.service($HttpServletRequestHandler_11fc90562d2.java) > at org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:179) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) > at > org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) > at > org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) > at > org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) > at > org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726) > at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) > [DEBUG] pages.Index [ENTER] getTicket() > at > org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206) > at > org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) > at > org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) > at org.mortbay.jetty.Server.handle(Server.java:324) > at > org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) > at > org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:828) > at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514) > at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) > at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) > at > org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) > at > org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450) > [DEBUG] pages.Index [ EXIT] getTicket > [org.iana.ietf.ticketstatus.moodel.rtticketi...@2b60063] > [DEBUG] components.ViewTicket [ EXIT] getStatus [null] > [INFO] AppModule.TimingFilter Request time: 1832 ms > > > > > On 3/1/09 4:44 AM, "Alex Kotchnev" <akoch...@gmail.com> wrote: > > Simon, > I'm not entirely sure why the getTicketNumber() gets called before the > ticket gets set, maybe you can put in a break point in the method and look > at the stack trace and see what's calling it. Just looking at it like this, > I have no explanation why it's being called. > > On your question of not rendering the component based on its state : it > seems that it depends on how you want to do it. If this 'don't render > empty' > behavior is expected to be a part of the ViewTicket component, you can > always use a t:if to inspect the state of the ticket in the component > template render nothing if the ticket is in a state that shouldn't be > rendered. It seems that the best approach there would be to have 2 blocks : > one for empty ticket, one for "displayable" ticket, and then use a t:if to > select which block to render, e.g. > > <div id='content'> > <t:delegate to='contentBlock' /> > </div> > > <t:block t:id="fullContent"> .... </t:block> > <t:block t:id="emptyBlock"> ...</t:block> > > > ... and then in the component class ... > > @Component > Block fullContent > @Component > Block emptyBlock > > public Block getContentBlock() { > if (this.ticket.foo='bar') { > return emptyBlock; > } else { > fullContent; > } > } > > Something like that.. I haven't tested the exact code above, but I have a > few similar examples. I think JumpStart ( > http://jumpstart.doublenegative.com.au:8080/jumpstart/) has some examples > to > illustrate this but I don't have the exact URL for that. > > Cheers, > > Alex Kotchnev > > On Sun, Mar 1, 2009 at 12:09 AM, Simon Raveh <simon.ra...@icann.org> > wrote: > > > Hi, > > > > I'm switching from Tapestry 4 to to Tapestry 5 and I need help with a > > simple component. > > I have a component ViewTicket that display Ticket information. The tml > file > > code: > > > > <t:container xmlns:t=" > http://tapestry.apache.org/schema/tapestry_5_0_0.xsd > > "> > > <div style="display: block;" id="output"> > > <div id="assessment_panel"> > > <div class="safe" id="box_assessment"> > > <h2>Ticket Information</h2> > > </div> > > </div> > > <div id="results_panel"> > > <table id="ns_table"> > > <tbody> > > <tr> > > <th>Ticket ID</th> > > <th>Status</th> > > <th>Queue</th> > > <th>Created</th> > > </tr> > > <tr> > > <td>${ticketNumber}</td> > > <td>${status}</td> > > <td>${queue}</td> > > <td>${created}</td> > > </tr> > > </tbody> > > </table> > > </div> > > </div> > > </t:container> > > > > And the java code > > > > public class ViewTicket implements TicketViewer { > > > > @Inject > > private Logger logger; > > > > @Parameter(required = true) > > private RTTicket ticket; > > > > @Log > > @BeforeRenderTemplate > > void beforeRenderTamplate(){ > > } > > > > @Log > > public Long getTicketNumber() { > > return ticket == null ? null : ticket.getId(); > > } > > > > @Log > > public String getQueue() { > > return ticket == null ? null :ticket.getQueue(); > > } > > > > @Log > > public String getStatus() { > > return ticket == null ? null :ticket.getStatus(); > > } > > > > @Log > > public Date getCreated() { > > return ticket == null ? null : ticket.getCreated(); > > } > > > > public void addTicket(RTTicket ticket) { > > this.ticket = ticket; > > } > > > > public void clearTicket() { > > this.ticket = new RTTicketImpl(); > > } > > } > > And my page Index.tml > > > > <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" " > > http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> > > <html t:type="layout" xmlns:t=" > > http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> > > <body> > > <h1>Request (Ticket) Information</h1> > > <p>To check the status of your request, please enter the ticket > > number (numerical value only) below: </p> > > <form t:type="form" t:id="search_form" action="#"> > > <t:errors/> > > Ticket ID: > > <input t:type="TextField" t:id="ticketId" > > t:clientId="id_query" validate="required"/> > > <input type="submit" value="Submit Query" > > id="form-submit-button"/> > > </form> > > <span t:type="ViewTicket" t:ticket="prop:ticket" /> > > </body> > > </html> > > > > Index.java > > > > public class Index { > > > > @Inject > > private Logger logger; > > > > @Property > > private long ticketId; > > > > void onValidateForm() { > > > > } > > > > void onSuccess() { > > } > > > > @Log > > public RTTicket getTicket() { > > return new RTTicketImpl(); > > } > > } > > > > My problem is that Tapestry is calling the method getTicketNumber before > > the Ticket parameter is bound. > > Here are the logging output: > > > > [DEBUG] components.ViewTicket [ENTER] beforeRenderTamplate() > > [DEBUG] components.ViewTicket [ EXIT] beforeRenderTamplate > > [DEBUG] components.ViewTicket [ENTER] getTicketNumber() > > [DEBUG] pages.Index [ENTER] getTicket() > > [DEBUG] pages.Index [ EXIT] getTicket > > [org.iana.ietf.ticketstatus.moodel.rtticketi...@3805fd37] > > [DEBUG] components.ViewTicket [ EXIT] getTicketNumber [null] > > [DEBUG] components.ViewTicket [ENTER] getStatus() > > [DEBUG] components.ViewTicket [ EXIT] getStatus [null] > > [DEBUG] components.ViewTicket [ENTER] getQueue() > > [DEBUG] components.ViewTicket [ EXIT] getQueue [null] > > [DEBUG] components.ViewTicket [ENTER] getCreated() > > [DEBUG] components.ViewTicket [ EXIT] getCreated [null] > > > > Any clue to what I'm doing wrong or help will be much appreciate > > > > My second question is what the best way to cause the component ViewTicket > > not to render base on the state of the ticket it gets as parameter > > > > Thanks, > > Simon > > > >