Hi Farrukh,
On 26/06/2010, at 10:56 PM, Farrukh Ijaz wrote:
The worequest class is er.extensions.appserver.ERXRequest
The wocontext raises NullPointerException as request.context() returns null.
Sorry - better if do this in one of your components:
@Override
public void appendToResponse(WOResponse response, WOContext context) {
super.appendToResponse(response, context);
NSLog.out.appendln("request class:" + context.request().getClass().getName());
NSLog.out.appendln("context class:" + context.getClass().getName());
NSLog.out.appendln();
}
This should confirm that you're getting com.webobjects.jspservlet.WOServletContext at runtime which isn't what you want with Wonder.
Anyway, I've just committed the fix for the original commit for WONDER-389 (which obviously didn't get tested properly at the time). I've tested this with both WO5.3.3 and WO5.4.3 and in both cases _rewriteURL gets called appropriately allowing you to customise the url as desired.
As a work-around (prior to the updated build being available) you can do the following in your ERXApplication subclass:
@Override
public void installPatches() {
super.installPatches();
// if you're using WO5.3.3
setContextClassName(ERXWOServletContext.class.getName());
// if you're using WO5.4.3
setContextClassName(ERXWOServletContext54.class.getName());
}
So to rework your example to do the rewriting you could do the following...
------------------------------------------
@Override
public WOResponse dispatchRequest(WORequest request) {
String urlAlias = request.stringFormValueForKey("_alias");
if (!ERXStringUtilities.stringIsNullOrEmpty(urlAlias)) {
ERXThreadStorage.takeValueForKey(urlAlias, "url._alias");
}
return super.dispatchRequest(request);
}
// and to customise the urls I'd do something like...
@Override
public String _rewriteURL(String url) {
String resultURL = url;
// your custom rules here
String urlAlias = ERXThreadStorage.valueForKey("url._alias");
if (ERXStringUtilities.stringIsNullOrEmpty(urlAlias)) {
/* either */
resultURL = resultURL.replace(servletConnectURL(), urlAlias);
/* or, in case of multi-domain hosting */
String appBundleName = applicationName() + ".woa";
int index = url.indexOf(appBundleName);
if (index >= 0) {
index += appBundleName.length();
resultURL = urlAlias + resultURL.substring(index);
}
}
return resultURL;
}
On 2010-06-26, at 2:03 PM, Lachlan Deck wrote:
Hi Farrukh,
On 26/06/2010, at 2:05 PM, Farrukh Ijaz wrote:
I don't know why installPatches() didn't bring the change. Although I'm using Wonder's latest stable release so the change mentioned in the WONDER-389 should be reflected.
So are you using WO5.3.3 or WO5.4.3?
Well, let's confirm a few things first:
@Override
public WOResponse dispatchRequest(WORequest request) {
LOG.warn("worequest class:" + request.getClass().getName());
LOG.warn("wocontext class:" + request.context().getClass().getName());
...
}
What do you get?
However, I did my work around and thought to share with you as I found it to be flexible and dynamic and perhaps wonder team could implement something like this. <...snip custom application code...>
No. That's custom code. See below.
And defined following rewrite rules:
RewriteRule ^/app/(.*)$ /Application/WebObjects/MyApplication.woa/$1?_alias=/app [L,PT,QSA]
RewriteRule ^/xyz/(.*)$ /Application/WebObjects/MyApplication.woa/$1?_alias=/xyz [L,PT,QSA]
RewriteRule ^/abc/(.*)$ /Application/WebObjects/MyApplication.woa/$1?_alias=/abc [L,PT,QSA]
Now my application be accessed with three different aliases /app, /xyz and /abc and the response contains the corresponding rewritten url. No need to set the properties in the Properties for pattern and replace as that can be directly controlled with apache config file.
However, I would like to know I've implemented this change at right place or there is any other method which more appropriate such as _rewriteURL but that is still not working for me.
Yes, _rewriteURL is intended to be overridden by your subclasses for custom rewrite rules.
with regards,
--
Lachlan Deck