forked from eclipse/org.eclipse.sensinact.gateway
-
Notifications
You must be signed in to change notification settings - Fork 0
/
EMFGenericDtoDataExtractor.java
109 lines (94 loc) · 4.13 KB
/
EMFGenericDtoDataExtractor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*********************************************************************
* Copyright (c) 2022 Contributors to the Eclipse Foundation.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Kentyou - initial implementation
**********************************************************************/
package org.eclipse.sensinact.core.extract.impl;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.sensinact.core.annotation.dto.NullAction;
import org.eclipse.sensinact.core.dto.impl.AbstractUpdateDto;
import org.eclipse.sensinact.core.dto.impl.DataUpdateDto;
import org.eclipse.sensinact.core.dto.impl.FailedMappingDto;
import org.eclipse.sensinact.core.dto.impl.MetadataUpdateDto;
import org.eclipse.sensinact.core.emf.dto.EMFGenericDto;
import org.eclipse.sensinact.core.push.dto.GenericDto;
public class EMFGenericDtoDataExtractor implements DataExtractor {
@Override
public List<? extends AbstractUpdateDto> getUpdates(Object update) {
EMFGenericDto dto;
try {
dto = EMFGenericDto.class.cast(update);
} catch (ClassCastException e) {
FailedMappingDto fmd = getFailedMappingDto(update,
new IllegalArgumentException("The supplied update dto is not of the correct type to extract", e));
fmd.timestamp = Instant.now();
return List.of(fmd);
}
Instant instant = dto.timestamp == null ? Instant.now() : dto.timestamp;
if (dto.provider == null) {
return List.of(copyCommonFields(dto, instant,
getFailedMappingDto(dto, new IllegalArgumentException("No provider is defined"))));
}
if (dto.service == null) {
if (dto.serviceReference != null) {
dto.service = dto.serviceReference.getName();
} else {
return List.of(copyCommonFields(dto, instant,
getFailedMappingDto(dto, new IllegalArgumentException("No service is defined"))));
}
}
if (dto.service != null && dto.serviceReference != null
&& !dto.serviceReference.getName().equals(dto.service)) {
return List.of(copyCommonFields(dto, instant, getFailedMappingDto(dto,
new IllegalArgumentException("Service and service reference have different names"))));
}
List<AbstractUpdateDto> list = new ArrayList<>();
// Accept a null value if this is not a metadata update
if (dto.value != null || dto.nullAction == NullAction.UPDATE) {
DataUpdateDto dud = copyCommonFields(dto, instant, new DataUpdateDto());
if (dto.type != null)
dud.type = dto.type;
dud.data = dto.value;
dud.modelEClass = dto.modelEClass;
list.add(dud);
}
if (dto.metadata != null) {
MetadataUpdateDto dud = copyCommonFields(dto, instant, new MetadataUpdateDto());
dud.metadata = dto.metadata;
dud.removeNullValues = true;
list.add(dud);
}
return list;
}
private FailedMappingDto getFailedMappingDto(Object originalDto, Throwable mappingFailure) {
FailedMappingDto fmd = new FailedMappingDto();
fmd.mappingFailure = mappingFailure;
fmd.originalDto = originalDto;
return fmd;
}
private <T extends AbstractUpdateDto> T copyCommonFields(GenericDto dto, Instant instant, T dud) {
dud.modelPackageUri = dto.modelPackageUri;
dud.model = dto.model;
dud.provider = dto.provider;
dud.service = dto.service;
dud.resource = dto.resource;
dud.timestamp = instant;
dud.originalDto = dto;
if (dto instanceof EMFGenericDto) {
EMFGenericDto edto = (EMFGenericDto) dto;
dud.modelEClass = edto.modelEClass;
dud.serviceEClass = edto.serviceEClass;
dud.serviceReference = edto.serviceReference;
}
return dud;
}
}