Hi Tim,

perfect. As usual. :)

Best regards,
Thierry Boileau

I think Andy is talking about a ServerResource subclass with an annotated
> method returning a value that will later be converted into a
> Representation. In that case there is no existing Representation on which
> to call setTag. The way I handle this is to override toRepresentation,
> something like this:
>
>     @Override public Representation toRepresentation(Object source,
> Variant target) {
>         Representation representation = super.toRepresentation(source,
> target);
>         Tag tag = computeTag(source, target);
>         if (tag != null) {
>             representation.setTag(tag);
>         }
>         return representation;
>     }
>
> The implementation of computeTag is up to you. I make sure that the types
> of the return values for which I want to have ETags have a common supertype
> that knows how to compute an ETag.
>
>     Tag computeTag(Object source, Variant target) {
>         if (source instanceof ComputesTag) {
>             return ((ComputesTag) source).computeTag(target);
>         } else {
>             return null;
>         }
>     }
>
> My default implementation of ComputesTag.computeTag works generically
> through the use of Guava's new support for hashing.
>
>     // Method of ComputesTag:
>     public Tag computeTag(Variant target) {
>         HashCode hc = Hashing.md5().newHasher()
>             .putObject(this, REP_FUNNEL)
>             .putObject(target, VARIANT_FUNNEL)
>             .hash();
>         return new Tag(hc.toString(), false);
>     }
>
> The same technique applies to expirationDate ("Expires"), modificationDate
> ("Last-Modified"), and locationRef ("Content-Location"). In practice, I
> bundle all of these into a common supertype; I don't really have a separate
> ComputesTag type.
>
> One thing I have *not* done (yet) is to keep a cache of ETags by request
> URI (plus variant info) so I could quickly return 304 Not Modified without
> having to build the return value in the first place. The hard part is
> ensuring that invalid entries are removed from that cache.
>
> --tim
>
> On Wed, Feb 29, 2012 at 6:30 AM, Thierry Boileau <
> [email protected]> wrote:
>
>> Hello Andy,
>>
>> do you mean that the response will get the entity a little bit later in
>> your code?
>> Are you trying to set the Tag in the "doInit" method?
>>
>> Best regards,
>> Thierry Boileau
>>
>>
>>
>> I'd like to set an ETag response header while processing a request within
>>> my ServerResource subclass.  I tried
>>>
>>> getResponseEntity().setTag(new Tag("foo));
>>>
>>> but this doesn't work, because there is no entity in the response object
>>> yet (getResponseEntity returns null).
>>>
>>> What's the right way to do this?
>>>
>>> Thanks.
>>> -Andy
>>>
>>> ------------------------------------------------------
>>>
>>> http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2925566
>>>
>>
>>
>

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

Reply via email to