Skip to content

Commit 2aa37f2

Browse files
authored
Makes Value Only of SubmodelElementCollection conform standard (#357)
* Makes Value Only of SubmodelElementCollection conform standard * Changes internal use to HashMap for better Performance * Adapts JSON
1 parent 8bbe124 commit 2aa37f2

File tree

16 files changed

+121
-136
lines changed

16 files changed

+121
-136
lines changed

basyx.aasenvironment/basyx.aasenvironment-http/src/test/java/org/eclipse/basyx/digitaltwin/aasenvironment/http/TestAasEnvironmentHTTP.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public class TestAasEnvironmentHTTP {
7474
private static final String XML_ENV_PATH = "testEnvironment.xml";
7575
private static final String WRONGEXT_ENV_PATH = "testEnvironment.txt";
7676
private static final String JSON_OPERATIONALDATA_ENV_PATH = "operationalDataEnvironment.json";
77-
private static final String BASIC_EVENT_VALUE_ONLY = "BasicEventValueOnly.json";
77+
private static final String AASENVIRONMENT_VALUE_ONLY_JSON = "AASEnvironmentValueOnly.json";
7878

7979
private static ConfigurableApplicationContext appContext;
8080
private static SubmodelRepository submodelRepo;
@@ -114,7 +114,7 @@ public void testAASEnvironmentSerialization_ValueOnly() throws FileNotFoundExcep
114114
response = executeGetOnURL(getOperationalDataValueOnlyURL(), JSON_MIMETYPE);
115115
assertEquals(HttpStatus.OK.value(), response.getCode());
116116

117-
BaSyxHttpTestUtils.assertSameJSONContent(BaSyxHttpTestUtils.readJSONStringFromClasspath(BASIC_EVENT_VALUE_ONLY), BaSyxHttpTestUtils.getResponseAsString(response));
117+
BaSyxHttpTestUtils.assertSameJSONContent(BaSyxHttpTestUtils.readJSONStringFromClasspath(AASENVIRONMENT_VALUE_ONLY_JSON), BaSyxHttpTestUtils.getResponseAsString(response));
118118
}
119119

120120
@Test
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"ObserveValueUpdates": {
3+
"observed": {
4+
"type": "ExternalReference",
5+
"keys": [
6+
{
7+
"type": "Submodel",
8+
"value": "www.example.com/ids/sm/2222_8041_1042_8057"
9+
}
10+
]
11+
}
12+
},
13+
"ViaMqtt": {
14+
"L1": "290.6217782649107",
15+
"L2": "282.4599521889145",
16+
"L3": "272.2067133660983",
17+
"Active_Power_All": "104308.59396737856"
18+
},
19+
"AnnotationBottom": "",
20+
"ViaOpcUa": {
21+
"L1": "299.53634421194454",
22+
"L2": "296.55226321871635",
23+
"L3": "290.9149535087691",
24+
"Active_Power_All": "109456.23941992565"
25+
},
26+
"ViaModbus": {
27+
"L1": "160.26637",
28+
"L2": "160.44434",
29+
"L3": "163.39528",
30+
"Active_Power_All": "59738.68"
31+
},
32+
"ViaHTTP": {
33+
"L1": "291.4213289500366",
34+
"L2": "296.869547091201",
35+
"L3": "299.65015492058336",
36+
"Active_Power_All": "109572.7967447997"
37+
}
38+
}

basyx.aasenvironment/basyx.aasenvironment-http/src/test/resources/BasicEventValueOnly.json

Lines changed: 0 additions & 53 deletions
This file was deleted.

