1 package com.atlassian.plugins.rest.common.multipart.fileupload;
2
3 import com.atlassian.plugins.rest.common.multipart.FilePart;
4 import com.atlassian.plugins.rest.common.multipart.FileSizeLimitExceededException;
5 import com.atlassian.plugins.rest.common.multipart.MultipartForm;
6 import com.atlassian.plugins.rest.common.multipart.MultipartHandler;
7 import com.google.common.base.Preconditions;
8 import org.apache.commons.fileupload.FileItem;
9 import org.apache.commons.fileupload.FileUploadBase;
10 import org.apache.commons.fileupload.FileUploadException;
11 import org.apache.commons.fileupload.RequestContext;
12 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
13 import org.apache.commons.fileupload.servlet.ServletFileUpload;
14 import org.apache.commons.fileupload.servlet.ServletRequestContext;
15
16 import javax.servlet.http.HttpServletRequest;
17 import java.io.File;
18 import java.io.IOException;
19 import java.io.InputStream;
20 import java.util.ArrayList;
21 import java.util.Collection;
22
23 public class CommonsFileUploadMultipartHandler implements MultipartHandler
24 {
25 private final ServletFileUpload servletFileUpload;
26
27 public CommonsFileUploadMultipartHandler(long maxFileSize, long maxSize)
28 {
29 servletFileUpload = new ServletFileUpload(new DiskFileItemFactory());
30 servletFileUpload.setFileSizeMax(maxFileSize);
31 servletFileUpload.setSizeMax(maxSize);
32 }
33
34 public FilePart getFilePart(HttpServletRequest request, String field)
35 {
36 return getForm(request).getFilePart(field);
37 }
38
39 private static class CommonsFileUploadMultipartForm implements MultipartForm
40 {
41 private final Collection<FileItem> fileItems;
42
43 private CommonsFileUploadMultipartForm(final Collection<FileItem> fileItems)
44 {
45 this.fileItems = fileItems;
46 }
47
48 public FilePart getFilePart(String field)
49 {
50 for (FileItem item : fileItems)
51 {
52 if (item.getFieldName().equals(field))
53 {
54 return new CommonsFileUploadFilePart(item);
55 }
56 }
57 return null;
58 }
59
60 public Collection<FilePart> getFileParts(String field)
61 {
62 Collection<FilePart> fileParts = new ArrayList<FilePart>();
63 for (FileItem item : fileItems)
64 {
65 if (item.getFieldName().equals(field))
66 {
67 fileParts.add(new CommonsFileUploadFilePart(item));
68 }
69 }
70 return fileParts;
71 }
72 }
73
74 public MultipartForm getForm(HttpServletRequest request)
75 {
76 return getForm(new ServletRequestContext(request));
77 }
78
79 @SuppressWarnings ("unchecked")
80 public MultipartForm getForm(RequestContext request)
81 {
82 try
83 {
84 return new CommonsFileUploadMultipartForm(servletFileUpload.parseRequest(request));
85 }
86 catch (FileUploadException e)
87 {
88 if (e instanceof FileUploadBase.FileSizeLimitExceededException || e instanceof FileUploadBase.SizeLimitExceededException)
89 {
90 throw new FileSizeLimitExceededException(e.getMessage());
91 }
92 throw new RuntimeException(e);
93 }
94 }
95
96 private static class CommonsFileUploadFilePart implements FilePart
97 {
98 private final FileItem fileItem;
99
100 CommonsFileUploadFilePart(FileItem fileItem)
101 {
102 this.fileItem = Preconditions.checkNotNull(fileItem);
103 }
104
105 public String getName()
106 {
107 return fileItem.getName();
108 }
109
110 public InputStream getInputStream() throws IOException
111 {
112 return fileItem.getInputStream();
113 }
114
115 public String getContentType()
116 {
117 return fileItem.getContentType();
118 }
119
120 public void write(final File file) throws IOException
121 {
122 try
123 {
124 fileItem.write(file);
125 }
126 catch (Exception e)
127 {
128 if (e instanceof IOException)
129 {
130 throw (IOException) e;
131 }
132 else
133 {
134
135 throw new RuntimeException(e);
136 }
137 }
138 }
139
140 public String getValue()
141 {
142 return fileItem.getString();
143 }
144
145 public boolean isFormField()
146 {
147 return fileItem.isFormField();
148 }
149 }
150 }