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 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    }