Skip to content

Commit 33f8c7f

Browse files
committed
Fix SubmodelElement XML ordering and Operation entity serialization (#456, #390)
- Fix SubmodelElementMixin property order to match XSD requirements - Change "hasExtensions" to "extensions" and "qualifier" to "qualifiers" - Remove duplicate properties from SubmodelElement ordering - Add OperationVariable empty list handling to prevent invalid XML - Remove test skip logic as all 2,593 XML validation tests now pass Signed-off-by: Hannes Stiebitzhofer <hannes@stiebitzhofer.com>
1 parent ecd3800 commit 33f8c7f

File tree

4 files changed

+35
-35
lines changed

4 files changed

+35
-35
lines changed

dataformat-xml/src/main/java/org/eclipse/digitaltwin/aas4j/v3/dataformat/xml/internal/mixins/SubmodelElementMixin.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
1919

2020
@JsonPropertyOrder({
21-
"hasExtensions",
21+
"extensions",
2222
"category",
2323
"idShort",
2424
"displayName",
@@ -27,9 +27,7 @@
2727
"kind", // --> HasKind
2828
"semanticId",
2929
"supplementalSemanticIds",
30-
"reference", // --> HasSemantics
31-
"qualifier", // --> Qualifiable
32-
"dataSpecifications",
30+
"qualifiers", // --> Qualifiable
3331
"embeddedDataSpecifications", // --> HasDataSpecifications
3432
"orderRelevant",
3533
"semanticIdListElement",

dataformat-xml/src/main/java/org/eclipse/digitaltwin/aas4j/v3/dataformat/xml/internal/serialization/OperationVariableSerializer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import com.fasterxml.jackson.databind.SerializerProvider;
2121
import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;
2222
import java.io.IOException;
23+
import java.util.List;
24+
import org.eclipse.digitaltwin.aas4j.v3.dataformat.core.internal.util.ReflectionHelper;
2325
import org.eclipse.digitaltwin.aas4j.v3.dataformat.xml.internal.SubmodelElementManager;
2426
import org.eclipse.digitaltwin.aas4j.v3.model.OperationVariable;
2527

@@ -29,12 +31,15 @@ public void serialize(
2931
OperationVariable operationVariable, JsonGenerator gen, SerializerProvider serializers)
3032
throws IOException {
3133
ToXmlGenerator xgen = (ToXmlGenerator) gen;
34+
List<Runnable> resetRunnables =
35+
ReflectionHelper.setEmptyListsToNull(operationVariable.getValue());
3236
xgen.writeStartObject();
3337
xgen.writeFieldName("value");
3438
xgen.writeStartObject();
3539
xgen.writeFieldName(SubmodelElementManager.getXmlName(operationVariable.getValue().getClass()));
3640
xgen.writeObject(operationVariable.getValue());
3741
xgen.writeEndObject();
3842
xgen.writeEndObject();
43+
resetRunnables.stream().forEach(r -> r.run());
3944
}
4045
}

dataformat-xml/src/test/java/org/eclipse/digitaltwin/aas4j/v3/dataformat/xml/XmlSerializerTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.eclipse.digitaltwin.aas4j.v3.model.DataTypeDefXsd;
4141
import org.eclipse.digitaltwin.aas4j.v3.model.DataTypeIec61360;
4242
import org.eclipse.digitaltwin.aas4j.v3.model.DefaultDummyDataSpecification;
43+
import org.eclipse.digitaltwin.aas4j.v3.model.EntityType;
4344
import org.eclipse.digitaltwin.aas4j.v3.model.Environment;
4445
import org.eclipse.digitaltwin.aas4j.v3.model.KeyTypes;
4546
import org.eclipse.digitaltwin.aas4j.v3.model.ReferenceTypes;
@@ -48,6 +49,7 @@
4849
import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultAssetInformation;
4950
import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultDataSpecificationIec61360;
5051
import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultEmbeddedDataSpecification;
52+
import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultEntity;
5153
import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultEnvironment;
5254
import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultExtension;
5355
import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultKey;
@@ -214,6 +216,32 @@ public void validateMinimalOperationAgainstXsdSchema()
214216
assertTrue(errors.isEmpty());
215217
}
216218

219+
@Test
220+
public void validateOperationEntityWithoutStatementsAgainstXsdSchema()
221+
throws SerializationException, SAXException {
222+
Submodel object =
223+
new DefaultSubmodel.Builder()
224+
.id("testSubmodel")
225+
.idShort("testSubmodel")
226+
.submodelElements(
227+
new DefaultOperation.Builder()
228+
.idShort("operationToTest")
229+
.inputVariables(
230+
new DefaultOperationVariable.Builder()
231+
.value(
232+
new DefaultEntity.Builder()
233+
.idShort("entityInput")
234+
.entityType(EntityType.SELF_MANAGED_ENTITY)
235+
.build())
236+
.build())
237+
.build())
238+
.build();
239+
String xml =
240+
new XmlSerializer().write(new DefaultEnvironment.Builder().submodels(object).build());
241+
Set<String> errors = validateAgainstXsdSchema(xml);
242+
assertTrue(errors.isEmpty());
243+
}
244+
217245
@Test
218246
public void validateOperationWithMetadataAgainstXsdSchema()
219247
throws SerializationException, SAXException {

dataformat-xml/src/test/java/org/eclipse/digitaltwin/aas4j/v3/dataformat/xml/XmlValidationTest.java

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,11 @@
1717

1818
import static org.junit.Assert.assertEquals;
1919
import static org.junit.Assert.assertTrue;
20-
import static org.junit.Assume.assumeFalse;
2120

2221
import java.io.IOException;
2322
import java.nio.file.Files;
2423
import java.nio.file.Path;
2524
import java.nio.file.Paths;
26-
import java.util.List;
2725
import java.util.Set;
2826
import java.util.stream.Stream;
2927
import junitparams.JUnitParamsRunner;
@@ -47,26 +45,6 @@ public class XmlValidationTest {
4745
private static XmlSchemaValidator validator;
4846
private static final String TEST_FILES_DIR = "target/test-classes/examples";
4947

50-
// List of tests that are known to have issues with EmbeddedDataSpecificationsDeserializer ->
51-
// GitHub issue https://github.com/eclipse-aas4j/aas4j/issues/389 and
52-
// https://github.com/eclipse-aas4j/aas4j/issues/390
53-
private static final List<String> IGNORED_TESTS =
54-
List.of(
55-
"annotatedRelationshipElement",
56-
"basicEventElement",
57-
"blob",
58-
"capability",
59-
"entity",
60-
"file",
61-
"multiLanguageProperty",
62-
"operation",
63-
"property",
64-
"range",
65-
"referenceElement",
66-
"relationshipElement",
67-
"submodelElementCollection",
68-
"submodelElementList");
69-
7048
@BeforeClass
7149
public static void prepareValidator() throws SAXException {
7250
validator = new XmlSchemaValidator();
@@ -103,15 +81,6 @@ public void validateInvalidXml(String file) throws IOException {
10381
public void validateExampleXml(String filePath)
10482
throws DeserializationException, SerializationException, IOException {
10583

106-
// Skip tests that are known to have issues with EmbeddedDataSpecificationsDeserializer ->
107-
// GitHub issue https://github.com/eclipse-aas4j/aas4j/issues/389 and
108-
// https://github.com/eclipse-aas4j/aas4j/issues/390
109-
boolean shouldSkip = IGNORED_TESTS.stream().anyMatch(filePath::contains);
110-
111-
assumeFalse(
112-
"Skipping the tests because of EmbeddedDataSpecificationsDeserializer issue:" + filePath,
113-
shouldSkip);
114-
11584
String initialXml = new String(Files.readAllBytes(Paths.get(filePath)));
11685

11786
Environment environment = new XmlDeserializer().read(initialXml);

0 commit comments

Comments
 (0)