PageRenderTime 1016ms CodeModel.GetById 34ms RepoModel.GetById 90ms app.codeStats 0ms

/archetypes/scalate-archetypes-itests/src/main/scala/org/fusesource/scalate/tooling/ArchetypeTestSupport.scala

http://github.com/scalate/scalate
Scala | 321 lines | 228 code | 51 blank | 42 comment | 26 complexity | d8a7b0fb5a8b0cc46f3072dd6b0212ed MD5 | raw file
  1. /**
  2. * Copyright (C) 2009-2010 the original author or authors.
  3. * See the notice.md file distributed with this work for additional
  4. * information regarding copyright ownership.
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. package org.fusesource.scalate.tooling
  19. import java.io.File
  20. import java.util.Collections
  21. import java.util.{List => JList}
  22. import java.util.LinkedHashMap
  23. import java.util.Map
  24. import java.util.Properties
  25. import scala.collection.JavaConversions._
  26. import org.apache.maven.Maven
  27. import org.apache.maven.exception.DefaultExceptionHandler
  28. import org.apache.maven.exception.ExceptionHandler
  29. import org.apache.maven.exception.ExceptionSummary
  30. import org.apache.maven.execution.DefaultMavenExecutionRequest
  31. import org.apache.maven.execution.MavenExecutionRequest
  32. import org.apache.maven.execution.MavenExecutionRequestPopulator
  33. import org.apache.maven.execution.MavenExecutionResult
  34. import org.apache.maven.lifecycle.LifecycleExecutionException
  35. import org.apache.maven.project.{DefaultProjectBuildingRequest, ProjectBuilder, MavenProject}
  36. import org.apache.maven.repository.RepositorySystem
  37. import org.apache.maven.settings.building.DefaultSettingsBuildingRequest
  38. import org.apache.maven.settings.building.SettingsBuilder
  39. import org.apache.maven.settings.building.SettingsBuildingRequest
  40. import org.apache.maven.settings.building.SettingsBuildingResult
  41. import org.codehaus.plexus.{DefaultContainerConfiguration, ContainerConfiguration, DefaultPlexusContainer}
  42. import org.codehaus.plexus.util.FileUtils
  43. import org.fusesource.scalate.util.IOUtil._
  44. import org.junit.{After, Before, Assert}
  45. import org.slf4j.LoggerFactory
  46. /**
  47. * A base class for testing out archetypes
  48. */
  49. class ArchetypeTestSupport {
  50. protected val logger = LoggerFactory.getLogger(getClass)
  51. protected var baseDir = new File(System.getProperty("basedir", ".")).getAbsoluteFile
  52. protected var container: DefaultPlexusContainer = null
  53. // TODO discover this from the pom!
  54. protected var version: String = _
  55. protected var newProjectDir: File = _
  56. protected def testScalateArchetype(artifactId: String, testConsole: Boolean = false): Unit = {
  57. // lets try resolve the current project version
  58. version = findCurrentPomVersion
  59. logger.info("Looked up version from current pom: " + version)
  60. testScalateArchetype("org.fusesource.scalate.tooling", artifactId, version, testConsole)
  61. }
  62. protected def testScalateArchetype(groupId: String, artifactId: String, version: String, testConsole: Boolean): Unit = {
  63. logger.info("Attempting to create archetype: " + artifactId + " using version: " + version)
  64. // create a temp directory to run the archetype in
  65. var targetDir: File = new File(baseDir, "target/archetypes/" + artifactId)
  66. FileUtils.deleteDirectory(targetDir)
  67. targetDir.mkdirs
  68. //val createdArtifactId: String = UUID.randomUUID.toString
  69. val createdArtifactId: String = "myArtifact"
  70. var props: Properties = new Properties
  71. props.setProperty("archetypeGroupId", groupId)
  72. props.setProperty("archetypeArtifactId", artifactId)
  73. props.setProperty("archetypeVersion", version)
  74. props.setProperty("groupId", "sample")
  75. props.setProperty("artifactId", createdArtifactId)
  76. props.setProperty("user.dir", targetDir.getAbsolutePath)
  77. props.setProperty("basedir", targetDir.getAbsolutePath)
  78. /*val localRepo = "file://" + (new File(System.getProperty("user.home", ".") + "/.m2/repository").getCanonicalFile)
  79. println("Using archetype repo: " + localRepo)
  80. props.setProperty("archetypeRepository", localRepo)
  81. */
  82. props.setProperty("archetypeCatalog", "local")
  83. var request: DefaultMavenExecutionRequest = new DefaultMavenExecutionRequest
  84. request.setSystemProperties(System.getProperties.clone.asInstanceOf[Properties])
  85. request.setUserProperties(props)
  86. request.setGoals(Collections.singletonList("archetype:generate"))
  87. request.setBaseDirectory(targetDir)
  88. request.setProjectPresent(false)
  89. runMaven(request)
  90. newProjectDir = new File(targetDir, createdArtifactId)
  91. logger.info("Now building created archetype in: " + newProjectDir)
  92. runMaven(mavenRequest(Collections.singletonList("install")))
  93. /*
  94. request = new DefaultMavenExecutionRequest
  95. request.setSystemProperties(System.getProperties.clone.asInstanceOf[Properties])
  96. request.setGoals(Collections.singletonList("install"))
  97. request.setBaseDirectory(newProjectDir)
  98. request.setProjectPresent(true)
  99. request.setPom(new File(newProjectDir, "pom.xml"))
  100. runMaven(request)
  101. */
  102. if (testConsole) {
  103. // lets copy the ConsoleTest
  104. copyFile(baseDir.getParentFile.getParentFile.getPath +
  105. "/scalate-war/src/test/scala/org/fusesource/scalate/console/ConsoleTest.scala",
  106. newProjectDir.getPath + "/src/test/scala/org/fusesource/scalate/console/ConsoleTest.scala")
  107. // lets copy the TestGeneratedConsoleFiles
  108. copyFile(baseDir.getPath + "/src/test/scala/org/fusesource/scalate/console/TestGeneratedConsoleFiles.scala",
  109. newProjectDir.getPath + "/src/test/scala/org/fusesource/scalate/console/TestGeneratedConsoleFiles.scala")
  110. System.setProperty("scalate.package.resources", "sample.resources")
  111. System.setProperty("scalate.generate.src", new File(newProjectDir, "src").getPath)
  112. mavenTest("ConsoleTest")
  113. mavenTest("TestGeneratedConsoleFiles")
  114. }
  115. }
  116. def copyFile(fromFileName: String, toFileName: String): File = {
  117. val from = new File(fromFileName)
  118. val to = new File(toFileName)
  119. println("copying from: " + from + " to: " + to)
  120. copy(from, to)
  121. to
  122. }
  123. def mavenTest(test: String): Unit = {
  124. val request = mavenRequest(Collections.singletonList("install"))
  125. val properties = new Properties()
  126. properties.put("test", test)
  127. request.setUserProperties(properties)
  128. runMaven(request)
  129. }
  130. def mavenRequest(goals: JList[String]): DefaultMavenExecutionRequest = {
  131. val request = new DefaultMavenExecutionRequest
  132. request.setSystemProperties(System.getProperties.clone.asInstanceOf[Properties])
  133. request.setGoals(goals)
  134. request.setBaseDirectory(newProjectDir)
  135. request.setProjectPresent(true)
  136. request.setPom(new File(newProjectDir, "pom.xml"))
  137. request
  138. }
  139. @Before
  140. def setUp: Unit = {
  141. container = createContainer
  142. }
  143. @After
  144. def tearDown: Unit = {
  145. if (container != null) {
  146. container.dispose
  147. }
  148. container = null
  149. }
  150. /**
  151. * Uses the current pom.xml to find the version
  152. */
  153. protected def findCurrentPomVersion: String = {
  154. val builder = container.lookup(classOf[ProjectBuilder])
  155. assert(builder != null)
  156. val buildingRequest = new DefaultProjectBuildingRequest
  157. buildingRequest.setOffline(false)
  158. var rsys = container.lookup(classOf[RepositorySystem])
  159. buildingRequest.setLocalRepository(rsys.createDefaultLocalRepository)
  160. buildingRequest.setRemoteRepositories(Collections.singletonList(rsys.createDefaultRemoteRepository))
  161. val buildingResult = builder.build(new File(baseDir, "pom.xml"), buildingRequest)
  162. assert(buildingResult != null)
  163. val answer = buildingResult.getProject.getVersion
  164. println("Found archetype version: " + answer)
  165. answer
  166. }
  167. protected def runMaven(request: MavenExecutionRequest): MavenExecutionResult = {
  168. assert(container != null)
  169. var maven = container.lookup(classOf[Maven])
  170. Assert.assertNotNull("Should have a maven!", maven)
  171. configureRequest(request)
  172. var result: MavenExecutionResult = null
  173. try {
  174. result = maven.execute(request)
  175. }
  176. finally {
  177. container.release(maven)
  178. }
  179. if (result.hasExceptions) {
  180. var handler: ExceptionHandler = new DefaultExceptionHandler
  181. var references: Map[String, String] = new LinkedHashMap[String, String]
  182. var project: MavenProject = null
  183. for (exception <- result.getExceptions) {
  184. var summary: ExceptionSummary = handler.handleException(exception)
  185. logSummary(summary, references, "", request.isShowErrors)
  186. if (project == null && exception.isInstanceOf[LifecycleExecutionException]) {
  187. project = (exception.asInstanceOf[LifecycleExecutionException]).getProject
  188. }
  189. }
  190. Assert.fail("Failed to invoke maven goals: " + request.getGoals + " due to exceptions: " + result.getExceptions)
  191. }
  192. return result
  193. }
  194. protected def configureRequest(request: MavenExecutionRequest): Unit = {
  195. assert(request != null)
  196. var settingsRequest: SettingsBuildingRequest = new DefaultSettingsBuildingRequest
  197. settingsRequest.setSystemProperties(request.getSystemProperties)
  198. settingsRequest.setUserProperties(request.getUserProperties)
  199. var settingsResult: SettingsBuildingResult = null
  200. val settingsBuilder = container.lookup(classOf[SettingsBuilder])
  201. try {
  202. settingsResult = settingsBuilder.build(settingsRequest)
  203. }
  204. finally {
  205. container.release(settingsBuilder)
  206. }
  207. val populator = container.lookup(classOf[MavenExecutionRequestPopulator])
  208. try {
  209. populator.populateFromSettings(request, settingsResult.getEffectiveSettings)
  210. }
  211. finally {
  212. container.release(populator)
  213. }
  214. val rsys = container.lookup(classOf[RepositorySystem])
  215. request.setLocalRepository(rsys.createDefaultLocalRepository)
  216. request.setRemoteRepositories(Collections.singletonList(rsys.createDefaultRemoteRepository))
  217. if (!settingsResult.getProblems.isEmpty && logger.isWarnEnabled) {
  218. logger.warn("")
  219. logger.warn("Some problems were encountered while building the effective settings")
  220. for (problem <- settingsResult.getProblems) {
  221. logger.warn(problem.getMessage + " @ " + problem.getLocation)
  222. }
  223. logger.warn("")
  224. }
  225. request.setShowErrors(true)
  226. request.setOffline(false)
  227. request.setInteractiveMode(false)
  228. request.setLoggingLevel(MavenExecutionRequest.LOGGING_LEVEL_DEBUG)
  229. }
  230. private def createContainer: DefaultPlexusContainer = {
  231. var cc: ContainerConfiguration = new DefaultContainerConfiguration
  232. cc.setName("maven")
  233. var c: DefaultPlexusContainer = new DefaultPlexusContainer(cc)
  234. configureContainer(c)
  235. return c
  236. }
  237. protected def configureContainer(c: DefaultPlexusContainer): Unit = {
  238. assert(c != null)
  239. }
  240. private def logSummary(summary: ExceptionSummary, references: Map[String, String], indent: String, showErrors: Boolean): Unit = {
  241. assert(summary != null)
  242. var referenceKey: String = ""
  243. if (org.codehaus.plexus.util.StringUtils.isNotEmpty(summary.getReference)) {
  244. referenceKey = references.get(summary.getReference)
  245. if (referenceKey == null) {
  246. referenceKey = "[Help " + (references.size + 1) + "]"
  247. references.put(summary.getReference, referenceKey)
  248. }
  249. }
  250. var msg: String = indent + summary.getMessage
  251. if (org.codehaus.plexus.util.StringUtils.isNotEmpty(referenceKey)) {
  252. if (msg.indexOf('\n') < 0) {
  253. msg += " -> " + referenceKey
  254. }
  255. else {
  256. msg += '\n' + indent + "-> " + referenceKey
  257. }
  258. }
  259. if (showErrors) {
  260. logger.error(msg, summary.getException)
  261. }
  262. else {
  263. logger.error(msg)
  264. }
  265. val childIndent = indent + " "
  266. for (child <- summary.getChildren) {
  267. logSummary(child, references, childIndent, showErrors)
  268. }
  269. }
  270. }