summaryrefslogtreecommitdiff
path: root/project/build/Packer.scala
diff options
context:
space:
mode:
Diffstat (limited to 'project/build/Packer.scala')
-rw-r--r--project/build/Packer.scala89
1 files changed, 89 insertions, 0 deletions
diff --git a/project/build/Packer.scala b/project/build/Packer.scala
new file mode 100644
index 0000000000..8e3be9d9a3
--- /dev/null
+++ b/project/build/Packer.scala
@@ -0,0 +1,89 @@
+import sbt._
+import java.io.{File,FileInputStream}
+import java.util.jar.Manifest
+import BasicLayer._
+import FileUtilities._
+
+/**
+ * Create the jars of pack
+ * @author Grégory Moix
+ */
+trait Packer {
+ self: BasicLayer =>
+
+ def libraryToCopy:List[Path] = Nil
+
+ protected def jarPattern(path:PathFinder) = path.descendentsExcept(AllPassFilter, defaultExcludes || new ExactFilter("MANIFEST.MF")).get
+
+ def createJar(j:Packaging):Option[String] = {
+ def pack0(content:Iterable[Path])=jar(content.flatMap(jarPattern(_)),j.jarDestination, j.manifest, false, log)
+ j.jarsToInclude match {
+ case Nil => pack0(j.jarContent)
+ case list => {
+ withTemporaryDirectory(log) { tmp: File =>
+ val tmpPath = Path.fromFile(tmp)
+ log.debug("List of jars to be added : " +list)
+ def unzip0(l:List[Path]):Option[String] = l match {
+ case x::xs => {unzip(x,tmpPath,log);unzip0(xs)} //TODO properly handle failing of unzip
+ case Nil => None
+ }
+ unzip0(list)
+ log.debug("Content of temp folder"+ tmpPath.##.**( GlobFilter("*")))
+ pack0(j.jarContent ++ Set(tmpPath ##))
+ }
+ }
+ }
+ }
+
+ lazy val pack= task {
+
+ def iterate(steps:List[Step]):Option[String]= steps match{
+ case x::xs => x match{
+ case c:Packaging => {
+ createJar(c) orElse iterate(xs)
+ }
+ case _ => iterate(xs)
+ }
+ case Nil => None
+ }
+
+ def copy0 ={
+ copyFile(manifestPath,packingDestination/"META-INF"/"MANIFEST.MF",log) orElse {
+ copy(libraryToCopy,packingDestination , true,true,log) match {
+ case Right(_) => None
+ case Left(e) => Some(e)
+ }
+ }
+ }
+ iterate(allSteps.topologicalSort) orElse copy0
+ }.dependsOn(finishLayer)
+
+
+
+}
+
+trait Packaging extends Step{
+ def manifest = new Manifest
+ def jarDestination:Path = packagingDestination /"lib" / jarName
+ def packagingDestination:Path
+ def jarName:String
+ def jarsToInclude:List[Path] = Nil
+ def jarContent:Iterable[Path]
+
+}
+
+trait WrapperPackaging extends Packaging {
+ self : WrapperStep =>
+
+ def jarContent = {
+ def getContent(list:List[Step],acc:List[Path]):List[Path]= list match {
+ case Nil => acc
+ case x::xs => x match {
+ case w:WrapperStep => getContent(xs,getContent(w.dependencies.toList,acc))
+ case c:CompilationStep => getContent(xs,(c.outputDirectory ##)::acc)
+ }
+ }
+ getContent(dependencies.toList,Nil)
+ }
+
+}