UNPKG

navidev-adt-api

Version:

API de conexión al Abap Developer Tools

131 lines (130 loc) 6.98 kB
"use strict"; 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;