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