sure, no one is stopping you from starting a wicketstuff project.
-igor
On Sat, May 3, 2008 at 3:23 PM, Doug Donohoe <[EMAIL PROTECTED]> wrote:
>
> Yes, you can do that. But I prefer not to have to modify Application when I
> add a new page. With an annotation-based approach, I define a page,
> annotate it and then I'm done.
>
> Really, this is just a philosophical difference. Rather than argue which is
> better, we could offer both. Annotation usage is a matter of preference.
> Some people will want to use it; others not. Adding mounts in the
> application init() method may make more sense for some applications than
> others. In my application, I think using annotations is much simpler.
>
> The code I have is working and is pretty non-invasive change to
> WebRequestCodingStrategy (see below for how I did it via subclassing). I
> need to get Wicket building in my environment so I can figure out where to
> put the annotation classes so I can submit a patch.
>
> -Doug
>
> public class AnnotationAwareWebRequestCodingStrategy extends
> WebRequestCodingStrategy
> {
> @Override
> protected IRequestTargetUrlCodingStrategy getMountEncoder(IRequestTarget
> requestTarget)
> {
> IRequestTargetUrlCodingStrategy strategy =
> super.getMountEncoder(requestTarget);
>
> // if no strategy found, see if there is one we can create via
> annotations
> if (strategy == null)
> {
> strategy = getAnnotatedMountEncoder(requestTarget);
> if (strategy != null)
> {
> mount(strategy);
> }
> }
> return strategy;
> }
>
> protected IRequestTargetUrlCodingStrategy
> getAnnotatedMountEncoder(IRequestTarget requestTarget)
> {
> IRequestTargetUrlCodingStrategy strategy = null;
>
> // If this is a bookmarkable page reqeuest, see if it has a mount
> annotation
> if (requestTarget instanceof IBookmarkablePageRequestTarget)
> {
> // Look for @MountPath annotation on the page class
> IBookmarkablePageRequestTarget target =
> (IBookmarkablePageRequestTarget)requestTarget;
> Class<? extends Page> pageClass = target.getPageClass(); // FIX:
> this may change in Wicket 1.4
> strategy = getAnnotatedMountEncoder(pageClass);
> }
> return strategy;
> }
>
> protected IRequestTargetUrlCodingStrategy
> getAnnotatedMountEncoder(Class<? extends Page> pageClass)
> {
> // ... meat of the code here ...
>
>
> }
>
>
> igor.vaynberg wrote:
> >
> > i prefer a simple factory method on pages that construct
> > pageparameters or even an entire bookmarkable page link...
> >
> > PageParameters params=Leaderboard.newPageParameters(someType, someDays);
> > add(new BookmarkablePageLink("id", Leaderboard.class, params));
> >
> > or just
> >
> > add(Leaderboard.newBookmarkableLink("id", someType, someDays));
> >
> > encapsulation without all the overhead of annots, etc
> >
> > -igor
> >
> >
> > On Sat, May 3, 2008 at 2:25 PM, Doug Donohoe <[EMAIL PROTECTED]> wrote:
> >>
> >> One thing that is valuable is encapsulation. For example, take my
> >> Leaderboard class which has two main inputs via PageParameters:
> >>
> >>
> >>
> >> static final String PARAM_TYPE = "type";
> >> static final String PARAM_DAYS = "days";
> >>
> >> Now, using the current metaphor, I when I want to mount using a
> >> MixedParam
> >> strategy, I have to (a) expose these as public and (b) then add code in
> >> my
> >> init() method like:
> >>
> >> mount(new MixedParamUrlCodingStrategy("leaderboard",
> >> Leaderboard.class,
> >> new String { Leaderboard.PARAM_TYPE,
> >> Leaderboard.PARAM_DAYS});
> >>
> >> I'm exposing information I don't really want to. Instead, why I'm doing
> >> now
> >> is:
> >>
> >> @MountPath(path = "leaderboard")
> >> @MountMixedParam(parameterNames = {Leaderboard.PARAM_TYPE,
> >> Leaderboard.PARAM_DAYS})
> >> public class Leaderboard extends WebPage { ... }
> >>
> >> If I add or change the PARAMS, I only have to change Leaderboard - it
> >> controls how it is mounted rather than up at the Application level.
> >>
> >> If somebody else wants to use this page and change the mount point, they
> >> can
> >> subclass:
> >>
> >> @MountPath(path = "my/leaderboard")
> >> public class MyLeaderboard extend Leaderboard
> >>
> >> The @MountMixedParam annotation is inherited wherea the @MountPath is
> >> not.
> >> I haven't tested this yet (I'll add it to my unit test), but you could
> >> also
> >> specify a different mount strategy than MixedParam if you wanted to
> >> override
> >> that.
> >>
> >> If a class is not annotated with @MountPath, it is not mountable (via
> >> annotations).
> >>
> >> If you just define @MountPath and no supporting annotation, it defaults
> >> to
> >> BookmarkablePage...Strategy.
> >>
> >> Regarding multiple mounts, I could add that by making path a string
> >> array -
> >> I wasn't sure how often that was used because the way
> >> WebRequestCodingStrategy.getMountEncoder works is that it picks the
> >> first
> >> one it finds (when mapping a class to a mount path).
> >>
> >> For the curious, @MountMixedParam is defined as follows:
> >>
> >> @Target({ ElementType.TYPE })
> >> @Retention(RetentionPolicy.RUNTIME)
> >> @MountDefinition(strategyClass = MixedParamUrlCodingStrategy.class,
> >> argOrder = {"pageMapName", "parameterNames"})
> >> @Inherited
> >> @Documented
> >> public @interface MountFixedMixedParam
> >> {
> >> String pageMapName() default MountDefinition.NULL;
> >>
> >> String[] parameterNames();
> >> }
> >>
> >> This basically defines how to construct the mount strategy class and
> >> what
> >> the params are. One of these would need to be defined for each of the
> >> half-dozen or so UrlCodingStrategies. We could make them inner
> >> interfaces
> >> to keep the definition with the class.
> >>
> >> Note that this mechanism allows for easy extension by end-users.
> >>
> >> I'm using this in my site and it is quite nice.
> >>
> >> I'll post more details later - I'm still testing, etc.
> >>
> >> -Doug
> >>
> >>
> >> Johan Compagner wrote:
> >> >
> >> > personally i dont see any added value.
> >> > It is stil a line of "code", no gain here.
> >> > then scattered throughout your code base
> >> > also you have to make sure that you can have then multiply of those
> >> mounts
> >> > for 1 class
> >> > i use the same pages under different mounts..
> >> >
> >> > also what happens if you package your pages and somebody else uses it
> >> > or you start to also use them in an other project...
> >> > But that doesnt want those mount points... what then? you cant remove
> >> them
> >> > because then the first app breaks...
> >> > I still think mounting and stuff is something the Application is
> >> > responsible
> >> > for not the web app itself.
> >> >
> >> > I could see an annotation like: @Unmountable ...
> >> > Because it is sort of a security hole in wicket now. If a page has a
> >> > default
> >> > constructor and i know the name i could just show it... (of no other
> >> > security prevents that)
> >> > Ofcourse this is very hypothetical and not very likely that it will be
> >> > abused because you have to know classnames (but these can spoil out
> >> when
> >> > not
> >> > carefull with shared resouces..)
> >> >
> >> >
> >> > johan
> >> >
> >> >
> >>
> >> --
> >> View this message in context:
> >>
> http://www.nabble.com/how-to-contribute---wicket-1.4-plans-tp17034501p17039998.html
> >> Sent from the Wicket - Dev mailing list archive at Nabble.com.
> >>
> >>
> >
> >
>
> --
> View this message in context:
> http://www.nabble.com/how-to-contribute---wicket-1.4-plans-tp17034501p17040515.html
>
>
> Sent from the Wicket - Dev mailing list archive at Nabble.com.
>
>