You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Guillaume Mary <Gu...@interview-efm.com> on 2012/08/24 15:32:13 UTC

Interpolate response with IResponseFilter

Hi all,

Here is my use case: I need to fill variables, like {myVar}, that are rendered into the page. My approach is to use a specialized IResponseFilter for that. The important point is the filter should be applied to a certain Page of my application, and more of that, the variable values are picked up in this particular page (they are stored in a specific attribute of the page instance).

All was right in Wicket 1.4, I was able to check the targeted page in the IResponseFilter thanks to the code:
Page page = RequestCycle.get().getResponsePage();

Since Wicket 1.5, the getResponsePage() method disappeared, so I'm facing trouble to check (and get) my page.
I tried to replace the so simple getResponsePage() by some combination of overriden MountedMapper, WebPageRendered, BufferedResponseRequestHandler, or RequestCycle, etc, but I didn't manage to fill all the traps to ensure that all requests made by the user on the page are interpolated. Here is what I found:
- the first time the user opens the page seems to be treated by overriding WebPageRenderer.respond() and testing his renderPageRequestHandler.getPageClass()
- the Ajax case (user clicks on an ajax link on my page, I should interpolate the result response) seems to be treated by checking the result of PageInstanceMapper.mapRequest(..) to see if it's a IPageRequestHandler, then getting the page thru pageProvider
- the worst case is the redirecting one: the user click on a link that makes a setResponsePage(MyPage) then Wicket uses a temporary buffered response stored in WebApplication.storedResponse, then sends redirect to client, which recalls Wicket thats serves the cached response ! The second request doesn't contain the targeted Page because a BufferedResponseRequestHandler takes priority

Done all of that, the result is not always good, there are still unterpolated variables in my HTML.

It seems to be so complicated that I'm asking myself if i'm on the good way.
Does anyone can help me accomplish my use case ? (a good knowledge of wicket 1.5 request handling seems to be necessary !)

Thanks

Re: Interpolate response with IResponseFilter

Posted by Sven Meier <sv...@meiers.net>.
Where do these {myVar}s come from?

Sven

On 08/24/2012 03:32 PM, Guillaume Mary wrote:
> Hi all,
>
> Here is my use case: I need to fill variables, like {myVar}, that are rendered into the page. My approach is to use a specialized IResponseFilter for that. The important point is the filter should be applied to a certain Page of my application, and more of that, the variable values are picked up in this particular page (they are stored in a specific attribute of the page instance).
>
> All was right in Wicket 1.4, I was able to check the targeted page in the IResponseFilter thanks to the code:
> Page page = RequestCycle.get().getResponsePage();
>
> Since Wicket 1.5, the getResponsePage() method disappeared, so I'm facing trouble to check (and get) my page.
> I tried to replace the so simple getResponsePage() by some combination of overriden MountedMapper, WebPageRendered, BufferedResponseRequestHandler, or RequestCycle, etc, but I didn't manage to fill all the traps to ensure that all requests made by the user on the page are interpolated. Here is what I found:
> - the first time the user opens the page seems to be treated by overriding WebPageRenderer.respond() and testing his renderPageRequestHandler.getPageClass()
> - the Ajax case (user clicks on an ajax link on my page, I should interpolate the result response) seems to be treated by checking the result of PageInstanceMapper.mapRequest(..) to see if it's a IPageRequestHandler, then getting the page thru pageProvider
> - the worst case is the redirecting one: the user click on a link that makes a setResponsePage(MyPage) then Wicket uses a temporary buffered response stored in WebApplication.storedResponse, then sends redirect to client, which recalls Wicket thats serves the cached response ! The second request doesn't contain the targeted Page because a BufferedResponseRequestHandler takes priority
>
> Done all of that, the result is not always good, there are still unterpolated variables in my HTML.
>
> It seems to be so complicated that I'm asking myself if i'm on the good way.
> Does anyone can help me accomplish my use case ? (a good knowledge of wicket 1.5 request handling seems to be necessary !)
>
> Thanks
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Interpolate response with IResponseFilter

