From 019c3335afd9977bdfc6a4749df9ee03feb05aca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Vonheiden?= <bjoern.vonheiden@hotmail.de>
Date: Fri, 12 Mar 2021 12:04:23 +0100
Subject: [PATCH] Extract code quality plugins into convention plugins

Create convention plugins to reduce complexity of the root build.gradle file
---
 .../build.gradle                              |  6 +-
 theodolite-benchmarks/build.gradle            | 79 +------------------
 theodolite-benchmarks/buildSrc/build.gradle   |  8 ++
 .../groovy/theodolite.java-commons.gradle     |  7 ++
 .../groovy/theodolite.java-conventions.gradle | 70 ++++++++++++++++
 .../src/main/groovy/theodolite.java-uc.gradle |  7 ++
 .../flink-commons/build.gradle                |  8 +-
 .../uc1-application-flink/build.gradle        |  4 +
 .../uc1-application/build.gradle              |  4 +
 .../uc1-workload-generator/build.gradle       |  4 +
 .../uc2-application-flink/build.gradle        |  4 +
 .../uc2-application/build.gradle              |  4 +
 .../uc2-workload-generator/build.gradle       |  4 +
 .../uc3-application-flink/build.gradle        |  4 +
 .../uc3-application/build.gradle              |  4 +
 .../uc3-workload-generator/build.gradle       |  4 +
 .../uc4-application-flink/build.gradle        |  4 +
 .../uc4-application/build.gradle              |  4 +
 .../uc4-workload-generator/build.gradle       |  4 +
 .../workload-generator-commons/build.gradle   |  8 +-
 20 files changed, 159 insertions(+), 82 deletions(-)
 create mode 100644 theodolite-benchmarks/buildSrc/src/main/groovy/theodolite.java-commons.gradle
 create mode 100644 theodolite-benchmarks/buildSrc/src/main/groovy/theodolite.java-uc.gradle

diff --git a/theodolite-benchmarks/application-kafkastreams-commons/build.gradle b/theodolite-benchmarks/application-kafkastreams-commons/build.gradle
index c1ce7502e..01daacba9 100644
--- a/theodolite-benchmarks/application-kafkastreams-commons/build.gradle
+++ b/theodolite-benchmarks/application-kafkastreams-commons/build.gradle
@@ -1,3 +1,7 @@
+plugins {
+    id 'theodolite.java-commons'
+}
+
 dependencies {
   // These dependencies are used internally, and not exposed to consumers on their own compile classpath.
   // implementation 'org.slf4j:slf4j-simple:1.7.25'
@@ -7,4 +11,4 @@ dependencies {
 
   // Use JUnit test framework
   testImplementation 'junit:junit:4.12'
-  }
\ No newline at end of file
+}
diff --git a/theodolite-benchmarks/build.gradle b/theodolite-benchmarks/build.gradle
index 01085ba4f..3395dcf80 100644
--- a/theodolite-benchmarks/build.gradle
+++ b/theodolite-benchmarks/build.gradle
@@ -6,7 +6,6 @@ buildscript {
     }
   }
   dependencies {
-    classpath "gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.6.0"
     classpath "com.github.jengelman.gradle.plugins:shadow:6.0.0"
   }
 }
