|
22 | 22 | import java.io.InputStream;
|
23 | 23 | import java.nio.charset.StandardCharsets;
|
24 | 24 | import java.util.ArrayList;
|
| 25 | +import java.util.HashMap; |
25 | 26 | import java.util.List;
|
26 | 27 | import java.util.Map;
|
27 | 28 | import java.util.NoSuchElementException;
|
| 29 | +import java.util.Set; |
28 | 30 | import java.util.stream.Collectors;
|
29 | 31 | import java.util.stream.Stream;
|
30 | 32 |
|
@@ -137,6 +139,72 @@ public ModelsMap postProcessModels(ModelsMap objs) {
|
137 | 139 | return modelsMap;
|
138 | 140 | }
|
139 | 141 |
|
| 142 | + @Override |
| 143 | + public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs) { |
| 144 | + super.postProcessAllModels(objs); |
| 145 | + |
| 146 | + Map<String, ModelsMap> additionalModels = new HashMap<>(); |
| 147 | + |
| 148 | + // List of interfaces for which an Unknown class should not be generated for backward compatibility |
| 149 | + List<String> definedInterfaces = List.of( |
| 150 | + "Event", "MessageContent", "Message", "Action", "DemographicFilter", |
| 151 | + "FlexBoxBackground", "FlexComponent", "FlexContainer", "ImagemapAction", |
| 152 | + "Mentionee", "ModuleContent", "Recipient", "RichMenuBatchOperation", |
| 153 | + "Source", "Template", "ThingsContent" |
| 154 | + ); |
| 155 | + |
| 156 | + // Set additional unknown* class for jackson's defaultImpl to have unknwon* class as fallback |
| 157 | + for (ModelsMap modelsAttrs : objs.values()) { |
| 158 | + String packageName = modelsAttrs.containsKey("packageName") |
| 159 | + ? modelsAttrs.get("packageName").toString() |
| 160 | + : null; |
| 161 | + String _package = modelsAttrs.containsKey("package") |
| 162 | + ? modelsAttrs.get("package").toString() |
| 163 | + : packageName; |
| 164 | + |
| 165 | + for (ModelMap mo : modelsAttrs.getModels()) { |
| 166 | + CodegenModel codegenModel = mo.getModel(); |
| 167 | + if (codegenModel.discriminator != null) { |
| 168 | + String baseName = codegenModel.classname; |
| 169 | + |
| 170 | + // skip for excluded interfaces |
| 171 | + if (definedInterfaces.contains(baseName)) { |
| 172 | + continue; |
| 173 | + } |
| 174 | + |
| 175 | + String fallbackModelName = "Unknown" + baseName; |
| 176 | + CodegenModel fallbackModel = new CodegenModel(); |
| 177 | + fallbackModel.name = fallbackModelName; |
| 178 | + fallbackModel.schemaName = fallbackModelName; |
| 179 | + fallbackModel.parent = baseName; |
| 180 | + fallbackModel.interfaces = List.of(baseName); |
| 181 | + fallbackModel.allOf = Set.of(baseName); |
| 182 | + fallbackModel.classname = fallbackModelName; |
| 183 | + fallbackModel.classVarName = camelize(fallbackModelName); |
| 184 | + fallbackModel.dataType = baseName; |
| 185 | + fallbackModel.classFilename = fallbackModelName; |
| 186 | + fallbackModel.imports = Set.of(baseName); |
| 187 | + fallbackModel.setIsAnyType(true); |
| 188 | + addImplements(fallbackModel, baseName); |
| 189 | + ModelMap fallbackModelMap = new ModelMap(); |
| 190 | + fallbackModelMap.setModel(fallbackModel); |
| 191 | + |
| 192 | + ModelsMap fallbackModelsMap = new ModelsMap(); |
| 193 | + fallbackModelsMap.setModels(List.of(fallbackModelMap)); |
| 194 | + fallbackModelsMap.setImports(List.of(Map.of("import", _package + "." + baseName))); |
| 195 | + fallbackModelsMap.put("packageName", packageName); |
| 196 | + fallbackModelsMap.put("package", _package); |
| 197 | + fallbackModelsMap.put("classname", fallbackModelName); |
| 198 | + |
| 199 | + additionalModels.put(fallbackModelName, fallbackModelsMap); |
| 200 | + } |
| 201 | + } |
| 202 | + } |
| 203 | + objs.putAll(additionalModels); |
| 204 | + |
| 205 | + return objs; |
| 206 | + } |
| 207 | + |
140 | 208 | private String readPartialBody(String path) {
|
141 | 209 | // fill src/main/resources/body/*.java to the body of the class.
|
142 | 210 | try (InputStream inputStream = getClass().getClassLoader()
|
|
0 commit comments