1
2
3
4
5
6 package dev.metaschema.core.testsupport.builder;
7
8 import static org.mockito.ArgumentMatchers.eq;
9 import static org.mockito.Mockito.doReturn;
10
11 import java.util.Map;
12 import java.util.function.Function;
13 import java.util.stream.Collectors;
14
15 import dev.metaschema.core.datatype.IDataTypeAdapter;
16 import dev.metaschema.core.datatype.adapter.MetaschemaDataTypeProvider;
17 import dev.metaschema.core.model.IAssemblyDefinition;
18 import dev.metaschema.core.model.IFieldDefinition;
19 import dev.metaschema.core.model.IFieldInstanceAbsolute;
20 import dev.metaschema.core.model.IFlagInstance;
21 import dev.metaschema.core.model.IModule;
22 import dev.metaschema.core.model.INamedModelElement;
23 import dev.metaschema.core.model.ModelType;
24 import dev.metaschema.core.model.constraint.ValueConstraintSet;
25 import dev.metaschema.core.qname.IEnhancedQName;
26 import dev.metaschema.core.util.ObjectUtils;
27 import edu.umd.cs.findbugs.annotations.NonNull;
28 import edu.umd.cs.findbugs.annotations.Nullable;
29
30 final class FieldBuilder
31 extends AbstractModelBuilder<IFieldBuilder>
32 implements IFieldBuilder {
33
34 private IDataTypeAdapter<?> dataTypeAdapter;
35 private Object defaultValue = null;
36
37 FieldBuilder() {
38
39 }
40
41 @Override
42 public FieldBuilder reset() {
43 this.dataTypeAdapter = MetaschemaDataTypeProvider.DEFAULT_DATA_TYPE;
44 this.defaultValue = null;
45 return this;
46 }
47
48 @Override
49 public FieldBuilder dataTypeAdapter(@NonNull IDataTypeAdapter<?> dataTypeAdapter) {
50 this.dataTypeAdapter = dataTypeAdapter;
51 return this;
52 }
53
54 @Override
55 public FieldBuilder defaultValue(@NonNull Object defaultValue) {
56 this.defaultValue = defaultValue;
57 return this;
58 }
59
60 @Override
61 @NonNull
62 public IFieldInstanceAbsolute toInstance(
63 @NonNull IAssemblyDefinition parent) {
64 IFieldDefinition def = toDefinition();
65 return toInstance(parent, def);
66 }
67
68 @Override
69 @NonNull
70 public IFieldInstanceAbsolute toInstance(
71 @NonNull IAssemblyDefinition parent,
72 @NonNull IFieldDefinition definition) {
73 validate();
74
75 IFieldInstanceAbsolute retval = mock(IFieldInstanceAbsolute.class);
76 applyNamedInstance(retval, definition, parent);
77 return retval;
78 }
79
80 @Override
81 @NonNull
82 public IFieldDefinition toDefinition() {
83 return toDefinition(null);
84 }
85
86 @Override
87 @NonNull
88 public IFieldDefinition toDefinition(@Nullable IModule module) {
89 validate();
90
91 IFieldDefinition retval = mock(IFieldDefinition.class);
92 applyDefinition(retval, module);
93
94 Map<IEnhancedQName, IFlagInstance> flags = getFlags().stream()
95 .map(builder -> builder.toInstance(retval))
96 .collect(Collectors.toUnmodifiableMap(
97 IFlagInstance::getQName,
98 Function.identity()));
99
100 doReturn(new ValueConstraintSet(ObjectUtils.notNull(getSource()))).when(retval).getConstraintSupport();
101 doReturn(dataTypeAdapter).when(retval).getJavaTypeAdapter();
102 doReturn(defaultValue).when(retval).getDefaultValue();
103
104 doReturn(flags.values()).when(retval).getFlagInstances();
105 flags.entrySet().forEach(entry -> {
106 assert entry != null;
107 doReturn(entry.getValue()).when(retval).getFlagInstanceByName(eq(entry.getKey().getIndexPosition()));
108 });
109
110 return retval;
111 }
112
113 @Override
114 protected void applyNamed(INamedModelElement element) {
115 super.applyNamed(element);
116 doReturn(ModelType.FIELD).when(element).getModelType();
117 }
118 }