001    /*
002     * Copyright (c) 2011, Cloudera, Inc. All Rights Reserved.
003     *
004     * Cloudera, Inc. licenses this file to you under the Apache License,
005     * Version 2.0 (the "License"). You may not use this file except in
006     * compliance with the License. You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * This software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
011     * CONDITIONS OF ANY KIND, either express or implied. See the License for
012     * the specific language governing permissions and limitations under the
013     * License.
014     */
015    package com.cloudera.lib.wsrs;
016    
017    import org.json.simple.JSONObject;
018    
019    import javax.ws.rs.Produces;
020    import javax.ws.rs.WebApplicationException;
021    import javax.ws.rs.core.MediaType;
022    import javax.ws.rs.core.MultivaluedMap;
023    import javax.ws.rs.ext.MessageBodyWriter;
024    import javax.ws.rs.ext.Provider;
025    import java.io.IOException;
026    import java.io.OutputStream;
027    import java.io.OutputStreamWriter;
028    import java.io.Writer;
029    import java.lang.annotation.Annotation;
030    import java.lang.reflect.Type;
031    import java.util.Map;
032    
033    @Provider
034    @Produces(MediaType.APPLICATION_JSON)
035    public class JSONMapProvider implements MessageBodyWriter<Map> {
036      private static final String ENTER = System.getProperty("line.separator");
037    
038      @Override
039      public boolean isWriteable(Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType) {
040        return Map.class.isAssignableFrom(aClass);
041      }
042    
043      @Override
044      public long getSize(Map map, Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType) {
045        return -1;
046      }
047    
048      @Override
049      public void writeTo(Map map, Class<?> aClass, Type type, Annotation[] annotations,
050                          MediaType mediaType, MultivaluedMap<String, Object> stringObjectMultivaluedMap,
051                          OutputStream outputStream) throws IOException, WebApplicationException {
052        Writer writer = new OutputStreamWriter(outputStream);
053        JSONObject.writeJSONString(map, writer);
054        writer.write(ENTER);
055        writer.flush();
056      }
057    
058    }