Hi Bruno and Tim,

 

This is a good idea but I need to spend a little more time thinking about it
and the implementation. Ideally, it should be usable for all methods, not
just PUT. I’d like to have some better factorized code, ideally using a
cache as suggested by Tim, so I entered a RFE:

 

“Allow using get(Variant) to return representation after PUT”

http://restlet.tigris.org/issues/show_bug.cgi?id=961

 

Best regards,
Jerome Louvel
--
Restlet ~ Founder and Lead developer ~  <http://www.restlet.org/>
http://www.restlet.org
Noelios Technologies ~ Co-founder ~  <http://www.noelios.com/>
http://www.noelios.com

 

 

 

 

De : [email protected] [mailto:[email protected]] De la part de Tim
Peierls
Envoyé : mardi 17 novembre 2009 17:29
À : [email protected]
Objet : Re: [2.0 trunk] Using get(Variant) to return representation after
PUT

 

If your patch is accepted, it would be nice to have the logic in the first
else-clause cached (in a manner similar to that of
AnnotationUtils.getAnnotationDescriptors) so that it becomes a relatively
inexpensive map lookup on a Variant key.

 

It looks odd to me to mix the annotation approach with the non-annotation
approach in this way, but I can guess how you got to that point.

 

--tim

On Tue, Nov 17, 2009 at 11:06 AM, Bruno Harbulot
<[email protected]> wrote:

Hello,

I've just tried a short-cut to return the representation after a PUT:
calling get(variant), but it doesn't work as if it was doing a direct
GET. I'm not sure if it's a just a bad idea or if we should try to make
it work.

The test case looks like this:

public MyClass extends ServerResource {
  @Get("xml")
  public Document toXml() {
     return ...;
  }

  public Representation put(Representation input, Variant variant) {
    // Do something with input.

    return get(variant);
  }
}


The problem with this approach is that 'variant' is not an instance of
'VariantInfo', so in ServerResource.get(Variant), doHandle isn't called:
     if (variant instanceof VariantInfo) {
         result = doHandle(((VariantInfo) variant).getAnnotationInfo(),
             variant);
     } else {
         setStatus(Status.CLIENT_ERROR_METHOD_NOT_ALLOWED);
     }



To make get(variant) from a variant that's not a VariantInfo, something
like the following patch could work. I'm just not sure if it's worth
doing it this way. Any thoughts?

Best wishes,

Bruno.



diff --git
a/modules/org.restlet/src/org/restlet/resource/ServerResource.java
b/modules/org.restlet/src/org/restlet/resource/ServerResource.java
index 1dfee23..39dd86d 100644
--- a/modules/org.restlet/src/org/restlet/resource/ServerResource.java
+++ b/modules/org.restlet/src/org/restlet/resource/ServerResource.java
@@ -635,9 +635,31 @@ public abstract class ServerResource extends
UniformResource {
     protected Representation get(Variant variant) throws
ResourceException {
         Representation result = null;

+        VariantInfo variantInfo = null;
+
         if (variant instanceof VariantInfo) {
-            result = doHandle(((VariantInfo) variant).getAnnotationInfo(),
-                    variant);
+            variantInfo = (VariantInfo) variant;
+        } else {
+            List<Variant> annoVariants = null;
+            for (AnnotationInfo annotationInfo : getAnnotations()) {
+                if (Method.GET.equals(annotationInfo.getRestletMethod())) {
+                    annoVariants = annotationInfo.getResponseVariants(null,
+                            getMetadataService(), getConverterService());
+                    if (annoVariants != null) {
+                        for (Variant v : annoVariants) {
+                            if (v.isCompatible(variant)) {
+                                variantInfo = new VariantInfo(variant,
+                                        annotationInfo);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        if (variantInfo != null) {
+            result = doHandle(variantInfo.getAnnotationInfo(), variant);
         } else {
             setStatus(Status.CLIENT_ERROR_METHOD_NOT_ALLOWED);
         }

------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447
<http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2419
000> &dsMessageId=2419000

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

Reply via email to