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