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
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
19 import java.io.File;
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
20 import java.io.FileOutputStream;
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
21 import java.io.IOException;
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
0a5239a1e46e Upgrade to Log4j 2
Tom Gottfried <tom@intevation.de>
parents: 8202
diff changeset
24 import org.apache.logging.log4j.Logger;
0a5239a1e46e Upgrade to Log4j 2
Tom Gottfried <tom@intevation.de>
parents: 8202
diff changeset
25 import org.apache.logging.log4j.LogManager;
2639
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
26 import org.w3c.dom.Document;
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
27 import org.w3c.dom.Element;
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
28
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
31 * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
0a5239a1e46e Upgrade to Log4j 2
Tom Gottfried <tom@intevation.de>
parents: 8202
diff changeset
36 private static Logger log = LogManager.getLogger(FileUploadService.class);
2639
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
37
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
38 /** XPath that points to the artifact uuid.*/
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
39 public static final String XPATH_ARTIFACT_UUID =
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
40 "/upload/artifact-uuid/text()";
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
41
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
42 /** XPath that points to the base64 encoded data.*/
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
43 public static final String XPATH_DATA = "/upload/data/text()";
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
44
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
45 public FileUploadService() {
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
46 }
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
47
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
48 @Override
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
49 protected Document doProcess(
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
50 Document data,
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
51 GlobalContext context,
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
52 CallMeta callMeta
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
63 String uuid = extractUuid(data);
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
64
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
65 byte[] fileData = extractData(data);
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
66 if (fileData != null) {
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
70
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
71 File artifactDir = FileTools.getDirectory(shapePath, uuid);
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
84 }
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
88 }
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
89 }
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
93 }
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
94
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
95 return doc;
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
96 }
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
103 protected String extractUuid(Document data) {
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
104 return XMLUtils.xpathString(
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
105 data, XPATH_ARTIFACT_UUID, ArtifactNamespaceContext.INSTANCE);
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
106 }
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
113 protected byte[] extractData(Document data) {
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
114 String b64Data = XMLUtils.xpathString(
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
115 data, XPATH_DATA, ArtifactNamespaceContext.INSTANCE);
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
118 byte[] fileData = Base64.decodeBase64(b64Data);
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
119 return fileData;
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
120 }
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
121 return null;
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
122 }
a78dafdd8590 Issue 657.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
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 :

http://dive4elements.wald.intevation.org