ern-api-gen
Version:
Electrode Native API generator
373 lines • 18.9 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const ArrayModel_1 = __importDefault(require("./models/ArrayModel"));
const ModelImpl_1 = __importDefault(require("./models//ModelImpl"));
const RefModel_1 = __importDefault(require("./models/RefModel"));
const parameters_1 = require("./models/parameters");
const properties_1 = require("./models/properties");
const Json_1 = __importDefault(require("./java/Json"));
const javaUtil_1 = require("./java/javaUtil");
const LoggerFactory_1 = __importDefault(require("./java/LoggerFactory"));
function hasProperties(obj) {
if (obj == null) {
return false;
}
return javaUtil_1.isNotEmptySet(obj.getProperties());
}
class InlineModelResolver {
constructor() {
this.addedModels = javaUtil_1.newHashMap();
this.generatedSignature = javaUtil_1.newHashMap();
this.skipMatches = false;
}
flatten(swagger) {
this.swagger = swagger;
if (swagger.getDefinitions() == null) {
swagger.setDefinitions(javaUtil_1.newHashMap());
}
const paths = swagger.getPaths();
const models = swagger.getDefinitions();
if (paths != null) {
for (const path of paths) {
const pathname = path.path;
for (const operation of path.getOperations()) {
const parameters = operation.getParameters();
if (javaUtil_1.isNotEmptySet(parameters)) {
for (const parameter of parameters) {
if (parameter != null && parameter instanceof parameters_1.BodyParameter) {
const bp = parameter;
if (bp.getSchema() != null) {
const model = bp.getSchema();
if (model != null && model instanceof ModelImpl_1.default) {
const obj = model;
if (obj.getType() == null || 'object' === obj.getType()) {
if (javaUtil_1.isNotEmptySet(obj.getProperties())) {
this.flattenProperties(obj.getProperties(), pathname);
const modelName = this.resolveModelName(obj.getTitle(), bp.getName());
bp.setSchema(new RefModel_1.default(modelName));
this.addGenerated(modelName, model);
swagger.addDefinition(modelName, model);
}
}
}
else if (model != null && model instanceof ArrayModel_1.default) {
const am = model;
const inner = am.getItems();
if (inner != null && inner instanceof properties_1.ObjectProperty) {
const op = inner;
if (javaUtil_1.isNotEmptySet(op.getProperties())) {
this.flattenProperties(op.getProperties(), pathname);
const modelName = this.resolveModelName(op.getTitle(), bp.getName());
const innerModel = this.modelFromProperty(op, modelName);
const existing = this.matchGenerated(innerModel);
if (existing != null) {
am.setItems(new properties_1.RefProperty(existing));
}
else {
am.setItems(new properties_1.RefProperty(modelName));
this.addGenerated(modelName, innerModel);
swagger.addDefinition(modelName, innerModel);
}
}
}
}
}
}
else if (parameter instanceof parameters_1.RefParameter) {
console.log('what the propertye?', parameter, operation);
}
}
}
const responses = operation.getResponses();
if (javaUtil_1.isNotEmptySet(responses)) {
for (const [key, response] of responses) {
const property = response.getSchema();
if (property == null) {
continue;
}
if (property instanceof properties_1.ObjectProperty) {
const op = property;
if (hasProperties(op)) {
const modelName = this.resolveModelName(op.getTitle(), 'inline_response_' + key);
const model = this.modelFromProperty(op, modelName);
const existing = this.matchGenerated(model);
if (existing != null) {
response.setSchema(new properties_1.RefProperty(existing));
}
else {
response.setSchema(new properties_1.RefProperty(modelName));
this.addGenerated(modelName, model);
swagger.addDefinition(modelName, model);
}
}
}
else if (property instanceof properties_1.ArrayProperty) {
const ap = property;
const inner = ap.getItems();
if (inner != null && inner instanceof properties_1.ObjectProperty) {
const op = inner;
if (hasProperties(op)) {
this.flattenProperties(op.getProperties(), pathname);
const modelName = this.resolveModelName(op.getTitle(), 'inline_response_' + key);
const innerModel = this.modelFromProperty(op, modelName);
const existing = this.matchGenerated(innerModel);
if (existing != null) {
ap.setItems(new properties_1.RefProperty(existing));
}
else {
ap.setItems(new properties_1.RefProperty(modelName));
this.addGenerated(modelName, innerModel);
swagger.addDefinition(modelName, innerModel);
}
}
}
}
else if (property instanceof properties_1.MapProperty) {
const mp = property;
const innerProperty = mp.getAdditionalProperties();
if (innerProperty != null &&
innerProperty instanceof properties_1.ObjectProperty) {
const op = innerProperty;
if (hasProperties(op)) {
this.flattenProperties(op.getProperties(), pathname);
const modelName = this.resolveModelName(op.getTitle(), 'inline_response_' + key);
const innerModel = this.modelFromProperty(op, modelName);
const existing = this.matchGenerated(innerModel);
if (existing != null) {
mp.setAdditionalProperties(new properties_1.RefProperty(existing));
}
else {
mp.setAdditionalProperties(new properties_1.RefProperty(modelName));
this.addGenerated(modelName, innerModel);
swagger.addDefinition(modelName, innerModel);
}
}
}
}
}
}
}
}
}
if (models != null) {
for (const [modelName, model] of models) {
if (model == null) {
continue;
}
if (model instanceof ModelImpl_1.default) {
this.flattenProperties(model.getProperties(), modelName);
}
else if (model instanceof ArrayModel_1.default) {
const m = model;
const inner = m.getItems();
if (inner != null && inner instanceof properties_1.ObjectProperty) {
const op = inner;
if (javaUtil_1.isNotEmptySet(op.getProperties())) {
const innerModelName = this.uniqueName(modelName + '_inner');
const innerModel = this.modelFromProperty(op, innerModelName);
const existing = this.matchGenerated(innerModel);
if (existing == null) {
swagger.addDefinition(innerModelName, innerModel);
this.addGenerated(innerModelName, innerModel);
m.setItems(new properties_1.RefProperty(innerModelName));
}
else {
m.setItems(new properties_1.RefProperty(existing));
}
}
}
}
}
}
}
resolveModelName(title, key) {
if (title == null) {
return this.uniqueName(key);
}
else {
return this.uniqueName(title);
}
}
matchGenerated(model) {
if (this.skipMatches) {
return null;
}
const json = Json_1.default.pretty(model);
if (this.generatedSignature.containsKey(json)) {
return this.generatedSignature.get(json);
}
return null;
}
addGenerated(name, model) {
this.generatedSignature.put(Json_1.default.pretty(model), name);
}
uniqueName(key) {
let count = 0;
key = key.replace(new RegExp('[^a-z_\\.A-Z0-9 ]', 'g'), '');
while (true) {
let name = key;
if (count > 0) {
name = key + '_' + count;
}
if (this.swagger.getDefinitions() == null) {
return name;
}
else if (!this.swagger.getDefinitions().containsKey(name)) {
return name;
}
count += 1;
}
return key;
}
flattenProperties(properties, path) {
if (properties == null) {
return;
}
const propsToUpdate = javaUtil_1.newHashMap();
const modelsToAdd = javaUtil_1.newHashMap();
for (const [key, property] of properties) {
if (property instanceof properties_1.ObjectProperty && hasProperties(property)) {
const modelName = this.uniqueName(path + '_' + key);
const model = this.modelFromProperty(property, modelName);
const existing = this.matchGenerated(model);
if (existing != null) {
propsToUpdate.put(key, new properties_1.RefProperty(existing));
}
else {
propsToUpdate.put(key, new properties_1.RefProperty(modelName));
modelsToAdd.put(modelName, model);
this.addGenerated(modelName, model);
this.swagger.addDefinition(modelName, model);
}
}
else if (property instanceof properties_1.ArrayProperty) {
const ap = property;
const inner = ap.getItems();
if (inner instanceof properties_1.ObjectProperty) {
const op = inner;
if (hasProperties(op)) {
this.flattenProperties(op.getProperties(), path);
const modelName = this.uniqueName(path + '_' + key);
const innerModel = this.modelFromProperty(op, modelName);
const existing = this.matchGenerated(innerModel);
if (existing != null) {
ap.setItems(new properties_1.RefProperty(existing));
}
else {
ap.setItems(new properties_1.RefProperty(modelName));
this.addGenerated(modelName, innerModel);
this.swagger.addDefinition(modelName, innerModel);
}
}
}
}
else if (property instanceof properties_1.MapProperty) {
const mp = property;
const inner = mp.getAdditionalProperties();
if (inner != null && inner instanceof properties_1.ObjectProperty) {
const op = inner;
if (hasProperties(op)) {
this.flattenProperties(op.getProperties(), path);
const modelName = this.uniqueName(path + '_' + key);
const innerModel = this.modelFromProperty(op, modelName);
const existing = this.matchGenerated(innerModel);
if (existing != null) {
mp.setAdditionalProperties(new properties_1.RefProperty(existing));
}
else {
mp.setAdditionalProperties(new properties_1.RefProperty(modelName));
this.addGenerated(modelName, innerModel);
this.swagger.addDefinition(modelName, innerModel);
}
}
}
}
}
if (javaUtil_1.isNotEmptySet(propsToUpdate)) {
properties.putAll(propsToUpdate);
}
for (const [key, definition] of modelsToAdd) {
this.swagger.addDefinition(key, definition);
this.addedModels.put(key, definition);
}
}
modelFromProperty(object, path) {
if (((object != null && object instanceof properties_1.ArrayProperty) ||
object === null) &&
(typeof path === 'string' || path === null)) {
const description = object.getDescription();
let example = null;
const obj = object.getExample();
if (obj != null) {
example = obj.toString();
}
const inner = object.getItems();
if (inner != null && inner instanceof properties_1.ObjectProperty) {
const model = new ArrayModel_1.default();
model.setDescription(description);
model.setExample(example);
model.setItems(object.getItems());
return model;
}
return null;
}
else if (((object != null && object instanceof properties_1.ObjectProperty) ||
object === null) &&
(typeof path === 'string' || path === null)) {
return this.modelFromProperty$io_swagger_models_properties_ObjectProperty$java_lang_String(object, path);
}
else if (((object != null && object instanceof properties_1.MapProperty) || object === null) &&
(typeof path === 'string' || path === null)) {
return this.modelFromProperty$io_swagger_models_properties_MapProperty$java_lang_String(object, path);
}
else {
throw new Error('invalid overload');
}
}
modelFromProperty$io_swagger_models_properties_ObjectProperty$java_lang_String(object, path) {
const description = object.getDescription();
let example = null;
const obj = object.getExample();
if (obj != null) {
example = obj.toString();
}
const name = object.getName();
const xml = object.getXml();
const properties = object.getProperties();
const model = new ModelImpl_1.default();
model.setDescription(description);
model.setExample(example);
model.setName(name);
model.setXml(xml);
if (properties != null) {
this.flattenProperties(properties, path);
model.setProperties(properties);
}
return model;
}
modelFromProperty$io_swagger_models_properties_MapProperty$java_lang_String(object, path) {
const description = object.getDescription();
let example = null;
const obj = object.getExample();
if (obj != null) {
example = obj.toString();
}
const model = new ArrayModel_1.default();
model.setDescription(description);
model.setExample(example);
model.setItems(object.getAdditionalProperties());
return model;
}
isSkipMatches() {
return this.skipMatches;
}
setSkipMatches(skipMatches) {
this.skipMatches = skipMatches;
}
}
exports.default = InlineModelResolver;
const Log = LoggerFactory_1.default.getLogger(InlineModelResolver);
//# sourceMappingURL=InlineModelResolver.js.map