-
Notifications
You must be signed in to change notification settings - Fork 5
/
DirProjectExtractor.scala
79 lines (64 loc) · 2.79 KB
/
DirProjectExtractor.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package pl.jozwik.mvn2sbt
import java.io.File
import com.typesafe.scalalogging.LazyLogging
import org.maven.{Model, Parent}
import scala.util.{Failure, Success, Try}
object DirProjectExtractor extends LazyLogging {
val EFFECTIVE_POM_XML = "effective-pom.xml"
private[mvn2sbt] def valueFromOptions(option: Option[String], default: Option[String]) =
(option, default) match {
case (Some(value), _) =>
value
case (_, Some(defaultValue)) =>
defaultValue
case _ =>
throw new IllegalArgumentException("Both None")
}
private[mvn2sbt] def extractOption[T](op: Option[T]): T = op match {
case Some(t) => t
case None => sys.error("None")
}
private[mvn2sbt] def createProjectMap(dir: File, pomModel: Model, parent: Option[MavenDependency]): Map[MavenDependency, ProjectInformation] = {
val groupId = valueFromOptions(pomModel.groupId, parent.map(_.groupId))
val version = valueFromOptions(pomModel.version, parent.map(_.versionId))
val dependency = MavenDependency(groupId, extractOption(pomModel.artifactId), version)
val pomParent = toPomParent(pomModel.parent)
val plugins = MavenSbtPluginMapper(pomModel).plugins
val resolversOptions = pomModel.repositories.map(r => r.repository.flatMap(_.url))
val resolvers = resolversOptions.fold(Seq.empty[String]) {
seq => seq
}
val currMap = Map(dependency -> ProjectInformation(dir, pomParent, resolvers.toSet, plugins: _*))
pomModel.modules match {
case None =>
currMap
case Some(modules) =>
val seq = modules.module.map(m => toProjectMap(new File(dir, m), Some(dependency)))
seq.foldLeft(currMap)((map, acc) => map ++ acc)
}
}
private def toPomParent(parent: Option[Parent]) = parent.map(
p => MavenDependency(extractOption(p.groupId), extractOption(p.artifactId), extractOption(p.version)))
private def toProjectMap(dir: File, parent: Option[MavenDependency]) = {
val pomOption = dir.listFiles.find(f => f.getName == EFFECTIVE_POM_XML)
pomOption.map {
pomXml =>
handlePomFile(pomXml, parent)
}.getOrElse(
sys.error(s"""$EFFECTIVE_POM_XML file missing in ${dir.getAbsolutePath}, run "scala Eff.sc ${dir.getAbsolutePath}" first"""))
}
private def handlePomFile(pomXml: File, parent: Option[MavenDependency]) = {
val xmlFromFile = Try(xml.XML.loadFile(pomXml)) match {
case Success(pom) => pom
case Failure(th) =>
logger.error(s"${pomXml.getAbsolutePath} failed to be parse")
throw th
}
val pomModel = scalaxb.fromXML[org.maven.Model](xmlFromFile)
createProjectMap(pomXml.getParentFile, pomModel, parent)
}
}
case class DirProjectExtractor(rootDir: File) {
import pl.jozwik.mvn2sbt.DirProjectExtractor._
val projectsMap = toProjectMap(rootDir, None)
}