View Javadoc
1   package de.dlr.shepard.neo4Core.services;
2   
3   import java.io.IOException;
4   import java.io.InputStream;
5   import java.util.Arrays;
6   import java.util.Collections;
7   import java.util.List;
8   import java.util.Set;
9   
10  import de.dlr.shepard.exceptions.InvalidAuthException;
11  import de.dlr.shepard.exceptions.InvalidBodyException;
12  import de.dlr.shepard.influxDB.FillOption;
13  import de.dlr.shepard.influxDB.InfluxUtil;
14  import de.dlr.shepard.influxDB.SingleValuedUnaryFunction;
15  import de.dlr.shepard.influxDB.TimeseriesPayload;
16  import de.dlr.shepard.influxDB.TimeseriesService;
17  import de.dlr.shepard.neo4Core.dao.DataObjectDAO;
18  import de.dlr.shepard.neo4Core.dao.TimeseriesContainerDAO;
19  import de.dlr.shepard.neo4Core.dao.TimeseriesDAO;
20  import de.dlr.shepard.neo4Core.dao.TimeseriesReferenceDAO;
21  import de.dlr.shepard.neo4Core.dao.UserDAO;
22  import de.dlr.shepard.neo4Core.entities.TimeseriesReference;
23  import de.dlr.shepard.neo4Core.io.TimeseriesReferenceIO;
24  import de.dlr.shepard.security.PermissionsUtil;
25  import de.dlr.shepard.util.AccessType;
26  import de.dlr.shepard.util.DateHelper;
27  import lombok.extern.slf4j.Slf4j;
28  
29  @Slf4j
30  public class TimeseriesReferenceService implements IReferenceService<TimeseriesReference, TimeseriesReferenceIO> {
31  	private TimeseriesReferenceDAO timeseriesReferenceDAO = new TimeseriesReferenceDAO();
32  	private TimeseriesService timeseriesService = new TimeseriesService();
33  	private DataObjectDAO dataObjectDAO = new DataObjectDAO();
34  	private TimeseriesContainerDAO timeseriesContainerDAO = new TimeseriesContainerDAO();
35  	private TimeseriesDAO timeseriesDAO = new TimeseriesDAO();
36  	private UserDAO userDAO = new UserDAO();
37  	private DateHelper dateHelper = new DateHelper();
38  	private PermissionsUtil permissionsUtil = new PermissionsUtil();
39  
40  	@Override
41  	public List<TimeseriesReference> getAllReferencesByDataObjectShepardId(long dataObjectShepardId) {
42  		var references = timeseriesReferenceDAO.findByDataObjectShepardId(dataObjectShepardId);
43  		return references;
44  	}
45  
46  	@Override
47  	public TimeseriesReference getReferenceByShepardId(long shepardId) {
48  		var reference = timeseriesReferenceDAO.findByShepardId(shepardId);
49  		if (reference == null || reference.isDeleted()) {
50  			log.error("Timeseries Reference with id {} is null or deleted", shepardId);
51  			return null;
52  		}
53  		return reference;
54  	}
55  
56  	@Override
57  	public TimeseriesReference createReferenceByShepardId(long dataObjectShepardId,
58  			TimeseriesReferenceIO timeseriesReference, String username) {
59  		var user = userDAO.find(username);
60  		var dataObject = dataObjectDAO.findLightByShepardId(dataObjectShepardId);
61  		var container = timeseriesContainerDAO.findLightByNeo4jId(timeseriesReference.getTimeseriesContainerId());
62  		if (container == null || container.isDeleted()) {
63  			throw new InvalidBodyException(String.format("The timeseries container with id %d could not be found.",
64  					timeseriesReference.getTimeseriesContainerId()));
65  		}
66  		// sanitize timeseries
67  		var errors = Arrays.stream(timeseriesReference.getTimeseries()).map(InfluxUtil::sanitize)
68  				.filter(e -> !e.isBlank()).toList();
69  		if (!errors.isEmpty())
70  			throw new InvalidBodyException(
71  					"The timeseries list contains illegal characters: " + String.join(", ", errors));
72  		var toCreate = new TimeseriesReference();
73  		toCreate.setCreatedAt(dateHelper.getDate());
74  		toCreate.setCreatedBy(user);
75  		toCreate.setDataObject(dataObject);
76  		toCreate.setName(timeseriesReference.getName());
77  		toCreate.setStart(timeseriesReference.getStart());
78  		toCreate.setEnd(timeseriesReference.getEnd());
79  		toCreate.setTimeseriesContainer(container);
80  
81  		for (var ts : timeseriesReference.getTimeseries()) {
82  			var found = timeseriesDAO.find(ts.getMeasurement(), ts.getDevice(), ts.getLocation(), ts.getSymbolicName(),
83  					ts.getField());
84  			if (found != null) {
85  				toCreate.addTimeseries(found);
86  			} else {
87  				toCreate.addTimeseries(ts);
88  			}
89  		}
90  		TimeseriesReference created = timeseriesReferenceDAO.createOrUpdate(toCreate);
91  		created.setShepardId(created.getId());
92  		created = timeseriesReferenceDAO.createOrUpdate(created);
93  		return created;
94  	}
95  
96  	@Override
97  	public boolean deleteReferenceByShepardId(long timeseriesShepardId, String username) {
98  		var user = userDAO.find(username);
99  
100 		var old = timeseriesReferenceDAO.findByShepardId(timeseriesShepardId);
101 		old.setDeleted(true);
102 		old.setUpdatedAt(dateHelper.getDate());
103 		old.setUpdatedBy(user);
104 
105 		timeseriesReferenceDAO.createOrUpdate(old);
106 		return true;
107 	}
108 
109 	public List<TimeseriesPayload> getTimeseriesPayloadByShepardId(long timeseriesShepardId,
110 			SingleValuedUnaryFunction function, Long groupBy, FillOption fillOption, Set<String> devicesFilterSet,
111 			Set<String> locationsFilterSet, Set<String> symbolicNameFilterSet, String username) {
112 		var ref = timeseriesReferenceDAO.findByShepardId(timeseriesShepardId);
113 		if (ref.getTimeseriesContainer() == null || ref.getTimeseriesContainer().isDeleted())
114 			return Collections.emptyList();
115 
116 		if (!permissionsUtil.isAllowed(ref.getTimeseriesContainer().getId(), AccessType.Read, username))
117 			throw new InvalidAuthException("You are not authorized to access this timeseries");
118 
119 		var database = ref.getTimeseriesContainer().getDatabase();
120 		return timeseriesService.getTimeseriesPayloadList(ref.getStart(), ref.getEnd(), database, ref.getTimeseries(),
121 				function, groupBy, fillOption, devicesFilterSet, locationsFilterSet, symbolicNameFilterSet);
122 	}
123 
124 	public InputStream exportTimeseriesPayloadByShepardId(long timeseriesShepardId, SingleValuedUnaryFunction function,
125 			Long groupBy, FillOption fillOption, Set<String> devicesFilterSet, Set<String> locationsFilterSet,
126 			Set<String> symbolicNameFilterSet, String username) throws IOException {
127 		var ref = timeseriesReferenceDAO.findByShepardId(timeseriesShepardId);
128 		if (ref.getTimeseriesContainer() == null || ref.getTimeseriesContainer().isDeleted())
129 			return null;
130 
131 		if (!permissionsUtil.isAllowed(ref.getTimeseriesContainer().getId(), AccessType.Read, username))
132 			throw new InvalidAuthException("You are not authorized to access this timeseries");
133 
134 		var database = ref.getTimeseriesContainer().getDatabase();
135 		return timeseriesService.exportTimeseriesPayload(ref.getStart(), ref.getEnd(), database, ref.getTimeseries(),
136 				function, groupBy, fillOption, devicesFilterSet, locationsFilterSet, symbolicNameFilterSet);
137 	}
138 
139 	public InputStream exportTimeseriesPayloadByShepardId(long timeseriesId, String username) throws IOException {
140 		return exportTimeseriesPayloadByShepardId(timeseriesId, null, null, null, Collections.emptySet(),
141 				Collections.emptySet(), Collections.emptySet(), username);
142 	}
143 
144 }