Hi Anonymous,
On Sep 21, 2009, at 4:03 PM, webp...@tigris.org wrote:
> hi,
>
> I am trying to do:
> {{{
>
> final Router router = new Router();
> router.attach("/about", new DirectToTemplateResource
> ("about.xml").getClass());
> router.attach("/contact", new DirectToTemplateResource
> ("contact.xml"));
>
> }}}
>
> DirectToTemplateResource will return StringRepresentation of HTML
> according to some template passed in the constructor.
>
> But since Router tries to instantiate DirectToTemplateResource()
> using default constructor (which does not exist), I can't make it
> happen.
>
> I am sure I'm not using Restlet properly.
> What am I misunderstanding?
Restlet resources are not singletons -- a new instance is created to
handle each request.
>
> As a way around, I could do:
> {{{
> router.attach("/about", AboutResource.class);
> router.attach("/contact", ContactResource.class);
> }}}
>
> But I need to create many similar classes.
>
> I also tried to extend Restlet (or Application) because
> router.attach takes Restlet instance.
>
> Is it safe for me to override Restlet.handle() method? So, my code
> would look like:
> {{{
> router.attach("/about", new RenderTemplateRestlet("about.xml"));
> router.attach("/contact", new RenderTemplateRestlet("contact.xml"));
> }}}
>
> where RenderTemplateRestlet will have handle() method overloaded
> properly.
This is one solution, but you lose out on a lot of Restlet's
usefulness if you go this route.
> What's a best way to do what I'm trying to do?
Two options:
1) Since in your example the template filename seems to be based on
the URL, you could modify DirectToTemplateResource to infer the
template to use based on the request information.
2) If you do need to be explicit about the template filename (i.e., if
the template filename isn't always directly related to the URL), you
can extend org.restlet.Finder. Depending on which version of restlet
you're using, you'll need to either override #createTarget (1.1) or
#create (2.0) to create instances of your resource. Then you'll wire
up instances of your new finder to the router. See the Finder javadoc
for more info.
Rhett
--
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2397825