Files
odc-analyzer/app/controllers/ProjectsWithReports.scala

79 lines
2.7 KiB
Scala

package controllers
final case class ReportInfo private[controllers] (
projectId: String,
projectName: String,
fullId: String,
subprojectNameOption: Option[String]
) extends Ordered[ReportInfo] {
import scala.math.Ordered.orderingToOrdered
//noinspection ScalaUnnecessaryParentheses
override def compare(that: ReportInfo): Int = ((projectName, subprojectNameOption, fullId)) compare ((that.projectName, that.subprojectNameOption, that.fullId))
// It seems to be a good idea to have a custom equals and hashCode for performance reasons
override def equals(other: Any): Boolean = other match {
case other: ReportInfo => fullId == other.fullId
case _ => false
}
override def hashCode(): Int = 517+fullId.hashCode
def bare = ReportInfo(
fullId = fullId.takeWhile(_ != '/'),
projectId = projectId,
projectName = projectName,
subprojectNameOption = None
)
def isBare = subprojectNameOption.isEmpty
def isNotBare = !isBare
}
object ProjectsWithReports{
private val RestMessBeginRegexp = """^/Report results-XML(/|$)""".r
private val RestMessEndRegexp = """(/|^)(target/)?dependency-check-report\.xml$""".r
}
class ProjectsWithReports (val projects: Projects, val reports: Set[String]) {
import ProjectsWithReports._
val reportIdToReportInfo = {
val reportsMap = reports.map{ unfriendlyName =>
unfriendlyName -> parseUnfriendlyName(unfriendlyName)
}.toMap
reportsMap ++ reportsMap.values.map(r => r.projectId -> ReportInfo(projectId = r.projectId, fullId = r.projectId, subprojectNameOption = None, projectName = r.projectName))
}
def parseUnfriendlyNameGracefully(unfriendlyName: String) = parseUnfriendlyName(unfriendlyName, identity)
def parseUnfriendlyName(unfriendlyName: String): ReportInfo = parseUnfriendlyName(unfriendlyName, _ => sys.error(s"Project $unfriendlyName not found!"))
private def parseUnfriendlyName(unfriendlyName: String, missingProject: String => String): ReportInfo = {
val (baseName, theRest) = unfriendlyName.span(_ != '/')
val removeLeadingMess = RestMessBeginRegexp.replaceAllIn(_: String, "").dropWhile(_=='/')
val removeTrailingMess = RestMessEndRegexp.replaceAllIn(_: String, "")
val removeMess = removeLeadingMess andThen removeTrailingMess
val subProjectOption = Some(removeMess(theRest)).filter(_ != "")
ReportInfo(
projectId = baseName,
fullId = unfriendlyName,
projectName = projects.projectMap.getOrElse(baseName, missingProject(baseName)),
subprojectNameOption = subProjectOption.orElse(Some("root project"))
)
}
val ungroupedReportsInfo = reportIdToReportInfo.values.toSet
def sortedReportsInfo = ungroupedReportsInfo.toSeq.sortBy(p => p.projectName -> p.projectId -> p.subprojectNameOption)
}