1 package de.dlr.shepard.neo4Core.export;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.util.Collections;
6 import java.util.List;
7
8 import de.dlr.shepard.exceptions.InvalidAuthException;
9 import de.dlr.shepard.mongoDB.NamedInputStream;
10 import de.dlr.shepard.mongoDB.StructuredDataPayload;
11 import de.dlr.shepard.neo4Core.entities.TimeseriesReference;
12 import de.dlr.shepard.neo4Core.io.BasicReferenceIO;
13 import de.dlr.shepard.neo4Core.io.FileReferenceIO;
14 import de.dlr.shepard.neo4Core.io.StructuredDataReferenceIO;
15 import de.dlr.shepard.neo4Core.io.TimeseriesReferenceIO;
16 import de.dlr.shepard.neo4Core.io.URIReferenceIO;
17 import de.dlr.shepard.neo4Core.services.BasicReferenceService;
18 import de.dlr.shepard.neo4Core.services.CollectionService;
19 import de.dlr.shepard.neo4Core.services.DataObjectService;
20 import de.dlr.shepard.neo4Core.services.FileReferenceService;
21 import de.dlr.shepard.neo4Core.services.StructuredDataReferenceService;
22 import de.dlr.shepard.neo4Core.services.TimeseriesReferenceService;
23 import de.dlr.shepard.neo4Core.services.URIReferenceService;
24 import lombok.extern.slf4j.Slf4j;
25
26 @Slf4j
27 public class ExportService {
28
29 private CollectionService collectionService = new CollectionService();
30 private DataObjectService dataObjectService = new DataObjectService();
31 private BasicReferenceService basicReferenceService = new BasicReferenceService();
32 private TimeseriesReferenceService timeseriesReferenceService = new TimeseriesReferenceService();
33 private FileReferenceService fileReferenceService = new FileReferenceService();
34 private StructuredDataReferenceService structuredDataReferenceService = new StructuredDataReferenceService();
35 private URIReferenceService uriReferenceService = new URIReferenceService();
36
37 public InputStream exportCollectionByShepardId(long collectionId, String username) throws IOException {
38 var collection = collectionService.getCollectionByShepardId(collectionId);
39
40 var builder = new ExportBuilder(collection);
41 for (var dataObject : collection.getDataObjects()) {
42 fetchAndWriteDataObject(builder, dataObject.getShepardId(), username);
43 }
44 return builder.build();
45 }
46
47 private void fetchAndWriteDataObject(ExportBuilder builder, long dataObjectId, String username) throws IOException {
48 var dataObject = dataObjectService.getDataObjectByShepardId(dataObjectId);
49 builder.addDataObject(dataObject);
50
51
52 for (var reference : dataObject.getReferences()) {
53 switch (reference.getType()) {
54 case "TimeseriesReference" -> fetchAndWriteTimeseriesReference(builder, reference.getShepardId(), username);
55 case "FileReference" -> fetchAndWriteFileReference(builder, reference.getShepardId(), username);
56 case "StructuredDataReference" ->
57 fetchAndWriteStructuredDataReference(builder, reference.getShepardId(), username);
58 case "URIReference" -> fetchAndWriteUriReference(builder, reference.getShepardId(), username);
59 default -> fetchAndWriteBasicReference(builder, reference.getShepardId());
60 }
61 }
62 }
63
64 private void fetchAndWriteTimeseriesReference(ExportBuilder builder, long referenceId, String username)
65 throws IOException {
66 var reference = timeseriesReferenceService.getReferenceByShepardId(referenceId);
67
68 builder.addReference(new TimeseriesReferenceIO(reference), reference.getCreatedBy());
69
70 InputStream timeseriesPayload = null;
71 try {
72 timeseriesPayload = timeseriesReferenceService.exportTimeseriesPayloadByShepardId(referenceId, username);
73 } catch (InvalidAuthException e) {
74 log.warn("Cannot access timeseries payload during export due to invalid permissions");
75 }
76 if (timeseriesPayload != null) {
77 writeTimeseriesPayload(builder, timeseriesPayload, reference);
78 }
79 }
80
81 private void fetchAndWriteFileReference(ExportBuilder builder, long referenceId, String username)
82 throws IOException {
83 var reference = fileReferenceService.getReferenceByShepardId(referenceId);
84
85 builder.addReference(new FileReferenceIO(reference), reference.getCreatedBy());
86
87 List<NamedInputStream> payloads = Collections.emptyList();
88 try {
89 payloads = fileReferenceService.getAllPayloadsByShepardId(referenceId, username);
90 } catch (InvalidAuthException e) {
91 log.warn("Cannot access file payload during export due to invalid permissions");
92 }
93
94 for (var nis : payloads) {
95 writeFilePayload(builder, nis);
96 }
97 }
98
99 private void fetchAndWriteStructuredDataReference(ExportBuilder builder, long referenceId, String username)
100 throws IOException {
101 var reference = structuredDataReferenceService.getReferenceByShepardId(referenceId);
102
103 builder.addReference(new StructuredDataReferenceIO(reference), reference.getCreatedBy());
104
105 List<StructuredDataPayload> payloads = Collections.emptyList();
106 try {
107
108 payloads = structuredDataReferenceService.getAllPayloadsByShepardId(referenceId, username).stream()
109 .filter(p -> p.getPayload() != null).toList();
110 } catch (InvalidAuthException e) {
111 log.warn("Cannot access structured data payload during export due to invalid permissions");
112 }
113
114 for (var sdp : payloads) {
115 writeStructuredDataPayload(builder, sdp);
116 }
117 }
118
119 private void fetchAndWriteUriReference(ExportBuilder builder, long referenceId, String username)
120 throws IOException {
121 var reference = uriReferenceService.getReferenceByShepardId(referenceId);
122
123 builder.addReference(new URIReferenceIO(reference), reference.getCreatedBy());
124 }
125
126 private void fetchAndWriteBasicReference(ExportBuilder builder, long referenceId) throws IOException {
127 var reference = basicReferenceService.getReferenceByShepardId(referenceId);
128
129 builder.addReference(new BasicReferenceIO(reference), reference.getCreatedBy());
130 }
131
132 private void writeFilePayload(ExportBuilder builder, NamedInputStream nis) throws IOException {
133 var nameSplitted = nis.getName().split("\\.", 2);
134 var filename = nameSplitted.length > 1 ? nis.getOid() + "." + nameSplitted[1] : nis.getOid();
135
136 builder.addPayload(nis.getInputStream().readAllBytes(), filename, nis.getName());
137 }
138
139 private void writeStructuredDataPayload(ExportBuilder builder, StructuredDataPayload sdp) throws IOException {
140 var filename = sdp.getStructuredData().getOid() + ExportConstants.JSON_FILE_EXTENSION;
141
142 builder.addPayload(sdp.getPayload().getBytes(), filename, sdp.getStructuredData().getName(),
143 "application/json");
144 }
145
146 private void writeTimeseriesPayload(ExportBuilder builder, InputStream payload, TimeseriesReference reference)
147 throws IOException {
148 var filename = reference.getUniqueId() + ExportConstants.CSV_FILE_EXTENSION;
149
150 builder.addPayload(payload.readAllBytes(), filename, reference.getName(), "text/csv");
151 }
152
153 }