diff --git a/cacheinvalidationindex/build.gradle.kts b/cacheinvalidationindex/build.gradle.kts index c5cb89a..09db32f 100644 --- a/cacheinvalidationindex/build.gradle.kts +++ b/cacheinvalidationindex/build.gradle.kts @@ -19,6 +19,7 @@ gradlePlugin { dependencies { implementation(kotlin("stdlib-jdk8")) implementation(libs.jgrapht.core) + implementation(libs.jgrapht.io) testImplementation(libs.junit) testImplementation(libs.truth) diff --git a/cacheinvalidationindex/src/main/java/com/ivanalvarado/cacheinvalidationindex/CacheInvalidationIndexPlugin.kt b/cacheinvalidationindex/src/main/java/com/ivanalvarado/cacheinvalidationindex/CacheInvalidationIndexPlugin.kt index 0b48f77..ccf9a53 100644 --- a/cacheinvalidationindex/src/main/java/com/ivanalvarado/cacheinvalidationindex/CacheInvalidationIndexPlugin.kt +++ b/cacheinvalidationindex/src/main/java/com/ivanalvarado/cacheinvalidationindex/CacheInvalidationIndexPlugin.kt @@ -3,6 +3,7 @@ package com.ivanalvarado.cacheinvalidationindex import com.ivanalvarado.cacheinvalidationindex.domain.usecase.AffectedSubgraphsImpl import com.ivanalvarado.cacheinvalidationindex.domain.usecase.BuildDagFromDependencyPairsImpl import com.ivanalvarado.cacheinvalidationindex.domain.usecase.FindDependencyPairsImpl +import com.ivanalvarado.cacheinvalidationindex.writer.GraphVizWriter import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.internal.configuration.problems.taskPathFrom @@ -20,7 +21,8 @@ class CacheInvalidationIndexPlugin : Plugin { CacheInvalidationIndexTask::class.java, FindDependencyPairsImpl(), BuildDagFromDependencyPairsImpl(), - AffectedSubgraphsImpl() + AffectedSubgraphsImpl(), + GraphVizWriter() ) cacheInvalidationIndexTaskProvider.configure { task -> task.configurationToAnalyze.set(extension.configurationToAnalyze) diff --git a/cacheinvalidationindex/src/main/java/com/ivanalvarado/cacheinvalidationindex/CacheInvalidationIndexTask.kt b/cacheinvalidationindex/src/main/java/com/ivanalvarado/cacheinvalidationindex/CacheInvalidationIndexTask.kt index 29e6764..9f20368 100644 --- a/cacheinvalidationindex/src/main/java/com/ivanalvarado/cacheinvalidationindex/CacheInvalidationIndexTask.kt +++ b/cacheinvalidationindex/src/main/java/com/ivanalvarado/cacheinvalidationindex/CacheInvalidationIndexTask.kt @@ -3,6 +3,7 @@ package com.ivanalvarado.cacheinvalidationindex import com.ivanalvarado.cacheinvalidationindex.domain.usecase.AffectedSubgraphs import com.ivanalvarado.cacheinvalidationindex.domain.usecase.BuildDagFromDependencyPairs import com.ivanalvarado.cacheinvalidationindex.domain.usecase.FindDependencyPairs +import com.ivanalvarado.cacheinvalidationindex.writer.GraphVizWriter import org.gradle.api.DefaultTask import org.gradle.api.provider.SetProperty import org.gradle.api.tasks.Input @@ -12,7 +13,8 @@ import javax.inject.Inject abstract class CacheInvalidationIndexTask @Inject constructor( private val findDependencyPairs: FindDependencyPairs, private val buildDagFromDependencyPairs: BuildDagFromDependencyPairs, - private val affectedSubgraphs: AffectedSubgraphs + private val affectedSubgraphs: AffectedSubgraphs, + private val graphVizWriter: GraphVizWriter ) : DefaultTask() { @get:Input @@ -23,10 +25,11 @@ abstract class CacheInvalidationIndexTask @Inject constructor( val rootProject = project.rootProject val configurationsToAnalyze = configurationToAnalyze.get() val sampleList = findDependencyPairs(rootProject, configurationsToAnalyze) - println("Dependency Pairs: $sampleList") val dag = buildDagFromDependencyPairs(sampleList) - println("DAG: $dag") val affectedSubgraphs = affectedSubgraphs(dag) - println("Affected Subgraphs: $affectedSubgraphs") + graphVizWriter.writeGraph( + graph = affectedSubgraphs.find { it.node == project.path }!!.affectedDag, + file = project.file("build/graph.dot") + ) } } diff --git a/cacheinvalidationindex/src/main/java/com/ivanalvarado/cacheinvalidationindex/writer/GraphVizWriter.kt b/cacheinvalidationindex/src/main/java/com/ivanalvarado/cacheinvalidationindex/writer/GraphVizWriter.kt new file mode 100644 index 0000000..303b840 --- /dev/null +++ b/cacheinvalidationindex/src/main/java/com/ivanalvarado/cacheinvalidationindex/writer/GraphVizWriter.kt @@ -0,0 +1,37 @@ +package com.ivanalvarado.cacheinvalidationindex.writer + +import com.ivanalvarado.cacheinvalidationindex.domain.model.DependencyEdge +import org.jgrapht.graph.AbstractGraph +import org.jgrapht.nio.DefaultAttribute +import org.jgrapht.nio.dot.DOTExporter +import java.io.File + +class GraphVizWriter { + + fun writeGraph(graph: AbstractGraph, file: File) { + val exporter = DOTExporter { vertex -> + vertex.sanitize() + } + + exporter.setVertexAttributeProvider { vertex -> + buildMap { + put("label", DefaultAttribute.createAttribute(vertex)) + } + } + + exporter.setEdgeAttributeProvider { edge -> + buildMap { + put("label", DefaultAttribute.createAttribute(edge.configuration)) + } + } + + file.delete() + exporter.exportGraph(graph, file) + } + + private fun String.sanitize(): String { + return this.replace("-", "_") + .replace(".", "_") + .replace(":", "_") + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 293c2ba..2b0b395 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,6 +6,7 @@ truth = "1.4.4" [libraries] jgrapht-core = { group = "org.jgrapht", name = "jgrapht-core", version.ref = "jgrapht" } +jgrapht-io = { group = "org.jgrapht", name = "jgrapht-io", version.ref = "jgrapht" } junit = { group = "junit", name = "junit", version.ref = "junit" } truth = { group = "com.google.truth", name = "truth", version.ref = "truth" }