> I don't understand what you mean by "the handling of the {rr} template".
> The approach I suggested, overriding getTargetRef, ignores the template
> argument entirely.
> 

In my old code, I had:
URI = hardcoded URI to resource 
Redirector redir = new Redirector(router.getContext(), URI + "{rr}",
              Redirector.MODE_SERVER_OUTBOUND);
router.attach("", redir, Template.MODE_STARTS_WITH);

So, when I pass in http://foo:port/a/b/c, it redirects to URI/a/b/c

In my new code, I pass in the target template simply as {rr} and then iin the 
getTargetRef, I do:
protected Reference getTargetRef(Request request, Response response) {
    URI serviceURI = serviceLocator.getServiceURI(service); //THIS looks up the 
location of the service
    // Create the template
    Template rt = new Template(this.targetTemplate);
    rt.setLogger(getLogger());

    // Return the formatted target URI
    if (new Reference(this.targetTemplate).isRelative()) {
      // Be sure to keep the resource's base reference.
      //Reference baseRef = new Reference(serviceURI.uri);
      if (log.isInfoEnabled()) {
        log.info("dynRedir from {} to {}", request.getResourceRef(), 
serviceURI.uri);
      }
      String format = rt.format(request,
              response);
      try {
        return new Reference(new URI(serviceURI.uri.toString() + format));
      } catch (URISyntaxException e) {
        log.error("Exception", e);
        throw new RuntimeException(e);
      }
    }

    return new Reference(rt.format(request, response));
  }
///////////////////

I attach my DynamicRedirector at, for example, "/a".  When I pass in 
"http://foo:port/a/b/c";, I want it to select my DynamicRedirector due to the 
"/a" (I'm using STARTS_WITH mode) part and then redirect to the target by 
passing along "b/c" (i.e. the {rr} part) such that the new URL would be 
something like "http://dynamicHost:port/b/c";, based on what my serviceLocator 
returns.  Like I said, it works great if I'm just matching at "/a", but it 
doesn't handle the "/b/c" part.  AFAICT, the handle() methods in Restlet are 
continuing to resolve down to the last endpoint (i.e. "b/c") even though it has 
a match at "/a".

I will see if I can work up a standalone test example to demonstrate it.

------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=3054458

Reply via email to