001package de.deepamehta.webservice.provider;
002
003import de.deepamehta.core.JSONEnabled;
004
005import java.io.BufferedWriter;
006import java.io.IOException;
007import java.io.OutputStream;
008import java.io.OutputStreamWriter;
009import java.lang.annotation.Annotation;
010import java.lang.reflect.Type;
011import java.util.logging.Logger;
012
013import javax.ws.rs.WebApplicationException;
014import javax.ws.rs.core.MediaType;
015import javax.ws.rs.core.MultivaluedMap;
016import javax.ws.rs.ext.MessageBodyWriter;
017import javax.ws.rs.ext.Provider;
018
019
020
021@Provider
022public class JSONEnabledProvider implements MessageBodyWriter<JSONEnabled> {
023
024    // ---------------------------------------------------------------------------------------------- Instance Variables
025
026    private Logger logger = Logger.getLogger(getClass().getName());
027
028    // -------------------------------------------------------------------------------------------------- Public Methods
029
030    // *** MessageBodyWriter Implementation ***
031
032    @Override
033    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
034        // Note: unlike equals() isCompatible() ignores parameters like "charset" in "application/json;charset=UTF-8"
035        return JSONEnabled.class.isAssignableFrom(type) && mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE);
036    }
037
038    @Override
039    public long getSize(JSONEnabled jsonEnabled, Class<?> type, Type genericType, Annotation[] annotations,
040                        MediaType mediaType) {
041        return -1;
042    }
043
044    @Override
045    public void writeTo(JSONEnabled jsonEnabled, Class<?> type, Type genericType, Annotation[] annotations,
046                        MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream)
047                        throws IOException, WebApplicationException {
048        try {
049            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(entityStream));
050            jsonEnabled.toJSON().write(writer);
051            writer.flush();
052        } catch (Exception e) {
053            throw new RuntimeException("Writing message body failed", e);
054        }
055    }
056}