/* BSD 2-Clause License - see OPAL/LICENSE for details. */ package org.opalj package av package checking import scala.Console.BLUE import scala.Console.BOLD import scala.Console.RED import scala.Console.RESET import org.opalj.br.* import org.opalj.br.analyses.SomeProject import org.opalj.de.* /** * Used to report deviations between the specified and the implemented architecture. * * @author Michael Eichberg * @author Marco Torsello */ sealed trait SpecificationViolation { override final def toString: String = toString(useAnsiColors = false) def toString(useAnsiColors: Boolean): String } /** * Used to report deviations between the specified/expected and the implemented dependencies. * * @author Michael Eichberg * @author Marco Torsello */ case class DependencyViolation( project: SomeProject, dependencyChecker: DependencyChecker, source: VirtualSourceElement, target: VirtualSourceElement, dependencyType: DependencyType, description: String ) extends SpecificationViolation { override def toString(useAnsiColors: Boolean): String = { val sourceLineNumber = source.getLineNumber(project).getOrElse(1) val javaSource = s"(${source.classType.toJava}.java:$sourceLineNumber)" val targetLineNumber = target.getLineNumber(project).getOrElse(1) val javaTarget = s"(${target.classType.toJava}.java:$targetLineNumber)" if (useAnsiColors) RED + description + " between " + BLUE + dependencyChecker.sourceEnsembles.mkString(", ") + RED + " and " + BLUE + dependencyChecker.targetEnsembles.mkString(", ") + RESET + ": " + javaSource + " " + BOLD + dependencyType + RESET + " " + javaTarget else description + " between " + dependencyChecker.sourceEnsembles.mkString(", ") + " and " + dependencyChecker.targetEnsembles.mkString(", ") + ": " + javaSource + " " + dependencyType + " " + javaTarget } } /** * Used to report source elements that have properties that deviate from the expected ones. * * @author Marco Torsello */ case class PropertyViolation( project: SomeProject, propertyChecker: PropertyChecker, source: VirtualSourceElement, propertyType: String, description: String ) extends SpecificationViolation { override def toString(useAnsiColors: Boolean): String = { val sourceLineNumber = source.getLineNumber(project).getOrElse(1) val javaSourceClass = s"(${source.classType.toJava}.java:$sourceLineNumber)" val javaSource = source match { case VirtualField(_, name, fieldType) => javaSourceClass + s" {${fieldType.toJava} $name}" case VirtualMethod(_, name, descriptor) => if (sourceLineNumber == 1) javaSourceClass + s" {${descriptor.toJava(name)}}" else javaSourceClass case _ => javaSourceClass } if (useAnsiColors) RED + description + " between " + BLUE + propertyChecker.ensembles.mkString(", ") + RED + " and " + BLUE + propertyChecker.property + RESET + ": " + javaSource + " " + BOLD + propertyType + RESET + " " + propertyChecker.property else description + " between " + propertyChecker.ensembles.mkString(", ") + " and " + propertyChecker.property + ": " + javaSource + " " + propertyType + " " + propertyChecker.property } }