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.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       //create user
126       user = new User(userName);
127       user.setEmail("user@dlr.de");
128       userService.createOrUpdateUser(user);
129       authenticationContext.setPrincipal(new JWTPrincipal(userName, "key"));
130 
131       //create collection
132       CollectionIO collectionIO = new CollectionIO();
133       collectionIO.setName(collectionName);
134       collection = collectionService.createCollection(collectionIO);
135 
136       //create dataObject
137       DataObjectIO dataObjectIO = new DataObjectIO();
138       dataObjectIO.setName(dataObjectName);
139       dataObject = createDataObject(dataObjectIO);
140 
141       //create childDataObject
142       DataObjectIO childDataObjectIO = new DataObjectIO();
143       childDataObjectIO.setName(childDataObjectName);
144       childDataObjectIO.setParentId(dataObject.getShepardId());
145       childDataObject = createDataObject(childDataObjectIO);
146 
147       //create dataObjectReference
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       //create labJournalEntry
158       labJournalEntry = labJournalEntryService.createLabJournalEntry(dataObject.getShepardId(), labJournalEntryContent);
159 
160       //create FileContainer
161       FileContainerIO fileContainerIO = new FileContainerIO();
162       fileContainerIO.setName(fileContainerName);
163       fileContainer = fileContainerService.createContainer(fileContainerIO);
164 
165       //create and store (shepard)file
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       //create fileReference
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       //create timerseriesContainer
191       TimeseriesContainerIO timeseriesContainerIO = new TimeseriesContainerIO();
192       timeseriesContainerIO.setName(timeseriesContainerName);
193       timeseriesContainer = timeseriesContainerService.createContainer(timeseriesContainerIO);
194 
195       //create timeseries
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       //create timeseriesReference
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     //test presence of all expected files in export
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     //look into labJournalContent
275     assertThat(roCrateEntries.get(labJournalEntry.getId() + ".json")).containsSubsequence(
276       "\"journalContent\" : \"" + labJournalEntryContent + "\""
277     );
278     //test existence of parent entry in child export
279     assertThat(roCrateEntries.get(childDataObject.getId() + ".json")).containsSubsequence(
280       "\"parentId\" : " + dataObject.getId()
281     );
282     //look into export of filePayload
283     assertEquals(true, roCrateEntries.get(shepardFile.getOid()).equals(fileContent));
284     //look into export of timeseriesReferencePayload
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 }