1 package de.dlr.shepard.context.export;
2
3 import static org.assertj.core.api.Assertions.assertThat;
4 import static org.junit.jupiter.api.Assertions.assertEquals;
5
6 import de.dlr.shepard.auth.security.AuthenticationContext;
7 import de.dlr.shepard.auth.security.JWTPrincipal;
8 import de.dlr.shepard.auth.users.entities.User;
9 import de.dlr.shepard.auth.users.services.UserService;
10 import de.dlr.shepard.context.collection.entities.Collection;
11 import de.dlr.shepard.context.collection.entities.DataObject;
12 import de.dlr.shepard.context.collection.io.CollectionIO;
13 import de.dlr.shepard.context.collection.io.DataObjectIO;
14 import de.dlr.shepard.context.collection.services.CollectionService;
15 import de.dlr.shepard.context.collection.services.DataObjectService;
16 import de.dlr.shepard.context.labJournal.entities.LabJournalEntry;
17 import de.dlr.shepard.context.labJournal.services.LabJournalEntryService;
18 import de.dlr.shepard.context.references.dataobject.entities.DataObjectReference;
19 import de.dlr.shepard.context.references.dataobject.io.DataObjectReferenceIO;
20 import de.dlr.shepard.context.references.dataobject.services.CollectionReferenceService;
21 import de.dlr.shepard.context.references.dataobject.services.DataObjectReferenceService;
22 import de.dlr.shepard.context.references.file.entities.FileReference;
23 import de.dlr.shepard.context.references.file.io.FileReferenceIO;
24 import de.dlr.shepard.context.references.file.services.FileReferenceService;
25 import de.dlr.shepard.context.references.structureddata.services.StructuredDataReferenceService;
26 import de.dlr.shepard.context.references.timeseriesreference.io.TimeseriesReferenceIO;
27 import de.dlr.shepard.context.references.timeseriesreference.model.TimeseriesReference;
28 import de.dlr.shepard.context.references.timeseriesreference.services.TimeseriesReferenceService;
29 import de.dlr.shepard.context.version.daos.VersionDAO;
30 import de.dlr.shepard.context.version.services.VersionService;
31 import de.dlr.shepard.data.file.entities.FileContainer;
32 import de.dlr.shepard.data.file.entities.ShepardFile;
33 import de.dlr.shepard.data.file.io.FileContainerIO;
34 import de.dlr.shepard.data.file.services.FileContainerService;
35 import de.dlr.shepard.data.structureddata.services.StructuredDataContainerService;
36 import de.dlr.shepard.data.structureddata.services.StructuredDataService;
37 import de.dlr.shepard.data.timeseries.io.TimeseriesContainerIO;
38 import de.dlr.shepard.data.timeseries.model.Timeseries;
39 import de.dlr.shepard.data.timeseries.model.TimeseriesContainer;
40 import de.dlr.shepard.data.timeseries.model.TimeseriesDataPoint;
41 import de.dlr.shepard.data.timeseries.services.TimeseriesContainerService;
42 import de.dlr.shepard.data.timeseries.services.TimeseriesService;
43 import io.quarkus.test.junit.QuarkusTest;
44 import jakarta.inject.Inject;
45 import jakarta.transaction.Transactional;
46 import java.io.BufferedWriter;
47 import java.io.ByteArrayOutputStream;
48 import java.io.File;
49 import java.io.FileInputStream;
50 import java.io.FileWriter;
51 import java.io.InputStream;
52 import java.util.ArrayList;
53 import java.util.Hashtable;
54 import java.util.List;
55 import java.util.zip.ZipEntry;
56 import java.util.zip.ZipInputStream;
57 import org.junit.jupiter.api.BeforeEach;
58 import org.junit.jupiter.api.Test;
59
60 @QuarkusTest
61 public class ExportServiceQuarkusTest {
62
63 @Inject
64 CollectionService collectionService;
65
66 @Inject
67 LabJournalEntryService labJournalEntryService;
68
69 @Inject
70 UserService userService;
71
72 @Inject
73 AuthenticationContext authenticationContext;
74
75 @Inject
76 TimeseriesService timeseriesService;
77
78 @Inject
79 StructuredDataContainerService structuredDataContainerService;
80
81 @Inject
82 FileContainerService fileContainerService;
83
84 @Inject
85 FileReferenceService fileReferenceService;
86
87 @Inject
88 VersionDAO versionDAO;
89
90 @Inject
91 TimeseriesReferenceService timeseriesReferenceService;
92
93 @Inject
94 ExportService exportService;
95
96 @Inject
97 TimeseriesContainerService timeseriesContainerService;
98
99 @Inject
100 StructuredDataService structuredDataService;
101
102 @Inject
103 StructuredDataReferenceService structuredDataReferenceService;
104
105 @Inject
106 DataObjectService dataObjectService;
107
108 @Inject
109 DataObjectReferenceService dataObjectReferenceService;
110
111 @Inject
112 VersionService versionService;
113
114 @Inject
115 CollectionReferenceService collectionReferenceService;
116
117 private Collection collection;
118 private User user;
119 private DataObject dataObject;
120 private DataObject childDataObject;
121 private LabJournalEntry labJournalEntry;
122 private FileContainer fileContainer;
123 private FileReference fileReference;
124 private DataObjectReference dataObjectReference;
125 private ShepardFile shepardFile;
126 private Timeseries timeseries;
127 private TimeseriesReference timeseriesReference;
128 private TimeseriesContainer timeseriesContainer;
129 private final String userName = "user_name";
130 private final String collectionName = "c1";
131 private final String dataObjectName = "c1do1";
132 private final String childDataObjectName = "childDO";
133 private final String labJournalEntryContent = "LabJournalContent";
134 private final String dataObjectReferenceName = "doReference";
135 private final String fileReferenceName = "fileReference";
136 private final String fileName = "myFile";
137 private final String fileContent = "test file content";
138 private final String fileContainerName = "fileContainer";
139 private final String timeseriesReferenceName = "timeseriesReference";
140 private final String timeseriesContainerName = "timeseriesContainer";
141
142 private DataObject createDataObject(DataObjectIO dataObjectToCreate) {
143 return dataObjectService.createDataObject(collection.getId(), dataObjectToCreate);
144 }
145
146 @BeforeEach
147 public void setup() {
148 if (user == null) {
149
150 user = new User(userName);
151 user.setEmail("user@dlr.de");
152 userService.createOrUpdateUser(user);
153 authenticationContext.setPrincipal(new JWTPrincipal(userName, "key"));
154
155
156 CollectionIO collectionIO = new CollectionIO();
157 collectionIO.setName(collectionName);
158 collection = collectionService.createCollection(collectionIO);
159
160
161 DataObjectIO dataObjectIO = new DataObjectIO();
162 dataObjectIO.setName(dataObjectName);
163 dataObject = createDataObject(dataObjectIO);
164
165
166 DataObjectIO childDataObjectIO = new DataObjectIO();
167 childDataObjectIO.setName(childDataObjectName);
168 childDataObjectIO.setParentId(dataObject.getShepardId());
169 childDataObject = createDataObject(childDataObjectIO);
170
171
172 DataObjectReferenceIO dataObjectReferenceIO = new DataObjectReferenceIO();
173 dataObjectReferenceIO.setName(dataObjectReferenceName);
174 dataObjectReferenceIO.setReferencedDataObjectId(dataObject.getShepardId());
175 dataObjectReference = dataObjectReferenceService.createReference(
176 collection.getShepardId(),
177 childDataObject.getShepardId(),
178 dataObjectReferenceIO
179 );
180
181
182 labJournalEntry = labJournalEntryService.createLabJournalEntry(dataObject.getShepardId(), labJournalEntryContent);
183
184
185 FileContainerIO fileContainerIO = new FileContainerIO();
186 fileContainerIO.setName(fileContainerName);
187 fileContainer = fileContainerService.createContainer(fileContainerIO);
188
189
190 File file;
191 try {
192 file = new File(getClass().getClassLoader().getResource("test.txt").toURI());
193 BufferedWriter writer = new BufferedWriter(new FileWriter(file));
194 writer.write(fileContent);
195 writer.close();
196 FileInputStream fileInputStream = new FileInputStream(file);
197 shepardFile = fileContainerService.createFile(fileContainer.getId(), fileName, fileInputStream);
198 } catch (Exception e) {
199 e.printStackTrace();
200 }
201
202
203 FileReferenceIO fileReferenceIO = new FileReferenceIO();
204 fileReferenceIO.setName(fileReferenceName);
205 fileReferenceIO.setFileContainerId(fileContainer.getId());
206 String[] oids = { shepardFile.getOid() };
207 fileReferenceIO.setFileOids(oids);
208 fileReference = fileReferenceService.createReference(
209 collection.getShepardId(),
210 dataObject.getShepardId(),
211 fileReferenceIO
212 );
213
214
215 TimeseriesContainerIO timeseriesContainerIO = new TimeseriesContainerIO();
216 timeseriesContainerIO.setName(timeseriesContainerName);
217 timeseriesContainer = timeseriesContainerService.createContainer(timeseriesContainerIO);
218
219
220 TimeseriesDataPoint dataPoint1 = new TimeseriesDataPoint(1l, true);
221 TimeseriesDataPoint dataPoint2 = new TimeseriesDataPoint(2l, true);
222 TimeseriesDataPoint dataPoint3 = new TimeseriesDataPoint(3l, true);
223 List<TimeseriesDataPoint> points = new ArrayList<TimeseriesDataPoint>();
224 points.add(dataPoint1);
225 points.add(dataPoint2);
226 points.add(dataPoint3);
227 timeseries = new Timeseries("m", "d", "l", "s", "f");
228 ArrayList<Timeseries> timeseriesList = new ArrayList<Timeseries>();
229 timeseriesList.add(timeseries);
230 timeseriesService.saveDataPoints(timeseriesContainer.getId(), timeseries, points);
231
232
233 TimeseriesReferenceIO timeseriesReferenceIO = new TimeseriesReferenceIO();
234 timeseriesReferenceIO.setName(timeseriesReferenceName);
235 timeseriesReferenceIO.setStart(1l);
236 timeseriesReferenceIO.setEnd(2l);
237 timeseriesReferenceIO.setTimeseriesContainerId(timeseriesContainer.getId());
238 timeseriesReferenceIO.setTimeseries(timeseriesList);
239 timeseriesReference = timeseriesReferenceService.createReference(
240 collection.getShepardId(),
241 dataObject.getShepardId(),
242 timeseriesReferenceIO
243 );
244 }
245 }
246
247 private String readZipFile(ZipInputStream zipInputStream) {
248 byte[] buffer = new byte[2048];
249 ByteArrayOutputStream bos = new ByteArrayOutputStream();
250 int len;
251 try {
252 while ((len = zipInputStream.read(buffer)) > 0) {
253 bos.write(buffer, 0, len);
254 }
255 } catch (Exception e) {
256 e.printStackTrace();
257 }
258 byte[] zipFileBytes = bos.toByteArray();
259 String fileContent = new String(zipFileBytes);
260 return fileContent;
261 }
262
263 @Test
264 @Transactional
265 public void testExport() {
266 InputStream exportStream = null;
267 ZipInputStream exportZipStream = null;
268 ArrayList<String> filenames = new ArrayList<String>();
269 Hashtable<String, String> roCrateEntries = new Hashtable<String, String>();
270 try {
271 exportStream = exportService.exportCollectionByShepardId(collection.getShepardId());
272 exportZipStream = new ZipInputStream(exportStream);
273 ZipEntry zipEntry = exportZipStream.getNextEntry();
274 while (zipEntry != null) {
275 filenames.add(zipEntry.getName());
276 String zipContent = readZipFile(exportZipStream);
277 roCrateEntries.put(zipEntry.getName(), zipContent);
278 zipEntry = exportZipStream.getNextEntry();
279 }
280 } catch (Exception e) {
281 e.printStackTrace();
282 }
283
284 assertThat(filenames).containsExactlyInAnyOrder(
285 collection.getId() + ".json",
286 childDataObject.getId() + ".json",
287 labJournalEntry.getId() + ".json",
288 dataObject.getId() + ".json",
289 dataObjectReference.getId() + ".json",
290 fileReference.getId() + ".json",
291 shepardFile.getOid(),
292 timeseriesReference.getId() + ".json",
293 timeseriesReference.getId() + ".csv",
294 "ro-crate-metadata.json"
295 );
296
297 assertThat(roCrateEntries.get(collection.getId() + ".json")).containsSubsequence("\"id\" : " + collection.getId());
298
299 assertThat(roCrateEntries.get(labJournalEntry.getId() + ".json")).containsSubsequence(
300 "\"journalContent\" : \"" + labJournalEntryContent + "\""
301 );
302
303 assertThat(roCrateEntries.get(childDataObject.getId() + ".json")).containsSubsequence(
304 "\"parentId\" : " + dataObject.getId()
305 );
306
307 assertEquals(true, roCrateEntries.get(shepardFile.getOid()).equals(fileContent));
308
309 assertThat(roCrateEntries.get(timeseriesReference.getId() + ".csv")).containsSubsequence(
310 "DEVICE,FIELD,LOCATION,MEASUREMENT,SYMBOLICNAME,TIMESTAMP,VALUE"
311 );
312 assertThat(roCrateEntries.get(timeseriesReference.getId() + ".csv")).containsSubsequence("d,f,l,m,s,1,true");
313 assertThat(roCrateEntries.get(timeseriesReference.getId() + ".csv")).containsSubsequence("d,f,l,m,s,2,true");
314 assertEquals(false, roCrateEntries.get(childDataObject.getId() + ".json").contains("d,f,l,m,s,3,true"));
315 }
316 }