@mcp-abap-adt/adt-clients 7.3.0 → 7.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/clients/AdtClient.d.ts +32 -0
- package/dist/clients/AdtClient.d.ts.map +1 -1
- package/dist/clients/AdtClient.js +75 -30
- package/dist/core/accessControl/AdtAccessControl.d.ts +3 -1
- package/dist/core/accessControl/AdtAccessControl.d.ts.map +1 -1
- package/dist/core/accessControl/AdtAccessControl.js +9 -1
- package/dist/core/appendStructure/AdtAppendStructure.d.ts +3 -1
- package/dist/core/appendStructure/AdtAppendStructure.d.ts.map +1 -1
- package/dist/core/appendStructure/AdtAppendStructure.js +11 -2
- package/dist/core/authorizationField/AdtAuthorizationField.d.ts +3 -1
- package/dist/core/authorizationField/AdtAuthorizationField.d.ts.map +1 -1
- package/dist/core/authorizationField/AdtAuthorizationField.js +9 -1
- package/dist/core/behaviorDefinition/AdtBehaviorDefinition.d.ts +3 -1
- package/dist/core/behaviorDefinition/AdtBehaviorDefinition.d.ts.map +1 -1
- package/dist/core/behaviorDefinition/AdtBehaviorDefinition.js +9 -1
- package/dist/core/behaviorImplementation/AdtBehaviorImplementation.d.ts +2 -1
- package/dist/core/behaviorImplementation/AdtBehaviorImplementation.d.ts.map +1 -1
- package/dist/core/behaviorImplementation/AdtBehaviorImplementation.js +4 -2
- package/dist/core/class/AdtClass.d.ts +3 -1
- package/dist/core/class/AdtClass.d.ts.map +1 -1
- package/dist/core/class/AdtClass.js +14 -2
- package/dist/core/dataElement/AdtDataElement.d.ts +3 -1
- package/dist/core/dataElement/AdtDataElement.d.ts.map +1 -1
- package/dist/core/dataElement/AdtDataElement.js +9 -1
- package/dist/core/ddl/AdtDdl.d.ts +3 -1
- package/dist/core/ddl/AdtDdl.d.ts.map +1 -1
- package/dist/core/ddl/AdtDdl.js +9 -1
- package/dist/core/domain/AdtDomain.d.ts +3 -1
- package/dist/core/domain/AdtDomain.d.ts.map +1 -1
- package/dist/core/domain/AdtDomain.js +11 -1
- package/dist/core/enhancement/AdtEnhancement.d.ts +12 -1
- package/dist/core/enhancement/AdtEnhancement.d.ts.map +1 -1
- package/dist/core/enhancement/AdtEnhancement.js +28 -1
- package/dist/core/featureToggle/AdtFeatureToggle.d.ts +3 -1
- package/dist/core/featureToggle/AdtFeatureToggle.d.ts.map +1 -1
- package/dist/core/featureToggle/AdtFeatureToggle.js +12 -1
- package/dist/core/functionGroup/AdtFunctionGroup.d.ts +3 -1
- package/dist/core/functionGroup/AdtFunctionGroup.d.ts.map +1 -1
- package/dist/core/functionGroup/AdtFunctionGroup.js +9 -1
- package/dist/core/functionInclude/AdtFunctionInclude.d.ts +9 -1
- package/dist/core/functionInclude/AdtFunctionInclude.d.ts.map +1 -1
- package/dist/core/functionInclude/AdtFunctionInclude.js +28 -1
- package/dist/core/functionModule/AdtFunctionModule.d.ts +9 -1
- package/dist/core/functionModule/AdtFunctionModule.d.ts.map +1 -1
- package/dist/core/functionModule/AdtFunctionModule.js +25 -1
- package/dist/core/interface/AdtInterface.d.ts +3 -1
- package/dist/core/interface/AdtInterface.d.ts.map +1 -1
- package/dist/core/interface/AdtInterface.js +9 -1
- package/dist/core/messageClass/AdtMessageClass.d.ts +5 -4
- package/dist/core/messageClass/AdtMessageClass.d.ts.map +1 -1
- package/dist/core/messageClass/AdtMessageClass.js +16 -8
- package/dist/core/messageClass/AdtMessageClassMessage.d.ts +2 -1
- package/dist/core/messageClass/AdtMessageClassMessage.d.ts.map +1 -1
- package/dist/core/messageClass/AdtMessageClassMessage.js +10 -3
- package/dist/core/messageClass/create.d.ts +3 -5
- package/dist/core/messageClass/create.d.ts.map +1 -1
- package/dist/core/messageClass/create.js +7 -6
- package/dist/core/messageClass/delete.d.ts +3 -3
- package/dist/core/messageClass/delete.d.ts.map +1 -1
- package/dist/core/messageClass/delete.js +7 -4
- package/dist/core/messageClass/types.d.ts +2 -2
- package/dist/core/messageClass/types.d.ts.map +1 -1
- package/dist/core/messageClass/update.d.ts +1 -1
- package/dist/core/messageClass/update.d.ts.map +1 -1
- package/dist/core/messageClass/update.js +5 -2
- package/dist/core/metadataExtension/AdtMetadataExtension.d.ts +3 -1
- package/dist/core/metadataExtension/AdtMetadataExtension.d.ts.map +1 -1
- package/dist/core/metadataExtension/AdtMetadataExtension.js +9 -1
- package/dist/core/package/AdtPackage.d.ts +3 -1
- package/dist/core/package/AdtPackage.d.ts.map +1 -1
- package/dist/core/package/AdtPackage.js +9 -1
- package/dist/core/program/AdtProgram.d.ts +3 -1
- package/dist/core/program/AdtProgram.d.ts.map +1 -1
- package/dist/core/program/AdtProgram.js +9 -1
- package/dist/core/scalarFunction/AdtScalarFunction.d.ts +3 -1
- package/dist/core/scalarFunction/AdtScalarFunction.d.ts.map +1 -1
- package/dist/core/scalarFunction/AdtScalarFunction.js +11 -2
- package/dist/core/scalarFunctionImplementation/AdtScalarFunctionImplementation.d.ts +3 -1
- package/dist/core/scalarFunctionImplementation/AdtScalarFunctionImplementation.d.ts.map +1 -1
- package/dist/core/scalarFunctionImplementation/AdtScalarFunctionImplementation.js +14 -2
- package/dist/core/serviceDefinition/AdtServiceDefinition.d.ts +3 -1
- package/dist/core/serviceDefinition/AdtServiceDefinition.d.ts.map +1 -1
- package/dist/core/serviceDefinition/AdtServiceDefinition.js +9 -1
- package/dist/core/shared/LockRegistry.d.ts +77 -0
- package/dist/core/shared/LockRegistry.d.ts.map +1 -0
- package/dist/core/shared/LockRegistry.js +91 -0
- package/dist/core/structure/AdtStructure.d.ts +3 -1
- package/dist/core/structure/AdtStructure.d.ts.map +1 -1
- package/dist/core/structure/AdtStructure.js +9 -1
- package/dist/core/table/AdtTable.d.ts +3 -1
- package/dist/core/table/AdtTable.d.ts.map +1 -1
- package/dist/core/table/AdtTable.js +9 -1
- package/dist/core/tabletype/AdtDdicTableType.d.ts +3 -1
- package/dist/core/tabletype/AdtDdicTableType.d.ts.map +1 -1
- package/dist/core/tabletype/AdtDdicTableType.js +9 -1
- package/dist/core/transformation/AdtTransformation.d.ts +3 -1
- package/dist/core/transformation/AdtTransformation.d.ts.map +1 -1
- package/dist/core/transformation/AdtTransformation.js +9 -1
- package/package.json +1 -1
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.AdtInterface = void 0;
|
|
23
23
|
const internalUtils_1 = require("../../utils/internalUtils");
|
|
24
|
+
const LockRegistry_1 = require("../shared/LockRegistry");
|
|
24
25
|
const activation_1 = require("./activation");
|
|
25
26
|
const check_1 = require("./check");
|
|
26
27
|
const create_1 = require("./create");
|
|
@@ -36,12 +37,14 @@ class AdtInterface {
|
|
|
36
37
|
logger;
|
|
37
38
|
systemContext;
|
|
38
39
|
contentTypes;
|
|
40
|
+
lockTracker;
|
|
39
41
|
objectType = 'Interface';
|
|
40
|
-
constructor(connection, logger, systemContext, contentTypes) {
|
|
42
|
+
constructor(connection, logger, systemContext, contentTypes, lockRegistry) {
|
|
41
43
|
this.connection = connection;
|
|
42
44
|
this.logger = logger;
|
|
43
45
|
this.systemContext = systemContext ?? {};
|
|
44
46
|
this.contentTypes = contentTypes;
|
|
47
|
+
this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (interfaceName, lockHandle) => (0, unlock_1.unlockInterface)(this.connection, interfaceName, lockHandle));
|
|
45
48
|
}
|
|
46
49
|
/**
|
|
47
50
|
* Validate interface configuration before creation
|
|
@@ -198,6 +201,7 @@ class AdtInterface {
|
|
|
198
201
|
const lockResult = await (0, lock_1.lockInterface)(this.connection, config.interfaceName);
|
|
199
202
|
lockHandle = lockResult.lockHandle;
|
|
200
203
|
state.lockHandle = lockHandle;
|
|
204
|
+
this.lockTracker.track(config.interfaceName, lockHandle);
|
|
201
205
|
this.logger?.info?.('Interface locked, handle:', lockHandle);
|
|
202
206
|
// 2. Check inactive with code for update (from options or config)
|
|
203
207
|
const codeToCheck = options?.sourceCode || config.sourceCode;
|
|
@@ -233,6 +237,7 @@ class AdtInterface {
|
|
|
233
237
|
const unlockResponse = await (0, unlock_1.unlockInterface)(this.connection, config.interfaceName, lockHandle);
|
|
234
238
|
state.unlockResult = unlockResponse;
|
|
235
239
|
this.connection.setSessionType('stateless');
|
|
240
|
+
this.lockTracker.untrack(config.interfaceName);
|
|
236
241
|
lockHandle = undefined;
|
|
237
242
|
this.logger?.info?.('Interface unlocked');
|
|
238
243
|
}
|
|
@@ -276,6 +281,7 @@ class AdtInterface {
|
|
|
276
281
|
this.connection.setSessionType('stateful');
|
|
277
282
|
await (0, unlock_1.unlockInterface)(this.connection, config.interfaceName, lockHandle);
|
|
278
283
|
this.connection.setSessionType('stateless');
|
|
284
|
+
this.lockTracker.untrack(config.interfaceName);
|
|
279
285
|
}
|
|
280
286
|
catch (unlockError) {
|
|
281
287
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -422,6 +428,7 @@ class AdtInterface {
|
|
|
422
428
|
}
|
|
423
429
|
this.connection.setSessionType('stateful');
|
|
424
430
|
const result = await (0, lock_1.lockInterface)(this.connection, config.interfaceName);
|
|
431
|
+
this.lockTracker.track(config.interfaceName, result.lockHandle);
|
|
425
432
|
return result.lockHandle;
|
|
426
433
|
}
|
|
427
434
|
/**
|
|
@@ -434,6 +441,7 @@ class AdtInterface {
|
|
|
434
441
|
this.connection.setSessionType('stateful');
|
|
435
442
|
const result = await (0, unlock_1.unlockInterface)(this.connection, config.interfaceName, lockHandle);
|
|
436
443
|
this.connection.setSessionType('stateless');
|
|
444
|
+
this.lockTracker.untrack(config.interfaceName);
|
|
437
445
|
return {
|
|
438
446
|
unlockResult: result,
|
|
439
447
|
errors: [],
|
|
@@ -10,19 +10,20 @@
|
|
|
10
10
|
* Unsupported operations (message classes are not activatable):
|
|
11
11
|
* - activate, check, getVersions, getVersionSource → throwUnsupportedOperation
|
|
12
12
|
*
|
|
13
|
-
* transport
|
|
14
|
-
*
|
|
15
|
-
* corrNr query parameter is accepted by the endpoint.
|
|
13
|
+
* transport: config.transportRequest is sent as corrNr on create/update and as
|
|
14
|
+
* <del:transportNumber> on delete (transportable packages); local packages send none.
|
|
16
15
|
*/
|
|
17
16
|
import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger, IObjectVersion } from '@mcp-abap-adt/interfaces';
|
|
18
17
|
import type { IAdtSystemContext } from '../../clients/AdtClient';
|
|
18
|
+
import { type LockRegistry } from '../shared/LockRegistry';
|
|
19
19
|
import type { IMessageClassConfig, IMessageClassState } from './types';
|
|
20
20
|
export declare class AdtMessageClass implements IAdtObject<IMessageClassConfig, IMessageClassState> {
|
|
21
21
|
private readonly connection;
|
|
22
22
|
private readonly logger?;
|
|
23
23
|
private readonly systemContext;
|
|
24
|
+
private readonly lockTracker;
|
|
24
25
|
readonly objectType: string;
|
|
25
|
-
constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext);
|
|
26
|
+
constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, lockRegistry?: LockRegistry);
|
|
26
27
|
/**
|
|
27
28
|
* Validate name + description via the ADT validation endpoint.
|
|
28
29
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtMessageClass.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/AdtMessageClass.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"AdtMessageClass.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/AdtMessageClass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGjE,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAOvE,qBAAa,eACX,YAAW,UAAU,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;IAE9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAkB;gBAGlD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,YAAY;IAa7B;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACnC,OAAO,CAAC,kBAAkB,CAAC;IAqB9B;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,kBAAkB,CAAC;IAoC9B;;;OAGG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACnC,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAsB1C;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,EACpC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,kBAAkB,CAAC;IAwD9B;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACnC,OAAO,CAAC,kBAAkB,CAAC;IA2B9B;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,EACpC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAA;KAAE,GACvE,OAAO,CAAC,kBAAkB,CAAC;IAW9B;;;OAGG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACnC,OAAO,CAAC,kBAAkB,CAAC;IAO9B;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAUjE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,EACpC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC;IAc9B,yDAAyD;IACnD,QAAQ,CACZ,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,OAAO,CAAC,kBAAkB,CAAC;IAO9B,yEAAyE;IACnE,KAAK,CACT,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,OAAO,CAAC,kBAAkB,CAAC;IAI9B,4EAA4E;IACtE,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,OAAO,CAAC,cAAc,EAAE,CAAC;IAO5B,qFAAqF;IAC/E,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7D"}
|
|
@@ -11,14 +11,14 @@
|
|
|
11
11
|
* Unsupported operations (message classes are not activatable):
|
|
12
12
|
* - activate, check, getVersions, getVersionSource → throwUnsupportedOperation
|
|
13
13
|
*
|
|
14
|
-
* transport
|
|
15
|
-
*
|
|
16
|
-
* corrNr query parameter is accepted by the endpoint.
|
|
14
|
+
* transport: config.transportRequest is sent as corrNr on create/update and as
|
|
15
|
+
* <del:transportNumber> on delete (transportable packages); local packages send none.
|
|
17
16
|
*/
|
|
18
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
18
|
exports.AdtMessageClass = void 0;
|
|
20
19
|
const internalUtils_1 = require("../../utils/internalUtils");
|
|
21
20
|
const timeouts_1 = require("../../utils/timeouts");
|
|
21
|
+
const LockRegistry_1 = require("../shared/LockRegistry");
|
|
22
22
|
const unsupported_1 = require("../shared/unsupported");
|
|
23
23
|
const create_1 = require("./create");
|
|
24
24
|
const delete_1 = require("./delete");
|
|
@@ -32,11 +32,13 @@ class AdtMessageClass {
|
|
|
32
32
|
connection;
|
|
33
33
|
logger;
|
|
34
34
|
systemContext;
|
|
35
|
+
lockTracker;
|
|
35
36
|
objectType = 'MessageClass';
|
|
36
|
-
constructor(connection, logger, systemContext) {
|
|
37
|
+
constructor(connection, logger, systemContext, lockRegistry) {
|
|
37
38
|
this.connection = connection;
|
|
38
39
|
this.logger = logger;
|
|
39
40
|
this.systemContext = systemContext ?? {};
|
|
41
|
+
this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (name, lockHandle) => (0, unlock_1.unlockMessageClass)(this.connection, name, lockHandle));
|
|
40
42
|
}
|
|
41
43
|
/**
|
|
42
44
|
* Validate name + description via the ADT validation endpoint.
|
|
@@ -82,7 +84,7 @@ class AdtMessageClass {
|
|
|
82
84
|
master_language: config.masterLanguage?.trim() ||
|
|
83
85
|
this.systemContext.masterLanguage?.trim() ||
|
|
84
86
|
'EN',
|
|
85
|
-
//
|
|
87
|
+
// sent as ?corrNr= for a transportable package; empty for local
|
|
86
88
|
transport_request: config.transportRequest,
|
|
87
89
|
});
|
|
88
90
|
this.logger?.info?.('Message class created');
|
|
@@ -132,13 +134,15 @@ class AdtMessageClass {
|
|
|
132
134
|
this.logger?.info?.('lock');
|
|
133
135
|
this.connection.setSessionType('stateful');
|
|
134
136
|
lockHandle = await (0, lock_1.lockMessageClass)(this.connection, config.name);
|
|
137
|
+
this.lockTracker.track(config.name, lockHandle);
|
|
135
138
|
this.logger?.info?.('locked');
|
|
136
139
|
this.logger?.info?.('update');
|
|
137
|
-
const updateResult = await (0, update_1.updateMessageClass)(this.connection, config.name, lockHandle, config.description);
|
|
140
|
+
const updateResult = await (0, update_1.updateMessageClass)(this.connection, config.name, lockHandle, config.description, config.transportRequest);
|
|
138
141
|
this.logger?.info?.('updated');
|
|
139
142
|
this.logger?.info?.('unlock');
|
|
140
143
|
const unlockResult = await (0, unlock_1.unlockMessageClass)(this.connection, config.name, lockHandle);
|
|
141
144
|
this.connection.setSessionType('stateless');
|
|
145
|
+
this.lockTracker.untrack(config.name);
|
|
142
146
|
lockHandle = undefined;
|
|
143
147
|
this.logger?.info?.('unlocked');
|
|
144
148
|
return { updateResult, unlockResult, errors: [] };
|
|
@@ -149,6 +153,7 @@ class AdtMessageClass {
|
|
|
149
153
|
try {
|
|
150
154
|
this.logger?.warn?.('Unlocking message class during error cleanup');
|
|
151
155
|
await (0, unlock_1.unlockMessageClass)(this.connection, config.name, lockHandle);
|
|
156
|
+
this.lockTracker.untrack(config.name);
|
|
152
157
|
}
|
|
153
158
|
catch (unlockError) {
|
|
154
159
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -175,7 +180,7 @@ class AdtMessageClass {
|
|
|
175
180
|
this.logger?.info?.('delete: check');
|
|
176
181
|
await (0, delete_1.checkDeletion)(this.connection, config.name);
|
|
177
182
|
this.logger?.info?.('delete: delete');
|
|
178
|
-
const deleteResult = await (0, delete_1.deleteMessageClass)(this.connection, config.name);
|
|
183
|
+
const deleteResult = await (0, delete_1.deleteMessageClass)(this.connection, config.name, config.transportRequest);
|
|
179
184
|
this.logger?.info?.('deleted');
|
|
180
185
|
return { deleteResult, errors: [] };
|
|
181
186
|
}
|
|
@@ -213,7 +218,9 @@ class AdtMessageClass {
|
|
|
213
218
|
throw new Error('Message class name is required');
|
|
214
219
|
}
|
|
215
220
|
this.connection.setSessionType('stateful');
|
|
216
|
-
|
|
221
|
+
const lockHandle = await (0, lock_1.lockMessageClass)(this.connection, config.name);
|
|
222
|
+
this.lockTracker.track(config.name, lockHandle);
|
|
223
|
+
return lockHandle;
|
|
217
224
|
}
|
|
218
225
|
/**
|
|
219
226
|
* Unlock message class (low-level).
|
|
@@ -224,6 +231,7 @@ class AdtMessageClass {
|
|
|
224
231
|
}
|
|
225
232
|
const unlockResult = await (0, unlock_1.unlockMessageClass)(this.connection, config.name, lockHandle);
|
|
226
233
|
this.connection.setSessionType('stateless');
|
|
234
|
+
this.lockTracker.untrack(config.name);
|
|
227
235
|
return { unlockResult, errors: [] };
|
|
228
236
|
}
|
|
229
237
|
/** Message classes are not activated — always throws. */
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
* Unsupported: activate, check, validate, lock, unlock, getVersions,
|
|
22
22
|
* getVersionSource, readTransport → throwUnsupportedOperation.
|
|
23
23
|
*
|
|
24
|
-
* transport
|
|
24
|
+
* transport: when config.transportRequest is set (transportable package), it is
|
|
25
|
+
* appended as &corrNr= on the class PUT, like the other CRUD object types.
|
|
25
26
|
*/
|
|
26
27
|
import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger, IObjectVersion } from '@mcp-abap-adt/interfaces';
|
|
27
28
|
import type { IMessageClassMessageConfig, IMessageClassMessageState } from './types';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtMessageClassMessage.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/AdtMessageClassMessage.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"AdtMessageClassMessage.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/AdtMessageClassMessage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACf,MAAM,0BAA0B,CAAC;AAclC,OAAO,KAAK,EACV,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,SAAS,CAAC;AAMjB,qBAAa,sBACX,YAAW,UAAU,CAAC,0BAA0B,EAAE,yBAAyB,CAAC;IAE5E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAyB;gBAE/C,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAOzD;;;;OAIG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC1C,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC;IAkCjD;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,0BAA0B,EAClC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,yBAAyB,CAAC;IAIrC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,EAC3C,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,yBAAyB,CAAC;YAIvB,cAAc;IAwH5B;;;;;;;;;;;;OAYG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC1C,OAAO,CAAC,yBAAyB,CAAC;IAyFrC,oFAAoF;IAC9E,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC1C,OAAO,CAAC,yBAAyB,CAAC;IAY/B,QAAQ,CACZ,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,yBAAyB,CAAC;IAI/B,QAAQ,CACZ,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,yBAAyB,CAAC;IAI/B,KAAK,CACT,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,yBAAyB,CAAC;IAI/B,aAAa,CACjB,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,yBAAyB,CAAC;IAI/B,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAInE,MAAM,CACV,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,EAC5C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,yBAAyB,CAAC;IAI/B,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7D"}
|
|
@@ -22,7 +22,8 @@
|
|
|
22
22
|
* Unsupported: activate, check, validate, lock, unlock, getVersions,
|
|
23
23
|
* getVersionSource, readTransport → throwUnsupportedOperation.
|
|
24
24
|
*
|
|
25
|
-
* transport
|
|
25
|
+
* transport: when config.transportRequest is set (transportable package), it is
|
|
26
|
+
* appended as &corrNr= on the class PUT, like the other CRUD object types.
|
|
26
27
|
*/
|
|
27
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
29
|
exports.AdtMessageClassMessage = void 0;
|
|
@@ -146,8 +147,11 @@ class AdtMessageClassMessage {
|
|
|
146
147
|
messageLockHandles: { [no]: messageLockHandle },
|
|
147
148
|
});
|
|
148
149
|
const encoded = (0, internalUtils_1.encodeSapObjectName)(name.toLowerCase());
|
|
150
|
+
const corrNr = config.transportRequest?.trim()
|
|
151
|
+
? `&corrNr=${encodeURIComponent(config.transportRequest)}`
|
|
152
|
+
: '';
|
|
149
153
|
const updateResult = await this.connection.makeAdtRequest({
|
|
150
|
-
url: `${BASE}/${encoded}?lockHandle=${encodeURIComponent(classLockHandle)}`,
|
|
154
|
+
url: `${BASE}/${encoded}?lockHandle=${encodeURIComponent(classLockHandle)}${corrNr}`,
|
|
151
155
|
method: 'PUT',
|
|
152
156
|
timeout: (0, timeouts_1.getTimeout)('default'),
|
|
153
157
|
data: xmlBody,
|
|
@@ -234,8 +238,11 @@ class AdtMessageClassMessage {
|
|
|
234
238
|
messageLockHandles: { [no]: messageLockHandle },
|
|
235
239
|
});
|
|
236
240
|
const encoded = (0, internalUtils_1.encodeSapObjectName)(name.toLowerCase());
|
|
241
|
+
const corrNr = config.transportRequest?.trim()
|
|
242
|
+
? `&corrNr=${encodeURIComponent(config.transportRequest)}`
|
|
243
|
+
: '';
|
|
237
244
|
const deleteResult = await this.connection.makeAdtRequest({
|
|
238
|
-
url: `${BASE}/${encoded}?lockHandle=${encodeURIComponent(classLockHandle)}`,
|
|
245
|
+
url: `${BASE}/${encoded}?lockHandle=${encodeURIComponent(classLockHandle)}${corrNr}`,
|
|
239
246
|
method: 'PUT',
|
|
240
247
|
timeout: (0, timeouts_1.getTimeout)('default'),
|
|
241
248
|
data: xmlBody,
|
|
@@ -5,11 +5,9 @@ import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
|
|
|
5
5
|
import type { ICreateMessageClassParams } from './types';
|
|
6
6
|
/**
|
|
7
7
|
* Create a new message class (shell — no messages yet).
|
|
8
|
-
* POST /sap/bc/adt/messageclass with Content-Type application/xml.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* path is the only one confirmed by probe. Task 6.2 will wire it for
|
|
12
|
-
* transportable packages once a corrNr probe succeeds.
|
|
8
|
+
* POST /sap/bc/adt/messageclass[?corrNr={transport}] with Content-Type application/xml.
|
|
9
|
+
* For a transportable package pass `transport_request` (added as `?corrNr=`), like
|
|
10
|
+
* domain/class create; local packages send no corrNr.
|
|
13
11
|
*/
|
|
14
12
|
export declare function createMessageClass(connection: IAbapConnection, params: ICreateMessageClassParams): Promise<IAdtResponse>;
|
|
15
13
|
//# sourceMappingURL=create.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE9E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAKzD
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE9E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAKzD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,YAAY,CAAC,CA0BvB"}
|
|
@@ -9,11 +9,9 @@ const xml_1 = require("./xml");
|
|
|
9
9
|
const BASE = '/sap/bc/adt/messageclass';
|
|
10
10
|
/**
|
|
11
11
|
* Create a new message class (shell — no messages yet).
|
|
12
|
-
* POST /sap/bc/adt/messageclass with Content-Type application/xml.
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* path is the only one confirmed by probe. Task 6.2 will wire it for
|
|
16
|
-
* transportable packages once a corrNr probe succeeds.
|
|
12
|
+
* POST /sap/bc/adt/messageclass[?corrNr={transport}] with Content-Type application/xml.
|
|
13
|
+
* For a transportable package pass `transport_request` (added as `?corrNr=`), like
|
|
14
|
+
* domain/class create; local packages send no corrNr.
|
|
17
15
|
*/
|
|
18
16
|
async function createMessageClass(connection, params) {
|
|
19
17
|
// Emit BOTH adtcore:language and adtcore:masterLanguage (like domain/class),
|
|
@@ -27,8 +25,11 @@ async function createMessageClass(connection, params) {
|
|
|
27
25
|
masterLanguage: lang,
|
|
28
26
|
messages: [],
|
|
29
27
|
});
|
|
28
|
+
const corrNrParam = params.transport_request?.trim()
|
|
29
|
+
? `?corrNr=${encodeURIComponent(params.transport_request)}`
|
|
30
|
+
: '';
|
|
30
31
|
return connection.makeAdtRequest({
|
|
31
|
-
url: BASE
|
|
32
|
+
url: `${BASE}${corrNrParam}`,
|
|
32
33
|
method: 'POST',
|
|
33
34
|
timeout: (0, timeouts_1.getTimeout)('default'),
|
|
34
35
|
data: xmlBody,
|
|
@@ -18,8 +18,8 @@ export declare function checkDeletion(connection: IAbapConnection, name: string)
|
|
|
18
18
|
* Low-level: delete the message class via the deletion service.
|
|
19
19
|
* POST /sap/bc/adt/deletion/delete (stateless — no lock handle).
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
21
|
+
* For a transportable package pass `transportRequest` (emitted as
|
|
22
|
+
* `<del:transportNumber>`), like domain; local packages send an empty tag.
|
|
23
23
|
*/
|
|
24
|
-
export declare function deleteMessageClass(connection: IAbapConnection, name: string): Promise<IAdtResponse>;
|
|
24
|
+
export declare function deleteMessageClass(connection: IAbapConnection, name: string, transportRequest?: string): Promise<IAdtResponse>;
|
|
25
25
|
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/delete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAe9E;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAkBvB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/delete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAe9E;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAkBvB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,EACZ,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,CAwBvB"}
|
|
@@ -43,16 +43,19 @@ async function checkDeletion(connection, name) {
|
|
|
43
43
|
* Low-level: delete the message class via the deletion service.
|
|
44
44
|
* POST /sap/bc/adt/deletion/delete (stateless — no lock handle).
|
|
45
45
|
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
46
|
+
* For a transportable package pass `transportRequest` (emitted as
|
|
47
|
+
* `<del:transportNumber>`), like domain; local packages send an empty tag.
|
|
48
48
|
*/
|
|
49
|
-
async function deleteMessageClass(connection, name) {
|
|
49
|
+
async function deleteMessageClass(connection, name, transportRequest) {
|
|
50
50
|
if (!name)
|
|
51
51
|
throw new Error('name is required');
|
|
52
|
+
const transportNumberTag = transportRequest?.trim()
|
|
53
|
+
? `<del:transportNumber>${transportRequest}</del:transportNumber>`
|
|
54
|
+
: '<del:transportNumber/>';
|
|
52
55
|
const xmlPayload = `<?xml version="1.0" encoding="UTF-8"?>
|
|
53
56
|
<del:deletionRequest xmlns:del="http://www.sap.com/adt/deletion" xmlns:adtcore="http://www.sap.com/adt/core">
|
|
54
57
|
<del:object adtcore:uri="${objectUri(name)}">
|
|
55
|
-
|
|
58
|
+
${transportNumberTag}
|
|
56
59
|
</del:object>
|
|
57
60
|
</del:deletionRequest>`;
|
|
58
61
|
return connection.makeAdtRequest({
|
|
@@ -21,7 +21,7 @@ export interface IMessageClassConfig {
|
|
|
21
21
|
description?: string;
|
|
22
22
|
/** Package name — required for create */
|
|
23
23
|
packageName?: string;
|
|
24
|
-
/** Transport request —
|
|
24
|
+
/** Transport request — sent as corrNr (create/update) or <del:transportNumber> (delete) for transportable packages */
|
|
25
25
|
transportRequest?: string;
|
|
26
26
|
/** Master language of the message class — defaults to 'EN' on create */
|
|
27
27
|
masterLanguage?: string;
|
|
@@ -42,7 +42,7 @@ export interface IMessageClassMessageConfig {
|
|
|
42
42
|
selfExplanatory?: boolean;
|
|
43
43
|
/** Long description for the message (adtcore:description attribute) */
|
|
44
44
|
description?: string;
|
|
45
|
-
/** Transport request —
|
|
45
|
+
/** Transport request — sent as &corrNr= on the parent-class PUT for create/update/delete (transportable packages) */
|
|
46
46
|
transportRequest?: string;
|
|
47
47
|
}
|
|
48
48
|
/** State returned from operations on a single message. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAGjE,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAGD,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAGjE,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAGD,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sHAAsH;IACtH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,iDAAiD;IACjD,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAID,8EAA8E;AAC9E,MAAM,WAAW,0BAA0B;IACzC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qHAAqH;IACrH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,0DAA0D;AAC1D,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAChE,6DAA6D;IAC7D,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B"}
|
|
@@ -12,5 +12,5 @@ import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
|
|
|
12
12
|
*
|
|
13
13
|
* NOTE: Caller must enable stateful session and hold a valid lockHandle.
|
|
14
14
|
*/
|
|
15
|
-
export declare function updateMessageClass(connection: IAbapConnection, name: string, lockHandle: string, description: string | undefined): Promise<IAdtResponse>;
|
|
15
|
+
export declare function updateMessageClass(connection: IAbapConnection, name: string, lockHandle: string, description: string | undefined, transportRequest?: string): Promise<IAdtResponse>;
|
|
16
16
|
//# sourceMappingURL=update.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/update.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAS9E;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/update.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAS9E;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,CA4BvB"}
|
|
@@ -20,7 +20,7 @@ const BASE = '/sap/bc/adt/messageclass';
|
|
|
20
20
|
*
|
|
21
21
|
* NOTE: Caller must enable stateful session and hold a valid lockHandle.
|
|
22
22
|
*/
|
|
23
|
-
async function updateMessageClass(connection, name, lockHandle, description) {
|
|
23
|
+
async function updateMessageClass(connection, name, lockHandle, description, transportRequest) {
|
|
24
24
|
// 1. Read current state to preserve existing messages and all SAP-managed attrs
|
|
25
25
|
const currentResponse = await (0, read_1.getMessageClassSource)(connection, name);
|
|
26
26
|
const current = (0, xml_1.parseMessageClass)(String(currentResponse.data));
|
|
@@ -33,7 +33,10 @@ async function updateMessageClass(connection, name, lockHandle, description) {
|
|
|
33
33
|
const xmlBody = (0, xml_1.buildMessageClassXml)(updated);
|
|
34
34
|
// 4. PUT with lock handle
|
|
35
35
|
const encoded = (0, internalUtils_1.encodeSapObjectName)(name.toLowerCase());
|
|
36
|
-
const
|
|
36
|
+
const corrNrParam = transportRequest?.trim()
|
|
37
|
+
? `&corrNr=${encodeURIComponent(transportRequest)}`
|
|
38
|
+
: '';
|
|
39
|
+
const url = `${BASE}/${encoded}?lockHandle=${encodeURIComponent(lockHandle)}${corrNrParam}`;
|
|
37
40
|
return connection.makeAdtRequest({
|
|
38
41
|
url,
|
|
39
42
|
method: 'PUT',
|
|
@@ -19,14 +19,16 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger } from '@mcp-abap-adt/interfaces';
|
|
21
21
|
import type { IAdtSystemContext } from '../../clients/AdtClient';
|
|
22
|
+
import { type LockRegistry } from '../shared/LockRegistry';
|
|
22
23
|
import type { IReadOptions } from '../shared/types';
|
|
23
24
|
import type { IMetadataExtensionConfig, IMetadataExtensionState } from './types';
|
|
24
25
|
export declare class AdtMetadataExtension implements IAdtObject<IMetadataExtensionConfig, IMetadataExtensionState> {
|
|
25
26
|
private readonly connection;
|
|
26
27
|
private readonly logger?;
|
|
27
28
|
private readonly systemContext;
|
|
29
|
+
private readonly lockTracker;
|
|
28
30
|
readonly objectType: string;
|
|
29
|
-
constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext);
|
|
31
|
+
constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, lockRegistry?: LockRegistry);
|
|
30
32
|
/**
|
|
31
33
|
* Validate metadata extension configuration before creation
|
|
32
34
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtMetadataExtension.d.ts","sourceRoot":"","sources":["../../../src/core/metadataExtension/AdtMetadataExtension.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAWpD,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,SAAS,CAAC;AASjB,qBAAa,oBACX,YAAW,UAAU,CAAC,wBAAwB,EAAE,uBAAuB,CAAC;IAExE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,SAAgB,UAAU,EAAE,MAAM,CAAuB;gBAGvD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"AdtMetadataExtension.d.ts","sourceRoot":"","sources":["../../../src/core/metadataExtension/AdtMetadataExtension.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAWpD,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,SAAS,CAAC;AASjB,qBAAa,oBACX,YAAW,UAAU,CAAC,wBAAwB,EAAE,uBAAuB,CAAC;IAExE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAuB;gBAGvD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,YAAY;IAa7B;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACxC,OAAO,CAAC,uBAAuB,CAAC;IAwBnC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,wBAAwB,EAChC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,uBAAuB,CAAC;IAyCnC;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAqC/C;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,uBAAuB,CAAC;IAiCnC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,uBAAuB,CAAC;IAoCnC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,uBAAuB,CAAC;IAoMnC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACxC,OAAO,CAAC,uBAAuB,CAAC;IAkCnC;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACxC,OAAO,CAAC,uBAAuB,CAAC;IA6BnC;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,uBAAuB,CAAC;IAoBnC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IActE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,uBAAuB,CAAC;IAmBnC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC;IAIrD,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.AdtMetadataExtension = void 0;
|
|
23
23
|
const internalUtils_1 = require("../../utils/internalUtils");
|
|
24
|
+
const LockRegistry_1 = require("../shared/LockRegistry");
|
|
24
25
|
const activate_1 = require("./activate");
|
|
25
26
|
const check_1 = require("./check");
|
|
26
27
|
const create_1 = require("./create");
|
|
@@ -35,11 +36,13 @@ class AdtMetadataExtension {
|
|
|
35
36
|
connection;
|
|
36
37
|
logger;
|
|
37
38
|
systemContext;
|
|
39
|
+
lockTracker;
|
|
38
40
|
objectType = 'MetadataExtension';
|
|
39
|
-
constructor(connection, logger, systemContext) {
|
|
41
|
+
constructor(connection, logger, systemContext, lockRegistry) {
|
|
40
42
|
this.connection = connection;
|
|
41
43
|
this.logger = logger;
|
|
42
44
|
this.systemContext = systemContext ?? {};
|
|
45
|
+
this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (name, lockHandle) => (0, unlock_1.unlockMetadataExtension)(this.connection, name, lockHandle));
|
|
43
46
|
}
|
|
44
47
|
/**
|
|
45
48
|
* Validate metadata extension configuration before creation
|
|
@@ -232,6 +235,7 @@ class AdtMetadataExtension {
|
|
|
232
235
|
this.logger?.info?.('Step 1: Locking metadata extension');
|
|
233
236
|
this.connection.setSessionType('stateful');
|
|
234
237
|
lockHandle = await (0, lock_1.lockMetadataExtension)(this.connection, config.name);
|
|
238
|
+
this.lockTracker.track(config.name, lockHandle);
|
|
235
239
|
this.logger?.info?.('Metadata extension locked, handle:', lockHandle);
|
|
236
240
|
// 2. Check inactive with code for update (from options or config)
|
|
237
241
|
const codeToCheck = options?.sourceCode || config.sourceCode;
|
|
@@ -264,6 +268,7 @@ class AdtMetadataExtension {
|
|
|
264
268
|
this.connection.setSessionType('stateful');
|
|
265
269
|
await (0, unlock_1.unlockMetadataExtension)(this.connection, config.name, lockHandle);
|
|
266
270
|
this.connection.setSessionType('stateless');
|
|
271
|
+
this.lockTracker.untrack(config.name);
|
|
267
272
|
lockHandle = undefined;
|
|
268
273
|
this.logger?.info?.('Metadata extension unlocked');
|
|
269
274
|
}
|
|
@@ -311,6 +316,7 @@ class AdtMetadataExtension {
|
|
|
311
316
|
this.connection.setSessionType('stateful');
|
|
312
317
|
await (0, unlock_1.unlockMetadataExtension)(this.connection, config.name, lockHandle);
|
|
313
318
|
this.connection.setSessionType('stateless');
|
|
319
|
+
this.lockTracker.untrack(config.name);
|
|
314
320
|
}
|
|
315
321
|
catch (unlockError) {
|
|
316
322
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -419,6 +425,7 @@ class AdtMetadataExtension {
|
|
|
419
425
|
}
|
|
420
426
|
this.connection.setSessionType('stateful');
|
|
421
427
|
const lockHandle = await (0, lock_1.lockMetadataExtension)(this.connection, config.name);
|
|
428
|
+
this.lockTracker.track(config.name, lockHandle);
|
|
422
429
|
return lockHandle;
|
|
423
430
|
}
|
|
424
431
|
/**
|
|
@@ -431,6 +438,7 @@ class AdtMetadataExtension {
|
|
|
431
438
|
this.connection.setSessionType('stateful');
|
|
432
439
|
const result = await (0, unlock_1.unlockMetadataExtension)(this.connection, config.name, lockHandle);
|
|
433
440
|
this.connection.setSessionType('stateless');
|
|
441
|
+
this.lockTracker.untrack(config.name);
|
|
434
442
|
return {
|
|
435
443
|
unlockResult: result,
|
|
436
444
|
errors: [],
|
|
@@ -22,14 +22,16 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger, IObjectVersion } from '@mcp-abap-adt/interfaces';
|
|
24
24
|
import type { IAdtSystemContext } from '../../clients/AdtClient';
|
|
25
|
+
import { type LockRegistry } from '../shared/LockRegistry';
|
|
25
26
|
import type { IReadOptions } from '../shared/types';
|
|
26
27
|
import type { IPackageConfig, IPackageState } from './types';
|
|
27
28
|
export declare class AdtPackage implements IAdtObject<IPackageConfig, IPackageState> {
|
|
28
29
|
protected readonly connection: IAbapConnection;
|
|
29
30
|
protected readonly logger?: ILogger;
|
|
30
31
|
protected readonly systemContext: IAdtSystemContext;
|
|
32
|
+
private readonly lockTracker;
|
|
31
33
|
readonly objectType: string;
|
|
32
|
-
constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext);
|
|
34
|
+
constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, lockRegistry?: LockRegistry);
|
|
33
35
|
/**
|
|
34
36
|
* Validate package configuration before creation
|
|
35
37
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtPackage.d.ts","sourceRoot":"","sources":["../../../src/core/package/AdtPackage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOpD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7D,qBAAa,UAAW,YAAW,UAAU,CAAC,cAAc,EAAE,aAAa,CAAC;IAC1E,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IACpC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IACpD,SAAgB,UAAU,EAAE,MAAM,CAAa;gBAG7C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"AdtPackage.d.ts","sourceRoot":"","sources":["../../../src/core/package/AdtPackage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOpD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7D,qBAAa,UAAW,YAAW,UAAU,CAAC,cAAc,EAAE,aAAa,CAAC;IAC1E,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IACpC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAa;gBAG7C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,YAAY;IAa7B;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IA2BvE;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,aAAa,CAAC;IAsGzB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IA0BrC;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,aAAa,CAAC;IAoCzB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,aAAa,CAAC;IAkCzB;;;;;OAKG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,aAAa,CAAC;IAwLzB;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IA6BrE;;;OAGG;IACG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAMxE;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC;IAkBzB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAW5D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;IAmBnB,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7D"}
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
25
|
exports.AdtPackage = void 0;
|
|
26
26
|
const internalUtils_1 = require("../../utils/internalUtils");
|
|
27
|
+
const LockRegistry_1 = require("../shared/LockRegistry");
|
|
27
28
|
const versions_1 = require("../shared/versions");
|
|
28
29
|
const check_1 = require("./check");
|
|
29
30
|
const create_1 = require("./create");
|
|
@@ -37,11 +38,13 @@ class AdtPackage {
|
|
|
37
38
|
connection;
|
|
38
39
|
logger;
|
|
39
40
|
systemContext;
|
|
41
|
+
lockTracker;
|
|
40
42
|
objectType = 'Package';
|
|
41
|
-
constructor(connection, logger, systemContext) {
|
|
43
|
+
constructor(connection, logger, systemContext, lockRegistry) {
|
|
42
44
|
this.connection = connection;
|
|
43
45
|
this.logger = logger;
|
|
44
46
|
this.systemContext = systemContext ?? {};
|
|
47
|
+
this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (packageName, lockHandle) => (0, unlock_1.unlockPackage)(this.connection, packageName, lockHandle));
|
|
45
48
|
}
|
|
46
49
|
/**
|
|
47
50
|
* Validate package configuration before creation
|
|
@@ -306,6 +309,7 @@ class AdtPackage {
|
|
|
306
309
|
const lockResult = await (0, lock_1.lockPackage)(this.connection, config.packageName);
|
|
307
310
|
lockHandle = lockResult.lockHandle;
|
|
308
311
|
lockCorrNr = lockResult.corrNr;
|
|
312
|
+
this.lockTracker.track(config.packageName, lockHandle);
|
|
309
313
|
this.logger?.info?.(`Package locked, handle: ${lockHandle}, corrNr: ${lockCorrNr}`);
|
|
310
314
|
// 2. Check inactive with XML for update (if provided)
|
|
311
315
|
const xmlToCheck = options?.xmlContent;
|
|
@@ -352,6 +356,7 @@ class AdtPackage {
|
|
|
352
356
|
this.connection.setSessionType('stateful');
|
|
353
357
|
await (0, unlock_1.unlockPackage)(this.connection, config.packageName, lockHandle);
|
|
354
358
|
this.connection.setSessionType('stateless');
|
|
359
|
+
this.lockTracker.untrack(config.packageName);
|
|
355
360
|
lockHandle = undefined;
|
|
356
361
|
this.logger?.info?.('Package unlocked');
|
|
357
362
|
}
|
|
@@ -371,6 +376,7 @@ class AdtPackage {
|
|
|
371
376
|
this.connection.setSessionType('stateful');
|
|
372
377
|
await (0, unlock_1.unlockPackage)(this.connection, config.packageName, lockHandle);
|
|
373
378
|
this.connection.setSessionType('stateless');
|
|
379
|
+
this.lockTracker.untrack(config.packageName);
|
|
374
380
|
}
|
|
375
381
|
catch (unlockError) {
|
|
376
382
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -456,6 +462,7 @@ class AdtPackage {
|
|
|
456
462
|
}
|
|
457
463
|
this.connection.setSessionType('stateful');
|
|
458
464
|
const lockResult = await (0, lock_1.lockPackage)(this.connection, config.packageName);
|
|
465
|
+
this.lockTracker.track(config.packageName, lockResult.lockHandle);
|
|
459
466
|
return lockResult.lockHandle;
|
|
460
467
|
}
|
|
461
468
|
/**
|
|
@@ -468,6 +475,7 @@ class AdtPackage {
|
|
|
468
475
|
this.connection.setSessionType('stateful');
|
|
469
476
|
const result = await (0, unlock_1.unlockPackage)(this.connection, config.packageName, lockHandle);
|
|
470
477
|
this.connection.setSessionType('stateless');
|
|
478
|
+
this.lockTracker.untrack(config.packageName);
|
|
471
479
|
return {
|
|
472
480
|
unlockResult: result,
|
|
473
481
|
errors: [],
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger } from '@mcp-abap-adt/interfaces';
|
|
21
21
|
import type { IAdtSystemContext } from '../../clients/AdtClient';
|
|
22
22
|
import type { IAdtContentTypes } from '../shared/contentTypes';
|
|
23
|
+
import { type LockRegistry } from '../shared/LockRegistry';
|
|
23
24
|
import type { IReadOptions } from '../shared/types';
|
|
24
25
|
import type { IProgramConfig, IProgramState } from './types';
|
|
25
26
|
export declare class AdtProgram implements IAdtObject<IProgramConfig, IProgramState> {
|
|
@@ -27,8 +28,9 @@ export declare class AdtProgram implements IAdtObject<IProgramConfig, IProgramSt
|
|
|
27
28
|
protected readonly logger?: ILogger;
|
|
28
29
|
protected readonly systemContext: IAdtSystemContext;
|
|
29
30
|
protected readonly contentTypes?: IAdtContentTypes;
|
|
31
|
+
private readonly lockTracker;
|
|
30
32
|
readonly objectType: string;
|
|
31
|
-
constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, contentTypes?: IAdtContentTypes);
|
|
33
|
+
constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, contentTypes?: IAdtContentTypes, lockRegistry?: LockRegistry);
|
|
32
34
|
/**
|
|
33
35
|
* Validate program configuration before creation
|
|
34
36
|
*/
|