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