Posted by "guillaume.mary" <gu...@interview-efm.com>.
After searching a bit, I found that AbstractTransformerBehavior replaces the
RequestCycle.response temporarly to put its own, between beforeRender en
afterRender methods, whereas other classes manipulates the response during
that phase, so when AbstractTransformerBehavior puts back the "original"
response, it is no more the "official" response.
In fact I'm not sure that AbstractTransformerBehavior is for me, i'm going
to write my own behavior which doesn't keep the "orginal" response. First
tests seem promising.



--
View this message in context: http://apache-wicket.1842946.n4.nabble.com/Interpolate-response-with-IResponseFilter-tp4651476p4651529.html
Sent from the Users forum mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Interpolate response with IResponseFilter

Posted by "guillaume.mary" <gu...@interview-efm.com>.
Thanks for the tip Sven, I will give it a try.
For now I have another issue about the AbstractTransformerBehavior: as soon
as I add it to my Page, I get encoding problems of characters into my page,
this is weird. Here is my very simple transformer:
new AbstractTransformerBehavior() {
    public CharSequence transform(Component component, CharSequence output)
throws Exception {
        return output.toString();
    }
}

You should ask "why are you using output.toString() since returning output
is sufficient ?". Well, the begining of the story is that I really need a
String instance to be interpolated by Wicket MapVariableInterpolator, I
encountered encoding problems so I removed interpolation and came to the
above code.

The encoding problem is that accent characters are replaced by ? in my
browser.

So, I realized that response headers are very different (in my client
browser) with and without an AbstractTransformerBehavior. I think it
shouldn't and I'm guessing that's the cause of my charset problems.
AbstractTransformerBehavior seems to lose the initial headers, but I didn't
see anything for that in Wicket code.
Any idea ?



--
View this message in context: http://apache-wicket.1842946.n4.nabble.com/Interpolate-response-with-IResponseFilter-tp4651476p4651525.html
Sent from the Users forum mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Interpolate response with IResponseFilter

Posted by Sven Meier <sv...@meiers.net>.
Just an idea:

You could use an AjaxRequestTarget.IListener which adds a temporary 
behavior to the updated components.

Sven

On 08/24/2012 06:19 PM, guillaume.mary wrote:
> Because I didn't know AbstractTransformerBehavior  ! :)
> Many thanks !
> I put it on my Page instance so it fullfills the last case of post +
> redirect (but the filter is still necessary for components refreshed by
> Ajax, otherwise I should add AbstractTransformerBehavior to all components
> of my Page)
>
>
>
>
>
> --
> View this message in context: http://apache-wicket.1842946.n4.nabble.com/Interpolate-response-with-IResponseFilter-tp4651476p4651486.html
> Sent from the Users forum mailing list archive at Nabble.com.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Interpolate response with IResponseFilter

Posted by "guillaume.mary" <gu...@interview-efm.com>.
Because I didn't know AbstractTransformerBehavior  ! :)
Many thanks !
I put it on my Page instance so it fullfills the last case of post +
redirect (but the filter is still necessary for components refreshed by
Ajax, otherwise I should add AbstractTransformerBehavior to all components
of my Page)





--
View this message in context: http://apache-wicket.1842946.n4.nabble.com/Interpolate-response-with-IResponseFilter-tp4651476p4651486.html
Sent from the Users forum mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Interpolate response with IResponseFilter

Posted by Sven Meier <sv...@meiers.net>.
> my {myVar}s comes from HTML, or even model of components

If these placeholders are in your HTML, why don't you just use an AbstractTransformerBehavior to fill them?

Sven


