diff --git a/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala index 9c1c5697c33c171b73947ab19974df968b1d3ebb..296252ddd98d677a901644f4a139af52d5166da2 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala @@ -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") - println("... Cleaning up") - sFilesToCompile.foreach { - _.delete + 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) diff --git a/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriterTest.scala b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriterTest.scala index fd675cbbaddd8e7c52630745a49c6a47833b866a..57351db86d1378ee2bbd4771c36b66b9782e5811 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriterTest.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriterTest.scala @@ -1,10 +1,10 @@ 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 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)) }