From b36a2965dc9ca88ffb7ceb2876d71515e2343f78 Mon Sep 17 00:00:00 2001 From: Gavriil Sitnikov Date: Tue, 2 May 2017 17:50:41 +0300 Subject: [PATCH] renaming of son generation script --- ...ion.gradle => jsonModelsGeneration.gradle} | 132 ++++++++++-------- 1 file changed, 72 insertions(+), 60 deletions(-) rename gradle/{apiGeneration.gradle => jsonModelsGeneration.gradle} (91%) diff --git a/gradle/apiGeneration.gradle b/gradle/jsonModelsGeneration.gradle similarity index 91% rename from gradle/apiGeneration.gradle rename to gradle/jsonModelsGeneration.gradle index f152b0f..c219855 100644 --- a/gradle/apiGeneration.gradle +++ b/gradle/jsonModelsGeneration.gradle @@ -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 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 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 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 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 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}") } } }