renaming of son generation script

This commit is contained in:
Gavriil Sitnikov 2017-05-02 17:50:41 +03:00
parent 492cda3f52
commit b36a2965dc
1 changed files with 72 additions and 60 deletions

View File

@ -40,8 +40,6 @@ import javax.lang.model.element.Modifier
//TODO: NUMBER/BOOLEAN enums in future
//TODO: maybe save md5-hashes to check if files/scheme changed
//TODO: setup generation by map yaml->package
class Types {
static final TypeName LOGAN_SQUARE_ENUM = ClassName.bestGuess("ru.touchin.templates.logansquare.LoganSquareEnum")
@ -829,6 +827,65 @@ class FileUtils {
}
}
static void generateJsonModelsCode(final File generatedModelsDirectory, final String schemeFilePath,
final String modelsPackage, final String projectDir) {
if (schemeFilePath == null) {
return
}
File schemeFile = new File(schemeFilePath)
if (!schemeFile.exists()) {
schemeFile = new File(projectDir, schemeFilePath)
}
if (!schemeFile.exists()) {
throw new Exception("JSON models scheme file not found at '" + schemeFilePath)
}
final Yaml yaml = new Yaml()
final Map<String, SchemeObject> schemeObjects = new HashMap<>()
schemeObjects.put("Map", new ImportObject("java.util.Map"))
schemeObjects.put("List", new ImportObject("java.util.List"))
schemeObjects.put("DateTime", new ImportObject("org.joda.time.DateTime"))
for (final Object data : yaml.loadAll(new FileReader(schemeFile))) {
if (!(data instanceof Map)) {
throw new Exception("Yaml file '" + schemeFile + "' is invalid")
}
for (final Map.Entry<String, Object> entry : data.entrySet()) {
if (entry.key.equals(ImportObject.GROUP_NAME)) {
for (String importString : (Iterable) entry.value) {
final ImportObject importObject = new ImportObject(importString)
schemeObjects.put(importObject.name, importObject)
}
} else if (entry.key.startsWith(EnumObject.PREFIX)) {
final EnumObject enumObject = new EnumObject(entry.key.substring(EnumObject.PREFIX.length()), entry.value)
schemeObjects.put(enumObject.name, enumObject)
} else if (entry.key.startsWith(ClassObject.PREFIX)) {
final ClassObject classObject = new ClassObject(entry.key.substring(ClassObject.PREFIX.length()), entry.value)
schemeObjects.put(classObject.name, classObject)
} else {
throw new Exception("Unexpected scheme object: " + entry.key)
}
}
}
for (final SchemeObject schemeObject : schemeObjects.values()) {
if (schemeObject instanceof ClassObject) {
try {
schemeObject.resolveFieldsInfo(schemeObjects)
} catch (final Exception exception) {
throw new Exception("Error on parsing class '" + schemeObject.name + "' : " + exception.getMessage())
}
}
try {
schemeObject.writeToFile(generatedModelsDirectory, schemeObjects, modelsPackage)
} catch (final Exception exception) {
throw new Exception("Error on generating code for '" + schemeObject.name + "' : " + exception.getMessage())
}
}
}
}
android.applicationVariants.all {
@ -838,66 +895,21 @@ android.applicationVariants.all {
* Generating Java classes describing JSON models from specific YAML scheme.
*/
def generateJsonModelsTask = tasks.create("generateJsonModels${variant.name}") << {
String modelsPackage = android.extensions.findByName("apiGeneratorModelsPackage")
String schemeFilePath = android.extensions.findByName("apiGeneratorSchemePath")
if (modelsPackage == null) {
modelsPackage = android.defaultConfig.applicationId + '.logic.api.model'
}
final List<String> jsonModelsMapping = android.extensions.findByName("jsonModelsMapping")
if (schemeFilePath == null) {
return
}
File schemeFile = new File(schemeFilePath)
if (!schemeFile.exists()) {
schemeFile = new File("${project.projectDir}", schemeFilePath)
}
if (!schemeFile.exists()) {
throw new Exception("JSON models scheme file not found at '" + schemeFilePath + "' or at '${project.projectDir}/" + schemeFilePath + "'")
}
FileUtils.purgeDirectory(generatedModelsDirectory)
final Yaml yaml = new Yaml()
final Map<String, SchemeObject> schemeObjects = new HashMap<>()
schemeObjects.put("Map", new ImportObject("java.util.Map"))
schemeObjects.put("List", new ImportObject("java.util.List"))
schemeObjects.put("DateTime", new ImportObject("org.joda.time.DateTime"))
for (final Object data : yaml.loadAll(new FileReader(schemeFile))) {
if (!(data instanceof Map)) {
throw new Exception("Yaml file '" + fileName + "' is invalid")
}
for (final Map.Entry<String, Object> entry : data.entrySet()) {
if (entry.key.equals(ImportObject.GROUP_NAME)) {
for (String importString : (Iterable) entry.value) {
final ImportObject importObject = new ImportObject(importString)
schemeObjects.put(importObject.name, importObject)
}
} else if (entry.key.startsWith(EnumObject.PREFIX)) {
final EnumObject enumObject = new EnumObject(entry.key.substring(EnumObject.PREFIX.length()), entry.value)
schemeObjects.put(enumObject.name, enumObject)
} else if (entry.key.startsWith(ClassObject.PREFIX)) {
final ClassObject classObject = new ClassObject(entry.key.substring(ClassObject.PREFIX.length()), entry.value)
schemeObjects.put(classObject.name, classObject)
} else {
throw new Exception("Unexpected scheme object: " + entry.key)
}
}
}
for (final SchemeObject schemeObject : schemeObjects.values()) {
if (schemeObject instanceof ClassObject) {
try {
schemeObject.resolveFieldsInfo(schemeObjects)
} catch (final Exception exception) {
throw new Exception("Error on parsing class '" + schemeObject.name + "' : " + exception.getMessage())
}
}
try {
schemeObject.writeToFile(generatedModelsDirectory, schemeObjects, modelsPackage)
} catch (final Exception exception) {
throw new Exception("Error on generating code for '" + schemeObject.name + "' : " + exception.getMessage())
for (final String jsonMapping : jsonModelsMapping) {
final int indexOfDivider = jsonMapping.indexOf('->')
if (indexOfDivider == -1) {
FileUtils.generateJsonModelsCode(generatedModelsDirectory,
jsonMapping.trim(),
android.defaultConfig.applicationId + '.logic.model',
"${project.projectDir}")
} else {
FileUtils.generateJsonModelsCode(generatedModelsDirectory,
jsonMapping.substring(0, indexOfDivider).trim(),
jsonMapping.substring(indexOfDivider + 2).trim(),
"${project.projectDir}")
}
}
}