1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.opencastproject.index.service.util;
22
23 import org.opencastproject.list.api.ListProviderException;
24 import org.opencastproject.list.api.ListProvidersService;
25 import org.opencastproject.list.impl.ResourceListQueryImpl;
26
27 import com.google.common.net.MediaType;
28
29 import org.apache.commons.lang3.StringUtils;
30 import org.json.simple.JSONArray;
31 import org.json.simple.JSONObject;
32 import org.json.simple.parser.JSONParser;
33 import org.json.simple.parser.ParseException;
34
35 import java.util.Arrays;
36 import java.util.Collection;
37 import java.util.List;
38 import java.util.ListIterator;
39 import java.util.Map;
40 import java.util.TreeMap;
41 import java.util.stream.Collectors;
42
43 public final class RequestUtils {
44 public static final String ID_JSON_KEY = "id";
45 public static final String VALUE_JSON_KEY = "value";
46 public static final String REQUIRED_JSON_KEY = "required";
47 private static final JSONParser parser = new JSONParser();
48
49 private RequestUtils() {
50 }
51
52
53
54
55
56
57
58
59
60
61 public static Map<String, String> getKeyValueMap(String json) throws ParseException {
62 JSONArray updatedFields = (JSONArray) parser.parse(json);
63 Map<String, String> fieldMap = new TreeMap<String, String>();
64 JSONObject field;
65 @SuppressWarnings("unchecked")
66 ListIterator<Object> iterator = updatedFields.listIterator();
67 while (iterator.hasNext()) {
68 field = (JSONObject) iterator.next();
69 String id = field.get(ID_JSON_KEY) != null ? field.get(ID_JSON_KEY).toString() : "";
70 String value = field.get(VALUE_JSON_KEY) != null ? field.get(VALUE_JSON_KEY).toString() : "";
71 String requiredStr = field.get(REQUIRED_JSON_KEY) != null ? field.get(REQUIRED_JSON_KEY).toString() : "false";
72 boolean required = Boolean.parseBoolean(requiredStr);
73
74 if (StringUtils.trimToNull(id) != null && (StringUtils.trimToNull(value) != null || !required)) {
75 fieldMap.put(id, value);
76 } else {
77 throw new IllegalArgumentException(String.format(
78 "One of the metadata fields is missing an id or value. The id was '%s' and the value was '%s'.", id,
79 value));
80 }
81 }
82 return fieldMap;
83 }
84
85
86
87
88
89
90
91
92
93
94
95
96
97 public static boolean typeIsAccepted(String fileName, String assetUploadId, MediaType mediaType,
98 ListProvidersService listProvidersService) {
99 if (mediaType.is(MediaType.OCTET_STREAM)) {
100
101 return true;
102 }
103
104
105 String fileExtension = null;
106 int dot = fileName.lastIndexOf('.');
107 if (dot != -1) {
108 fileExtension = fileName.substring(dot);
109 }
110
111 try {
112 final Collection<String> assetUploadJsons = listProvidersService.getList("eventUploadAssetOptions",
113 new ResourceListQueryImpl(),false).values();
114 for (String assetUploadJson: assetUploadJsons) {
115 if (!assetUploadJson.startsWith("{") || !assetUploadJson.endsWith("}")) {
116
117 continue;
118 }
119 @SuppressWarnings("unchecked")
120 final Map<String, String> assetUpload = (Map<String, String>) parser.parse(assetUploadJson);
121 if (assetUploadId.equals(assetUpload.get("id"))) {
122 final List<String> accepts = Arrays.stream(assetUpload.getOrDefault("accept", "*/*").split(","))
123 .map(String::trim).collect(Collectors.toList());
124 for (String accept : accepts) {
125 if (accept.contains("/") && mediaType.is(MediaType.parse(accept))) {
126 return true;
127 } else if (fileExtension != null && accept.contains(".") && fileExtension.equalsIgnoreCase(accept)) {
128 return true;
129 }
130 }
131 return false;
132 }
133 }
134 } catch (ListProviderException e) {
135 throw new IllegalArgumentException("Invalid assetUploadId: " + assetUploadId);
136 } catch (org.json.simple.parser.ParseException e) {
137 throw new IllegalStateException("cannot parse json list provider for asset upload Id " + assetUploadId, e);
138 }
139 throw new IllegalArgumentException("Invalid assetUploadId: " + assetUploadId);
140 }
141
142 }