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;
28
29 import gov.nist.secauto.metaschema.core.model.IModule;
30 import gov.nist.secauto.metaschema.core.util.CollectionUtil;
31 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
32 import gov.nist.secauto.metaschema.databind.model.AbstractBoundModule;
33 import gov.nist.secauto.metaschema.databind.model.DefaultAssemblyClassBinding;
34 import gov.nist.secauto.metaschema.databind.model.DefaultFieldClassBinding;
35 import gov.nist.secauto.metaschema.databind.model.IClassBinding;
36 import gov.nist.secauto.metaschema.databind.model.annotations.MetaschemaAssembly;
37 import gov.nist.secauto.metaschema.databind.model.annotations.MetaschemaField;
38
39 import java.util.HashMap;
40 import java.util.Map;
41
42 import edu.umd.cs.findbugs.annotations.NonNull;
43 import edu.umd.cs.findbugs.annotations.Nullable;
44
45 class AbstractModuleLoaderStrategy implements IModuleLoaderStrategy {
46 @NonNull
47 private final IBindingContext bindingContext;
48 @NonNull
49 private final Map<Class<?>, IModule> modulesByClass = new HashMap<>();
50 @NonNull
51 private final Map<Class<?>, IClassBinding> classBindingsByClass = new HashMap<>();
52
53 protected AbstractModuleLoaderStrategy(@NonNull IBindingContext bindingContext) {
54 this.bindingContext = bindingContext;
55 }
56
57 @NonNull
58 public IBindingContext getBindingContext() {
59 return bindingContext;
60 }
61
62 @Override
63 public IModule getModuleByClass(@NonNull Class<? extends IModule> clazz) {
64 IModule retval;
65 synchronized (this) {
66 retval = modulesByClass.get(clazz);
67 if (retval == null) {
68 retval = AbstractBoundModule.createInstance(clazz, getBindingContext());
69 modulesByClass.put(clazz, retval);
70 }
71 }
72 return ObjectUtils.notNull(retval);
73 }
74
75 @Override
76 public IClassBinding getClassBinding(@NonNull Class<?> clazz) {
77 IClassBinding retval;
78 synchronized (this) {
79 retval = classBindingsByClass.get(clazz);
80 if (retval == null) {
81 retval = newClassBinding(clazz);
82 if (retval != null) {
83 classBindingsByClass.put(clazz, retval);
84 }
85 }
86 }
87 return retval;
88 }
89
90 @Nullable
91 protected IClassBinding newClassBinding(@NonNull Class<?> clazz) {
92 IClassBinding retval = null;
93 if (clazz.isAnnotationPresent(MetaschemaAssembly.class)) {
94 retval = DefaultAssemblyClassBinding.createInstance(clazz, getBindingContext());
95 } else if (clazz.isAnnotationPresent(MetaschemaField.class)) {
96 retval = DefaultFieldClassBinding.createInstance(clazz, getBindingContext());
97 }
98 return retval;
99 }
100
101 @Override
102 public Map<Class<?>, IClassBinding> getClassBindingsByClass() {
103 synchronized (this) {
104 return CollectionUtil.unmodifiableMap(classBindingsByClass);
105 }
106 }
107 }