Well, fair enough, Jesse -- may this probably isn't as elementary as
I presume.
Still, I'm willing to say that session and other server-side state
may have changed since the login attempt; all I really want to repeat
is the same attempted user action: view X, edit Y. The architecture
of the app is such that reproducing the same HTTP request is good
enough. And perhaps the best way of doing that really is to bypass
Tapestry and take a direct snapshot of the HttpServletRequest, as I'm
doing.
Still feels like a hack, though!
Cheers, P
On May 1, 2006, at 9:34 PM, Jesse Kuhnert wrote:
You might not be getting a lot of responses because it sounds like
a very
tough problem to solve.
Mostly because the only way you'd be able to get someone back to a
state
~exactly~ the way it was when they were directed to login would be
a fairly
large hunk of work. There is all kinds of state associated with
sections of
an application. Some in http session, some in the client, all over the
place.
I think a saner approach might be to start with just getting them
back to
the same IPage they were in. You can work your way out from there
if you
felt like trying to re-create the state of the current request.
On 5/1/06, Paul Cantrell <[EMAIL PROTECTED]> wrote:
My original email on this topic generated discussion -- but alas, it
was all about whether to split this list (agreed that's a bad idea),
and not about the actual question.
Quick review: I want to create an ICallback to repeat the current
request, regardless of what service is handling that request.
Here's the solution I came up with. It's not a completely
satisfactory solution, because (1) it feels hackish, and (2) I really
feel like I'm doing too much work for what seems like an elementary
and common problem. I still feel I must be missing something, and
would appreciate any helpful hints!
My page base class (this could also be a service, or whatever) just
fetches the raw HttpServletRequest, and passes that to a custom
ICallback that does its best to reproduce the request:
public abstract class ImreBasePage extends BasePage {
@InjectObject("service:tapestry.globals.HttpServletRequest")
public abstract HttpServletRequest getRequest();
protected ICallback getCallback() {
if(getRequest().getMethod().equals("GET"))
return new RedirectCallback(getRequest());
// Could try to make RedirectCallback handle POST, but it's
a bad idea,
// at least in the case of my app.
return null;
}
}
public class RedirectCallback implements ICallback {
private final URL url;
public RedirectCallback(URL uri) {
this.url = uri;
}
public RedirectCallback(HttpServletRequest req) {
StringBuffer urlS = req.getRequestURL();
if(!StringUtils.isEmpty(req.getQueryString())) {
urlS.append('?');
urlS.append(req.getQueryString());
}
try {
url = new URL(urlS.toString());
} catch(MalformedURLException e) {
throw new IllegalArgumentException("broken request gives
malformed URI: " + urlS, e);
}
}
public void performCallback(IRequestCycle cycle) {
cycle.sendRedirect(url.toExternalForm());
}
}
Can I improve this code? Is there some utility I'm missing that does
this for me? Is this a valid approach that I should be submitting to
Tapestry? Anyone? Anyone? Beuller?
This is on Tapestry 4.0.1, BTW. :P
Cheers,
Paul
On Apr 30, 2006, at 11:50 PM, Paul Cantrell wrote:
> I want to create a generic utility method to check whether a user
> is logged in, and redirect them to a login page if necessary.
>
> To do this, I need to create an ICallback in the general case. In
> other words, I don't know whether I'm create an ExternalCallback or
> a PageCallback or a DirectCallback or what have you. I just want to
> create a callback for whatever the current request is, if such a
> callback is possible.
>
> Ideally, there would be a IPage.getCallback() method, or something
> like it -- but I can't find one.
>
> I did find some code on the mailing list involving things like "if
> (this instanceof IExternalPage)" ... yuck! Surely there's a better
> way, and I'm just missing it? I've dug around in the docs and list
> archives, but can't turn anything up. ICallback isn't even
> mentioned in the user guide, as far as I can tell....
>
> Cheers,
>
> Paul
_________________________________________________________________
Piano music podcast: http://inthehands.com
Other interesting stuff: http://innig.net
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: tapestry-user-
[EMAIL PROTECTED]
--
Jesse Kuhnert
Tacos/Tapestry, team member/developer
Open source based consulting work centered around
dojo/tapestry/tacos/hivemind.
_________________________________________________________________
Piano music podcast: http://inthehands.com
Other interesting stuff: http://innig.net
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]