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.codegen.typeinfo;
28
29 import com.squareup.javapoet.ClassName;
30 import com.squareup.javapoet.ParameterizedTypeName;
31 import com.squareup.javapoet.TypeName;
32
33 import gov.nist.secauto.metaschema.core.datatype.IDataTypeAdapter;
34 import gov.nist.secauto.metaschema.core.model.IAssemblyInstance;
35 import gov.nist.secauto.metaschema.core.model.IFieldInstance;
36 import gov.nist.secauto.metaschema.core.model.INamedModelInstance;
37 import gov.nist.secauto.metaschema.core.model.JsonGroupAsBehavior;
38 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
39
40 import org.apache.logging.log4j.LogManager;
41 import org.apache.logging.log4j.Logger;
42
43 import java.util.List;
44 import java.util.Map;
45
46 import edu.umd.cs.findbugs.annotations.NonNull;
47
48 class ModelInstanceTypeInfoImpl
49 extends AbstractInstanceTypeInfo<INamedModelInstance, IAssemblyDefinitionTypeInfo>
50 implements IModelInstanceTypeInfo {
51 private static final Logger LOGGER = LogManager.getLogger(ModelInstanceTypeInfoImpl.class);
52
53 public ModelInstanceTypeInfoImpl(@NonNull INamedModelInstance instance,
54 @NonNull IAssemblyDefinitionTypeInfo parentDefinition) {
55 super(instance, parentDefinition);
56 }
57
58 @Override
59 public @NonNull String getBaseName() {
60 INamedModelInstance modelInstance = getInstance();
61 String retval;
62 if (modelInstance.getMaxOccurs() == -1 || modelInstance.getMaxOccurs() > 1) {
63 retval = ObjectUtils.notNull(modelInstance.getGroupAsName());
64 } else {
65 retval = modelInstance.getEffectiveName();
66 }
67 return retval;
68 }
69
70 @Override
71 public String getItemBaseName() {
72 return getInstance().getEffectiveName();
73 }
74
75 @Override
76 public @NonNull TypeName getJavaItemType() {
77 INamedModelInstance instance = getInstance();
78
79 TypeName retval;
80 if (instance instanceof IFieldInstance) {
81 IFieldInstance fieldInstance = (IFieldInstance) instance;
82 if (fieldInstance.getDefinition().isSimple()) {
83 IDataTypeAdapter<?> dataType = fieldInstance.getDefinition().getJavaTypeAdapter();
84
85 retval = ObjectUtils.notNull(ClassName.get(dataType.getJavaClass()));
86 } else {
87 retval = getParentDefinitionTypeInfo().getTypeResolver().getClassName(fieldInstance.getDefinition());
88 }
89 } else if (instance instanceof IAssemblyInstance) {
90 IAssemblyInstance assemblyInstance = (IAssemblyInstance) instance;
91 retval = getParentDefinitionTypeInfo().getTypeResolver().getClassName(assemblyInstance.getDefinition());
92 } else {
93 String msg = String.format("Unknown model instance type: %s", instance.getClass().getCanonicalName());
94 LOGGER.error(msg);
95 throw new IllegalStateException(msg);
96 }
97 return retval;
98 }
99
100 @Override
101 public @NonNull TypeName getJavaFieldType() {
102 TypeName item = getJavaItemType();
103
104 @NonNull TypeName retval;
105 INamedModelInstance instance = getInstance();
106 int maxOccurance = instance.getMaxOccurs();
107 if (maxOccurance == -1 || maxOccurance > 1) {
108 if (JsonGroupAsBehavior.KEYED.equals(instance.getJsonGroupAsBehavior())) {
109 retval = ObjectUtils.notNull(
110 ParameterizedTypeName.get(ClassName.get(Map.class), ClassName.get(String.class), item));
111 } else {
112 retval = ObjectUtils.notNull(ParameterizedTypeName.get(ClassName.get(List.class), item));
113 }
114 } else {
115 retval = item;
116 }
117
118 return retval;
119 }
120 }