diff --git a/rtron-io/src/main/kotlin/io/rtron/io/messages/ContextMessageList.kt b/rtron-io/src/main/kotlin/io/rtron/io/issues/ContextIssueList.kt similarity index 50% rename from rtron-io/src/main/kotlin/io/rtron/io/messages/ContextMessageList.kt rename to rtron-io/src/main/kotlin/io/rtron/io/issues/ContextIssueList.kt index 3ce9ae7b..775c60ef 100644 --- a/rtron-io/src/main/kotlin/io/rtron/io/messages/ContextMessageList.kt +++ b/rtron-io/src/main/kotlin/io/rtron/io/issues/ContextIssueList.kt @@ -14,42 +14,42 @@ * limitations under the License. */ -package io.rtron.io.messages +package io.rtron.io.issues -class ContextMessageList( +class ContextIssueList( val value: V, - val messageList: DefaultMessageList + val issueList: DefaultIssueList ) { // Properties and Initializers // Methods - fun appendReport(other: DefaultMessageList): ContextMessageList { - this.messageList += other + fun appendReport(other: DefaultIssueList): ContextIssueList { + this.issueList += other return this } - fun handleMessageList(f: (DefaultMessageList) -> Unit): V { - f(messageList) + fun handleIssueList(f: (DefaultIssueList) -> Unit): V { + f(issueList) return value } - fun map(transform: (V) -> R): ContextMessageList = ContextMessageList(transform(value), messageList) + fun map(transform: (V) -> R): ContextIssueList = ContextIssueList(transform(value), issueList) } -fun List>.mergeMessageLists(): ContextMessageList> { - val mergedMessageList = DefaultMessageList() - this.forEach { mergedMessageList += it.messageList } - return ContextMessageList(this.map { it.value }, mergedMessageList) +fun List>.mergeIssueLists(): ContextIssueList> { + val mergedIssueList = DefaultIssueList() + this.forEach { mergedIssueList += it.issueList } + return ContextIssueList(this.map { it.value }, mergedIssueList) } /** - * Handles a list of reports with [block] and then returns only the list of [ContextMessageList.value]. + * Handles a list of reports with [block] and then returns only the list of [ContextIssueList.value]. * - * @receiver list of [ContextMessageList] to be handled + * @receiver list of [ContextIssueList] to be handled * @param block the actual handler for the report message - * @return remaining list of [ContextMessageList.value] + * @return remaining list of [ContextIssueList.value] */ -inline fun List>.handleMessageList(block: (ContextMessageList) -> Unit): List = +inline fun List>.handleIssueList(block: (ContextIssueList) -> Unit): List = map { block(it) it.value diff --git a/rtron-io/src/main/kotlin/io/rtron/io/messages/DefaultMessage.kt b/rtron-io/src/main/kotlin/io/rtron/io/issues/DefaultIssue.kt similarity index 87% rename from rtron-io/src/main/kotlin/io/rtron/io/messages/DefaultMessage.kt rename to rtron-io/src/main/kotlin/io/rtron/io/issues/DefaultIssue.kt index 20b220a1..690ae4f4 100644 --- a/rtron-io/src/main/kotlin/io/rtron/io/messages/DefaultMessage.kt +++ b/rtron-io/src/main/kotlin/io/rtron/io/issues/DefaultIssue.kt @@ -14,15 +14,15 @@ * limitations under the License. */ -package io.rtron.io.messages +package io.rtron.io.issues import kotlinx.serialization.Serializable /** - * Single message. + * Single issue. */ @Serializable -data class DefaultMessage( +data class DefaultIssue( val type: String, val info: String, val location: String, @@ -32,7 +32,7 @@ data class DefaultMessage( ) { // Properties and Initializers - val messageSeverity: Severity = when (Pair(incidentSeverity, wasFixed)) { + val issueSeverity: Severity = when (Pair(incidentSeverity, wasFixed)) { Pair(Severity.FATAL_ERROR, true) -> Severity.ERROR Pair(Severity.ERROR, true) -> Severity.WARNING else -> incidentSeverity diff --git a/rtron-io/src/main/kotlin/io/rtron/io/messages/DefaultMessageList.kt b/rtron-io/src/main/kotlin/io/rtron/io/issues/DefaultIssueList.kt similarity index 52% rename from rtron-io/src/main/kotlin/io/rtron/io/messages/DefaultMessageList.kt rename to rtron-io/src/main/kotlin/io/rtron/io/issues/DefaultIssueList.kt index 4db1e74d..bc152f20 100644 --- a/rtron-io/src/main/kotlin/io/rtron/io/messages/DefaultMessageList.kt +++ b/rtron-io/src/main/kotlin/io/rtron/io/issues/DefaultIssueList.kt @@ -14,27 +14,27 @@ * limitations under the License. */ -package io.rtron.io.messages +package io.rtron.io.issues -typealias DefaultMessageList = MessageList +typealias DefaultIssueList = IssueList /** * Returns the number of entries with a certain [severity]. */ -fun DefaultMessageList.getNumberOfMessages(severity: Severity) = getMessages().filter { it.messageSeverity == severity }.size +fun DefaultIssueList.getNumberOfIssues(severity: Severity) = getIssues().count { it.issueSeverity == severity } /** - * Returns true, if list contains messages with fatal error severity. + * Returns true, if list contains issues with fatal error severity. */ -fun DefaultMessageList.containsFatalErrors() = getMessages().any { it.messageSeverity == Severity.FATAL_ERROR } +fun DefaultIssueList.containsFatalErrors() = getIssues().any { it.issueSeverity == Severity.FATAL_ERROR } /** - * Returns a summary of the message numbers depending on the severity. + * Returns a summary of the issue numbers depending on the severity. */ -fun DefaultMessageList.getTextSummary(): String { - val numberOfWarnings = getNumberOfMessages(severity = Severity.WARNING) - val numberOfErrors = getNumberOfMessages(severity = Severity.ERROR) - val numberOfFatalErrors = getNumberOfMessages(severity = Severity.FATAL_ERROR) +fun DefaultIssueList.getTextSummary(): String { + val numberOfWarnings = getNumberOfIssues(severity = Severity.WARNING) + val numberOfErrors = getNumberOfIssues(severity = Severity.ERROR) + val numberOfFatalErrors = getNumberOfIssues(severity = Severity.FATAL_ERROR) return "$numberOfWarnings warnings, $numberOfErrors errors, $numberOfFatalErrors fatal errors" } diff --git a/rtron-io/src/main/kotlin/io/rtron/io/messages/MessageList.kt b/rtron-io/src/main/kotlin/io/rtron/io/issues/IssueList.kt similarity index 51% rename from rtron-io/src/main/kotlin/io/rtron/io/messages/MessageList.kt rename to rtron-io/src/main/kotlin/io/rtron/io/issues/IssueList.kt index 010dec02..7068bad8 100644 --- a/rtron-io/src/main/kotlin/io/rtron/io/messages/MessageList.kt +++ b/rtron-io/src/main/kotlin/io/rtron/io/issues/IssueList.kt @@ -14,21 +14,21 @@ * limitations under the License. */ -package io.rtron.io.messages +package io.rtron.io.issues import kotlinx.serialization.Serializable @Serializable @JvmInline -value class MessageList(private val messages: MutableList = mutableListOf()) { +value class IssueList(private val issues: MutableList = mutableListOf()) { // Properties val size: Int - get() = messages.size + get() = issues.size // Operators - operator fun plusAssign(other: MessageList) { - append(other.messages) + operator fun plusAssign(other: IssueList) { + append(other.issues) } operator fun plusAssign(other: T) { @@ -36,20 +36,20 @@ value class MessageList(private val messages: MutableList = mutableListOf( } // Methods - fun getMessages(): List = messages + fun getIssues(): List = issues - fun isEmpty(): Boolean = messages.isEmpty() - fun isNotEmpty(): Boolean = messages.isNotEmpty() + fun isEmpty(): Boolean = issues.isEmpty() + fun isNotEmpty(): Boolean = issues.isNotEmpty() - fun append(message: T) { this.messages += message } - fun append(messages: List) { this.messages += messages } + fun append(issues: T) { this.issues += issues } + fun append(issues: List) { this.issues += issues } companion object { - fun of(messages: List): MessageList = MessageList(messages as MutableList) - fun of(message: T): MessageList = MessageList(mutableListOf(message)) + fun of(issues: List): IssueList = IssueList(issues as MutableList) + fun of(issue: T): IssueList = IssueList(mutableListOf(issue)) } } -fun List.mergeToReport(): MessageList = MessageList.of(this) -fun List>.merge(): MessageList = MessageList.of(flatMap { it.getMessages() }) +fun List.mergeToReport(): IssueList = IssueList.of(this) +fun List>.merge(): IssueList = IssueList.of(flatMap { it.getIssues() }) diff --git a/rtron-io/src/main/kotlin/io/rtron/io/messages/Severity.kt b/rtron-io/src/main/kotlin/io/rtron/io/issues/Severity.kt similarity index 80% rename from rtron-io/src/main/kotlin/io/rtron/io/messages/Severity.kt rename to rtron-io/src/main/kotlin/io/rtron/io/issues/Severity.kt index 38eec802..e30201dd 100644 --- a/rtron-io/src/main/kotlin/io/rtron/io/messages/Severity.kt +++ b/rtron-io/src/main/kotlin/io/rtron/io/issues/Severity.kt @@ -1,4 +1,4 @@ -package io.rtron.io.messages +package io.rtron.io.issues import kotlinx.serialization.Serializable diff --git a/rtron-main/src/main/kotlin/io/rtron/main/processor/OpendriveToCitygmlParameters.kt b/rtron-main/src/main/kotlin/io/rtron/main/processor/OpendriveToCitygmlParameters.kt index 203c9037..c193dc1b 100644 --- a/rtron-main/src/main/kotlin/io/rtron/main/processor/OpendriveToCitygmlParameters.kt +++ b/rtron-main/src/main/kotlin/io/rtron/main/processor/OpendriveToCitygmlParameters.kt @@ -57,21 +57,21 @@ data class OpendriveToCitygmlParameters( ) { // Methods fun isValid(): Either, Unit> { - val messages = mutableListOf() + val issues = mutableListOf() if (cropPolygonX.size != cropPolygonY.size) { - messages += "cropPolygonX must have the same number of values as cropPolygonY" + issues += "cropPolygonX must have the same number of values as cropPolygonY" } if (cropPolygonX.isNotEmpty() && cropPolygonX.size < 3) { - messages += "cropPolygonX must be empty or have at least three values for representing a triangle" + issues += "cropPolygonX must be empty or have at least three values for representing a triangle" } if (cropPolygonY.isNotEmpty() && cropPolygonY.size < 3) { - messages += "cropPolygonX must be empty or have at least three values for representing a triangle" + issues += "cropPolygonX must be empty or have at least three values for representing a triangle" } - return if (messages.isEmpty()) { + return if (issues.isEmpty()) { Unit.right() } else { - messages.left() + issues.left() } } diff --git a/rtron-main/src/main/kotlin/io/rtron/main/processor/OpendriveToCitygmlProcessor.kt b/rtron-main/src/main/kotlin/io/rtron/main/processor/OpendriveToCitygmlProcessor.kt index 59b73d7b..46c0f61f 100644 --- a/rtron-main/src/main/kotlin/io/rtron/main/processor/OpendriveToCitygmlProcessor.kt +++ b/rtron-main/src/main/kotlin/io/rtron/main/processor/OpendriveToCitygmlProcessor.kt @@ -18,7 +18,7 @@ package io.rtron.main.processor import arrow.core.getOrElse import com.charleskorn.kaml.Yaml -import io.rtron.io.messages.getTextSummary +import io.rtron.io.issues.getTextSummary import io.rtron.io.serialization.serializeToJsonFile import io.rtron.main.project.processAllFiles import io.rtron.readerwriter.citygml.CitygmlWriter @@ -56,8 +56,8 @@ class OpendriveToCitygmlProcessor( val outputSubDirectoryPath = outputDirectoryPath / "citygml_${parameters.getCitygmlWriteVersion()}" outputSubDirectoryPath.createDirectories() // check if parameters are valid - parameters.isValid().onLeft { messages -> - messages.forEach { logger.warn("Parameters are not valid: $it") } + parameters.isValid().onLeft { issues -> + issues.forEach { logger.warn("Parameters are not valid: $it") } return@processAllFiles } // write the parameters as yaml file diff --git a/rtron-main/src/main/kotlin/io/rtron/main/processor/ValidateOpendriveProcessor.kt b/rtron-main/src/main/kotlin/io/rtron/main/processor/ValidateOpendriveProcessor.kt index 9c46fb80..c4940d0d 100644 --- a/rtron-main/src/main/kotlin/io/rtron/main/processor/ValidateOpendriveProcessor.kt +++ b/rtron-main/src/main/kotlin/io/rtron/main/processor/ValidateOpendriveProcessor.kt @@ -18,7 +18,7 @@ package io.rtron.main.processor import arrow.core.getOrElse import com.charleskorn.kaml.Yaml -import io.rtron.io.messages.getTextSummary +import io.rtron.io.issues.getTextSummary import io.rtron.io.serialization.serializeToJsonFile import io.rtron.main.project.processAllFiles import io.rtron.readerwriter.citygml.CitygmlVersion diff --git a/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/OpendriveValidator.kt b/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/OpendriveValidator.kt index d7c65995..e36c1bf3 100644 --- a/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/OpendriveValidator.kt +++ b/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/OpendriveValidator.kt @@ -21,10 +21,10 @@ import arrow.core.getOrElse import arrow.core.left import arrow.core.raise.either import io.rtron.io.files.inputStreamFromDirectOrCompressedFile -import io.rtron.io.messages.MessageList +import io.rtron.io.issues.IssueList import io.rtron.readerwriter.opendrive.reader.OpendriveUnmarshaller +import io.rtron.readerwriter.opendrive.report.SchemaValidationIssue import io.rtron.readerwriter.opendrive.report.SchemaValidationReport -import io.rtron.readerwriter.opendrive.report.SchemaValidationReportMessage import io.rtron.readerwriter.opendrive.version.OpendriveVersion import io.rtron.readerwriter.opendrive.version.OpendriveVersionUtils import mu.KotlinLogging @@ -47,21 +47,21 @@ object OpendriveValidator { } fun validateFromStream(opendriveVersion: OpendriveVersion, inputStream: InputStream): Either = either { - val messageList = runValidation(opendriveVersion, inputStream) + val issueList = runValidation(opendriveVersion, inputStream) .getOrElse { logger.warn("Schema validation was aborted due the following error: ${it.message}") - return@either SchemaValidationReport(opendriveVersion, completedSuccessfully = false, validationAbortMessage = it.message) + return@either SchemaValidationReport(opendriveVersion, completedSuccessfully = false, validationAbortIssue = it.message) } - if (!messageList.isEmpty()) { - logger.warn("Schema validation for OpenDRIVE $opendriveVersion found ${messageList.size} incidents.") + if (!issueList.isEmpty()) { + logger.warn("Schema validation for OpenDRIVE $opendriveVersion found ${issueList.size} incidents.") } else { logger.info("Schema validation report for OpenDRIVE $opendriveVersion: Everything ok.") } - SchemaValidationReport(opendriveVersion, messageList) + SchemaValidationReport(opendriveVersion, issueList) } - private fun runValidation(opendriveVersion: OpendriveVersion, inputStream: InputStream): Either> = + private fun runValidation(opendriveVersion: OpendriveVersion, inputStream: InputStream): Either> = either { val unmarshaller = OpendriveUnmarshaller.of(opendriveVersion).bind() @@ -76,7 +76,7 @@ object OpendriveValidator { .bind() } - val messageList = unmarshaller.validationEventHandler.toMessageList() - messageList + val issueList = unmarshaller.validationEventHandler.toIssueList() + issueList } } diff --git a/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/reader/validation/OpendriveValidationEventHandler.kt b/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/reader/validation/OpendriveValidationEventHandler.kt index 89086a79..4ad7647d 100644 --- a/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/reader/validation/OpendriveValidationEventHandler.kt +++ b/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/reader/validation/OpendriveValidationEventHandler.kt @@ -16,9 +16,9 @@ package io.rtron.readerwriter.opendrive.reader.validation -import io.rtron.io.messages.MessageList -import io.rtron.readerwriter.opendrive.report.SchemaValidationReportMessage -import io.rtron.readerwriter.opendrive.report.toMessage +import io.rtron.io.issues.IssueList +import io.rtron.readerwriter.opendrive.report.SchemaValidationIssue +import io.rtron.readerwriter.opendrive.report.toIssue import jakarta.xml.bind.ValidationEvent import jakarta.xml.bind.ValidationEventHandler @@ -38,8 +38,8 @@ class OpendriveValidationEventHandler : ValidationEventHandler { } // Conversions - fun toMessageList(): MessageList { - val messages = this.validationEvents.map { it.toMessage() } - return MessageList.of(messages) + fun toIssueList(): IssueList { + val issues = this.validationEvents.map { it.toIssue() } + return IssueList.of(issues) } } diff --git a/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/ReportExtensions.kt b/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/ReportExtensions.kt index 222c2fbf..718e91ca 100644 --- a/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/ReportExtensions.kt +++ b/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/ReportExtensions.kt @@ -16,10 +16,10 @@ package io.rtron.readerwriter.opendrive.report -import io.rtron.io.messages.Severity +import io.rtron.io.issues.Severity import jakarta.xml.bind.ValidationEvent -fun ValidationEvent.toMessage(): SchemaValidationReportMessage { +fun ValidationEvent.toIssue(): SchemaValidationIssue { val text = this.message ?: "" val severity = when (this.severity) { ValidationEvent.WARNING -> Severity.WARNING @@ -31,5 +31,5 @@ fun ValidationEvent.toMessage(): SchemaValidationReportMessage { val lineNumber = this.locator.lineNumber val columnNumber = this.locator.columnNumber - return SchemaValidationReportMessage(text, severity, lineNumber, columnNumber) + return SchemaValidationIssue(text, severity, lineNumber, columnNumber) } diff --git a/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/SchemaValidationReportMessage.kt b/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/SchemaValidationIssue.kt similarity index 91% rename from rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/SchemaValidationReportMessage.kt rename to rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/SchemaValidationIssue.kt index 237d0f77..12280a65 100644 --- a/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/SchemaValidationReportMessage.kt +++ b/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/SchemaValidationIssue.kt @@ -16,11 +16,11 @@ package io.rtron.readerwriter.opendrive.report -import io.rtron.io.messages.Severity +import io.rtron.io.issues.Severity import kotlinx.serialization.Serializable @Serializable -data class SchemaValidationReportMessage( +data class SchemaValidationIssue( val description: String, val severity: Severity, val lineNumber: Int, diff --git a/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/SchemaValidationReport.kt b/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/SchemaValidationReport.kt index 30610c2c..b54a0343 100644 --- a/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/SchemaValidationReport.kt +++ b/rtron-readerwriter/src/main/kotlin/io/rtron/readerwriter/opendrive/report/SchemaValidationReport.kt @@ -16,8 +16,8 @@ package io.rtron.readerwriter.opendrive.report -import io.rtron.io.messages.MessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.IssueList +import io.rtron.io.issues.Severity import io.rtron.readerwriter.opendrive.version.OpendriveVersion import kotlinx.serialization.Serializable @@ -25,14 +25,14 @@ import kotlinx.serialization.Serializable class SchemaValidationReport( val opendriveVersion: OpendriveVersion, - val validationMessages: MessageList = MessageList(), + val validationIssues: IssueList = IssueList(), val completedSuccessfully: Boolean = true, - val validationAbortMessage: String = "" + val validationAbortIssue: String = "" ) { fun validationProcessAborted() = !completedSuccessfully - fun containsFatalErrorMessages(): Boolean = - validationMessages.getMessages().any { it.severity == Severity.FATAL_ERROR } + fun containsFatalErrorIssues(): Boolean = + validationIssues.getIssues().any { it.severity == Severity.FATAL_ERROR } } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/Opendrive2RoadspacesTransformer.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/Opendrive2RoadspacesTransformer.kt index 9d897d39..d81bd855 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/Opendrive2RoadspacesTransformer.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/Opendrive2RoadspacesTransformer.kt @@ -18,9 +18,9 @@ package io.rtron.transformer.converter.opendrive2roadspaces import arrow.core.Option import arrow.core.some +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.mergeIssueLists import io.rtron.io.logging.ProgressBar -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.mergeMessageLists import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.extensions.updateAdditionalIdentifiers import io.rtron.model.opendrive.junction.EJunctionType @@ -66,7 +66,7 @@ class Opendrive2RoadspacesTransformer( val report = Opendrive2RoadspacesReport(parameters) // general model information - val header = headerBuilder.buildHeader(opendriveModel.header).handleMessageList { report.conversion += it } + val header = headerBuilder.buildHeader(opendriveModel.header).handleIssueList { report.conversion += it } // transformation of each road val progressBar = ProgressBar("Transforming roads", opendriveModel.road.size) @@ -77,7 +77,7 @@ class Opendrive2RoadspacesTransformer( transformRoadspacesSequentially(opendriveModel, progressBar) } - val roadspaces = roadspacesWithContextReports.mergeMessageLists().handleMessageList { report.conversion += it } + val roadspaces = roadspacesWithContextReports.mergeIssueLists().handleIssueList { report.conversion += it } val junctions = opendriveModel.junction .filter { it.typeValidated == EJunctionType.DEFAULT } @@ -92,7 +92,7 @@ class Opendrive2RoadspacesTransformer( private fun transformRoadspacesSequentially( opendriveModel: OpendriveModel, progressBar: ProgressBar - ): List> = + ): List> = opendriveModel.roadAsNonEmptyList.map { roadspaceBuilder.buildRoadspace(it).also { progressBar.step() } } @@ -101,7 +101,7 @@ class Opendrive2RoadspacesTransformer( private fun transformRoadspacesConcurrently( opendriveModel: OpendriveModel, progressBar: ProgressBar - ): List> { + ): List> { val roadspacesDeferred = opendriveModel.roadAsNonEmptyList.map { GlobalScope.async { roadspaceBuilder.buildRoadspace(it).also { progressBar.step() } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/LinearRing3DFactory.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/LinearRing3DFactory.kt index a6be6759..ca3a7cc0 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/LinearRing3DFactory.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/LinearRing3DFactory.kt @@ -21,10 +21,10 @@ import arrow.core.NonEmptyList import arrow.core.left import arrow.core.raise.either import arrow.core.toNonEmptyListOrNull -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.math.geometry.euclidean.threed.point.Vector3D import io.rtron.math.geometry.euclidean.threed.surface.LinearRing3D import io.rtron.math.processing.isClockwiseOrdered @@ -32,7 +32,7 @@ import io.rtron.math.processing.removeConsecutiveSideDuplicates import io.rtron.math.processing.removeRedundantVerticesOnLineSegmentsEnclosing import io.rtron.model.opendrive.additions.identifier.RoadObjectOutlineIdentifier import io.rtron.std.filterWithNextEnclosing -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of /** * Factory for building [LinearRing3D] for which multiple preparation steps are required to overcome @@ -43,8 +43,8 @@ object LinearRing3DFactory { /** * Builds a [LinearRing3D] from a list of vertices by filtering and preparing the vertices. */ - fun buildFromVertices(outlineId: RoadObjectOutlineIdentifier, vertices: NonEmptyList, tolerance: Double): Either> = either { - val messageList = DefaultMessageList() + fun buildFromVertices(outlineId: RoadObjectOutlineIdentifier, vertices: NonEmptyList, tolerance: Double): Either> = either { + val issueList = DefaultIssueList() // remove end element, if start and end element are equal val verticesWithoutClosing = if (vertices.first() == vertices.last()) { @@ -56,37 +56,37 @@ object LinearRing3DFactory { // remove consecutively following point duplicates val verticesWithoutPointDuplicates = verticesWithoutClosing.filterWithNextEnclosing { a, b -> a.fuzzyUnequals(b, tolerance) } if (verticesWithoutPointDuplicates.size < verticesWithoutClosing.size) { - messageList += DefaultMessage.of("OutlineContainsConsecutivelyFollowingElementDuplicates", "Ignoring at least one consecutively following point duplicate.", outlineId, Severity.WARNING, wasFixed = true) + issueList += DefaultIssue.of("OutlineContainsConsecutivelyFollowingElementDuplicates", "Ignoring at least one consecutively following point duplicate.", outlineId, Severity.WARNING, wasFixed = true) } // remove consecutively following side duplicates val verticesWithoutSideDuplicates = verticesWithoutPointDuplicates.removeConsecutiveSideDuplicates() if (verticesWithoutSideDuplicates.size != verticesWithoutPointDuplicates.size) { - messageList += DefaultMessage.of("OutlineContainsConsecutivelyFollowingSideDuplicates", "Ignoring at least one consecutively following side duplicate of the form (…, A, B, A,…).", outlineId, Severity.WARNING, wasFixed = true) + issueList += DefaultIssue.of("OutlineContainsConsecutivelyFollowingSideDuplicates", "Ignoring at least one consecutively following side duplicate of the form (…, A, B, A,…).", outlineId, Severity.WARNING, wasFixed = true) } // remove vertices that are located on a line anyway val preparedVertices = verticesWithoutSideDuplicates .removeRedundantVerticesOnLineSegmentsEnclosing(tolerance) if (preparedVertices.size < verticesWithoutSideDuplicates.size) { - messageList += DefaultMessage.of("OutlineContainsLinearlyRedundantVertices", "Ignoring at least one vertex due to linear redundancy.", outlineId, Severity.WARNING, wasFixed = true) + issueList += DefaultIssue.of("OutlineContainsLinearlyRedundantVertices", "Ignoring at least one vertex due to linear redundancy.", outlineId, Severity.WARNING, wasFixed = true) } // if there are not enough points to construct a linear ring if (preparedVertices.size <= 2) { - GeometryBuilderException.NotEnoughValidOutlineElementsForLinearRing(outlineId).left().bind>() + GeometryBuilderException.NotEnoughValidOutlineElementsForLinearRing(outlineId).left().bind>() } // if the outline elements are ordered clockwise yielding a wrong polygon orientation val projectedVertices = preparedVertices.map { it.toVector2D(Vector3D.Z_AXIS) } val orderedVertices = if (projectedVertices.distinct().size > 2 && projectedVertices.isClockwiseOrdered()) { - messageList += DefaultMessage.of("IncorrectOutlineOrientation", "Outline elements are ordered clockwise but should be ordered counter-clockwise.", outlineId, Severity.ERROR, wasFixed = true) + issueList += DefaultIssue.of("IncorrectOutlineOrientation", "Outline elements are ordered clockwise but should be ordered counter-clockwise.", outlineId, Severity.ERROR, wasFixed = true) preparedVertices.reversed() } else { preparedVertices } val linearRing = LinearRing3D(orderedVertices.toNonEmptyListOrNull()!!, tolerance) - ContextMessageList(linearRing, messageList) + ContextIssueList(linearRing, issueList) } } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/Polyhedron3DFactory.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/Polyhedron3DFactory.kt index a917f998..a8db16f2 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/Polyhedron3DFactory.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/Polyhedron3DFactory.kt @@ -26,11 +26,11 @@ import arrow.core.left import arrow.core.nonEmptyListOf import arrow.core.raise.either import arrow.core.toNonEmptyListOrNull -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity -import io.rtron.io.messages.mergeMessageLists +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity +import io.rtron.io.issues.mergeIssueLists import io.rtron.math.geometry.euclidean.threed.point.Vector3D import io.rtron.math.geometry.euclidean.threed.solid.Polyhedron3D import io.rtron.math.geometry.euclidean.threed.surface.LinearRing3D @@ -44,7 +44,7 @@ import io.rtron.std.filterWithNextEnclosing import io.rtron.std.handleLeftAndFilter import io.rtron.std.zipWithConsecutivesEnclosing import io.rtron.std.zipWithNextEnclosing -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of import kotlin.collections.flatten /** @@ -59,13 +59,13 @@ object Polyhedron3DFactory { * @param outlineElements vertical line segments or points bounding the polyhedron */ fun buildFromVerticalOutlineElements(outlineId: RoadObjectOutlineIdentifier, outlineElements: NonEmptyList, tolerance: Double): - Either> = either { - val messageList = DefaultMessageList() + Either> = either { + val issueList = DefaultIssueList() // prepare vertical outline elements val preparedOutlineElements = prepareOutlineElements(outlineId, outlineElements, tolerance) .bind() - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } // construct faces val baseFace = LinearRing3D(preparedOutlineElements.reversed().map { it.basePoint }.let { it.toNonEmptyListOrNull()!! }, tolerance) @@ -82,7 +82,7 @@ object Polyhedron3DFactory { .let { it.toNonEmptyListOrNull()!! } val polyhedron = Polyhedron3D(triangulatedFaces, tolerance) - ContextMessageList(polyhedron, messageList) + ContextIssueList(polyhedron, issueList) } /** @@ -168,14 +168,14 @@ object Polyhedron3DFactory { leftHeadPoint: Option, rightHeadPoint: Option, tolerance: Double - ): ContextMessageList { - val messageList = DefaultMessageList() + ): ContextIssueList { + val issueList = DefaultIssueList() val headPoints = leftHeadPoint.toList() + rightHeadPoint.toList() // remove head points that are fuzzily equal to base point val prepHeadPoints = headPoints.filter { it.fuzzyUnequals(basePoint, tolerance) } if (prepHeadPoints.size < headPoints.size) { - messageList += DefaultMessage( + issueList += DefaultIssue( "", "Height of outline element must be above tolerance.", "", @@ -185,7 +185,7 @@ object Polyhedron3DFactory { } if (prepHeadPoints.size <= 1) { - return ContextMessageList(of(basePoint, prepHeadPoints, tolerance), messageList) + return ContextIssueList(of(basePoint, prepHeadPoints, tolerance), issueList) } // if head points are fuzzily equal, take only one @@ -195,7 +195,7 @@ object Polyhedron3DFactory { } else { of(basePoint, prepHeadPoints, tolerance) } - return ContextMessageList(verticalOutlineElement, messageList) + return ContextIssueList(verticalOutlineElement, issueList) } /** @@ -223,20 +223,20 @@ object Polyhedron3DFactory { fun of( elements: List, tolerance: Double - ): ContextMessageList { + ): ContextIssueList { require(elements.isNotEmpty()) { "List of elements must not be empty." } require( elements.drop(1) .all { it.basePoint == elements.first().basePoint } ) { "All elements must have the same base point." } - val messageList = DefaultMessageList() + val issueList = DefaultIssueList() if (elements.size == 1) { - return ContextMessageList(elements.first(), messageList) + return ContextIssueList(elements.first(), issueList) } if (elements.size > 2) { - messageList += DefaultMessage( + issueList += DefaultIssue( "OutlineContainsConsecutivelyFollowingElementDuplicates", "Contains more than two consecutively following outline element duplicates.", "", @@ -249,7 +249,7 @@ object Polyhedron3DFactory { val leftHeadPoint = elements.first().leftHeadPoint val rightHeadPoint = elements.last().getHeadPointAdjacentToTheRight() - return of(basePoint, leftHeadPoint, rightHeadPoint, tolerance).appendReport(messageList) + return of(basePoint, leftHeadPoint, rightHeadPoint, tolerance).appendReport(issueList) } } } @@ -281,47 +281,47 @@ object Polyhedron3DFactory { * Preparation and cleanup of [verticalOutlineElements] including the removal of duplicates and error messaging. */ private fun prepareOutlineElements(outlineId: RoadObjectOutlineIdentifier, verticalOutlineElements: NonEmptyList, tolerance: Double): - Either>> = either { - val messageList = DefaultMessageList() + Either>> = either { + val issueList = DefaultIssueList() // remove consecutively following line segment duplicates val elementsWithoutDuplicates = verticalOutlineElements.filterWithNextEnclosing { a, b -> a.basePoint.fuzzyUnequals(b.basePoint, tolerance) } if (elementsWithoutDuplicates.size < verticalOutlineElements.size) { - messageList += DefaultMessage.of("OutlineContainsConsecutivelyFollowingLineSegmentDuplicates", "Ignoring at least one consecutively following line segment duplicate.", outlineId, Severity.WARNING, wasFixed = true) + issueList += DefaultIssue.of("OutlineContainsConsecutivelyFollowingLineSegmentDuplicates", "Ignoring at least one consecutively following line segment duplicate.", outlineId, Severity.WARNING, wasFixed = true) } // if there are not enough points to construct a polyhedron if (elementsWithoutDuplicates.size < 3) { - GeometryBuilderException.NotEnoughValidOutlineElementsForPolyhedron(outlineId).left().bind>>() + GeometryBuilderException.NotEnoughValidOutlineElementsForPolyhedron(outlineId).left().bind>>() } // remove consecutively following side duplicates of the form (…, A, B, A, …) val cleanedElements = elementsWithoutDuplicates .filterWindowedEnclosing(listOf(false, true, true)) { it[0].basePoint == it[2].basePoint } if (cleanedElements.size < elementsWithoutDuplicates.size) { - messageList += DefaultMessage.of("OutlineContainsConsecutivelyFollowingSideDuplicates", "Ignoring consecutively following side duplicates of the form (…, A, B, A, …).", outlineId, Severity.WARNING, wasFixed = true) + issueList += DefaultIssue.of("OutlineContainsConsecutivelyFollowingSideDuplicates", "Ignoring consecutively following side duplicates of the form (…, A, B, A, …).", outlineId, Severity.WARNING, wasFixed = true) } // if the base points of the outline element are located on a line (or point) val innerBaseEdges = cleanedElements.map { it.basePoint }.filterIndexed { index, _ -> index != 0 }.map { it - cleanedElements.first().basePoint } val dimensionOfSpan = innerBaseEdges.map { it.toRealVector() }.dimensionOfSpan() if (dimensionOfSpan < 2) { - GeometryBuilderException.ColinearOutlineElementsForPolyhedron(outlineId).left().bind>>() + GeometryBuilderException.ColinearOutlineElementsForPolyhedron(outlineId).left().bind>>() } // if the outline elements are ordered clockwise yielding a wrong polygon orientation val projectedBasePoints = cleanedElements.map { it.basePoint.toVector2D(Vector3D.Z_AXIS) } val orderedElements = if (projectedBasePoints.distinct().size > 2 && projectedBasePoints.isClockwiseOrdered()) { - messageList += DefaultMessage.of("IncorrectOutlineOrientation", "Outline elements are ordered clockwise but should be ordered counter-clockwise.", outlineId, Severity.ERROR, wasFixed = true) + issueList += DefaultIssue.of("IncorrectOutlineOrientation", "Outline elements are ordered clockwise but should be ordered counter-clockwise.", outlineId, Severity.ERROR, wasFixed = true) cleanedElements.reversed() } else { cleanedElements } - val elements: ContextMessageList> = orderedElements + val elements: ContextIssueList> = orderedElements .zipWithConsecutivesEnclosing { it.basePoint } .map { VerticalOutlineElement.of(it, tolerance) } - .mergeMessageLists() + .mergeIssueLists() .map { it.toNonEmptyListOrNull()!! } elements diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/Solid3DBuilder.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/Solid3DBuilder.kt index 85109021..970297c3 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/Solid3DBuilder.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/Solid3DBuilder.kt @@ -24,12 +24,12 @@ import arrow.core.raise.either import arrow.core.separateEither import arrow.core.some import arrow.core.toNonEmptyListOrNull -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity -import io.rtron.io.messages.handleMessageList -import io.rtron.io.messages.mergeToReport +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity +import io.rtron.io.issues.handleIssueList +import io.rtron.io.issues.mergeToReport import io.rtron.math.geometry.euclidean.threed.curve.Curve3D import io.rtron.math.geometry.euclidean.threed.solid.Cuboid3D import io.rtron.math.geometry.euclidean.threed.solid.Cylinder3D @@ -42,7 +42,7 @@ import io.rtron.model.opendrive.objects.RoadObjectsObjectOutlinesOutline import io.rtron.model.opendrive.objects.RoadObjectsObjectOutlinesOutlineCornerRoad import io.rtron.model.opendrive.objects.RoadObjectsObjectRepeat import io.rtron.transformer.converter.opendrive2roadspaces.analysis.FunctionBuilder -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of /** * Builder for solid geometries in 3D from the OpenDRIVE data model. @@ -89,25 +89,25 @@ object Solid3DBuilder { * @param roadReferenceLine road reference line for transforming curve relative coordinates * @return list of polyhedrons */ - fun buildPolyhedronsByRoadCorners(roadObject: RoadObjectsObject, roadReferenceLine: Curve3D, numberTolerance: Double): ContextMessageList> { - val messageList = DefaultMessageList() + fun buildPolyhedronsByRoadCorners(roadObject: RoadObjectsObject, roadReferenceLine: Curve3D, numberTolerance: Double): ContextIssueList> { + val issueList = DefaultIssueList() val (builderExceptions, polyhedronsWithContext) = roadObject .getPolyhedronsDefinedByRoadCorners() .map { buildPolyhedronByRoadCorners(it, roadReferenceLine, numberTolerance) } .separateEither() - messageList += builderExceptions.map { DefaultMessage.of("PolyhedronNotConstructableFromRoadCornerOutlines", it.message, it.location, Severity.WARNING, wasFixed = true) }.mergeToReport() - val polyhedrons = polyhedronsWithContext.handleMessageList { messageList += it.messageList } + issueList += builderExceptions.map { DefaultIssue.of("PolyhedronNotConstructableFromRoadCornerOutlines", it.message, it.location, Severity.WARNING, wasFixed = true) }.mergeToReport() + val polyhedrons = polyhedronsWithContext.handleIssueList { issueList += it.issueList } - return ContextMessageList(polyhedrons, messageList) + return ContextIssueList(polyhedrons, issueList) } /** * Builds a single polyhedron from an OpenDRIVE road object defined by road corner outlines. */ private fun buildPolyhedronByRoadCorners(outline: RoadObjectsObjectOutlinesOutline, referenceLine: Curve3D, numberTolerance: Double): - Either> { + Either> { require(outline.isPolyhedronDefinedByRoadCorners()) { "Outline does not contain a polyhedron represented by road corners." } require(outline.cornerLocal.all { it.height == 0.0 || numberTolerance <= it.height }) { "All cornerRoad elements must have a height of either zero or above the tolerance threshold." } val outlineId = outline.additionalId.toEither { IllegalStateException("Additional outline ID must be available.") }.getOrElse { throw it } @@ -144,8 +144,8 @@ object Solid3DBuilder { * @return list of polyhedrons */ fun buildPolyhedronsByLocalCorners(roadObject: RoadObjectsObject, curveAffine: Affine3D, numberTolerance: Double): - ContextMessageList> { - val messageList = DefaultMessageList() + ContextIssueList> { + val issueList = DefaultIssueList() val objectAffine = Affine3D.of(roadObject.referenceLinePointRelativePose) val affineSequence = AffineSequence3D.of(curveAffine, objectAffine) @@ -154,34 +154,34 @@ object Solid3DBuilder { .map { buildPolyhedronByLocalCorners(it, numberTolerance) } .separateEither() - messageList += builderExceptions - .map { DefaultMessage.of("PolyhedronNotConstructableFromLocalCornerOutlines", it.message, it.location, Severity.WARNING, wasFixed = true) } + issueList += builderExceptions + .map { DefaultIssue.of("PolyhedronNotConstructableFromLocalCornerOutlines", it.message, it.location, Severity.WARNING, wasFixed = true) } .mergeToReport() val polyhedrons = polyhedronsWithContext - .handleMessageList { messageList += it.messageList } + .handleIssueList { issueList += it.issueList } .map { it.copy(affineSequence = affineSequence) } - return ContextMessageList(polyhedrons, messageList) + return ContextIssueList(polyhedrons, issueList) } /** * Builds a single polyhedron from an OpenDRIVE road object defined by local corner outlines. */ private fun buildPolyhedronByLocalCorners(outline: RoadObjectsObjectOutlinesOutline, numberTolerance: Double): - Either> = either { + Either> = either { require(outline.isPolyhedronDefinedByLocalCorners()) { "Outline does not contain a polyhedron represented by local corners." } require(outline.cornerLocal.all { it.height == 0.0 || numberTolerance <= it.height }) { "All cornerLocal elements must have a height of either zero or above the tolerance threshold." } val outlineId = outline.additionalId.toEither { IllegalStateException("Additional outline ID must be available.") }.getOrElse { throw it } - val messageList = DefaultMessageList() + val issueList = DefaultIssueList() val verticalOutlineElements = outline.cornerLocal .map { Polyhedron3DFactory.VerticalOutlineElement.of(it.getBasePoint(), it.getHeadPoint(), None, numberTolerance) } - .handleMessageList { messageList += it.messageList } + .handleIssueList { issueList += it.issueList } .let { it.toNonEmptyListOrNull()!! } - val polyhedronWithContextMessageList = Polyhedron3DFactory.buildFromVerticalOutlineElements(outlineId, verticalOutlineElements, numberTolerance).bind() - polyhedronWithContextMessageList + val polyhedronWithContextIssueList = Polyhedron3DFactory.buildFromVerticalOutlineElements(outlineId, verticalOutlineElements, numberTolerance).bind() + polyhedronWithContextIssueList } /** diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/Surface3DBuilder.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/Surface3DBuilder.kt index c5f18269..659eeb8f 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/Surface3DBuilder.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/geometry/Surface3DBuilder.kt @@ -20,12 +20,12 @@ import arrow.core.Either import arrow.core.getOrElse import arrow.core.separateEither import arrow.core.toNonEmptyListOrNull -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity -import io.rtron.io.messages.handleMessageList -import io.rtron.io.messages.mergeToReport +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity +import io.rtron.io.issues.handleIssueList +import io.rtron.io.issues.mergeToReport import io.rtron.math.analysis.function.univariate.combination.StackedFunction import io.rtron.math.geometry.euclidean.threed.Rotation3D import io.rtron.math.geometry.euclidean.threed.curve.Curve3D @@ -43,7 +43,7 @@ import io.rtron.model.opendrive.objects.RoadObjectsObjectOutlinesOutlineCornerRo import io.rtron.model.opendrive.objects.RoadObjectsObjectRepeat import io.rtron.model.opendrive.signal.RoadSignalsSignal import io.rtron.transformer.converter.opendrive2roadspaces.analysis.FunctionBuilder -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of /** * Builder for surface geometries in 3D from the OpenDRIVE data model. @@ -85,24 +85,24 @@ object Surface3DBuilder { /** * Builds a list of linear rings from an OpenDRIVE road object defined by road corner outlines. */ - fun buildLinearRingsByRoadCorners(roadObject: RoadObjectsObject, referenceLine: Curve3D, numberTolerance: Double): ContextMessageList> { - val messageList = DefaultMessageList() + fun buildLinearRingsByRoadCorners(roadObject: RoadObjectsObject, referenceLine: Curve3D, numberTolerance: Double): ContextIssueList> { + val issueList = DefaultIssueList() val (builderExceptions, linearRingsWithContext) = roadObject.getLinearRingsDefinedByRoadCorners() .map { buildLinearRingByRoadCorners(it, referenceLine, numberTolerance) } .separateEither() - messageList += builderExceptions.map { DefaultMessage.of("LinearRingNotConstructableFromRoadCornerOutlines", it.message, it.location, Severity.WARNING, wasFixed = true) }.mergeToReport() - val linearRings = linearRingsWithContext.handleMessageList { messageList += it.messageList } + issueList += builderExceptions.map { DefaultIssue.of("LinearRingNotConstructableFromRoadCornerOutlines", it.message, it.location, Severity.WARNING, wasFixed = true) }.mergeToReport() + val linearRings = linearRingsWithContext.handleIssueList { issueList += it.issueList } - return ContextMessageList(linearRings, messageList) + return ContextIssueList(linearRings, issueList) } /** * Builds a single linear ring from an OpenDRIVE road object defined by road corner outlines. */ private fun buildLinearRingByRoadCorners(outline: RoadObjectsObjectOutlinesOutline, referenceLine: Curve3D, numberTolerance: Double): - Either> { + Either> { require(outline.isLinearRingDefinedByRoadCorners()) { "Outline does not contain a linear ring represented by road corners." } require(outline.cornerRoad.all { it.height == 0.0 }) { "All cornerRoad elements must have a zero height." } val outlineId = outline.additionalId.toEither { IllegalStateException("Additional outline ID must be available.") }.getOrElse { throw it } @@ -127,8 +127,8 @@ object Surface3DBuilder { /** * Builds a list of linear rings from an OpenDRIVE road object defined by local corner outlines. */ - fun buildLinearRingsByLocalCorners(roadObject: RoadObjectsObject, curveAffine: Affine3D, numberTolerance: Double): ContextMessageList> { - val messageList = DefaultMessageList() + fun buildLinearRingsByLocalCorners(roadObject: RoadObjectsObject, curveAffine: Affine3D, numberTolerance: Double): ContextIssueList> { + val issueList = DefaultIssueList() val objectAffine = Affine3D.of(roadObject.referenceLinePointRelativePose) val affineSequence = AffineSequence3D.of(curveAffine, objectAffine) @@ -137,20 +137,20 @@ object Surface3DBuilder { .map { buildLinearRingByLocalCorners(it, numberTolerance) } .separateEither() - messageList += builderExceptions - .map { DefaultMessage.of("LinearRingNotConstructableFromLocalCornerOutlines", it.message, it.location, Severity.WARNING, wasFixed = true) } + issueList += builderExceptions + .map { DefaultIssue.of("LinearRingNotConstructableFromLocalCornerOutlines", it.message, it.location, Severity.WARNING, wasFixed = true) } .mergeToReport() val linearRings = linearRingsWithContext - .handleMessageList { messageList += it.messageList } + .handleIssueList { issueList += it.issueList } .map { it.copy(affineSequence = affineSequence) } - return ContextMessageList(linearRings, messageList) + return ContextIssueList(linearRings, issueList) } /** * Builds a single linear ring from an OpenDRIVE road object defined by local corner outlines. */ - private fun buildLinearRingByLocalCorners(outline: RoadObjectsObjectOutlinesOutline, numberTolerance: Double): Either> { + private fun buildLinearRingByLocalCorners(outline: RoadObjectsObjectOutlinesOutline, numberTolerance: Double): Either> { val outlineId = outline.additionalId.toEither { IllegalStateException("Additional outline ID must be available.") }.getOrElse { throw it } val vertices = outline.cornerLocal diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/header/HeaderBuilder.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/header/HeaderBuilder.kt index 249f2bdb..92a39302 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/header/HeaderBuilder.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/header/HeaderBuilder.kt @@ -20,10 +20,10 @@ import arrow.core.None import arrow.core.Option import arrow.core.flatten import arrow.core.some -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.math.projection.CoordinateReferenceSystem import io.rtron.model.opendrive.core.HeaderGeoReference import io.rtron.model.roadspaces.Header @@ -34,27 +34,27 @@ class HeaderBuilder( private val parameters: Opendrive2RoadspacesParameters ) { // Methods - fun buildHeader(header: OdrHeader): ContextMessageList
{ - val messageList = DefaultMessageList() + fun buildHeader(header: OdrHeader): ContextIssueList
{ + val issueList = DefaultIssueList() - val crs = header.geoReference.map { buildCoordinateSystem(it).handleMessageList { messageList += it } }.flatten() + val crs = header.geoReference.map { buildCoordinateSystem(it).handleIssueList { issueList += it } }.flatten() val roadspacesHeader = Header(coordinateReferenceSystem = crs, name = header.name, date = header.date, vendor = header.vendor) - return ContextMessageList(roadspacesHeader, messageList) + return ContextIssueList(roadspacesHeader, issueList) } /** * Builds the [CoordinateReferenceSystem] for the [Header]. */ - private fun buildCoordinateSystem(geoReference: HeaderGeoReference): ContextMessageList> { - val messageList = DefaultMessageList() + private fun buildCoordinateSystem(geoReference: HeaderGeoReference): ContextIssueList> { + val issueList = DefaultIssueList() - CoordinateReferenceSystem.of(parameters.crsEpsg).onRight { return ContextMessageList(it.some(), messageList) } + CoordinateReferenceSystem.of(parameters.crsEpsg).onRight { return ContextIssueList(it.some(), issueList) } if (parameters.deriveCrsEpsgAutomatically) { - CoordinateReferenceSystem.of(geoReference.content).onRight { return ContextMessageList(it.some(), messageList) } - messageList += DefaultMessage("AutomaticCrsEpsgCodeDerivationFailed", "EPSG code of the coordinate reference system cannot be derived automatically from the OpenDRIVE header element; add the code explicitly as a command line argument if correct georeferencing is required.", "Header element", Severity.WARNING, wasFixed = false) + CoordinateReferenceSystem.of(geoReference.content).onRight { return ContextIssueList(it.some(), issueList) } + issueList += DefaultIssue("AutomaticCrsEpsgCodeDerivationFailed", "EPSG code of the coordinate reference system cannot be derived automatically from the OpenDRIVE header element; add the code explicitly as a command line argument if correct georeferencing is required.", "Header element", Severity.WARNING, wasFixed = false) } - return ContextMessageList(None, messageList) + return ContextIssueList(None, issueList) } } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/report/Opendrive2RoadspacesReport.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/report/Opendrive2RoadspacesReport.kt index 861c545e..cef05597 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/report/Opendrive2RoadspacesReport.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/report/Opendrive2RoadspacesReport.kt @@ -16,8 +16,8 @@ package io.rtron.transformer.converter.opendrive2roadspaces.report -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.getTextSummary +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.getTextSummary import io.rtron.transformer.converter.opendrive2roadspaces.Opendrive2RoadspacesParameters import kotlinx.serialization.Serializable @@ -25,7 +25,7 @@ import kotlinx.serialization.Serializable data class Opendrive2RoadspacesReport( val parameters: Opendrive2RoadspacesParameters, - val conversion: DefaultMessageList = DefaultMessageList() + val conversion: DefaultIssueList = DefaultIssueList() ) { // Methods diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/LaneBuilder.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/LaneBuilder.kt index 5753c340..594ab664 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/LaneBuilder.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/LaneBuilder.kt @@ -23,10 +23,10 @@ import arrow.core.Some import arrow.core.getOrElse import arrow.core.some import arrow.core.toNonEmptyListOrNull -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.math.analysis.function.univariate.UnivariateFunction import io.rtron.math.analysis.function.univariate.combination.ConcatenatedFunction import io.rtron.math.analysis.function.univariate.pure.ConstantFunction @@ -52,7 +52,7 @@ import io.rtron.model.roadspaces.roadspace.road.RoadMarking import io.rtron.std.isStrictlySortedBy import io.rtron.transformer.converter.opendrive2roadspaces.Opendrive2RoadspacesParameters import io.rtron.transformer.converter.opendrive2roadspaces.analysis.FunctionBuilder -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of /** * Builder for [Lane] objects of the RoadSpaces data model. @@ -70,8 +70,8 @@ class LaneBuilder( * @param lrLane lane object of the OpenDRIVE data model * @param baseAttributes attributes attached to the transformed [Lane] object */ - fun buildLane(id: LaneIdentifier, curvePositionDomain: Range, lrLane: RoadLanesLaneSectionLRLane, baseAttributes: AttributeList): ContextMessageList { - val messageList = DefaultMessageList() + fun buildLane(id: LaneIdentifier, curvePositionDomain: Range, lrLane: RoadLanesLaneSectionLRLane, baseAttributes: AttributeList): ContextIssueList { + val issueList = DefaultIssueList() // build lane geometry val width = lrLane.getLaneWidthEntries() @@ -84,7 +84,7 @@ class LaneBuilder( if (lrLane.roadMark.isEmpty()) { emptyList() } else { - buildRoadMarkings(curvePositionDomain, lrLane.roadMark.toNonEmptyListOrNull()!!).handleMessageList { messageList += it } + buildRoadMarkings(curvePositionDomain, lrLane.roadMark.toNonEmptyListOrNull()!!).handleIssueList { issueList += it } } // lane topology @@ -101,7 +101,7 @@ class LaneBuilder( id, width, laneHeightOffsets.inner, laneHeightOffsets.outer, lrLane.getLevelWithDefault(), roadMarkings, predecessors, successors, type, laneMaterial, attributes ) - return ContextMessageList(lane, messageList) + return ContextIssueList(lane, issueList) } /** @@ -117,18 +117,18 @@ class LaneBuilder( curvePositionDomain: Range, centerLane: RoadLanesLaneSectionCenterLane, baseAttributes: AttributeList - ): ContextMessageList { + ): ContextIssueList { require(centerLane.id == 0) { "Center lane must have id 0, but has ${centerLane.id}." } val laneIdentifier = LaneIdentifier(0, id) - val messageList = DefaultMessageList() + val issueList = DefaultIssueList() val roadMarkings = if (centerLane.roadMark.isEmpty()) { emptyList() } else { buildRoadMarkings(curvePositionDomain, centerLane.roadMark.toNonEmptyListOrNull()!!) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } } val type = centerLane.type.toLaneType() @@ -136,7 +136,7 @@ class LaneBuilder( val attributes = baseAttributes + buildAttributes(centerLane) val lane = CenterLane(laneIdentifier, centerLane.getLevelWithDefault(), roadMarkings, type, laneMaterial, attributes) - return ContextMessageList(lane, messageList) + return ContextIssueList(lane, issueList) } /** @@ -177,17 +177,17 @@ class LaneBuilder( private fun buildRoadMarkings( curvePositionDomain: Range, roadMark: NonEmptyList - ): ContextMessageList> { + ): ContextIssueList> { require(curvePositionDomain.hasUpperBound()) { "curvePositionDomain must have an upper bound." } val roadMarkId = roadMark.head.additionalId.toEither { IllegalStateException("Additional outline ID must be available.") }.getOrElse { throw it } - val messageList = DefaultMessageList() + val issueList = DefaultIssueList() val curvePositionDomainEnd = curvePositionDomain.upperEndpointOrNull()!! val adjustedSrcRoadMark = roadMark .filter { it.sOffset in curvePositionDomain } .filter { !fuzzyEquals(it.sOffset, curvePositionDomainEnd, parameters.numberTolerance) } if (adjustedSrcRoadMark.size < roadMark.size) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "RoadMarkEntriesNotLocatedWithinSRange", "Road mark entries have been removed, as the sOffset is not located within " + "the local curve position domain ($curvePositionDomain) of the lane section.", @@ -197,13 +197,13 @@ class LaneBuilder( ) } - if (adjustedSrcRoadMark.isEmpty()) return ContextMessageList(emptyList(), messageList) + if (adjustedSrcRoadMark.isEmpty()) return ContextIssueList(emptyList(), issueList) val roadMarkings = adjustedSrcRoadMark.zipWithNext() .map { buildRoadMarking(it.first, it.second.sOffset.some()) } + listOf(buildRoadMarking(adjustedSrcRoadMark.last())) - return ContextMessageList(roadMarkings, messageList) + return ContextIssueList(roadMarkings, issueList) } /** diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/RoadBuilder.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/RoadBuilder.kt index 57167abf..1b8ea5b3 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/RoadBuilder.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/RoadBuilder.kt @@ -18,8 +18,8 @@ package io.rtron.transformer.converter.opendrive2roadspaces.roadspaces import arrow.core.NonEmptyList import arrow.core.toNonEmptyListOrNull -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessageList +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssueList import io.rtron.math.analysis.function.univariate.pure.LinearFunction import io.rtron.math.geometry.curved.threed.surface.CurveRelativeParametricSurface3D import io.rtron.math.range.Range @@ -68,9 +68,9 @@ class RoadBuilder( roadSurface: CurveRelativeParametricSurface3D, roadSurfaceWithoutTorsion: CurveRelativeParametricSurface3D, baseAttributes: AttributeList - ): ContextMessageList { + ): ContextIssueList { require(road.lanes.getLaneSectionLengths(road.length).all { it >= parameters.numberTolerance }) { "All lane sections must have a length above the tolerance threshold." } - val messageList = DefaultMessageList() + val issueList = DefaultIssueList() val laneOffset = road.lanes.getLaneOffsetEntries().fold({ LinearFunction.X_AXIS }, { FunctionBuilder.buildLaneOffset(it) }) val laneSections: NonEmptyList = road.lanes.getLaneSectionsWithRanges(road.length) @@ -80,14 +80,14 @@ class RoadBuilder( currentLaneSection.first, currentLaneSection.second, baseAttributes - ).handleMessageList { messageList += it } + ).handleIssueList { issueList += it } } .let { it.toNonEmptyListOrNull()!! } val roadLinkage = buildRoadLinkage(id, road) val roadspaceRoad = Road(id, roadSurface, roadSurfaceWithoutTorsion, laneOffset, laneSections, roadLinkage) - return ContextMessageList(roadspaceRoad, messageList) + return ContextIssueList(roadspaceRoad, issueList) } /** @@ -98,11 +98,11 @@ class RoadBuilder( curvePositionDomain: Range, laneSection: RoadLanesLaneSection, baseAttributes: AttributeList - ): ContextMessageList { + ): ContextIssueList { require(laneSection.center.lane.size == 1) { "Lane section ($laneSectionIdentifier) must contain exactly one center lane." } require(laneSection.getNumberOfLeftLanes() + laneSection.getNumberOfRightLanes() >= 1) { "Lane section ($laneSectionIdentifier) must contain at least one left or right lane." } - val messageList = DefaultMessageList() + val issueList = DefaultIssueList() val localCurvePositionDomain = curvePositionDomain.shiftLowerEndpointTo(0.0) @@ -112,7 +112,7 @@ class RoadBuilder( val laneIdentifier = LaneIdentifier(currentLaneId, laneSectionIdentifier) val attributes = baseAttributes + laneSectionAttributes laneBuilder.buildLane(laneIdentifier, localCurvePositionDomain, currentSrcLane, attributes) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } } val centerLane = laneBuilder.buildCenterLane( @@ -120,10 +120,10 @@ class RoadBuilder( localCurvePositionDomain, laneSection.center.getIndividualCenterLane(), baseAttributes - ).handleMessageList { messageList += it } + ).handleIssueList { issueList += it } val roadspaceLaneSection = LaneSection(laneSectionIdentifier, curvePositionDomain, lanes, centerLane) - return ContextMessageList(roadspaceLaneSection, messageList) + return ContextIssueList(roadspaceLaneSection, issueList) } private fun buildRoadLinkage(id: RoadspaceIdentifier, road: OpendriveRoad): RoadLinkage { diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/RoadspaceBuilder.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/RoadspaceBuilder.kt index 7d5504d8..766fa722 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/RoadspaceBuilder.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/RoadspaceBuilder.kt @@ -19,8 +19,8 @@ package io.rtron.transformer.converter.opendrive2roadspaces.roadspaces import arrow.core.NonEmptyList import arrow.core.getOrElse import arrow.core.toNonEmptyListOrNull -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessageList +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssueList import io.rtron.math.analysis.function.bivariate.BivariateFunction import io.rtron.math.analysis.function.bivariate.pure.PlaneFunction import io.rtron.math.analysis.function.bivariate.pure.ShapeFunction @@ -55,8 +55,8 @@ class RoadspaceBuilder( * @param road source OpenDRIVE model * @return transformed [Roadspace] */ - fun buildRoadspace(road: OpendriveRoad): ContextMessageList { - val messageList = DefaultMessageList() + fun buildRoadspace(road: OpendriveRoad): ContextIssueList { + val issueList = DefaultIssueList() val roadspaceId = RoadspaceIdentifier(road.id) // build up road reference line @@ -88,16 +88,16 @@ class RoadspaceBuilder( // build up the road containing only lane sections, lanes (no roadside objects) val roadspaceRoad = roadBuilder .buildRoad(roadspaceId, road, roadSurface, roadSurfaceWithoutTorsion, attributes) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } // build up the road space objects (OpenDRIVE: road objects & signals) val roadspaceObjectsFromRoadObjects = road.objects.fold({ emptyList() }, { roadObjects -> roadObjectBuilder.buildRoadspaceObjects(roadspaceId, roadObjects, roadReferenceLine, roadspaceRoad, attributes) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } }) val roadspaceObjectsFromRoadSignals: List = road.signals.fold({ emptyList() }, { roadSignals -> roadObjectBuilder.buildRoadspaceObjects(roadspaceId, roadSignals, roadReferenceLine, roadspaceRoad, attributes) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } }) // combine the models into a road space object @@ -109,7 +109,7 @@ class RoadspaceBuilder( roadspaceObjects = roadspaceObjectsFromRoadObjects + roadspaceObjectsFromRoadSignals, attributes = attributes ) - return ContextMessageList(roadspace, messageList) + return ContextIssueList(roadspace, issueList) } private fun buildLateralRoadShape(id: RoadspaceIdentifier, lateralProfileShapeList: NonEmptyList): diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/RoadspaceObjectBuilder.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/RoadspaceObjectBuilder.kt index abc82bd7..2491868a 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/RoadspaceObjectBuilder.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/opendrive2roadspaces/roadspaces/RoadspaceObjectBuilder.kt @@ -25,11 +25,11 @@ import arrow.core.getOrElse import arrow.core.nonEmptyListOf import arrow.core.some import arrow.core.toNonEmptyListOrNull -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity -import io.rtron.io.messages.mergeMessageLists +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity +import io.rtron.io.issues.mergeIssueLists import io.rtron.math.geometry.curved.threed.point.CurveRelativeVector3D import io.rtron.math.geometry.euclidean.threed.AbstractGeometry3D import io.rtron.math.geometry.euclidean.threed.Rotation3D @@ -53,7 +53,7 @@ import io.rtron.transformer.converter.opendrive2roadspaces.geometry.Curve3DBuild import io.rtron.transformer.converter.opendrive2roadspaces.geometry.Solid3DBuilder import io.rtron.transformer.converter.opendrive2roadspaces.geometry.Surface3DBuilder import io.rtron.transformer.converter.opendrive2roadspaces.geometry.Vector3DBuilder -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of import io.rtron.model.opendrive.objects.RoadObjects as OpendriveRoadObjects import io.rtron.model.opendrive.objects.RoadObjectsObject as OpendriveRoadObject import io.rtron.model.opendrive.objects.RoadObjectsObjectRepeat as OpendriveRoadObjectRepeat @@ -79,10 +79,10 @@ class RoadspaceObjectBuilder( roadReferenceLine: Curve3D, road: RoadspaceRoad, baseAttributes: AttributeList - ): ContextMessageList> { + ): ContextIssueList> { return roadObjects.roadObject .map { buildRoadObject(roadspaceId, it, roadReferenceLine, road, baseAttributes) } - .mergeMessageLists() + .mergeIssueLists() .map { it.flatten() } } @@ -92,8 +92,8 @@ class RoadspaceObjectBuilder( roadReferenceLine: Curve3D, road: RoadspaceRoad, baseAttributes: AttributeList - ): ContextMessageList> { - val messageList = DefaultMessageList() + ): ContextIssueList> { + val issueList = DefaultIssueList() // get general object type and geometry representation val type = getObjectType(roadObject) @@ -119,7 +119,7 @@ class RoadspaceObjectBuilder( roadObject, currentRoadObjectRepeat.some(), roadReferenceLine - ).handleMessageList { messageList += it } + ).handleIssueList { issueList += it } RoadspaceObject( roadspaceObjectId, type, @@ -136,7 +136,7 @@ class RoadspaceObjectBuilder( val pointGeometry = buildPointGeometry(roadObject, roadReferenceLine) val buildBoundingBoxGeometry = buildBoundingBoxGeometry(roadObject, roadReferenceLine) val complexGeometry = - buildComplexGeometry(roadObject, None, roadReferenceLine).handleMessageList { messageList += it } + buildComplexGeometry(roadObject, None, roadReferenceLine).handleIssueList { issueList += it } nonEmptyListOf( RoadspaceObject( roadspaceObjectId, @@ -153,7 +153,7 @@ class RoadspaceObjectBuilder( } // build roadspace object - return ContextMessageList(roadObjects, messageList) + return ContextIssueList(roadObjects, issueList) } private fun getObjectType(roadObject: OpendriveRoadObject): RoadObjectType = @@ -229,8 +229,8 @@ class RoadspaceObjectBuilder( roadObject: OpendriveRoadObject, roadObjectRepeat: Option, roadReferenceLine: Curve3D - ): ContextMessageList> { - val messageList = DefaultMessageList() + ): ContextIssueList> { + val issueList = DefaultIssueList() // affine transformation matrix at the curve point of the object val curveAffine = roadReferenceLine.calculateAffine(roadObject.curveRelativePosition.toCurveRelative1D()) @@ -241,21 +241,21 @@ class RoadspaceObjectBuilder( roadObject, roadReferenceLine, parameters.numberTolerance - ).handleMessageList { messageList += it } + ).handleIssueList { issueList += it } geometries += Solid3DBuilder.buildPolyhedronsByLocalCorners(roadObject, curveAffine, parameters.numberTolerance) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } // build up surface geometrical representations geometries += Surface3DBuilder.buildLinearRingsByRoadCorners( roadObject, roadReferenceLine, parameters.numberTolerance - ).handleMessageList { messageList += it } + ).handleIssueList { issueList += it } geometries += Surface3DBuilder.buildLinearRingsByLocalCorners( roadObject, curveAffine, parameters.numberTolerance - ).handleMessageList { messageList += it } + ).handleIssueList { issueList += it } roadObjectRepeat.onSome { currentRepeat -> geometries += Solid3DBuilder.buildParametricSweep( @@ -275,7 +275,7 @@ class RoadspaceObjectBuilder( ) if (currentRepeat.containsRepeatedCuboid()) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "RepeatCuboidNotSupported", "Cuboid geometries in the repeat elements are currently not supported.", roadObject.additionalId, @@ -284,7 +284,7 @@ class RoadspaceObjectBuilder( ) } if (currentRepeat.containsRepeatCylinder()) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "RepeatCylinderNotSupported", "Cylinder geometries in the repeat elements are currently not supported.", roadObject.additionalId, @@ -293,7 +293,7 @@ class RoadspaceObjectBuilder( ) } if (currentRepeat.containsRepeatedRectangle()) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "RepeatRectangleNotSupported", "Rectangle geometries in the repeat elements are currently not supported.", roadObject.additionalId, @@ -302,7 +302,7 @@ class RoadspaceObjectBuilder( ) } if (currentRepeat.containsRepeatCircle()) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "RepeatCircleNotSupported", "Circle geometries in the repeat elements are currently not supported.", roadObject.additionalId, @@ -316,7 +316,7 @@ class RoadspaceObjectBuilder( geometries += Curve3DBuilder.buildCurve3D(roadObject, roadReferenceLine, parameters.numberTolerance) if (geometries.size > 1) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "MultipleComplexGeometriesNotSupported", "Conversion of road objects with multiple complex geometries is currently not supported.", roadObject.additionalId, @@ -325,7 +325,7 @@ class RoadspaceObjectBuilder( ) } val builtGeometry = if (geometries.isEmpty()) None else Some(geometries.first()) - return ContextMessageList(builtGeometry, messageList) + return ContextIssueList(builtGeometry, issueList) } private fun buildAttributes(roadObject: OpendriveRoadObject) = @@ -370,9 +370,9 @@ class RoadspaceObjectBuilder( roadReferenceLine: Curve3D, road: RoadspaceRoad, baseAttributes: AttributeList - ): ContextMessageList> { + ): ContextIssueList> { return roadSignals.signal.map { buildRoadSignalsSignal(id, it, roadReferenceLine, road, baseAttributes) } - .mergeMessageLists() + .mergeIssueLists() } private fun buildRoadSignalsSignal( @@ -381,14 +381,14 @@ class RoadspaceObjectBuilder( roadReferenceLine: Curve3D, road: RoadspaceRoad, baseAttributes: AttributeList - ): ContextMessageList { - val messageList = DefaultMessageList() + ): ContextIssueList { + val issueList = DefaultIssueList() val objectId = RoadspaceObjectIdentifier(roadSignal.id, None, roadSignal.name, id) val pointGeometry = buildPointGeometry(roadSignal, roadReferenceLine) val buildBoundingBoxGeometry = - buildBoundingBoxGeometry(roadSignal, roadReferenceLine).handleMessageList { messageList += it } + buildBoundingBoxGeometry(roadSignal, roadReferenceLine).handleIssueList { issueList += it } val laneRelations = buildLaneRelations(roadSignal, road) val attributes = baseAttributes + buildAttributes(roadSignal) + @@ -404,7 +404,7 @@ class RoadspaceObjectBuilder( laneRelations, attributes ) - return ContextMessageList(roadspaceObject, messageList) + return ContextIssueList(roadspaceObject, issueList) } private fun buildAttributes(signal: RoadSignalsSignal): AttributeList = @@ -432,20 +432,20 @@ class RoadspaceObjectBuilder( private fun buildBoundingBoxGeometry( signal: RoadSignalsSignal, roadReferenceLine: Curve3D - ): ContextMessageList> { - val messageList = DefaultMessageList() + ): ContextIssueList> { + val issueList = DefaultIssueList() // affine transformation matrix at the curve point of the object val curveAffine = roadReferenceLine.calculateAffine(signal.curveRelativePosition.toCurveRelative1D()) if (signal.containsRectangle()) { - return ContextMessageList( + return ContextIssueList( Surface3DBuilder.buildRectangle(signal, curveAffine, parameters.numberTolerance).some(), - messageList + issueList ) } if (signal.containsHorizontalLine()) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "SignalHorizontalLineNotSupported", "Horizontal line geometry in road signal is currently not supported.", signal.additionalId, @@ -454,7 +454,7 @@ class RoadspaceObjectBuilder( ) } if (signal.containsVerticalLine()) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "SignalVerticalLineNotSupported", "Vertical line geometry in road signal is currently not supported.", signal.additionalId, @@ -463,7 +463,7 @@ class RoadspaceObjectBuilder( ) } - return ContextMessageList(None, messageList) + return ContextIssueList(None, issueList) } private fun buildLaneRelations( diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/Roadspaces2CitygmlTransformer.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/Roadspaces2CitygmlTransformer.kt index 4a59c8b8..54ce827d 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/Roadspaces2CitygmlTransformer.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/Roadspaces2CitygmlTransformer.kt @@ -20,10 +20,10 @@ import arrow.core.Option import arrow.core.flattenOption import arrow.core.getOrElse import arrow.core.toOption +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.mergeIssueLists import io.rtron.io.logging.ProgressBar -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.mergeMessageLists import io.rtron.math.projection.CoordinateReferenceSystem import io.rtron.model.citygml.CitygmlModel import io.rtron.model.roadspaces.RoadspacesModel @@ -79,9 +79,9 @@ class Roadspaces2CitygmlTransformer( logger.info("Parameters: $parameters.") val abstractCityObjects = if (parameters.concurrentProcessing) { - transformRoadspacesConcurrently(roadspacesModel).handleMessageList { report.conversion += it } + transformRoadspacesConcurrently(roadspacesModel).handleIssueList { report.conversion += it } } else { - transformRoadspacesSequentially(roadspacesModel).handleMessageList { report.conversion += it } + transformRoadspacesSequentially(roadspacesModel).handleIssueList { report.conversion += it } } // create CityGML model @@ -94,16 +94,16 @@ class Roadspaces2CitygmlTransformer( private fun transformRoadspacesSequentially( roadspacesModel: RoadspacesModel - ): ContextMessageList> { - val messageList = DefaultMessageList() + ): ContextIssueList> { + val issueList = DefaultIssueList() // build objects val roadFeaturesProgressBar = ProgressBar("Transforming road", roadspacesModel.getAllRoadspaceNames().size) val roadFeatures = roadspacesModel .getAllRoadspaceNames() .map { roadLanesTransformer.transformRoad(it, roadspacesModel).also { roadFeaturesProgressBar.step() } } - .mergeMessageLists() - .handleMessageList { messageList += it } + .mergeIssueLists() + .handleIssueList { issueList += it } .flattenOption() val roadspaceObjectsProgressBar = @@ -114,8 +114,8 @@ class Roadspaces2CitygmlTransformer( roadObjectTransformer.transformRoadspaceObjects(it.roadspaceObjects) .also { roadspaceObjectsProgressBar.step() } } - .mergeMessageLists() - .handleMessageList { messageList += it } + .mergeIssueLists() + .handleIssueList { issueList += it } .flatten() val additionalRoadLines: List = if (parameters.transformAdditionalRoadLines) { @@ -123,20 +123,20 @@ class Roadspaces2CitygmlTransformer( ProgressBar("Transforming additional road lines", roadspacesModel.numberOfRoadspaces) roadspacesModel.getAllRoadspaces().map { roadLanesTransformer.transformAdditionalRoadLines(it).also { additionalRoadLinesProgressBar.step() } - }.mergeMessageLists().handleMessageList { messageList += it }.flatten() + }.mergeIssueLists().handleIssueList { issueList += it }.flatten() } else { emptyList() } addLaneTopology(roadspacesModel, roadFeatures) val cityObjects: List = roadFeatures + roadspaceObjects + additionalRoadLines - return ContextMessageList(cityObjects, messageList) + return ContextIssueList(cityObjects, issueList) } private fun transformRoadspacesConcurrently( roadspacesModel: RoadspacesModel - ): ContextMessageList> { - val messageList = DefaultMessageList() + ): ContextIssueList> { + val issueList = DefaultIssueList() // build objects val roadFeaturesProgressBar = ProgressBar("Transforming road", roadspacesModel.getAllRoadspaceNames().size) @@ -171,23 +171,23 @@ class Roadspaces2CitygmlTransformer( val roadFeatures = runBlocking { roadFeaturesDeferred.map { currentRoadFeature -> - currentRoadFeature.await().handleMessageList { messageList += it } + currentRoadFeature.await().handleIssueList { issueList += it } }.flattenOption() } val roadspaceObjects = runBlocking { roadspaceObjectsDeferred.map { currentRoadSpaceObject -> - currentRoadSpaceObject.await().handleMessageList { messageList += it } + currentRoadSpaceObject.await().handleIssueList { issueList += it } }.flatten() } val additionalRoadLines = runBlocking { additionalRoadLinesDeferred.flatMap { currentRoadLines -> - currentRoadLines.await().handleMessageList { messageList += it } + currentRoadLines.await().handleIssueList { issueList += it } } } addLaneTopology(roadspacesModel, roadFeatures) val cityObjects: List = roadFeatures + roadspaceObjects + additionalRoadLines - return ContextMessageList(cityObjects, messageList) + return ContextIssueList(cityObjects, issueList) } private fun addLaneTopology(roadspacesModel: RoadspacesModel, dstTransportationSpaces: List) { diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/BuildingModuleBuilder.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/BuildingModuleBuilder.kt index 283c37e3..7d9aa653 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/BuildingModuleBuilder.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/BuildingModuleBuilder.kt @@ -16,10 +16,10 @@ package io.rtron.transformer.converter.roadspaces2citygml.module -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.roadspaces.identifier.RoadspaceObjectIdentifier import io.rtron.model.roadspaces.roadspace.objects.RoadspaceObject import io.rtron.transformer.converter.roadspaces2citygml.Roadspaces2CitygmlParameters @@ -31,7 +31,7 @@ import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveGmlId import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveLod2GroundGmlIdentifier import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveLod2RoofGmlIdentifier import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveLod2WallGmlIdentifier -import io.rtron.transformer.messages.roadspaces.of +import io.rtron.transformer.issues.roadspaces.of import org.citygml4j.core.model.building.Building import org.citygml4j.core.model.construction.GroundSurface import org.citygml4j.core.model.construction.RoofSurface @@ -49,8 +49,8 @@ class BuildingModuleBuilder( private val attributesAdder = AttributesAdder(parameters) // Methods - fun createBuildingFeature(roadspaceObject: RoadspaceObject): ContextMessageList { - val messageList = DefaultMessageList() + fun createBuildingFeature(roadspaceObject: RoadspaceObject): ContextIssueList { + val issueList = DefaultIssueList() val buildingFeature = Building() @@ -62,7 +62,7 @@ class BuildingModuleBuilder( val geometryTransformer = GeometryTransformer.of(currentBoundingBoxGeometry, parameters) buildingFeature.populateLod1Geometry(geometryTransformer) .mapLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForBuildingLod1", it.message, roadspaceObject.id, @@ -82,7 +82,7 @@ class BuildingModuleBuilder( relationAdder.addBelongToRelations(roadspaceObject, buildingFeature) attributesAdder.addAttributes(roadspaceObject, buildingFeature) - return ContextMessageList(buildingFeature, messageList) + return ContextIssueList(buildingFeature, issueList) } /** @@ -93,13 +93,13 @@ class BuildingModuleBuilder( id: RoadspaceObjectIdentifier, geometryTransformer: GeometryTransformer, dstBuildingFeature: Building - ): ContextMessageList { + ): ContextIssueList { require(geometryTransformer.getSolid().isSome()) { "Solid geometry is required to create an LOD2 building." } - val messageList = DefaultMessageList() + val issueList = DefaultIssueList() dstBuildingFeature.populateLod2Geometry(geometryTransformer) .onLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForBuildingLod2", it.message, id, @@ -112,7 +112,7 @@ class BuildingModuleBuilder( geometryTransformer.getSolidCutout(GeometryTransformer.FaceType.TOP).onSome { roofSurfaceFeature.lod2MultiSurface = it }.onNone { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForRoofSurfaceLod2", "No LOD2 MultiSurface for roof feature available.", id, @@ -131,7 +131,7 @@ class BuildingModuleBuilder( geometryTransformer.getSolidCutout(GeometryTransformer.FaceType.BASE).onSome { groundSurfaceFeature.lod2MultiSurface = it }.onNone { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForGroundSurfaceLod2", "No LOD2 MultiSurface for ground feature available.", id, @@ -158,7 +158,7 @@ class BuildingModuleBuilder( ) } }.onNone { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForWallSurfaceLod2", "No LOD2 MultiSurface for wall feature available.", id, @@ -167,6 +167,6 @@ class BuildingModuleBuilder( ) } - return ContextMessageList(dstBuildingFeature, messageList) + return ContextIssueList(dstBuildingFeature, issueList) } } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/CityFurnitureModuleBuilder.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/CityFurnitureModuleBuilder.kt index 8d79b4e2..b943b26a 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/CityFurnitureModuleBuilder.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/CityFurnitureModuleBuilder.kt @@ -16,10 +16,10 @@ package io.rtron.transformer.converter.roadspaces2citygml.module -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.roadspaces.roadspace.objects.RoadspaceObject import io.rtron.transformer.converter.roadspaces2citygml.Roadspaces2CitygmlParameters import io.rtron.transformer.converter.roadspaces2citygml.geometry.GeometryTransformer @@ -27,7 +27,7 @@ import io.rtron.transformer.converter.roadspaces2citygml.geometry.populateLod1Ge import io.rtron.transformer.converter.roadspaces2citygml.geometry.populateLod1ImplicitGeometry import io.rtron.transformer.converter.roadspaces2citygml.geometry.populateLod2Geometry import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveGmlIdentifier -import io.rtron.transformer.messages.roadspaces.of +import io.rtron.transformer.issues.roadspaces.of import org.citygml4j.core.model.cityfurniture.CityFurniture /** @@ -41,9 +41,9 @@ class CityFurnitureModuleBuilder( private val attributesAdder = AttributesAdder(parameters) // Methods - fun createCityFurnitureFeature(roadspaceObject: RoadspaceObject): ContextMessageList { + fun createCityFurnitureFeature(roadspaceObject: RoadspaceObject): ContextIssueList { val cityFurnitureFeature = CityFurniture() - val messageList = DefaultMessageList() + val issueList = DefaultIssueList() // geometry val pointGeometryTransformer = GeometryTransformer.of(roadspaceObject.pointGeometry, parameters) @@ -53,7 +53,7 @@ class CityFurnitureModuleBuilder( val geometryTransformer = GeometryTransformer.of(currentBoundingBoxGeometry, parameters) cityFurnitureFeature.populateLod1Geometry(geometryTransformer) .mapLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForCityFurnitureLod1", it.message, roadspaceObject.id, @@ -67,7 +67,7 @@ class CityFurnitureModuleBuilder( val geometryTransformer = GeometryTransformer.of(currentComplexGeometry, parameters) cityFurnitureFeature.populateLod2Geometry(geometryTransformer) .onLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForCityFurnitureLod2", it.message, roadspaceObject.id, @@ -89,6 +89,6 @@ class CityFurnitureModuleBuilder( relationAdder.addBelongToRelations(roadspaceObject, cityFurnitureFeature) attributesAdder.addAttributes(roadspaceObject, cityFurnitureFeature) - return ContextMessageList(cityFurnitureFeature, messageList) + return ContextIssueList(cityFurnitureFeature, issueList) } } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/GenericsModuleBuilder.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/GenericsModuleBuilder.kt index 7fd12503..bb8c2743 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/GenericsModuleBuilder.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/GenericsModuleBuilder.kt @@ -16,10 +16,10 @@ package io.rtron.transformer.converter.roadspaces2citygml.module -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.math.geometry.euclidean.threed.AbstractGeometry3D import io.rtron.model.roadspaces.identifier.AbstractRoadspacesIdentifier import io.rtron.model.roadspaces.identifier.LaneIdentifier @@ -37,7 +37,7 @@ import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveLeftL import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveRightLaneBoundaryGmlIdentifier import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveRoadCenterLaneLineGmlIdentifier import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveRoadReferenceLineGmlIdentifier -import io.rtron.transformer.messages.roadspaces.of +import io.rtron.transformer.issues.roadspaces.of import org.citygml4j.core.model.generics.GenericLogicalSpace import org.citygml4j.core.model.generics.GenericOccupiedSpace @@ -52,8 +52,8 @@ class GenericsModuleBuilder( private val attributesAdder = AttributesAdder(parameters) // Methods - fun createGenericOccupiedSpaceFeature(roadspaceObject: RoadspaceObject): ContextMessageList { - val messageList = DefaultMessageList() + fun createGenericOccupiedSpaceFeature(roadspaceObject: RoadspaceObject): ContextIssueList { + val issueList = DefaultIssueList() val genericOccupiedSpaceFeature = GenericOccupiedSpace() @@ -65,7 +65,7 @@ class GenericsModuleBuilder( val geometryTransformer = GeometryTransformer.of(currentBoundingBoxGeometry, parameters) genericOccupiedSpaceFeature.populateLod1Geometry(geometryTransformer) .mapLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForGenericOccupiedSpaceLod1", it.message, roadspaceObject.id, @@ -79,7 +79,7 @@ class GenericsModuleBuilder( val geometryTransformer = GeometryTransformer.of(currentComplexGeometry, parameters) genericOccupiedSpaceFeature.populateLod2Geometry(geometryTransformer) .onLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForGenericOccupiedSpaceLod2", it.message, roadspaceObject.id, @@ -100,18 +100,18 @@ class GenericsModuleBuilder( relationAdder.addBelongToRelations(roadspaceObject, genericOccupiedSpaceFeature) attributesAdder.addAttributes(roadspaceObject, genericOccupiedSpaceFeature) - return ContextMessageList(genericOccupiedSpaceFeature, messageList) + return ContextIssueList(genericOccupiedSpaceFeature, issueList) } fun createRoadReferenceLine( id: RoadspaceIdentifier, abstractGeometry: AbstractGeometry3D, attributes: AttributeList - ): ContextMessageList { - val messageList = DefaultMessageList() + ): ContextIssueList { + val issueList = DefaultIssueList() val genericLogicalSpace = createLogicalOccupiedSpaceFeature(id, abstractGeometry) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } IdentifierAdder.addIdentifier( id.deriveRoadReferenceLineGmlIdentifier(parameters.gmlIdPrefix), "RoadReferenceLine", @@ -122,18 +122,18 @@ class GenericsModuleBuilder( genericLogicalSpace ) - return ContextMessageList(genericLogicalSpace, messageList) + return ContextIssueList(genericLogicalSpace, issueList) } fun createRoadCenterLaneLine( id: LaneIdentifier, abstractGeometry: AbstractGeometry3D, attributes: AttributeList - ): ContextMessageList { - val messageList = DefaultMessageList() + ): ContextIssueList { + val issueList = DefaultIssueList() val genericLogicalSpace = createLogicalOccupiedSpaceFeature(id, abstractGeometry) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } IdentifierAdder.addIdentifier( id.deriveRoadCenterLaneLineGmlIdentifier(parameters.gmlIdPrefix), "RoadCenterLaneLine", @@ -144,17 +144,17 @@ class GenericsModuleBuilder( genericLogicalSpace ) - return ContextMessageList(genericLogicalSpace, messageList) + return ContextIssueList(genericLogicalSpace, issueList) } fun createCenterLaneLine( id: LaneIdentifier, abstractGeometry: AbstractGeometry3D - ): ContextMessageList { - val messageList = DefaultMessageList() + ): ContextIssueList { + val issueList = DefaultIssueList() val genericLogicalSpace = createLogicalOccupiedSpaceFeature(id, abstractGeometry) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } IdentifierAdder.addIdentifier( id.deriveLaneCenterLineGmlIdentifier(parameters.gmlIdPrefix), "LaneCenterLine", @@ -165,17 +165,17 @@ class GenericsModuleBuilder( genericLogicalSpace ) - return ContextMessageList(genericLogicalSpace, messageList) + return ContextIssueList(genericLogicalSpace, issueList) } fun createLeftLaneBoundary( id: LaneIdentifier, abstractGeometry: AbstractGeometry3D - ): ContextMessageList { - val messageList = DefaultMessageList() + ): ContextIssueList { + val issueList = DefaultIssueList() val genericLogicalSpace = createLogicalOccupiedSpaceFeature(id, abstractGeometry) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } IdentifierAdder.addIdentifier( id.deriveLeftLaneBoundaryGmlIdentifier(parameters.gmlIdPrefix), "LeftLaneBoundary", @@ -186,17 +186,17 @@ class GenericsModuleBuilder( genericLogicalSpace ) - return ContextMessageList(genericLogicalSpace, messageList) + return ContextIssueList(genericLogicalSpace, issueList) } fun createRightLaneBoundary( id: LaneIdentifier, abstractGeometry: AbstractGeometry3D - ): ContextMessageList { - val messageList = DefaultMessageList() + ): ContextIssueList { + val issueList = DefaultIssueList() val genericLogicalSpace = createLogicalOccupiedSpaceFeature(id, abstractGeometry) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } IdentifierAdder.addIdentifier( id.deriveRightLaneBoundaryGmlIdentifier(parameters.gmlIdPrefix), "RightLaneBoundary", @@ -207,15 +207,15 @@ class GenericsModuleBuilder( genericLogicalSpace ) - return ContextMessageList(genericLogicalSpace, messageList) + return ContextIssueList(genericLogicalSpace, issueList) } private fun createLogicalOccupiedSpaceFeature( id: AbstractRoadspacesIdentifier, abstractGeometry: AbstractGeometry3D ): - ContextMessageList { - val messageList = DefaultMessageList() + ContextIssueList { + val issueList = DefaultIssueList() val genericLogicalSpaceFeature = GenericLogicalSpace() val geometryTransformer = GeometryTransformer(parameters) @@ -223,7 +223,7 @@ class GenericsModuleBuilder( // geometry genericLogicalSpaceFeature.populateLod2Geometry(geometryTransformer) .onLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForLogicalOccupiedSpaceFeatureLod2", it.message, id, @@ -232,6 +232,6 @@ class GenericsModuleBuilder( ) } - return ContextMessageList(genericLogicalSpaceFeature, messageList) + return ContextIssueList(genericLogicalSpaceFeature, issueList) } } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/TransportationModuleBuilder.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/TransportationModuleBuilder.kt index 5bee7686..f8f25aa0 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/TransportationModuleBuilder.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/TransportationModuleBuilder.kt @@ -17,10 +17,10 @@ package io.rtron.transformer.converter.roadspaces2citygml.module import arrow.core.Option -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.math.geometry.euclidean.threed.AbstractGeometry3D import io.rtron.math.geometry.euclidean.threed.curve.AbstractCurve3D import io.rtron.math.geometry.euclidean.threed.surface.AbstractSurface3D @@ -40,7 +40,7 @@ import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveGmlId import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveRoadMarkingGmlIdentifier import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveTrafficAreaOrAuxiliaryTrafficAreaGmlIdentifier import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveTrafficSpaceOrAuxiliaryTrafficSpaceGmlIdentifier -import io.rtron.transformer.messages.roadspaces.of +import io.rtron.transformer.issues.roadspaces.of import org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty import org.citygml4j.core.model.core.AbstractThematicSurface import org.citygml4j.core.model.transportation.AbstractTransportationSpace @@ -93,8 +93,8 @@ class TransportationModuleBuilder( longitudinalFillerSurfaces: List, relatedObjects: List, dstTransportationSpace: AbstractTransportationSpace - ): DefaultMessageList { - val messageList = DefaultMessageList() + ): DefaultIssueList { + val issueList = DefaultIssueList() val trafficSpaceFeature = createTrafficSpaceFeature(TransportationGranularityValue.LANE) // semantics @@ -114,7 +114,7 @@ class TransportationModuleBuilder( trafficSpaceFeature.populateLod2Geometry(centerLineGeometryTransformer) // traffic area feature - val trafficAreaFeature = createTrafficAreaFeature(lane.id, surface).handleMessageList { messageList += it } + val trafficAreaFeature = createTrafficAreaFeature(lane.id, surface).handleIssueList { issueList += it } IdentifierAdder.addIdentifier( lane.id.deriveTrafficAreaOrAuxiliaryTrafficAreaGmlIdentifier(parameters.gmlIdPrefix), "Lane", @@ -132,7 +132,7 @@ class TransportationModuleBuilder( val fillerTrafficArea = createTrafficAreaFeature( fillerSurface.id, fillerSurface.surface - ).handleMessageList { messageList += it } + ).handleIssueList { issueList += it } IdentifierAdder.addIdentifier( fillerSurface.id.deriveTrafficAreaOrAuxiliaryTrafficAreaGmlIdentifier( @@ -146,7 +146,7 @@ class TransportationModuleBuilder( } longitudinalFillerSurfaces.forEach { fillerSurface -> val fillerTrafficArea = - createTrafficAreaFeature(lane.id, fillerSurface.surface).handleMessageList { messageList += it } + createTrafficAreaFeature(lane.id, fillerSurface.surface).handleIssueList { issueList += it } IdentifierAdder.addIdentifier( fillerSurface.id.deriveTrafficAreaOrAuxiliaryTrafficAreaGmlIdentifier( @@ -163,7 +163,7 @@ class TransportationModuleBuilder( val trafficSpaceProperty = TrafficSpaceProperty(trafficSpaceFeature) dstTransportationSpace.trafficSpaces.add(trafficSpaceProperty) - return messageList + return issueList } /** @@ -177,8 +177,8 @@ class TransportationModuleBuilder( lateralFillerSurface: Option, longitudinalFillerSurfaces: List, dstTransportationSpace: AbstractTransportationSpace - ): DefaultMessageList { - val messageList = DefaultMessageList() + ): DefaultIssueList { + val issueList = DefaultIssueList() val auxiliaryTrafficSpaceFeature = createAuxiliaryTrafficSpaceFeature(TransportationGranularityValue.LANE) // semantics @@ -195,7 +195,7 @@ class TransportationModuleBuilder( // auxiliary traffic area feature val auxiliaryTrafficAreaFeature = createAuxiliaryTrafficAreaFeature(lane.id, surface) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } IdentifierAdder.addIdentifier( lane.id.deriveTrafficAreaOrAuxiliaryTrafficAreaGmlIdentifier(parameters.gmlIdPrefix), "Lane", @@ -213,7 +213,7 @@ class TransportationModuleBuilder( val fillerAuxiliaryTrafficArea = createAuxiliaryTrafficAreaFeature( fillerSurface.id, fillerSurface.surface - ).handleMessageList { messageList += it } + ).handleIssueList { issueList += it } IdentifierAdder.addIdentifier( fillerSurface.id.deriveTrafficAreaOrAuxiliaryTrafficAreaGmlIdentifier( @@ -227,7 +227,7 @@ class TransportationModuleBuilder( } longitudinalFillerSurfaces.forEach { fillerSurface -> val fillerAuxiliaryTrafficArea = createAuxiliaryTrafficAreaFeature(lane.id, fillerSurface.surface) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } IdentifierAdder.addIdentifier( fillerSurface.id.deriveTrafficAreaOrAuxiliaryTrafficAreaGmlIdentifier( @@ -244,14 +244,14 @@ class TransportationModuleBuilder( val auxiliaryTrafficSpaceProperty = AuxiliaryTrafficSpaceProperty(auxiliaryTrafficSpaceFeature) dstTransportationSpace.auxiliaryTrafficSpaces.add(auxiliaryTrafficSpaceProperty) - return messageList + return issueList } fun addTrafficSpaceFeature( roadspaceObject: RoadspaceObject, dstTransportationSpace: AbstractTransportationSpace - ): DefaultMessageList { - val messageList = DefaultMessageList() + ): DefaultIssueList { + val issueList = DefaultIssueList() val trafficSpaceFeature = createTrafficSpaceFeature(TransportationGranularityValue.LANE) IdentifierAdder.addIdentifier( @@ -283,7 +283,7 @@ class TransportationModuleBuilder( val solidFaceSelection = listOf(GeometryTransformer.FaceType.TOP, GeometryTransformer.FaceType.SIDE) trafficAreaFeature.populateLod2MultiSurfaceFromSolidCutoutOrSurface(geometryTransformer, solidFaceSelection) .onLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForTrafficAreaLod2", it.message, roadspaceObject.id, @@ -299,14 +299,14 @@ class TransportationModuleBuilder( val trafficSpaceProperty = TrafficSpaceProperty(trafficSpaceFeature) dstTransportationSpace.trafficSpaces.add(trafficSpaceProperty) - return messageList + return issueList } fun addAuxiliaryTrafficSpaceFeature( roadspaceObject: RoadspaceObject, dstTransportationSpace: AbstractTransportationSpace - ): DefaultMessageList { - val messageList = DefaultMessageList() + ): DefaultIssueList { + val issueList = DefaultIssueList() val auxiliaryTrafficSpaceFeature = createAuxiliaryTrafficSpaceFeature(TransportationGranularityValue.LANE) IdentifierAdder.addIdentifier( @@ -340,7 +340,7 @@ class TransportationModuleBuilder( solidFaceSelection ) .onLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForAuxiliaryTrafficAreaLod2", it.message, roadspaceObject.id, @@ -356,7 +356,7 @@ class TransportationModuleBuilder( val auxiliaryTrafficSpaceProperty = AuxiliaryTrafficSpaceProperty(auxiliaryTrafficSpaceFeature) dstTransportationSpace.auxiliaryTrafficSpaces.add(auxiliaryTrafficSpaceProperty) - return messageList + return issueList } fun addMarkingFeature( @@ -365,15 +365,15 @@ class TransportationModuleBuilder( roadMarking: RoadMarking, geometry: AbstractGeometry3D, dstTransportationSpace: AbstractTransportationSpace - ): DefaultMessageList { - val messageList = DefaultMessageList() + ): DefaultIssueList { + val issueList = DefaultIssueList() val markingFeature = if (parameters.mappingBackwardsCompatibility) AuxiliaryTrafficArea() else createMarking() // geometry val geometryTransformer = GeometryTransformer(parameters).also { geometry.accept(it) } markingFeature.populateLod2MultiSurfaceOrLod0Geometry(geometryTransformer) .onLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForMarkingLod2", it.message, id, @@ -392,14 +392,14 @@ class TransportationModuleBuilder( // populate transportation space addMarkingFeature(markingFeature, dstTransportationSpace) - return messageList + return issueList } fun addMarkingFeature( roadspaceObject: RoadspaceObject, dstTransportationSpace: AbstractTransportationSpace - ): DefaultMessageList { - val messageList = DefaultMessageList() + ): DefaultIssueList { + val issueList = DefaultIssueList() val markingFeature = if (parameters.mappingBackwardsCompatibility) AuxiliaryTrafficArea() else createMarking() // geometry @@ -407,7 +407,7 @@ class TransportationModuleBuilder( val geometryTransformer = GeometryTransformer.of(currentComplexGeometry, parameters) markingFeature.populateLod2MultiSurfaceOrLod0Geometry(geometryTransformer) .onLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForMarkingLod2", it.message, roadspaceObject.id, @@ -423,7 +423,7 @@ class TransportationModuleBuilder( // populate transportation space addMarkingFeature(markingFeature, dstTransportationSpace) - return messageList + return issueList } private fun createTrafficSpaceFeature(granularity: TransportationGranularityValue): TrafficSpace { @@ -441,8 +441,8 @@ class TransportationModuleBuilder( private fun createTrafficAreaFeature( id: AbstractRoadspacesIdentifier, abstractGeometry: AbstractGeometry3D - ): ContextMessageList { - val messageList = DefaultMessageList() + ): ContextIssueList { + val issueList = DefaultIssueList() val trafficAreaFeature = TrafficArea() val geometryTransformer = GeometryTransformer(parameters) @@ -450,7 +450,7 @@ class TransportationModuleBuilder( val solidFaceSelection = listOf(GeometryTransformer.FaceType.TOP, GeometryTransformer.FaceType.SIDE) trafficAreaFeature.populateLod2MultiSurfaceFromSolidCutoutOrSurface(geometryTransformer, solidFaceSelection) .onLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForTrafficAreaLod2", it.message, id, @@ -459,14 +459,14 @@ class TransportationModuleBuilder( ) } - return ContextMessageList(trafficAreaFeature, messageList) + return ContextIssueList(trafficAreaFeature, issueList) } private fun createAuxiliaryTrafficAreaFeature( id: AbstractRoadspacesIdentifier, abstractGeometry: AbstractGeometry3D - ): ContextMessageList { - val messageList = DefaultMessageList() + ): ContextIssueList { + val issueList = DefaultIssueList() val auxiliaryTrafficAreaFeature = AuxiliaryTrafficArea() val geometryTransformer = GeometryTransformer(parameters) @@ -478,7 +478,7 @@ class TransportationModuleBuilder( solidFaceSelection ) .onLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForAuxiliaryTrafficAreaLod2", it.message, id, @@ -487,7 +487,7 @@ class TransportationModuleBuilder( ) } - return ContextMessageList(auxiliaryTrafficAreaFeature, messageList) + return ContextIssueList(auxiliaryTrafficAreaFeature, issueList) } /** diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/VegetationModuleBuilder.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/VegetationModuleBuilder.kt index 06d8e585..57e35e6d 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/VegetationModuleBuilder.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/module/VegetationModuleBuilder.kt @@ -19,10 +19,10 @@ package io.rtron.transformer.converter.roadspaces2citygml.module import arrow.core.Either import arrow.core.getOrElse import arrow.core.raise.either -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.roadspaces.roadspace.attribute.UnitOfMeasure import io.rtron.model.roadspaces.roadspace.objects.RoadspaceObject import io.rtron.transformer.converter.roadspaces2citygml.Roadspaces2CitygmlParameters @@ -31,7 +31,7 @@ import io.rtron.transformer.converter.roadspaces2citygml.geometry.populateLod1Ge import io.rtron.transformer.converter.roadspaces2citygml.geometry.populateLod1ImplicitGeometry import io.rtron.transformer.converter.roadspaces2citygml.geometry.populateLod2Geometry import io.rtron.transformer.converter.roadspaces2citygml.transformer.deriveGmlIdentifier -import io.rtron.transformer.messages.roadspaces.of +import io.rtron.transformer.issues.roadspaces.of import org.citygml4j.core.model.vegetation.SolitaryVegetationObject import org.xmlobjects.gml.model.measures.Length @@ -47,8 +47,8 @@ class VegetationModuleBuilder( // Methods - fun createSolitaryVegetationObjectFeature(roadspaceObject: RoadspaceObject): ContextMessageList { - val messageList = DefaultMessageList() + fun createSolitaryVegetationObjectFeature(roadspaceObject: RoadspaceObject): ContextIssueList { + val issueList = DefaultIssueList() val solitaryVegetationObjectFeature = SolitaryVegetationObject() @@ -63,7 +63,7 @@ class VegetationModuleBuilder( val geometryTransformer = GeometryTransformer.of(currentBoundingBoxGeometry, parameters) solitaryVegetationObjectFeature.populateLod1Geometry(geometryTransformer) .mapLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForSolitaryVegetationObjectLod1", it.message, roadspaceObject.id, @@ -79,7 +79,7 @@ class VegetationModuleBuilder( val geometryTransformer = GeometryTransformer.of(currentComplexGeometry, parameters) solitaryVegetationObjectFeature.populateLod2Geometry(geometryTransformer) .mapLeft { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoSuitableGeometryForSolitaryVegetationObjectLod2", it.message, roadspaceObject.id, @@ -97,7 +97,7 @@ class VegetationModuleBuilder( relationAdder.addBelongToRelations(roadspaceObject, solitaryVegetationObjectFeature) attributesAdder.addAttributes(roadspaceObject, solitaryVegetationObjectFeature) - return ContextMessageList(solitaryVegetationObjectFeature, messageList) + return ContextIssueList(solitaryVegetationObjectFeature, issueList) } private fun addAttributes( diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/report/Roadspaces2CitygmlReport.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/report/Roadspaces2CitygmlReport.kt index 3dced0a7..1aafdc38 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/report/Roadspaces2CitygmlReport.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/report/Roadspaces2CitygmlReport.kt @@ -16,8 +16,8 @@ package io.rtron.transformer.converter.roadspaces2citygml.report -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.getTextSummary +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.getTextSummary import io.rtron.transformer.converter.roadspaces2citygml.Roadspaces2CitygmlParameters import kotlinx.serialization.Serializable @@ -25,7 +25,7 @@ import kotlinx.serialization.Serializable data class Roadspaces2CitygmlReport( val parameters: Roadspaces2CitygmlParameters, - val conversion: DefaultMessageList = DefaultMessageList() + val conversion: DefaultIssueList = DefaultIssueList() ) { // Methods diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/transformer/RoadsTransformer.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/transformer/RoadsTransformer.kt index ed997885..0d9792ca 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/transformer/RoadsTransformer.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/transformer/RoadsTransformer.kt @@ -19,11 +19,11 @@ package io.rtron.transformer.converter.roadspaces2citygml.transformer import arrow.core.Option import arrow.core.Some import arrow.core.getOrElse -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity -import io.rtron.io.messages.mergeMessageLists +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity +import io.rtron.io.issues.mergeIssueLists import io.rtron.model.roadspaces.RoadspacesModel import io.rtron.model.roadspaces.common.LongitudinalFillerSurface import io.rtron.model.roadspaces.identifier.JunctionIdentifier @@ -39,7 +39,7 @@ import io.rtron.transformer.converter.roadspaces2citygml.module.IdentifierAdder import io.rtron.transformer.converter.roadspaces2citygml.module.TransportationModuleBuilder import io.rtron.transformer.converter.roadspaces2citygml.router.LaneRouter import io.rtron.transformer.converter.roadspaces2citygml.router.RoadspaceObjectRouter -import io.rtron.transformer.messages.roadspaces.of +import io.rtron.transformer.issues.roadspaces.of import org.citygml4j.core.model.core.AbstractCityObject import org.citygml4j.core.model.core.CityModel import org.citygml4j.core.model.transportation.AbstractTransportationSpace @@ -61,8 +61,8 @@ class RoadsTransformer( // Methods - fun transformRoad(roadspaceName: String, roadspacesModel: RoadspacesModel): ContextMessageList> { - val messageList = DefaultMessageList() + fun transformRoad(roadspaceName: String, roadspacesModel: RoadspacesModel): ContextIssueList> { + val issueList = DefaultIssueList() val roadFeature = transportationModuleBuilder.createRoad() IdentifierAdder.addIdentifier(generateRoadIdentifier(roadspaceName, parameters.gmlIdPrefix), roadFeature) @@ -72,19 +72,19 @@ class RoadsTransformer( val junctions = roadspacesModel.getAllJunctionIdentifiersContainingRoadspaces(roadspaceName) junctions.forEach { - messageList += addIntersectionOrLink(it, roadspaceName, roadspacesModel, roadFeature) + issueList += addIntersectionOrLink(it, roadspaceName, roadspacesModel, roadFeature) } val roads = roadspacesModel.getAllRoadspaceIdentifiersNotLocatedInJunctions(roadspaceName) roads.forEach { - messageList += addSection(it, roadspacesModel, roadFeature) + issueList += addSection(it, roadspacesModel, roadFeature) } - return ContextMessageList(Some(roadFeature), messageList) + return ContextIssueList(Some(roadFeature), issueList) } - private fun addIntersectionOrLink(junctionId: JunctionIdentifier, roadspaceName: String, roadspacesModel: RoadspacesModel, dstRoad: CitygmlRoad): DefaultMessageList { - val messageList = DefaultMessageList() + private fun addIntersectionOrLink(junctionId: JunctionIdentifier, roadspaceName: String, roadspacesModel: RoadspacesModel, dstRoad: CitygmlRoad): DefaultIssueList { + val issueList = DefaultIssueList() val roadspacesInJunction = roadspacesModel.getRoadspacesWithinJunction(junctionId) .getOrElse { throw it } @@ -92,73 +92,73 @@ class RoadsTransformer( if (roadspacesInJunction.first().name == roadspaceName && parameters.mappingBackwardsCompatibility) { roadspacesInJunction.forEach { - messageList += addRoadspace(it, roadspacesModel, dstRoad) + issueList += addRoadspace(it, roadspacesModel, dstRoad) } } else if (roadspacesInJunction.first().name == roadspaceName && !parameters.mappingBackwardsCompatibility) { val intersectionFeature = transportationModuleBuilder.createIntersection() IdentifierAdder.addIdentifier(junctionId.deriveIntersectionGmlIdentifier(parameters.gmlIdPrefix), intersectionFeature) roadspacesInJunction.forEach { - messageList += addRoadspace(it, roadspacesModel, intersectionFeature) + issueList += addRoadspace(it, roadspacesModel, intersectionFeature) } dstRoad.intersections.add(IntersectionProperty(intersectionFeature)) } else { dstRoad.intersections.add(IntersectionProperty(junctionId.deriveIntersectionGmlIdentifier(parameters.gmlIdPrefix))) } - return messageList + return issueList } - private fun addSection(roadspaceId: RoadspaceIdentifier, roadspacesModel: RoadspacesModel, dstRoad: CitygmlRoad): DefaultMessageList { - val messageList = DefaultMessageList() + private fun addSection(roadspaceId: RoadspaceIdentifier, roadspacesModel: RoadspacesModel, dstRoad: CitygmlRoad): DefaultIssueList { + val issueList = DefaultIssueList() val roadspace = roadspacesModel.getRoadspace(roadspaceId).getOrElse { throw it } if (parameters.mappingBackwardsCompatibility) { - messageList += addRoadspace(roadspace, roadspacesModel, dstRoad) + issueList += addRoadspace(roadspace, roadspacesModel, dstRoad) } else { val sectionFeature = transportationModuleBuilder.createSection() IdentifierAdder.addIdentifier(roadspaceId.deriveSectionGmlIdentifier(parameters.gmlIdPrefix), sectionFeature) - messageList += addRoadspace(roadspace, roadspacesModel, sectionFeature) + issueList += addRoadspace(roadspace, roadspacesModel, sectionFeature) dstRoad.sections.add(SectionProperty(sectionFeature)) } - return messageList + return issueList } - fun transformAdditionalRoadLines(roadspace: Roadspace): ContextMessageList> { - val messageList = DefaultMessageList() + fun transformAdditionalRoadLines(roadspace: Roadspace): ContextIssueList> { + val issueList = DefaultIssueList() // transforms the road reference line val roadReferenceLine = genericsModuleBuilder .createRoadReferenceLine(roadspace.id, roadspace.referenceLine, roadspace.attributes) - .handleMessageList { messageList += it } + .handleIssueList { issueList += it } // transforms the lines of the center lane (id=0) val roadCenterLaneLines = roadspace.road.getAllCenterLanes() .map { genericsModuleBuilder.createRoadCenterLaneLine(it.first, it.second, it.third) } - .mergeMessageLists() - .handleMessageList { messageList += it } + .mergeIssueLists() + .handleIssueList { issueList += it } // transforms lane boundaries and center lines of the lanes val leftLaneBoundaries = roadspace.road.getAllLeftLaneBoundaries() .map { genericsModuleBuilder.createLeftLaneBoundary(it.first, it.second) } - .mergeMessageLists() - .handleMessageList { messageList += it } + .mergeIssueLists() + .handleIssueList { issueList += it } val rightLaneBoundaries = roadspace.road.getAllRightLaneBoundaries() .map { genericsModuleBuilder.createRightLaneBoundary(it.first, it.second) } - .mergeMessageLists() - .handleMessageList { messageList += it } + .mergeIssueLists() + .handleIssueList { issueList += it } val laneCenterLines = roadspace.road.getAllCurvesOnLanes(0.5) .map { genericsModuleBuilder.createCenterLaneLine(it.first, it.second) } - .mergeMessageLists() - .handleMessageList { messageList += it } + .mergeIssueLists() + .handleIssueList { issueList += it } val additionalRoadLines = listOf(roadReferenceLine) + roadCenterLaneLines + leftLaneBoundaries + rightLaneBoundaries + laneCenterLines - return ContextMessageList(additionalRoadLines, messageList) + return ContextIssueList(additionalRoadLines, issueList) } - private fun addRoadspace(roadspace: Roadspace, roadspacesModel: RoadspacesModel, dstTransportationSpace: AbstractTransportationSpace): DefaultMessageList { - val messageList = DefaultMessageList() + private fun addRoadspace(roadspace: Roadspace, roadspacesModel: RoadspacesModel, dstTransportationSpace: AbstractTransportationSpace): DefaultIssueList { + val issueList = DefaultIssueList() roadspace.road.getAllLeftRightLaneIdentifiers().forEach { laneId -> val longitudinalFillerSurfaces = @@ -168,29 +168,29 @@ class RoadsTransformer( emptyList() } val relatedObjects = roadspace.roadspaceObjects.filter { it.isRelatedToLane(laneId) } - messageList += addSingleLane(laneId, roadspace.road, longitudinalFillerSurfaces, relatedObjects, dstTransportationSpace) + issueList += addSingleLane(laneId, roadspace.road, longitudinalFillerSurfaces, relatedObjects, dstTransportationSpace) } roadspace.roadspaceObjects.forEach { addSingleRoadspaceObject(it, dstTransportationSpace) } roadspace.road.getAllLaneIdentifiers().forEach { - messageList += addRoadMarkings(it, roadspace.road, dstTransportationSpace) + issueList += addRoadMarkings(it, roadspace.road, dstTransportationSpace) } - return messageList + return issueList } - private fun addSingleLane(id: LaneIdentifier, road: Road, longitudinalFillerSurfaces: List, relatedObjects: List, dstTransportationSpace: AbstractTransportationSpace): DefaultMessageList { - val messageList = DefaultMessageList() + private fun addSingleLane(id: LaneIdentifier, road: Road, longitudinalFillerSurfaces: List, relatedObjects: List, dstTransportationSpace: AbstractTransportationSpace): DefaultIssueList { + val issueList = DefaultIssueList() val lane = road.getLane(id) - .getOrElse { messageList += DefaultMessage.of("LaneNotConstructable", "${it.message} Ignoring lane.", id, Severity.WARNING, wasFixed = true); return messageList } + .getOrElse { issueList += DefaultIssue.of("LaneNotConstructable", "${it.message} Ignoring lane.", id, Severity.WARNING, wasFixed = true); return issueList } val surface = road.getLaneSurface(id, parameters.discretizationStepSize) - .getOrElse { messageList += DefaultMessage.of("LaneSurfaceNotConstructable", "${it.message} Ignoring lane.", id, Severity.WARNING, wasFixed = true); return messageList } + .getOrElse { issueList += DefaultIssue.of("LaneSurfaceNotConstructable", "${it.message} Ignoring lane.", id, Severity.WARNING, wasFixed = true); return issueList } val centerLine = road.getCurveOnLane(id, 0.5) - .getOrElse { messageList += DefaultMessage.of("CenterLineNotConstructable", "${it.message} Ignoring lane.", id, Severity.WARNING, wasFixed = true); return messageList } + .getOrElse { issueList += DefaultIssue.of("CenterLineNotConstructable", "${it.message} Ignoring lane.", id, Severity.WARNING, wasFixed = true); return issueList } val lateralFillerSurface = road.getLateralFillerSurface(id, parameters.discretizationStepSize) - .getOrElse { messageList += DefaultMessage.of("LateralFillerSurfaceNotConstructable", "${it.message} Ignoring lane.", id, Severity.WARNING, wasFixed = true); return messageList } + .getOrElse { issueList += DefaultIssue.of("LateralFillerSurfaceNotConstructable", "${it.message} Ignoring lane.", id, Severity.WARNING, wasFixed = true); return issueList } - messageList += when (LaneRouter.route(lane)) { + issueList += when (LaneRouter.route(lane)) { LaneRouter.CitygmlTargetFeatureType.TRANSPORTATION_TRAFFICSPACE -> { transportationModuleBuilder.addTrafficSpaceFeature(lane, surface, centerLine, lateralFillerSurface, longitudinalFillerSurfaces, relatedObjects, dstTransportationSpace) } @@ -200,21 +200,21 @@ class RoadsTransformer( } } - return messageList + return issueList } - private fun addSingleRoadspaceObject(roadspaceObject: RoadspaceObject, dstTransportationSpace: AbstractTransportationSpace): DefaultMessageList { - val messageList = DefaultMessageList() + private fun addSingleRoadspaceObject(roadspaceObject: RoadspaceObject, dstTransportationSpace: AbstractTransportationSpace): DefaultIssueList { + val issueList = DefaultIssueList() when (RoadspaceObjectRouter.route(roadspaceObject)) { RoadspaceObjectRouter.CitygmlTargetFeatureType.TRANSPORTATION_TRAFFICSPACE -> { - messageList += transportationModuleBuilder.addTrafficSpaceFeature(roadspaceObject, dstTransportationSpace) + issueList += transportationModuleBuilder.addTrafficSpaceFeature(roadspaceObject, dstTransportationSpace) } RoadspaceObjectRouter.CitygmlTargetFeatureType.TRANSPORTATION_AUXILIARYTRAFFICSPACE -> { - messageList += transportationModuleBuilder.addAuxiliaryTrafficSpaceFeature(roadspaceObject, dstTransportationSpace) + issueList += transportationModuleBuilder.addAuxiliaryTrafficSpaceFeature(roadspaceObject, dstTransportationSpace) } RoadspaceObjectRouter.CitygmlTargetFeatureType.TRANSPORTATION_MARKING -> { - messageList += transportationModuleBuilder.addMarkingFeature(roadspaceObject, dstTransportationSpace) + issueList += transportationModuleBuilder.addMarkingFeature(roadspaceObject, dstTransportationSpace) } RoadspaceObjectRouter.CitygmlTargetFeatureType.BUILDING_BUILDING -> {} RoadspaceObjectRouter.CitygmlTargetFeatureType.CITYFURNITURE_CITYFURNITURE -> {} @@ -222,17 +222,17 @@ class RoadsTransformer( RoadspaceObjectRouter.CitygmlTargetFeatureType.VEGETATION_SOLITARYVEGETATIONOBJECT -> {} } - return messageList + return issueList } - private fun addRoadMarkings(id: LaneIdentifier, road: Road, dstTransportationSpace: AbstractTransportationSpace): DefaultMessageList { - val messageList = DefaultMessageList() + private fun addRoadMarkings(id: LaneIdentifier, road: Road, dstTransportationSpace: AbstractTransportationSpace): DefaultIssueList { + val issueList = DefaultIssueList() road.getRoadMarkings(id, parameters.discretizationStepSize) - .handleLeftAndFilter { messageList += DefaultMessage.of("RoadMarkingNotConstructable", it.value.message!!, id, Severity.WARNING, wasFixed = true) } + .handleLeftAndFilter { issueList += DefaultIssue.of("RoadMarkingNotConstructable", it.value.message!!, id, Severity.WARNING, wasFixed = true) } .forEachIndexed { index, (roadMarking, geometry) -> - messageList += transportationModuleBuilder.addMarkingFeature(id, index, roadMarking, geometry, dstTransportationSpace) + issueList += transportationModuleBuilder.addMarkingFeature(id, index, roadMarking, geometry, dstTransportationSpace) } - return messageList + return issueList } } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/transformer/RoadspaceObjectTransformer.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/transformer/RoadspaceObjectTransformer.kt index afede177..c33c5b26 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/transformer/RoadspaceObjectTransformer.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/converter/roadspaces2citygml/transformer/RoadspaceObjectTransformer.kt @@ -20,9 +20,9 @@ import arrow.core.None import arrow.core.Option import arrow.core.flattenOption import arrow.core.some -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.mergeMessageLists +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.mergeIssueLists import io.rtron.model.roadspaces.roadspace.objects.RoadspaceObject import io.rtron.transformer.converter.roadspaces2citygml.Roadspaces2CitygmlParameters import io.rtron.transformer.converter.roadspaces2citygml.module.BuildingModuleBuilder @@ -51,10 +51,10 @@ class RoadspaceObjectTransformer( /** * Transforms a list of [roadspaceObjects] (RoadSpaces model) to the [AbstractCityObject] (CityGML model). */ - fun transformRoadspaceObjects(roadspaceObjects: List): ContextMessageList> { + fun transformRoadspaceObjects(roadspaceObjects: List): ContextIssueList> { return roadspaceObjects .map { transformSingleRoadspaceObject(it) } - .mergeMessageLists() + .mergeIssueLists() .map { it.flattenOption() } } @@ -65,19 +65,19 @@ class RoadspaceObjectTransformer( * @param roadspaceObject road space object from the RoadSpaces model * @return city object (CityGML model) */ - private fun transformSingleRoadspaceObject(roadspaceObject: RoadspaceObject): ContextMessageList> { - val messageList = DefaultMessageList() + private fun transformSingleRoadspaceObject(roadspaceObject: RoadspaceObject): ContextIssueList> { + val issueList = DefaultIssueList() val cityObjects: Option = when (RoadspaceObjectRouter.route(roadspaceObject)) { - RoadspaceObjectRouter.CitygmlTargetFeatureType.BUILDING_BUILDING -> buildingModuleBuilder.createBuildingFeature(roadspaceObject).handleMessageList { messageList += it }.some() - RoadspaceObjectRouter.CitygmlTargetFeatureType.CITYFURNITURE_CITYFURNITURE -> cityFurnitureModuleBuilder.createCityFurnitureFeature(roadspaceObject).handleMessageList { messageList += it }.some() - RoadspaceObjectRouter.CitygmlTargetFeatureType.GENERICS_GENERICOCCUPIEDSPACE -> genericsModuleBuilder.createGenericOccupiedSpaceFeature(roadspaceObject).handleMessageList { messageList += it }.some() + RoadspaceObjectRouter.CitygmlTargetFeatureType.BUILDING_BUILDING -> buildingModuleBuilder.createBuildingFeature(roadspaceObject).handleIssueList { issueList += it }.some() + RoadspaceObjectRouter.CitygmlTargetFeatureType.CITYFURNITURE_CITYFURNITURE -> cityFurnitureModuleBuilder.createCityFurnitureFeature(roadspaceObject).handleIssueList { issueList += it }.some() + RoadspaceObjectRouter.CitygmlTargetFeatureType.GENERICS_GENERICOCCUPIEDSPACE -> genericsModuleBuilder.createGenericOccupiedSpaceFeature(roadspaceObject).handleIssueList { issueList += it }.some() RoadspaceObjectRouter.CitygmlTargetFeatureType.TRANSPORTATION_TRAFFICSPACE -> None RoadspaceObjectRouter.CitygmlTargetFeatureType.TRANSPORTATION_AUXILIARYTRAFFICSPACE -> None RoadspaceObjectRouter.CitygmlTargetFeatureType.TRANSPORTATION_MARKING -> None - RoadspaceObjectRouter.CitygmlTargetFeatureType.VEGETATION_SOLITARYVEGETATIONOBJECT -> vegetationModuleBuilder.createSolitaryVegetationObjectFeature(roadspaceObject).handleMessageList { messageList += it }.some() + RoadspaceObjectRouter.CitygmlTargetFeatureType.VEGETATION_SOLITARYVEGETATIONOBJECT -> vegetationModuleBuilder.createSolitaryVegetationObjectFeature(roadspaceObject).handleIssueList { issueList += it }.some() } - return ContextMessageList(cityObjects, messageList) + return ContextIssueList(cityObjects, issueList) } } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/OpendriveEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/OpendriveEvaluator.kt index 4c6ea202..d4affe77 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/OpendriveEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/OpendriveEvaluator.kt @@ -19,7 +19,7 @@ package io.rtron.transformer.evaluator.opendrive import arrow.core.None import arrow.core.Option import arrow.core.some -import io.rtron.io.messages.containsFatalErrors +import io.rtron.io.issues.containsFatalErrors import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.extensions.updateAdditionalIdentifiers import io.rtron.transformer.evaluator.opendrive.plans.basicdatatype.BasicDataTypeEvaluator @@ -50,7 +50,7 @@ class OpendriveEvaluator( // basic data type evaluation basicDataTypeEvaluator.evaluate(modifiedOpendriveModel).let { - report.basicDataTypePlan = it.messageList + report.basicDataTypePlan = it.issueList modifiedOpendriveModel = it.value } if (report.basicDataTypePlan.containsFatalErrors()) { @@ -59,7 +59,7 @@ class OpendriveEvaluator( // modeling rules evaluation modelingRulesEvaluator.evaluate(modifiedOpendriveModel).let { - report.modelingRulesPlan = it.messageList + report.modelingRulesPlan = it.issueList modifiedOpendriveModel = it.value } if (report.modelingRulesPlan.containsFatalErrors()) { @@ -68,7 +68,7 @@ class OpendriveEvaluator( // conversion requirements evaluation conversionRequirementsEvaluator.evaluate(modifiedOpendriveModel).let { - report.conversionRequirementsPlan = it.messageList + report.conversionRequirementsPlan = it.issueList modifiedOpendriveModel = it.value } if (report.conversionRequirementsPlan.containsFatalErrors()) { diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/modifiers/BasicDataTypeModifier.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/modifiers/BasicDataTypeModifier.kt index 176633dc..552bfe2a 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/modifiers/BasicDataTypeModifier.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/modifiers/BasicDataTypeModifier.kt @@ -18,9 +18,9 @@ package io.rtron.transformer.evaluator.opendrive.modifiers import arrow.core.None import arrow.core.Option -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.opendrive.additions.identifier.AbstractOpendriveIdentifier import io.rtron.model.opendrive.additions.identifier.toIdentifierText import io.rtron.std.filterToSortingBy @@ -28,49 +28,49 @@ import io.rtron.std.filterToStrictSortingBy object BasicDataTypeModifier { - fun > filterToStrictlySorted(elementList: List, selector: (T) -> K, location: String, attributeName: String, messageList: DefaultMessageList): List { + fun > filterToStrictlySorted(elementList: List, selector: (T) -> K, location: String, attributeName: String, issueList: DefaultIssueList): List { val elementListFiltered = elementList.filterToStrictSortingBy(selector) val numberOfIgnoredElements = elementList.size - elementListFiltered.size if (numberOfIgnoredElements > 0) { - messageList += DefaultMessage("NonStrictlyAscendingSortedList", "The list entries of the attribute '$attributeName' are not sorted in strictly ascending order. $numberOfIgnoredElements elements are removed to adhere to strictly ascending order.", location, Severity.WARNING, true) + issueList += DefaultIssue("NonStrictlyAscendingSortedList", "The list entries of the attribute '$attributeName' are not sorted in strictly ascending order. $numberOfIgnoredElements elements are removed to adhere to strictly ascending order.", location, Severity.WARNING, true) } return elementListFiltered } - fun > filterToStrictlySorted(elementList: List, selector: (T) -> K, location: Option, attributeName: String, messageList: DefaultMessageList): List { - return filterToStrictlySorted(elementList, selector, location.toIdentifierText(), attributeName, messageList) + fun > filterToStrictlySorted(elementList: List, selector: (T) -> K, location: Option, attributeName: String, issueList: DefaultIssueList): List { + return filterToStrictlySorted(elementList, selector, location.toIdentifierText(), attributeName, issueList) } - fun > filterToSorted(elementList: List, selector: (T) -> K, location: String, attributeName: String, messageList: DefaultMessageList): List { + fun > filterToSorted(elementList: List, selector: (T) -> K, location: String, attributeName: String, issueList: DefaultIssueList): List { val elementListFiltered = elementList.filterToSortingBy(selector) val numberOfIgnoredElements = elementList.size - elementListFiltered.size if (numberOfIgnoredElements > 0) { - messageList += DefaultMessage("NonAscendingSortedList", "The list entries of the attribute '$attributeName' are not sorted in ascending order. $numberOfIgnoredElements elements are removed to adhere to ascending order.", location, Severity.WARNING, true) + issueList += DefaultIssue("NonAscendingSortedList", "The list entries of the attribute '$attributeName' are not sorted in ascending order. $numberOfIgnoredElements elements are removed to adhere to ascending order.", location, Severity.WARNING, true) } return elementListFiltered } - fun > filterToSorted(elementList: List, selector: (T) -> K, location: Option, attributeName: String, messageList: DefaultMessageList): List { - return filterToSorted(elementList, selector, location.toIdentifierText(), attributeName, messageList) + fun > filterToSorted(elementList: List, selector: (T) -> K, location: Option, attributeName: String, issueList: DefaultIssueList): List { + return filterToSorted(elementList, selector, location.toIdentifierText(), attributeName, issueList) } - fun modifyToNonBlankString(element: String, location: Option, attributeName: String, messageList: DefaultMessageList, fallbackValue: String): String { + fun modifyToNonBlankString(element: String, location: Option, attributeName: String, issueList: DefaultIssueList, fallbackValue: String): String { if (element.isBlank()) { - messageList += DefaultMessage("BlankStringAttributeValue", "The value of the attribute '$attributeName' is blank. The attribute is set to '$fallbackValue'.", location.toIdentifierText(), Severity.WARNING, wasFixed = true) + issueList += DefaultIssue("BlankStringAttributeValue", "The value of the attribute '$attributeName' is blank. The attribute is set to '$fallbackValue'.", location.toIdentifierText(), Severity.WARNING, wasFixed = true) return fallbackValue } return element } - fun modifyToOptionalString(optionalElement: Option, location: Option, attributeName: String, messageList: DefaultMessageList): Option = - modifyToOptionalString(optionalElement, location.toIdentifierText(), attributeName, messageList) + fun modifyToOptionalString(optionalElement: Option, location: Option, attributeName: String, issueList: DefaultIssueList): Option = + modifyToOptionalString(optionalElement, location.toIdentifierText(), attributeName, issueList) - fun modifyToOptionalString(optionalElement: Option, location: String, attributeName: String, messageList: DefaultMessageList): Option { + fun modifyToOptionalString(optionalElement: Option, location: String, attributeName: String, issueList: DefaultIssueList): Option { if (optionalElement.isSome { it.isBlank() }) { - messageList += DefaultMessage( + issueList += DefaultIssue( "BlankStringAttributeValueForOptionalAttribute", "The value of the attribute '$attributeName' is blank. The attribute is unset as it is optional.", location, @@ -83,12 +83,12 @@ object BasicDataTypeModifier { return optionalElement } - fun modifyToOptionalFiniteDouble(optionalElement: Option, location: Option, attributeName: String, messageList: DefaultMessageList): Option = - modifyToOptionalFiniteDouble(optionalElement, location.toIdentifierText(), attributeName, messageList) + fun modifyToOptionalFiniteDouble(optionalElement: Option, location: Option, attributeName: String, issueList: DefaultIssueList): Option = + modifyToOptionalFiniteDouble(optionalElement, location.toIdentifierText(), attributeName, issueList) - fun modifyToOptionalFiniteDouble(optionalElement: Option, location: String, attributeName: String, messageList: DefaultMessageList): Option { + fun modifyToOptionalFiniteDouble(optionalElement: Option, location: String, attributeName: String, issueList: DefaultIssueList): Option { if (optionalElement.isSome { !it.isFinite() }) { - messageList += DefaultMessage( + issueList += DefaultIssue( "NonFiniteDoubleAttributeValue", "The value of the attribute '$attributeName' is not finite. The attribute is unset as it is optional.", location, @@ -101,9 +101,9 @@ object BasicDataTypeModifier { return optionalElement } - fun modifyToOptionalFinitePositiveDouble(optionalElement: Option, location: Option, attributeName: String, messageList: DefaultMessageList, tolerance: Double = 0.0): Option { + fun modifyToOptionalFinitePositiveDouble(optionalElement: Option, location: Option, attributeName: String, issueList: DefaultIssueList, tolerance: Double = 0.0): Option { if (optionalElement.isSome { !it.isFinite() || it < tolerance }) { - messageList += DefaultMessage( + issueList += DefaultIssue( "NonFinitePositiveDoubleAttributeValue", "The value of the attribute '$attributeName' is not finite or not positive (applied tolerance: $tolerance). The attribute is unset as it is optional.", location.toIdentifierText(), @@ -116,21 +116,21 @@ object BasicDataTypeModifier { return optionalElement } - fun modifyToFinitePositiveDouble(element: Double, location: Option, attributeName: String, messageList: DefaultMessageList): Double { + fun modifyToFinitePositiveDouble(element: Double, location: Option, attributeName: String, issueList: DefaultIssueList): Double { if (!element.isFinite() || element < 0.0) { - messageList += DefaultMessage("NonFinitePositiveDoubleAttributeValue", "The value of the attribute '$attributeName' is not finite or not positive (applied tolerance: 0.0). The attribute value is set to 0.0.", location.toIdentifierText(), Severity.WARNING, wasFixed = true) + issueList += DefaultIssue("NonFinitePositiveDoubleAttributeValue", "The value of the attribute '$attributeName' is not finite or not positive (applied tolerance: 0.0). The attribute value is set to 0.0.", location.toIdentifierText(), Severity.WARNING, wasFixed = true) return 0.0 } return element } - fun modifyToFiniteDouble(element: Double, location: Option, attributeName: String, messageList: DefaultMessageList): Double = - modifyToFiniteDouble(element, location.toIdentifierText(), attributeName, messageList) + fun modifyToFiniteDouble(element: Double, location: Option, attributeName: String, issueList: DefaultIssueList): Double = + modifyToFiniteDouble(element, location.toIdentifierText(), attributeName, issueList) - fun modifyToFiniteDouble(element: Double, location: String, attributeName: String, messageList: DefaultMessageList): Double { + fun modifyToFiniteDouble(element: Double, location: String, attributeName: String, issueList: DefaultIssueList): Double { if (!element.isFinite()) { - messageList += DefaultMessage("NonFiniteAttributeValue", "The value of the attribute '$attributeName' is not finite. The attribute value is set to 0.0.", location, Severity.WARNING, wasFixed = true) + issueList += DefaultIssue("NonFiniteAttributeValue", "The value of the attribute '$attributeName' is not finite. The attribute value is set to 0.0.", location, Severity.WARNING, wasFixed = true) return 0.0 } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/AbstractOpendriveEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/AbstractOpendriveEvaluator.kt index 55ba2d50..865a34d8 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/AbstractOpendriveEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/AbstractOpendriveEvaluator.kt @@ -16,11 +16,11 @@ package io.rtron.transformer.evaluator.opendrive.plans -import io.rtron.io.messages.ContextMessageList +import io.rtron.io.issues.ContextIssueList import io.rtron.model.opendrive.OpendriveModel abstract class AbstractOpendriveEvaluator { // Methods - abstract fun evaluate(opendriveModel: OpendriveModel): ContextMessageList + abstract fun evaluate(opendriveModel: OpendriveModel): ContextIssueList } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/BasicDataTypeEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/BasicDataTypeEvaluator.kt index 6b08bdef..81ce9858 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/BasicDataTypeEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/BasicDataTypeEvaluator.kt @@ -16,8 +16,8 @@ package io.rtron.transformer.evaluator.opendrive.plans.basicdatatype -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessageList +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssueList import io.rtron.model.opendrive.OpendriveModel import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters import io.rtron.transformer.evaluator.opendrive.plans.AbstractOpendriveEvaluator @@ -25,17 +25,17 @@ import io.rtron.transformer.evaluator.opendrive.plans.AbstractOpendriveEvaluator class BasicDataTypeEvaluator(val parameters: OpendriveEvaluatorParameters) : AbstractOpendriveEvaluator() { // Methods - override fun evaluate(opendriveModel: OpendriveModel): ContextMessageList { - val messageList = DefaultMessageList() + override fun evaluate(opendriveModel: OpendriveModel): ContextIssueList { + val issueList = DefaultIssueList() var modifiedOpendriveModel = opendriveModel.copy() - modifiedOpendriveModel = CoreEvaluator.evaluate(modifiedOpendriveModel, parameters, messageList) - modifiedOpendriveModel = RoadEvaluator.evaluate(modifiedOpendriveModel, parameters, messageList) - modifiedOpendriveModel = RoadLanesEvaluator.evaluate(modifiedOpendriveModel, parameters, messageList) - modifiedOpendriveModel = RoadObjectsEvaluator.evaluate(modifiedOpendriveModel, parameters, messageList) - modifiedOpendriveModel = RoadSignalsEvaluator.evaluate(modifiedOpendriveModel, parameters, messageList) - modifiedOpendriveModel = JunctionEvaluator.evaluate(modifiedOpendriveModel, parameters, messageList) + modifiedOpendriveModel = CoreEvaluator.evaluate(modifiedOpendriveModel, parameters, issueList) + modifiedOpendriveModel = RoadEvaluator.evaluate(modifiedOpendriveModel, parameters, issueList) + modifiedOpendriveModel = RoadLanesEvaluator.evaluate(modifiedOpendriveModel, parameters, issueList) + modifiedOpendriveModel = RoadObjectsEvaluator.evaluate(modifiedOpendriveModel, parameters, issueList) + modifiedOpendriveModel = RoadSignalsEvaluator.evaluate(modifiedOpendriveModel, parameters, issueList) + modifiedOpendriveModel = JunctionEvaluator.evaluate(modifiedOpendriveModel, parameters, issueList) - return ContextMessageList(modifiedOpendriveModel, messageList) + return ContextIssueList(modifiedOpendriveModel, issueList) } } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/CoreEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/CoreEvaluator.kt index 041b4b14..b7f2c4b5 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/CoreEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/CoreEvaluator.kt @@ -16,9 +16,9 @@ package io.rtron.transformer.evaluator.opendrive.plans.basicdatatype -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.optics.everyHeaderOffset import io.rtron.model.opendrive.header @@ -28,47 +28,47 @@ import io.rtron.transformer.evaluator.opendrive.modifiers.BasicDataTypeModifier object CoreEvaluator { // Methods - fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): OpendriveModel { + fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() if (modifiedOpendriveModel.road.isEmpty()) { - messageList += DefaultMessage("NoRoadsContained", "Document does not contain any roads.", "", Severity.FATAL_ERROR, wasFixed = false) + issueList += DefaultIssue("NoRoadsContained", "Document does not contain any roads.", "", Severity.FATAL_ERROR, wasFixed = false) } val duplicateRoadIds = modifiedOpendriveModel.road.map { it.id }.groupingBy { it }.eachCount().filter { it.value > 1 } if (duplicateRoadIds.isNotEmpty()) { - messageList += DefaultMessage("DuplicateRoadIds", "Multiple road elements are using the same ID (affected IDs: ${duplicateRoadIds.keys.joinToString()}).", "", Severity.FATAL_ERROR, wasFixed = false) + issueList += DefaultIssue("DuplicateRoadIds", "Multiple road elements are using the same ID (affected IDs: ${duplicateRoadIds.keys.joinToString()}).", "", Severity.FATAL_ERROR, wasFixed = false) } OpendriveModel.header.get(modifiedOpendriveModel).also { header -> if (header.revMajor < 0) { - messageList += DefaultMessage("UnkownOpendriveMajorVersionNumber", "", "Header element", Severity.FATAL_ERROR, wasFixed = false) + issueList += DefaultIssue("UnkownOpendriveMajorVersionNumber", "", "Header element", Severity.FATAL_ERROR, wasFixed = false) } if (header.revMinor < 0) { - messageList += DefaultMessage("UnkownOpendriveMinorVersionNumber", "", "Header element", Severity.FATAL_ERROR, wasFixed = false) + issueList += DefaultIssue("UnkownOpendriveMinorVersionNumber", "", "Header element", Severity.FATAL_ERROR, wasFixed = false) } } modifiedOpendriveModel = OpendriveModel.header.modify(modifiedOpendriveModel) { header -> - header.name = BasicDataTypeModifier.modifyToOptionalString(header.name, "Header element", "name", messageList) - header.date = BasicDataTypeModifier.modifyToOptionalString(header.date, "Header element", "date", messageList) - header.vendor = BasicDataTypeModifier.modifyToOptionalString(header.vendor, "Header element", "vendor", messageList) + header.name = BasicDataTypeModifier.modifyToOptionalString(header.name, "Header element", "name", issueList) + header.date = BasicDataTypeModifier.modifyToOptionalString(header.date, "Header element", "date", issueList) + header.vendor = BasicDataTypeModifier.modifyToOptionalString(header.vendor, "Header element", "vendor", issueList) - header.east = BasicDataTypeModifier.modifyToOptionalFiniteDouble(header.east, "Header element", "east", messageList) - header.north = BasicDataTypeModifier.modifyToOptionalFiniteDouble(header.north, "Header element", "north", messageList) - header.south = BasicDataTypeModifier.modifyToOptionalFiniteDouble(header.south, "Header element", "south", messageList) - header.west = BasicDataTypeModifier.modifyToOptionalFiniteDouble(header.south, "Header element", "west", messageList) + header.east = BasicDataTypeModifier.modifyToOptionalFiniteDouble(header.east, "Header element", "east", issueList) + header.north = BasicDataTypeModifier.modifyToOptionalFiniteDouble(header.north, "Header element", "north", issueList) + header.south = BasicDataTypeModifier.modifyToOptionalFiniteDouble(header.south, "Header element", "south", issueList) + header.west = BasicDataTypeModifier.modifyToOptionalFiniteDouble(header.south, "Header element", "west", issueList) header } modifiedOpendriveModel = everyHeaderOffset.modify(modifiedOpendriveModel) { currentHeaderOffset -> - currentHeaderOffset.x = BasicDataTypeModifier.modifyToFiniteDouble(currentHeaderOffset.x, "Header element", "x", messageList) - currentHeaderOffset.y = BasicDataTypeModifier.modifyToFiniteDouble(currentHeaderOffset.y, "Header element", "y", messageList) - currentHeaderOffset.z = BasicDataTypeModifier.modifyToFiniteDouble(currentHeaderOffset.z, "Header element", "z", messageList) - currentHeaderOffset.hdg = BasicDataTypeModifier.modifyToFiniteDouble(currentHeaderOffset.hdg, "Header element", "hdg", messageList) + currentHeaderOffset.x = BasicDataTypeModifier.modifyToFiniteDouble(currentHeaderOffset.x, "Header element", "x", issueList) + currentHeaderOffset.y = BasicDataTypeModifier.modifyToFiniteDouble(currentHeaderOffset.y, "Header element", "y", issueList) + currentHeaderOffset.z = BasicDataTypeModifier.modifyToFiniteDouble(currentHeaderOffset.z, "Header element", "z", issueList) + currentHeaderOffset.hdg = BasicDataTypeModifier.modifyToFiniteDouble(currentHeaderOffset.hdg, "Header element", "hdg", issueList) currentHeaderOffset } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/JunctionEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/JunctionEvaluator.kt index 494bd95a..76433c31 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/JunctionEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/JunctionEvaluator.kt @@ -16,30 +16,30 @@ package io.rtron.transformer.evaluator.opendrive.plans.basicdatatype -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.optics.everyJunction import io.rtron.model.opendrive.additions.optics.everyJunctionConnection import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters import io.rtron.transformer.evaluator.opendrive.modifiers.BasicDataTypeModifier -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of object JunctionEvaluator { // Methods - fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): OpendriveModel { + fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() everyJunction.modify(modifiedOpendriveModel) { currentJunction -> if (currentJunction.connection.isEmpty()) { - messageList += DefaultMessage.of("EmptyList", "List for attribute 'connection' is empty, but it has to contain at least one element.", currentJunction.additionalId, Severity.FATAL_ERROR, wasFixed = false) + issueList += DefaultIssue.of("EmptyList", "List for attribute 'connection' is empty, but it has to contain at least one element.", currentJunction.additionalId, Severity.FATAL_ERROR, wasFixed = false) } if (currentJunction.id.isBlank()) { - messageList += DefaultMessage.of("MissingValue", "Missing value for attribute 'ID'.", currentJunction.additionalId, Severity.FATAL_ERROR, wasFixed = false) + issueList += DefaultIssue.of("MissingValue", "Missing value for attribute 'ID'.", currentJunction.additionalId, Severity.FATAL_ERROR, wasFixed = false) } currentJunction @@ -48,27 +48,27 @@ object JunctionEvaluator { everyJunctionConnection.modify(modifiedOpendriveModel) { currentJunctionConnection -> if (currentJunctionConnection.id.isBlank()) { - messageList += DefaultMessage.of("MissingValue", "Missing value for attribute 'ID'.", currentJunctionConnection.additionalId, Severity.FATAL_ERROR, wasFixed = false) + issueList += DefaultIssue.of("MissingValue", "Missing value for attribute 'ID'.", currentJunctionConnection.additionalId, Severity.FATAL_ERROR, wasFixed = false) } currentJunctionConnection } modifiedOpendriveModel = everyJunction.modify(modifiedOpendriveModel) { currentJunction -> - currentJunction.mainRoad = BasicDataTypeModifier.modifyToOptionalString(currentJunction.mainRoad, currentJunction.additionalId, "mainRoad", messageList) - currentJunction.name = BasicDataTypeModifier.modifyToOptionalString(currentJunction.name, currentJunction.additionalId, "name", messageList) + currentJunction.mainRoad = BasicDataTypeModifier.modifyToOptionalString(currentJunction.mainRoad, currentJunction.additionalId, "mainRoad", issueList) + currentJunction.name = BasicDataTypeModifier.modifyToOptionalString(currentJunction.name, currentJunction.additionalId, "name", issueList) - currentJunction.sEnd = BasicDataTypeModifier.modifyToOptionalFiniteDouble(currentJunction.sEnd, currentJunction.additionalId, "sEnd", messageList) - currentJunction.sStart = BasicDataTypeModifier.modifyToOptionalFiniteDouble(currentJunction.sStart, currentJunction.additionalId, "sStart", messageList) + currentJunction.sEnd = BasicDataTypeModifier.modifyToOptionalFiniteDouble(currentJunction.sEnd, currentJunction.additionalId, "sEnd", issueList) + currentJunction.sStart = BasicDataTypeModifier.modifyToOptionalFiniteDouble(currentJunction.sStart, currentJunction.additionalId, "sStart", issueList) currentJunction } modifiedOpendriveModel = everyJunctionConnection.modify(modifiedOpendriveModel) { currentJunctionConnection -> - currentJunctionConnection.connectingRoad = BasicDataTypeModifier.modifyToOptionalString(currentJunctionConnection.connectingRoad, currentJunctionConnection.additionalId, "connectingRoad", messageList) - currentJunctionConnection.incomingRoad = BasicDataTypeModifier.modifyToOptionalString(currentJunctionConnection.incomingRoad, currentJunctionConnection.additionalId, "incomingRoad", messageList) - currentJunctionConnection.linkedRoad = BasicDataTypeModifier.modifyToOptionalString(currentJunctionConnection.linkedRoad, currentJunctionConnection.additionalId, "linkedRoad", messageList) + currentJunctionConnection.connectingRoad = BasicDataTypeModifier.modifyToOptionalString(currentJunctionConnection.connectingRoad, currentJunctionConnection.additionalId, "connectingRoad", issueList) + currentJunctionConnection.incomingRoad = BasicDataTypeModifier.modifyToOptionalString(currentJunctionConnection.incomingRoad, currentJunctionConnection.additionalId, "incomingRoad", issueList) + currentJunctionConnection.linkedRoad = BasicDataTypeModifier.modifyToOptionalString(currentJunctionConnection.linkedRoad, currentJunctionConnection.additionalId, "linkedRoad", issueList) currentJunctionConnection } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadEvaluator.kt index 5fe35bf4..0464e41e 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadEvaluator.kt @@ -17,9 +17,9 @@ package io.rtron.transformer.evaluator.opendrive.plans.basicdatatype import arrow.core.None -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.optics.everyRoad import io.rtron.model.opendrive.road.lateral.RoadLateralProfileShape @@ -27,22 +27,22 @@ import io.rtron.std.filterToStrictSortingBy import io.rtron.std.isSortedBy import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters import io.rtron.transformer.evaluator.opendrive.modifiers.BasicDataTypeModifier -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of object RoadEvaluator { // Methods - fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): OpendriveModel { + fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() everyRoad.modify(modifiedOpendriveModel) { currentRoad -> if (currentRoad.planView.geometry.isEmpty()) { - messageList += DefaultMessage.of("NoPlanViewGeometryElements", "Plan view of road does not contain any geometry elements.", currentRoad.additionalId, Severity.FATAL_ERROR, wasFixed = false) + issueList += DefaultIssue.of("NoPlanViewGeometryElements", "Plan view of road does not contain any geometry elements.", currentRoad.additionalId, Severity.FATAL_ERROR, wasFixed = false) } if (currentRoad.lanes.laneSection.isEmpty()) { - messageList += DefaultMessage.of("NoLaneSections", "Road does not contain any lane sections.", currentRoad.additionalId, Severity.FATAL_ERROR, wasFixed = false) + issueList += DefaultIssue.of("NoLaneSections", "Road does not contain any lane sections.", currentRoad.additionalId, Severity.FATAL_ERROR, wasFixed = false) } currentRoad @@ -51,7 +51,7 @@ object RoadEvaluator { modifiedOpendriveModel = everyRoad.modify(modifiedOpendriveModel) { currentRoad -> if (currentRoad.elevationProfile.isSome { it.elevation.isEmpty() }) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoElevationProfileElements", "Elevation profile contains no elements.", currentRoad.additionalId, @@ -67,13 +67,13 @@ object RoadEvaluator { { it.s }, currentRoad.additionalId, "elevation", - messageList + issueList ) } currentRoad.lateralProfile.onSome { currentLateralProfile -> if (currentLateralProfile.containsShapeProfile() && currentRoad.lanes.containsLaneOffset()) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "UnexpectedValue", "Unexpected value for attribute 'lateralProfile.shape'", currentRoad.additionalId, @@ -90,14 +90,14 @@ object RoadEvaluator { { it.s }, currentRoad.additionalId, "superelevation", - messageList + issueList ) currentLateralProfile.shape = BasicDataTypeModifier.filterToSorted( currentLateralProfile.shape, { it.s }, currentRoad.additionalId, "shape", - messageList + issueList ) val shapeEntriesFilteredByT: List = @@ -105,8 +105,8 @@ object RoadEvaluator { currentShapeSubEntries.value.filterToStrictSortingBy { it.t } } if (shapeEntriesFilteredByT.size < currentLateralProfile.shape.size) { - // OpendriveException.NonStrictlySortedList("shape", "Ignoring ${it.shape.size - shapeEntriesFilteredByT.size} shape entries which are not placed in ascending order according to t for each s group.").toMessage(currentRoad.additionalId, isFatal = false, wasFixed = true) - messageList += DefaultMessage.of( + // OpendriveException.NonStrictlySortedList("shape", "Ignoring ${it.shape.size - shapeEntriesFilteredByT.size} shape entries which are not placed in ascending order according to t for each s group.").toIssue(currentRoad.additionalId, isFatal = false, wasFixed = true) + issueList += DefaultIssue.of( "NonStrictlySortedList", "Ignoring ${currentLateralProfile.shape.size - shapeEntriesFilteredByT.size} shape entries which are not placed in ascending order according to t for each s group.", currentRoad.additionalId, @@ -122,11 +122,11 @@ object RoadEvaluator { { it.s }, currentRoad.additionalId, "shape", - messageList + issueList ) if (!currentRoad.lanes.laneSection.isSortedBy { it.s }) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NonSortedList", "Sorting lane sections according to s.", currentRoad.additionalId, diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadLanesEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadLanesEvaluator.kt index 2a569f22..7d15de4b 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadLanesEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadLanesEvaluator.kt @@ -17,9 +17,9 @@ package io.rtron.transformer.evaluator.opendrive.plans.basicdatatype import arrow.core.None -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.optics.everyLaneSection import io.rtron.model.opendrive.additions.optics.everyRoadLanesLaneSectionCenterLane @@ -29,7 +29,7 @@ import io.rtron.model.opendrive.lane.RoadLanesLaneSectionCenterLane import io.rtron.model.opendrive.lane.RoadLanesLaneSectionLRLane import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters import io.rtron.transformer.evaluator.opendrive.modifiers.BasicDataTypeModifier -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of object RoadLanesEvaluator { @@ -37,17 +37,17 @@ object RoadLanesEvaluator { fun evaluate( opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, - messageList: DefaultMessageList + issueList: DefaultIssueList ): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() everyRoadLanesLaneSectionLeftLane.modify(modifiedOpendriveModel) { currentLeftLane -> - messageList += evaluateFatalViolations(currentLeftLane, parameters) + issueList += evaluateFatalViolations(currentLeftLane, parameters) currentLeftLane } everyRoadLanesLaneSectionRightLane.modify(modifiedOpendriveModel) { currentRightLane -> - messageList += evaluateFatalViolations(currentRightLane, parameters) + issueList += evaluateFatalViolations(currentRightLane, parameters) currentRightLane } @@ -55,7 +55,7 @@ object RoadLanesEvaluator { currentLaneSection.left.onSome { if (it.lane.isEmpty()) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "EmptyValueForOptionalAttribute", "Attribute 'left' is set with an empty value even though the attribute itself is optional.", currentLaneSection.additionalId, @@ -68,7 +68,7 @@ object RoadLanesEvaluator { currentLaneSection.right.onSome { if (it.lane.isEmpty()) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "EmptyValueForOptionalAttribute", "Attribute 'right' is set with an empty value even though the attribute itself is optional.", currentLaneSection.additionalId, @@ -80,7 +80,7 @@ object RoadLanesEvaluator { } if (currentLaneSection.center.lane.isEmpty()) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NoLanesInLaneSection", "Lane section does not contain lanes.", currentLaneSection.additionalId, @@ -95,17 +95,17 @@ object RoadLanesEvaluator { modifiedOpendriveModel = everyRoadLanesLaneSectionCenterLane.modify(modifiedOpendriveModel) { currentCenterLane -> - messageList += evaluateNonFatalViolations(currentCenterLane, parameters) + issueList += evaluateNonFatalViolations(currentCenterLane, parameters) currentCenterLane } modifiedOpendriveModel = everyRoadLanesLaneSectionLeftLane.modify(modifiedOpendriveModel) { currentLeftLane -> - messageList += evaluateNonFatalViolations(currentLeftLane, parameters) + issueList += evaluateNonFatalViolations(currentLeftLane, parameters) currentLeftLane } modifiedOpendriveModel = everyRoadLanesLaneSectionRightLane.modify(modifiedOpendriveModel) { currentRightLane -> - messageList += evaluateNonFatalViolations(currentRightLane, parameters) + issueList += evaluateNonFatalViolations(currentRightLane, parameters) currentRightLane } @@ -115,20 +115,20 @@ object RoadLanesEvaluator { private fun evaluateFatalViolations( lane: RoadLanesLaneSectionLRLane, parameters: OpendriveEvaluatorParameters - ): DefaultMessageList { - val messageList = DefaultMessageList() - return messageList + ): DefaultIssueList { + val issueList = DefaultIssueList() + return issueList } private fun evaluateNonFatalViolations( lane: RoadLanesLaneSectionLRLane, parameters: OpendriveEvaluatorParameters - ): DefaultMessageList { - val messageList = DefaultMessageList() + ): DefaultIssueList { + val issueList = DefaultIssueList() lane.getLaneWidthEntries().onSome { if (it.head.sOffset > parameters.numberTolerance) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "LaneWidthEntriesNotDefinedFromStart", "The width of the lane shall be defined for the full length of the lane section starting with a element for s=0. The first available element is copied and positioned at s=0.", lane.additionalId, @@ -145,13 +145,13 @@ object RoadLanesEvaluator { { it.sOffset }, lane.additionalId, "width", - messageList + issueList ) val widthEntriesFilteredBySOffsetFinite = lane.width.filter { currentWidth -> currentWidth.sOffset.isFinite() && currentWidth.sOffset >= 0.0 } if (widthEntriesFilteredBySOffsetFinite.size < lane.width.size) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "UnexpectedValues", "Ignoring ${lane.width.size - widthEntriesFilteredBySOffsetFinite.size} width entries where sOffset is not-finite and positive.", lane.additionalId, @@ -164,7 +164,7 @@ object RoadLanesEvaluator { val widthEntriesFilteredByCoefficientsFinite = lane.width.filter { currentWidth -> currentWidth.coefficients.all { it.isFinite() } } if (widthEntriesFilteredByCoefficientsFinite.size < lane.width.size) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "UnexpectedValues", "Ignoring ${lane.width.size - widthEntriesFilteredByCoefficientsFinite.size} width entries where coefficients \"a, b, c, d\", are not finite.", lane.additionalId, @@ -179,13 +179,13 @@ object RoadLanesEvaluator { { it.sOffset }, lane.additionalId, "height", - messageList + issueList ) val heightEntriesFilteredByCoefficientsFinite = lane.height.filter { it.inner.isFinite() && it.outer.isFinite() } if (heightEntriesFilteredByCoefficientsFinite.size < lane.height.size) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "UnexpectedValues", "Ignoring ${lane.height.size - heightEntriesFilteredByCoefficientsFinite.size} height entries where inner or outer is not finite.", lane.additionalId, @@ -200,26 +200,26 @@ object RoadLanesEvaluator { { it.sOffset }, lane.additionalId, "roadMark", - messageList + issueList ) - return messageList + return issueList } private fun evaluateNonFatalViolations( lane: RoadLanesLaneSectionCenterLane, parameters: OpendriveEvaluatorParameters - ): DefaultMessageList { - val messageList = DefaultMessageList() + ): DefaultIssueList { + val issueList = DefaultIssueList() lane.roadMark = BasicDataTypeModifier.filterToStrictlySorted( lane.roadMark, { it.sOffset }, lane.additionalId, "roadMark", - messageList + issueList ) - return messageList + return issueList } } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadObjectsEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadObjectsEvaluator.kt index 6cab8f0e..132bb2c7 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadObjectsEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadObjectsEvaluator.kt @@ -18,23 +18,23 @@ package io.rtron.transformer.evaluator.opendrive.plans.basicdatatype import arrow.core.None import arrow.core.some -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.optics.everyRoadObject import io.rtron.model.opendrive.additions.optics.everyRoadObjectOutlineElement import io.rtron.model.opendrive.additions.optics.everyRoadObjectRepeatElement import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters import io.rtron.transformer.evaluator.opendrive.modifiers.BasicDataTypeModifier -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of import kotlin.math.max import kotlin.math.min object RoadObjectsEvaluator { // Methods - fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): OpendriveModel { + fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() modifiedOpendriveModel = everyRoadObject.modify(modifiedOpendriveModel) { currentRoadObject -> @@ -43,43 +43,43 @@ object RoadObjectsEvaluator { currentRoadObject.s, currentRoadObject.additionalId, "s", - messageList + issueList ) currentRoadObject.t = BasicDataTypeModifier.modifyToFiniteDouble( currentRoadObject.t, currentRoadObject.additionalId, "t", - messageList + issueList ) currentRoadObject.zOffset = BasicDataTypeModifier.modifyToFiniteDouble( currentRoadObject.zOffset, currentRoadObject.additionalId, "zOffset", - messageList + issueList ) currentRoadObject.hdg = BasicDataTypeModifier.modifyToOptionalFiniteDouble( currentRoadObject.hdg, currentRoadObject.additionalId, "hdg", - messageList + issueList ) currentRoadObject.roll = BasicDataTypeModifier.modifyToOptionalFiniteDouble( currentRoadObject.roll, currentRoadObject.additionalId, "roll", - messageList + issueList ) currentRoadObject.pitch = BasicDataTypeModifier.modifyToOptionalFiniteDouble( currentRoadObject.pitch, currentRoadObject.additionalId, "pitch", - messageList + issueList ) currentRoadObject.height = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble( currentRoadObject.height, currentRoadObject.additionalId, "height", - messageList + issueList ) if (currentRoadObject.height.isSome { 0.0 < it && it < parameters.numberTolerance }) { @@ -90,26 +90,26 @@ object RoadObjectsEvaluator { currentRoadObject.radius, currentRoadObject.additionalId, "radius", - messageList, + issueList, parameters.numberTolerance ) currentRoadObject.length = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble( currentRoadObject.length, currentRoadObject.additionalId, "length", - messageList, + issueList, parameters.numberTolerance ) currentRoadObject.width = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble( currentRoadObject.width, currentRoadObject.additionalId, "width", - messageList, + issueList, parameters.numberTolerance ) currentRoadObject.validity.filter { it.fromLane > it.toLane }.forEach { currentValidity -> - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "LaneValidityElementNotOrdered", "The value of the @fromLane attribute shall be lower than or equal to the value of the @toLane attribute.", currentRoadObject.additionalId, @@ -121,7 +121,7 @@ object RoadObjectsEvaluator { } if (currentRoadObject.outlines.isSome { it.outline.isEmpty() }) { - messageList += DefaultMessage( + issueList += DefaultIssue( "EmptyValueForOptionalAttribute", "Attribute 'outlines' is set with an empty value even though the attribute itself is optional.", "Header element", @@ -134,14 +134,14 @@ object RoadObjectsEvaluator { val repeatElementsFiltered = currentRoadObject.repeat.filter { it.s.isFinite() && it.tStart.isFinite() && it.zOffsetStart.isFinite() } if (repeatElementsFiltered.size < currentRoadObject.repeat.size) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "UnexpectedValues", "Ignoring ${currentRoadObject.repeat.size - repeatElementsFiltered.size} repeat entries which do not have a finite s, tStart, zOffsetStart value.", currentRoadObject.additionalId, Severity.FATAL_ERROR, wasFixed = true ) - // messageList += OpendriveException.UnexpectedValues("s, tStart, zOffsetStart", "Ignoring ${currentRoadObject.repeat.size - repeatElementsFiltered.size} repeat entries which do not have a finite s, tStart and zOffsetStart value.").toMessage(currentRoadObject.additionalId, isFatal = false, wasFixed: Boolean) + // issueList += OpendriveException.UnexpectedValues("s, tStart, zOffsetStart", "Ignoring ${currentRoadObject.repeat.size - repeatElementsFiltered.size} repeat entries which do not have a finite s, tStart and zOffsetStart value.").toIssue(currentRoadObject.additionalId, isFatal = false, wasFixed: Boolean) currentRoadObject.repeat = repeatElementsFiltered } @@ -152,15 +152,15 @@ object RoadObjectsEvaluator { val cornerRoadElementsFiltered = currentOutlineElement.cornerRoad.filter { it.s.isFinite() && it.t.isFinite() && it.dz.isFinite() } if (cornerRoadElementsFiltered.size < currentOutlineElement.cornerRoad.size) { - // messageList += OpendriveException.UnexpectedValues("s, t, dz", "Ignoring ${currentOutlineElement.cornerRoad.size - cornerRoadElementsFiltered.size} cornerRoad entries which do not have a finite s, t and dz value.").toMessage(currentOutlineElement.additionalId, isFatal = false, wasFixed: Boolean) - messageList += DefaultMessage.of("UnexpectedValues", "Ignoring ${currentOutlineElement.cornerRoad.size - cornerRoadElementsFiltered.size} cornerRoad entries which do not have a finite s, t and dz value.", currentOutlineElement.additionalId, Severity.FATAL_ERROR, wasFixed = true) + // issueList += OpendriveException.UnexpectedValues("s, t, dz", "Ignoring ${currentOutlineElement.cornerRoad.size - cornerRoadElementsFiltered.size} cornerRoad entries which do not have a finite s, t and dz value.").toIssue(currentOutlineElement.additionalId, isFatal = false, wasFixed: Boolean) + issueList += DefaultIssue.of("UnexpectedValues", "Ignoring ${currentOutlineElement.cornerRoad.size - cornerRoadElementsFiltered.size} cornerRoad entries which do not have a finite s, t and dz value.", currentOutlineElement.additionalId, Severity.FATAL_ERROR, wasFixed = true) currentOutlineElement.cornerRoad = cornerRoadElementsFiltered } currentOutlineElement.cornerRoad.forEach { currentCornerRoad -> if (!currentCornerRoad.height.isFinite() || currentCornerRoad.height < 0.0) { - messageList += DefaultMessage.of("UnexpectedValue", "Unexpected value for attribute 'height'", currentOutlineElement.additionalId, Severity.WARNING, wasFixed = true) + issueList += DefaultIssue.of("UnexpectedValue", "Unexpected value for attribute 'height'", currentOutlineElement.additionalId, Severity.WARNING, wasFixed = true) currentCornerRoad.height = 0.0 } @@ -171,15 +171,15 @@ object RoadObjectsEvaluator { val cornerLocalElementsFiltered = currentOutlineElement.cornerLocal.filter { it.u.isFinite() && it.v.isFinite() && it.z.isFinite() } if (cornerLocalElementsFiltered.size < currentOutlineElement.cornerLocal.size) { - // messageList += OpendriveException.UnexpectedValues("s, t, dz", "Ignoring ${currentOutlineElement.cornerLocal.size - cornerLocalElementsFiltered.size} cornerLocal entries which do not have a finite u, v and z value.").toMessage(currentOutlineElement.additionalId, isFatal = false, wasFixed = true) - messageList += DefaultMessage.of("UnexpectedValues", "Ignoring ${currentOutlineElement.cornerRoad.size - cornerRoadElementsFiltered.size} cornerRoad entries which do not have a finite s, t and dz value.", currentOutlineElement.additionalId, Severity.FATAL_ERROR, wasFixed = true) + // issueList += OpendriveException.UnexpectedValues("s, t, dz", "Ignoring ${currentOutlineElement.cornerLocal.size - cornerLocalElementsFiltered.size} cornerLocal entries which do not have a finite u, v and z value.").toIssue(currentOutlineElement.additionalId, isFatal = false, wasFixed = true) + issueList += DefaultIssue.of("UnexpectedValues", "Ignoring ${currentOutlineElement.cornerRoad.size - cornerRoadElementsFiltered.size} cornerRoad entries which do not have a finite s, t and dz value.", currentOutlineElement.additionalId, Severity.FATAL_ERROR, wasFixed = true) currentOutlineElement.cornerLocal = cornerLocalElementsFiltered } currentOutlineElement.cornerLocal.forEach { currentCornerLocal -> if (!currentCornerLocal.height.isFinite() || currentCornerLocal.height < 0.0) { - messageList += DefaultMessage.of("UnexpectedValue", "Unexpected value for attribute 'height'", currentOutlineElement.additionalId, Severity.WARNING, wasFixed = true) + issueList += DefaultIssue.of("UnexpectedValue", "Unexpected value for attribute 'height'", currentOutlineElement.additionalId, Severity.WARNING, wasFixed = true) currentCornerLocal.height = 0.0 } @@ -196,22 +196,22 @@ object RoadObjectsEvaluator { require(currentRepeatElement.tStart.isFinite()) { "Must already be filtered." } require(currentRepeatElement.zOffsetStart.isFinite()) { "Must already be filtered." } - currentRepeatElement.distance = BasicDataTypeModifier.modifyToFinitePositiveDouble(currentRepeatElement.distance, currentRepeatElement.additionalId, "distance", messageList) - currentRepeatElement.heightEnd = BasicDataTypeModifier.modifyToFinitePositiveDouble(currentRepeatElement.heightEnd, currentRepeatElement.additionalId, "heightEnd", messageList) - currentRepeatElement.heightStart = BasicDataTypeModifier.modifyToFinitePositiveDouble(currentRepeatElement.heightStart, currentRepeatElement.additionalId, "heightStart", messageList) - currentRepeatElement.length = BasicDataTypeModifier.modifyToFinitePositiveDouble(currentRepeatElement.length, currentRepeatElement.additionalId, "length", messageList) - currentRepeatElement.lengthEnd = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRepeatElement.lengthEnd, currentRepeatElement.additionalId, "lengthEnd", messageList, parameters.numberTolerance) - currentRepeatElement.lengthStart = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRepeatElement.lengthStart, currentRepeatElement.additionalId, "lengthStart", messageList, parameters.numberTolerance) - currentRepeatElement.radiusEnd = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRepeatElement.radiusEnd, currentRepeatElement.additionalId, "radiusEnd", messageList, parameters.numberTolerance) - currentRepeatElement.radiusStart = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRepeatElement.radiusStart, currentRepeatElement.additionalId, "radiusStart", messageList, parameters.numberTolerance) + currentRepeatElement.distance = BasicDataTypeModifier.modifyToFinitePositiveDouble(currentRepeatElement.distance, currentRepeatElement.additionalId, "distance", issueList) + currentRepeatElement.heightEnd = BasicDataTypeModifier.modifyToFinitePositiveDouble(currentRepeatElement.heightEnd, currentRepeatElement.additionalId, "heightEnd", issueList) + currentRepeatElement.heightStart = BasicDataTypeModifier.modifyToFinitePositiveDouble(currentRepeatElement.heightStart, currentRepeatElement.additionalId, "heightStart", issueList) + currentRepeatElement.length = BasicDataTypeModifier.modifyToFinitePositiveDouble(currentRepeatElement.length, currentRepeatElement.additionalId, "length", issueList) + currentRepeatElement.lengthEnd = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRepeatElement.lengthEnd, currentRepeatElement.additionalId, "lengthEnd", issueList, parameters.numberTolerance) + currentRepeatElement.lengthStart = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRepeatElement.lengthStart, currentRepeatElement.additionalId, "lengthStart", issueList, parameters.numberTolerance) + currentRepeatElement.radiusEnd = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRepeatElement.radiusEnd, currentRepeatElement.additionalId, "radiusEnd", issueList, parameters.numberTolerance) + currentRepeatElement.radiusStart = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRepeatElement.radiusStart, currentRepeatElement.additionalId, "radiusStart", issueList, parameters.numberTolerance) if (!currentRepeatElement.tEnd.isFinite()) { - messageList += DefaultMessage.of("UnexpectedValue", "Unexpected value for attribute 'tEnd'", currentRepeatElement.additionalId, Severity.WARNING, wasFixed = true) + issueList += DefaultIssue.of("UnexpectedValue", "Unexpected value for attribute 'tEnd'", currentRepeatElement.additionalId, Severity.WARNING, wasFixed = true) currentRepeatElement.tEnd = currentRepeatElement.tStart } - currentRepeatElement.widthEnd = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRepeatElement.widthEnd, currentRepeatElement.additionalId, "widthEnd", messageList, parameters.numberTolerance) - currentRepeatElement.widthStart = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRepeatElement.widthStart, currentRepeatElement.additionalId, "widthStart", messageList, parameters.numberTolerance) - currentRepeatElement.zOffsetEnd = BasicDataTypeModifier.modifyToFiniteDouble(currentRepeatElement.zOffsetEnd, currentRepeatElement.additionalId, "zOffsetEnd", messageList) + currentRepeatElement.widthEnd = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRepeatElement.widthEnd, currentRepeatElement.additionalId, "widthEnd", issueList, parameters.numberTolerance) + currentRepeatElement.widthStart = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRepeatElement.widthStart, currentRepeatElement.additionalId, "widthStart", issueList, parameters.numberTolerance) + currentRepeatElement.zOffsetEnd = BasicDataTypeModifier.modifyToFiniteDouble(currentRepeatElement.zOffsetEnd, currentRepeatElement.additionalId, "zOffsetEnd", issueList) currentRepeatElement } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadSignalsEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadSignalsEvaluator.kt index 4ab81dd6..4cd86fea 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadSignalsEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/basicdatatype/RoadSignalsEvaluator.kt @@ -17,45 +17,45 @@ package io.rtron.transformer.evaluator.opendrive.plans.basicdatatype import arrow.core.some -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.optics.everyRoadSignal import io.rtron.model.opendrive.core.EUnit import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters import io.rtron.transformer.evaluator.opendrive.modifiers.BasicDataTypeModifier -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of import kotlin.math.max import kotlin.math.min object RoadSignalsEvaluator { // Methods - fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): OpendriveModel { + fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() modifiedOpendriveModel = everyRoadSignal.modify(modifiedOpendriveModel) { currentRoadSignal -> - currentRoadSignal.height = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRoadSignal.height, currentRoadSignal.additionalId, "height", messageList, parameters.numberTolerance) - currentRoadSignal.hOffset = BasicDataTypeModifier.modifyToOptionalFiniteDouble(currentRoadSignal.hOffset, currentRoadSignal.additionalId, "hOffset", messageList) - currentRoadSignal.pitch = BasicDataTypeModifier.modifyToOptionalFiniteDouble(currentRoadSignal.pitch, currentRoadSignal.additionalId, "pitch", messageList) - currentRoadSignal.roll = BasicDataTypeModifier.modifyToOptionalFiniteDouble(currentRoadSignal.roll, currentRoadSignal.additionalId, "roll", messageList) - currentRoadSignal.s = BasicDataTypeModifier.modifyToFinitePositiveDouble(currentRoadSignal.s, currentRoadSignal.additionalId, "s", messageList) - currentRoadSignal.subtype = BasicDataTypeModifier.modifyToNonBlankString(currentRoadSignal.subtype, currentRoadSignal.additionalId, "subtype", messageList, fallbackValue = "-1") - currentRoadSignal.t = BasicDataTypeModifier.modifyToFiniteDouble(currentRoadSignal.t, currentRoadSignal.additionalId, "t", messageList) - currentRoadSignal.type = BasicDataTypeModifier.modifyToNonBlankString(currentRoadSignal.type, currentRoadSignal.additionalId, "type", messageList, fallbackValue = "-1") - currentRoadSignal.value = BasicDataTypeModifier.modifyToOptionalFiniteDouble(currentRoadSignal.value, currentRoadSignal.additionalId, "value", messageList) + currentRoadSignal.height = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRoadSignal.height, currentRoadSignal.additionalId, "height", issueList, parameters.numberTolerance) + currentRoadSignal.hOffset = BasicDataTypeModifier.modifyToOptionalFiniteDouble(currentRoadSignal.hOffset, currentRoadSignal.additionalId, "hOffset", issueList) + currentRoadSignal.pitch = BasicDataTypeModifier.modifyToOptionalFiniteDouble(currentRoadSignal.pitch, currentRoadSignal.additionalId, "pitch", issueList) + currentRoadSignal.roll = BasicDataTypeModifier.modifyToOptionalFiniteDouble(currentRoadSignal.roll, currentRoadSignal.additionalId, "roll", issueList) + currentRoadSignal.s = BasicDataTypeModifier.modifyToFinitePositiveDouble(currentRoadSignal.s, currentRoadSignal.additionalId, "s", issueList) + currentRoadSignal.subtype = BasicDataTypeModifier.modifyToNonBlankString(currentRoadSignal.subtype, currentRoadSignal.additionalId, "subtype", issueList, fallbackValue = "-1") + currentRoadSignal.t = BasicDataTypeModifier.modifyToFiniteDouble(currentRoadSignal.t, currentRoadSignal.additionalId, "t", issueList) + currentRoadSignal.type = BasicDataTypeModifier.modifyToNonBlankString(currentRoadSignal.type, currentRoadSignal.additionalId, "type", issueList, fallbackValue = "-1") + currentRoadSignal.value = BasicDataTypeModifier.modifyToOptionalFiniteDouble(currentRoadSignal.value, currentRoadSignal.additionalId, "value", issueList) if (currentRoadSignal.value.isSome() && currentRoadSignal.unit.isNone()) { - messageList += DefaultMessage.of("UnitAttributeMustBeDefinedWhenValueAttributeIsDefined", "Attribute 'unit' shall be defined, when attribute 'value' is defined.", currentRoadSignal.additionalId, Severity.WARNING, wasFixed = true) + issueList += DefaultIssue.of("UnitAttributeMustBeDefinedWhenValueAttributeIsDefined", "Attribute 'unit' shall be defined, when attribute 'value' is defined.", currentRoadSignal.additionalId, Severity.WARNING, wasFixed = true) currentRoadSignal.unit = EUnit.KILOMETER_PER_HOUR.some() } - currentRoadSignal.width = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRoadSignal.width, currentRoadSignal.additionalId, "width", messageList, parameters.numberTolerance) - currentRoadSignal.zOffset = BasicDataTypeModifier.modifyToFiniteDouble(currentRoadSignal.zOffset, currentRoadSignal.additionalId, "zOffset", messageList) + currentRoadSignal.width = BasicDataTypeModifier.modifyToOptionalFinitePositiveDouble(currentRoadSignal.width, currentRoadSignal.additionalId, "width", issueList, parameters.numberTolerance) + currentRoadSignal.zOffset = BasicDataTypeModifier.modifyToFiniteDouble(currentRoadSignal.zOffset, currentRoadSignal.additionalId, "zOffset", issueList) currentRoadSignal.validity.filter { it.fromLane > it.toLane }.forEach { currentValidity -> - messageList += DefaultMessage.of("LaneValidityElementNotOrdered", "The value of the @fromLane attribute shall be lower than or equal to the value of the @toLane attribute.", currentRoadSignal.additionalId, Severity.ERROR, wasFixed = true) + issueList += DefaultIssue.of("LaneValidityElementNotOrdered", "The value of the @fromLane attribute shall be lower than or equal to the value of the @toLane attribute.", currentRoadSignal.additionalId, Severity.ERROR, wasFixed = true) currentValidity.fromLane = min(currentValidity.fromLane, currentValidity.toLane) currentValidity.toLane = max(currentValidity.fromLane, currentValidity.toLane) } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/conversionrequirements/ConversionRequirementsEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/conversionrequirements/ConversionRequirementsEvaluator.kt index 3725d077..9adb2bd3 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/conversionrequirements/ConversionRequirementsEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/conversionrequirements/ConversionRequirementsEvaluator.kt @@ -16,8 +16,8 @@ package io.rtron.transformer.evaluator.opendrive.plans.conversionrequirements -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessageList +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssueList import io.rtron.model.opendrive.OpendriveModel import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters import io.rtron.transformer.evaluator.opendrive.plans.AbstractOpendriveEvaluator @@ -25,12 +25,12 @@ import io.rtron.transformer.evaluator.opendrive.plans.AbstractOpendriveEvaluator class ConversionRequirementsEvaluator(val parameters: OpendriveEvaluatorParameters) : AbstractOpendriveEvaluator() { // Methods - override fun evaluate(opendriveModel: OpendriveModel): ContextMessageList { - val messageList = DefaultMessageList() + override fun evaluate(opendriveModel: OpendriveModel): ContextIssueList { + val issueList = DefaultIssueList() var modifiedOpendriveModel = opendriveModel.copy() - modifiedOpendriveModel = JunctionEvaluator.evaluate(modifiedOpendriveModel, parameters, messageList) + modifiedOpendriveModel = JunctionEvaluator.evaluate(modifiedOpendriveModel, parameters, issueList) - return ContextMessageList(modifiedOpendriveModel, messageList) + return ContextIssueList(modifiedOpendriveModel, issueList) } } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/conversionrequirements/JunctionEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/conversionrequirements/JunctionEvaluator.kt index 762f0d4a..9b57504f 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/conversionrequirements/JunctionEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/conversionrequirements/JunctionEvaluator.kt @@ -16,29 +16,29 @@ package io.rtron.transformer.evaluator.opendrive.plans.conversionrequirements -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.optics.everyJunction import io.rtron.model.opendrive.junction.EJunctionType import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of object JunctionEvaluator { // Methods - fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): OpendriveModel { + fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() modifiedOpendriveModel = everyJunction.modify(modifiedOpendriveModel) { currentJunction -> if (currentJunction.typeValidated == EJunctionType.DEFAULT && currentJunction.connection.any { it.incomingRoad.isNone() }) { - messageList += DefaultMessage.of("DefaultJunctionWithoutIncomingRoad", "Junction of type default has no connection with an incoming road.", currentJunction.additionalId, Severity.FATAL_ERROR, wasFixed = false) + issueList += DefaultIssue.of("DefaultJunctionWithoutIncomingRoad", "Junction of type default has no connection with an incoming road.", currentJunction.additionalId, Severity.FATAL_ERROR, wasFixed = false) } if (currentJunction.typeValidated == EJunctionType.DEFAULT && currentJunction.connection.any { it.connectingRoad.isNone() }) { - messageList += DefaultMessage.of("DefaultJunctionWithoutConnectingRoad", "Junction of type default has no connection with a connecting road.", currentJunction.additionalId, Severity.FATAL_ERROR, wasFixed = false) + issueList += DefaultIssue.of("DefaultJunctionWithoutConnectingRoad", "Junction of type default has no connection with a connecting road.", currentJunction.additionalId, Severity.FATAL_ERROR, wasFixed = false) } currentJunction diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/JunctionEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/JunctionEvaluator.kt index d029256d..fa45cfc1 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/JunctionEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/JunctionEvaluator.kt @@ -18,28 +18,28 @@ package io.rtron.transformer.evaluator.opendrive.plans.modelingrules import arrow.core.None import arrow.core.flattenOption -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.optics.everyJunction import io.rtron.model.opendrive.junction.EJunctionType import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of object JunctionEvaluator { // Methods - fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): OpendriveModel { + fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() - modifiedOpendriveModel = evaluateAllJunctions(modifiedOpendriveModel, parameters, messageList) - modifiedOpendriveModel = evaluateDirectJunctions(modifiedOpendriveModel, parameters, messageList) + modifiedOpendriveModel = evaluateAllJunctions(modifiedOpendriveModel, parameters, issueList) + modifiedOpendriveModel = evaluateDirectJunctions(modifiedOpendriveModel, parameters, issueList) return modifiedOpendriveModel } - private fun evaluateAllJunctions(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): OpendriveModel { + private fun evaluateAllJunctions(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() modifiedOpendriveModel = everyJunction.modify(modifiedOpendriveModel) { currentJunction -> @@ -47,14 +47,14 @@ object JunctionEvaluator { // It is deprecated to omit the element. val junctionConnectionsFiltered = currentJunction.connection.filter { it.laneLink.isNotEmpty() } if (currentJunction.connection.size > junctionConnectionsFiltered.size) { - messageList += DefaultMessage.of("JunctionConnectionWithoutLaneLinks", "Junction connections (number of connections: ${currentJunction.connection.size - junctionConnectionsFiltered.size}) were removed since they did not contain any laneLinks.", currentJunction.additionalId, Severity.ERROR, wasFixed = true) + issueList += DefaultIssue.of("JunctionConnectionWithoutLaneLinks", "Junction connections (number of connections: ${currentJunction.connection.size - junctionConnectionsFiltered.size}) were removed since they did not contain any laneLinks.", currentJunction.additionalId, Severity.ERROR, wasFixed = true) } currentJunction.connection = junctionConnectionsFiltered // The @mainRoad, @orientation, @sStart and @sEnd attributes shall only be specified for virtual junctions. if (currentJunction.typeValidated != EJunctionType.VIRTUAL) { currentJunction.mainRoad.onSome { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "InvalidJunctionAttribute", "Attribute 'mainRoad' shall only be specified for virtual junctions", currentJunction.additionalId, @@ -65,7 +65,7 @@ object JunctionEvaluator { } currentJunction.orientation.onSome { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "InvalidJunctionAttribute", "Attribute 'orientation' shall only be specified for virtual junctions", currentJunction.additionalId, @@ -76,7 +76,7 @@ object JunctionEvaluator { } currentJunction.sStart.onSome { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "InvalidJunctionAttribute", "Attribute 'sStart' shall only be specified for virtual junctions", currentJunction.additionalId, @@ -87,7 +87,7 @@ object JunctionEvaluator { } currentJunction.sEnd.onSome { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "InvalidJunctionAttribute", "Attribute 'sEnd' shall only be specified for virtual junctions", currentJunction.additionalId, @@ -104,7 +104,7 @@ object JunctionEvaluator { return modifiedOpendriveModel } - private fun evaluateDirectJunctions(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): OpendriveModel { + private fun evaluateDirectJunctions(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() modifiedOpendriveModel = everyJunction.modify(modifiedOpendriveModel) { currentJunction -> @@ -115,7 +115,7 @@ object JunctionEvaluator { // Each connecting road shall be represented by exactly one element. A connecting road may contain as many lanes as required. val connectingRoadIdsRepresentedByMultipleConnections = currentJunction.connection.map { it.connectingRoad }.flattenOption().groupingBy { it }.eachCount().filter { it.value > 1 } if (connectingRoadIdsRepresentedByMultipleConnections.isNotEmpty()) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "MultipleConnectionsRepresentingSameConnectionRoad", "Junctions contains multiple connections representing the same connecting road (affected connecting roads: ${connectingRoadIdsRepresentedByMultipleConnections.keys.joinToString()} )", currentJunction.additionalId, @@ -143,7 +143,7 @@ object JunctionEvaluator { } val predecessorSuccessorRoadIds = junctionConnectionRoadIds.flatMap { listOf(it.predecessorRoadId, it.successorRoadId) } if (predecessorSuccessorRoadIds.distinct().size < predecessorSuccessorRoadIds.size) { - messageList += DefaultMessage.of("InvalidJunctionUsage", "Junction shall not be used, since all roads can be directly linked without ambiguities. The connecting roads do not share a predecessor or successor road.", currentJunction.additionalId, Severity.ERROR, wasFixed = false) + issueList += DefaultIssue.of("InvalidJunctionUsage", "Junction shall not be used, since all roads can be directly linked without ambiguities. The connecting roads do not share a predecessor or successor road.", currentJunction.additionalId, Severity.ERROR, wasFixed = false) } currentJunction diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/ModelingRulesEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/ModelingRulesEvaluator.kt index 3aeabbc1..88bc05ab 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/ModelingRulesEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/ModelingRulesEvaluator.kt @@ -16,8 +16,8 @@ package io.rtron.transformer.evaluator.opendrive.plans.modelingrules -import io.rtron.io.messages.ContextMessageList -import io.rtron.io.messages.DefaultMessageList +import io.rtron.io.issues.ContextIssueList +import io.rtron.io.issues.DefaultIssueList import io.rtron.model.opendrive.OpendriveModel import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters import io.rtron.transformer.evaluator.opendrive.plans.AbstractOpendriveEvaluator @@ -25,16 +25,16 @@ import io.rtron.transformer.evaluator.opendrive.plans.AbstractOpendriveEvaluator class ModelingRulesEvaluator(val parameters: OpendriveEvaluatorParameters) : AbstractOpendriveEvaluator() { // Methods - override fun evaluate(opendriveModel: OpendriveModel): ContextMessageList { - val messageList = DefaultMessageList() + override fun evaluate(opendriveModel: OpendriveModel): ContextIssueList { + val issueList = DefaultIssueList() var modifiedOpendriveModel = opendriveModel.copy() - modifiedOpendriveModel = RoadEvaluator.evaluate(modifiedOpendriveModel, parameters, messageList) - modifiedOpendriveModel = RoadLanesEvaluator.evaluate(modifiedOpendriveModel, parameters, messageList) - modifiedOpendriveModel = RoadObjectsEvaluator.evaluate(modifiedOpendriveModel, parameters, messageList) - modifiedOpendriveModel = RoadSignalsEvaluator.evaluate(modifiedOpendriveModel, parameters, messageList) - modifiedOpendriveModel = JunctionEvaluator.evaluate(modifiedOpendriveModel, parameters, messageList) + modifiedOpendriveModel = RoadEvaluator.evaluate(modifiedOpendriveModel, parameters, issueList) + modifiedOpendriveModel = RoadLanesEvaluator.evaluate(modifiedOpendriveModel, parameters, issueList) + modifiedOpendriveModel = RoadObjectsEvaluator.evaluate(modifiedOpendriveModel, parameters, issueList) + modifiedOpendriveModel = RoadSignalsEvaluator.evaluate(modifiedOpendriveModel, parameters, issueList) + modifiedOpendriveModel = JunctionEvaluator.evaluate(modifiedOpendriveModel, parameters, issueList) - return ContextMessageList(modifiedOpendriveModel, messageList) + return ContextIssueList(modifiedOpendriveModel, issueList) } } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadEvaluator.kt index 6deb4f3e..e7e2fd79 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadEvaluator.kt @@ -17,26 +17,26 @@ package io.rtron.transformer.evaluator.opendrive.plans.modelingrules import arrow.core.None -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.math.geometry.curved.oned.point.CurveRelativeVector1D import io.rtron.math.std.fuzzyEquals import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.optics.everyRoad import io.rtron.transformer.converter.opendrive2roadspaces.geometry.Curve2DBuilder import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of object RoadEvaluator { // Methods - fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): OpendriveModel { + fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() everyRoad.modify(modifiedOpendriveModel) { currentRoad -> if (currentRoad.planView.geometry.any { it.s > currentRoad.length + parameters.numberTolerance }) { - messageList += DefaultMessage.of("PlanViewGeometrySValueExceedsRoadLength", "Road contains geometry elements in the plan view, where s exceeds the total length of the road (${currentRoad.length}).", currentRoad.additionalId, Severity.WARNING, wasFixed = false) + issueList += DefaultIssue.of("PlanViewGeometrySValueExceedsRoadLength", "Road contains geometry elements in the plan view, where s exceeds the total length of the road (${currentRoad.length}).", currentRoad.additionalId, Severity.WARNING, wasFixed = false) } currentRoad @@ -46,7 +46,7 @@ object RoadEvaluator { // TODO: consolidate location handling if (currentRoad.planView.geometry.any { it.length <= parameters.numberTolerance }) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "PlanViewGeometryElementZeroLength", "Plan view contains geometry elements with a length of zero (below tolerance threshold), which are removed.", currentRoad.additionalId, @@ -62,7 +62,7 @@ object RoadEvaluator { modifiedOpendriveModel.road = modifiedOpendriveModel.road.filter { currentRoad -> if (currentRoad.planView.geometry.isEmpty()) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "RoadWithoutValidPlanViewGeometryElement", "Road does not contain any valid geometry element in the planView.", currentRoad.additionalId, @@ -85,13 +85,13 @@ object RoadEvaluator { currentRoad.planView.geometry.zipWithNext().forEach { val actualLength = it.second.s - it.first.s if (!fuzzyEquals(it.first.length, actualLength, parameters.numberTolerance)) { - messageList += DefaultMessage.of("PlanViewGeometryElementLengthNotMatchingNextElement", "Length attribute (length=${it.first.length}) of the geometry element (s=${it.first.s}) does not match the start position (s=${it.second.s}) of the next geometry element.", currentRoad.additionalId, Severity.WARNING, wasFixed = true) + issueList += DefaultIssue.of("PlanViewGeometryElementLengthNotMatchingNextElement", "Length attribute (length=${it.first.length}) of the geometry element (s=${it.first.s}) does not match the start position (s=${it.second.s}) of the next geometry element.", currentRoad.additionalId, Severity.WARNING, wasFixed = true) it.first.length = actualLength } } if (!fuzzyEquals(currentRoad.planView.geometry.last().s + currentRoad.planView.geometry.last().length, currentRoad.length, parameters.numberTolerance)) { - messageList += DefaultMessage.of("LastPlanPlanViewGeometryElementNotMatchingRoadLength", "Length attribute (length=${currentRoad.planView.geometry.last().length}) of the last geometry element (s=${currentRoad.planView.geometry.last().s}) does not match the total road length (length=${currentRoad.length}).", currentRoad.additionalId, Severity.WARNING, wasFixed = true) + issueList += DefaultIssue.of("LastPlanPlanViewGeometryElementNotMatchingRoadLength", "Length attribute (length=${currentRoad.planView.geometry.last().length}) of the last geometry element (s=${currentRoad.planView.geometry.last().s}) does not match the total road length (length=${currentRoad.length}).", currentRoad.additionalId, Severity.WARNING, wasFixed = true) currentRoad.planView.geometry.last().length = currentRoad.length - currentRoad.planView.geometry.last().s } @@ -107,7 +107,7 @@ object RoadEvaluator { val distance = frontCurveMemberEndPose.point.distance(backCurveMemberStartPose.point) if (distance > parameters.planViewGeometryDistanceTolerance) { - messageList += DefaultMessage( + issueList += DefaultIssue( "GapBetweenPlanViewGeometryElements", "Geometry elements contain a gap " + "from ${frontCurveMemberEndPose.point} to ${backCurveMemberStartPose.point} with an euclidean distance " + @@ -117,7 +117,7 @@ object RoadEvaluator { wasFixed = false ) } else if (distance > parameters.planViewGeometryDistanceWarningTolerance) { - messageList += DefaultMessage( + issueList += DefaultIssue( "GapBetweenPlanViewGeometryElements", "Geometry elements contain a gap " + "from ${frontCurveMemberEndPose.point} to ${backCurveMemberStartPose.point} with an euclidean distance " + @@ -130,7 +130,7 @@ object RoadEvaluator { val angleDifference = frontCurveMemberEndPose.rotation.difference(backCurveMemberStartPose.rotation) if (angleDifference > parameters.planViewGeometryAngleTolerance) { - messageList += DefaultMessage( + issueList += DefaultIssue( "KinkBetweenPlanViewGeometryElements", "Geometry elements contain a kink " + "from ${frontCurveMemberEndPose.point} to ${backCurveMemberStartPose.point} with an angle difference " + @@ -140,7 +140,7 @@ object RoadEvaluator { wasFixed = false ) } else if (angleDifference > parameters.planViewGeometryAngleWarningTolerance) { - messageList += DefaultMessage( + issueList += DefaultIssue( "KinkBetweenPlanViewGeometryElements", "Geometry elements contain a gap " + "from ${frontCurveMemberEndPose.point} to ${backCurveMemberStartPose.point} with an angle difference " + @@ -159,7 +159,7 @@ object RoadEvaluator { modifiedOpendriveModel = everyRoad.modify(modifiedOpendriveModel) { currentRoad -> currentRoad.getJunctionOption().onSome { currentJunctionId -> if (currentJunctionId !in junctionIdentifiers) { - messageList += DefaultMessage( + issueList += DefaultIssue( "RoadBelongsToNonExistingJunction", "Road belongs to a junction (id=${currentRoad.junction}) that does not exist.", currentRoad.id, @@ -176,7 +176,7 @@ object RoadEvaluator { .isSome { !junctionIdentifiers.contains(it) } } ) { - messageList += DefaultMessage( + issueList += DefaultIssue( "RoadLinkPredecessorRefersToNonExistingJunction", "Road link predecessor references a junction (id=${ currentLink.predecessor.fold( @@ -194,7 +194,7 @@ object RoadEvaluator { currentSuccessor.getJunctionPredecessorSuccessor().isSome { !junctionIdentifiers.contains(it) } } ) { - messageList += DefaultMessage( + issueList += DefaultIssue( "RoadLinkSuccessorRefersToNonExistingJunction", "Road link successor references a junction (id=${ currentLink.successor.fold( diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadLanesEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadLanesEvaluator.kt index db910272..d9b129cc 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadLanesEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadLanesEvaluator.kt @@ -17,9 +17,9 @@ package io.rtron.transformer.evaluator.opendrive.plans.modelingrules import arrow.core.Option -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.identifier.LaneIdentifier import io.rtron.model.opendrive.additions.optics.everyLaneSection @@ -29,18 +29,18 @@ import io.rtron.model.opendrive.additions.optics.everyRoadLanesLaneSectionLeftLa import io.rtron.model.opendrive.additions.optics.everyRoadLanesLaneSectionRightLane import io.rtron.model.opendrive.lane.RoadLanesLaneSectionLCRLaneRoadMark import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of object RoadLanesEvaluator { // Methods - fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): OpendriveModel { + fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() everyRoad.modify(modifiedOpendriveModel) { currentRoad -> if (currentRoad.lanes.getLaneSectionLengths(currentRoad.length).any { it <= parameters.numberTolerance }) { - messageList += DefaultMessage.of("LaneSectionLengthBelowTolerance", "Lane sections has a length of zero or below the tolerance.", currentRoad.additionalId, Severity.FATAL_ERROR, wasFixed = false) + issueList += DefaultIssue.of("LaneSectionLengthBelowTolerance", "Lane sections has a length of zero or below the tolerance.", currentRoad.additionalId, Severity.FATAL_ERROR, wasFixed = false) } currentRoad @@ -48,7 +48,7 @@ object RoadLanesEvaluator { everyLaneSection.modify(modifiedOpendriveModel) { currentLaneSection -> if (currentLaneSection.center.getNumberOfLanes() != 1) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "LaneSectionContainsNoCenterLane", "Lane section contains no center lane.", currentLaneSection.additionalId, @@ -58,7 +58,7 @@ object RoadLanesEvaluator { } if (currentLaneSection.getNumberOfLeftRightLanes() == 0) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "LaneSectionContainsNoLeftOrRightLane", "Lane section contains neither a left nor a right lane.", currentLaneSection.additionalId, @@ -72,7 +72,7 @@ object RoadLanesEvaluator { val expectedIds = (currentLaneSectionLeft.getNumberOfLanes() downTo 1).toList() if (leftLaneIds.distinct().size < leftLaneIds.size) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "LaneIdDuplicatesWithinLeftLaneSection", "Lane ids are not unique within the left lane section.", currentLaneSection.additionalId, @@ -81,7 +81,7 @@ object RoadLanesEvaluator { ) } if (!leftLaneIds.containsAll(expectedIds)) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NonConsecutiveLaneIdsWithinLeftLaneSection", "Lane numbering shall be consecutive without any gaps.", currentLaneSection.additionalId, @@ -96,7 +96,7 @@ object RoadLanesEvaluator { val expectedIds = (-1 downTo -currentLaneSectionRight.getNumberOfLanes()).toList() if (rightLaneIds.distinct().size < rightLaneIds.size) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "LaneIdDuplicatesWithinRightLaneSection", "Lane ids are not unique within the right lane section.", currentLaneSection.additionalId, @@ -105,7 +105,7 @@ object RoadLanesEvaluator { ) } if (!rightLaneIds.containsAll(expectedIds)) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "NonConsecutiveLaneIdsWithinRightLaneSection", "Lane numbering shall be consecutive without any gaps.", currentLaneSection.additionalId, @@ -119,27 +119,27 @@ object RoadLanesEvaluator { } modifiedOpendriveModel = everyRoadLanesLaneSectionCenterLane.modify(modifiedOpendriveModel) { currentCenterLane -> - currentCenterLane.roadMark = filterToNonZeroLengthRoadMarks(currentCenterLane.roadMark, currentCenterLane.additionalId, parameters, messageList) + currentCenterLane.roadMark = filterToNonZeroLengthRoadMarks(currentCenterLane.roadMark, currentCenterLane.additionalId, parameters, issueList) currentCenterLane } modifiedOpendriveModel = everyRoadLanesLaneSectionLeftLane.modify(modifiedOpendriveModel) { currentLeftLane -> - currentLeftLane.roadMark = filterToNonZeroLengthRoadMarks(currentLeftLane.roadMark, currentLeftLane.additionalId, parameters, messageList) + currentLeftLane.roadMark = filterToNonZeroLengthRoadMarks(currentLeftLane.roadMark, currentLeftLane.additionalId, parameters, issueList) currentLeftLane } modifiedOpendriveModel = everyRoadLanesLaneSectionRightLane.modify(modifiedOpendriveModel) { currentRightLane -> - currentRightLane.roadMark = filterToNonZeroLengthRoadMarks(currentRightLane.roadMark, currentRightLane.additionalId, parameters, messageList) + currentRightLane.roadMark = filterToNonZeroLengthRoadMarks(currentRightLane.roadMark, currentRightLane.additionalId, parameters, issueList) currentRightLane } return modifiedOpendriveModel } - private fun filterToNonZeroLengthRoadMarks(roadMarks: List, location: Option, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): List { + private fun filterToNonZeroLengthRoadMarks(roadMarks: List, location: Option, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): List { if (roadMarks.isEmpty()) return emptyList() val roadMarksFiltered: List = roadMarks.zipWithNext().map { it.first to it.second.sOffset - it.first.sOffset }.filter { it.second >= parameters.numberTolerance }.map { it.first } + roadMarks.last() if (roadMarksFiltered.size < roadMarks.size) { - messageList += DefaultMessage.of("RoadMarkWithLengthBelowThreshold", "Center lane contains roadMarks with length zero (or below threshold).", location, Severity.ERROR, wasFixed = true) + issueList += DefaultIssue.of("RoadMarkWithLengthBelowThreshold", "Center lane contains roadMarks with length zero (or below threshold).", location, Severity.ERROR, wasFixed = true) } return roadMarksFiltered diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadObjectsEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadObjectsEvaluator.kt index 9d9c6fe6..dfa4566a 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadObjectsEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadObjectsEvaluator.kt @@ -18,19 +18,19 @@ package io.rtron.transformer.evaluator.opendrive.plans.modelingrules import arrow.core.Some import arrow.core.flattenOption -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.optics.everyRoad import io.rtron.model.opendrive.additions.optics.everyRoadObject import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of object RoadObjectsEvaluator { // Methods - fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): OpendriveModel { + fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() modifiedOpendriveModel = everyRoad.modify(modifiedOpendriveModel) { currentRoad -> @@ -39,7 +39,7 @@ object RoadObjectsEvaluator { val roadObjectsFiltered = currentRoadObjects.roadObject.filter { it.s <= currentRoad.length + parameters.numberTolerance } if (currentRoadObjects.roadObject.size > roadObjectsFiltered.size) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "RoadObjectPositionNotInSValueRange", "Road object (number of objects affected: ${currentRoadObjects.roadObject.size - roadObjectsFiltered.size}) were removed since they were positioned outside the defined length of the road.", currentRoad.additionalId, @@ -61,7 +61,7 @@ object RoadObjectsEvaluator { if (outlineElementsWithoutId.isNotEmpty()) { val startId: Int = currentOutlinesElement.outline.map { it.id }.flattenOption().maxOrNull() ?: 0 - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "MissingValue", "Missing value for attribute 'id'.", currentRoadObject.additionalId, @@ -76,7 +76,7 @@ object RoadObjectsEvaluator { currentRoadObject.outlines.onSome { currentRoadObjectOutline -> if (currentRoadObjectOutline.outline.any { it.isPolyhedron() && !it.isPolyhedronUniquelyDefined() }) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "SimultaneousDefinitionCornerRoadCornerLocal", "An element shall be followed by one or more elements or by one or more element. Since both are defined, the elements are removed.", currentRoadObject.additionalId, @@ -90,7 +90,7 @@ object RoadObjectsEvaluator { val repeatElementsFiltered = currentRoadObject.repeat.filter { it.length >= parameters.numberTolerance } if (repeatElementsFiltered.size < currentRoadObject.repeat.size) { // TODO: double check handling - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "RepeatElementHasZeroLength", "A repeat element should have a length higher than zero and tolerance.", currentRoadObject.additionalId, diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadSignalsEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadSignalsEvaluator.kt index cad55350..af2a01f0 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadSignalsEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/plans/modelingrules/RoadSignalsEvaluator.kt @@ -16,18 +16,18 @@ package io.rtron.transformer.evaluator.opendrive.plans.modelingrules -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity import io.rtron.model.opendrive.OpendriveModel import io.rtron.model.opendrive.additions.optics.everyRoad import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters -import io.rtron.transformer.messages.opendrive.of +import io.rtron.transformer.issues.opendrive.of object RoadSignalsEvaluator { // Methods - fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, messageList: DefaultMessageList): OpendriveModel { + fun evaluate(opendriveModel: OpendriveModel, parameters: OpendriveEvaluatorParameters, issueList: DefaultIssueList): OpendriveModel { var modifiedOpendriveModel = opendriveModel.copy() modifiedOpendriveModel = everyRoad.modify(modifiedOpendriveModel) { currentRoad -> @@ -36,7 +36,7 @@ object RoadSignalsEvaluator { val signalsFiltered = currentRoadSignals.signal.filter { it.s <= currentRoad.length + parameters.numberTolerance } if (currentRoadSignals.signal.size > signalsFiltered.size) { - messageList += DefaultMessage.of( + issueList += DefaultIssue.of( "RoadSignalPositionNotInSValueRange", "Road signals (number of objects affected: ${currentRoadSignals.signal.size - signalsFiltered.size}) were removed since they were positioned outside the defined length of the road.", currentRoad.additionalId, diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/report/OpendriveEvaluationReport.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/report/OpendriveEvaluationReport.kt index 8e8620fc..fa1b1eef 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/report/OpendriveEvaluationReport.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/opendrive/report/OpendriveEvaluationReport.kt @@ -16,9 +16,9 @@ package io.rtron.transformer.evaluator.opendrive.report -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.containsFatalErrors -import io.rtron.io.messages.getTextSummary +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.containsFatalErrors +import io.rtron.io.issues.getTextSummary import io.rtron.transformer.evaluator.opendrive.OpendriveEvaluatorParameters import kotlinx.serialization.Serializable @@ -26,9 +26,9 @@ import kotlinx.serialization.Serializable data class OpendriveEvaluationReport( val parameters: OpendriveEvaluatorParameters, - var basicDataTypePlan: DefaultMessageList = DefaultMessageList(), - var modelingRulesPlan: DefaultMessageList = DefaultMessageList(), - var conversionRequirementsPlan: DefaultMessageList = DefaultMessageList() + var basicDataTypePlan: DefaultIssueList = DefaultIssueList(), + var modelingRulesPlan: DefaultIssueList = DefaultIssueList(), + var conversionRequirementsPlan: DefaultIssueList = DefaultIssueList() ) { /** diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/roadspaces/plans/AbstractRoadspacesEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/roadspaces/plans/AbstractRoadspacesEvaluator.kt index 8fd04859..6cb3c437 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/roadspaces/plans/AbstractRoadspacesEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/roadspaces/plans/AbstractRoadspacesEvaluator.kt @@ -16,11 +16,11 @@ package io.rtron.transformer.evaluator.roadspaces.plans -import io.rtron.io.messages.DefaultMessageList +import io.rtron.io.issues.DefaultIssueList import io.rtron.model.roadspaces.RoadspacesModel abstract class AbstractRoadspacesEvaluator { // Methods - abstract fun evaluate(roadspacesModel: RoadspacesModel): DefaultMessageList + abstract fun evaluate(roadspacesModel: RoadspacesModel): DefaultIssueList } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/roadspaces/plans/modelingrules/ModelingRulesEvaluator.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/roadspaces/plans/modelingrules/ModelingRulesEvaluator.kt index a65c8e18..93ef55b7 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/roadspaces/plans/modelingrules/ModelingRulesEvaluator.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/roadspaces/plans/modelingrules/ModelingRulesEvaluator.kt @@ -17,10 +17,10 @@ package io.rtron.transformer.evaluator.roadspaces.plans.modelingrules import arrow.core.getOrElse -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.DefaultMessageList -import io.rtron.io.messages.Severity -import io.rtron.io.messages.merge +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.DefaultIssueList +import io.rtron.io.issues.Severity +import io.rtron.io.issues.merge import io.rtron.math.geometry.euclidean.threed.point.Vector3D import io.rtron.math.geometry.toIllegalStateException import io.rtron.model.roadspaces.RoadspacesModel @@ -34,36 +34,36 @@ import io.rtron.transformer.evaluator.roadspaces.plans.AbstractRoadspacesEvaluat class ModelingRulesEvaluator(val parameters: RoadspacesEvaluatorParameters) : AbstractRoadspacesEvaluator() { // Methods - override fun evaluate(roadspacesModel: RoadspacesModel): DefaultMessageList { - val messageList = DefaultMessageList() + override fun evaluate(roadspacesModel: RoadspacesModel): DefaultIssueList { + val issueList = DefaultIssueList() - messageList += roadspacesModel.getAllRoadspaces().map { evaluateRoadLinkages(it, roadspacesModel) }.merge() + issueList += roadspacesModel.getAllRoadspaces().map { evaluateRoadLinkages(it, roadspacesModel) }.merge() - return messageList + return issueList } - private fun evaluateRoadLinkages(roadspace: Roadspace, roadspacesModel: RoadspacesModel): DefaultMessageList { - val messageList = DefaultMessageList() + private fun evaluateRoadLinkages(roadspace: Roadspace, roadspacesModel: RoadspacesModel): DefaultIssueList { + val issueList = DefaultIssueList() roadspace.road.getAllLeftRightLaneIdentifiers() .filter { roadspace.road.isInLastLaneSection(it) } .forEach { laneId -> val successorLaneIds = roadspacesModel.getSuccessorLaneIdentifiers(laneId).getOrElse { throw it } - messageList += successorLaneIds.map { successorLaneId -> + issueList += successorLaneIds.map { successorLaneId -> evaluateLaneTransition(laneId, successorLaneId, roadspace.road, roadspacesModel.getRoadspace(successorLaneId.toRoadspaceIdentifier()).getOrElse { throw it }.road, roadspacesModel) }.merge() } - return messageList + return issueList } - private fun evaluateLaneTransition(laneId: LaneIdentifier, successorLaneId: LaneIdentifier, road: Road, successorRoad: Road, roadspacesModel: RoadspacesModel): DefaultMessageList { + private fun evaluateLaneTransition(laneId: LaneIdentifier, successorLaneId: LaneIdentifier, road: Road, successorRoad: Road, roadspacesModel: RoadspacesModel): DefaultIssueList { require(laneId !== successorLaneId) { "Lane identifiers of current and of successor lane must be different." } require(laneId.roadspaceId !== successorLaneId.roadspaceId) { "Lane identifiers of current and of successor lane must be different regarding their roadspaceId." } require(road.id !== successorRoad.id) { "Road and successor road must be different." } - val messageList = DefaultMessageList() + val issueList = DefaultIssueList() val laneLeftLaneBoundaryPoint: Vector3D = road.getLeftLaneBoundary(laneId).getOrElse { throw it } .calculateEndPointGlobalCS().mapLeft { it.toIllegalStateException() }.getOrElse { throw it } @@ -77,9 +77,9 @@ class ModelingRulesEvaluator(val parameters: RoadspacesEvaluatorParameters) : Ab // TODO: identify inconsistencies in the topology of the model val successorLeftLaneBoundary = successorRoad.getLeftLaneBoundary(successorLaneId) - .fold({ return messageList }, { it }) + .fold({ return issueList }, { it }) val successorRightLaneBoundary = successorRoad.getRightLaneBoundary(successorLaneId) - .fold({ return messageList }, { it }) + .fold({ return issueList }, { it }) // if contact of successor at the start, normal connecting // if contact of the successor at the end, the end positions have to be calculated and left and right boundary have to be swapped @@ -105,7 +105,7 @@ class ModelingRulesEvaluator(val parameters: RoadspacesEvaluatorParameters) : Ab val leftLaneBoundaryTransitionDistance = laneLeftLaneBoundaryPoint.distance(laneLeftLaneBoundarySuccessorPoint) if (leftLaneBoundaryTransitionDistance >= parameters.laneTransitionDistanceTolerance) { val infoValues = mapOf("euclideanDistance" to leftLaneBoundaryTransitionDistance) - messageList += DefaultMessage( + issueList += DefaultIssue( "LeftLaneBoundaryTransitionGap", "Left boundary of lane should be connected to its successive lane (euclidean distance: $leftLaneBoundaryTransitionDistance).", location, @@ -119,7 +119,7 @@ class ModelingRulesEvaluator(val parameters: RoadspacesEvaluatorParameters) : Ab laneRightLaneBoundaryPoint.distance(laneRightLaneBoundarySuccessorPoint) if (rightLaneBoundaryTransitionDistance >= parameters.laneTransitionDistanceTolerance) { val infoValues = mapOf("euclideanDistance" to rightLaneBoundaryTransitionDistance) - messageList += DefaultMessage( + issueList += DefaultIssue( "RightLaneBoundaryTransitionGap", "Right boundary of lane should be connected to its successive lane (euclidean distance: $rightLaneBoundaryTransitionDistance).", location, @@ -129,6 +129,6 @@ class ModelingRulesEvaluator(val parameters: RoadspacesEvaluatorParameters) : Ab ) } - return messageList + return issueList } } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/roadspaces/report/RoadspacesEvaluationReport.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/roadspaces/report/RoadspacesEvaluationReport.kt index 50904ac0..d80976ea 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/roadspaces/report/RoadspacesEvaluationReport.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/evaluator/roadspaces/report/RoadspacesEvaluationReport.kt @@ -16,7 +16,7 @@ package io.rtron.transformer.evaluator.roadspaces.report -import io.rtron.io.messages.DefaultMessageList +import io.rtron.io.issues.DefaultIssueList import io.rtron.transformer.evaluator.roadspaces.RoadspacesEvaluatorParameters import kotlinx.serialization.Serializable @@ -24,5 +24,5 @@ import kotlinx.serialization.Serializable data class RoadspacesEvaluationReport( val parameters: RoadspacesEvaluatorParameters, - var modelingRulesEvaluation: DefaultMessageList = DefaultMessageList() + var modelingRulesEvaluation: DefaultIssueList = DefaultIssueList() ) diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/messages/opendrive/DefaultMessageExtensions.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/issues/opendrive/DefaultIssueExtensions.kt similarity index 55% rename from rtron-transformer/src/main/kotlin/io/rtron/transformer/messages/opendrive/DefaultMessageExtensions.kt rename to rtron-transformer/src/main/kotlin/io/rtron/transformer/issues/opendrive/DefaultIssueExtensions.kt index 9d08949f..4e692443 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/messages/opendrive/DefaultMessageExtensions.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/issues/opendrive/DefaultIssueExtensions.kt @@ -14,18 +14,18 @@ * limitations under the License. */ -package io.rtron.transformer.messages.opendrive +package io.rtron.transformer.issues.opendrive import arrow.core.Option -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.Severity import io.rtron.model.opendrive.additions.identifier.AbstractOpendriveIdentifier import io.rtron.model.opendrive.additions.identifier.toIdentifierText -fun DefaultMessage.Companion.of(type: String, info: String, location: AbstractOpendriveIdentifier, incidentSeverity: Severity, wasFixed: Boolean): DefaultMessage { - return DefaultMessage(type, info, location.toIdentifierText(), incidentSeverity, wasFixed) +fun DefaultIssue.Companion.of(type: String, info: String, location: AbstractOpendriveIdentifier, incidentSeverity: Severity, wasFixed: Boolean): DefaultIssue { + return DefaultIssue(type, info, location.toIdentifierText(), incidentSeverity, wasFixed) } -fun DefaultMessage.Companion.of(type: String, info: String, location: Option, incidentSeverity: Severity, wasFixed: Boolean): DefaultMessage { - return DefaultMessage(type, info, location.toIdentifierText(), incidentSeverity, wasFixed) +fun DefaultIssue.Companion.of(type: String, info: String, location: Option, incidentSeverity: Severity, wasFixed: Boolean): DefaultIssue { + return DefaultIssue(type, info, location.toIdentifierText(), incidentSeverity, wasFixed) } diff --git a/rtron-transformer/src/main/kotlin/io/rtron/transformer/messages/roadspaces/DefaultMessageExtensions.kt b/rtron-transformer/src/main/kotlin/io/rtron/transformer/issues/roadspaces/DefaultIssueExtensions.kt similarity index 55% rename from rtron-transformer/src/main/kotlin/io/rtron/transformer/messages/roadspaces/DefaultMessageExtensions.kt rename to rtron-transformer/src/main/kotlin/io/rtron/transformer/issues/roadspaces/DefaultIssueExtensions.kt index 4082f380..5ec82b55 100644 --- a/rtron-transformer/src/main/kotlin/io/rtron/transformer/messages/roadspaces/DefaultMessageExtensions.kt +++ b/rtron-transformer/src/main/kotlin/io/rtron/transformer/issues/roadspaces/DefaultIssueExtensions.kt @@ -14,18 +14,18 @@ * limitations under the License. */ -package io.rtron.transformer.messages.roadspaces +package io.rtron.transformer.issues.roadspaces import arrow.core.Option -import io.rtron.io.messages.DefaultMessage -import io.rtron.io.messages.Severity +import io.rtron.io.issues.DefaultIssue +import io.rtron.io.issues.Severity import io.rtron.model.roadspaces.identifier.AbstractRoadspacesIdentifier import io.rtron.model.roadspaces.identifier.toIdentifierText -fun DefaultMessage.Companion.of(type: String, info: String, location: AbstractRoadspacesIdentifier, incidentSeverity: Severity, wasFixed: Boolean): DefaultMessage { - return DefaultMessage(type, info, location.toIdentifierText(), incidentSeverity, wasFixed) +fun DefaultIssue.Companion.of(type: String, info: String, location: AbstractRoadspacesIdentifier, incidentSeverity: Severity, wasFixed: Boolean): DefaultIssue { + return DefaultIssue(type, info, location.toIdentifierText(), incidentSeverity, wasFixed) } -fun DefaultMessage.Companion.of(type: String, info: String, location: Option, incidentSeverity: Severity, wasFixed: Boolean): DefaultMessage { - return DefaultMessage(type, info, location.toIdentifierText(), incidentSeverity, wasFixed) +fun DefaultIssue.Companion.of(type: String, info: String, location: Option, incidentSeverity: Severity, wasFixed: Boolean): DefaultIssue { + return DefaultIssue(type, info, location.toIdentifierText(), incidentSeverity, wasFixed) }