001package de.deepamehta.plugins.webservice.provider;
002
003import de.deepamehta.core.util.JavaUtils;
004
005import org.codehaus.jettison.json.JSONObject;
006
007import java.io.InputStream;
008import java.io.IOException;
009import java.lang.annotation.Annotation;
010import java.lang.reflect.Constructor;
011import java.lang.reflect.Type;
012import java.util.logging.Logger;
013
014import javax.ws.rs.WebApplicationException;
015import javax.ws.rs.core.MediaType;
016import javax.ws.rs.core.MultivaluedMap;
017import javax.ws.rs.ext.MessageBodyReader;
018import javax.ws.rs.ext.Provider;
019
020
021
022@Provider
023public 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}