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 }