Skip to content
Snippets Groups Projects
Verified Commit 2b8d9219 authored by Rico Bergmann's avatar Rico Bergmann
Browse files

[WIP] Enable customization of output directories

parent cfd351c9
No related branches found
No related tags found
2 merge requests!2Publish v0.1,!1Move away from experimental changes
This commit is part of merge request !1. Comments created here will be created in the context of that merge request.
......@@ -12,15 +12,24 @@ import scala.reflect.io.{ File, Path }
import scala.tools.nsc.reporters.ConsoleReporter
import scala.tools.nsc.{ GenericRunnerSettings, Global, Settings }
import scala.util.control.Breaks._
import scala.reflect.io.Directory
/** @author Rico Bergmann
*/
class SModelFSWriter extends SModelVisitor {
class SModelFSWriter(
workingDir: File = File(Files.createTempDirectory("model").toFile),
outputDir: Directory = File("output").toDirectory,
keepClassFiles: Boolean = false) extends SModelVisitor {
// TODO enable different output dirs
// TODO enable retaining the .scala files
workingDir.jfile.mkdirs()
outputDir.jfile.mkdirs()
private val baseOutputDir: File = File(Files.createTempDirectory("model").toFile)
private var sFilesToCompile: List[File] = List.empty
println(s"... Temp dir (sources) is $baseOutputDir")
println(s"... Temp dir (sources) is $workingDir")
override def visit(sModel: SModel): Unit = {
println(s"... Wrote files (sources) $sFilesToCompile")
......@@ -32,28 +41,32 @@ class SModelFSWriter extends SModelVisitor {
// TODO do we want to reuse the whole classpath? Or just the parts we _actually_ need
compilationSettings.classpath.value = adaptClassPathToOSEnv(fetchCurrentClassPath).distinct.mkString(File.pathSeparator)
println(s"Using classpath ${compilationSettings.classpath.value}")
compilationSettings.outdir.value = baseOutputDir.toAbsolute.toString
compilationSettings.outdir.value = workingDir.toAbsolute.toString
val reporter = new ConsoleReporter(compilationSettings)
val compiler = new Global(compilationSettings, reporter)
val runner = new compiler.Run
runner.compile(sFilesToCompile.map(_.toAbsolute.toString))
println("... Compilation done")
if (!keepClassFiles) {
println("... Cleaning up")
sFilesToCompile.foreach {
_.delete
}
} else {
println("... No clean-up requested")
}
println("... Generating JAR")
// see: https://stackoverflow.com/a/1281295/5161760
val mf = new Manifest
mf.getMainAttributes.put(Attributes.Name.MANIFEST_VERSION, "1.0")
val targetJar = new JarOutputStream(new FileOutputStream("model.jar"), mf)
var filesToAdd: List[java.io.File] = baseOutputDir.jfile.listFiles.toList
val targetJar = new JarOutputStream(new FileOutputStream(outputDir + File.separator + "model.jar"), mf)
var filesToAdd: List[java.io.File] = workingDir.jfile.listFiles.toList
while (filesToAdd.nonEmpty) {
val file = filesToAdd.head
var fname = file.getAbsolutePath.replace(baseOutputDir.jfile.getAbsolutePath + File.separator, "").replaceAll("\\\\", "/")
var fname = file.getAbsolutePath.replace(workingDir.jfile.getAbsolutePath + File.separator, "").replaceAll("\\\\", "/")
println(s"Adding to JAR: $fname")
if (file.isDirectory) {
if (!fname.endsWith("/")) {
......@@ -94,7 +107,7 @@ class SModelFSWriter extends SModelVisitor {
override def visit(sClass: SClass): Unit = {
println(s"Writing class $sClass")
val classNameWithPath = baseOutputDir.toAbsolute.toString() + File.separator + pckg2Path(sClass.getPackage) + File.separator + s"${sClass.name}.scala"
val classNameWithPath = workingDir.toAbsolute.toString() + File.separator + pckg2Path(sClass.getPackage) + File.separator + s"${sClass.name}.scala"
val writer = new SClassWriter(sClass)
val classFile = File(classNameWithPath)
......
......@@ -2,9 +2,9 @@ package org.rosi_project.model_sync.generator.io
import org.rosi_project.model_sync.generator.acr._
import org.rosi_project.model_sync.generator.sync_model.{ GetterSetterGeneratingVisitor, SimpleSModel, SyncEnhancingVisitor }
import scala.reflect.io.File
/**
* @author Rico Bergmann
/** @author Rico Bergmann
*/
object SModelFSWriterTest extends App {
......@@ -23,5 +23,5 @@ object SModelFSWriterTest extends App {
model.accept(getterSetterVisitor)
model.accept(syncNotificationVisitor)
model.accept(new SModelFSWriter)
model.accept(new SModelFSWriter(workingDir = File("output/raw"), keepClassFiles = true))
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment