[ 
https://issues.apache.org/jira/browse/WICKET-2388?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Tim Boudreau updated WICKET-2388:
---------------------------------

    Attachment: pageParametersProxy.diff

Patch to PageParameters and class which implements proxying.

> Use dynamic proxies to hide PageParameters key/value pairs
> ----------------------------------------------------------
>
>                 Key: WICKET-2388
>                 URL: https://issues.apache.org/jira/browse/WICKET-2388
>             Project: Wicket
>          Issue Type: Improvement
>          Components: wicket
>    Affects Versions: 1.4.0
>         Environment: Any
>            Reporter: Tim Boudreau
>         Attachments: pageParametersProxy.diff
>
>   Original Estimate: 24h
>  Remaining Estimate: 24h
>
> Enable users to work with Java objects rather than key/value pairs in 
> PageParameters.
> I'm attaching a patch (with tests) that adds a method 
> public T <T> PageParameters.asObject (Class<T> type)
> The basic idea is that you pass in an interface type with getters and setters 
> following the beans pattern.  asObject() generates an implementation of that 
> interface (using dynamic proxies).  The bean property names of methods are 
> mapped to keys in the PageParameters, and type conversion is transparent.  So 
> you can, say, pass
> public interface MyData {
>    public String getCheese();
>    public void setCheese(String cheese);
>    public int getFoo();
>    public void setFoo(int val);
> }
> Populating a PageParameters is as simple as
> PageParameters p = new PageParameters();
> MyData data = p.asObject(MyData.class);
> data.setCheese ("Gouda");
> data.setFoo (42);
> ...then make a BookmarkablePageLink or whatever with it.
> On the page that receives the object, you simply do the same thing but call 
> getters to retrieve the data.  Much nicer than working with key/value pairs, 
> and completely eliminates the problem of typos in key names breaking things.
> See 
> http://weblogs.java.net/blog/timboudreau/archive/2008/08/objects_not_str.html 
> for the general concept - I'm putting together a small general framework for 
> this, but it's not available yet, and I figured a patch for PageParameters 
> would be nicer than adding a dependency to Wicket anyway.
> What would be truly slick is if this could be made completely transparent - 
> i.e.,
> public class MyPage extends WebPage {
>     public MyPage (MyData data) {
>     }
> }
> ...so if parameters are present, Wicket would search
> 1.  For a constructor taking PageParameters, as usual
> 2.  For a constructor taking an object whose class is an Interface type;  if 
> so, it calls PageParameters.asObject() with the type, and passes that
> 3.  A default no-arg constructor as now.
> This magical part could potentially be dangerous, so it might be best to mark 
> pages that want their constructor arguments transparently dereferenced to 
> have a marker annotation to indicate they really expect that behavior.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to