1 package com.atlassian.plugins.rest.common.multipart.jersey;
2
3 import com.atlassian.plugins.rest.common.multipart.MultipartConfig;
4 import com.atlassian.plugins.rest.common.multipart.MultipartConfigClass;
5 import com.atlassian.plugins.rest.common.multipart.MultipartForm;
6 import com.atlassian.plugins.rest.common.multipart.fileupload.CommonsFileUploadMultipartHandler;
7 import com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider;
8 import org.apache.commons.fileupload.RequestContext;
9
10 import java.io.IOException;
11 import java.io.InputStream;
12 import java.lang.annotation.Annotation;
13 import java.lang.reflect.Type;
14 import javax.ws.rs.WebApplicationException;
15 import javax.ws.rs.core.MediaType;
16 import javax.ws.rs.core.MultivaluedMap;
17 import javax.ws.rs.ext.MessageBodyReader;
18 import javax.ws.rs.ext.Provider;
19
20
21
22
23
24
25 @Provider
26 public class MultipartFormMessageBodyReader implements MessageBodyReader<MultipartForm> {
27 public boolean isReadable(final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType) {
28 return type.equals(MultipartForm.class);
29 }
30
31 public MultipartForm readFrom(final Class<MultipartForm> type, final Type genericType,
32 final Annotation[] annotations, final MediaType mediaType, final MultivaluedMap<String, String> httpHeaders,
33 final InputStream entityStream)
34 throws IOException, WebApplicationException {
35 CommonsFileUploadMultipartHandler handler = getMultipartHandler(annotations);
36 return handler.getForm(new RequestContext() {
37 public String getCharacterEncoding() {
38 return AbstractMessageReaderWriterProvider.getCharset(mediaType).name();
39 }
40
41 public String getContentType() {
42 return mediaType.toString();
43 }
44
45 public int getContentLength() {
46 return -1;
47 }
48
49 public InputStream getInputStream() throws IOException {
50 return entityStream;
51 }
52 });
53 }
54
55 private CommonsFileUploadMultipartHandler getMultipartHandler(Annotation[] annotations) {
56 for (Annotation annotation : annotations) {
57 if (annotation instanceof MultipartConfigClass) {
58 Class<? extends MultipartConfig> configClass = ((MultipartConfigClass) annotation).value();
59 try {
60 MultipartConfig multipartConfig = configClass.newInstance();
61 return new CommonsFileUploadMultipartHandler(multipartConfig.getMaxFileSize(), multipartConfig.getMaxSize());
62 } catch (InstantiationException e) {
63 throw new RuntimeException(e);
64 } catch (IllegalAccessException e) {
65 throw new RuntimeException(e);
66 }
67 }
68 }
69 return new CommonsFileUploadMultipartHandler(-1, -1);
70 }
71 }