Project

General

Profile

« Previous | Next » 

Revision 6269

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

View differences:

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