diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 75731e4..e555e6d 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -17,6 +17,10 @@ gradlePlugin { id = 'GroowtAntlrPlugin' implementationClass = 'groowt.gradle.antlr.GroowtAntlrPlugin' } + create('groowtLogging') { + id = 'groowt-logging' + implementationClass = 'groowt.gradle.logging.GroowtLoggingPlugin' + } } } diff --git a/buildSrc/src/main/groovy/groowt/gradle/GroowtConventions.gradle b/buildSrc/src/main/groovy/groowt/gradle/GroowtConventions.gradle index 8df6dc1..cc53739 100644 --- a/buildSrc/src/main/groovy/groowt/gradle/GroowtConventions.gradle +++ b/buildSrc/src/main/groovy/groowt/gradle/GroowtConventions.gradle @@ -1,3 +1,4 @@ +//file:noinspection GrPackage plugins { id 'java' } @@ -8,7 +9,6 @@ repositories { dependencies { testImplementation libs.junit.jupiter.api - testRuntimeOnly libs.log4j.slf4jBinding } java { @@ -17,8 +17,6 @@ java { } } -// TODO: hook into testResources and add a default log4j2.xml config for testing - testing { suites { test { diff --git a/buildSrc/src/main/groovy/groowt/gradle/logging/GroowtCopyLoggerConfigTask.groovy b/buildSrc/src/main/groovy/groowt/gradle/logging/GroowtCopyLoggerConfigTask.groovy new file mode 100644 index 0000000..ca1c20f --- /dev/null +++ b/buildSrc/src/main/groovy/groowt/gradle/logging/GroowtCopyLoggerConfigTask.groovy @@ -0,0 +1,5 @@ +package groowt.gradle.logging + +import org.gradle.api.tasks.Copy + +class GroowtCopyLoggerConfigTask extends Copy {} diff --git a/buildSrc/src/main/groovy/groowt/gradle/logging/GroowtLoggingPlugin.groovy b/buildSrc/src/main/groovy/groowt/gradle/logging/GroowtLoggingPlugin.groovy new file mode 100644 index 0000000..cffc787 --- /dev/null +++ b/buildSrc/src/main/groovy/groowt/gradle/logging/GroowtLoggingPlugin.groovy @@ -0,0 +1,54 @@ +package groowt.gradle.logging + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.api.plugins.JavaPluginExtension + +class GroowtLoggingPlugin implements Plugin { + + @Override + void apply(Project project) { + def javaExtension = project.extensions.getByType(JavaPluginExtension) + + def defaultLog4j2XmlResource = this.class.getResource('default-log4j2.xml') + if (defaultLog4j2XmlResource == null) { + throw new RuntimeException('default-log4j2.xml is null') + } + + def tmpLog4j2Xml = File.createTempFile('default-log4j2-xml', 'tmp') + defaultLog4j2XmlResource.withReader { reader -> + tmpLog4j2Xml.withWriter { + reader.transferTo(it) + } + } + + javaExtension.sourceSets.each { sourceSet -> + project.tasks.register( + sourceSet.getTaskName('copy', 'LoggingConfig'), + GroowtCopyLoggerConfigTask + ) { task -> + task.from(tmpLog4j2Xml) + task.rename { 'log4j2.xml' } + task.into(['src', sourceSet.name, 'resources'].join(File.separator)) + } + } + + def libs = project.extensions.getByType(VersionCatalogsExtension).named('libs') + + project.dependencies.addProvider( + 'implementation', libs.findLibrary('slf4j-api').orElseThrow() + ) + project.dependencies.addProvider( + 'runtimeOnly', libs.findLibrary('log4j-core').orElseThrow() + ) + project.dependencies.addProvider( + 'runtimeOnly', libs.findLibrary('log4j-slf4jBinding').orElseThrow() + ) + + project.tasks.named('build') { + it.dependsOn project.tasks.withType(GroowtCopyLoggerConfigTask) + } + } + +} diff --git a/buildSrc/src/main/resources/groowt/gradle/logging/default-log4j2.xml b/buildSrc/src/main/resources/groowt/gradle/logging/default-log4j2.xml new file mode 100644 index 0000000..5081d05 --- /dev/null +++ b/buildSrc/src/main/resources/groowt/gradle/logging/default-log4j2.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/cli/build.gradle b/cli/build.gradle index 7069d19..abcbba3 100644 --- a/cli/build.gradle +++ b/cli/build.gradle @@ -1,5 +1,6 @@ plugins { id 'GroowtConventions' + id 'groowt-logging' id 'com.jessebrault.jbarchiva' version '0.1.0' id 'maven-publish' } @@ -14,7 +15,15 @@ repositories { } dependencies { - implementation libs.gradle.tooling, libs.picocli, project(':groowt-gradle-model') + [ + libs.gradle.tooling, + libs.picocli, + libs.slf4j.api, + libs.log4j.core, + project(':groowt-gradle-model') + ].each { implementation it } + + runtimeOnly libs.log4j.slf4jBinding } tasks.named('jar', Jar) { diff --git a/cli/src/main/java/groowt/cli/FileAndPathUtil.java b/cli/src/main/java/groowt/cli/FileAndPathUtil.java new file mode 100644 index 0000000..c70ba17 --- /dev/null +++ b/cli/src/main/java/groowt/cli/FileAndPathUtil.java @@ -0,0 +1,17 @@ +package groowt.cli; + +import java.io.File; + +public final class FileAndPathUtil { + + public static File packageNameToFile(String packageName) { + return new File(packageName.replace(".", File.separator)); + } + + public static File resolve(File from, File to) { + return from.toPath().resolve(to.toPath()).toFile(); + } + + private FileAndPathUtil() {} + +} diff --git a/cli/src/main/java/groowt/cli/Generate.java b/cli/src/main/java/groowt/cli/Generate.java index 63a834b..cc2cd7f 100644 --- a/cli/src/main/java/groowt/cli/Generate.java +++ b/cli/src/main/java/groowt/cli/Generate.java @@ -1,6 +1,5 @@ package groowt.cli; -import groowt.gradle.model.GroowtGradleModel; import picocli.CommandLine; import picocli.CommandLine.Command; @@ -39,13 +38,13 @@ public class Generate implements Callable { @Override public Integer call() { if (this.componentName != null) { - GradleUtil.doWith(this.cli.getProjectDir(), project -> { - final var model = project.getModel(GroowtGradleModel.class); - if (sourceDir == null) { + GradleUtil.doWithGroowtGradleModel(this.cli.getProjectDir(), model -> { + if (this.sourceDir == null) { this.sourceDir = new File(String.join(File.separator, "src", this.sourceSet, "groovy")); } - final File packageDir = new File( - this.sourceDir, model.getBasePackage().replace(".", File.separator) + final File packageDir = FileAndPathUtil.resolve( + this.sourceDir, + FileAndPathUtil.packageNameToFile(model.getBasePackage()) ); packageDir.mkdirs(); final File componentFile = new File(packageDir, this.componentName + ".txt"); diff --git a/cli/src/main/java/groowt/cli/GradleUtil.java b/cli/src/main/java/groowt/cli/GradleUtil.java index e1dba19..6207aef 100644 --- a/cli/src/main/java/groowt/cli/GradleUtil.java +++ b/cli/src/main/java/groowt/cli/GradleUtil.java @@ -1,5 +1,6 @@ package groowt.cli; +import groowt.gradle.model.GroowtGradleModel; import org.gradle.tooling.GradleConnector; import org.gradle.tooling.ProjectConnection; @@ -8,13 +9,24 @@ import java.util.function.Consumer; public final class GradleUtil { - public static void doWith(File projectDir, Consumer action) { + public static void doWith(File projectDir, Consumer action) { final var gradleConnector = GradleConnector.newConnector().forProjectDirectory(projectDir); try (final var projectConnection = gradleConnector.connect()) { action.accept(projectConnection); } } + public static void doWith(File projectDir, Class modelClass, Consumer modelConsumer) { + doWith(projectDir, projectConnection -> { + final T model = projectConnection.getModel(modelClass); + modelConsumer.accept(model); + }); + } + + public static void doWithGroowtGradleModel(File projectDir, Consumer modelConsumer) { + doWith(projectDir, GroowtGradleModel.class, modelConsumer); + } + private GradleUtil() {} } diff --git a/cli/src/main/java/groowt/cli/GroowtCli.java b/cli/src/main/java/groowt/cli/GroowtCli.java index 7e372d4..8353a92 100644 --- a/cli/src/main/java/groowt/cli/GroowtCli.java +++ b/cli/src/main/java/groowt/cli/GroowtCli.java @@ -1,5 +1,7 @@ package groowt.cli; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import picocli.CommandLine; import java.io.File; @@ -13,6 +15,8 @@ import java.io.File; ) public class GroowtCli { + private static final Logger logger = LoggerFactory.getLogger(GroowtCli.class); + @CommandLine.Option( names = { "-v", "--verbose" }, description = "Log verbosely to standard out." @@ -27,7 +31,7 @@ public class GroowtCli { private File projectDir; public static void main(String[] args) { - System.out.println("Hello from Groowt!"); + logger.info("Hello from Groowt! Version 0.1.0"); System.exit(new CommandLine(new GroowtCli()).execute(args)); } diff --git a/groowt-gradle/build.gradle b/groowt-gradle/build.gradle index 30079b2..5feb368 100644 --- a/groowt-gradle/build.gradle +++ b/groowt-gradle/build.gradle @@ -10,13 +10,13 @@ version = '0.1.0' repositories { mavenCentral() - maven { - url 'https://repo.gradle.org/gradle/libs-releases' - } +// maven { +// url 'https://repo.gradle.org/gradle/libs-releases' +// } } dependencies { - implementation libs.groovy, libs.gradle.tooling, project(':groowt-gradle-model') + implementation libs.groovy, project(':groowt-gradle-model') } gradlePlugin { @@ -34,6 +34,5 @@ publishing { artifactId = 'groowt-gradle' from components.java } - } }