On 08/24/2012 04:51 PM, guillaume.mary wrote:
> Thanks Martin, it's easier to find the actual page with
> PageRequestHandlerTracker.
>
> Nevertheless, the redirecting case is still not filled because as I
> debugged, PageRequestHandlerTracker returns null for both first and last
> handler when my filter is called (am i wrong ??). That's almost the same
> problem as wicket 1.5.7: there's no more IRequestHandler during call of
> IResponseFilter.filter(..) on the second request. It's handle by a
> BufferedResponseRequestHandler at the beggining but it disappears !
>
> @Sven: my {myVar}s comes from HTML, or even model of components
>
>
>
> --
> View this message in context: http://apache-wicket.1842946.n4.nabble.com/Interpolate-response-with-IResponseFilter-tp4651476p4651480.html
> Sent from the Users forum mailing list archive at Nabble.com.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Interpolate response with IResponseFilter

Posted by "guillaume.mary" <gu...@interview-efm.com>.
Thanks Martin, it's easier to find the actual page with
PageRequestHandlerTracker.

Nevertheless, the redirecting case is still not filled because as I
debugged, PageRequestHandlerTracker returns null for both first and last
handler when my filter is called (am i wrong ??). That's almost the same
problem as wicket 1.5.7: there's no more IRequestHandler during call of
IResponseFilter.filter(..) on the second request. It's handle by a
BufferedResponseRequestHandler at the beggining but it disappears ! 

@Sven: my {myVar}s comes from HTML, or even model of components



--
View this message in context: http://apache-wicket.1842946.n4.nabble.com/Interpolate-response-with-IResponseFilter-tp4651476p4651480.html
Sent from the Users forum mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Interpolate response with IResponseFilter

Posted by Martin Grigorov <mg...@apache.org>.
Hi,

In Wicket 1.5.8 there is
org.apache.wicket.request.cycle.PageRequestHandlerTracker which you
can use to get the requested page and the response page. In your case
you need the latter.

PageRequestHandlerTracker.getLastHandler(cycle), then check whether it
is IPageRequestHandler and call #getPage() on it.

On Fri, Aug 24, 2012 at 4:32 PM, Guillaume Mary
<Gu...@interview-efm.com> wrote:
> Hi all,
>
> Here is my use case: I need to fill variables, like {myVar}, that are rendered into the page. My approach is to use a specialized IResponseFilter for that. The important point is the filter should be applied to a certain Page of my application, and more of that, the variable values are picked up in this particular page (they are stored in a specific attribute of the page instance).
>
> All was right in Wicket 1.4, I was able to check the targeted page in the IResponseFilter thanks to the code:
> Page page = RequestCycle.get().getResponsePage();
>
> Since Wicket 1.5, the getResponsePage() method disappeared, so I'm facing trouble to check (and get) my page.
> I tried to replace the so simple getResponsePage() by some combination of overriden MountedMapper, WebPageRendered, BufferedResponseRequestHandler, or RequestCycle, etc, but I didn't manage to fill all the traps to ensure that all requests made by the user on the page are interpolated. Here is what I found:
> - the first time the user opens the page seems to be treated by overriding WebPageRenderer.respond() and testing his renderPageRequestHandler.getPageClass()
> - the Ajax case (user clicks on an ajax link on my page, I should interpolate the result response) seems to be treated by checking the result of PageInstanceMapper.mapRequest(..) to see if it's a IPageRequestHandler, then getting the page thru pageProvider
> - the worst case is the redirecting one: the user click on a link that makes a setResponsePage(MyPage) then Wicket uses a temporary buffered response stored in WebApplication.storedResponse, then sends redirect to client, which recalls Wicket thats serves the cached response ! The second request doesn't contain the targeted Page because a BufferedResponseRequestHandler takes priority
>
> Done all of that, the result is not always good, there are still unterpolated variables in my HTML.
>
> It seems to be so complicated that I'm asking myself if i'm on the good way.
> Does anyone can help me accomplish my use case ? (a good knowledge of wicket 1.5 request handling seems to be necessary !)
>
> Thanks



-- 
Martin Grigorov
jWeekend
Training, Consulting, Development
http://jWeekend.com

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org