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 package gov.nist.secauto.metaschema.databind.model.info;
28
29 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
30 import gov.nist.secauto.metaschema.databind.io.BindingException;
31 import gov.nist.secauto.metaschema.databind.io.json.IJsonParsingContext;
32 import gov.nist.secauto.metaschema.databind.io.json.IJsonWritingContext;
33 import gov.nist.secauto.metaschema.databind.io.xml.IXmlParsingContext;
34 import gov.nist.secauto.metaschema.databind.io.xml.IXmlWritingContext;
35 import gov.nist.secauto.metaschema.databind.model.IBoundNamedModelInstance;
36
37 import java.io.IOException;
38 import java.util.List;
39
40 import javax.xml.namespace.QName;
41 import javax.xml.stream.XMLStreamException;
42 import javax.xml.stream.events.StartElement;
43
44 import edu.umd.cs.findbugs.annotations.NonNull;
45
46 class SingletonPropertyInfo
47 extends AbstractModelPropertyInfo {
48
49 public SingletonPropertyInfo(
50 @NonNull IBoundNamedModelInstance property) {
51 super(property);
52 }
53
54 @SuppressWarnings("null")
55 @Override
56 public List<?> getItemsFromValue(Object value) {
57 return value == null ? List.of() : List.of(value);
58 }
59
60 @Override
61 public int getItemCount(Object value) {
62 return value == null ? 0 : 1;
63 }
64
65 @Override
66 public void readValues(IPropertyCollector collector, Object parentInstance, IJsonParsingContext context)
67 throws IOException {
68
69
70
71
72
73
74
75
76
77
78
79 Object value = getProperty().getDataTypeHandler().readItem(parentInstance, context);
80 collector.add(value);
81
82
83
84
85
86 }
87
88 @Override
89 public boolean readValues(IPropertyCollector collector, Object parentInstance, StartElement start,
90 IXmlParsingContext context) throws IOException, XMLStreamException {
91 boolean handled = true;
92 Object value = context.readModelInstanceValue(getProperty(), parentInstance, start);
93 if (value != null) {
94 collector.add(value);
95 handled = true;
96 }
97 return handled;
98 }
99
100 @Override
101 public Class<?> getItemType() {
102 return (Class<?>) getProperty().getType();
103 }
104
105 @Override
106 public IPropertyCollector newPropertyCollector() {
107 return new SingletonPropertyCollector();
108 }
109
110 @Override
111 public void writeValues(@NonNull Object value, QName parentName, IXmlWritingContext context)
112 throws XMLStreamException, IOException {
113 context.writeInstanceValue(getProperty(), value, parentName);
114 }
115
116 @Override
117 public void writeValues(Object parentObject, IJsonWritingContext context) throws IOException {
118 IBoundNamedModelInstance property = getProperty();
119 getProperty().getDataTypeHandler().writeItem(
120 ObjectUtils.notNull(property.getValue(parentObject)),
121 context);
122 }
123
124 @Override
125 public boolean isValueSet(Object parentInstance) throws IOException {
126 return getProperty().getValue(parentInstance) != null;
127 }
128
129 @Override
130 public void copy(@NonNull Object fromInstance, @NonNull Object toInstance, @NonNull IPropertyCollector collector)
131 throws BindingException {
132 IBoundNamedModelInstance property = getProperty();
133
134 Object value = property.getValue(fromInstance);
135
136 Object copiedValue = property.copyItem(ObjectUtils.requireNonNull(value), toInstance);
137
138 collector.add(copiedValue);
139 }
140
141 }