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;
28
29 import gov.nist.secauto.metaschema.core.datatype.IDataTypeAdapter;
30 import gov.nist.secauto.metaschema.core.datatype.markup.MarkupLine;
31 import gov.nist.secauto.metaschema.core.datatype.markup.MarkupMultiline;
32 import gov.nist.secauto.metaschema.core.model.ModelType;
33 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
34 import gov.nist.secauto.metaschema.databind.model.annotations.MetaschemaFieldValue;
35
36 import java.lang.reflect.Field;
37
38 import edu.umd.cs.findbugs.annotations.NonNull;
39 import edu.umd.cs.findbugs.annotations.Nullable;
40
41 class DefaultFieldValueProperty
42 extends AbstractProperty<IFieldClassBinding>
43 implements IBoundFieldValueInstance {
44 @NonNull
45 private final Field field;
46 @NonNull
47 private final MetaschemaFieldValue fieldValue;
48 @NonNull
49 private final IDataTypeAdapter<?> javaTypeAdapter;
50 @Nullable
51 private final Object defaultValue;
52
53 @SuppressWarnings("PMD.ConstructorCallsOverridableMethod")
54 public DefaultFieldValueProperty(
55 @NonNull IFieldClassBinding fieldClassBinding,
56 @NonNull Field field) {
57 super(fieldClassBinding);
58 this.field = ObjectUtils.requireNonNull(field, "field");
59 MetaschemaFieldValue valueAnnotation = field.getAnnotation(MetaschemaFieldValue.class);
60 if (valueAnnotation == null) {
61 throw new IllegalArgumentException(
62 String.format("Class '%s' is missing the '%s' annotation.",
63 fieldClassBinding.getBoundClass().getName(),
64 MetaschemaFieldValue.class.getName()));
65 }
66 this.fieldValue = valueAnnotation;
67
68 Class<? extends IDataTypeAdapter<?>> adapterClass = ObjectUtils.notNull(fieldValue.typeAdapter());
69 this.javaTypeAdapter = ModelUtil.getDataTypeAdapter(adapterClass, fieldClassBinding.getBindingContext());
70 this.defaultValue = ModelUtil.resolveDefaultValue(getFieldValueAnnotation().defaultValue(), this.javaTypeAdapter);
71 }
72
73 @Override
74 public Field getField() {
75 return field;
76 }
77
78 @Override
79 public Object getDefaultValue() {
80 return defaultValue;
81 }
82
83 @NonNull
84 private MetaschemaFieldValue getFieldValueAnnotation() {
85 return fieldValue;
86 }
87
88 @Override
89 public IFieldClassBinding getDefinition() {
90 return getParentClassBinding();
91 }
92
93 @Override
94 public String getJsonValueKeyName() {
95 String name = ModelUtil.resolveToString(getFieldValueAnnotation().valueKeyName());
96 if (name == null) {
97 name = getJavaTypeAdapter().getDefaultJsonValueKey();
98 }
99 return name;
100 }
101
102 @Override
103 public IDataTypeAdapter<?> getJavaTypeAdapter() {
104 return javaTypeAdapter;
105 }
106
107 @Override
108 public String getFormalName() {
109
110 return null;
111 }
112
113 @Override
114 public MarkupLine getDescription() {
115
116 return null;
117 }
118
119 @Override
120 public MarkupMultiline getRemarks() {
121
122 return null;
123 }
124
125 @Override
126 public String getName() {
127 return getJsonValueKeyName();
128 }
129
130 @Override
131 public String getUseName() {
132
133 return null;
134 }
135
136 @Override
137 public @NonNull ModelType getModelType() {
138
139 return ModelType.FIELD;
140 }
141
142 @Override
143 public void copyBoundObject(Object fromInstance, Object toInstance) {
144 Object value = getValue(fromInstance);
145 IDataTypeAdapter<?> adapter = getJavaTypeAdapter();
146 setValue(toInstance, value == null ? null : adapter.copy(value));
147 }
148
149 @Override
150 public Object defaultValue() {
151 return getDefaultValue();
152 }
153 }