All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opalj.av.checking.SpecificationViolation.scala Maven / Gradle / Ivy

The newest version!
/* BSD 2-Clause License - see OPAL/LICENSE for details. */
package org.opalj
package av
package checking

import scala.Console.{RED, BLUE, RESET, BOLD}
import org.opalj.br._
import org.opalj.de._
import org.opalj.br.analyses.SomeProject

/**
 * Used to report deviations between the specified and the implemented architecture.
 *
 * @author Michael Eichberg
 * @author Marco Torsello
 */
sealed trait SpecificationViolation {

    final override 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

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy