View Javadoc
1   /*
2    * Portions of this software was developed by employees of the National Institute
3    * of Standards and Technology (NIST), an agency of the Federal Government and is
4    * being made available as a public service. Pursuant to title 17 United States
5    * Code Section 105, works of NIST employees are not subject to copyright
6    * protection in the United States. This software may be subject to foreign
7    * copyright. Permission in the United States and in foreign countries, to the
8    * extent that NIST may hold copyright, to use, copy, modify, create derivative
9    * works, and distribute this software and its documentation without fee is hereby
10   * granted on a non-exclusive basis, provided that this notice and disclaimer
11   * of warranty appears in all copies.
12   *
13   * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER
14   * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY
15   * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF
16   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM
17   * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE
18   * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE.  IN NO EVENT
19   * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT,
20   * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM,
21   * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY,
22   * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR
23   * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT
24   * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER.
25   */
26  
27  package gov.nist.secauto.metaschema.core.testing;
28  
29  import gov.nist.secauto.metaschema.core.datatype.IDataTypeAdapter;
30  import gov.nist.secauto.metaschema.core.datatype.adapter.MetaschemaDataTypeProvider;
31  import gov.nist.secauto.metaschema.core.model.IAssemblyDefinition;
32  import gov.nist.secauto.metaschema.core.model.IFieldDefinition;
33  import gov.nist.secauto.metaschema.core.model.IFieldInstance;
34  import gov.nist.secauto.metaschema.core.model.IFlagInstance;
35  import gov.nist.secauto.metaschema.core.util.CollectionUtil;
36  
37  import org.jmock.Expectations;
38  import org.jmock.Mockery;
39  
40  import java.util.List;
41  import java.util.Map;
42  import java.util.function.Function;
43  import java.util.stream.Collectors;
44  
45  import edu.umd.cs.findbugs.annotations.NonNull;
46  import edu.umd.cs.findbugs.annotations.Nullable;
47  
48  public class FieldBuilder
49      extends AbstractModelBuilder<FieldBuilder>
50      implements IModelInstanceBuilder {
51  
52    private IDataTypeAdapter<?> dataTypeAdapter;
53    private Object defaultValue = null;
54    private List<FlagBuilder> flags;
55  
56    private FieldBuilder(@NonNull Mockery ctx) {
57      super(ctx);
58    }
59  
60    @NonNull
61    public static FieldBuilder builder(@NonNull Mockery ctx) {
62      return new FieldBuilder(ctx).reset();
63    }
64  
65    @Override
66    public FieldBuilder reset() {
67      this.dataTypeAdapter = MetaschemaDataTypeProvider.DEFAULT_DATA_TYPE;
68      this.defaultValue = null;
69      this.flags = CollectionUtil.emptyList();
70      return this;
71    }
72  
73    public FieldBuilder dataTypeAdapter(@NonNull IDataTypeAdapter<?> dataTypeAdapter) {
74      this.dataTypeAdapter = dataTypeAdapter;
75      return this;
76    }
77  
78    public FieldBuilder defaultValue(@NonNull Object defaultValue) {
79      this.defaultValue = defaultValue;
80      return this;
81    }
82  
83    public FieldBuilder flags(@Nullable List<FlagBuilder> flags) {
84      this.flags = flags == null ? CollectionUtil.emptyList() : flags;
85      return this;
86    }
87  
88    @Override
89    @NonNull
90    public IFieldInstance toInstance(
91        @NonNull IAssemblyDefinition parent) {
92      IFieldDefinition def = toDefinition();
93      return toInstance(parent, def);
94    }
95  
96    @NonNull
97    public IFieldInstance toInstance(
98        @NonNull IAssemblyDefinition parent,
99        @NonNull IFieldDefinition definition) {
100     validate();
101 
102     IFieldInstance retval = mock(IFieldInstance.class);
103     applyNamedInstance(retval, definition, parent);
104     return retval;
105   }
106 
107   @SuppressWarnings("null")
108   @NonNull
109   public IFieldDefinition toDefinition() {
110     validate();
111 
112     IFieldDefinition retval = mock(IFieldDefinition.class);
113     applyDefinition(retval);
114 
115     Map<String, IFlagInstance> flags = this.flags.stream()
116         .map(builder -> builder.toInstance(retval))
117         .collect(Collectors.toUnmodifiableMap(
118             IFlagInstance::getEffectiveName,
119             Function.identity()));
120 
121     getContext().checking(new Expectations() {
122       {
123         allowing(retval).getJavaTypeAdapter();
124         will(returnValue(dataTypeAdapter));
125         allowing(retval).getDefaultValue();
126         will(returnValue(defaultValue));
127         allowing(retval).getFlagInstances();
128         will(returnValue(flags.values()));
129         flags.forEach((key, value) -> {
130           allowing(retval).getFlagInstanceByName(with(key));
131           will(returnValue(value));
132         });
133       }
134     });
135 
136     return retval;
137   }
138 }