@@ -23,10 +22,7 @@ allprojects {
 }
 
 subprojects {
-  apply plugin: 'checkstyle'
-  apply plugin: 'pmd'
-  apply plugin: 'com.github.spotbugs'
-  apply plugin: 'java-library'
+  apply plugin: 'theodolite.java-conventions'
 }
 
 configure(useCaseProjects){
@@ -38,14 +34,6 @@ configure(useCaseApplicationsFlink){
     applicationDefaultJvmArgs = ["-Dlog4j.configuration=log4j.properties"]
 }
 
-// Java version for all subprojects
-subprojects {
-  java {
-    sourceCompatibility = JavaVersion.VERSION_11
-    targetCompatibility = JavaVersion.VERSION_11
-  }
-}
-
 // Check for updates every build
 configurations.all {
     resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
@@ -117,7 +105,7 @@ configure(useCaseApplicationsFlink) {
       // Use JUnit test framework
       testImplementation 'junit:junit:4.12'
   }
-  
+
   run.classpath = sourceSets.main.runtimeClasspath
 
   jar {
@@ -149,69 +137,6 @@ configure(useCaseGenerators) {
   }
 }
 
-// Per default XML reports for SpotBugs are generated
-// Include this to generate HTML reports
-tasks.withType(com.github.spotbugs.snom.SpotBugsTask) {
-  reports {
-    // Either HTML or XML reports can be activated
-    html.enabled true
-    xml.enabled false
-  }
-}
-
-// Subprojects quality tools tasks
-subprojects {
-  task pmd {
-    group 'Quality Assurance'
-    description 'Run PMD'
-
-    dependsOn 'pmdMain'
-    dependsOn 'pmdTest'
-  }
-
-  task checkstyle {
-    group 'Quality Assurance'
-    description 'Run Checkstyle'
-
-    dependsOn 'checkstyleMain'
-    dependsOn 'checkstyleTest'
-  }
-
-  task spotbugs {
-    group 'Quality Assurance'
-    description 'Run SpotBugs'
-
-    dependsOn 'spotbugsMain'
-    dependsOn 'spotbugsTest'
-  }
-}
-
-// Subprojects quality tools configuration
-subprojects {
-  pmd {
-    ruleSets = [] // Gradle requires to clean the rule sets first
-    ruleSetFiles = files("$rootProject.projectDir/config/pmd.xml")
-    ignoreFailures = false
-    toolVersion = "6.7.0"
-  }
-
-  checkstyle {
-    configDirectory = file("$rootProject.projectDir/config")
-    configFile = file("$rootProject.projectDir/config/checkstyle.xml")
-    maxWarnings = 0
-    ignoreFailures = false
-    toolVersion = "8.12"
-  }
-
-  spotbugs {
-    excludeFilter = file("$rootProject.projectDir/config/spotbugs-exclude-filter.xml")
-    reportLevel = "low"
-    effort = "max"
-    ignoreFailures = false
-    toolVersion = '4.1.4'
-  }
-}
-
 allprojects {
   eclipse {
       classpath {
diff --git a/theodolite-benchmarks/buildSrc/build.gradle b/theodolite-benchmarks/buildSrc/build.gradle
index 678405245..7abe60a90 100644
--- a/theodolite-benchmarks/buildSrc/build.gradle
+++ b/theodolite-benchmarks/buildSrc/build.gradle
@@ -1,3 +1,11 @@
 plugins {
     id 'groovy-gradle-plugin'
 }
+
+repositories {
+    gradlePluginPortal() // so that external plugins can be resolved in dependencies section
+}
+
+dependencies {
+    implementation 'gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.6.0'
+}
diff --git a/theodolite-benchmarks/buildSrc/src/main/groovy/theodolite.java-commons.gradle b/theodolite-benchmarks/buildSrc/src/main/groovy/theodolite.java-commons.gradle
new file mode 100644
index 000000000..f195d6e11
--- /dev/null
+++ b/theodolite-benchmarks/buildSrc/src/main/groovy/theodolite.java-commons.gradle
@@ -0,0 +1,7 @@
+plugins {
+  // common java conventions
+  id 'theodolite.java-conventions'
+
+  // provide library capability in commons
+  id 'java-library'
+}
diff --git a/theodolite-benchmarks/buildSrc/src/main/groovy/theodolite.java-conventions.gradle b/theodolite-benchmarks/buildSrc/src/main/groovy/theodolite.java-conventions.gradle
index e69de29bb..773872648 100644
--- a/theodolite-benchmarks/buildSrc/src/main/groovy/theodolite.java-conventions.gradle
+++ b/theodolite-benchmarks/buildSrc/src/main/groovy/theodolite.java-conventions.gradle
@@ -0,0 +1,70 @@
+plugins {
+  id 'java'
+  id 'checkstyle'
+  id 'pmd'
+
+  // NOTE: external plugin version is specified in implementation dependency artifact of the project's build file
+  id 'com.github.spotbugs'
+}
+
+java {
+  sourceCompatibility = JavaVersion.VERSION_11
+  targetCompatibility = JavaVersion.VERSION_11
+}
+
+// Per default XML reports for SpotBugs are generated
+// Include this to generate HTML reports
+tasks.withType(com.github.spotbugs.snom.SpotBugsTask) {
+  reports {
+    // Either HTML or XML reports can be activated
+    html.enabled true
+    xml.enabled false
+  }
+}
+
+task pmd {
+  group 'Quality Assurance'
+  description 'Run PMD'
+
+  dependsOn 'pmdMain'
+  dependsOn 'pmdTest'
+}
+
+task checkstyle {
+  group 'Quality Assurance'
+  description 'Run Checkstyle'
+
+  dependsOn 'checkstyleMain'
+  dependsOn 'checkstyleTest'
+}
+
+task spotbugs {
+  group 'Quality Assurance'
+  description 'Run SpotBugs'
+
+  dependsOn 'spotbugsMain'
+  dependsOn 'spotbugsTest'
+}
+
+pmd {
+  ruleSets = [] // Gradle requires to clean the rule sets first
+  ruleSetFiles = files("$rootProject.projectDir/config/pmd.xml")
+  ignoreFailures = false
+  toolVersion = "6.7.0"
+}
+
+checkstyle {
+  configDirectory = file("$rootProject.projectDir/config")
+  configFile = file("$rootProject.projectDir/config/checkstyle.xml")
+  maxWarnings = 0
+  ignoreFailures = false
+  toolVersion = "8.12"
+}
+
+spotbugs {
+  excludeFilter = file("$rootProject.projectDir/config/spotbugs-exclude-filter.xml")
+  reportLevel = "low"
+  effort = "max"
+  ignoreFailures = false
+  toolVersion = '4.1.4'
+}
diff --git a/theodolite-benchmarks/buildSrc/src/main/groovy/theodolite.java-uc.gradle b/theodolite-benchmarks/buildSrc/src/main/groovy/theodolite.java-uc.gradle
new file mode 100644
index 000000000..b182c9d7f
--- /dev/null
+++ b/theodolite-benchmarks/buildSrc/src/main/groovy/theodolite.java-uc.gradle
@@ -0,0 +1,7 @@
+plugins {
+  // common java conventions
+  id 'theodolite.java-conventions'
+
+  // make executable
+  id 'application'
+}
diff --git a/theodolite-benchmarks/flink-commons/build.gradle b/theodolite-benchmarks/flink-commons/build.gradle
index 26b3a68ff..a1f048b67 100644
--- a/theodolite-benchmarks/flink-commons/build.gradle
+++ b/theodolite-benchmarks/flink-commons/build.gradle
@@ -1,3 +1,7 @@
+plugins {
+    id 'theodolite.java-commons'
+}
+
 ext {
     flinkVersion = '1.12.0'
     scalaBinaryVersion = '2.12'
@@ -10,7 +14,7 @@ dependencies {
     implementation 'com.google.guava:guava:30.1-jre'
     compile group: 'org.apache.flink', name: "flink-connector-kafka_${scalaBinaryVersion}", version: "${flinkVersion}"
     compile group: 'org.apache.flink', name: 'flink-java', version: "${flinkVersion}"
-    
+
     // Use JUnit test framework
     testImplementation 'junit:junit:4.12'
-  }
\ No newline at end of file
+  }
diff --git a/theodolite-benchmarks/uc1-application-flink/build.gradle b/theodolite-benchmarks/uc1-application-flink/build.gradle
index 8b8552dbc..5626314b0 100644
--- a/theodolite-benchmarks/uc1-application-flink/build.gradle
+++ b/theodolite-benchmarks/uc1-application-flink/build.gradle
@@ -1 +1,5 @@
+plugins {
+  id 'theodolite.java-uc'
+}
+
 mainClassName = "theodolite.uc1.application.HistoryServiceFlinkJob"
diff --git a/theodolite-benchmarks/uc1-application/build.gradle b/theodolite-benchmarks/uc1-application/build.gradle
index 3b197e851..c13b89627 100644
--- a/theodolite-benchmarks/uc1-application/build.gradle
+++ b/theodolite-benchmarks/uc1-application/build.gradle
@@ -1 +1,5 @@
+plugins {
+  id 'theodolite.java-uc'
+}
+
 mainClassName = "theodolite.uc1.application.HistoryService"
diff --git a/theodolite-benchmarks/uc1-workload-generator/build.gradle b/theodolite-benchmarks/uc1-workload-generator/build.gradle
index 9cc0bdbf0..490dbb663 100644
--- a/theodolite-benchmarks/uc1-workload-generator/build.gradle
+++ b/theodolite-benchmarks/uc1-workload-generator/build.gradle
@@ -1 +1,5 @@
+plugins {
+  id 'theodolite.java-uc'
+}
+
 mainClassName = "theodolite.uc1.workloadgenerator.LoadGenerator"
diff --git a/theodolite-benchmarks/uc2-application-flink/build.gradle b/theodolite-benchmarks/uc2-application-flink/build.gradle
index b5e847553..173c3ceac 100644
--- a/theodolite-benchmarks/uc2-application-flink/build.gradle
+++ b/theodolite-benchmarks/uc2-application-flink/build.gradle
@@ -1,3 +1,7 @@
+plugins {
+  id 'theodolite.java-uc'
+}
+
 allprojects {
 	repositories {
     	maven {
diff --git a/theodolite-benchmarks/uc2-application/build.gradle b/theodolite-benchmarks/uc2-application/build.gradle
index e4d3f5346..919555031 100644
--- a/theodolite-benchmarks/uc2-application/build.gradle
+++ b/theodolite-benchmarks/uc2-application/build.gradle
@@ -1 +1,5 @@
+plugins {
+  id 'theodolite.java-uc'
+}
+
 mainClassName = "theodolite.uc2.application.HistoryService"
diff --git a/theodolite-benchmarks/uc2-workload-generator/build.gradle b/theodolite-benchmarks/uc2-workload-generator/build.gradle
index f2c3e5d2e..498e05fc8 100644
--- a/theodolite-benchmarks/uc2-workload-generator/build.gradle
+++ b/theodolite-benchmarks/uc2-workload-generator/build.gradle
@@ -1 +1,5 @@
+plugins {
+  id 'theodolite.java-uc'
+}
+
 mainClassName = "theodolite.uc2.workloadgenerator.LoadGenerator"
diff --git a/theodolite-benchmarks/uc3-application-flink/build.gradle b/theodolite-benchmarks/uc3-application-flink/build.gradle
index d50fa8efe..a1ed6ba07 100644
--- a/theodolite-benchmarks/uc3-application-flink/build.gradle
+++ b/theodolite-benchmarks/uc3-application-flink/build.gradle
@@ -1,3 +1,7 @@
+plugins {
+  id 'theodolite.java-uc'
+}
+
 allprojects {
 	repositories {
     	maven {
diff --git a/theodolite-benchmarks/uc3-application/build.gradle b/theodolite-benchmarks/uc3-application/build.gradle
index aa96b6dbf..ee4917278 100644
--- a/theodolite-benchmarks/uc3-application/build.gradle
+++ b/theodolite-benchmarks/uc3-application/build.gradle
@@ -1 +1,5 @@
+plugins {
+  id 'theodolite.java-uc'
+}
+
 mainClassName = "theodolite.uc3.application.HistoryService"
diff --git a/theodolite-benchmarks/uc3-workload-generator/build.gradle b/theodolite-benchmarks/uc3-workload-generator/build.gradle
index c3ca94290..22103aaf2 100644
--- a/theodolite-benchmarks/uc3-workload-generator/build.gradle
+++ b/theodolite-benchmarks/uc3-workload-generator/build.gradle
@@ -1 +1,5 @@
+plugins {
+  id 'theodolite.java-uc'
+}
+
 mainClassName = "theodolite.uc3.workloadgenerator.LoadGenerator"
diff --git a/theodolite-benchmarks/uc4-application-flink/build.gradle b/theodolite-benchmarks/uc4-application-flink/build.gradle
index 0ad804c62..9ef66cb39 100644
--- a/theodolite-benchmarks/uc4-application-flink/build.gradle
+++ b/theodolite-benchmarks/uc4-application-flink/build.gradle
@@ -1 +1,5 @@
+plugins {
+  id 'theodolite.java-uc'
+}
+
 mainClassName = "theodolite.uc4.application.AggregationServiceFlinkJob"
diff --git a/theodolite-benchmarks/uc4-application/build.gradle b/theodolite-benchmarks/uc4-application/build.gradle
index 9cb1b311d..061650e31 100644
--- a/theodolite-benchmarks/uc4-application/build.gradle
+++ b/theodolite-benchmarks/uc4-application/build.gradle
@@ -1 +1,5 @@
+plugins {
+  id 'theodolite.java-uc'
+}
+
 mainClassName = "theodolite.uc4.application.AggregationService"
diff --git a/theodolite-benchmarks/uc4-workload-generator/build.gradle b/theodolite-benchmarks/uc4-workload-generator/build.gradle
index 8865ec939..5d419e67c 100644
--- a/theodolite-benchmarks/uc4-workload-generator/build.gradle
+++ b/theodolite-benchmarks/uc4-workload-generator/build.gradle
@@ -1 +1,5 @@
+plugins {
+  id 'theodolite.java-uc'
+}
+
 mainClassName = "theodolite.uc4.workloadgenerator.LoadGenerator"
diff --git a/theodolite-benchmarks/workload-generator-commons/build.gradle b/theodolite-benchmarks/workload-generator-commons/build.gradle
index c42fff041..06dd5b2b8 100644
--- a/theodolite-benchmarks/workload-generator-commons/build.gradle
+++ b/theodolite-benchmarks/workload-generator-commons/build.gradle
@@ -1,3 +1,7 @@
+plugins {
+    id 'theodolite.java-commons'
+}
+
 dependencies {
   implementation 'com.google.guava:guava:30.1-jre'
   implementation 'com.hazelcast:hazelcast:4.1.1'
@@ -6,7 +10,7 @@ dependencies {
   implementation('org.industrial-devops:titan-ccp-common:0.1.0-SNAPSHOT') { changing = true }
   implementation('org.industrial-devops:titan-ccp-common-kafka:0.1.0-SNAPSHOT') { changing = true }
   implementation 'org.apache.kafka:kafka-streams:2.6.0' // TODO required?
-  
+
   // Use JUnit test framework
   testImplementation 'junit:junit:4.12'
-}
\ No newline at end of file
+}
-- 
GitLab