From f70e8698136dca04f341499828b840caabc197ec Mon Sep 17 00:00:00 2001 From: Josh Suereth Date: Mon, 15 Jul 2013 09:48:28 -0400 Subject: [PATCH] =pro #3019 Migrate the actor copy reference actions to a resourceGenerator. This ensures that the resources are generated on demand, when needed by the build. They also don't clutter the git repository. Also create an intermediate setting to clean up some of the code. --- project/AkkaBuild.scala | 70 ++++++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 75732f5f6c..4bf575373a 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -322,28 +322,55 @@ object AkkaBuild extends Build { ) ) - val ActorReferenceCopyTask = TaskKey[Int]("hello", "Copy reference.conf from akka modules to akka-osgi") - val ActorReferenceCopyAction = (streams) map { (s) => - s.log.debug("Copying of the akka-actor reference.conf in akka-osgi") - (file("akka-osgi/src/main/resources")).mkdir() - if ((file("akka-osgi/src/main/resources/reference.conf")).exists){(file("akka-osgi/src/main/resources/reference.conf")).delete()} - val projectReferencesToCopy = for (project <- projects.filter(p => !p.id.contains("test") && !p.id.contains("sample")) - if (file(project.base+"/src/main/resources/reference.conf")).exists()) yield project + val ActorMakeOsgiConfiguration = TaskKey[Seq[File]]("actor-make-osgi-configuration", "Copy reference.conf from akka modules for akka-osgi") + val ActorOsgiConfigurationReference = TaskKey[Seq[(File, String)]]("actor-osgi-configuration-reference", "The list of all configuration files to be bundled in an osgi bundle, as well as project name.") - val referencesFileToInclude = projectReferencesToCopy.map(project => { - copyFile(project.base+"/src/main/resources/reference.conf", "akka-osgi/src/main/resources/"+project.id+".conf") - "include \""+ project.id +".conf\"" - }) - - val writer = new PrintWriter(file("akka-osgi/src/main/resources/reference.conf" )) - writer.write(referencesFileToInclude.mkString("\n")) - writer.close() - s.log.info("Akka module reference.conf copied in akka-osgi") - projects.size + import Project.Initialize + /** This method uses a bit of advanced sbt initailizers to grab the normalized names and resource directories + * from a set of projects, and then use this to create a mapping of (reference.conf to project name). + */ + def ActorOsgiConfigurationReferenceAction(projects: Seq[Project]): Initialize[Task[Seq[(File, String)]]] = { + val directories: Initialize[Seq[File]] = projects.map(resourceDirectory in Compile in _).join + val names: Initialize[Seq[String]] = projects.map(normalizedName in _).join + directories zip names map { case (dirs, ns) => + for { + (dir, project) <- dirs zip ns + val conf = dir / "reference.conf" + if conf.exists + } yield conf -> project + } + } + + /** This method is repsonsible for genreating a new typeasafe config reference.conf file for OSGi. + * it copies all the files in the `includes` parameter, using the associated project name. Then + * it generates a new resource.conf file which includes these files. + * + * @param target The location where we write the new files + * @param includes A sequnece of (, ) pairs. + */ + def makeOsgiConfigurationFiles(includes: Seq[(File, String)], target: File, streams: TaskStreams): Seq[File] = { + // First we copy all the files to their destination + val toCopy = + for { + (file, project) <- includes + val toFile = target / (project + ".conf") + } yield file -> toFile + IO.copy(toCopy) + val copiedResourceFileLocations = toCopy.map(_._2) + streams.log.debug("Copied OSGi resources: " + copiedResourceFileLocations.mkString("\n\t", "\n\t", "\n")) + // Now we generate the new including conf file + val newConf = target / "resource.conf" + val confIncludes = + for { + (file, project) <- includes + } yield "include \""+ project +".conf\"" + val writer = new PrintWriter(newConf) + try writer.write(confIncludes mkString "\n") + finally writer.close() + streams.log.info("Copied OSGi resources.") + newConf +: copiedResourceFileLocations } - - lazy val osgi = Project( id = "akka-osgi", @@ -351,9 +378,10 @@ object AkkaBuild extends Build { dependencies = Seq(actor), settings = defaultSettings ++ scaladocSettings ++ javadocSettings ++ OSGi.osgi ++ Seq( libraryDependencies ++= Dependencies.osgi, - ActorReferenceCopyTask in Compile <<= ActorReferenceCopyAction , cleanFiles <+= baseDirectory { base => base / "src/main/resources" } , - compile in Compile <<= compile in Compile dependsOn (ActorReferenceCopyTask in Compile), + ActorOsgiConfigurationReference <<= ActorOsgiConfigurationReferenceAction(projects.filter(p => !p.id.contains("test") && !p.id.contains("sample"))), + ActorMakeOsgiConfiguration <<= (ActorOsgiConfigurationReference, resourceManaged in Compile, streams) map makeOsgiConfigurationFiles, + resourceGenerators in Compile <+= ActorMakeOsgiConfiguration, parallelExecution in Test := false ) )