I’m encountering a problem with WebObjects 5.3.1 and WORedirect. It looks like WORedirect is encoding the ampersand (&) url parameter separator, but WO is not respecting this when it extracts the values again.
You can see this behavior with this code:
In your WOComponent:
public WORedirect createDA(){ NSMutableDictionary dict = new NSMutableDictionary(); dict.takeValueForKey("Zero", "valueZero"); dict.takeValueForKey(String.valueOf(1), "valueOne"); dict.takeValueForKey("Two", "valueTwo"); NSLog.out.appendln("Before: " + dict); String url = context().directActionURLForActionNamed( "default", dict ); WORedirect redirect = new WORedirect(context()); NSLog.out.appendln("URL: " + url); redirect.setUrl(url); return redirect; }
In your DirectAction Class:
public WOActionResults defaultAction() { NSLog.out.appendln("After: " + request().formValues()); return pageWithName("Main"); }
You’ll see something like this in the Console:
Pre: {valueZero = "Zero"; valueTwo = "Two"; valueOne = "1"; }
URL: /cgi-bin/WebObjects/NewWOTest.woa/wa/default?valueZero=Zero&valueTwo=Two&valueOne=1
After: {valueZero = ("Zero"); amp;valueTwo = ("Two"); amp;valueOne = ("1");}
Because WO doesn’t respect the encoding when it extracts the URL values you end up with munged dictionary keys. This pretty much breaks using WORedirect to call a DirectAction. I can’t see an easy workaround.
I’m still trying to figure out if this is a problem with my setup or whether it is a bug. If it’s a bug, I’ll be very disappointed. I use WORedirect extensively in a number of apps and this’ll mean I’ll have to revert to WO 5.2.4 (again).
Update: I filed a bug on this.
Update: OK this is really ugly. But… I need this to work, so as a hack I’m adding a line to my WORedirects so they look like this:
public WORedirect createDA(){ NSMutableDictionary dict = new NSMutableDictionary(); dict.takeValueForKey("Zero", "valueZero"); dict.takeValueForKey(String.valueOf(1), "valueOne"); dict.takeValueForKey("Two", "valueTwo"); NSLog.out.appendln("Pre: " + dict); String url = context().directActionURLForActionNamed( "default", dict ); url = url.replaceAll("&", "&"); WORedirect redirect = new WORedirect(context()); NSLog.out.appendln("URL: " + url); redirect.setUrl(url); return redirect; }