package de.deepamehta.webservice.provider; import de.deepamehta.core.util.JavaUtils; import de.deepamehta.core.util.DeepaMehtaUtils; import org.codehaus.jettison.json.JSONArray; import java.io.BufferedWriter; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.lang.annotation.Annotation; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Collection; import java.util.List; import java.util.logging.Logger; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.MessageBodyReader; import javax.ws.rs.ext.MessageBodyWriter; import javax.ws.rs.ext.Provider; @Provider public class StringCollectionProvider implements MessageBodyReader<List<String>>, MessageBodyWriter<Collection<String>> { // ---------------------------------------------------------------------------------------------- Instance Variables private Logger logger = Logger.getLogger(getClass().getName()); // -------------------------------------------------------------------------------------------------- Public Methods // *** MessageBodyReader Implementation *** @Override public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { if (genericType instanceof ParameterizedType) { Type[] typeArgs = ((ParameterizedType) genericType).getActualTypeArguments(); if (type == List.class && typeArgs.length == 1 && typeArgs[0] == String.class) { // Note: unlike equals() isCompatible() ignores parameters // like "charset" in "application/json;charset=UTF-8" if (mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE)) { return true; } } } return false; } @Override public List<String> readFrom(Class<List<String>> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { try { String json = JavaUtils.readText(entityStream); return DeepaMehtaUtils.toList(new JSONArray(json)); } catch (Exception e) { throw new RuntimeException("Deserializing a List<String> object failed", e); } } // *** MessageBodyWriter Implementation *** @Override public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { if (genericType instanceof ParameterizedType) { Type[] typeArgs = ((ParameterizedType) genericType).getActualTypeArguments(); if (Collection.class.isAssignableFrom(type) && typeArgs.length == 1 && typeArgs[0] == String.class) { // Note: unlike equals() isCompatible() ignores parameters // like "charset" in "application/json;charset=UTF-8" if (mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE)) { return true; } } } return false; } @Override public long getSize(Collection<String> strings, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return -1; } @Override public void writeTo(Collection<String> strings, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { try { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(entityStream)); new JSONArray(strings).write(writer); writer.flush(); } catch (Exception e) { throw new RuntimeException("Writing message body failed (" + strings + ")", e); } } }