1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.blossom.multipart;
35
36 import java.lang.reflect.InvocationTargetException;
37 import java.lang.reflect.Method;
38 import java.util.Map;
39 import javax.servlet.http.HttpServletRequest;
40
41 import org.springframework.util.Assert;
42 import org.springframework.web.multipart.MultipartFile;
43 import org.springframework.web.multipart.support.AbstractMultipartHttpServletRequest;
44
45
46
47
48
49
50
51
52
53
54
55 public abstract class CompatibleAbstractMultipartHttpServletRequest extends AbstractMultipartHttpServletRequest {
56
57 private static Method setter;
58 private static Class<?> multiValueType;
59 private static Method populateMethod;
60
61 static {
62 setter = getDeclaredMethodIfAvailable(AbstractMultipartHttpServletRequest.class, "setMultipartFiles", Map.class);
63 if (setter == null) {
64 try {
65 multiValueType = Class.forName("org.springframework.util.LinkedMultiValueMap");
66 populateMethod = getDeclaredMethod(multiValueType, "setAll", Map.class);
67 setter = getDeclaredMethod(AbstractMultipartHttpServletRequest.class, "setMultipartFiles", Class.forName("org.springframework.util.MultiValueMap"));
68 } catch (ClassNotFoundException e) {
69
70 } catch (NoSuchMethodException e) {
71
72 }
73 }
74 }
75
76 protected CompatibleAbstractMultipartHttpServletRequest(HttpServletRequest request) {
77 super(request);
78 }
79
80 protected void setSingleValueMultipartFiles(Map<String, MultipartFile> multipartFiles) throws InvocationTargetException, InstantiationException, IllegalAccessException {
81 Assert.notNull(setter, "No usable method found for setting multipartFiles in AbstractMultipartHttpServletRequest");
82 setter.invoke(this, convertMapIfNecessary(multipartFiles));
83 }
84
85 private Object convertMapIfNecessary(Map<String, MultipartFile> multipartFiles) throws IllegalAccessException, InstantiationException, InvocationTargetException {
86
87
88 if (multiValueType == null) {
89 return multipartFiles;
90 }
91
92
93 Object multiValueMap = multiValueType.newInstance();
94 populateMethod.invoke(multiValueMap, multipartFiles);
95 return multiValueMap;
96 }
97
98 private static Method getDeclaredMethodIfAvailable(Class<?> clazz, String name, Class... parameterTypes) {
99 try {
100 return getDeclaredMethod(clazz, name, parameterTypes);
101 } catch (NoSuchMethodException e) {
102 return null;
103 }
104 }
105
106 private static Method getDeclaredMethod(Class<?> clazz, String name, Class... parameterTypes) throws NoSuchMethodException {
107 return clazz.getDeclaredMethod(name, parameterTypes);
108 }
109 }