/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.transport.jaxrs; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import javax.ws.rs.Consumes; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.MessageBodyReader; import javax.ws.rs.ext.Provider; import org.fudgemsg.FudgeMsg; import org.fudgemsg.mapping.FudgeDeserializer; import org.fudgemsg.wire.FudgeMsgReader; import org.fudgemsg.wire.json.FudgeJSONStreamReader; import com.google.common.base.Charsets; /** * A JAX-RS provider to convert RESTful responses to Fudge JSON encoded messages. * <p> * This converts directly to Fudge from the RESTful resource without the need to manually * create the message in application code. */ @Provider @Consumes(MediaType.APPLICATION_JSON) public class FudgeObjectJSONConsumer extends FudgeBase implements MessageBodyReader<Object> { /** * Creates the consumer. */ public FudgeObjectJSONConsumer() { super(); } //------------------------------------------------------------------------- @Override public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return type != String.class && // allow manually created JSON string to work getFudgeContext().getObjectDictionary().getMessageBuilder(type) != null; } @Override public Object readFrom( Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { InputStreamReader entityReader = new InputStreamReader(entityStream, Charsets.UTF_8); @SuppressWarnings("resource") // wraps stream that cannot be closed here FudgeMsgReader reader = new FudgeMsgReader(new FudgeJSONStreamReader(getFudgeContext(), entityReader)); FudgeMsg message = reader.nextMessage(); if (message == null) { return null; } FudgeDeserializer deser = new FudgeDeserializer(getFudgeContext()); return deser.fudgeMsgToObject(type, message); } }