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. Id 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

