View Javadoc
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  		// TODO: Add more types, maybe improve (StrategyPattern?)
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 			// filter empty payloads (due to invalid permissions)
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 }