Mercurial > dive4elements > river
annotate artifacts/src/main/java/org/dive4elements/river/artifacts/services/FileUploadService.java @ 9751:308a0d822d18 3.2.x
Keep configuration and data in distinct directories
This allows having distinct volumes for configuration and data
(artifact database, generated mapfiles and shapefiles, etc.).
While at it, cleanup MapServer configuration a little bit.
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Tue, 11 Oct 2022 11:42:09 +0200 |
parents | 0a5239a1e46e |
children |
rev | line source |
---|---|
5863
4897a58c8746
River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde |
4897a58c8746
River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
2 * Software engineering by Intevation GmbH |
4897a58c8746
River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
3 * |
5994
af13ceeba52a
Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5868
diff
changeset
|
4 * This file is Free Software under the GNU AGPL (>=v3) |
5863
4897a58c8746
River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the |
5994
af13ceeba52a
Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5868
diff
changeset
|
6 * documentation coming with Dive4Elements River for details. |
5863
4897a58c8746
River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
7 */ |
4897a58c8746
River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
8 |
5831
bd047b71ab37
Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5009
diff
changeset
|
9 package org.dive4elements.river.artifacts.services; |
2639 | 10 |
5831
bd047b71ab37
Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5009
diff
changeset
|
11 import org.dive4elements.artifacts.CallMeta; |
bd047b71ab37
Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5009
diff
changeset
|
12 import org.dive4elements.artifacts.GlobalContext; |
bd047b71ab37
Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5009
diff
changeset
|
13 import org.dive4elements.artifacts.common.ArtifactNamespaceContext; |
bd047b71ab37
Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5009
diff
changeset
|
14 import org.dive4elements.artifacts.common.utils.FileTools; |
bd047b71ab37
Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5009
diff
changeset
|
15 import org.dive4elements.artifacts.common.utils.XMLUtils; |
bd047b71ab37
Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5009
diff
changeset
|
16 import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; |
5865
73da40528cf2
River artifacts: Renamed FLYSUtils to RiverUtils.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5863
diff
changeset
|
17 import org.dive4elements.river.utils.RiverUtils; |
4656
442fbb290fa8
Introduce river mapfile generation (WARNING: Changes in config xml files required!).
Christian Lins <christian.lins@intevation.de>
parents:
3084
diff
changeset
|
18 |
2639 | 19 import java.io.File; |
20 import java.io.FileOutputStream; | |
21 import java.io.IOException; | |
22 | |
4656
442fbb290fa8
Introduce river mapfile generation (WARNING: Changes in config xml files required!).
Christian Lins <christian.lins@intevation.de>
parents:
3084
diff
changeset
|
23 import org.apache.commons.codec.binary.Base64; |
9726 | 24 import org.apache.logging.log4j.Logger; |
25 import org.apache.logging.log4j.LogManager; | |
2639 | 26 import org.w3c.dom.Document; |
27 import org.w3c.dom.Element; | |
28 | |
29 /** | |
5009
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
30 * Service that receives XML-packed Shapefile bundles from the client. |
2639 | 31 * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a> |
32 */ | |
5868
35b2d86c3fb5
River artifacts: Renamed FLYSService to D4EService.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5865
diff
changeset
|
33 public class FileUploadService extends D4EService { |
2639 | 34 |
8202
e4606eae8ea5
sed src/**/*.java 's/logger/log/g'
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
35 /** The log used in this service.*/ |
9726 | 36 private static Logger log = LogManager.getLogger(FileUploadService.class); |
2639 | 37 |
38 /** XPath that points to the artifact uuid.*/ | |
39 public static final String XPATH_ARTIFACT_UUID = | |
40 "/upload/artifact-uuid/text()"; | |
41 | |
42 /** XPath that points to the base64 encoded data.*/ | |
43 public static final String XPATH_DATA = "/upload/data/text()"; | |
44 | |
45 public FileUploadService() { | |
46 } | |
47 | |
48 @Override | |
49 protected Document doProcess( | |
50 Document data, | |
51 GlobalContext context, | |
52 CallMeta callMeta | |
53 ) { | |
8202
e4606eae8ea5
sed src/**/*.java 's/logger/log/g'
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
54 log.debug("FileUploadService.process"); |
2639 | 55 |
5009
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
56 Document doc = XMLUtils.newDocument(); |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
57 ElementCreator ec = new ElementCreator(doc, null, null); |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
58 Element resp = ec.create("response"); |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
59 Element status = ec.create("status"); |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
60 resp.appendChild(status); |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
61 doc.appendChild(resp); |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
62 |
2639 | 63 String uuid = extractUuid(data); |
64 | |
65 byte[] fileData = extractData(data); | |
66 if (fileData != null) { | |
67 try { | |
5865
73da40528cf2
River artifacts: Renamed FLYSUtils to RiverUtils.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5863
diff
changeset
|
68 String shapePath = RiverUtils.getXPathString( |
9751
308a0d822d18
Keep configuration and data in distinct directories
Tom Gottfried <tom@intevation.de>
parents:
9726
diff
changeset
|
69 RiverUtils.XPATH_MAPFILES_PATH); |
2639 | 70 |
71 File artifactDir = FileTools.getDirectory(shapePath, uuid); | |
72 FileOutputStream fos = | |
2641
2bad13107161
Make file upload cross platform.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2640
diff
changeset
|
73 new FileOutputStream( |
2bad13107161
Make file upload cross platform.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2640
diff
changeset
|
74 new File(artifactDir, "user-rgd.zip")); |
2bad13107161
Make file upload cross platform.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2640
diff
changeset
|
75 try { |
2bad13107161
Make file upload cross platform.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2640
diff
changeset
|
76 fos.write(fileData); |
5009
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
77 |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
78 // Write operation successful |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
79 status.setTextContent("Upload erfolgreich!"); // TODO: i18n |
2641
2bad13107161
Make file upload cross platform.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2640
diff
changeset
|
80 } |
2bad13107161
Make file upload cross platform.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2640
diff
changeset
|
81 finally { |
2bad13107161
Make file upload cross platform.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2640
diff
changeset
|
82 fos.close(); |
2bad13107161
Make file upload cross platform.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2640
diff
changeset
|
83 } |
2639 | 84 } |
85 catch (IOException ioe) { | |
8202
e4606eae8ea5
sed src/**/*.java 's/logger/log/g'
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
86 log.warn(ioe, ioe); |
5009
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
87 status.setTextContent("Upload fehlgeschlagen!"); |
2639 | 88 } |
89 } | |
90 else { | |
8202
e4606eae8ea5
sed src/**/*.java 's/logger/log/g'
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
91 log.debug("No data in uploaded xml."); |
5009
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
92 status.setTextContent("Upload fehlgeschlagen!"); |
2639 | 93 } |
94 | |
95 return doc; | |
96 } | |
97 | |
5009
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
98 /** |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
99 * Extracts the UUID from the XML document. |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
100 * @param data |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
101 * @return |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
102 */ |
2639 | 103 protected String extractUuid(Document data) { |
104 return XMLUtils.xpathString( | |
105 data, XPATH_ARTIFACT_UUID, ArtifactNamespaceContext.INSTANCE); | |
106 } | |
107 | |
5009
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
108 /** |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
109 * Extracts the base64 encoded ZIP file from the XML document. |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
110 * @param data |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
111 * @return |
7c8ce0a95a64
flys/#657: Shapefile upload service returns success or failure to client (i18n tbd)
Christian Lins <christian.lins@intevation.de>
parents:
4656
diff
changeset
|
112 */ |
2639 | 113 protected byte[] extractData(Document data) { |
114 String b64Data = XMLUtils.xpathString( | |
115 data, XPATH_DATA, ArtifactNamespaceContext.INSTANCE); | |
116 | |
3084
d78b7c06e061
Fixed string comparision for identity.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3083
diff
changeset
|
117 if (b64Data != null && b64Data.length() > 0) { |
2639 | 118 byte[] fileData = Base64.decodeBase64(b64Data); |
119 return fileData; | |
120 } | |
121 return null; | |
122 } | |
123 } | |
3083
4bd3d8bbb60c
Added missing vim lines.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2646
diff
changeset
|
124 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |