summaryrefslogtreecommitdiff
path: root/core/src/main/scala/forge/modules/Jvm.scala
blob: e707df296345ad8ebb324ae0a9c8ce3ecfb6d20d (plain) (blame)
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
package forge.modules

import java.io.FileOutputStream
import java.util.jar.{JarEntry, JarOutputStream}

import ammonite.ops._
import forge.define.Task
import forge.eval.PathRef
import forge.util.Args


object Jvm {

  def subprocess(mainClass: String,
                 classPath: Seq[Path]) = {
    import ammonite.ops.ImplicitWd._
    %("java", "-cp", classPath.mkString(":"), mainClass)
  }

  private def createManifest(mainClass: Option[String]) = {
    val m = new java.util.jar.Manifest()
    m.getMainAttributes.put(java.util.jar.Attributes.Name.MANIFEST_VERSION, "1.0")
    m.getMainAttributes.putValue( "Created-By", "Scala Forge" )
    mainClass.foreach(
      m.getMainAttributes.put(java.util.jar.Attributes.Name.MAIN_CLASS, _)
    )
    m
  }

  def createJar(outputPath: Path, inputPaths: Seq[Path], mainClass: Option[String] = None): Option[Path] = {
    rm(outputPath)
    if(inputPaths.isEmpty) None
    else {
      mkdir(outputPath/up)

      val jar = new JarOutputStream(
        new FileOutputStream(outputPath.toIO),
        createManifest(mainClass)
      )

      try{
        assert(inputPaths.forall(exists(_)))
        for{
          p <- inputPaths
          (file, mapping) <-
          if (p.isFile) Iterator(p -> empty/p.last)
          else ls.rec(p).filter(_.isFile).map(sub => sub -> sub.relativeTo(p))
        } {
          val entry = new JarEntry(mapping.toString)
          entry.setTime(file.mtime.toMillis)
          jar.putNextEntry(entry)
          jar.write(read.bytes(file))
          jar.closeEntry()
        }
      } finally {
        jar.close()
      }

      Some(outputPath)
    }
  }
  case class jarUp(roots: Task[PathRef]*) extends Task[PathRef]{

    val inputs = roots
    def evaluate(args: Args): PathRef = {
      createJar(args.dest, args.args.map(_.asInstanceOf[PathRef].path))
      PathRef(args.dest)
    }
  }
}