@mcp-abap-adt/adt-clients 7.3.1 → 7.4.2
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 +11 -2
- 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 +14 -3
- 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 +11 -2
- 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 +6 -3
- 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 +16 -3
- 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 +11 -2
- 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 +35 -4
- 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 +14 -2
- 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 +33 -3
- 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 +27 -2
- 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 +11 -2
- package/dist/core/messageClass/AdtMessageClass.d.ts +3 -1
- package/dist/core/messageClass/AdtMessageClass.d.ts.map +1 -1
- package/dist/core/messageClass/AdtMessageClass.js +11 -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 +11 -2
- 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 +11 -2
- 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 +6 -3
- package/dist/core/serviceDefinition/AdtServiceDefinition.d.ts.map +1 -1
- package/dist/core/serviceDefinition/AdtServiceDefinition.js +14 -4
- 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 +11 -2
- 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 +11 -2
- 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 +11 -2
- 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)
|
|
@@ -232,10 +236,11 @@ class AdtAuthorizationField {
|
|
|
232
236
|
this.logger?.info?.('Step 3: Updating authorization field');
|
|
233
237
|
await (0, update_1.updateAuthorizationField)(this.connection, params, lockHandle, this.logger);
|
|
234
238
|
this.logger?.info?.('Authorization field updated');
|
|
239
|
+
// Poll the inactive version: the write above produced it; the active version may not exist yet.
|
|
235
240
|
// 3.5. Read with long polling to ensure object is ready after update
|
|
236
241
|
this.logger?.info?.('read (wait for object ready after update)');
|
|
237
242
|
try {
|
|
238
|
-
await this.read({ authorizationFieldName: fullConfig.authorizationFieldName }, '
|
|
243
|
+
await this.read({ authorizationFieldName: fullConfig.authorizationFieldName }, 'inactive', { withLongPolling: true });
|
|
239
244
|
this.logger?.info?.('object is ready after update');
|
|
240
245
|
}
|
|
241
246
|
catch (readError) {
|
|
@@ -246,6 +251,7 @@ class AdtAuthorizationField {
|
|
|
246
251
|
this.connection.setSessionType('stateful');
|
|
247
252
|
await (0, unlock_1.unlockAuthorizationField)(this.connection, fullConfig.authorizationFieldName, lockHandle);
|
|
248
253
|
this.connection.setSessionType('stateless');
|
|
254
|
+
this.lockTracker.untrack(fullConfig.authorizationFieldName);
|
|
249
255
|
lockHandle = undefined;
|
|
250
256
|
this.logger?.info?.('Authorization field unlocked');
|
|
251
257
|
// 5. Final check
|
|
@@ -271,7 +277,9 @@ class AdtAuthorizationField {
|
|
|
271
277
|
}
|
|
272
278
|
}
|
|
273
279
|
else {
|
|
274
|
-
|
|
280
|
+
// No activation happened: return the version just written (inactive),
|
|
281
|
+
// not the stale active one.
|
|
282
|
+
const readResponse = await (0, read_1.readAuthorizationField)(this.connection, fullConfig.authorizationFieldName, 'inactive');
|
|
275
283
|
state.readResult = readResponse;
|
|
276
284
|
}
|
|
277
285
|
return state;
|
|
@@ -285,6 +293,7 @@ class AdtAuthorizationField {
|
|
|
285
293
|
this.connection.setSessionType('stateful');
|
|
286
294
|
await (0, unlock_1.unlockAuthorizationField)(this.connection, fullConfig.authorizationFieldName, lockHandle);
|
|
287
295
|
this.connection.setSessionType('stateless');
|
|
296
|
+
this.lockTracker.untrack(fullConfig.authorizationFieldName);
|
|
288
297
|
}
|
|
289
298
|
catch (unlockError) {
|
|
290
299
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -380,6 +389,7 @@ class AdtAuthorizationField {
|
|
|
380
389
|
}
|
|
381
390
|
this.connection.setSessionType('stateful');
|
|
382
391
|
const lockHandle = await (0, lock_1.lockAuthorizationField)(this.connection, config.authorizationFieldName, this.logger);
|
|
392
|
+
this.lockTracker.track(config.authorizationFieldName, lockHandle);
|
|
383
393
|
return lockHandle;
|
|
384
394
|
}
|
|
385
395
|
/**
|
|
@@ -392,6 +402,7 @@ class AdtAuthorizationField {
|
|
|
392
402
|
this.connection.setSessionType('stateful');
|
|
393
403
|
await (0, unlock_1.unlockAuthorizationField)(this.connection, config.authorizationFieldName, lockHandle);
|
|
394
404
|
this.connection.setSessionType('stateless');
|
|
405
|
+
this.lockTracker.untrack(config.authorizationFieldName);
|
|
395
406
|
return { errors: [] };
|
|
396
407
|
}
|
|
397
408
|
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;IAwMpC;;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;
|
|
@@ -299,10 +303,11 @@ class AdtBehaviorDefinition {
|
|
|
299
303
|
});
|
|
300
304
|
state.updateResult = updateResponse;
|
|
301
305
|
this.logger?.info?.('Behavior definition updated');
|
|
306
|
+
// Poll the inactive version: the write above produced it; the active version may not exist yet.
|
|
302
307
|
// 3.5. Read with long polling (wait for object to be ready after update)
|
|
303
308
|
this.logger?.info?.('read (wait for object ready after update)');
|
|
304
309
|
try {
|
|
305
|
-
await this.read({ name: config.name }, '
|
|
310
|
+
await this.read({ name: config.name }, 'inactive', {
|
|
306
311
|
withLongPolling: true,
|
|
307
312
|
});
|
|
308
313
|
this.logger?.info?.('object is ready after update');
|
|
@@ -319,6 +324,7 @@ class AdtBehaviorDefinition {
|
|
|
319
324
|
const unlockResponse = await (0, unlock_1.unlock)(this.connection, config.name, lockHandle);
|
|
320
325
|
state.unlockResult = unlockResponse;
|
|
321
326
|
this.connection.setSessionType('stateless');
|
|
327
|
+
this.lockTracker.untrack(config.name);
|
|
322
328
|
lockHandle = undefined;
|
|
323
329
|
this.logger?.info?.('Behavior definition unlocked');
|
|
324
330
|
}
|
|
@@ -360,6 +366,7 @@ class AdtBehaviorDefinition {
|
|
|
360
366
|
this.connection.setSessionType('stateful');
|
|
361
367
|
await (0, unlock_1.unlock)(this.connection, config.name, lockHandle);
|
|
362
368
|
this.connection.setSessionType('stateless');
|
|
369
|
+
this.lockTracker.untrack(config.name);
|
|
363
370
|
}
|
|
364
371
|
catch (unlockError) {
|
|
365
372
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -476,6 +483,7 @@ class AdtBehaviorDefinition {
|
|
|
476
483
|
}
|
|
477
484
|
this.connection.setSessionType('stateful');
|
|
478
485
|
const lockHandle = await (0, lock_1.lock)(this.connection, config.name);
|
|
486
|
+
this.lockTracker.track(config.name, lockHandle);
|
|
479
487
|
return lockHandle;
|
|
480
488
|
}
|
|
481
489
|
/**
|
|
@@ -488,6 +496,7 @@ class AdtBehaviorDefinition {
|
|
|
488
496
|
this.connection.setSessionType('stateful');
|
|
489
497
|
const result = await (0, unlock_1.unlock)(this.connection, config.name, lockHandle);
|
|
490
498
|
this.connection.setSessionType('stateless');
|
|
499
|
+
this.lockTracker.untrack(config.name);
|
|
491
500
|
return {
|
|
492
501
|
unlockResult: result,
|
|
493
502
|
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;IAkPxC;;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
|
|
@@ -283,10 +285,11 @@ ENDCLASS.`;
|
|
|
283
285
|
const updateResponse = await (0, update_2.updateBehaviorImplementation)(this.connection, config.className, codeToCheck, lockHandle, config.transportRequest);
|
|
284
286
|
state.updateResult = updateResponse;
|
|
285
287
|
this.logger?.info?.('Behavior implementation implementations include updated');
|
|
288
|
+
// Poll the inactive version: the write above produced it; the active version may not exist yet.
|
|
286
289
|
// 5.5. Read with long polling (wait for object to be ready after update)
|
|
287
290
|
this.logger?.info?.('read (wait for object ready after update)');
|
|
288
291
|
try {
|
|
289
|
-
await this.read({ className: config.className }, '
|
|
292
|
+
await this.read({ className: config.className }, 'inactive', {
|
|
290
293
|
withLongPolling: true,
|
|
291
294
|
});
|
|
292
295
|
this.logger?.info?.('object is ready after update');
|
|
@@ -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":"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"}
|
|
@@ -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;
|
|
@@ -294,10 +298,11 @@ class AdtClass {
|
|
|
294
298
|
this.logger?.info?.('Step 3: Updating class');
|
|
295
299
|
state.updateResult = await (0, update_1.updateClass)(this.connection, config.className, codeToCheck, lockHandle, config.transportRequest, this.contentTypes?.sourceArtifactContentType());
|
|
296
300
|
this.logger?.info?.('Class updated');
|
|
301
|
+
// Poll the inactive version: the write above produced it; the active version may not exist yet.
|
|
297
302
|
// 3.5. Read with long polling to ensure object is ready after update
|
|
298
303
|
this.logger?.info?.('read (wait for object ready after update)');
|
|
299
304
|
try {
|
|
300
|
-
await this.read({ className: config.className }, '
|
|
305
|
+
await this.read({ className: config.className }, 'inactive', {
|
|
301
306
|
withLongPolling: true,
|
|
302
307
|
});
|
|
303
308
|
this.logger?.info?.('object is ready after update');
|
|
@@ -313,6 +318,7 @@ class AdtClass {
|
|
|
313
318
|
this.connection.setSessionType('stateful');
|
|
314
319
|
state.unlockResult = await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
|
|
315
320
|
this.connection.setSessionType('stateless');
|
|
321
|
+
this.lockTracker.untrack(config.className);
|
|
316
322
|
lockHandle = undefined;
|
|
317
323
|
this.logger?.info?.('Class unlocked');
|
|
318
324
|
}
|
|
@@ -350,6 +356,7 @@ class AdtClass {
|
|
|
350
356
|
this.connection.setSessionType('stateful');
|
|
351
357
|
await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
|
|
352
358
|
this.connection.setSessionType('stateless');
|
|
359
|
+
this.lockTracker.untrack(config.className);
|
|
353
360
|
}
|
|
354
361
|
catch (unlockError) {
|
|
355
362
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -538,7 +545,9 @@ class AdtClass {
|
|
|
538
545
|
// is only valid inside stateful requests, so a stateless write between lock
|
|
539
546
|
// and unlock fails with 423.
|
|
540
547
|
this.connection.setSessionType('stateful');
|
|
541
|
-
|
|
548
|
+
const lockHandle = await (0, lock_1.lockClass)(this.connection, config.className);
|
|
549
|
+
this.lockTracker.track(config.className, lockHandle);
|
|
550
|
+
return lockHandle;
|
|
542
551
|
}
|
|
543
552
|
/**
|
|
544
553
|
* Unlock class
|
|
@@ -550,6 +559,7 @@ class AdtClass {
|
|
|
550
559
|
this.connection.setSessionType('stateful');
|
|
551
560
|
const result = await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
|
|
552
561
|
this.connection.setSessionType('stateless');
|
|
562
|
+
this.lockTracker.untrack(config.className);
|
|
553
563
|
return {
|
|
554
564
|
unlockResult: result,
|
|
555
565
|
errors: [],
|
|
@@ -611,6 +621,7 @@ class AdtClass {
|
|
|
611
621
|
this.logger?.info?.('Step 1: Locking parent class');
|
|
612
622
|
this.connection.setSessionType('stateful');
|
|
613
623
|
lockHandle = await (0, lock_1.lockClass)(this.connection, config.className);
|
|
624
|
+
this.lockTracker.track(config.className, lockHandle);
|
|
614
625
|
this.logger?.info?.('Parent class locked, handle:', lockHandle);
|
|
615
626
|
// 2. Update test classes (uses parent class lock handle)
|
|
616
627
|
this.logger?.info?.('Step 2: Updating test classes');
|
|
@@ -620,6 +631,7 @@ class AdtClass {
|
|
|
620
631
|
this.connection.setSessionType('stateful');
|
|
621
632
|
await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
|
|
622
633
|
this.connection.setSessionType('stateless');
|
|
634
|
+
this.lockTracker.untrack(config.className);
|
|
623
635
|
lockHandle = undefined;
|
|
624
636
|
return response;
|
|
625
637
|
}
|
|
@@ -631,6 +643,7 @@ class AdtClass {
|
|
|
631
643
|
this.connection.setSessionType('stateful');
|
|
632
644
|
await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
|
|
633
645
|
this.connection.setSessionType('stateless');
|
|
646
|
+
this.lockTracker.untrack(config.className);
|
|
634
647
|
}
|
|
635
648
|
catch (unlockError) {
|
|
636
649
|
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;IAuMrB;;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;
|
|
@@ -251,10 +255,11 @@ class AdtDdl {
|
|
|
251
255
|
this.logger?.info?.('Step 3: Updating view');
|
|
252
256
|
await (0, update_1.updateDdl)(this.connection, config.ddlName, codeToCheck, lockHandle, config.transportRequest);
|
|
253
257
|
this.logger?.info?.('View updated');
|
|
258
|
+
// Poll the inactive version: the write above produced it; the active version may not exist yet.
|
|
254
259
|
// 3.5. Read with long polling to ensure object is ready after update
|
|
255
260
|
this.logger?.info?.('read (wait for object ready after update)');
|
|
256
261
|
try {
|
|
257
|
-
await this.read({ ddlName: config.ddlName }, '
|
|
262
|
+
await this.read({ ddlName: config.ddlName }, 'inactive', {
|
|
258
263
|
withLongPolling: true,
|
|
259
264
|
});
|
|
260
265
|
this.logger?.info?.('object is ready after update');
|
|
@@ -270,6 +275,7 @@ class AdtDdl {
|
|
|
270
275
|
this.connection.setSessionType('stateful');
|
|
271
276
|
await (0, unlock_1.unlockDDLS)(this.connection, config.ddlName, lockHandle);
|
|
272
277
|
this.connection.setSessionType('stateless');
|
|
278
|
+
this.lockTracker.untrack(config.ddlName);
|
|
273
279
|
lockHandle = undefined;
|
|
274
280
|
this.logger?.info?.('View unlocked');
|
|
275
281
|
}
|
|
@@ -321,6 +327,7 @@ class AdtDdl {
|
|
|
321
327
|
this.connection.setSessionType('stateful');
|
|
322
328
|
await (0, unlock_1.unlockDDLS)(this.connection, config.ddlName, lockHandle);
|
|
323
329
|
this.connection.setSessionType('stateless');
|
|
330
|
+
this.lockTracker.untrack(config.ddlName);
|
|
324
331
|
}
|
|
325
332
|
catch (unlockError) {
|
|
326
333
|
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
@@ -424,6 +431,7 @@ class AdtDdl {
|
|
|
424
431
|
}
|
|
425
432
|
this.connection.setSessionType('stateful');
|
|
426
433
|
const lockHandle = await (0, lock_1.lockDDLS)(this.connection, config.ddlName);
|
|
434
|
+
this.lockTracker.track(config.ddlName, lockHandle);
|
|
427
435
|
return lockHandle;
|
|
428
436
|
}
|
|
429
437
|
/**
|
|
@@ -436,6 +444,7 @@ class AdtDdl {
|
|
|
436
444
|
this.connection.setSessionType('stateful');
|
|
437
445
|
const result = await (0, unlock_1.unlockDDLS)(this.connection, config.ddlName, lockHandle);
|
|
438
446
|
this.connection.setSessionType('stateless');
|
|
447
|
+
this.lockTracker.untrack(config.ddlName);
|
|
439
448
|
return {
|
|
440
449
|
unlockResult: result,
|
|
441
450
|
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"}
|