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