diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/emitters/domain/AsyncApiDestinationsEmitter.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/emitters/domain/AsyncApiDestinationsEmitter.scala index c8443c5bd8..22ed3319c0 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/emitters/domain/AsyncApiDestinationsEmitter.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/emitters/domain/AsyncApiDestinationsEmitter.scala @@ -1,7 +1,22 @@ package amf.apicontract.internal.spec.async.emitters.domain -import amf.apicontract.client.scala.model.domain.bindings.solace.{SolaceOperationDestination, SolaceOperationDestination020, SolaceOperationDestination030, SolaceOperationDestination040, SolaceOperationQueue, SolaceOperationQueue030, SolaceOperationTopic} -import amf.apicontract.internal.metamodel.domain.bindings.{SolaceOperationDestinationModel, SolaceOperationQueue010Model, SolaceOperationQueue030Model, SolaceOperationQueueModel, SolaceOperationTopicModel} +import amf.apicontract.client.scala.model.domain.bindings.solace.{ + SolaceOperationDestination, + SolaceOperationDestination010, + SolaceOperationDestination020, + SolaceOperationDestination030, + SolaceOperationDestination040, + SolaceOperationQueue, + SolaceOperationQueue030, + SolaceOperationTopic +} +import amf.apicontract.internal.metamodel.domain.bindings.{ + SolaceOperationDestinationModel, + SolaceOperationQueue010Model, + SolaceOperationQueue030Model, + SolaceOperationQueueModel, + SolaceOperationTopicModel +} import amf.apicontract.internal.spec.common.emitter.AgnosticShapeEmitterContextAdapter import amf.apicontract.internal.spec.oas.emitter.context.OasLikeSpecEmitterContext import amf.core.internal.parser.domain.FieldEntry @@ -38,14 +53,14 @@ case class AsyncApiDestinationsEmitter(f: FieldEntry, ordering: SpecOrdering)(im override def position(): Position = pos(f.element.annotations) } -class SingleDestinationEmitter(binding: SolaceOperationDestination, ordering: SpecOrdering)(implicit +class SingleDestinationEmitter(destination: SolaceOperationDestination, ordering: SpecOrdering)(implicit val spec: OasLikeSpecEmitterContext ) extends PartEmitter { protected implicit val shapeCtx = AgnosticShapeEmitterContextAdapter(spec) override def emit(b: YDocument.PartBuilder): Unit = { val result = ListBuffer[EntryEmitter]() - val fs = binding.fields + val fs = destination.fields fs.entry(SolaceOperationDestinationModel.DestinationType).foreach(f => result += ValueEmitter("destinationType", f)) fs.entry(SolaceOperationDestinationModel.DeliveryMode).foreach { f => @@ -55,24 +70,26 @@ class SingleDestinationEmitter(binding: SolaceOperationDestination, ordering: Sp } } - Option(binding.queue).foreach(queue => result += new SolaceOperationQueueEmitter(queue, ordering)) - binding match { + Option(destination.queue).foreach { queue => + val emitter = new SolaceOperationQueueEmitter(queue, ordering) + result += emitter + } + destination match { case binding020: SolaceOperationDestination020 => Option(binding020.topic).foreach(topic => result += new SolaceOperationTopicEmitter(topic, ordering)) case binding030: SolaceOperationDestination030 => Option(binding030.topic).foreach(topic => result += new SolaceOperationTopicEmitter(topic, ordering)) - case binding040: SolaceOperationDestination040 => + case binding040: SolaceOperationDestination040 => Option(binding040.topic).foreach(topic => result += new SolaceOperationTopicEmitter(topic, ordering)) case _ => } - - result ++= AnnotationsEmitter(binding, ordering).emitters + result ++= AnnotationsEmitter(destination, ordering).emitters b.obj(traverse(ordering.sorted(result), _)) } - override def position(): Position = pos(binding.annotations) + override def position(): Position = pos(destination.annotations) } class SolaceOperationQueueEmitter(queue: SolaceOperationQueue, ordering: SpecOrdering)(implicit @@ -90,12 +107,9 @@ class SolaceOperationQueueEmitter(queue: SolaceOperationQueue, ordering: SpecOrd fs.entry(SolaceOperationQueueModel.TopicSubscriptions) .foreach(f => result += spec.arrayEmitter("topicSubscriptions", f, ordering)) fs.entry(SolaceOperationQueueModel.AccessType).foreach(f => result += ValueEmitter("accessType", f)) - queue match { - case _: SolaceOperationQueue030 => - fs.entry(SolaceOperationQueue030Model.MaxMsgSpoolSize).foreach(f => result += ValueEmitter("maxMsgSpoolSize", f)) - fs.entry(SolaceOperationQueue030Model.MaxTtl).foreach(f => result += ValueEmitter("maxTtl", f)) - case _ => - } + fs.entry(SolaceOperationQueue030Model.MaxMsgSpoolSize) + .foreach(f => result += ValueEmitter("maxMsgSpoolSize", f)) + fs.entry(SolaceOperationQueue030Model.MaxTtl).foreach(f => result += ValueEmitter("maxTtl", f)) traverse(ordering.sorted(result), emitter) } diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/bindings/operation/SolaceOperationBindingParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/bindings/operation/SolaceOperationBindingParser.scala index 57286234ad..1478d9cba4 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/bindings/operation/SolaceOperationBindingParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/bindings/operation/SolaceOperationBindingParser.scala @@ -18,8 +18,8 @@ object SolaceOperationBindingParser extends BindingParser[SolaceOperationBinding case "0.3.0" => SolaceOperationBinding030(Annotations(entry)) case "0.2.0" => SolaceOperationBinding020(Annotations(entry)) case "0.1.0" => SolaceOperationBinding010(Annotations(entry)) - case invalidVersion => - val defaultBinding = SolaceOperationBinding010(Annotations(entry)) + case invalidVersion => //default to 0.3.0 + val defaultBinding = SolaceOperationBinding030(Annotations(entry)) invalidBindingVersion(defaultBinding, invalidVersion, "Solace Operation Binding") defaultBinding } @@ -30,7 +30,8 @@ object SolaceOperationBindingParser extends BindingParser[SolaceOperationBinding case "0.4.0" | "latest" => SolaceOperationBinding040Model.Destinations case "0.3.0" => SolaceOperationBinding030Model.Destinations case "0.2.0" => SolaceOperationBinding020Model.Destinations - case _ => SolaceOperationBinding010Model.Destinations //this support 0.1.0 + case "0.1.0" => SolaceOperationBinding010Model.Destinations + case _ => SolaceOperationBinding030Model.Destinations // default to 0.3.0 } binding.setWithoutId( field, @@ -57,7 +58,8 @@ object SolaceOperationBindingParser extends BindingParser[SolaceOperationBinding case "0.4.0" | "latest" => SolaceOperationDestination040(Annotations(map)) case "0.3.0" => SolaceOperationDestination030(Annotations(map)) case "0.2.0" => SolaceOperationDestination020(Annotations(map)) - case _ => SolaceOperationDestination010(Annotations(map)) + case "0.1.0" => SolaceOperationDestination010(Annotations(map)) + case _ => SolaceOperationDestination030(Annotations(map)) } map.key("destinationType", SolaceOperationDestinationModel.DestinationType in destination) @@ -69,11 +71,13 @@ object SolaceOperationBindingParser extends BindingParser[SolaceOperationBinding parseQueue(destination, map, bindingVersion) bindingVersion match { + case "0.1.0" => ctx.closedShape(destination, map, s"SolaceOperationDestination010") case "0.2.0" | "0.3.0" | "0.4.0" | "latest" => parseTopic(destination, map) ctx.closedShape(destination, map, s"SolaceOperationDestination020") case _ => - ctx.closedShape(destination, map, "SolaceOperationDestination010") + parseTopic(destination, map) + ctx.closedShape(destination, map, "SolaceOperationDestination020") } destination } @@ -84,13 +88,14 @@ object SolaceOperationBindingParser extends BindingParser[SolaceOperationBinding { entry => val queueMap = entry.value.as[YMap] val queue = bindingVersion match { + case "0.2.0" | "0.1.0" => SolaceOperationQueue010(Annotations(entry.value)) case "0.4.0" | "0.3.0" | "latest" => val queue030 = SolaceOperationQueue030(Annotations(entry.value)) queueMap.key("maxMsgSpoolSize", SolaceOperationQueue030Model.MaxMsgSpoolSize in queue030) queueMap.key("maxTtl", SolaceOperationQueue030Model.MaxTtl in queue030) queue030 case _ => - SolaceOperationQueue010(Annotations(entry.value)) + SolaceOperationQueue030(Annotations(entry.value)) } queueMap.key("name", SolaceOperationQueueModel.Name in queue) @@ -100,10 +105,11 @@ object SolaceOperationBindingParser extends BindingParser[SolaceOperationBinding queueMap.key("accessType", SolaceOperationQueueModel.AccessType in queue) bindingVersion match { + case "0.2.0" | "0.1.0" => ctx.closedShape(queue, queueMap, "SolaceOperationQueue010") case "0.4.0" | "0.3.0" | "latest" => ctx.closedShape(queue, queueMap, "SolaceOperationQueue030") case _ => - ctx.closedShape(queue, queueMap, "SolaceOperationQueue010") + ctx.closedShape(queue, queueMap, "SolaceOperationQueue030") } destination.setWithoutId(SolaceOperationDestinationModel.Queue, queue, Annotations(entry)) diff --git a/amf-cli/shared/src/test/resources/validations/reports/async20/solace-0.4.0-invalid.report b/amf-cli/shared/src/test/resources/validations/reports/async20/solace-0.4.0-invalid.report index bcca64f284..b61b7c01cc 100644 --- a/amf-cli/shared/src/test/resources/validations/reports/async20/solace-0.4.0-invalid.report +++ b/amf-cli/shared/src/test/resources/validations/reports/async20/solace-0.4.0-invalid.report @@ -1,7 +1,7 @@ ModelId: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml Profile: Conforms: false -Number of results: 8 +Number of results: 5 Level: Violation @@ -16,39 +16,15 @@ Level: Violation - Constraint: http://a.ml/vocabularies/amf/parser#unsupported-binding-version Message: Version 9.9.9 is not supported in a Solace Operation Binding Severity: Violation - Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-010 + Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-030 Property: Range: [(18,8)-(38,0)] Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml -- Constraint: http://a.ml/vocabularies/amf/parser#closed-shape - Message: Property 'maxMsgSpoolSize' not supported in a ASYNC 2.3 SolaceOperationQueue010 node - Severity: Violation - Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-010/destinations/solace-operation-destination-010/solace-operation-queue-010 - Property: - Range: [(28,16)-(29,0)] - Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml - -- Constraint: http://a.ml/vocabularies/amf/parser#closed-shape - Message: Property 'maxTtl' not supported in a ASYNC 2.3 SolaceOperationQueue010 node - Severity: Violation - Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-010/destinations/solace-operation-destination-010/solace-operation-queue-010 - Property: - Range: [(29,16)-(30,0)] - Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml - -- Constraint: http://a.ml/vocabularies/amf/parser#closed-shape - Message: Property 'topic' not supported in a ASYNC 2.3 SolaceOperationDestination010 node - Severity: Violation - Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-010/destinations/solace-operation-destination-010_1 - Property: - Range: [(32,14)-(35,0)] - Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml - - Constraint: http://a.ml/vocabularies/amf/parser#closed-shape Message: Property 'timeToLive' not supported in a ASYNC 2.3 SolaceOperationBinding010 node Severity: Violation - Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-010 + Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-030 Property: Range: [(35,10)-(36,0)] Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml @@ -56,7 +32,7 @@ Level: Violation - Constraint: http://a.ml/vocabularies/amf/parser#closed-shape Message: Property 'priority' not supported in a ASYNC 2.3 SolaceOperationBinding010 node Severity: Violation - Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-010 + Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-030 Property: Range: [(36,10)-(37,0)] Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml @@ -64,7 +40,7 @@ Level: Violation - Constraint: http://a.ml/vocabularies/amf/parser#closed-shape Message: Property 'dmqEligible' not supported in a ASYNC 2.3 SolaceOperationBinding010 node Severity: Violation - Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-010 + Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-030 Property: Range: [(37,10)-(38,0)] Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-0.4.0-invalid.yaml diff --git a/amf-cli/shared/src/test/resources/validations/reports/async20/solace-invalid-queue-version.report b/amf-cli/shared/src/test/resources/validations/reports/async20/solace-invalid-queue-version.report index fccb21c802..c30bfe19dc 100644 --- a/amf-cli/shared/src/test/resources/validations/reports/async20/solace-invalid-queue-version.report +++ b/amf-cli/shared/src/test/resources/validations/reports/async20/solace-invalid-queue-version.report @@ -1,38 +1,14 @@ ModelId: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-invalid-queue-version.yaml Profile: Conforms: false -Number of results: 4 +Number of results: 1 Level: Violation - Constraint: http://a.ml/vocabularies/amf/parser#unsupported-binding-version Message: Version 9.9.9 is not supported in a Solace Operation Binding Severity: Violation - Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-invalid-queue-version.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-010 + Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-invalid-queue-version.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-030 Property: Range: [(17,8)-(34,0)] Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-invalid-queue-version.yaml - -- Constraint: http://a.ml/vocabularies/amf/parser#closed-shape - Message: Property 'maxMsgSpoolSize' not supported in a ASYNC 2.3 SolaceOperationQueue010 node - Severity: Violation - Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-invalid-queue-version.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-010/destinations/solace-operation-destination-010/solace-operation-queue-010 - Property: - Range: [(27,16)-(28,0)] - Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-invalid-queue-version.yaml - -- Constraint: http://a.ml/vocabularies/amf/parser#closed-shape - Message: Property 'maxTtl' not supported in a ASYNC 2.3 SolaceOperationQueue010 node - Severity: Violation - Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-invalid-queue-version.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-010/destinations/solace-operation-destination-010/solace-operation-queue-010 - Property: - Range: [(28,16)-(29,0)] - Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-invalid-queue-version.yaml - -- Constraint: http://a.ml/vocabularies/amf/parser#closed-shape - Message: Property 'topic' not supported in a ASYNC 2.3 SolaceOperationDestination010 node - Severity: Violation - Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-invalid-queue-version.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-010/destinations/solace-operation-destination-010_1 - Property: - Range: [(31,14)-(34,0)] - Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-invalid-queue-version.yaml diff --git a/amf-cli/shared/src/test/resources/validations/reports/async20/solace-wrong-queue-version.report b/amf-cli/shared/src/test/resources/validations/reports/async20/solace-wrong-queue-version.report index 15b918bf54..ca839e95bc 100644 --- a/amf-cli/shared/src/test/resources/validations/reports/async20/solace-wrong-queue-version.report +++ b/amf-cli/shared/src/test/resources/validations/reports/async20/solace-wrong-queue-version.report @@ -1,6 +1,5 @@ - ModelId: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-wrong-queue-version.yaml -Profile: +Profile: Conforms: false Number of results: 2 @@ -10,7 +9,7 @@ Level: Violation Message: Property 'maxMsgSpoolSize' not supported in a ASYNC 2.3 SolaceOperationQueue010 node Severity: Violation Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-wrong-queue-version.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-020/destinations/solace-operation-destination-020/solace-operation-queue-010 - Property: + Property: Range: [(27,16)-(28,0)] Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-wrong-queue-version.yaml @@ -18,6 +17,6 @@ Level: Violation Message: Property 'maxTtl' not supported in a ASYNC 2.3 SolaceOperationQueue010 node Severity: Violation Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-wrong-queue-version.yaml#/async-api/endpoint/some-channel/supportedOperation/publish/operation-bindings/bindings/solace-operation-020/destinations/solace-operation-destination-020/solace-operation-queue-010 - Property: + Property: Range: [(28,16)-(29,0)] Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/solace-wrong-queue-version.yaml