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
> >
>
>

Reply via email to