1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.rest.provider.producer;
21
22 import java.io.ByteArrayOutputStream;
23 import java.io.IOException;
24 import java.io.OutputStream;
25 import java.lang.annotation.Annotation;
26 import java.lang.reflect.Type;
27
28 import javax.ws.rs.Produces;
29 import javax.ws.rs.WebApplicationException;
30 import javax.ws.rs.core.MediaType;
31 import javax.ws.rs.core.MultivaluedMap;
32 import javax.ws.rs.ext.MessageBodyWriter;
33 import javax.ws.rs.ext.Provider;
34
35 import org.apache.hadoop.hbase.classification.InterfaceAudience;
36 import org.apache.hadoop.hbase.rest.Constants;
37 import org.apache.hadoop.hbase.rest.ProtobufMessageHandler;
38
39
40
41
42
43
44
45 @Provider
46 @Produces({Constants.MIMETYPE_PROTOBUF, Constants.MIMETYPE_PROTOBUF_IETF})
47 @InterfaceAudience.Private
48 public class ProtobufMessageBodyProducer
49 implements MessageBodyWriter<ProtobufMessageHandler> {
50
51 private ThreadLocal<byte[]> buffer = new ThreadLocal<byte[]>();
52
53 @Override
54 public boolean isWriteable(Class<?> type, Type genericType,
55 Annotation[] annotations, MediaType mediaType) {
56 return ProtobufMessageHandler.class.isAssignableFrom(type);
57 }
58
59 @Override
60 public long getSize(ProtobufMessageHandler m, Class<?> type, Type genericType,
61 Annotation[] annotations, MediaType mediaType) {
62 ByteArrayOutputStream baos = new ByteArrayOutputStream();
63 try {
64 baos.write(m.createProtobufOutput());
65 } catch (IOException e) {
66 return -1;
67 }
68 byte[] bytes = baos.toByteArray();
69 buffer.set(bytes);
70 return bytes.length;
71 }
72
73 public void writeTo(ProtobufMessageHandler m, Class<?> type, Type genericType,
74 Annotation[] annotations, MediaType mediaType,
75 MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream)
76 throws IOException, WebApplicationException {
77 byte[] bytes = buffer.get();
78 entityStream.write(bytes);
79 buffer.remove();
80 }
81 }