Mercurial > lada > lada-server
annotate src/main/java/de/intevation/lada/rest/LAFImportService.java @ 331:5d11428e6a09
Made the importer a little more robust and introduced a better warning/error reporting.
author | Raimund Renkert <rrenkert@intevation.de> |
---|---|
date | Tue, 27 Aug 2013 15:28:21 +0200 |
parents | 30883ab746a5 |
children | cb47c33b119d |
rev | line source |
---|---|
325
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
1 package de.intevation.lada.rest; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
2 |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
3 import java.io.IOException; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
4 import java.io.InputStream; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
5 import java.util.HashMap; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
6 import java.util.LinkedList; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
7 import java.util.List; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
8 import java.util.Map; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
9 |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
10 import javax.enterprise.context.RequestScoped; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
11 import javax.inject.Inject; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
12 import javax.inject.Named; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
13 import javax.ws.rs.Consumes; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
14 import javax.ws.rs.POST; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
15 import javax.ws.rs.Path; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
16 import javax.ws.rs.Produces; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
17 import javax.ws.rs.core.Context; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
18 import javax.ws.rs.core.HttpHeaders; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
19 import javax.ws.rs.core.MultivaluedMap; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
20 |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
21 import org.apache.commons.io.IOUtils; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
22 import org.jboss.resteasy.plugins.providers.multipart.InputPart; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
23 import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
24 |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
25 import de.intevation.lada.auth.Authentication; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
26 import de.intevation.lada.auth.AuthenticationException; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
27 import de.intevation.lada.auth.AuthenticationResponse; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
28 import de.intevation.lada.data.importer.Importer; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
29 |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
30 /** |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
31 * This class produces a RESTful service to import a LAF file. |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
32 * |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
33 * @author <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a> |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
34 */ |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
35 @Path("/import") |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
36 @RequestScoped |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
37 public class LAFImportService |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
38 { |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
39 @Inject |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
40 @Named("ldapauth") |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
41 private Authentication authentication; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
42 |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
43 @Inject |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
44 @Named("lafimporter") |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
45 private Importer importer; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
46 |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
47 /** |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
48 * Import LProbe object. |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
49 * See |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
50 * http://howtodoinjava.com/2013/05/21/jax-rs-resteasy-file-upload-httpclient-example/ |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
51 * for more details on the implementation. |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
52 * |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
53 * @param input MulitpartFormDataInput containing the file to upload. |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
54 * @param header The HTTP header containing authorization information. |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
55 * @return Response object. |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
56 */ |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
57 @POST |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
58 @Path("/laf") |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
59 @Produces("application/json") |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
60 @Consumes("multipart/form-data") |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
61 public Response upload(MultipartFormDataInput input, @Context HttpHeaders header) { |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
62 try { |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
63 AuthenticationResponse auth = authentication.authorizedGroups(header); |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
64 if (!authentication.isAuthorizedUser(header)) { |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
65 return new Response(false, 698, null); |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
66 } |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
67 |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
68 String name = ""; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
69 String content = ""; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
70 Map<String, List<InputPart>> data = input.getFormDataMap(); |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
71 try { |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
72 List<InputPart> parts = input.getParts(); |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
73 for (InputPart part: parts) { |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
74 InputStream inStream = part.getBody(InputStream.class, null); |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
75 MultivaluedMap<String, String> headers = part.getHeaders(); |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
76 String[] cDisp = headers.getFirst("content-disposition").split(";"); |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
77 for (String fName : cDisp) { |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
78 if (fName.trim().startsWith("filename")) { |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
79 String[] fileName = fName.split("="); |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
80 name = fileName[1].trim().replace("\"", ""); |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
81 } |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
82 } |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
83 content = IOUtils.toString(inStream); |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
84 } |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
85 } |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
86 catch (IOException e) { |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
87 return new Response(false, 603, null); |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
88 } |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
89 |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
90 boolean success = importer.importData(content, auth); |
331
5d11428e6a09
Made the importer a little more robust and introduced a better warning/error reporting.
Raimund Renkert <rrenkert@intevation.de>
parents:
325
diff
changeset
|
91 Map<String, Object> respData = new HashMap<String,Object>(); |
5d11428e6a09
Made the importer a little more robust and introduced a better warning/error reporting.
Raimund Renkert <rrenkert@intevation.de>
parents:
325
diff
changeset
|
92 respData.put("errors", importer.getErrors()); |
5d11428e6a09
Made the importer a little more robust and introduced a better warning/error reporting.
Raimund Renkert <rrenkert@intevation.de>
parents:
325
diff
changeset
|
93 respData.put("warnings", importer.getWarnings()); |
5d11428e6a09
Made the importer a little more robust and introduced a better warning/error reporting.
Raimund Renkert <rrenkert@intevation.de>
parents:
325
diff
changeset
|
94 respData.put("filename", name); |
325
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
95 int code = 200; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
96 if (!success) { |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
97 code = 660; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
98 } |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
99 Response response = new Response(success, code, respData); |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
100 return response; |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
101 } |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
102 catch(AuthenticationException ae) { |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
103 return new Response(false, 699, null); |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
104 } |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
105 } |
30883ab746a5
Extracted LAF import service to its own service class.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff
changeset
|
106 } |