navidev-adt-api
Version:
API de conexión al Abap Developer Tools
131 lines (130 loc) • 6.98 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const Result_1 = require("../shared/core/Result");
const xmlParser_1 = __importDefault(require("../shared/utilities/parser/xmlParser"));
const extractData_1 = __importDefault(require("./extractData"));
class AbapObjectStructureApp {
constructor(connectionController, AdtRepository) {
this.connectionController = connectionController;
this.AdtRepository = AdtRepository;
}
/**
* Lectura de la estructura de un objeto
* @param objectUri URL del objeto
* @param version version del código
* @returns Estructura del objeto
*/
readObjectStructure(objectUri_1) {
return __awaiter(this, arguments, void 0, function* (objectUri, version = "active") {
var _a;
const response = yield this.connectionController.request(`${objectUri}/objectstructure`, {
method: "GET",
qs: { version: version, withShortDescriptions: true },
});
if (response.isSuccess) {
let typesStructure = yield this.getTypesStructure();
let httpResponse = response.getValue();
const bodyParse = xmlParser_1.default.fullParse(httpResponse.body);
let tmpObjectStructure = {
name: bodyParse["abapsource:objectStructureElement"]["@_adtcore:name"],
type: bodyParse["abapsource:objectStructureElement"]["@_adtcore:type"],
typeDesc: (_a = typesStructure.find((row) => row.type ==
bodyParse["abapsource:objectStructureElement"]["@_adtcore:type"])) === null || _a === void 0 ? void 0 : _a.typeDesc,
structureElements: [],
};
// Utilidad para asegurar que tengo un array aunque me llegue una estructura
let contentStructure = xmlParser_1.default.nodeArray(bodyParse["abapsource:objectStructureElement"]["abapsource:objectStructureElement"]);
contentStructure.forEach((rowElement) => {
var _a, _b;
let element = {
name: rowElement["@_adtcore:name"],
type: rowElement["@_adtcore:type"],
visibility: (_a = rowElement["@_visibility"]) !== null && _a !== void 0 ? _a : rowElement["@_visibility"],
typeDesc: (_b = typesStructure.find((row) => row.type == rowElement["@_adtcore:type"])) === null || _b === void 0 ? void 0 : _b.typeDesc,
isEventHandlerMethod: rowElement["@_eventhandlermethod"]
? rowElement["@_eventhandlermethod"]
: false,
isConstructor: rowElement["@_constructor"]
? rowElement["@_constructor"]
: false,
isConstant: rowElement["@_constant"]
? rowElement["@_constant"]
: false,
isReadOnly: rowElement["@_readOnly"]
? rowElement["@_readOnly"]
: false,
isRedefinition: rowElement["@_redefinition"]
? rowElement["@_redefinition"]
: false,
sourceUri: "",
blockInfo: [],
};
// Utilidad para convertir estructuras a un Array
let contentPositions = xmlParser_1.default.nodeArray(rowElement["atom:link"]);
contentPositions.forEach((rowBlock) => {
let sourcePosition = extractData_1.default.extractSourcePositionBlockElement(rowBlock["@_href"]);
element.sourceUri = sourcePosition.source;
element.blockInfo.push({
block: this.extractTypeBlockElement(rowBlock["@_rel"]),
startPos: sourcePosition.start,
endPos: sourcePosition.end,
});
});
tmpObjectStructure.structureElements.push(element);
});
return Result_1.Result.ok(tmpObjectStructure);
}
else {
return Result_1.Result.fail(response.getErrorValue());
}
});
}
/**
* Simplifica la lectura de los tipos en la estructura de objeto
* @returns Array con los tipos de objeto
*/
getTypesStructure() {
return __awaiter(this, void 0, void 0, function* () {
const responseTypesStructure = yield this.AdtRepository.readTypesStructure();
if (responseTypesStructure.isSuccess) {
let values = responseTypesStructure.getValue();
// Excepción para el CLAS/OF - Friend que no viene en los tipos al menos en la versión de ABAP 7.51. Si no viene
// lo añado a mano, tomando como template el tipo de metodo
if (values.findIndex((row) => row.type == "CLAS/OF") == -1) {
let templateType = values.find((row) => (row.type = "CLAS/OM"));
templateType.type = "CLAS/OF";
templateType.typeDesc = "Friends";
values.push(templateType);
}
return responseTypesStructure.getValue();
}
return [];
});
}
/**
* Devuelve el tipo de bloque del elemento
* @param elementInfo Valor del elemento
* @returns tipo de bloque
*/
extractTypeBlockElement(elementInfo) {
// El tipo de bloque viene en una URL como esta:
//"http://www.sap.com/adt/relations/source/definitionIdentifier";
// La opcion que veo más simple es separar la URL y leer la última posición que es
// donde esta el tipo de bloque
let parts = elementInfo.split("/");
return parts[parts.length - 1];
}
}
exports.default = AbapObjectStructureApp;