Revision 6269
Added by ben leinfelder almost 13 years ago
D1ResourceHandler.java | ||
---|---|---|
23 | 23 |
package edu.ucsb.nceas.metacat.restservice; |
24 | 24 |
|
25 | 25 |
import java.io.File; |
26 |
import java.io.FileInputStream; |
|
27 |
import java.io.FileNotFoundException; |
|
26 | 28 |
import java.io.IOException; |
27 | 29 |
import java.io.InputStream; |
28 | 30 |
import java.io.OutputStream; |
... | ... | |
33 | 35 |
import java.util.Date; |
34 | 36 |
import java.util.Enumeration; |
35 | 37 |
import java.util.Hashtable; |
38 |
import java.util.Iterator; |
|
39 |
import java.util.List; |
|
40 |
import java.util.Map; |
|
36 | 41 |
import java.util.TimeZone; |
37 | 42 |
import java.util.Timer; |
38 | 43 |
|
... | ... | |
40 | 45 |
import javax.servlet.http.HttpServletRequest; |
41 | 46 |
import javax.servlet.http.HttpServletResponse; |
42 | 47 |
|
48 |
import org.apache.commons.fileupload.FileUploadException; |
|
43 | 49 |
import org.apache.commons.io.IOUtils; |
44 | 50 |
import org.apache.log4j.Logger; |
45 | 51 |
import org.dataone.client.auth.CertificateManager; |
52 |
import org.dataone.mimemultipart.MultipartRequest; |
|
53 |
import org.dataone.mimemultipart.MultipartRequestResolver; |
|
46 | 54 |
import org.dataone.service.exceptions.BaseException; |
55 |
import org.dataone.service.exceptions.InvalidRequest; |
|
56 |
import org.dataone.service.exceptions.ServiceFailure; |
|
47 | 57 |
import org.dataone.service.types.Session; |
58 |
import org.dataone.service.types.SystemMetadata; |
|
48 | 59 |
import org.dataone.service.types.util.ServiceTypeUtil; |
49 | 60 |
import org.jibx.runtime.JiBXException; |
50 | 61 |
|
... | ... | |
115 | 126 |
protected String[] groupNames; |
116 | 127 |
|
117 | 128 |
protected Hashtable<String, String[]> params; |
129 |
protected Map<String, List<String>> multipartparams; |
|
118 | 130 |
|
119 | 131 |
// D1 certificate-based authentication |
120 | 132 |
protected Session session; |
... | ... | |
155 | 167 |
} |
156 | 168 |
} |
157 | 169 |
|
170 |
protected SystemMetadata collectSystemMetadata() throws IOException, FileUploadException, ServiceFailure, InvalidRequest, JiBXException { |
|
171 |
|
|
172 |
// Read the incoming data from its Mime Multipart encoding |
|
173 |
logMetacat.debug("Disassembling MIME multipart form"); |
|
174 |
InputStream sysmeta = null; |
|
175 |
|
|
176 |
// handle MMP inputs |
|
177 |
File tmpDir = getTempDirectory(); |
|
178 |
logMetacat.debug("temp dir: " + tmpDir.getAbsolutePath()); |
|
179 |
MultipartRequestResolver mrr = |
|
180 |
new MultipartRequestResolver(tmpDir.getAbsolutePath(), 1000000000, 0); |
|
181 |
MultipartRequest mr = null; |
|
182 |
try { |
|
183 |
mr = mrr.resolveMultipart(request); |
|
184 |
} catch (Exception e) { |
|
185 |
throw new ServiceFailure("1202", |
|
186 |
"Could not resolve multipart: " + e.getMessage()); |
|
187 |
} |
|
188 |
logMetacat.debug("resolved multipart request"); |
|
189 |
Map<String, File> files = mr.getMultipartFiles(); |
|
190 |
if (files == null) { |
|
191 |
throw new ServiceFailure("1202", |
|
192 |
"register meta must have multipart file with name 'sysmeta'"); |
|
193 |
} |
|
194 |
logMetacat.debug("got multipart files"); |
|
195 |
|
|
196 |
if (files.keySet() == null) { |
|
197 |
logMetacat.error("No file keys in MMP request."); |
|
198 |
throw new ServiceFailure( |
|
199 |
"1202", |
|
200 |
"No file keys found in MMP. " |
|
201 |
+ "register meta must have multipart file with name 'sysmeta'"); |
|
202 |
} |
|
203 |
|
|
204 |
// for logging purposes, dump out the key-value pairs that |
|
205 |
// constitute the request |
|
206 |
// 3 types exist: request params, multipart params, and |
|
207 |
// multipart files |
|
208 |
Iterator it = files.keySet().iterator(); |
|
209 |
logMetacat.debug("iterating through request parts: " + it); |
|
210 |
while (it.hasNext()) { |
|
211 |
String key = (String) it.next(); |
|
212 |
logMetacat.debug("files key: " + key); |
|
213 |
logMetacat.debug("files value: " + files.get(key)); |
|
214 |
} |
|
215 |
|
|
216 |
multipartparams = mr.getMultipartParameters(); |
|
217 |
it = multipartparams.keySet().iterator(); |
|
218 |
while (it.hasNext()) { |
|
219 |
String key = (String) it.next(); |
|
220 |
logMetacat.debug("multipartparams key: " + key); |
|
221 |
logMetacat.debug("multipartparams value: " + multipartparams.get(key)); |
|
222 |
} |
|
223 |
|
|
224 |
it = params.keySet().iterator(); |
|
225 |
while (it.hasNext()) { |
|
226 |
String key = (String) it.next(); |
|
227 |
logMetacat.debug("param key: " + key); |
|
228 |
logMetacat.debug("param value: " + params.get(key)); |
|
229 |
} |
|
230 |
logMetacat.debug("done iterating the request..."); |
|
231 |
|
|
232 |
File smFile = files.get("sysmeta"); |
|
233 |
if (smFile == null) { |
|
234 |
throw new InvalidRequest("1102", |
|
235 |
"Missing the required file-part 'sysmeta' from the multipart request."); |
|
236 |
} |
|
237 |
logMetacat.debug("smFile: " + smFile.getAbsolutePath()); |
|
238 |
sysmeta = new FileInputStream(smFile); |
|
239 |
|
|
240 |
logMetacat.debug("Commence creation..."); |
|
241 |
SystemMetadata systemMetadata = (SystemMetadata) deserializeServiceType(SystemMetadata.class, sysmeta); |
|
242 |
return systemMetadata; |
|
243 |
} |
|
244 |
|
|
245 |
protected Map<String, File> collectMultipartFiles() throws ServiceFailure, InvalidRequest { |
|
246 |
|
|
247 |
// Read the incoming data from its Mime Multipart encoding |
|
248 |
logMetacat.debug("Disassembling MIME multipart form"); |
|
249 |
InputStream object = null; |
|
250 |
InputStream sysmeta = null; |
|
251 |
|
|
252 |
|
|
253 |
// handle MMP inputs |
|
254 |
File tmpDir = getTempDirectory(); |
|
255 |
System.out.println("temp dir: " + tmpDir.getAbsolutePath()); |
|
256 |
MultipartRequestResolver mrr = |
|
257 |
new MultipartRequestResolver(tmpDir.getAbsolutePath(), 1000000000, 0); |
|
258 |
MultipartRequest mr = null; |
|
259 |
try { |
|
260 |
mr = mrr.resolveMultipart(request); |
|
261 |
} catch (Exception e) { |
|
262 |
throw new ServiceFailure("1202", |
|
263 |
"Could not resolve multipart files: " + e.getMessage()); |
|
264 |
} |
|
265 |
System.out.println("resolved multipart request"); |
|
266 |
Map<String, File> files = mr.getMultipartFiles(); |
|
267 |
if (files == null) { |
|
268 |
throw new ServiceFailure("1202", "create/update must have multipart files with names 'object' and 'sysmeta'"); |
|
269 |
} |
|
270 |
System.out.println("got multipart files"); |
|
271 |
|
|
272 |
if (files.keySet() == null) { |
|
273 |
System.out.println("No file keys in MMP request."); |
|
274 |
throw new ServiceFailure("1202", "No file keys found in MMP. " + |
|
275 |
"create/update must have multipart files with names 'object' and 'sysmeta'"); |
|
276 |
} |
|
277 |
|
|
278 |
// for logging purposes, dump out the key-value pairs that constitute the request |
|
279 |
// 3 types exist: request params, multipart params, and multipart files |
|
280 |
Iterator it = files.keySet().iterator(); |
|
281 |
System.out.println("iterating through files"); |
|
282 |
while (it.hasNext()) { |
|
283 |
String key = (String)it.next(); |
|
284 |
System.out.println("files key: " + key); |
|
285 |
System.out.println("files value: " + files.get(key)); |
|
286 |
} |
|
287 |
|
|
288 |
multipartparams = mr.getMultipartParameters(); |
|
289 |
it = multipartparams.keySet().iterator(); |
|
290 |
System.out.println("iterating through multipartparams"); |
|
291 |
while (it.hasNext()) { |
|
292 |
String key = (String)it.next(); |
|
293 |
System.out.println("multipartparams key: " + key); |
|
294 |
System.out.println("multipartparams value: " + multipartparams.get(key)); |
|
295 |
} |
|
296 |
|
|
297 |
it = params.keySet().iterator(); |
|
298 |
System.out.println("iterating through params"); |
|
299 |
while (it.hasNext()) { |
|
300 |
String key = (String)it.next(); |
|
301 |
System.out.println("param key: " + key); |
|
302 |
System.out.println("param value: " + params.get(key)); |
|
303 |
} |
|
304 |
System.out.println("done iterating the request..."); |
|
305 |
|
|
306 |
File smFile = files.get("sysmeta"); |
|
307 |
if (smFile == null) { |
|
308 |
throw new InvalidRequest("1102", "Missing the required file-part 'sysmeta' from the multipart request."); |
|
309 |
} |
|
310 |
System.out.println("smFile: " + smFile.getAbsolutePath()); |
|
311 |
File objFile = files.get("object"); |
|
312 |
if (objFile == null) { |
|
313 |
throw new InvalidRequest("1102", "Missing the required file-part 'object' from the multipart request."); |
|
314 |
} |
|
315 |
System.out.println("objectfile: " + objFile.getAbsolutePath()); |
|
316 |
|
|
317 |
return files; |
|
318 |
} |
|
319 |
|
|
158 | 320 |
/** |
159 | 321 |
* copies request parameters to a hashtable which is given as argument to native metacathandler functions |
160 | 322 |
*/ |
Also available in: Unified diff
consolidate multi part handling in the super class - subclasses need only call the appropriate helper to get access to the needed resources. superclass does some validation to make sure the files are in place in the request