001 package de.deepamehta.plugins.webservice.provider;
002
003 import de.deepamehta.core.util.JavaUtils;
004
005 import org.codehaus.jettison.json.JSONObject;
006
007 import java.io.InputStream;
008 import java.io.IOException;
009 import java.lang.annotation.Annotation;
010 import java.lang.reflect.Constructor;
011 import java.lang.reflect.Type;
012 import java.util.logging.Logger;
013
014 import javax.ws.rs.WebApplicationException;
015 import javax.ws.rs.core.MediaType;
016 import javax.ws.rs.core.MultivaluedMap;
017 import javax.ws.rs.ext.MessageBodyReader;
018 import javax.ws.rs.ext.Provider;
019
020
021
022 @Provider
023 public class ObjectProvider implements MessageBodyReader<Object> {
024
025 // ---------------------------------------------------------------------------------------------- Instance Variables
026
027 private Logger logger = Logger.getLogger(getClass().getName());
028
029 // -------------------------------------------------------------------------------------------------- Public Methods
030
031 // *** MessageBodyReader Implementation ***
032
033 @Override
034 public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
035 // Note: unlike equals() isCompatible() ignores parameters like "charset" in "application/json;charset=UTF-8"
036 return getJSONConstructor(type) != null && mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE);
037 }
038
039 @Override
040 public Object readFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType,
041 MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
042 throws IOException, WebApplicationException {
043 try {
044 String json = JavaUtils.readText(entityStream);
045 return getJSONConstructor(type).newInstance(new JSONObject(json));
046 } catch (Exception e) {
047 throw new RuntimeException("Creating a " + type.getName() + " object from message body failed", e);
048 }
049 }
050
051 // ------------------------------------------------------------------------------------------------- Private Methods
052
053 private Constructor<?> getJSONConstructor(Class<?> type) {
054 try {
055 return type.getDeclaredConstructor(JSONObject.class);
056 } catch (NoSuchMethodException e) {
057 return null;
058 }
059 }
060 }