Skip to content
This repository was archived by the owner on Feb 15, 2024. It is now read-only.

Commit cf64dcd

Browse files
committed
Fix AASSimple in XML-Dataformat
- unifies XML-AASSimple with JSON - XML-Mapper uses NON_NULL by default instead of NON_EMPTY - AnnotationIntrospector for XML-Mapper adds NON_EMPTY to collections
1 parent 8e5ba45 commit cf64dcd

7 files changed

Lines changed: 273 additions & 157 deletions

File tree

dataformat-xml/src/main/java/io/adminshell/aas/v3/dataformat/xml/XmlDataformatAnnotationIntrospector.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,28 @@
1515
*/
1616
package io.adminshell.aas.v3.dataformat.xml;
1717

18+
import java.util.Collection;
19+
20+
import com.fasterxml.jackson.annotation.JsonInclude;
1821
import com.fasterxml.jackson.databind.introspect.Annotated;
1922
import com.fasterxml.jackson.databind.introspect.AnnotatedClass;
23+
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
2024
import com.fasterxml.jackson.dataformat.xml.JacksonXmlAnnotationIntrospector;
2125

26+
import io.adminshell.aas.v3.dataformat.core.ReflectionHelper;
27+
2228
/**
2329
* This class helps to dynamically decide how to de-/serialize classes and
2430
* properties defined in the AAS model library. It will automatically add a default namespace
2531
* to property names and set a default property order for contained elements.
32+
*
33+
* Will also add @JsonInclude(JsonInclude.Include.NON_EMPTY) to all getter methods returning any type of
34+
* Collection<?> defined in the AAS model
2635
*/
2736
public class XmlDataformatAnnotationIntrospector extends JacksonXmlAnnotationIntrospector {
2837
private static final long serialVersionUID = 1L;
2938

39+
private static final String GETTER_PREFIX = "get";
3040
protected String myDefaultNamespace = "";
3141

3242
public XmlDataformatAnnotationIntrospector() {
@@ -57,4 +67,22 @@ public String[] findSerializationPropertyOrder(AnnotatedClass ac) {
5767
}
5868
return order;
5969
}
60-
}
70+
71+
@Override
72+
public JsonInclude.Value findPropertyInclusion(Annotated a) {
73+
JsonInclude.Value result = super.findPropertyInclusion(a);
74+
if (result != JsonInclude.Value.empty()) {
75+
return result;
76+
}
77+
if (AnnotatedMethod.class.isAssignableFrom(a.getClass())) {
78+
AnnotatedMethod method = (AnnotatedMethod) a;
79+
if (method.getParameterCount() == 0
80+
&& method.getName().startsWith(GETTER_PREFIX)
81+
&& Collection.class.isAssignableFrom(method.getRawReturnType())
82+
&& ReflectionHelper.isModelInterfaceOrDefaultImplementation(method.getDeclaringClass())) {
83+
return result.withValueInclusion(JsonInclude.Include.NON_EMPTY);
84+
}
85+
}
86+
return result;
87+
}
88+
}

dataformat-xml/src/main/java/io/adminshell/aas/v3/dataformat/xml/XmlSerializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ protected void buildMapper() {
5858
mapper = XmlMapper.builder()
5959
.enable(SerializationFeature.INDENT_OUTPUT)
6060
.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
61-
.serializationInclusion(JsonInclude.Include.NON_EMPTY)
61+
.serializationInclusion(JsonInclude.Include.NON_NULL)
6262
.annotationIntrospector(new XmlDataformatAnnotationIntrospector())
6363
.defaultUseWrapper(false)
6464
.addModule(buildEnumModule())

dataformat-xml/src/main/java/io/adminshell/aas/v3/dataformat/xml/serialization/LangStringsSerializer.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,4 @@
1818
import io.adminshell.aas.v3.model.LangString;
1919

2020
public class LangStringsSerializer extends NoEntryWrapperListSerializer<LangString> {
21-
public LangStringsSerializer() {
22-
super();
23-
this.setObjectForMinCardinality(new LangString());
24-
}
2521
}

dataformat-xml/src/main/java/io/adminshell/aas/v3/dataformat/xml/serialization/NoEntryWrapperListSerializer.java

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
* @param <T> serialized class within the list
3030
*/
3131
public class NoEntryWrapperListSerializer<T extends Object> extends JsonSerializer<List<T>> {
32-
protected T placeholderEntry;
3332
private String outerWrapperName;
3433

3534
/**
@@ -41,19 +40,9 @@ public void setOuterWrapper(String outerWrapper) {
4140
this.outerWrapperName = outerWrapper;
4241
}
4342

44-
/**
45-
* Sets an empty object that is used for serialized lists with minimum cardinality of 1
46-
*
47-
* @param emptyOject The placeholder in case the list is empty, but needs to have a size of 1.
48-
*/
49-
public void setObjectForMinCardinality(T emptyOject) {
50-
this.placeholderEntry = emptyOject;
51-
}
52-
5343
@Override
5444
public void serialize(List<T> list, JsonGenerator gen, SerializerProvider serializers)
55-
throws IOException {
56-
addOptionalPlaceholder(list);
45+
throws IOException {
5746
writeList(list, (ToXmlGenerator) gen);
5847
}
5948

@@ -85,14 +74,8 @@ private void writeOuterWrapperEnd(ToXmlGenerator xgen) throws IOException {
8574
}
8675
}
8776

88-
private void addOptionalPlaceholder(List<T> list) {
89-
if (list.isEmpty() && placeholderEntry != null) {
90-
list.add(placeholderEntry);
91-
}
92-
}
93-
9477
@Override
9578
public boolean isEmpty(SerializerProvider provider, List<T> value) {
9679
return value == null || value.isEmpty();
9780
}
98-
}
81+
}

0 commit comments

Comments
 (0)