View Javadoc

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   * Reads a multipart form data object
22   *
23   * @since 2.4
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  }