From f39ce6b8cfff03b7b5c0507a85eeaf6c76f64942 Mon Sep 17 00:00:00 2001 From: Sergio Murguia Date: Tue, 28 Nov 2017 17:48:28 -0800 Subject: [PATCH] Add support for topologies. Now it is possible to add dependencies by specifying topologies. At this moment only FULL, RANDOM and LINEAR are implemented. Once this change is reviewed and accepted more types will be added. See diff on AndroidStudioPoet.kt for an example of a random topology. --- .../androidstudiopoet/AndroidStudioPoet.kt | 3 +- .../ModuleBlueprintFactory.kt | 10 ++-- .../androidstudiopoet/models/ConfigPOJO.kt | 25 ++++++++++ .../androidstudiopoet/models/Topologies.kt | 50 +++++++++++++++++++ 4 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 src/main/kotlin/com/google/androidstudiopoet/models/Topologies.kt diff --git a/src/main/kotlin/com/google/androidstudiopoet/AndroidStudioPoet.kt b/src/main/kotlin/com/google/androidstudiopoet/AndroidStudioPoet.kt index 430a1bb4..ce39957c 100644 --- a/src/main/kotlin/com/google/androidstudiopoet/AndroidStudioPoet.kt +++ b/src/main/kotlin/com/google/androidstudiopoet/AndroidStudioPoet.kt @@ -46,6 +46,7 @@ class AndroidStudioPoet(private val modulesWriter: SourceModuleWriter, config: A " \"androidModules\": \"2\",\n" + " \"numActivitiesPerAndroidModule\": \"8\",\n" + " \"productFlavors\": [2, 3, 4],\n" + + " \"topologies\": [{\"type\": \"random\", \"seed\": \"2\"}],\n" + " \"dependencies\": [{\"from\": 3, \"to\": 2},\n" + " {\"from\": 4, \"to\": 2}, {\"from\": 4, \"to\": 3}]\n" + "}" @@ -123,4 +124,4 @@ class AndroidStudioPoet(private val modulesWriter: SourceModuleWriter, config: A } } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/com/google/androidstudiopoet/ModuleBlueprintFactory.kt b/src/main/kotlin/com/google/androidstudiopoet/ModuleBlueprintFactory.kt index 54e3641a..561c6026 100644 --- a/src/main/kotlin/com/google/androidstudiopoet/ModuleBlueprintFactory.kt +++ b/src/main/kotlin/com/google/androidstudiopoet/ModuleBlueprintFactory.kt @@ -7,12 +7,12 @@ import com.google.androidstudiopoet.models.ModuleBlueprint object ModuleBlueprintFactory { fun create(index: Int, config: ConfigPOJO, projectRoot: String): ModuleBlueprint { - val dependencies = config.dependencies - ?.filter { it.from == index} - ?.map { it.to } + val dependencies = config.resolvedDependencies + .filter { it.from == index} + .map { it.to } - val dependenciesNames = dependencies?.map { getModuleNameByIndex(it) } ?: listOf() - val methodsToCallWithinModule = dependencies?.map { getMethodToCallForDependency(it, config, projectRoot) } ?: listOf() + val dependenciesNames = dependencies.map { getModuleNameByIndex(it) } + val methodsToCallWithinModule = dependencies.map { getMethodToCallForDependency(it, config, projectRoot) } return ModuleBlueprint(index, getModuleNameByIndex(index), projectRoot, dependenciesNames, methodsToCallWithinModule, config) diff --git a/src/main/kotlin/com/google/androidstudiopoet/models/ConfigPOJO.kt b/src/main/kotlin/com/google/androidstudiopoet/models/ConfigPOJO.kt index 2e396ece..bdb422c7 100644 --- a/src/main/kotlin/com/google/androidstudiopoet/models/ConfigPOJO.kt +++ b/src/main/kotlin/com/google/androidstudiopoet/models/ConfigPOJO.kt @@ -15,6 +15,7 @@ package com.google.androidstudiopoet.models import com.google.gson.Gson +import java.security.InvalidParameterException class ConfigPOJO { @@ -68,6 +69,8 @@ class ConfigPOJO { val productFlavors: List? = null + val topologies: List>? = null + override fun toString(): String = toJson() private fun toJson(): String { @@ -78,5 +81,27 @@ class ConfigPOJO { val useKotlin: Boolean get() = kotlinPackageCount!!.toInt() > 0 + + val resolvedDependencies: List by lazy { + val allDependencies : MutableSet = mutableSetOf() + + // Add dependencies generated by topologies + val givenTopologies = topologies + if (givenTopologies != null) { + for (parameters in givenTopologies) { + val type = parameters.get("type") ?: throw InvalidParameterException("No type specified in topology $parameters") + val topology : Topologies = Topologies.valueOf(type.toUpperCase()) + allDependencies.addAll(topology.generateDependencies(parameters, this)) + } + } + + // Add explicit dependencies + val explicitDependencies = dependencies + if (explicitDependencies != null) { + allDependencies.addAll(explicitDependencies) + } + + allDependencies.toList() + } } diff --git a/src/main/kotlin/com/google/androidstudiopoet/models/Topologies.kt b/src/main/kotlin/com/google/androidstudiopoet/models/Topologies.kt new file mode 100644 index 00000000..5dfa7d35 --- /dev/null +++ b/src/main/kotlin/com/google/androidstudiopoet/models/Topologies.kt @@ -0,0 +1,50 @@ +package com.google.androidstudiopoet.models + +import java.util.* + +/** + * Enum with all supported topologies + */ +enum class Topologies { + + FULL { + override fun generateDependencies(parameters: Map, configPOJO: ConfigPOJO): List { + val result = mutableListOf() + for (from in 0 until configPOJO.numModules) { + for (to in from + 1 until configPOJO.numModules) { + result.add(Dependency(from, to)) + } + } + return result + } + }, + + RANDOM { + override fun generateDependencies(parameters: Map, configPOJO: ConfigPOJO): List { + val seedInput = parameters["seed"] + val seed: Long = seedInput?.toLong() ?: 0 + + Random().setSeed(seed) + val result = mutableListOf() + for (from in 0 until configPOJO.numModules) { + for (to in from + 1 until configPOJO.numModules) { + if (Random().nextBoolean()) { + result.add(Dependency(from, to)) + } + } + } + return result + } + }, + + LINEAR { + override fun generateDependencies(parameters: Map, configPOJO: ConfigPOJO): List = (1 until configPOJO.numModules).map { Dependency(it - 1, it) } + } + ; + + /** + * Function that should add dependencies to configPOJO based on the given parameters and the + * content of configPOJO + */ + abstract fun generateDependencies(parameters: Map, configPOJO: ConfigPOJO): List +} \ No newline at end of file