package ameba.message.internal.protobuf; import com.dyuproject.protostuff.ProtobufIOUtil; import com.dyuproject.protostuff.Schema; import com.dyuproject.protostuff.runtime.RuntimeSchema; import javax.ws.rs.Consumes; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.MessageBodyReader; import javax.ws.rs.ext.Provider; import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.List; /** * Created by icode on 14-4-8. */ @Provider @Consumes(AbstractProtobufProvider.APPLICATION_PROTOBUF) public class ProtobufMessageBodyReader extends AbstractProtobufProvider implements MessageBodyReader<Object> { @Override public boolean isReadable(Class aClass, Type type, Annotation[] annotations, javax.ws.rs.core.MediaType mediaType) { return true; } @Override public Object readFrom(Class<Object> type, Type genericType, Annotation[] annotations, javax.ws.rs.core.MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { if (List.class.isAssignableFrom(type)) { Schema schema = RuntimeSchema.getSchema(getListGenericType((List) null, genericType)); return ProtobufIOUtil.parseListFrom(entityStream, schema); } else { Schema schema = RuntimeSchema.getSchema(type); try { ProtobufIOUtil.mergeFrom(entityStream, type.newInstance(), schema); } catch (InstantiationException e) { throw new WebApplicationException(e); } catch (IllegalAccessException e) { throw new WebApplicationException(e); } } return null; } }