View Javadoc
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       //create user
150       user = new User(userName);
151       user.setEmail("user@dlr.de");
152       userService.createOrUpdateUser(user);
153       authenticationContext.setPrincipal(new JWTPrincipal(userName, "key"));
154 
155       //create collection
156       CollectionIO collectionIO = new CollectionIO();
157       collectionIO.setName(collectionName);
158       collection = collectionService.createCollection(collectionIO);
159 
160       //create dataObject
161       DataObjectIO dataObjectIO = new DataObjectIO();
162       dataObjectIO.setName(dataObjectName);
163       dataObject = createDataObject(dataObjectIO);
164 
165       //create childDataObject
166       DataObjectIO childDataObjectIO = new DataObjectIO();
167       childDataObjectIO.setName(childDataObjectName);
168       childDataObjectIO.setParentId(dataObject.getShepardId());
169       childDataObject = createDataObject(childDataObjectIO);
170 
171       //create dataObjectReference
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       //create labJournalEntry
182       labJournalEntry = labJournalEntryService.createLabJournalEntry(dataObject.getShepardId(), labJournalEntryContent);
183 
184       //create FileContainer
185       FileContainerIO fileContainerIO = new FileContainerIO();
186       fileContainerIO.setName(fileContainerName);
187       fileContainer = fileContainerService.createContainer(fileContainerIO);
188 
189       //create and store (shepard)file
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       //create fileReference
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       //create timerseriesContainer
215       TimeseriesContainerIO timeseriesContainerIO = new TimeseriesContainerIO();
216       timeseriesContainerIO.setName(timeseriesContainerName);
217       timeseriesContainer = timeseriesContainerService.createContainer(timeseriesContainerIO);
218 
219       //create timeseries
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       //create timeseriesReference
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     //test presence of all expected files in export
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     //look into labJournalContent
299     assertThat(roCrateEntries.get(labJournalEntry.getId() + ".json")).containsSubsequence(
300       "\"journalContent\" : \"" + labJournalEntryContent + "\""
301     );
302     //test existence of parent entry in child export
303     assertThat(roCrateEntries.get(childDataObject.getId() + ".json")).containsSubsequence(
304       "\"parentId\" : " + dataObject.getId()
305     );
306     //look into export of filePayload
307     assertEquals(true, roCrateEntries.get(shepardFile.getOid()).equals(fileContent));
308     //look into export of timeseriesReferencePayload
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 }