From 571faf6dc3ce01258cfe3b5c861ba46efd75116b Mon Sep 17 00:00:00 2001 From: kshitij79 Date: Mon, 18 Mar 2024 16:09:28 -0400 Subject: [PATCH 1/3] fix(jsonpopulator) Updated processMapType to handle nested abstract classes - I769 Signed-off-by: kshitij79 --- .../concerto-core/lib/serializer/jsonpopulator.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/concerto-core/lib/serializer/jsonpopulator.js b/packages/concerto-core/lib/serializer/jsonpopulator.js index 891bf9c37..5ca8781e3 100644 --- a/packages/concerto-core/lib/serializer/jsonpopulator.js +++ b/packages/concerto-core/lib/serializer/jsonpopulator.js @@ -211,9 +211,18 @@ class JSONPopulator { * @private */ processMapType(mapDeclaration, parameters, value, type) { - let decl = mapDeclaration.getModelFile() - .getAllDeclarations() - .find(decl => decl.name === type); + let decl; + if (value && typeof value === 'object' && value.$class) { + // Use the $class property to find the class declaration + decl = mapDeclaration.getModelFile() + .getAllDeclarations() + .find(decl => decl.getFullyQualifiedName() === value.$class); + } else { + // Fallback to the original type lookup if value is not an object or doesn't have $class + decl = mapDeclaration.getModelFile() + .getAllDeclarations() + .find(decl => decl.name === type); + } // if its a ClassDeclaration, populate the Concept. if (decl?.isClassDeclaration()) { From 85e5949085882428c75bee35f4233a12ce66566b Mon Sep 17 00:00:00 2001 From: kshitij79 Date: Wed, 20 Mar 2024 19:01:11 -0400 Subject: [PATCH 2/3] fix(jsonpopulator) Added test case for abstract object - I769 Signed-off-by: kshitij79 --- .../test/serializer/jsonpopulator.js | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/packages/concerto-core/test/serializer/jsonpopulator.js b/packages/concerto-core/test/serializer/jsonpopulator.js index e7ddc8a38..cfedf6e45 100644 --- a/packages/concerto-core/test/serializer/jsonpopulator.js +++ b/packages/concerto-core/test/serializer/jsonpopulator.js @@ -75,6 +75,20 @@ describe('JSONPopulator', () => { o String assetId } `); + modelManager.addCTOModel(` + namespace org.acme.abstract + abstract asset Asset3 { + o String assetId + } + asset Asset4 extends Asset3 {} + map AssetByName { + o String + o Asset3 + } + concept MyContainerAsset3 { + o AssetByName assetByName + } + `); assetDeclaration1 = modelManager.getType('org.acme.MyContainerAsset1').getProperty('myAsset'); relationshipDeclaration1 = modelManager.getType('org.acme.MyTx1').getProperty('myAsset'); relationshipDeclaration2 = modelManager.getType('org.acme.MyTx2').getProperty('myAssets'); @@ -479,6 +493,29 @@ describe('JSONPopulator', () => { jsonPopulator.visit(modelManager.getType('org.acme.MyContainerAsset2'), options); }).should.throw(/Expected value at path `\$.rootObj.myAssets\[0\].assetValue` to be of type `Integer`/); }); + + it('should be able to deserialise a map that uses abstract types as values', () => { + let options = { + jsonStack: new TypedStack({ + $class: 'org.acme.abstract.MyContainerAsset3', + assetByName: { + 'asset3': { + $class: 'org.acme.abstract.Asset4' + } + } + }), + resourceStack: new TypedStack({}), + factory: mockFactory, + modelManager: modelManager + }; + + let mockResource1 = sinon.createStubInstance(Resource); + mockFactory.newResource.withArgs('org.acme.abstract', 'MyAsset4', 'asset3').returns(mockResource1); + (() => { + jsonPopulator.visit(modelManager.getType('org.acme.abstract.MyContainerAsset3'), options); + }).should.not.throw(); + }); + }); describe('#visitField', () => { From 0de44ea8078fe24a831e60d5cd9b9d2c48faa1e9 Mon Sep 17 00:00:00 2001 From: kshitij79 Date: Mon, 25 Mar 2024 16:31:16 -0400 Subject: [PATCH 3/3] removed trailing spaces Signed-off-by: kshitij79 --- packages/concerto-core/test/serializer/jsonpopulator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/concerto-core/test/serializer/jsonpopulator.js b/packages/concerto-core/test/serializer/jsonpopulator.js index cfedf6e45..89e22c36c 100644 --- a/packages/concerto-core/test/serializer/jsonpopulator.js +++ b/packages/concerto-core/test/serializer/jsonpopulator.js @@ -494,7 +494,7 @@ describe('JSONPopulator', () => { }).should.throw(/Expected value at path `\$.rootObj.myAssets\[0\].assetValue` to be of type `Integer`/); }); - it('should be able to deserialise a map that uses abstract types as values', () => { + it('should be able to deserialise a map that uses abstract types as values', () => { let options = { jsonStack: new TypedStack({ $class: 'org.acme.abstract.MyContainerAsset3',