UNPKG

18.9 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const ArrayModel_1 = __importDefault(require("./models/ArrayModel"));
7const ModelImpl_1 = __importDefault(require("./models//ModelImpl"));
8const RefModel_1 = __importDefault(require("./models/RefModel"));
9const parameters_1 = require("./models/parameters");
10const properties_1 = require("./models/properties");
11const Json_1 = __importDefault(require("./java/Json"));
12const javaUtil_1 = require("./java/javaUtil");
13const LoggerFactory_1 = __importDefault(require("./java/LoggerFactory"));
14function hasProperties(obj) {
15 if (obj == null) {
16 return false;
17 }
18 return javaUtil_1.isNotEmptySet(obj.getProperties());
19}
20class InlineModelResolver {
21 constructor() {
22 this.addedModels = javaUtil_1.newHashMap();
23 this.generatedSignature = javaUtil_1.newHashMap();
24 this.skipMatches = false;
25 }
26 flatten(swagger) {
27 this.swagger = swagger;
28 if (swagger.getDefinitions() == null) {
29 swagger.setDefinitions(javaUtil_1.newHashMap());
30 }
31 const paths = swagger.getPaths();
32 const models = swagger.getDefinitions();
33 if (paths != null) {
34 for (const path of paths) {
35 const pathname = path.path;
36 for (const operation of path.getOperations()) {
37 const parameters = operation.getParameters();
38 if (javaUtil_1.isNotEmptySet(parameters)) {
39 for (const parameter of parameters) {
40 if (parameter != null && parameter instanceof parameters_1.BodyParameter) {
41 const bp = parameter;
42 if (bp.getSchema() != null) {
43 const model = bp.getSchema();
44 if (model != null && model instanceof ModelImpl_1.default) {
45 const obj = model;
46 if (obj.getType() == null || 'object' === obj.getType()) {
47 if (javaUtil_1.isNotEmptySet(obj.getProperties())) {
48 this.flattenProperties(obj.getProperties(), pathname);
49 const modelName = this.resolveModelName(obj.getTitle(), bp.getName());
50 bp.setSchema(new RefModel_1.default(modelName));
51 this.addGenerated(modelName, model);
52 swagger.addDefinition(modelName, model);
53 }
54 }
55 }
56 else if (model != null && model instanceof ArrayModel_1.default) {
57 const am = model;
58 const inner = am.getItems();
59 if (inner != null && inner instanceof properties_1.ObjectProperty) {
60 const op = inner;
61 if (javaUtil_1.isNotEmptySet(op.getProperties())) {
62 this.flattenProperties(op.getProperties(), pathname);
63 const modelName = this.resolveModelName(op.getTitle(), bp.getName());
64 const innerModel = this.modelFromProperty(op, modelName);
65 const existing = this.matchGenerated(innerModel);
66 if (existing != null) {
67 am.setItems(new properties_1.RefProperty(existing));
68 }
69 else {
70 am.setItems(new properties_1.RefProperty(modelName));
71 this.addGenerated(modelName, innerModel);
72 swagger.addDefinition(modelName, innerModel);
73 }
74 }
75 }
76 }
77 }
78 }
79 else if (parameter instanceof parameters_1.RefParameter) {
80 console.log('what the propertye?', parameter, operation);
81 }
82 }
83 }
84 const responses = operation.getResponses();
85 if (javaUtil_1.isNotEmptySet(responses)) {
86 for (const [key, response] of responses) {
87 const property = response.getSchema();
88 if (property == null) {
89 continue;
90 }
91 if (property instanceof properties_1.ObjectProperty) {
92 const op = property;
93 if (hasProperties(op)) {
94 const modelName = this.resolveModelName(op.getTitle(), 'inline_response_' + key);
95 const model = this.modelFromProperty(op, modelName);
96 const existing = this.matchGenerated(model);
97 if (existing != null) {
98 response.setSchema(new properties_1.RefProperty(existing));
99 }
100 else {
101 response.setSchema(new properties_1.RefProperty(modelName));
102 this.addGenerated(modelName, model);
103 swagger.addDefinition(modelName, model);
104 }
105 }
106 }
107 else if (property instanceof properties_1.ArrayProperty) {
108 const ap = property;
109 const inner = ap.getItems();
110 if (inner != null && inner instanceof properties_1.ObjectProperty) {
111 const op = inner;
112 if (hasProperties(op)) {
113 this.flattenProperties(op.getProperties(), pathname);
114 const modelName = this.resolveModelName(op.getTitle(), 'inline_response_' + key);
115 const innerModel = this.modelFromProperty(op, modelName);
116 const existing = this.matchGenerated(innerModel);
117 if (existing != null) {
118 ap.setItems(new properties_1.RefProperty(existing));
119 }
120 else {
121 ap.setItems(new properties_1.RefProperty(modelName));
122 this.addGenerated(modelName, innerModel);
123 swagger.addDefinition(modelName, innerModel);
124 }
125 }
126 }
127 }
128 else if (property instanceof properties_1.MapProperty) {
129 const mp = property;
130 const innerProperty = mp.getAdditionalProperties();
131 if (innerProperty != null &&
132 innerProperty instanceof properties_1.ObjectProperty) {
133 const op = innerProperty;
134 if (hasProperties(op)) {
135 this.flattenProperties(op.getProperties(), pathname);
136 const modelName = this.resolveModelName(op.getTitle(), 'inline_response_' + key);
137 const innerModel = this.modelFromProperty(op, modelName);
138 const existing = this.matchGenerated(innerModel);
139 if (existing != null) {
140 mp.setAdditionalProperties(new properties_1.RefProperty(existing));
141 }
142 else {
143 mp.setAdditionalProperties(new properties_1.RefProperty(modelName));
144 this.addGenerated(modelName, innerModel);
145 swagger.addDefinition(modelName, innerModel);
146 }
147 }
148 }
149 }
150 }
151 }
152 }
153 }
154 }
155 if (models != null) {
156 for (const [modelName, model] of models) {
157 if (model == null) {
158 continue;
159 }
160 if (model instanceof ModelImpl_1.default) {
161 this.flattenProperties(model.getProperties(), modelName);
162 }
163 else if (model instanceof ArrayModel_1.default) {
164 const m = model;
165 const inner = m.getItems();
166 if (inner != null && inner instanceof properties_1.ObjectProperty) {
167 const op = inner;
168 if (javaUtil_1.isNotEmptySet(op.getProperties())) {
169 const innerModelName = this.uniqueName(modelName + '_inner');
170 const innerModel = this.modelFromProperty(op, innerModelName);
171 const existing = this.matchGenerated(innerModel);
172 if (existing == null) {
173 swagger.addDefinition(innerModelName, innerModel);
174 this.addGenerated(innerModelName, innerModel);
175 m.setItems(new properties_1.RefProperty(innerModelName));
176 }
177 else {
178 m.setItems(new properties_1.RefProperty(existing));
179 }
180 }
181 }
182 }
183 }
184 }
185 }
186 resolveModelName(title, key) {
187 if (title == null) {
188 return this.uniqueName(key);
189 }
190 else {
191 return this.uniqueName(title);
192 }
193 }
194 matchGenerated(model) {
195 if (this.skipMatches) {
196 return null;
197 }
198 const json = Json_1.default.pretty(model);
199 if (this.generatedSignature.containsKey(json)) {
200 return this.generatedSignature.get(json);
201 }
202 return null;
203 }
204 addGenerated(name, model) {
205 this.generatedSignature.put(Json_1.default.pretty(model), name);
206 }
207 uniqueName(key) {
208 let count = 0;
209 key = key.replace(new RegExp('[^a-z_\\.A-Z0-9 ]', 'g'), '');
210 while (true) {
211 let name = key;
212 if (count > 0) {
213 name = key + '_' + count;
214 }
215 if (this.swagger.getDefinitions() == null) {
216 return name;
217 }
218 else if (!this.swagger.getDefinitions().containsKey(name)) {
219 return name;
220 }
221 count += 1;
222 }
223 return key;
224 }
225 flattenProperties(properties, path) {
226 if (properties == null) {
227 return;
228 }
229 const propsToUpdate = javaUtil_1.newHashMap();
230 const modelsToAdd = javaUtil_1.newHashMap();
231 for (const [key, property] of properties) {
232 if (property instanceof properties_1.ObjectProperty && hasProperties(property)) {
233 const modelName = this.uniqueName(path + '_' + key);
234 const model = this.modelFromProperty(property, modelName);
235 const existing = this.matchGenerated(model);
236 if (existing != null) {
237 propsToUpdate.put(key, new properties_1.RefProperty(existing));
238 }
239 else {
240 propsToUpdate.put(key, new properties_1.RefProperty(modelName));
241 modelsToAdd.put(modelName, model);
242 this.addGenerated(modelName, model);
243 this.swagger.addDefinition(modelName, model);
244 }
245 }
246 else if (property instanceof properties_1.ArrayProperty) {
247 const ap = property;
248 const inner = ap.getItems();
249 if (inner instanceof properties_1.ObjectProperty) {
250 const op = inner;
251 if (hasProperties(op)) {
252 this.flattenProperties(op.getProperties(), path);
253 const modelName = this.uniqueName(path + '_' + key);
254 const innerModel = this.modelFromProperty(op, modelName);
255 const existing = this.matchGenerated(innerModel);
256 if (existing != null) {
257 ap.setItems(new properties_1.RefProperty(existing));
258 }
259 else {
260 ap.setItems(new properties_1.RefProperty(modelName));
261 this.addGenerated(modelName, innerModel);
262 this.swagger.addDefinition(modelName, innerModel);
263 }
264 }
265 }
266 }
267 else if (property instanceof properties_1.MapProperty) {
268 const mp = property;
269 const inner = mp.getAdditionalProperties();
270 if (inner != null && inner instanceof properties_1.ObjectProperty) {
271 const op = inner;
272 if (hasProperties(op)) {
273 this.flattenProperties(op.getProperties(), path);
274 const modelName = this.uniqueName(path + '_' + key);
275 const innerModel = this.modelFromProperty(op, modelName);
276 const existing = this.matchGenerated(innerModel);
277 if (existing != null) {
278 mp.setAdditionalProperties(new properties_1.RefProperty(existing));
279 }
280 else {
281 mp.setAdditionalProperties(new properties_1.RefProperty(modelName));
282 this.addGenerated(modelName, innerModel);
283 this.swagger.addDefinition(modelName, innerModel);
284 }
285 }
286 }
287 }
288 }
289 if (javaUtil_1.isNotEmptySet(propsToUpdate)) {
290 properties.putAll(propsToUpdate);
291 }
292 for (const [key, definition] of modelsToAdd) {
293 this.swagger.addDefinition(key, definition);
294 this.addedModels.put(key, definition);
295 }
296 }
297 modelFromProperty(object, path) {
298 if (((object != null && object instanceof properties_1.ArrayProperty) ||
299 object === null) &&
300 (typeof path === 'string' || path === null)) {
301 const description = object.getDescription();
302 let example = null;
303 const obj = object.getExample();
304 if (obj != null) {
305 example = obj.toString();
306 }
307 const inner = object.getItems();
308 if (inner != null && inner instanceof properties_1.ObjectProperty) {
309 const model = new ArrayModel_1.default();
310 model.setDescription(description);
311 model.setExample(example);
312 model.setItems(object.getItems());
313 return model;
314 }
315 return null;
316 }
317 else if (((object != null && object instanceof properties_1.ObjectProperty) ||
318 object === null) &&
319 (typeof path === 'string' || path === null)) {
320 return this.modelFromProperty$io_swagger_models_properties_ObjectProperty$java_lang_String(object, path);
321 }
322 else if (((object != null && object instanceof properties_1.MapProperty) || object === null) &&
323 (typeof path === 'string' || path === null)) {
324 return this.modelFromProperty$io_swagger_models_properties_MapProperty$java_lang_String(object, path);
325 }
326 else {
327 throw new Error('invalid overload');
328 }
329 }
330 modelFromProperty$io_swagger_models_properties_ObjectProperty$java_lang_String(object, path) {
331 const description = object.getDescription();
332 let example = null;
333 const obj = object.getExample();
334 if (obj != null) {
335 example = obj.toString();
336 }
337 const name = object.getName();
338 const xml = object.getXml();
339 const properties = object.getProperties();
340 const model = new ModelImpl_1.default();
341 model.setDescription(description);
342 model.setExample(example);
343 model.setName(name);
344 model.setXml(xml);
345 if (properties != null) {
346 this.flattenProperties(properties, path);
347 model.setProperties(properties);
348 }
349 return model;
350 }
351 modelFromProperty$io_swagger_models_properties_MapProperty$java_lang_String(object, path) {
352 const description = object.getDescription();
353 let example = null;
354 const obj = object.getExample();
355 if (obj != null) {
356 example = obj.toString();
357 }
358 const model = new ArrayModel_1.default();
359 model.setDescription(description);
360 model.setExample(example);
361 model.setItems(object.getAdditionalProperties());
362 return model;
363 }
364 isSkipMatches() {
365 return this.skipMatches;
366 }
367 setSkipMatches(skipMatches) {
368 this.skipMatches = skipMatches;
369 }
370}
371exports.default = InlineModelResolver;
372const Log = LoggerFactory_1.default.getLogger(InlineModelResolver);
373//# sourceMappingURL=InlineModelResolver.js.map
\No newline at end of file