1
2
3
4
5
6 package gov.nist.secauto.metaschema.databind.model.metaschema.impl;
7
8 import gov.nist.secauto.metaschema.core.model.IAssemblyDefinition;
9 import gov.nist.secauto.metaschema.core.model.IAssemblyInstanceAbsolute;
10 import gov.nist.secauto.metaschema.core.model.IContainerModelAbsolute;
11 import gov.nist.secauto.metaschema.core.model.IContainerModelSupport;
12 import gov.nist.secauto.metaschema.core.model.IFieldDefinition;
13 import gov.nist.secauto.metaschema.core.model.IFieldInstanceAbsolute;
14 import gov.nist.secauto.metaschema.core.model.IModelInstanceAbsolute;
15 import gov.nist.secauto.metaschema.core.model.IModule;
16 import gov.nist.secauto.metaschema.core.model.INamedModelInstanceAbsolute;
17 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
18 import gov.nist.secauto.metaschema.databind.model.IBoundInstanceModelGroupedAssembly;
19 import gov.nist.secauto.metaschema.databind.model.binding.metaschema.AssemblyReference;
20 import gov.nist.secauto.metaschema.databind.model.binding.metaschema.FieldReference;
21
22 import java.util.List;
23 import java.util.Map;
24
25 import javax.xml.namespace.QName;
26
27 import edu.umd.cs.findbugs.annotations.NonNull;
28
29 public abstract class AbstractBindingModelContainerSupport
30 implements IContainerModelSupport<
31 IModelInstanceAbsolute,
32 INamedModelInstanceAbsolute,
33 IFieldInstanceAbsolute,
34 IAssemblyInstanceAbsolute> {
35
36 protected static void addInstance(
37 @NonNull IAssemblyInstanceAbsolute assembly,
38 @NonNull List<IModelInstanceAbsolute> modelInstances,
39 @NonNull Map<QName, INamedModelInstanceAbsolute> namedModelInstances,
40 @NonNull Map<QName, IAssemblyInstanceAbsolute> assemblyInstances) {
41 QName effectiveName = assembly.getXmlQName();
42 modelInstances.add(assembly);
43 namedModelInstances.put(effectiveName, assembly);
44 assemblyInstances.put(effectiveName, assembly);
45 }
46
47 protected static void addInstance(
48 @NonNull IFieldInstanceAbsolute field,
49 @NonNull List<IModelInstanceAbsolute> modelInstances,
50 @NonNull Map<QName, INamedModelInstanceAbsolute> namedModelInstances,
51 @NonNull Map<QName, IFieldInstanceAbsolute> fieldInstances) {
52 QName effectiveName = field.getXmlQName();
53 modelInstances.add(field);
54 namedModelInstances.put(effectiveName, field);
55 fieldInstances.put(effectiveName, field);
56 }
57
58 @NonNull
59 protected static IAssemblyInstanceAbsolute newInstance(
60 @NonNull AssemblyReference obj,
61 @NonNull IBoundInstanceModelGroupedAssembly objInstance,
62 int position,
63 @NonNull IContainerModelAbsolute parent) {
64 IAssemblyDefinition owningDefinition = parent.getOwningDefinition();
65 IModule module = owningDefinition.getContainingModule();
66
67 String name = ObjectUtils.requireNonNull(obj.getRef());
68 IAssemblyDefinition definition = module.getScopedAssemblyDefinitionByName(
69 module.toModelQName(name));
70
71 if (definition == null) {
72 throw new IllegalStateException(
73 String.format("Unable to resolve assembly reference '%s' in definition '%s' in module '%s'",
74 name,
75 owningDefinition.getName(),
76 module.getShortName()));
77 }
78 return new InstanceModelAssemblyReference(obj, objInstance, position, definition, parent);
79 }
80
81 @NonNull
82 protected static IFieldInstanceAbsolute newInstance(
83 @NonNull FieldReference obj,
84 @NonNull IBoundInstanceModelGroupedAssembly objInstance,
85 int position,
86 @NonNull IContainerModelAbsolute parent) {
87 IAssemblyDefinition owningDefinition = parent.getOwningDefinition();
88 IModule module = owningDefinition.getContainingModule();
89
90 String name = ObjectUtils.requireNonNull(obj.getRef());
91 IFieldDefinition definition = module.getScopedFieldDefinitionByName(
92 module.toModelQName(name));
93 if (definition == null) {
94 throw new IllegalStateException(
95 String.format("Unable to resolve field reference '%s' in definition '%s' in module '%s'",
96 name,
97 owningDefinition.getName(),
98 module.getShortName()));
99 }
100 return new InstanceModelFieldReference(obj, objInstance, position, definition, parent);
101 }
102 }