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.io.json;
28
29 import gov.nist.secauto.metaschema.core.model.IFieldDefinition;
30 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
31 import gov.nist.secauto.metaschema.databind.model.IAssemblyClassBinding;
32 import gov.nist.secauto.metaschema.databind.model.IBoundFieldValueInstance;
33 import gov.nist.secauto.metaschema.databind.model.IBoundFlagInstance;
34 import gov.nist.secauto.metaschema.databind.model.IBoundNamedInstance;
35 import gov.nist.secauto.metaschema.databind.model.IClassBinding;
36 import gov.nist.secauto.metaschema.databind.model.IFieldClassBinding;
37
38 import java.util.Collection;
39 import java.util.Map;
40 import java.util.function.Function;
41 import java.util.stream.Collectors;
42 import java.util.stream.Stream;
43
44 import edu.umd.cs.findbugs.annotations.NonNull;
45
46 final class MetaschemaInstanceUtils {
47
48 private MetaschemaInstanceUtils() {
49
50 }
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 @NonNull
71 public static Map<String, ? extends IBoundNamedInstance> getInstancesToParse(
72 @NonNull IClassBinding targetDefinition,
73 boolean requiresJsonKey) {
74 Collection<? extends IBoundFlagInstance> flags = targetDefinition.getFlagInstances();
75 int flagCount = flags.size() - (requiresJsonKey ? 1 : 0);
76
77 @SuppressWarnings("resource") Stream<? extends IBoundNamedInstance> instanceStream;
78 if (targetDefinition instanceof IAssemblyClassBinding) {
79 instanceStream = ((IAssemblyClassBinding) targetDefinition).getModelInstances().stream();
80
81
82
83
84 } else if (targetDefinition instanceof IFieldClassBinding) {
85 IFieldClassBinding targetFieldDefinition = (IFieldClassBinding) targetDefinition;
86
87 IBoundFlagInstance jsonValueKeyFlag = targetFieldDefinition.getJsonValueKeyFlagInstance();
88 if (jsonValueKeyFlag == null && flagCount > 0) {
89
90 IBoundFieldValueInstance fieldValue = targetFieldDefinition.getFieldValueInstance();
91 instanceStream = Stream.of(fieldValue);
92 } else {
93
94 instanceStream = Stream.empty();
95 }
96 } else {
97 throw new UnsupportedOperationException(
98 String.format("Unsupported class binding type: %s", targetDefinition.getClass().getName()));
99 }
100
101 if (requiresJsonKey) {
102 IBoundFlagInstance jsonKey = targetDefinition.getJsonKeyFlagInstance();
103 assert jsonKey != null;
104 instanceStream = Stream.concat(
105 flags.stream().filter((flag) -> !jsonKey.equals(flag)),
106 instanceStream);
107 } else {
108 instanceStream = Stream.concat(
109 flags.stream(),
110 instanceStream);
111 }
112 return ObjectUtils.notNull(instanceStream.collect(
113 Collectors.toMap(
114 IBoundNamedInstance::getJsonName,
115 Function.identity())));
116 }
117 }