From 11ac93dd34727a963a474c5f9001111534d0d4d2 Mon Sep 17 00:00:00 2001 From: Loose Date: Mon, 15 Apr 2024 16:00:01 -0300 Subject: [PATCH 1/3] W-15510077 - Fix false positive error with 2.3 components --- .../parser/context/syntax/Async23Syntax.scala | 4 +++ .../document/OasLikeDeclarationsHelper.scala | 34 +++++++++++-------- .../validations/async-2.3-components.yaml | 18 ++++++++++ .../validations/async-2.4-components.yaml | 34 +++++++++++++++++++ ...c20UniquePlatformUnitValidationsTest.scala | 8 +++++ 5 files changed, 84 insertions(+), 14 deletions(-) create mode 100644 amf-cli/shared/src/test/resources/validations/async20/validations/async-2.3-components.yaml create mode 100644 amf-cli/shared/src/test/resources/validations/async20/validations/async-2.4-components.yaml diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/context/syntax/Async23Syntax.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/context/syntax/Async23Syntax.scala index 2d7e89206c..fc8fc0282a 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/context/syntax/Async23Syntax.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/context/syntax/Async23Syntax.scala @@ -8,6 +8,10 @@ object Async23Syntax extends SpecSyntax { add( Async22Syntax.nodes, "bindings" -> Set(Solace), + "components" -> Set( + "servers", + "channels" + ), "SolaceServerBinding" -> Set( "msgVpn", "bindingVersion" diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/oas/parser/document/OasLikeDeclarationsHelper.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/oas/parser/document/OasLikeDeclarationsHelper.scala index 1a93b02a9d..66a801f3fe 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/oas/parser/document/OasLikeDeclarationsHelper.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/oas/parser/document/OasLikeDeclarationsHelper.scala @@ -1,9 +1,10 @@ package amf.apicontract.internal.spec.oas.parser.document import amf.aml.internal.parse.common.DeclarationKeyCollector +import amf.apicontract.client.scala.model.domain.EndPoint import amf.apicontract.internal.spec.oas.parser.context.OasLikeWebApiContext import amf.apicontract.internal.validation.definitions.ParserSideValidations -import amf.core.client.scala.model.domain.NamedDomainElement +import amf.core.client.scala.model.domain.{DomainElement, NamedDomainElement} import amf.shapes.client.scala.model.domain.AnyShape import amf.shapes.internal.spec.common.parser.TypeDeclarationParser import org.yaml.model.YMap @@ -27,20 +28,20 @@ trait OasLikeDeclarationsHelper { def validateNames()(implicit ctx: OasLikeWebApiContext): Unit = { val declarations = ctx.declarations.declarables() val keyRegex = """^[a-zA-Z0-9\.\-_]+$""".r - declarations.foreach { - case elem: NamedDomainElement => - elem.name.option() match { - case Some(name) => - if (!keyRegex.pattern.matcher(name).matches()) - violation( - elem, - s"Name $name does not match regular expression ${keyRegex.toString()} for component declarations" - ) - case None => - violation(elem, "No name is defined for given component declaration") - } - case _ => + declarations.foreach { case elem: NamedDomainElement => + elem.name.option() match { + case Some(name) => + if (!keyRegex.pattern.matcher(name).matches()) + violation( + elem, + s"Name $name does not match regular expression ${keyRegex.toString()} for component declarations" + ) + case None if !allowedNoNameDeclarations(elem) => + violation(elem, "No name is defined for given component declaration") + case _ => // Nothing to do + } } + def violation(elem: NamedDomainElement, msg: String): Unit = { ctx.eh.violation( ParserSideValidations.InvalidFieldNameInComponents, @@ -50,4 +51,9 @@ trait OasLikeDeclarationsHelper { ) } } + + private def allowedNoNameDeclarations(declaration: DomainElement): Boolean = declaration match { + case _: EndPoint => true + case _ => false + } } diff --git a/amf-cli/shared/src/test/resources/validations/async20/validations/async-2.3-components.yaml b/amf-cli/shared/src/test/resources/validations/async20/validations/async-2.3-components.yaml new file mode 100644 index 0000000000..85c773e322 --- /dev/null +++ b/amf-cli/shared/src/test/resources/validations/async20/validations/async-2.3-components.yaml @@ -0,0 +1,18 @@ +asyncapi: 2.3.0 +info: + title: components-2.3 + version: 1.0.0 +components: + servers: + myserver: + url: http://localhost:5000/ws + protocol: ws + channels: + myChannel: + description: mychannel +servers: + production: + $ref: "#/components/servers/myserver" +channels: + some/events: + $ref: "#/components/channels/myChannel" \ No newline at end of file diff --git a/amf-cli/shared/src/test/resources/validations/async20/validations/async-2.4-components.yaml b/amf-cli/shared/src/test/resources/validations/async20/validations/async-2.4-components.yaml new file mode 100644 index 0000000000..884c7799cd --- /dev/null +++ b/amf-cli/shared/src/test/resources/validations/async20/validations/async-2.4-components.yaml @@ -0,0 +1,34 @@ +asyncapi: 2.4.0 +info: + title: components-2.4 + version: 1.0.0 +components: + servers: + myserver: + url: http://localhost:5000/ws + protocol: ws + channels: + myChannel: + description: mychannel + serverVariables: + environment: + default: dev-api + description: Development API environment + version: + default: v2 + description: Development API version +servers: + production: + $ref: "#/components/servers/myserver" + development: + url: https://{environment}.example.com/{version} + description: Development server using referenced server variables. + protocol: https + variables: + environment: + $ref: "#/components/serverVariables/environment" + version: + $ref: "#/components/serverVariables/version" +channels: + some/events: + $ref: "#/components/channels/myChannel" \ No newline at end of file diff --git a/amf-cli/shared/src/test/scala/amf/validation/Async20UniquePlatformUnitValidationsTest.scala b/amf-cli/shared/src/test/scala/amf/validation/Async20UniquePlatformUnitValidationsTest.scala index 78118cf851..aa444b3100 100644 --- a/amf-cli/shared/src/test/scala/amf/validation/Async20UniquePlatformUnitValidationsTest.scala +++ b/amf-cli/shared/src/test/scala/amf/validation/Async20UniquePlatformUnitValidationsTest.scala @@ -407,4 +407,12 @@ class Async20UniquePlatformUnitValidationsTest extends UniquePlatformReportGenTe test("Async 2.1+ IBMMQ validations all valid") { validate("ibmmq-binding-validations-valid.yaml", Some("ibmmq-binding-validations-valid.report")) } + + test("Async 2.3+ Components") { + validate("async-2.3-components.yaml") + } + + test("Async 2.4+ Components") { + validate("async-2.4-components.yaml") + } } From d739cecb6707796376d2390e6e668e43c164ddd1 Mon Sep 17 00:00:00 2001 From: Loose Date: Mon, 15 Apr 2024 18:03:59 -0300 Subject: [PATCH 2/3] W-15510077 - Fix inter-component reference with message. Handler ErrorMessage with specific type (to avoid ClassCastException) --- .../parser/domain/Async2MessageParser.scala | 50 ++++++++++--------- .../Async20DeclarationParser.scala | 9 +++- .../Async23DeclarationParser.scala | 10 +++- .../Async24DeclarationParser.scala | 18 +++++-- .../declarations/AsyncDeclarationParser.scala | 5 ++ .../validations/message-references.yaml | 28 +++++++++++ ...c20UniquePlatformUnitValidationsTest.scala | 4 ++ 7 files changed, 92 insertions(+), 32 deletions(-) create mode 100644 amf-cli/shared/src/test/resources/validations/async20/validations/message-references.yaml diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/Async2MessageParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/Async2MessageParser.scala index 7920ad713d..388a90075b 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/Async2MessageParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/Async2MessageParser.scala @@ -5,11 +5,10 @@ import amf.apicontract.client.scala.model.domain.{Message, Payload, Request, Res import amf.apicontract.internal.annotations.ExampleIndex import amf.apicontract.internal.metamodel.domain.MessageModel.IsAbstract import amf.apicontract.internal.metamodel.domain.{MessageModel, OperationModel, PayloadModel} -import amf.apicontract.internal.spec.async.emitters.domain.MessageExamplePair import amf.apicontract.internal.spec.async.parser.bindings.AsyncMessageBindingsParser -import amf.apicontract.internal.spec.async.parser.context.{Async2WebApiContext, AsyncWebApiContext} +import amf.apicontract.internal.spec.async.parser.context.AsyncWebApiContext import amf.apicontract.internal.spec.async.{MessageType, Publish, Subscribe} -import amf.apicontract.internal.spec.common.WebApiDeclarations.ErrorMessage +import amf.apicontract.internal.spec.common.WebApiDeclarations.{ErrorMessage, ErrorRequest, ErrorResponse} import amf.apicontract.internal.spec.common.parser.SpecParserOps import amf.apicontract.internal.spec.oas.parser.domain import amf.apicontract.internal.spec.spec.OasDefinitions @@ -26,7 +25,6 @@ import amf.shapes.internal.domain.resolution.ExampleTracking.tracking import amf.shapes.internal.spec.common.JSONSchemaDraft7SchemaVersion import amf.shapes.internal.spec.common.parser._ import org.yaml.model.{YMap, YMapEntry, YNode, YSequence} -import amf.apicontract.internal.validation.definitions.ParserSideValidations.DuplicatedMessageId trait AsyncMessageParser { def parse(): Message @@ -35,7 +33,7 @@ trait AsyncMessageParser { object Async20MessageParser { def apply(entryLike: YMapEntryLike, parent: String, messageType: Option[MessageType], isTrait: Boolean = false)( - implicit ctx: AsyncWebApiContext + implicit ctx: AsyncWebApiContext ): AsyncMessageParser = { val populator = if (isTrait) Async20MessageTraitPopulator() else Async20ConcreteMessagePopulator(parent) val finder = if (isTrait) MessageTraitFinder() else MessageFinder() @@ -45,7 +43,7 @@ object Async20MessageParser { object Async21MessageParser { def apply(entryLike: YMapEntryLike, parent: String, messageType: Option[MessageType], isTrait: Boolean = false)( - implicit ctx: AsyncWebApiContext + implicit ctx: AsyncWebApiContext ): AsyncMessageParser = { val populator = if (isTrait) Async21MessageTraitPopulator() else Async21ConcreteMessagePopulator(parent) val finder = if (isTrait) MessageTraitFinder() else MessageFinder() @@ -64,15 +62,15 @@ object Async24MessageParser { } class Async20MessageParser( - entryLike: YMapEntryLike, - parent: String, - messageType: Option[MessageType], - populator: Async2MessagePopulator, - finder: Finder[Message], - isTrait: Boolean -)(implicit val ctx: AsyncWebApiContext) - extends AsyncMessageParser - with SpecParserOps { + entryLike: YMapEntryLike, + parent: String, + messageType: Option[MessageType], + populator: Async2MessagePopulator, + finder: Finder[Message], + isTrait: Boolean + )(implicit val ctx: AsyncWebApiContext) + extends AsyncMessageParser + with SpecParserOps { def parse(): Message = { val map: YMap = entryLike.asMap @@ -92,6 +90,12 @@ class Async20MessageParser( case None => Message(annotations) } + private def buildErrorMessage(fullRef: String): Message = messageType match { + case Some(Publish) => ErrorRequest(fullRef, entryLike.asMap) + case Some(Subscribe) => ErrorResponse(fullRef, entryLike.asMap) + case None => new ErrorMessage(fullRef, entryLike.asMap, isTrait) + } + def nameAndAdopt(m: Message, key: Option[YNode]): Message = { key foreach { k => m.setWithoutId(MessageModel.Name, ScalarNode(k).string(), Annotations(k)) @@ -121,7 +125,7 @@ class Async20MessageParser( s"Cannot find link reference $fullRef", Annotations(entryLike.asMap) ) - val errorMessage = new ErrorMessage(fullRef, entryLike.asMap, isTrait) + val errorMessage = buildErrorMessage(fullRef) nameAndAdopt(errorMessage.link(fullRef, errorMessage.annotations), entryLike.key) } } @@ -138,7 +142,7 @@ class Async20MessageParser( } case class AsyncMultipleMessageParser(map: YMap, parent: String, messageType: MessageType)(implicit - val ctx: AsyncWebApiContext + val ctx: AsyncWebApiContext ) { def parse(): List[Message] = { map.key("oneOf") match { @@ -321,10 +325,10 @@ abstract class Async24MessagePopulator()(implicit ctx: AsyncWebApiContext) exten super.populate(map, message) map.key("messageId").foreach { entry => val messageId = entry.value.toString() - if (!ctx.registerMessageId(messageId)) - ctx.eh.violation( - ParserSideValidations.DuplicatedMessageId, message, s"Duplicated message id '$messageId'", entry.value.location - ) + if (!ctx.registerMessageId(messageId)) + ctx.eh.violation( + ParserSideValidations.DuplicatedMessageId, message, s"Duplicated message id '$messageId'", entry.value.location + ) parseMessageId(map, message) } message @@ -399,13 +403,13 @@ trait AsyncConcreteMessagePopulator { } case class Async21ConcreteMessagePopulator(parentId: String)(implicit ctx: AsyncWebApiContext) - extends Async21MessagePopulator() with AsyncConcreteMessagePopulator { + extends Async21MessagePopulator() with AsyncConcreteMessagePopulator { override protected def parseTraits(map: YMap, message: Message): Unit = innerParseTrait(map, message, parentId) override protected def parseSchema(map: YMap, payload: Payload): Unit = innerParseSchema(map, payload) } case class Async20ConcreteMessagePopulator(parentId: String)(implicit ctx: AsyncWebApiContext) - extends Async20MessagePopulator() with AsyncConcreteMessagePopulator() { + extends Async20MessagePopulator() with AsyncConcreteMessagePopulator() { override protected def parseTraits(map: YMap, message: Message): Unit = innerParseTrait(map, message, parentId) diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async20DeclarationParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async20DeclarationParser.scala index e8594c959d..666406629a 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async20DeclarationParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async20DeclarationParser.scala @@ -43,6 +43,13 @@ case class Async20DeclarationParser() extends AsyncDeclarationParser with OasLik override def parseDeclarations(map: YMap, parent: String, document: Document)(implicit ctx: AsyncWebApiContext + ): Unit = { + this.parseOnlyDeclarations(map, parent, document) + addDeclarationsToModel(document) + } + + override def parseOnlyDeclarations(map: YMap, parent: String, document: Document)(implicit + ctx: AsyncWebApiContext ): Unit = { parseSecuritySchemeDeclarations(map, parent + "/securitySchemes") parseCorrelationIdDeclarations(map, parent + "/correlationIds") @@ -57,8 +64,6 @@ case class Async20DeclarationParser() extends AsyncDeclarationParser with OasLik parseMessageTraits(map, parent + "/messageTraits") parseMessageDeclarations(map, parent + "/messages") - - super.parseDeclarations(map, parent, document) } private def parseMessageDeclarations(componentsMap: YMap, parent: String)(implicit ctx: AsyncWebApiContext): Unit = diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async23DeclarationParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async23DeclarationParser.scala index e1d33af47c..2fa7eb768f 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async23DeclarationParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async23DeclarationParser.scala @@ -10,14 +10,20 @@ import amf.core.client.scala.model.document.Document import org.yaml.model.YMap object Async23DeclarationParser extends AsyncDeclarationParser { + override def parseDeclarations(map: YMap, parent: String, document: Document)(implicit ctx: AsyncWebApiContext ): Unit = { + this.parseOnlyDeclarations(map, parent, document) + addDeclarationsToModel(document) + } + override def parseOnlyDeclarations(map: YMap, parent: String, document: Document)(implicit + ctx: AsyncWebApiContext + ): Unit = { parseServerDeclarations(map, parent) + Async20DeclarationParser().parseOnlyDeclarations(map, parent, document) parseChannelDeclarations(map, parent) - - Async20DeclarationParser().parseDeclarations(map, parent, document) } private def parseServerDeclarations(componentsMap: YMap, parent: String)(implicit ctx: AsyncWebApiContext): Unit = diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async24DeclarationParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async24DeclarationParser.scala index e567175554..f12c94ca72 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async24DeclarationParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async24DeclarationParser.scala @@ -3,27 +3,35 @@ package amf.apicontract.internal.spec.async.parser.domain.declarations import amf.aml.internal.parse.common.DeclarationKey import amf.aml.internal.parse.dialects.DialectAstOps.DialectYMapOps import amf.apicontract.internal.spec.async.parser.context.AsyncWebApiContext -import amf.apicontract.internal.spec.async.parser.domain.{Async20ServerVariableParser, Async24ServerVariableParser} import amf.core.client.scala.model.document.Document import amf.core.internal.annotations.{DeclaredElement, DeclaredServerVariable} -import amf.shapes.internal.spec.common.parser.YMapEntryLike import org.yaml.model.YMap object Async24DeclarationParser extends AsyncDeclarationParser { + override def parseDeclarations(map: YMap, parent: String, document: Document)(implicit ctx: AsyncWebApiContext + ): Unit = { + this.parseOnlyDeclarations(map, parent, document) + addDeclarationsToModel(document) + } + + override def parseOnlyDeclarations(map: YMap, parent: String, document: Document)(implicit + ctx: AsyncWebApiContext ): Unit = { parseServerVariableDeclarations(map, parent) - Async23DeclarationParser.parseDeclarations(map, parent, document) + Async23DeclarationParser.parseOnlyDeclarations(map, parent, document) } - private def parseServerVariableDeclarations(componentsMap: YMap, parent: String)(implicit ctx: AsyncWebApiContext): Unit = + private def parseServerVariableDeclarations(componentsMap: YMap, parent: String)(implicit + ctx: AsyncWebApiContext + ): Unit = componentsMap.key( "serverVariables", entry => { addDeclarationKey(DeclarationKey(entry)) entry.value.as[YMap].entries.foreach { entry => - val serverVariable = ctx.factory.serverVariableParser(entry, parent).parse() + val serverVariable = ctx.factory.serverVariableParser(entry, parent).parse() serverVariable.add(DeclaredElement()) serverVariable.add(DeclaredServerVariable()) ctx.declarations += serverVariable diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/AsyncDeclarationParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/AsyncDeclarationParser.scala index f9729932ef..7ea4e7f825 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/AsyncDeclarationParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/AsyncDeclarationParser.scala @@ -9,4 +9,9 @@ trait AsyncDeclarationParser extends DeclarationKeyCollector { def parseDeclarations(map: YMap, parent: String, document: Document)(implicit ctx: AsyncWebApiContext): Unit = { addDeclarationsToModel(document) } + + // Parse the declarations but not add them to the model + def parseOnlyDeclarations(map: YMap, parent: String, document: Document)(implicit + ctx: AsyncWebApiContext + ): Unit } diff --git a/amf-cli/shared/src/test/resources/validations/async20/validations/message-references.yaml b/amf-cli/shared/src/test/resources/validations/async20/validations/message-references.yaml new file mode 100644 index 0000000000..e144b10d78 --- /dev/null +++ b/amf-cli/shared/src/test/resources/validations/async20/validations/message-references.yaml @@ -0,0 +1,28 @@ +asyncapi: "2.6.0" + +info: + title: Hello world application + version: "0.1.0" +defaultContentType: application/html + +channels: + refed: + $ref: "#/components/channels/hello-channel" + +components: + messages: + hello-msg: + summary: This is the summary of the hello message + description: This is the description + payload: + type: string + pattern: "^hello .+$" + examples: + - name: Hello example + summary: This is the only hello example + payload: "hello Kenobi" + channels: + hello-channel: + publish: + message: + $ref: "#/components/messages/hello-msg" \ No newline at end of file diff --git a/amf-cli/shared/src/test/scala/amf/validation/Async20UniquePlatformUnitValidationsTest.scala b/amf-cli/shared/src/test/scala/amf/validation/Async20UniquePlatformUnitValidationsTest.scala index aa444b3100..566a5bf7aa 100644 --- a/amf-cli/shared/src/test/scala/amf/validation/Async20UniquePlatformUnitValidationsTest.scala +++ b/amf-cli/shared/src/test/scala/amf/validation/Async20UniquePlatformUnitValidationsTest.scala @@ -415,4 +415,8 @@ class Async20UniquePlatformUnitValidationsTest extends UniquePlatformReportGenTe test("Async 2.4+ Components") { validate("async-2.4-components.yaml") } + + test("Async inter components references") { + validate("message-references.yaml") + } } From 82b6329130b69364677557b2022c57ac8f6fb4d8 Mon Sep 17 00:00:00 2001 From: Loose Date: Mon, 15 Apr 2024 19:03:29 -0300 Subject: [PATCH 3/3] W-15510077 - Fix generated null name in resolved references to Channels (Endpoints) --- .../spec/async/parser/domain/Async20EndpointParser.scala | 6 ++++-- .../stages/WebApiReferenceResolutionStage.scala | 4 +++- .../resolution/async20/async-2.3-components.expanded.jsonld | 5 ----- .../async20/async-2.3-components.flattened.jsonld | 1 - 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/Async20EndpointParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/Async20EndpointParser.scala index bac596b415..6b73b500eb 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/Async20EndpointParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/Async20EndpointParser.scala @@ -157,8 +157,10 @@ class Async23EndpointParser( } def nameAndAdopt(s: EndPoint, key: Option[YNode]): EndPoint = { - key foreach { k => - s.setWithoutId(EndPointModel.Name, ScalarNode(k).string(), Annotations(k)) + key match { + case Some(name) => + s.setWithoutId(EndPointModel.Name, ScalarNode(name).string(), Annotations(name)) + case None => // Nothing to do } s } diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/transformation/stages/WebApiReferenceResolutionStage.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/transformation/stages/WebApiReferenceResolutionStage.scala index 19250e71c8..14a4e62b4b 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/transformation/stages/WebApiReferenceResolutionStage.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/transformation/stages/WebApiReferenceResolutionStage.scala @@ -57,7 +57,9 @@ class WebApiReferenceResolutionStage(keepEditingInfo: Boolean = false) domain match { case channel: EndPoint => val copy = channel.copyElement().asInstanceOf[EndPoint] - copy.withId(sourceEndpoint.id).withName(sourceEndpoint.name.value()).withPath(sourceEndpoint.path.value()) + sourceEndpoint.name.option().foreach(copy.withName) + copy.withId(sourceEndpoint.id).withPath(sourceEndpoint.path.value()) + case _ => domain } case _ => domain diff --git a/amf-cli/shared/src/test/resources/resolution/async20/async-2.3-components.expanded.jsonld b/amf-cli/shared/src/test/resources/resolution/async20/async-2.3-components.expanded.jsonld index b3829bd5b3..0fb27c8c23 100644 --- a/amf-cli/shared/src/test/resources/resolution/async20/async-2.3-components.expanded.jsonld +++ b/amf-cli/shared/src/test/resources/resolution/async20/async-2.3-components.expanded.jsonld @@ -78,11 +78,6 @@ "@value": "some/events" } ], - "core:name": [ - { - "@value": "null" - } - ], "core:description": [ { "@value": "mychannel" diff --git a/amf-cli/shared/src/test/resources/resolution/async20/async-2.3-components.flattened.jsonld b/amf-cli/shared/src/test/resources/resolution/async20/async-2.3-components.flattened.jsonld index 6f84ef0a83..62c8721444 100644 --- a/amf-cli/shared/src/test/resources/resolution/async20/async-2.3-components.flattened.jsonld +++ b/amf-cli/shared/src/test/resources/resolution/async20/async-2.3-components.flattened.jsonld @@ -72,7 +72,6 @@ "doc:DomainElement" ], "apiContract:path": "some/events", - "core:name": "null", "core:description": "mychannel", "apiContract:server": [ {