De-duplicate code from Codegen#writeSupportingClasses

This commit is contained in:
James Earl Douglas 2014-04-24 15:07:45 -07:00
parent f4b2d13aa4
commit e542fbd0a2
2 changed files with 96 additions and 110 deletions

View File

@ -555,60 +555,28 @@ class Codegen(config: CodegenConfig) {
write(m) write(m)
} }
def writeSupportingClasses(apis: Map[(String, String), List[(String, Operation)]], models: Map[String, Model], apiVersion: String) = { final def writeSupportingClasses(
val rootDir = new java.io.File(".") apis: Map[(String, String), List[(String, Operation)]],
val engine = new TemplateEngine(Some(rootDir)) models: Map[String, Model],
apiVersion: String,
rootDir: Option[File],
dataF: (Map[(String, String), List[(String, Operation)]], Map[String, Model]) => Map[String, AnyRef]): Unit = {
val apiList = new ListBuffer[Map[String, AnyRef]] val engine = new TemplateEngine(rootDir orElse Some(new File(".")))
apis.foreach(a => { val data = dataF(apis, models)
apiList += Map(
"name" -> a._1._2,
"filename" -> config.toApiFilename(a._1._2),
"className" -> config.toApiName(a._1._2),
"basePath" -> a._1._1,
"operations" -> {
(for (t <- a._2) yield { Map("operation" -> apiToMap(t._1, t._2), "path" -> t._1) }).toList
})
})
val modelList = new ListBuffer[HashMap[String, AnyRef]]
models.foreach(m => {
val json = writeJson(m._2)
modelList += HashMap(
"modelName" -> m._1,
"model" -> modelToMap(m._1, m._2),
"filename" -> config.toModelFilename(m._1),
"modelJson" -> json,
"hasMoreModels" -> "true")
})
modelList.size match {
case 0 =>
case _ => modelList.last.asInstanceOf[HashMap[String, String]] -= "hasMoreModels"
}
val data: HashMap[String, AnyRef] =
HashMap(
"invokerPackage" -> config.invokerPackage,
"package" -> config.packageName,
"modelPackage" -> config.modelPackage,
"apiPackage" -> config.apiPackage,
"apis" -> apiList,
"models" -> modelList,
"apiVersion" -> apiVersion) ++ config.additionalParams
config.supportingFiles.map(file => { config.supportingFiles.map(file => {
val supportingFile = file._1 val supportingFile = file._1
val outputDir = file._2 val outputDir = file._2
val destFile = file._3 val destFile = file._3
val outputFilename = outputDir + File.separator + destFile val outputFilename = outputDir.replaceAll("\\.", File.separator) + File.separator + destFile
val outputFolder = new File(outputFilename).getParent val outputFolder = new File(outputFilename).getParent
new File(outputFolder).mkdirs new File(outputFolder).mkdirs
if (supportingFile.endsWith(".mustache")) { if (supportingFile.endsWith(".mustache")) {
val output = { val output = {
val (resourceName, (_, template)) = compileTemplate(supportingFile, Some(rootDir), Some(engine)) val (resourceName, (_, template)) = compileTemplate(supportingFile, rootDir, Some(engine))
engine.layout(resourceName, template, data.toMap) engine.layout(resourceName, template, data.toMap)
} }
val fw = new FileWriter(outputFilename, false) val fw = new FileWriter(outputFilename, false)
@ -638,6 +606,60 @@ class Codegen(config: CodegenConfig) {
engine.compiler.shutdown() engine.compiler.shutdown()
} }
def writeSupportingClasses(apis: Map[(String, String), List[(String, Operation)]],
models: Map[String, Model], apiVersion: String): Unit = {
val rootDir: Option[File] = Some(new File("."))
def apiListF(apis: Map[(String, String), List[(String, Operation)]]): List[Map[String, AnyRef]] = {
val apiList = new ListBuffer[Map[String, AnyRef]]
apis.foreach(a => {
apiList += Map(
"name" -> a._1._2,
"filename" -> config.toApiFilename(a._1._2),
"className" -> config.toApiName(a._1._2),
"basePath" -> a._1._1,
"operations" -> {
(for (t <- a._2) yield { Map("operation" -> apiToMap(t._1, t._2), "path" -> t._1) }).toList
})
})
apiList.toList
}
def modelListF(models: Map[String, Model]): List[Map[String, AnyRef]] = {
val modelList = new ListBuffer[HashMap[String, AnyRef]]
models.foreach(m => {
val json = writeJson(m._2)
modelList += HashMap(
"modelName" -> m._1,
"model" -> modelToMap(m._1, m._2),
"filename" -> config.toModelFilename(m._1),
"modelJson" -> json,
"hasMoreModels" -> "true")
})
modelList.size match {
case 0 =>
case _ => modelList.last.asInstanceOf[HashMap[String, String]] -= "hasMoreModels"
}
modelList.map(_.toMap).toList
}
def dataF(apis: Map[(String, String), List[(String, Operation)]],
models: Map[String, Model]): Map[String, AnyRef] =
Map(
"invokerPackage" -> config.invokerPackage,
"package" -> config.packageName,
"modelPackage" -> config.modelPackage,
"apiPackage" -> config.apiPackage,
"apis" -> apiListF(apis),
"models" -> modelListF(models),
"apiVersion" -> apiVersion) ++ config.additionalParams
writeSupportingClasses(apis, models, apiVersion, rootDir, dataF)
}
protected def isListType(dt: String) = isCollectionType(dt, "List") || isCollectionType(dt, "Array") || isCollectionType(dt, "Set") protected def isListType(dt: String) = isCollectionType(dt, "List") || isCollectionType(dt, "Array") || isCollectionType(dt, "Set")
protected def isMapType(dt: String) = isCollectionType(dt, "Map") protected def isMapType(dt: String) = isCollectionType(dt, "Map")

View File

@ -114,11 +114,12 @@ object ScalaAsyncClientGenerator extends App {
} }
class AsyncClientCodegen(clientName: String, config: CodegenConfig, rootDir: Option[File] = None) extends Codegen(config) { class AsyncClientCodegen(clientName: String, config: CodegenConfig, rootDir: Option[File] = None) extends Codegen(config) {
override def writeSupportingClasses(apis: Map[(String, String), List[(String, Operation)]], models: Map[String, Model], apiVersion: String) = {
val engine = new TemplateEngine(rootDir orElse Some(new File(".")))
override def writeSupportingClasses(apis: Map[(String, String), List[(String, Operation)]],
models: Map[String, Model], apiVersion: String): Unit = {
def apiListF(apis: Map[(String, String), List[(String, Operation)]]): List[Map[String, AnyRef]] = {
val apiList = new ListBuffer[Map[String, AnyRef]] val apiList = new ListBuffer[Map[String, AnyRef]]
apis.map(a => { apis.map(a => {
apiList += Map( apiList += Map(
"name" -> a._1._2, "name" -> a._1._2,
@ -129,14 +130,13 @@ class AsyncClientCodegen(clientName: String, config: CodegenConfig, rootDir: Opt
(for (t <- a._2) yield { Map("operation" -> t._2, "path" -> t._1) }).toList (for (t <- a._2) yield { Map("operation" -> t._2, "path" -> t._1) }).toList
}) })
}) })
apiList.toList
}
def modelListF(models: Map[String, Model]): List[Map[String, AnyRef]] = {
val modelList = new ListBuffer[HashMap[String, AnyRef]] val modelList = new ListBuffer[HashMap[String, AnyRef]]
models.foreach(m => { models.foreach(m => {
val json = write(m._2) val json = write(m._2)
modelList += HashMap( modelList += HashMap(
"modelName" -> m._1, "modelName" -> m._1,
"model" -> m._2, "model" -> m._2,
@ -148,57 +148,21 @@ class AsyncClientCodegen(clientName: String, config: CodegenConfig, rootDir: Opt
case 0 => case 0 =>
case _ => modelList.last.asInstanceOf[HashMap[String, String]] -= "hasMore" case _ => modelList.last.asInstanceOf[HashMap[String, String]] -= "hasMore"
} }
modelList.map(_.toMap).toList
}
val data = def dataF(apis: Map[(String, String), List[(String, Operation)]],
models: Map[String, Model]): Map[String, AnyRef] =
Map( Map(
"clientName" -> clientName.underscore.pascalize, "clientName" -> clientName.underscore.pascalize,
"projectName" -> clientName.underscore.dasherize, "projectName" -> clientName.underscore.dasherize,
"package" -> config.packageName, "package" -> config.packageName,
"modelPackage" -> config.modelPackage, "modelPackage" -> config.modelPackage,
"apiPackage" -> config.apiPackage, "apiPackage" -> config.apiPackage,
"apis" -> apiList, "apis" -> apiListF(apis),
"models" -> modelList) "models" -> modelListF(models))
config.supportingFiles.map(file => { writeSupportingClasses(apis, models, apiVersion, rootDir, dataF)
val supportingFile = file._1
val outputDir = file._2
val destFile = file._3
val outputFilename = outputDir.replaceAll("\\.", File.separator) + File.separator + destFile
val outputFolder = new File(outputFilename).getParent
new File(outputFolder).mkdirs
if (supportingFile.endsWith(".mustache")) {
val output = {
val (resourceName, (_, template)) = compileTemplate(supportingFile, rootDir, Some(engine))
engine.layout(resourceName, template, data.toMap)
}
val fw = new FileWriter(outputFilename, false)
fw.write(output + "\n")
fw.close()
println("wrote " + outputFilename)
} else {
val file = new File(config.templateDir + File.separator + supportingFile)
if(file.isDirectory) {
// copy the whole directory
FileUtils.copyDirectory(file, new File(outputDir))
println("copied directory " + supportingFile)
} else {
val is = getInputStream(config.templateDir + File.separator + supportingFile)
val outputFile = new File(outputFilename)
val parentDir = new File(outputFile.getParent)
if (parentDir != null && !parentDir.exists) {
println("making directory: " + parentDir.toString + ": " + parentDir.mkdirs)
}
FileUtils.copyInputStreamToFile(is, new File(outputFilename))
println("copied " + outputFilename)
is.close
}
}
})
//a shutdown method will be added to scalate in an upcoming release
engine.compiler.shutdown()
} }
override protected def compileTemplate(templateFile: String, rootDir: Option[File] = None, engine: Option[TemplateEngine] = None): (String, (TemplateEngine, Template)) = { override protected def compileTemplate(templateFile: String, rootDir: Option[File] = None, engine: Option[TemplateEngine] = None): (String, (TemplateEngine, Template)) = {