1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
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      // prevent direct instantiation
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 }