diff --git a/amf-cli/shared/src/test/resources/overriden-cyclic-properties.raml b/amf-cli/shared/src/test/resources/overriden-cyclic-properties.raml new file mode 100644 index 0000000000..afef35d757 --- /dev/null +++ b/amf-cli/shared/src/test/resources/overriden-cyclic-properties.raml @@ -0,0 +1,15 @@ +#%RAML 1.0 + +title: I am a title + +types: + Element: + type: object + properties: + extension?: + type: Extension[] + Extension: + type: Element + properties: + extension?: + type: Extension[] \ No newline at end of file diff --git a/amf-cli/shared/src/test/scala/amf/cli/internal/convert/WrapperTests.scala b/amf-cli/shared/src/test/scala/amf/cli/internal/convert/WrapperTests.scala index 47fbad377d..bfda269870 100644 --- a/amf-cli/shared/src/test/scala/amf/cli/internal/convert/WrapperTests.scala +++ b/amf-cli/shared/src/test/scala/amf/cli/internal/convert/WrapperTests.scala @@ -17,17 +17,13 @@ import amf.core.client.platform.config.RenderOptions import amf.core.client.platform.model.document.{BaseUnit, DeclaresModel, Document, EncodesModel} import amf.core.client.platform.model.domain._ import amf.core.client.platform.parse.AMFParser -import amf.core.client.platform.parse.AMFParser.parseStartingPoint +import amf.core.client.platform.parse.AMFParser.{parse, parseStartingPoint} import amf.core.client.platform.resource.{ResourceNotFound, ResourceLoader => ClientResourceLoader} import amf.core.client.scala.errorhandling.DefaultErrorHandler import amf.core.client.scala.exception.UnsupportedVendorException import amf.core.client.scala.model.document.{Document => InternalDocument} import amf.core.client.scala.model.domain.extensions.{DomainExtension => InternalDomainExtension} -import amf.core.client.scala.model.domain.{ - ArrayNode => InternalArrayNode, - ObjectNode => InternalObjectNode, - ScalarNode => InternalScalarNode -} +import amf.core.client.scala.model.domain.{ArrayNode => InternalArrayNode, ObjectNode => InternalObjectNode, ScalarNode => InternalScalarNode} import amf.core.client.scala.resource.ResourceLoader import amf.core.client.scala.validation.AMFValidationReport import amf.core.client.scala.vocabulary.Namespace @@ -2171,6 +2167,18 @@ trait WrapperTests extends MultiJsonldAsyncFunSuite with Matchers with NativeOps } } + test("Stackoverflow in minShape with overriden cyclic properties") { + val client = RAMLConfiguration.RAML10().baseUnitClient() + val path = "file://amf-cli/shared/src/test/resources/overriden-cyclic-properties.raml" + for { + parsingResult <- client.parse(path).asFuture + resolutionResult <- Future.successful(client.transform(parsingResult.baseUnit, PipelineId.Editing)) + } yield { + assert(parsingResult.conforms) + assert(resolutionResult.conforms) + } + } + // // // todo: move to common (file system) def getAbsolutePath(path: String): String diff --git a/amf-shapes/shared/src/main/scala/amf/shapes/internal/domain/resolution/shape_normalization/MinShapeAlgorithm.scala b/amf-shapes/shared/src/main/scala/amf/shapes/internal/domain/resolution/shape_normalization/MinShapeAlgorithm.scala index d0aecc6742..62ec6e0b5b 100644 --- a/amf-shapes/shared/src/main/scala/amf/shapes/internal/domain/resolution/shape_normalization/MinShapeAlgorithm.scala +++ b/amf-shapes/shared/src/main/scala/amf/shapes/internal/domain/resolution/shape_normalization/MinShapeAlgorithm.scala @@ -686,7 +686,10 @@ private[resolution] class MinShapeAlgorithm()(implicit val context: Normalizatio case _ => false } + private def areSameShape(child: Shape, parent: Shape): Boolean = child.id == parent.id && child.id != null def computeMinShape(child: Shape, parent: Shape): Shape = { + if(areSameShape(child, parent)) return child + val parentCopy = parent.copyShape() val childClone = child.cloneElement(mutable.Map.empty).asInstanceOf[Shape] // this is destructive, we need to clone diff --git a/amf-shapes/shared/src/main/scala/amf/shapes/internal/domain/resolution/shape_normalization/NormalizationContext.scala b/amf-shapes/shared/src/main/scala/amf/shapes/internal/domain/resolution/shape_normalization/NormalizationContext.scala index 311cf7cc9e..776bb21d93 100644 --- a/amf-shapes/shared/src/main/scala/amf/shapes/internal/domain/resolution/shape_normalization/NormalizationContext.scala +++ b/amf-shapes/shared/src/main/scala/amf/shapes/internal/domain/resolution/shape_normalization/NormalizationContext.scala @@ -37,7 +37,7 @@ private[resolution] class NormalizationContext( TransformationValidation, derivedShape.id, Some(ShapeModel.Inherits.value.iri()), - other.getMessage, + Option(other.getMessage()).getOrElse(other.toString), derivedShape.position(), derivedShape.location() )