Can you just use the sample code you provide below, only create a subclass of 
Representation that takes your serializer as the argument, maybe along with the 
mime type? Something like:

public class MyVariableRepresentation extends Representation
{
  Serializer serializer;
  public MyVariableRepresentation(MediaType type, Serializer variantSerializer)
  {
    super(type);
    this.serializer = variantSerializer;
  }
  //Then override write method or something to call your serializer to do the 
serializing.

}

So your sample code becomes:

public class MyResource extends Resource
{
    public Map<MediaType,Serializer> map;

    public Representation represent(Variant variant) throws ResourceException
    {
        Serializer serializer = map.get(variant.getMediaType());
        if (serializer == null)
            throw new 
ResourceException(Status.CLIENT_ERROR_UNSUPPORTED_MEDIA_TYPE);
        return new MyVariableRepresentation(variant.getMediaType(), 
serializer.encode(data)); // ??
    }
}

Does this work?


On Jan 22, 2010, at 6:27 PM, Jean-Philippe Steinmetz wrote:

> Sure. With our particular use case we specify a map of media types to data 
> serializers in spring as a hash map. We then inject this map into each 
> resource. When the map is set in the class we then add all the media types 
> specified as map keys as acceptable variants. When the represent() function 
> is called we use the provided media type to retrieve the associated 
> serializer, throwing an unsupported media type error if the variant has no 
> corresponding serializer. We then serialize our data and send it back to the 
> client. It's the sending it back to the client part is where I am stuck. As 
> there is no default Representation class that I can merely pass in any object 
> type to whether it be string, bye array, etc.
> 
> Here is an example of the Resource class.
> 
> public class MyResource extends Resource
> {
>     public Map<MediaType,Serializer> map;
> 
>     public Representation represent(Variant variant) throws ResourceException
>     {
>         Serializer serializer = map.get(variant.getMediaType());
>         if (serializer == null)
>             throw new 
> ResourceException(Status.CLIENT_ERROR_UNSUPPORTED_MEDIA_TYPE);
>         return new Representation(serializer.encode(data)); // ??
>     }
> }
> 
> Here is an example of our spring applicationContext.xml.
> 
> <beans>
>     ...
>     <util:map id="map" map-class="java.util.HashMap">
>         <entry>
>             <key><util:constant 
> static-field="org.restlet.data.MediaType.APPLICATION_FLASH"/></key>
>             <ref local="amfSerializer"/>
>         </entry>
>         <entry>
>             <key><util:constant 
> static-field="org.restlet.data.MediaType.APPLICATION_JSON"/></key>
>             <ref local="jsonSerializer"/>
>         </entry>
>         <entry>
>             <key><util:constant 
> static-field="org.restlet.data.MediaType.APPLICATION_XML"/></key>
>             <ref local="xmlSerializer"/>
>         </entry>
>     </util:map>
> 
>     <bean name="/my/resource" id="myResource" autowire="byName" 
> scope="prototype"
>               class="com.restlets.MyResource">
>         <property name="map" ref="map"/>
>     </bean>
>     ...
> </beans>
> 
> On Fri, Jan 22, 2010 at 3:07 PM, Matt Kennedy <stinkym...@gmail.com> wrote:
> I'm not a Spring user, so maybe that's why it isn't clear to me what you're 
> asking.  Can you try phrasing this question a different way?  I think I know 
> the answer to your problem because I've always had to deal with multiple 
> media types for the same resource, but I'm not sure I understand the problem. 
>  Can you walk through a use-case?
> 
> 
> On Jan 22, 2010, at 6:00 PM, Jean-Philippe Steinmetz wrote:
> 
>> Thank you for the quick reply. This certainly would resolve the issue but it 
>> doesn't really offer the kind of solution I was hoping for. With this 
>> solution i'd still have to do a mapping of media type to some representation 
>> which is what I am trying to avoid. The thought was that there is a 
>> Representation that just outputs the message body regardless of whatever 
>> media type variant is set for it. That way I don't have to make a mapping of 
>> media type to anything.
>> 
>> On Fri, Jan 22, 2010 at 1:27 PM, Matt Kennedy <stinkym...@gmail.com> wrote:
>> I can't remember what 1.1.6's API looks like, but I do something like this 
>> with the 2.0 API.  Basically, in the Resource's constructor, I use someting 
>> like:
>> 
>> getVariants().add(new MyXMLRepresentation(this))
>> getVariants().add(new MyJSONRepresentation(this))
>> 
>> 
>> Each of those My* classes are a subclass of Representation, and the write() 
>> method is overridden to produce the custom media type.  I pass the Resource 
>> object to the custom representation so that I have access to the resource 
>> during the write method.  Also important is that in the constructor, you 
>> call the super constructor with the MediaType and resource as arguments, ex:
>> 
>> //Constructor
>> public MyJSONRepresentation(Resource res)
>> {
>>  super(MediaType.APPLICATION_JSON, res);
>> }
>> 
>> I know something like this can be done with the 1.1.6 API because I was 
>> using it before I ported to 2.0, but now I can't find the 1.1.6 code. It 
>> probably isn't too different.
>> 
>> On Jan 22, 2010, at 3:50 PM, Jean-Philippe Steinmetz wrote:
>> 
>> > Hello all,
>> >
>> > We're using restlet 1.1.6 and for all our resources we want to support a 
>> > dynamic set of media types. We do this in our Spring configuration by 
>> > setting up a list of acceptable media types. My question is if there is a 
>> > Representation class I can use that will essentially accept any type of 
>> > data I push into it? For instance we support HTML, XML, JSON and AMF3 
>> > therefore most of the time it's a string based representation but in the 
>> > case of AMF3 it is binary (byte array). So far the only way I see it is to 
>> > make a switch statement in our resource class for each media type but this 
>> > pretty much defeats the purpose of specifying supported media types in the 
>> > application configuration.
>> >
>> > Jean-Philippe
>> 
>> ------------------------------------------------------
>> http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2441312
>> 
> 
>

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

Reply via email to