Option 1) Override your component's onInitialize/onConfigure and call page.setStatelessHint(true) Option 2) Copy/paste ComponentRenderer.java locally and do something similar directly in RenderPage
On Thu, Nov 21, 2013 at 11:29 AM, Mateusz Mieszkowski < mmieszkow...@objectivity.co.uk> wrote: > Martin, > > Ticket created: https://issues.apache.org/jira/browse/WICKET-5422 > Can you advise a workaround for now? > > Cheers, > Mateusz > > > -----Original Message----- > From: Martin Grigorov [mailto:mgrigo...@apache.org] > Sent: Thursday, November 21, 2013 9:49 AM > To: users@wicket.apache.org > Cc: Martin Dietze > Subject: Re: Rendering a component into a String > > Please create a ticket. > The page should be marked as stateless to avoid storing it. > > > On Thu, Nov 21, 2013 at 10:40 AM, Mateusz Mieszkowski < > mmieszkow...@objectivity.co.uk> wrote: > > > Hi guys, > > > > I noticed a problem with ComponentRenderer.renderComponent(). It is > > possible that I'm missing something but this is what I get for now: > > I'm using ComponenetRenderer withing CustomTooltipBehavior > > (wicket-jquery-ui) to generate tooltip content. I add this to about 50 > > rows in my table so I run renderComponent() method as many times. > > All worked fine but there was a problem with performance when I used > > Fragment component with markup attached to the WebPage. I did some > > digging and finally checked > > http://localhost:8080/context/wicket/internal/debug/diskDataStore and > > it appeared that for one request, Wicket stores 51 pages in it. All of > > the size of the whole page (about 300kB) and all of them named > > org.apache.wicket.core.util.string.ComponentRenderer$RenderPage. > > > > I changed implementation from Fragment to Panel componenet and the > > size was reduced to (1kB) but still all of these items were stored in > > the DataStore. > > > > It seems that this method is creating a dummy page in order to create > > the markup, but how can I avoid storing these pages? > > > > Best regards, > > Mateusz > > > > -----Original Message----- > > From: Martin Grigorov [mailto:mgrigo...@apache.org] > > Sent: Wednesday, November 13, 2013 2:09 PM > > To: users@wicket.apache.org; Martin Dietze > > Subject: Re: Rendering a component into a String > > > > Hi, > > > > See the source of > > http://www.wicket-library.com/wicket-examples-6.0.x/mailtemplate/?2exa > > mple > > > > > > On Wed, Nov 13, 2013 at 3:04 PM, Martin Dietze <d...@fh-wedel.de> wrote: > > > > > In a legacy project I've inherited I've got a piece of code that no > > > longer works since the project was upgraded from Wicket 1.4 to > > > Wicket 6. > > > > > > It's about rendering a component (a Wicket panel) into a string in > > > order to return it wrapped into a webservice reply. > > > > > > The webservice is based on Wicket, too. The webservice is based on a > > > Javascript handshake - the client calls the service using a token > > > connecting the user to his current session he has on the > > > application, the service replies are rendered into an iframe and > > > deliver their data through postMessage. > > > > > > Thus, when rendering a reply, I am basically rendering a Wicket page > > > within the context of my session. > > > > > > Now one of my API's calls requires me to render a Wicket panel into > > > a String, which is then wrapped into JSON as part of the respective > > > call's reply. > > > > > > The legacy code used to do this roughly like this (changes for using > > > the Wicket 6 API were applied, but this nevertheless never > > > worked): > > > > > > - create a mock RequestCycle by creating a MockHttpSession, a > > > MockHttpServletRequest and a MockHttpServletResponse, glue > > > this all together to obtain a ServletWebRequest and a > > > BufferedWebResponse and finaly use use > Application.createRequestCycle() > > > to create the RequestCycle object > > > > > > - the component wrapped into a ComponentRenderingRequestHandler > > > > > > - then this code is executed: > > > > > > | try { > > > | > requestCycle.scheduleRequestHandlerAfterCurrent(requestHandler); > > > | try { > > > | if ( !requestCycle.processRequestAndDetach() ) { > > > | requestCycle.scheduleRequestHandlerAfterCurrent(new > > > ErrorCodeRequestHandler((HttpServletResponse.SC_NOT_FOUND)); > > > | } > > > | } finally { > > > | requestCycle.getResponse().close(); > > > | } > > > | return requestCycle.getResponse().toString(); > > > | } finally { > > > | requestCycle.detach(); > > > | } > > > > > > I must admit I could not have written this myself :) > > > > > > Now when running this code, I run into two different > > > exceptions: > > > > > > org.apache.wicket.WicketRuntimeException: Exception in rendering > > > component: [Profile [Component id = profile]] > > > at > > > org.apache.wicket.Component.internalRenderComponent(Component.java:2 > > > 57 > > > 6) > > > [wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1493 > > > ) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.Component.internalRender(Component.java:2379) > > > [wicket-core-6.9.1.jar:6.9.1] > > > at org.apache.wicket.Component.render(Component.java:2307) > > > [wicket-core-6.9.1.jar:6.9.1] > > > [...] > > > Caused by: java.lang.NullPointerException: null > > > at > > > org.apache.wicket.markup.html.internal.Enclosure.isVisible(Enclosure > > > .j > > > ava:143) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.Component.determineVisibility(Component.java:4363) > > > [wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.Component.internalBeforeRender(Component.java:916) > > > [wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.Component.beforeRender(Component.java:991) > > > [wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.Component.internalPrepareForRender(Component.java: > > > 22 > > > 14) > > > [wicket-core-6.9.1.jar:6.9.1] > > > at org.apache.wicket.Component.render(Component.java:2303) > > > [wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:13 > > > 90 > > > ) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.MarkupContainer.renderAll(MarkupContainer.java:155 > > > 4) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupConta > > > in > > > er.java:1529) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer > > > .j > > > ava:1484) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.markup.html.panel.DefaultMarkupSourcingStrategy.on > > > Co > > > mponentTagBody(DefaultMarkupSourcingStrategy.java:71) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.Component.internalRenderComponent(Component.java:2 > > > 54 > > > 9) > > > [wicket-core-6.9.1.jar:6.9.1] > > > > > > The enclosure's child component is null, as we see here: > > > | @Override > > > | public boolean isVisible() > > > | { > > > | return childComponent.determineVisibility() && > > > super.isVisible(); > > > | } > > > > > > Below that exception I find the markup of a stack trace page in my > logs. > > > Below that markup I get another stack trace: > > > > > > java.lang.NullPointerException: null > > > at > > > org.apache.wicket.Component.internalPrepareForRender(Component.java: > > > 22 > > > 24) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.Page.internalPrepareForRender(Page.java:241) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at org.apache.wicket.Component.render(Component.java:2303) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at org.apache.wicket.Page.renderPage(Page.java:1010) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.request.handler.render.WebPageRenderer.renderPage( > > > We > > > bPageRenderer.java:121) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.request.handler.render.WebPageRenderer.respond(Web > > > Pa > > > geRenderer.java:271) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.core.request.handler.RenderPageRequestHandler.resp > > > on > > > d(RenderPageRequestHandler.java:165) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond > > > (R > > > equestCycle.java:861) > > > ~[wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.request.RequestHandlerStack.execute(RequestHandler > > > St > > > ack.java:64) > > > ~[wicket-request-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.ja > > > va > > > :261) > > > [wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestC > > > yc > > > le.java:218) > > > [wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach > > > (R > > > equestCycle.java:289) > > > [wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(Wic > > > ke > > > tFilter.java:259) > > > [wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFi > > > lt > > > er.java:201) > > > [wicket-core-6.9.1.jar:6.9.1] > > > at > > > org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.j > > > av > > > a:282) > > > [wicket-core-6.9.1.jar:6.9.1] > > > > > > Here the RequestCycle is null: > > > | if (setRenderingFlag) > > > | { > > > | // only process feedback panel when we are about to > > > | be > > > rendered. > > > | // setRenderingFlag is false in case > > > | prepareForRender is > > > called only to build component > > > | // hierarchy (i.e. in > > > BookmarkableListenerInterfaceRequestTarget). > > > | // prepareForRender(true) is always called before > > > | the > > > actual rendering is done so > > > | // that's where feedback panels gather the messages > > > | > > > | List<Component> feedbacks = > > > getRequestCycle().getMetaData(FEEDBACK_LIST); > > > > > > To me it seems like I've got two different problems here: > > > > > > - the component cannot be rendered because I'm doing something > > > fundamentally wrong, thus I'm not getting the expected output > > > > > > - after the mock-RequestCycle's done with its work, there's no > > > RequestCycle set anymore, thus I cannot render the reply > > > > > > > > > I understand that my problem may be rather specific. And since this > > > is webservice that is already in use, I cannot just rewrite it > > > completely. Thus I would greatly appreciate any hint how i could > > > accomplish what the old code used to do before the Wicket upgrade? > > > > > > Cheers, > > > > > > M'bert > > > > > > -- > > > ----------- / http://herbert.the-little-red-haired-girl.org / > > > ------------- > > > =+= > > > Pilot: Call me a fuel truck. > > > Tower: You're a fuel truck. > > > > > > -------------------------------------------------------------------- > > > - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > > > For additional commands, e-mail: users-h...@wicket.apache.org > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > > For additional commands, e-mail: users-h...@wicket.apache.org > > > > >