@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
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
19
|
exports.AdtAuthorizationField = void 0;
|
|
20
20
|
const internalUtils_1 = require("../../utils/internalUtils");
|
|
21
|
+
const LockRegistry_1 = require("../shared/LockRegistry");
|
|
21
22
|
const versions_1 = require("../shared/versions");
|
|
22
23
|
const activation_1 = require("./activation");
|
|
23
24
|
const check_1 = require("./check");
|
|
@@ -32,11 +33,13 @@ class AdtAuthorizationField {
|
|
|
32
33
|
connection;
|
|
33
34
|
logger;
|
|
34
35
|
systemContext;
|
|
36
|
+
lockTracker;
|
|
35
37
|
objectType = 'AuthorizationField';
|
|
36
|
-
constructor(connection, logger, systemContext) {
|
|
38
|
+
constructor(connection, logger, systemContext, lockRegistry) {
|
|
37
39
|
this.connection = connection;
|
|
38
40
|
this.logger = logger;
|
|
39
41
|
this.systemContext = systemContext ?? {};
|
|
42
|
+
this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (name, lockHandle) => (0, unlock_1.unlockAuthorizationField)(this.connection, name, lockHandle));
|
|
40
43
|
}
|
|
41
44
|
/**
|
|
42
45
|
* Map camelCase config to the snake_case low-level params the functions expect.
|
|
@@ -218,6 +221,7 @@ class AdtAuthorizationField {
|
|
|
218
221
|
this.connection.setSessionType('stateful');
|
|
219
222
|
lockHandle = await (0, lock_1.lockAuthorizationField)(this.connection, fullConfig.authorizationFieldName, this.logger);
|
|
220
223
|
state.lockHandle = lockHandle;
|
|
224
|
+
this.lockTracker.track(fullConfig.authorizationFieldName, lockHandle);
|
|
221
225
|
fullConfig.onLock?.(lockHandle);
|
|
222
226
|
this.logger?.info?.('Authorization field locked, handle:', lockHandle);
|
|
223
227
|
// 2. Check inactive with XML for update (if provided)
|
|
@@ -246,6 +250,7 @@ class AdtAuthorizationField {
|
|
|
246
250
|
this.connection.setSessionType('stateful');
|
|
247
251
|
await (0, unlock_1.unlockAuthorizationField)(this.connection, fullConfig.authorizationFieldName, lockHandle);
|
|
248
252
|
this.connection.setSessionType('stateless');
|
|
253
|
+
this.lockTracker.untrack(fullConfig.authorizationFieldName);
|
|
249
254
|
lockHandle = undefined;
|
|
250
255
|
this.logger?.info?.('Authorization field unlocked');
|
|
251
256
|
// 5. Final check
|
|
@@ -285,6 +290,7 @@ class AdtAuthorizationField {
|
|
|
285
290
|
this.connection.setSessionType('stateful');
|
|
286
291
|
await (0, unlock_1.unlockAuthorizationField)(this.connection, fullConfig.authorizationFieldName, lockHandle);
|
|
287
292
|
this.connection.setSessionType('stateless');
|
|
293
|
+
this.lockTracker.untrack(fullConfig.authorizationFieldName);
|
|
288
294
|
}
|
|
289
295
|
catch (unlockError) {
|
|
290
296
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -380,6 +386,7 @@ class AdtAuthorizationField {
|
|
|
380
386
|
}
|
|
381
387
|
this.connection.setSessionType('stateful');
|
|
382
388
|
const lockHandle = await (0, lock_1.lockAuthorizationField)(this.connection, config.authorizationFieldName, this.logger);
|
|
389
|
+
this.lockTracker.track(config.authorizationFieldName, lockHandle);
|
|
383
390
|
return lockHandle;
|
|
384
391
|
}
|
|
385
392
|
/**
|
|
@@ -392,6 +399,7 @@ class AdtAuthorizationField {
|
|
|
392
399
|
this.connection.setSessionType('stateful');
|
|
393
400
|
await (0, unlock_1.unlockAuthorizationField)(this.connection, config.authorizationFieldName, lockHandle);
|
|
394
401
|
this.connection.setSessionType('stateless');
|
|
402
|
+
this.lockTracker.untrack(config.authorizationFieldName);
|
|
395
403
|
return { errors: [] };
|
|
396
404
|
}
|
|
397
405
|
async getVersions(_config) {
|
|
@@ -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 { IBehaviorDefinitionConfig, IBehaviorDefinitionState } from './types';
|
|
24
25
|
export declare class AdtBehaviorDefinition implements IAdtObject<IBehaviorDefinitionConfig, IBehaviorDefinitionState> {
|
|
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 behavior definition configuration before creation
|
|
32
34
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtBehaviorDefinition.d.ts","sourceRoot":"","sources":["../../../src/core/behaviorDefinition/AdtBehaviorDefinition.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,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AASjB,qBAAa,qBACX,YAAW,UAAU,CAAC,yBAAyB,EAAE,wBAAwB,CAAC;IAE1E,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,CAAwB;gBAGxD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"AdtBehaviorDefinition.d.ts","sourceRoot":"","sources":["../../../src/core/behaviorDefinition/AdtBehaviorDefinition.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,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AASjB,qBAAa,qBACX,YAAW,UAAU,CAAC,yBAAyB,EAAE,wBAAwB,CAAC;IAE1E,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,CAAwB;gBAGxD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,YAAY;IAY7B;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GACzC,OAAO,CAAC,wBAAwB,CAAC;IA+CpC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,yBAAyB,EACjC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,wBAAwB,CAAC;IAuEpC;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC;IA8BhD;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,wBAAwB,CAAC;IAoCpC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,wBAAwB,CAAC;IAoCpC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,wBAAwB,CAAC;IAuMpC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GACzC,OAAO,CAAC,wBAAwB,CAAC;IAqCpC;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GACzC,OAAO,CAAC,wBAAwB,CAAC;IAwBpC;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC;IA4BpC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAWvE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,wBAAwB,CAAC;IAepC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC;IAItD,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.AdtBehaviorDefinition = 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");
|
|
@@ -35,11 +36,13 @@ class AdtBehaviorDefinition {
|
|
|
35
36
|
connection;
|
|
36
37
|
logger;
|
|
37
38
|
systemContext;
|
|
39
|
+
lockTracker;
|
|
38
40
|
objectType = 'BehaviorDefinition';
|
|
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.unlock)(this.connection, name, lockHandle));
|
|
43
46
|
}
|
|
44
47
|
/**
|
|
45
48
|
* Validate behavior definition configuration before creation
|
|
@@ -279,6 +282,7 @@ class AdtBehaviorDefinition {
|
|
|
279
282
|
this.connection.setSessionType('stateful');
|
|
280
283
|
lockHandle = await (0, lock_1.lock)(this.connection, config.name);
|
|
281
284
|
state.lockHandle = lockHandle;
|
|
285
|
+
this.lockTracker.track(config.name, lockHandle);
|
|
282
286
|
this.logger?.info?.('Behavior definition locked, handle:', lockHandle);
|
|
283
287
|
// 2. Check inactive with code for update (from options or config)
|
|
284
288
|
const codeToCheck = options?.sourceCode || config.sourceCode;
|
|
@@ -319,6 +323,7 @@ class AdtBehaviorDefinition {
|
|
|
319
323
|
const unlockResponse = await (0, unlock_1.unlock)(this.connection, config.name, lockHandle);
|
|
320
324
|
state.unlockResult = unlockResponse;
|
|
321
325
|
this.connection.setSessionType('stateless');
|
|
326
|
+
this.lockTracker.untrack(config.name);
|
|
322
327
|
lockHandle = undefined;
|
|
323
328
|
this.logger?.info?.('Behavior definition unlocked');
|
|
324
329
|
}
|
|
@@ -360,6 +365,7 @@ class AdtBehaviorDefinition {
|
|
|
360
365
|
this.connection.setSessionType('stateful');
|
|
361
366
|
await (0, unlock_1.unlock)(this.connection, config.name, lockHandle);
|
|
362
367
|
this.connection.setSessionType('stateless');
|
|
368
|
+
this.lockTracker.untrack(config.name);
|
|
363
369
|
}
|
|
364
370
|
catch (unlockError) {
|
|
365
371
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -476,6 +482,7 @@ class AdtBehaviorDefinition {
|
|
|
476
482
|
}
|
|
477
483
|
this.connection.setSessionType('stateful');
|
|
478
484
|
const lockHandle = await (0, lock_1.lock)(this.connection, config.name);
|
|
485
|
+
this.lockTracker.track(config.name, lockHandle);
|
|
479
486
|
return lockHandle;
|
|
480
487
|
}
|
|
481
488
|
/**
|
|
@@ -488,6 +495,7 @@ class AdtBehaviorDefinition {
|
|
|
488
495
|
this.connection.setSessionType('stateful');
|
|
489
496
|
const result = await (0, unlock_1.unlock)(this.connection, config.name, lockHandle);
|
|
490
497
|
this.connection.setSessionType('stateless');
|
|
498
|
+
this.lockTracker.untrack(config.name);
|
|
491
499
|
return {
|
|
492
500
|
unlockResult: result,
|
|
493
501
|
errors: [],
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
* - Delete: check(deletion) → delete (via AdtClass)
|
|
24
24
|
*/
|
|
25
25
|
import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger } from '@mcp-abap-adt/interfaces';
|
|
26
|
+
import type { LockRegistry } from '../shared/LockRegistry';
|
|
26
27
|
import type { IReadOptions } from '../shared/types';
|
|
27
28
|
import type { IBehaviorImplementationConfig, IBehaviorImplementationState } from './types';
|
|
28
29
|
export declare class AdtBehaviorImplementation implements IAdtObject<IBehaviorImplementationConfig, IBehaviorImplementationState> {
|
|
@@ -30,7 +31,7 @@ export declare class AdtBehaviorImplementation implements IAdtObject<IBehaviorIm
|
|
|
30
31
|
private readonly logger?;
|
|
31
32
|
private readonly class;
|
|
32
33
|
readonly objectType: string;
|
|
33
|
-
constructor(connection: IAbapConnection, logger?: ILogger);
|
|
34
|
+
constructor(connection: IAbapConnection, logger?: ILogger, lockRegistry?: LockRegistry);
|
|
34
35
|
/**
|
|
35
36
|
* Validate behavior implementation configuration before creation
|
|
36
37
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtBehaviorImplementation.d.ts","sourceRoot":"","sources":["../../../src/core/behaviorImplementation/AdtBehaviorImplementation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAKlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMpD,OAAO,KAAK,EACV,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,SAAS,CAAC;AAQjB,qBAAa,yBACX,YACE,UAAU,CAAC,6BAA6B,EAAE,4BAA4B,CAAC;IAEzE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,SAAgB,UAAU,EAAE,MAAM,CAA4B;
|
|
1
|
+
{"version":3,"file":"AdtBehaviorImplementation.d.ts","sourceRoot":"","sources":["../../../src/core/behaviorImplementation/AdtBehaviorImplementation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAKlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMpD,OAAO,KAAK,EACV,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,SAAS,CAAC;AAQjB,qBAAa,yBACX,YACE,UAAU,CAAC,6BAA6B,EAAE,4BAA4B,CAAC;IAEzE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,SAAgB,UAAU,EAAE,MAAM,CAA4B;gBAG5D,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,YAAY,CAAC,EAAE,YAAY;IAe7B;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAC7C,OAAO,CAAC,4BAA4B,CAAC;IAmCxC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,6BAA6B,EACrC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,4BAA4B,CAAC;IA4CxC;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,4BAA4B,GAAG,SAAS,CAAC;IA8BpD;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,4BAA4B,CAAC;IAiCxC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,4BAA4B,CAAC;IAoCxC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,4BAA4B,CAAC;IAiPxC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAC7C,OAAO,CAAC,4BAA4B,CAAC;IA+BxC;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAC7C,OAAO,CAAC,4BAA4B,CAAC;IA0BxC;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,4BAA4B,CAAC;IAuBxC;;;OAGG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ3E;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,4BAA4B,CAAC;IAexC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC;IAI1D,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
|
|
@@ -38,10 +38,12 @@ class AdtBehaviorImplementation {
|
|
|
38
38
|
logger;
|
|
39
39
|
class;
|
|
40
40
|
objectType = 'BehaviorImplementation';
|
|
41
|
-
constructor(connection, logger) {
|
|
41
|
+
constructor(connection, logger, lockRegistry) {
|
|
42
42
|
this.connection = connection;
|
|
43
43
|
this.logger = logger;
|
|
44
|
-
|
|
44
|
+
// Behavior implementation locks are class locks delegated to this internal
|
|
45
|
+
// AdtClass — pass the session registry so those locks are tracked too.
|
|
46
|
+
this.class = new class_1.AdtClass(connection, logger, undefined, undefined, lockRegistry);
|
|
45
47
|
}
|
|
46
48
|
/**
|
|
47
49
|
* Validate behavior implementation configuration before creation
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
import { type IAdtResponse as AxiosResponse, type IAbapConnection, type IAdtObject, type IAdtOperationOptions, type ILogger, type IObjectVersion } from '@mcp-abap-adt/interfaces';
|
|
20
20
|
import type { IAdtSystemContext } from '../../clients/AdtClient';
|
|
21
21
|
import type { IAdtContentTypes } from '../shared/contentTypes';
|
|
22
|
+
import { type LockRegistry } from '../shared/LockRegistry';
|
|
22
23
|
import type { IReadOptions } from '../shared/types';
|
|
23
24
|
import type { IClassConfig, IClassState } from './types';
|
|
24
25
|
import { type ClassIncludeType } from './versions';
|
|
@@ -27,8 +28,9 @@ export declare class AdtClass implements IAdtObject<IClassConfig, IClassState> {
|
|
|
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 class configuration before creation
|
|
34
36
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtClass.d.ts","sourceRoot":"","sources":["../../../src/core/class/AdtClass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAGL,KAAK,YAAY,IAAI,aAAa,EAElC,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAWpD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAIzD,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,YAAY,CAAC;AAEpB,qBAAa,QAAS,YAAW,UAAU,CAAC,YAAY,EAAE,WAAW,CAAC;IACpE,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,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IACnD,SAAgB,UAAU,EAAE,MAAM,CAAW;gBAG3C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"AdtClass.d.ts","sourceRoot":"","sources":["../../../src/core/class/AdtClass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAGL,KAAK,YAAY,IAAI,aAAa,EAElC,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAWpD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAIzD,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,YAAY,CAAC;AAEpB,qBAAa,QAAS,YAAW,UAAU,CAAC,YAAY,EAAE,WAAW,CAAC;IACpE,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,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAW;gBAG3C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,gBAAgB,EAC/B,YAAY,CAAC,EAAE,YAAY;IAc7B;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAgDnE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,WAAW,CAAC;IAoEvB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAqDnC;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,CAAC;IAmCvB;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,WAAW,CAAC;IA8LvB;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IA8DjE;;;OAGG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IA8CnE;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC;IA6EvB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAe1D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC;IAkBvB;;;OAGG;IACG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAUrE;;;OAGG;IACG,iBAAiB,CACrB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;IAczB;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,EACzD,OAAO,GAAE,QAAQ,GAAG,UAAuB,GAC1C,OAAO,CAAC,aAAa,CAAC;IAgBzB;;;OAGG;IACG,iBAAiB,CACrB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,GACxD,OAAO,CAAC,aAAa,CAAC;IA2DzB;;OAEG;IACG,mBAAmB,CACvB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,GACxD,OAAO,CAAC,aAAa,CAAC;IAczB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,WAAW,CAAC;IAoCvB,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAKrE,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrD,sEAAsE;IACtE,SAAS,CAAC,kBAAkB,CAC1B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,gBAAgB,GAC5B,OAAO,CAAC,cAAc,EAAE,CAAC;CAG7B"}
|
|
@@ -54,6 +54,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
54
54
|
exports.AdtClass = void 0;
|
|
55
55
|
const interfaces_1 = require("@mcp-abap-adt/interfaces");
|
|
56
56
|
const internalUtils_1 = require("../../utils/internalUtils");
|
|
57
|
+
const LockRegistry_1 = require("../shared/LockRegistry");
|
|
57
58
|
const activation_1 = require("./activation");
|
|
58
59
|
const check_1 = require("./check");
|
|
59
60
|
const create_1 = require("./create");
|
|
@@ -70,12 +71,14 @@ class AdtClass {
|
|
|
70
71
|
logger;
|
|
71
72
|
systemContext;
|
|
72
73
|
contentTypes;
|
|
74
|
+
lockTracker;
|
|
73
75
|
objectType = 'Class';
|
|
74
|
-
constructor(connection, logger, systemContext, contentTypes) {
|
|
76
|
+
constructor(connection, logger, systemContext, contentTypes, lockRegistry) {
|
|
75
77
|
this.connection = connection;
|
|
76
78
|
this.logger = logger;
|
|
77
79
|
this.systemContext = systemContext ?? {};
|
|
78
80
|
this.contentTypes = contentTypes;
|
|
81
|
+
this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (className, lockHandle) => (0, unlock_1.unlockClass)(this.connection, className, lockHandle));
|
|
79
82
|
}
|
|
80
83
|
/**
|
|
81
84
|
* Validate class configuration before creation
|
|
@@ -281,6 +284,7 @@ class AdtClass {
|
|
|
281
284
|
this.connection.setSessionType('stateful');
|
|
282
285
|
lockHandle = await (0, lock_1.lockClass)(this.connection, config.className);
|
|
283
286
|
state.lockHandle = lockHandle;
|
|
287
|
+
this.lockTracker.track(config.className, lockHandle);
|
|
284
288
|
this.logger?.info?.('Class locked, handle:', lockHandle);
|
|
285
289
|
// 2. Check inactive with code/xml for update (from options or config)
|
|
286
290
|
const codeToCheck = options?.sourceCode || config.sourceCode;
|
|
@@ -313,6 +317,7 @@ class AdtClass {
|
|
|
313
317
|
this.connection.setSessionType('stateful');
|
|
314
318
|
state.unlockResult = await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
|
|
315
319
|
this.connection.setSessionType('stateless');
|
|
320
|
+
this.lockTracker.untrack(config.className);
|
|
316
321
|
lockHandle = undefined;
|
|
317
322
|
this.logger?.info?.('Class unlocked');
|
|
318
323
|
}
|
|
@@ -350,6 +355,7 @@ class AdtClass {
|
|
|
350
355
|
this.connection.setSessionType('stateful');
|
|
351
356
|
await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
|
|
352
357
|
this.connection.setSessionType('stateless');
|
|
358
|
+
this.lockTracker.untrack(config.className);
|
|
353
359
|
}
|
|
354
360
|
catch (unlockError) {
|
|
355
361
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -538,7 +544,9 @@ class AdtClass {
|
|
|
538
544
|
// is only valid inside stateful requests, so a stateless write between lock
|
|
539
545
|
// and unlock fails with 423.
|
|
540
546
|
this.connection.setSessionType('stateful');
|
|
541
|
-
|
|
547
|
+
const lockHandle = await (0, lock_1.lockClass)(this.connection, config.className);
|
|
548
|
+
this.lockTracker.track(config.className, lockHandle);
|
|
549
|
+
return lockHandle;
|
|
542
550
|
}
|
|
543
551
|
/**
|
|
544
552
|
* Unlock class
|
|
@@ -550,6 +558,7 @@ class AdtClass {
|
|
|
550
558
|
this.connection.setSessionType('stateful');
|
|
551
559
|
const result = await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
|
|
552
560
|
this.connection.setSessionType('stateless');
|
|
561
|
+
this.lockTracker.untrack(config.className);
|
|
553
562
|
return {
|
|
554
563
|
unlockResult: result,
|
|
555
564
|
errors: [],
|
|
@@ -611,6 +620,7 @@ class AdtClass {
|
|
|
611
620
|
this.logger?.info?.('Step 1: Locking parent class');
|
|
612
621
|
this.connection.setSessionType('stateful');
|
|
613
622
|
lockHandle = await (0, lock_1.lockClass)(this.connection, config.className);
|
|
623
|
+
this.lockTracker.track(config.className, lockHandle);
|
|
614
624
|
this.logger?.info?.('Parent class locked, handle:', lockHandle);
|
|
615
625
|
// 2. Update test classes (uses parent class lock handle)
|
|
616
626
|
this.logger?.info?.('Step 2: Updating test classes');
|
|
@@ -620,6 +630,7 @@ class AdtClass {
|
|
|
620
630
|
this.connection.setSessionType('stateful');
|
|
621
631
|
await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
|
|
622
632
|
this.connection.setSessionType('stateless');
|
|
633
|
+
this.lockTracker.untrack(config.className);
|
|
623
634
|
lockHandle = undefined;
|
|
624
635
|
return response;
|
|
625
636
|
}
|
|
@@ -631,6 +642,7 @@ class AdtClass {
|
|
|
631
642
|
this.connection.setSessionType('stateful');
|
|
632
643
|
await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
|
|
633
644
|
this.connection.setSessionType('stateless');
|
|
645
|
+
this.lockTracker.untrack(config.className);
|
|
634
646
|
}
|
|
635
647
|
catch (unlockError) {
|
|
636
648
|
this.logger?.warn?.('Failed to unlock parent class after error:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -19,14 +19,16 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger, IObjectVersion } 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 { IDataElementConfig, IDataElementState } from './types';
|
|
24
25
|
export declare class AdtDataElement implements IAdtObject<IDataElementConfig, IDataElementState> {
|
|
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 data element configuration before creation
|
|
32
34
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtDataElement.d.ts","sourceRoot":"","sources":["../../../src/core/dataElement/AdtDataElement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;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;AAQpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAIrE,qBAAa,cACX,YAAW,UAAU,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;IAE5D,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,CAAiB;gBAGjD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"AdtDataElement.d.ts","sourceRoot":"","sources":["../../../src/core/dataElement/AdtDataElement.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.AdtDataElement = void 0;
|
|
23
23
|
const internalUtils_1 = require("../../utils/internalUtils");
|
|
24
|
+
const LockRegistry_1 = require("../shared/LockRegistry");
|
|
24
25
|
const versions_1 = require("../shared/versions");
|
|
25
26
|
const activation_1 = require("./activation");
|
|
26
27
|
const check_1 = require("./check");
|
|
@@ -35,11 +36,13 @@ class AdtDataElement {
|
|
|
35
36
|
connection;
|
|
36
37
|
logger;
|
|
37
38
|
systemContext;
|
|
39
|
+
lockTracker;
|
|
38
40
|
objectType = 'DataElement';
|
|
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.unlockDataElement)(this.connection, name, lockHandle));
|
|
43
46
|
}
|
|
44
47
|
/**
|
|
45
48
|
* Validate data element configuration before creation
|
|
@@ -250,6 +253,7 @@ class AdtDataElement {
|
|
|
250
253
|
this.connection.setSessionType('stateful');
|
|
251
254
|
lockHandle = await (0, lock_1.lockDataElement)(this.connection, config.dataElementName);
|
|
252
255
|
state.lockHandle = lockHandle;
|
|
256
|
+
this.lockTracker.track(config.dataElementName, lockHandle);
|
|
253
257
|
this.logger?.info?.('Data element locked, handle:', lockHandle);
|
|
254
258
|
// 2. Check inactive with XML for update (if provided)
|
|
255
259
|
const xmlToCheck = options?.xmlContent;
|
|
@@ -300,6 +304,7 @@ class AdtDataElement {
|
|
|
300
304
|
const unlockResponse = await (0, unlock_1.unlockDataElement)(this.connection, config.dataElementName, lockHandle);
|
|
301
305
|
state.unlockResult = unlockResponse;
|
|
302
306
|
this.connection.setSessionType('stateless');
|
|
307
|
+
this.lockTracker.untrack(config.dataElementName);
|
|
303
308
|
lockHandle = undefined;
|
|
304
309
|
this.logger?.info?.('Data element unlocked');
|
|
305
310
|
}
|
|
@@ -343,6 +348,7 @@ class AdtDataElement {
|
|
|
343
348
|
this.connection.setSessionType('stateful');
|
|
344
349
|
await (0, unlock_1.unlockDataElement)(this.connection, config.dataElementName, lockHandle);
|
|
345
350
|
this.connection.setSessionType('stateless');
|
|
351
|
+
this.lockTracker.untrack(config.dataElementName);
|
|
346
352
|
}
|
|
347
353
|
catch (unlockError) {
|
|
348
354
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -484,6 +490,7 @@ class AdtDataElement {
|
|
|
484
490
|
}
|
|
485
491
|
this.connection.setSessionType('stateful');
|
|
486
492
|
const lockHandle = await (0, lock_1.lockDataElement)(this.connection, config.dataElementName);
|
|
493
|
+
this.lockTracker.track(config.dataElementName, lockHandle);
|
|
487
494
|
return lockHandle;
|
|
488
495
|
}
|
|
489
496
|
/**
|
|
@@ -496,6 +503,7 @@ class AdtDataElement {
|
|
|
496
503
|
this.connection.setSessionType('stateful');
|
|
497
504
|
const result = await (0, unlock_1.unlockDataElement)(this.connection, config.dataElementName, lockHandle);
|
|
498
505
|
this.connection.setSessionType('stateless');
|
|
506
|
+
this.lockTracker.untrack(config.dataElementName);
|
|
499
507
|
return {
|
|
500
508
|
unlockResult: result,
|
|
501
509
|
errors: [],
|
|
@@ -22,14 +22,16 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger } 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 { IDdlConfig, IDdlState } from './types';
|
|
27
28
|
export declare class AdtDdl implements IAdtObject<IDdlConfig, IDdlState> {
|
|
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 view configuration before creation
|
|
35
37
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtDdl.d.ts","sourceRoot":"","sources":["../../../src/core/ddl/AdtDdl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;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;AAOpD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMrD,qBAAa,MAAO,YAAW,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC;IAC9D,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,CAAU;gBAG1C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"AdtDdl.d.ts","sourceRoot":"","sources":["../../../src/core/ddl/AdtDdl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;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;AAOpD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMrD,qBAAa,MAAO,YAAW,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC;IAC9D,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,CAAU;gBAG1C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,YAAY;IAY7B;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IA2B/D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,SAAS,CAAC;IA4DrB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAyBjC;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,SAAS,CAAC;IAgCrB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,SAAS,CAAC;IAkCrB;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,SAAS,CAAC;IAsMrB;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAgC7D;;;OAGG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAiB/D;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,CAAC;IAsBrB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,CAAC;IAmBrB,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC;IAIvC,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
|
package/dist/core/ddl/AdtDdl.js
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
25
|
exports.AdtDdl = void 0;
|
|
26
26
|
const internalUtils_1 = require("../../utils/internalUtils");
|
|
27
|
+
const LockRegistry_1 = require("../shared/LockRegistry");
|
|
27
28
|
const activation_1 = require("./activation");
|
|
28
29
|
const check_1 = require("./check");
|
|
29
30
|
const create_1 = require("./create");
|
|
@@ -38,11 +39,13 @@ class AdtDdl {
|
|
|
38
39
|
connection;
|
|
39
40
|
logger;
|
|
40
41
|
systemContext;
|
|
42
|
+
lockTracker;
|
|
41
43
|
objectType = 'View';
|
|
42
|
-
constructor(connection, logger, systemContext) {
|
|
44
|
+
constructor(connection, logger, systemContext, lockRegistry) {
|
|
43
45
|
this.connection = connection;
|
|
44
46
|
this.logger = logger;
|
|
45
47
|
this.systemContext = systemContext ?? {};
|
|
48
|
+
this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (ddlName, lockHandle) => (0, unlock_1.unlockDDLS)(this.connection, ddlName, lockHandle));
|
|
46
49
|
}
|
|
47
50
|
/**
|
|
48
51
|
* Validate view configuration before creation
|
|
@@ -238,6 +241,7 @@ class AdtDdl {
|
|
|
238
241
|
this.logger?.info?.('Step 1: Locking view');
|
|
239
242
|
this.connection.setSessionType('stateful');
|
|
240
243
|
lockHandle = await (0, lock_1.lockDDLS)(this.connection, config.ddlName);
|
|
244
|
+
this.lockTracker.track(config.ddlName, lockHandle);
|
|
241
245
|
this.logger?.info?.('View locked, handle:', lockHandle);
|
|
242
246
|
// 2. Check inactive with code for update (from options or config)
|
|
243
247
|
const codeToCheck = options?.sourceCode || config.ddlSource;
|
|
@@ -270,6 +274,7 @@ class AdtDdl {
|
|
|
270
274
|
this.connection.setSessionType('stateful');
|
|
271
275
|
await (0, unlock_1.unlockDDLS)(this.connection, config.ddlName, lockHandle);
|
|
272
276
|
this.connection.setSessionType('stateless');
|
|
277
|
+
this.lockTracker.untrack(config.ddlName);
|
|
273
278
|
lockHandle = undefined;
|
|
274
279
|
this.logger?.info?.('View unlocked');
|
|
275
280
|
}
|
|
@@ -321,6 +326,7 @@ class AdtDdl {
|
|
|
321
326
|
this.connection.setSessionType('stateful');
|
|
322
327
|
await (0, unlock_1.unlockDDLS)(this.connection, config.ddlName, lockHandle);
|
|
323
328
|
this.connection.setSessionType('stateless');
|
|
329
|
+
this.lockTracker.untrack(config.ddlName);
|
|
324
330
|
}
|
|
325
331
|
catch (unlockError) {
|
|
326
332
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -424,6 +430,7 @@ class AdtDdl {
|
|
|
424
430
|
}
|
|
425
431
|
this.connection.setSessionType('stateful');
|
|
426
432
|
const lockHandle = await (0, lock_1.lockDDLS)(this.connection, config.ddlName);
|
|
433
|
+
this.lockTracker.track(config.ddlName, lockHandle);
|
|
427
434
|
return lockHandle;
|
|
428
435
|
}
|
|
429
436
|
/**
|
|
@@ -436,6 +443,7 @@ class AdtDdl {
|
|
|
436
443
|
this.connection.setSessionType('stateful');
|
|
437
444
|
const result = await (0, unlock_1.unlockDDLS)(this.connection, config.ddlName, lockHandle);
|
|
438
445
|
this.connection.setSessionType('stateless');
|
|
446
|
+
this.lockTracker.untrack(config.ddlName);
|
|
439
447
|
return {
|
|
440
448
|
unlockResult: result,
|
|
441
449
|
errors: [],
|
|
@@ -19,14 +19,16 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger, IObjectVersion } 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 { IDomainConfig, IDomainState } from './types';
|
|
24
25
|
export declare class AdtDomain implements IAdtObject<IDomainConfig, IDomainState> {
|
|
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 domain configuration before creation
|
|
32
34
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtDomain.d.ts","sourceRoot":"","sources":["../../../src/core/domain/AdtDomain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;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;AAQpD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI3D,qBAAa,SAAU,YAAW,UAAU,CAAC,aAAa,EAAE,YAAY,CAAC;IACvE,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,CAAY;gBAG5C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"AdtDomain.d.ts","sourceRoot":"","sources":["../../../src/core/domain/AdtDomain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;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;AAQpD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI3D,qBAAa,SAAU,YAAW,UAAU,CAAC,aAAa,EAAE,YAAY,CAAC;IACvE,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,CAAY;gBAG5C,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,aAAa,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAkBrE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,YAAY,CAAC;IAmExB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,EAChC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAyBpC;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,YAAY,CAAC;IA4CxB;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,YAAY,CAAC;IA8NxB;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAmCnE;;;OAGG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAsBrE;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC;IAuBxB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,YAAY,CAAC;IAoCxB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAW3D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC;IAmBlB,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7D"}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.AdtDomain = void 0;
|
|
23
23
|
const internalUtils_1 = require("../../utils/internalUtils");
|
|
24
|
+
const LockRegistry_1 = require("../shared/LockRegistry");
|
|
24
25
|
const versions_1 = require("../shared/versions");
|
|
25
26
|
const activation_1 = require("./activation");
|
|
26
27
|
const check_1 = require("./check");
|
|
@@ -35,11 +36,13 @@ class AdtDomain {
|
|
|
35
36
|
connection;
|
|
36
37
|
logger;
|
|
37
38
|
systemContext;
|
|
39
|
+
lockTracker;
|
|
38
40
|
objectType = 'Domain';
|
|
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, (domainName, lockHandle) => (0, unlock_1.unlockDomain)(this.connection, domainName, lockHandle));
|
|
43
46
|
}
|
|
44
47
|
/**
|
|
45
48
|
* Validate domain configuration before creation
|
|
@@ -230,6 +233,7 @@ class AdtDomain {
|
|
|
230
233
|
this.connection.setSessionType('stateful');
|
|
231
234
|
lockHandle = await (0, lock_1.lockDomain)(this.connection, config.domainName);
|
|
232
235
|
state.lockHandle = lockHandle;
|
|
236
|
+
this.lockTracker.track(config.domainName, lockHandle);
|
|
233
237
|
this.logger?.info?.('locked');
|
|
234
238
|
// 2. Check inactive with XML for update (if provided)
|
|
235
239
|
const xmlToCheck = options?.xmlContent;
|
|
@@ -280,6 +284,7 @@ class AdtDomain {
|
|
|
280
284
|
const unlockResponse = await (0, unlock_1.unlockDomain)(this.connection, config.domainName, lockHandle);
|
|
281
285
|
state.unlockResult = unlockResponse;
|
|
282
286
|
this.connection.setSessionType('stateless');
|
|
287
|
+
this.lockTracker.untrack(config.domainName);
|
|
283
288
|
lockHandle = undefined;
|
|
284
289
|
this.logger?.info?.('unlocked');
|
|
285
290
|
}
|
|
@@ -323,8 +328,11 @@ class AdtDomain {
|
|
|
323
328
|
this.connection.setSessionType('stateful');
|
|
324
329
|
await (0, unlock_1.unlockDomain)(this.connection, config.domainName, lockHandle);
|
|
325
330
|
this.connection.setSessionType('stateless');
|
|
331
|
+
this.lockTracker.untrack(config.domainName);
|
|
326
332
|
}
|
|
327
333
|
catch (unlockError) {
|
|
334
|
+
// Cleanup unlock failed — the lock stays tracked so unlockAll() (or
|
|
335
|
+
// session-drop) remains the last resort.
|
|
328
336
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
329
337
|
}
|
|
330
338
|
}
|
|
@@ -462,6 +470,7 @@ class AdtDomain {
|
|
|
462
470
|
}
|
|
463
471
|
this.connection.setSessionType('stateful');
|
|
464
472
|
const lockHandle = await (0, lock_1.lockDomain)(this.connection, config.domainName);
|
|
473
|
+
this.lockTracker.track(config.domainName, lockHandle);
|
|
465
474
|
return lockHandle;
|
|
466
475
|
}
|
|
467
476
|
/**
|
|
@@ -474,6 +483,7 @@ class AdtDomain {
|
|
|
474
483
|
this.connection.setSessionType('stateful');
|
|
475
484
|
const result = await (0, unlock_1.unlockDomain)(this.connection, config.domainName, lockHandle);
|
|
476
485
|
this.connection.setSessionType('stateless');
|
|
486
|
+
this.lockTracker.untrack(config.domainName);
|
|
477
487
|
return {
|
|
478
488
|
unlockResult: result,
|
|
479
489
|
errors: [],
|