basyx.submodelservice/basyx.submodelservice-client/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/client/TestConnectedSubmodelElements.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ public void getSubmodelElementCollectionValue() {
369369
public void setSubmodelElementCollectionValue() {
370370
DefaultSubmodelElementCollection submodelElementCollection = getDefaultSubmodelElementCollection();
371371
ConnectedSubmodelElementCollection connectedSubmodelElementCollection = getConnectedSubmodelElementCollection(submodelElementCollection);
372-
submodelElementCollection.getValue().add(getDefaultMultiLanguageProperty());
372+
submodelElementCollection.getValue().add(getDefaultMultiLanguageProperty("newMLP"));
373373
SubmodelElementCollectionValueMapper valueMapper = new SubmodelElementCollectionValueMapper(submodelElementCollection);
374374
connectedSubmodelElementCollection.setValue(valueMapper.getValue());
375375
assertEquals(2, connectedSubmodelElementCollection.getValue().getValue().size());
@@ -445,6 +445,10 @@ private DefaultMultiLanguageProperty getDefaultMultiLanguageProperty() {
445445
return new DefaultMultiLanguageProperty.Builder().idShort(SUBMODEL_ELEMENT_ID_SHORT).value(Arrays.asList(new DefaultLangStringTextType.Builder().text(EXPECTED_STRING).language("de").build())).build();
446446
}
447447

448+
private DefaultMultiLanguageProperty getDefaultMultiLanguageProperty(String idShort) {
449+
return new DefaultMultiLanguageProperty.Builder().idShort(idShort).value(Arrays.asList(new DefaultLangStringTextType.Builder().text(EXPECTED_STRING).language("de").build())).build();
450+
}
451+
448452
private ConnectedMultiLanguageProperty getConnectedMultiLanguageProperty(DefaultMultiLanguageProperty property) {
449453
Submodel sm = createSubmodel(property);
450454
return new ConnectedMultiLanguageProperty(getSubmodelServiceUrl(Base64UrlEncodedIdentifier.encodeIdentifier(sm.getId())), SUBMODEL_ELEMENT_ID_SHORT);

basyx.submodelservice/basyx.submodelservice-core/src/main/java/org/eclipse/digitaltwin/basyx/deserialization/factory/SubmodelElementCollectionValueDeserializationFactory.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,13 @@
2626

2727
package org.eclipse.digitaltwin.basyx.deserialization.factory;
2828

29+
import java.util.ArrayList;
30+
import java.util.HashMap;
2931
import java.util.List;
32+
import java.util.Map;
3033

3134
import org.eclipse.digitaltwin.basyx.submodelservice.value.SubmodelElementCollectionValue;
35+
import org.eclipse.digitaltwin.basyx.submodelservice.value.SubmodelElementValue;
3236
import org.eclipse.digitaltwin.basyx.submodelservice.value.ValueOnly;
3337

3438
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -61,7 +65,13 @@ public SubmodelElementCollectionValueDeserializationFactory(ObjectMapper objectM
6165
*
6266
*/
6367
public SubmodelElementCollectionValue create() throws JsonProcessingException {
64-
List<ValueOnly> valueOnlies = objectMapper.readValue(node.toString(), new TypeReference<List<ValueOnly>>() {});
68+
Map<String, Object> map = objectMapper.readValue(node.toString(), new TypeReference<Map<String, Object>>() {});
69+
Map<String,SubmodelElementValue> valueOnlies = new HashMap<>();
70+
71+
for (Map.Entry<String, Object> entry : map.entrySet()) {
72+
SubmodelElementValue submodelElementValue = objectMapper.convertValue(entry.getValue(), SubmodelElementValue.class);
73+
valueOnlies.put(entry.getKey(), submodelElementValue);
74+
}
6575

6676
return new SubmodelElementCollectionValue(valueOnlies);
6777
}

basyx.submodelservice/basyx.submodelservice-core/src/main/java/org/eclipse/digitaltwin/basyx/deserialization/factory/SubmodelElementValueDeserializationFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,12 @@ public SubmodelElementValue create(ObjectMapper mapper, JsonNode node) throws Js
8888
return mapper.convertValue(node, RelationshipElementValue.class);
8989
} else if (isTypeOfAnnotatedRelationshipElementValue(node)) {
9090
return mapper.convertValue(node, AnnotatedRelationshipElementValue.class);
91+
} else if (isTypeOfBasicEventValue(node)) {
92+
return mapper.convertValue(node, BasicEventValue.class);
9193
} else if (isTypeOfSubmodelElementListValue(node)) {
9294
return new SubmodelElementListValueDeserializationFactory(mapper, node).create();
9395
} else if (isTypeOfSubmodelElementCollectionValue(node)) {
9496
return new SubmodelElementCollectionValueDeserializationFactory(mapper, node).create();
95-
} else if (isTypeOfBasicEventValue(node)) {
96-
return mapper.convertValue(node, BasicEventValue.class);
9797
}
9898

9999
throw new SubmodelElementValueDeserializationException();

basyx.submodelservice/basyx.submodelservice-core/src/main/java/org/eclipse/digitaltwin/basyx/deserialization/util/SubmodelElementValueDeserializationUtil.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
import java.lang.reflect.Array;
2929
import java.lang.reflect.Field;
30+
import java.util.Iterator;
31+
import java.util.Map;
3032
import java.util.Optional;
3133
import java.util.stream.Stream;
3234

@@ -90,7 +92,7 @@ public static boolean isTypeOfAnnotatedRelationshipElementValue(JsonNode node) {
9092
}
9193

9294
public static boolean isTypeOfSubmodelElementCollectionValue(JsonNode node) {
93-
return node.isArray() && hasStructureOfSubmodelElementCollectionValue(node);
95+
return node.isObject() && hasStructureOfSubmodelElementCollectionValue(node);
9496
}
9597

9698
public static boolean isTypeOfSubmodelElementListValue(JsonNode node) {
@@ -161,9 +163,12 @@ private static boolean hasStructureOfMultiLanguagePropertyValue(JsonNode node) {
161163
}
162164

163165
private static boolean hasStructureOfSubmodelElementCollectionValue(JsonNode node) {
164-
for (JsonNode element : node) {
165-
if (!isValidValueOnly(element))
166+
Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
167+
while (fields.hasNext()) {
168+
Map.Entry<String, JsonNode> field = fields.next();
169+
if (!isInstanceOfSubmodelElementValue(field.getValue())) {
166170
return false;
171+
}
167172
}
168173

169174
return true;

basyx.submodelservice/basyx.submodelservice-core/src/main/java/org/eclipse/digitaltwin/basyx/serialization/SubmodelElementCollectionValueSerializer.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
package org.eclipse.digitaltwin.basyx.serialization;
2828

2929
import java.io.IOException;
30+
import java.util.Map;
3031

3132
import org.eclipse.digitaltwin.basyx.submodelservice.value.SubmodelElementCollectionValue;
33+
import org.eclipse.digitaltwin.basyx.submodelservice.value.SubmodelElementValue;
3234
import org.eclipse.digitaltwin.basyx.submodelservice.value.ValueOnly;
3335

3436
import com.fasterxml.jackson.core.JsonGenerator;
@@ -45,13 +47,13 @@ public class SubmodelElementCollectionValueSerializer extends JsonSerializer<Sub
4547

4648
@Override
4749
public void serialize(SubmodelElementCollectionValue value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
48-
gen.writeStartArray();
50+
gen.writeStartObject();
4951

50-
for (ValueOnly valueOnly : value.getValue()) {
51-
gen.writeObject(valueOnly);
52+
for (Map.Entry<String, SubmodelElementValue> valueOnly : value.getValue().entrySet()) {
53+
gen.writeObjectField(valueOnly.getKey(),valueOnly.getValue());
5254
}
5355

54-
gen.writeEndArray();
56+
gen.writeEndObject();
5557
}
5658

5759
}

basyx.submodelservice/basyx.submodelservice-core/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/value/SubmodelElementCollectionValue.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
package org.eclipse.digitaltwin.basyx.submodelservice.value;
2626

2727
import java.util.List;
28+
import java.util.Map;
2829

2930
import org.eclipse.digitaltwin.aas4j.v3.model.SubmodelElementCollection;
3031

@@ -35,18 +36,18 @@
3536
*
3637
*/
3738
public class SubmodelElementCollectionValue implements SubmodelElementValue {
38-
private List<ValueOnly> value;
39+
private Map<String,SubmodelElementValue> value;
3940

4041
@SuppressWarnings("unused")
4142
private SubmodelElementCollectionValue() {
4243
super();
4344
}
4445

45-
public SubmodelElementCollectionValue(List<ValueOnly> value) {
46+
public SubmodelElementCollectionValue(Map<String,SubmodelElementValue> value) {
4647
this.value = value;
4748
}
4849

49-
public List<ValueOnly> getValue() {
50+
public Map<String,SubmodelElementValue> getValue() {
5051
return value;
5152
}
5253

basyx.submodelservice/basyx.submodelservice-core/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/value/mapper/SubmodelElementCollectionValueMapper.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828

2929
import org.eclipse.digitaltwin.aas4j.v3.model.SubmodelElementCollection;
3030
import org.eclipse.digitaltwin.basyx.submodelservice.value.SubmodelElementCollectionValue;
31+
import org.eclipse.digitaltwin.basyx.submodelservice.value.ValueOnly;
32+
33+
import java.util.stream.Collectors;
3134

3235
/**
3336
* Maps {@link SubmodelElementCollection} value to {@link SubmodelElementCollectionValue}
@@ -44,7 +47,7 @@ public SubmodelElementCollectionValueMapper(SubmodelElementCollection submodelEl
4447

4548
@Override
4649
public SubmodelElementCollectionValue getValue() {
47-
return new SubmodelElementCollectionValue(ValueMapperUtil.createValueOnlyCollection(submodelElementCollection.getValue()));
50+
return new SubmodelElementCollectionValue(ValueMapperUtil.createValueOnlyCollection(submodelElementCollection.getValue()).stream().collect(Collectors.toMap(ValueOnly::getIdShort, ValueOnly::getSubmodelElementValue)));
4851
}
4952

5053
@Override

0 commit comments

Comments
 (0)