diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index 94c08ea..2b0ba38 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -4,36 +4,29 @@ on: [ push, pull_request, workflow_dispatch ] jobs: build-bld-project: + runs-on: ubuntu-latest + strategy: matrix: - java-version: [ 17, 21, 24 ] - kotlin-version: [ 1.9.25, 2.0.21, 2.1.20 ] - os: [ ubuntu-latest, windows-latest, macos-latest ] - - runs-on: ${{ matrix.os }} + java-version: [ 17, 20 ] steps: - name: Checkout source repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 with: fetch-depth: 0 - name: Set up JDK ${{ matrix.java-version }} - uses: actions/setup-java@v4 + uses: actions/setup-java@v3 with: - distribution: "zulu" + distribution: 'zulu' java-version: ${{ matrix.java-version }} - - name: Download dependencies [examples] - working-directory: examples + - name: Grant execute permission for bld + run: chmod +x bld + + - name: Download the dependencies run: ./bld download - - name: Compile and run [examples] - working-directory: examples - run: ./bld compile run - - - name: Download dependencies - run: ./bld download - - - name: Run tests - run: ./bld compile test \ No newline at end of file + - name: Run tests with bld + run: ./bld compile test diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 508f6a5..f6122cd 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -30,14 +30,14 @@ jobs: steps: - name: Checkout source repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 with: fetch-depth: 0 - name: Set up JDK 17 - uses: actions/setup-java@v4 + uses: actions/setup-java@v3 with: - distribution: "zulu" + distribution: 'zulu' java-version: 17 - name: Build Javadocs @@ -47,11 +47,11 @@ jobs: uses: actions/configure-pages@v3 - name: Upload artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v1 with: # Upload generated Javadocs repository - path: "build/javadoc/" + path: 'build/javadoc/' - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v1 \ No newline at end of file diff --git a/.idea/bld.xml b/.idea/bld.xml deleted file mode 100644 index 6600cee..0000000 --- a/.idea/bld.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/copyright/Apache_License.xml b/.idea/copyright/Apache_License.xml index 4446c15..15687f4 100644 --- a/.idea/copyright/Apache_License.xml +++ b/.idea/copyright/Apache_License.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.idea/icon.svg b/.idea/icon.svg deleted file mode 100644 index 81220b4..0000000 --- a/.idea/icon.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/.idea/intellij-javadocs-4.0.1.xml b/.idea/intellij-javadocs-4.0.1.xml deleted file mode 100644 index 90d3347..0000000 --- a/.idea/intellij-javadocs-4.0.1.xml +++ /dev/null @@ -1,204 +0,0 @@ - - - - - UPDATE - false - true - - FIELD - METHOD - TYPE - - - PUBLIC - PROTECTED - DEFAULT - - - - - - ^.*(public|protected|private)*.+interface\s+\w+.* - /**\n - * The interface ${name}.\n -<#if element.typeParameters?has_content> * \n -</#if> -<#list element.typeParameters as typeParameter> - * @param <${typeParameter.name}> the type parameter\n -</#list> - */ - - - ^.*(public|protected|private)*.+enum\s+\w+.* - /**\n - * The enum ${name}.\n - */ - - - ^.*(public|protected|private)*.+class\s+\w+.* - /**\n - * The type ${name}.\n -<#if element.typeParameters?has_content> * \n -</#if> -<#list element.typeParameters as typeParameter> - * @param <${typeParameter.name}> the type parameter\n -</#list> - */ - - - .+ - /**\n - * The type ${name}.\n - */ - - - - - .+ - /**\n - * Instantiates a new ${name}.\n -<#if element.parameterList.parameters?has_content> - *\n -</#if> -<#list element.parameterList.parameters as parameter> - * @param ${parameter.name} the ${paramNames[parameter.name]}\n -</#list> -<#if element.throwsList.referenceElements?has_content> - *\n -</#if> -<#list element.throwsList.referenceElements as exception> - * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n -</#list> - */ - - - - - ^.*(public|protected|private)*\s*.*(\w(\s*<.+>)*)+\s+get\w+\s*\(.*\).+ - /**\n - * Gets ${partName}.\n -<#if element.typeParameters?has_content> * \n -</#if> -<#list element.typeParameters as typeParameter> - * @param <${typeParameter.name}> the type parameter\n -</#list> -<#if element.parameterList.parameters?has_content> - *\n -</#if> -<#list element.parameterList.parameters as parameter> - * @param ${parameter.name} the ${paramNames[parameter.name]}\n -</#list> -<#if isNotVoid> - *\n - * @return the ${partName}\n -</#if> -<#if element.throwsList.referenceElements?has_content> - *\n -</#if> -<#list element.throwsList.referenceElements as exception> - * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n -</#list> - */ - - - ^.*(public|protected|private)*\s*.*(void|\w(\s*<.+>)*)+\s+set\w+\s*\(.*\).+ - /**\n - * Sets ${partName}.\n -<#if element.typeParameters?has_content> * \n -</#if> -<#list element.typeParameters as typeParameter> - * @param <${typeParameter.name}> the type parameter\n -</#list> -<#if element.parameterList.parameters?has_content> - *\n -</#if> -<#list element.parameterList.parameters as parameter> - * @param ${parameter.name} the ${paramNames[parameter.name]}\n -</#list> -<#if isNotVoid> - *\n - * @return the ${partName}\n -</#if> -<#if element.throwsList.referenceElements?has_content> - *\n -</#if> -<#list element.throwsList.referenceElements as exception> - * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n -</#list> - */ - - - ^.*((public\s+static)|(static\s+public))\s+void\s+main\s*\(\s*String\s*(\[\s*\]|\.\.\.)\s+\w+\s*\).+ - /**\n - * The entry point of application.\n - - <#if element.parameterList.parameters?has_content> - *\n -</#if> - * @param ${element.parameterList.parameters[0].name} the input arguments\n -<#if element.throwsList.referenceElements?has_content> - *\n -</#if> -<#list element.throwsList.referenceElements as exception> - * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n -</#list> - */ - - - .+ - /**\n - * ${name}<#if isNotVoid> ${return}</#if>.\n -<#if element.typeParameters?has_content> * \n -</#if> -<#list element.typeParameters as typeParameter> - * @param <${typeParameter.name}> the type parameter\n -</#list> -<#if element.parameterList.parameters?has_content> - *\n -</#if> -<#list element.parameterList.parameters as parameter> - * @param ${parameter.name} the ${paramNames[parameter.name]}\n -</#list> -<#if isNotVoid> - *\n - * @return the ${return}\n -</#if> -<#if element.throwsList.referenceElements?has_content> - *\n -</#if> -<#list element.throwsList.referenceElements as exception> - * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n -</#list> - */ - - - - - ^.*(public|protected|private)*.+static.*(\w\s\w)+.+ - /**\n - * The constant ${element.getName()}.\n - */ - - - ^.*(public|protected|private)*.*(\w\s\w)+.+ - /**\n - <#if element.parent.isInterface()> - * The constant ${element.getName()}.\n -<#else> - * The ${name}.\n -</#if> */ - - - .+ - /**\n - <#if element.parent.isEnum()> - *${name} ${typeName}.\n -<#else> - * The ${name}.\n -</#if>*/ - - - - - \ No newline at end of file diff --git a/.idea/libraries/bld.xml b/.idea/libraries/bld.xml index 153a060..cf75013 100644 --- a/.idea/libraries/bld.xml +++ b/.idea/libraries/bld.xml @@ -2,12 +2,11 @@ - + - - + @@ -15,4 +14,4 @@ - + \ No newline at end of file diff --git a/.idea/libraries/compile.xml b/.idea/libraries/compile.xml index 99cc0c0..9bd86aa 100644 --- a/.idea/libraries/compile.xml +++ b/.idea/libraries/compile.xml @@ -7,7 +7,7 @@ - - + + \ No newline at end of file diff --git a/.idea/libraries/runtime.xml b/.idea/libraries/runtime.xml index d4069f2..2ae5c4b 100644 --- a/.idea/libraries/runtime.xml +++ b/.idea/libraries/runtime.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/.idea/libraries/test.xml b/.idea/libraries/test.xml index 57ed5ef..b80486a 100644 --- a/.idea/libraries/test.xml +++ b/.idea/libraries/test.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index d85343f..cf5fb1d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - @@ -9,18 +8,11 @@ - + \ No newline at end of file diff --git a/examples/.idea/libraries/compile.xml b/examples/.idea/libraries/compile.xml index 99cc0c0..9bd86aa 100644 --- a/examples/.idea/libraries/compile.xml +++ b/examples/.idea/libraries/compile.xml @@ -7,7 +7,7 @@ - - + + \ No newline at end of file diff --git a/examples/.idea/libraries/runtime.xml b/examples/.idea/libraries/runtime.xml index d4069f2..2ae5c4b 100644 --- a/examples/.idea/libraries/runtime.xml +++ b/examples/.idea/libraries/runtime.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/examples/.idea/libraries/test.xml b/examples/.idea/libraries/test.xml index 57ed5ef..b80486a 100644 --- a/examples/.idea/libraries/test.xml +++ b/examples/.idea/libraries/test.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/examples/.vscode/launch.json b/examples/.vscode/launch.json index 0368ce2..dc9c983 100644 --- a/examples/.vscode/launch.json +++ b/examples/.vscode/launch.json @@ -6,6 +6,19 @@ "name": "Run Main", "request": "launch", "mainClass": "com.example.SampleMain" + }, + { + "type": "java", + "name": "Run Tests", + "request": "launch", + "mainClass": "org.junit.platform.console.ConsoleLauncher", + "args": [ + "--details=verbose", + "--scan-classpath", + "--disable-banner", + "--disable-ansi-colors", + "--exclude-engine=junit-platform-suite", + "--exclude-engine=junit-vintage"] } ] } diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index ba429d0..5ae2eaa 100644 --- a/examples/.vscode/settings.json +++ b/examples/.vscode/settings.json @@ -3,13 +3,13 @@ "src/main/java", "src/main/resources", "src/test/java", - "src/test/resources", - "src/bld/java", - "src/bld/resources" + "src/bld/java" ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-2.2.1.jar", - "lib/**/*.jar" + "${HOME}bld-1.7.0.jar", + "lib/compile/*.jar", + "lib/runtime/*.jar", + "lib/test/*.jar" ] } diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index ede07c3..0000000 --- a/examples/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Compile and Run Example - -```console -./bld compile run -``` diff --git a/examples/lib/bld/bld-wrapper.jar b/examples/lib/bld/bld-wrapper.jar index 3842a62..9b4ee52 100644 Binary files a/examples/lib/bld/bld-wrapper.jar and b/examples/lib/bld/bld-wrapper.jar differ diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index bc257d2..19f286f 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,6 +1,6 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true -bld.downloadLocation= -bld.extension-gv=com.uwyn.rife2:bld-generated-version:1.0.1 +bld.extensions=com.uwyn.rife2:bld-generated-version:0.9.2 bld.repositories=MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES -bld.version=2.2.1 +bld.downloadLocation= +bld.version=1.7.5 diff --git a/examples/my_app_version.txt b/examples/my_app_version.txt deleted file mode 100644 index 3d4c223..0000000 --- a/examples/my_app_version.txt +++ /dev/null @@ -1,30 +0,0 @@ -package {{v packageName/}}; - -import java.util.Date; - -public final class {{v className/}} implements Comparable<{{v className/}}> { - public static final String PROJECT = "{{v project/}}"; - public static final Date BUILD_DATE = new Date({{v epoch/}}L); - public static final int MAJOR = {{v major/}}; - public static final int MINOR = {{v minor/}}; - public static final int REVISION = {{v revision/}}; - public static final String QUALIFIER = "{{v qualifier/}}"; - public static final String VERSION = "{{v version/}}"; - - private {{v className/}}() { - // no-op - } - - @Override - public int compareTo({{v className/}} other) { - if (MAJOR != other.MAJOR) { - return Integer.compare(MAJOR, other.MAJOR); - } else if (MINOR != other.MINOR) { - return Integer.compare(MINOR, other.MINOR); - } else if (REVISION != other.REVISION) { - return Integer.compare(REVISION, other.REVISION); - } else { - return QUALIFIER.compareTo(other.QUALIFIER); - } - } -} \ No newline at end of file diff --git a/examples/version.txt b/examples/myversion.txt similarity index 100% rename from examples/version.txt rename to examples/myversion.txt diff --git a/examples/src/bld/java/com/example/SampleBuild.java b/examples/src/bld/java/com/example/SampleBuild.java index c9303a6..f3fae67 100644 --- a/examples/src/bld/java/com/example/SampleBuild.java +++ b/examples/src/bld/java/com/example/SampleBuild.java @@ -4,6 +4,7 @@ import rife.bld.BuildCommand; import rife.bld.Project; import rife.bld.extension.GeneratedVersionOperation; +import java.io.File; import java.util.List; import static rife.bld.dependencies.Repository.MAVEN_CENTRAL; @@ -12,6 +13,10 @@ import static rife.bld.dependencies.Scope.test; /** * Example build. + * + *
    + *
  • ./bld compile run
  • + *
*/ public class SampleBuild extends Project { public SampleBuild() { @@ -20,15 +25,11 @@ public class SampleBuild extends Project { mainClass = "com.example.SampleMain"; version = version(1, 0, 1, "rc1"); - javaRelease = 17; - - autoDownloadPurge = true; downloadSources = true; - repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES); scope(test) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 0))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 0))); } public static void main(String[] args) { @@ -46,8 +47,7 @@ public class SampleBuild extends Project { new GeneratedVersionOperation() .fromProject(this) // .projectName("My App") -// .classTemplate("my_app_version.txt") -// .classTemplate("version.txt") +// .classTemplate(new File(workDirectory, "myversion.txt")) .execute(); } -} +} \ No newline at end of file diff --git a/examples/src/main/java/com/example/GeneratedVersion.java b/examples/src/main/java/com/example/GeneratedVersion.java index 64ecb97..35c8d67 100644 --- a/examples/src/main/java/com/example/GeneratedVersion.java +++ b/examples/src/main/java/com/example/GeneratedVersion.java @@ -1,4 +1,4 @@ -/** +/* * This file is automatically generated. * Do not modify! -- ALL CHANGES WILL BE ERASED! */ @@ -12,7 +12,7 @@ import java.util.Date; */ public final class GeneratedVersion { public static final String PROJECT = "Sample"; - public static final Date BUILD_DATE = new Date(1736843939053L); + public static final Date BUILD_DATE = new Date(1698009833587L); public static final int MAJOR = 1; public static final int MINOR = 0; public static final int REVISION = 1; diff --git a/lib/bld/bld-wrapper.jar b/lib/bld/bld-wrapper.jar index e26a2ae..9b4ee52 100644 Binary files a/lib/bld/bld-wrapper.jar and b/lib/bld/bld-wrapper.jar differ diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 42fad1d..46c4a1d 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -1,6 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true +bld.extension-pmd=com.uwyn.rife2:bld-pmd:0.9.3 +bld.extension-jacoco=com.uwyn.rife2:bld-jacoco-report:0.9.1 +bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.downloadLocation= -bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.2.2 -bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES -bld.version=2.2.1 +bld.version=1.7.5 diff --git a/src/bld/java/rife/bld/extension/GeneratedVersionOperationBuild.java b/src/bld/java/rife/bld/extension/GeneratedVersionOperationBuild.java index d355d07..e48ec08 100644 --- a/src/bld/java/rife/bld/extension/GeneratedVersionOperationBuild.java +++ b/src/bld/java/rife/bld/extension/GeneratedVersionOperationBuild.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import rife.bld.publish.PublishDeveloper; import rife.bld.publish.PublishLicense; import rife.bld.publish.PublishScm; +import java.io.IOException; import java.util.List; import static rife.bld.dependencies.Repository.*; @@ -34,28 +35,25 @@ public class GeneratedVersionOperationBuild extends Project { public GeneratedVersionOperationBuild() { pkg = "rife.bld.extension"; name = "GeneratedVersionOperation"; - version = version(1, 0, 1); + version = version(0, 9, 2); javaRelease = 17; - downloadSources = true; autoDownloadPurge = true; - - repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS); + repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES); scope(compile) - .include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1))); + .include(dependency("com.uwyn.rife2", "bld", version(1, 7, 5))); scope(test) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1))) - .include(dependency("org.assertj", "assertj-core", version(3, 27, 3))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 0))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 0))) + .include(dependency("org.assertj", "assertj-core", version(3, 24, 2))); precompileOperation() .templateTypes(TXT); javadocOperation() .javadocOptions() - .author() .docLint(NO_MISSING) .link("https://rife2.github.io/bld/") .link("https://rife2.github.io/rife2/") @@ -63,27 +61,18 @@ public class GeneratedVersionOperationBuild extends Project { publishOperation() .repositories(version.isSnapshot() ? repository("rife2-snapshot") : repository("rife2")) - .repository(repository("github")) .info() .groupId("com.uwyn.rife2") .artifactId("bld-generated-version") .description("bld Extension to Generate Project Version Data") .url("https://github.com/rife2/generated-version") - .developer(new PublishDeveloper() - .id("ethauvin") - .name("Erik C. Thauvin") - .email("erik@thauvin.net") - .url("https://erik.thauvin.net/") - ) - .license(new PublishLicense() - .name("The Apache License, Version 2.0") - .url("https://www.apache.org/licenses/LICENSE-2.0.txt") - ) - .scm(new PublishScm() - .connection("scm:git:https://github.com/rife2/generated-version.git") + .developer(new PublishDeveloper().id("ethauvin").name("Erik C. Thauvin").email("erik@thauvin.net") + .url("https://erik.thauvin.net/")) + .license(new PublishLicense().name("The Apache License, Version 2.0") + .url("http://www.apache.org/licenses/LICENSE-2.0.txt")) + .scm(new PublishScm().connection("scm:git:https://github.com/rife2/generated-version.git") .developerConnection("scm:git:git@github.com:rife2/generated-version.git") - .url("https://github.com/rife2/generated-version") - ) + .url("https://github.com/rife2/generated-version")) .signKey(property("sign.key")) .signPassphrase(property("sign.passphrase")); } @@ -92,6 +81,13 @@ public class GeneratedVersionOperationBuild extends Project { new GeneratedVersionOperationBuild().start(args); } + @BuildCommand(summary = "Generates JaCoCo Reports") + public void jacoco() throws IOException { + new JacocoReportOperation() + .fromProject(this) + .execute(); + } + @BuildCommand(summary = "Runs PMD analysis") public void pmd() throws Exception { new PmdOperation() diff --git a/src/main/java/rife/bld/extension/GeneratedVersion.java b/src/main/java/rife/bld/extension/GeneratedVersion.java index 9ae40fb..8da66e3 100644 --- a/src/main/java/rife/bld/extension/GeneratedVersion.java +++ b/src/main/java/rife/bld/extension/GeneratedVersion.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,16 +17,8 @@ package rife.bld.extension; import rife.bld.BaseProject; -import rife.resources.ResourceFinderClasspath; -import rife.resources.ResourceFinderDirectories; -import rife.resources.ResourceFinderGroup; -import rife.template.Template; -import rife.template.TemplateFactory; -import rife.tools.FileUtils; import java.io.File; -import java.io.IOException; -import java.nio.file.Path; /** * GeneratedVersion data class. @@ -34,251 +26,96 @@ import java.nio.file.Path; * @author Erik C. Thauvin * @since 1.0 */ +@SuppressWarnings("PMD.DataClass") public class GeneratedVersion { - private static final String CLASSNAME = "className"; - private static final String EPOCH = "epoch"; - private static final String MAJOR = "major"; - private static final String MINOR = "minor"; - private static final String PACKAGE_NAME = "packageName"; - private static final String PROJECT = "project"; - private static final String QUALIFIER = "qualifier"; - private static final String REVISION = "revision"; - private static final String VERSION = "version"; - private File classFile_; - private String className_ = "GeneratedVersion"; - private File directory_; - private String extension_ = ".java"; - private String packageName_; - private String projectName_; - private BaseProject project_; - private File template_; - - /** - * Builds the template based on the {@link GeneratedVersion} data. - * - * @return the template - */ - public Template buildTemplate() { - Template template; - var version = project_.version(); - TemplateFactory.TXT.resetClassLoader(); - if (template_ == null) { - var group = new ResourceFinderGroup().add(ResourceFinderClasspath.instance()); - template = TemplateFactory.TXT.setResourceFinder(group).get("default_generated_version"); - } else { - File parent; - if (template_.getParentFile() != null) { - parent = template_.getParentFile(); - } else { - parent = new File(template_.getAbsolutePath()).getParentFile(); - } - var group = new ResourceFinderGroup().add(new ResourceFinderDirectories(parent)); - template = TemplateFactory.TXT.setResourceFinder(group).get(template_.getName()); - } - - if (packageName_ == null) { - packageName_ = project_.pkg(); - } - - if (template.hasValueId(PACKAGE_NAME)) { - template.setValue(PACKAGE_NAME, packageName_); - } - - if (template.hasValueId(CLASSNAME)) { - template.setValue(CLASSNAME, className_); - } - - if (template.hasValueId(PROJECT)) { - if (projectName_ == null) { - projectName_ = project_.name(); - } - template.setValue(PROJECT, projectName_); - } - - if (template.hasValueId(EPOCH)) { - template.setValue(EPOCH, System.currentTimeMillis()); - } - - if (template.hasValueId(VERSION)) { - template.setValue(VERSION, version.toString()); - } - - if (template.hasValueId(MAJOR)) { - template.setValue(MAJOR, version.majorInt()); - } - - if (template.hasValueId(MINOR)) { - template.setValue(MINOR, version.minorInt()); - } - - if (template.hasValueId(REVISION)) { - template.setValue(REVISION, version.revisionInt()); - } - - if (template.hasValueId(QUALIFIER)) { - template.setValue(QUALIFIER, version.qualifier()); - } - - return template; - } + private File classFile; + private String className; + private String packageName; + private BaseProject project; + private String projectName; + private File template; /** * Returns the class file. - * - * @return the class file */ public File getClassFile() { - return classFile_; + return classFile; + } + + /** + * Sets the class file. + */ + public void setClassFile(File classFile) { + this.classFile = classFile; } /** * Returns the class name. - * - * @return the class name */ public String getClassName() { - return className_; - } - - /** - * Returns the destination directory. - * - * @return the destination directory - */ - public File getDirectory() { - return directory_; - } - - /** - * Returns the file extension. - * - * @return the file extension - */ - public String getExtension() { - return extension_; - } - - /** - * Returns the package name. - * - * @return the package name - */ - public String getPackageName() { - return packageName_; - } - - /** - * Returns the project. - * - * @return the project - */ - public BaseProject getProject() { - return project_; - } - - /** - * Returns the project name. - * - * @return the project name - */ - public String getProjectName() { - return projectName_; - } - - /** - * Returns the template. - * - * @return the template - */ - public File getTemplate() { - return template_; + return className; } /** * Sets the class name. - * - * @param className the class name */ public void setClassName(String className) { - this.className_ = className; + this.className = className; } /** - * Set the destination directory. - * - * @param directory the destination directory + * Returns the package name. */ - public void setDirectory(File directory) { - this.directory_ = directory; - } - - /** - * Sets the file extension. (Default is: {@code .java}) - * - * @param extension the file extension - */ - public void setExtension(String extension) { - this.extension_ = extension; + public String getPackageName() { + return packageName; } /** * Sets the package name. - * - * @param packageName the package name */ public void setPackageName(String packageName) { - this.packageName_ = packageName; + this.packageName = packageName; + } + + /** + * Returns the project. + */ + public BaseProject getProject() { + return project; } /** * Sets the project. - * - * @param project the project */ public void setProject(BaseProject project) { - this.project_ = project; + this.project = project; + } + + /** + * Returns the project name. + */ + public String getProjectName() { + return projectName; } /** * Sets the project name. - * - * @param projectName the project name */ public void setProjectName(String projectName) { - this.projectName_ = projectName; + this.projectName = projectName; + } + + /** + * Returns the template. + */ + public File getTemplate() { + return template; } /** * Sets the template file. - * - * @param template the template */ public void setTemplate(File template) { - this.template_ = template; - } - - /** - * Writes the project version class in the given directory. - */ - public void writeTemplate(Template template) throws IOException { - if (packageName_ != null) { - classFile_ = Path.of(directory_.getAbsolutePath(), packageName_.replace(".", File.separator), - className_ + extension_).toFile(); - } else { - classFile_ = new File(directory_, className_ + ".java"); - } - - if (!classFile_.getParentFile().exists()) { - var dirs = classFile_.getParentFile().mkdirs(); - if (!dirs && !classFile_.getParentFile().exists()) { - throw new IOException("Could not create project package directories: " + classFile_.getParent()); - } - } - - try { - FileUtils.writeString(template.getContent(), classFile_); - } catch (IOException e) { - throw new IOException("Unable to write the version class file: " + e.getMessage(), e); - } + this.template = template; } } diff --git a/src/main/java/rife/bld/extension/GeneratedVersionOperation.java b/src/main/java/rife/bld/extension/GeneratedVersionOperation.java index 6a5e065..c528f1a 100644 --- a/src/main/java/rife/bld/extension/GeneratedVersionOperation.java +++ b/src/main/java/rife/bld/extension/GeneratedVersionOperation.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,10 +19,16 @@ package rife.bld.extension; import rife.bld.BaseProject; import rife.bld.operations.AbstractOperation; -import rife.bld.operations.exceptions.ExitStatusException; +import rife.resources.ResourceFinderDirectories; +import rife.template.Template; +import rife.template.TemplateConfig; +import rife.template.TemplateFactory; +import rife.tools.FileUtils; import java.io.File; +import java.io.IOException; import java.nio.file.Path; +import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; @@ -33,162 +39,163 @@ import java.util.logging.Logger; * @since 1.0 */ public class GeneratedVersionOperation extends AbstractOperation { + private static final String CLASSNAME = "className"; + private static final String EPOCH = "epoch"; private static final Logger LOGGER = Logger.getLogger(GeneratedVersionOperation.class.getName()); - private final GeneratedVersion generatedVersion_ = new GeneratedVersion(); + private static final String MAJOR = "major"; + private static final String MINOR = "minor"; + private static final String PACKAGE_NAME = "packageName"; + private static final String PROJECT = "project"; + private static final String QUALIFIER = "qualifier"; + private static final String REVISION = "revision"; + private static final String VERSION = "version"; + private final GeneratedVersion generatedVersion = new GeneratedVersion(); + + /** + * Builds the template based on the {@link GeneratedVersion} data. + */ + public static Template buildTemplate(GeneratedVersion gv) { + Template template; + var version = gv.getProject().version(); + if (gv.getTemplate() == null) { + template = TemplateFactory.TXT.get("version.txt"); + } else { + var files = new ResourceFinderDirectories(gv.getTemplate().getParentFile()); + template = new TemplateFactory(TemplateConfig.TXT, "txtFiles", TemplateFactory.TXT) + .setResourceFinder(files).get(gv.getTemplate().getName()); + } + + if (gv.getPackageName() == null) { + gv.setPackageName(gv.getProject().pkg()); + } + + if (template.hasValueId(PACKAGE_NAME)) { + template.setValue(PACKAGE_NAME, gv.getPackageName()); + } + + gv.setClassName(Objects.requireNonNullElse(gv.getClassName(), "GeneratedVersion")); + if (template.hasValueId(CLASSNAME)) { + template.setValue(CLASSNAME, gv.getClassName()); + } + + if (template.hasValueId(PROJECT)) { + if (gv.getProjectName() == null) { + gv.setProjectName(gv.getProject().name()); + } + template.setValue(PROJECT, gv.getProjectName()); + } + + if (template.hasValueId(EPOCH)) { + template.setValue(EPOCH, System.currentTimeMillis()); + } + + if (template.hasValueId(VERSION)) { + template.setValue(VERSION, version.toString()); + } + + if (template.hasValueId(MAJOR)) { + template.setValue(MAJOR, version.majorInt()); + } + + if (template.hasValueId(MINOR)) { + template.setValue(MINOR, version.minorInt()); + } + + if (template.hasValueId(REVISION)) { + template.setValue(REVISION, version.revisionInt()); + } + + if (template.hasValueId(QUALIFIER)) { + template.setValue(QUALIFIER, version.qualifier()); + } + + return template; + } + + /** + * Writes the project version class in the given directory. + */ + public static void writeTemplate(Template template, File directory, GeneratedVersion gv) { + if (gv.getPackageName() != null) { + gv.setClassFile(Path.of(directory.getAbsolutePath(), + gv.getPackageName().replace(".", File.separator), gv.getClassName() + ".java").toFile()); + } else { + gv.setClassFile(Path.of(directory.getAbsolutePath(), gv.getClassName() + ".java").toFile()); + } + + if (!gv.getClassFile().getParentFile().exists()) { + var mkdirs = gv.getClassFile().getParentFile().mkdirs(); + if (!mkdirs && !gv.getClassFile().getParentFile().exists() && LOGGER.isLoggable(Level.SEVERE)) { + LOGGER.log(Level.SEVERE, "Could not create project package directories: {0}", + gv.getClassFile().getParent()); + } + } + + try { + var updated = gv.getClassFile().exists(); + FileUtils.writeString(template.getContent(), gv.getClassFile()); + if (LOGGER.isLoggable(Level.INFO)) { + LOGGER.log(Level.INFO, "Generated version class has been {0} to {1}: {2}", + new String[]{updated ? "updated" : "created", gv.getProject().version().toString(), + gv.getClassFile().toString()}); + } + } catch (IOException e) { + if (LOGGER.isLoggable(Level.SEVERE)) { + LOGGER.log(Level.SEVERE, "Unable to write the version class file.", e); + } + } + } /** * Sets the class name. - * - * @param className the class name - * @return this operation instance */ public GeneratedVersionOperation className(String className) { - generatedVersion_.setClassName(className); + generatedVersion.setClassName(className); return this; } /** * Sets the class template path. - * - * @param template the template path - * @return this operation instance */ public GeneratedVersionOperation classTemplate(File template) { - generatedVersion_.setTemplate(template); + generatedVersion.setTemplate(template); return this; } - /** - * Sets the class template path. - * - * @param template the template path - * @return this operation instance - */ - public GeneratedVersionOperation classTemplate(String template) { - return classTemplate(new File(template)); - } - - /** - * Sets the class template path. - * - * @param template the template path - * @return this operation instance - */ - public GeneratedVersionOperation classTemplate(Path template) { - return classTemplate(template.toFile()); - } - - /** - * Sets the destination directory. - * - * @param directory the destination directory - * @return this operation instance - */ - public GeneratedVersionOperation directory(File directory) { - generatedVersion_.setDirectory(directory); - return this; - } - - /** - * Sets the destination directory. - * - * @param directory the destination directory - * @return this operation instance - */ - public GeneratedVersionOperation directory(String directory) { - return directory(new File(directory)); - } - - /** - * Sets the destination directory. - * - * @param directory the destination directory - * @return this operation instance - */ - public GeneratedVersionOperation directory(Path directory) { - return directory(directory.toFile()); - } - /** * Generates a version data class for this project. */ @Override - @SuppressWarnings("PMD.PreserveStackTrace") - public void execute() throws Exception { - if (generatedVersion_.getProject() == null) { - if (LOGGER.isLoggable(Level.SEVERE) && !silent()) { - LOGGER.severe("A project must be specified."); - } - throw new ExitStatusException(ExitStatusException.EXIT_FAILURE); - } else { - try { - var template = generatedVersion_.buildTemplate(); - generatedVersion_.writeTemplate(template); - if (LOGGER.isLoggable(Level.INFO) && !silent()) { - LOGGER.log(Level.INFO, "Generated version ({0}) class saved to: file://{1}", - new String[]{generatedVersion_.getProject().version().toString(), - generatedVersion_.getClassFile().toURI().getPath()}); - } - } catch (Exception e) { - if (LOGGER.isLoggable(Level.SEVERE) && !silent()) { - LOGGER.severe(e.getMessage()); - } - throw new ExitStatusException(ExitStatusException.EXIT_FAILURE); - } + public void execute() { + if (generatedVersion.getProject() == null && LOGGER.isLoggable(Level.SEVERE)) { + LOGGER.severe("A project must be specified."); } - } - /** - * Sets the file extension. (Default is: {@code .java}) - * - * @param extension the file extension - * @return this operation instance - */ - public GeneratedVersionOperation extension(String extension) { - generatedVersion_.setExtension(extension); - return this; + var template = buildTemplate(generatedVersion); + writeTemplate(template, generatedVersion.getProject().srcMainJavaDirectory(), generatedVersion); } /** * Configure the operation from a {@link BaseProject}. - * - * @param project the project - * @return this operation instance */ public GeneratedVersionOperation fromProject(BaseProject project) { - generatedVersion_.setProject(project); - generatedVersion_.setDirectory(project.srcMainJavaDirectory()); + generatedVersion.setProject(project); return this; } - /** - * Retrieves the generated version instance. - * - * @return the generated version - */ - public GeneratedVersion generatedVersion() { - return generatedVersion_; - } - /** * Sets the package name. - * - * @param packageName the package name - * @return this operation instance */ public GeneratedVersionOperation packageName(String packageName) { - generatedVersion_.setPackageName(packageName); + generatedVersion.setPackageName(packageName); return this; } /** * Sets the project name. - * - * @param projectName the project name - * @return this operation instance */ public GeneratedVersionOperation projectName(String projectName) { - generatedVersion_.setProjectName(projectName); + generatedVersion.setProjectName(projectName); return this; } -} +} \ No newline at end of file diff --git a/src/main/resources/templates/default_generated_version.txt b/src/main/resources/templates/version.txt similarity index 99% rename from src/main/resources/templates/default_generated_version.txt rename to src/main/resources/templates/version.txt index 0e30456..19d932c 100644 --- a/src/main/resources/templates/default_generated_version.txt +++ b/src/main/resources/templates/version.txt @@ -1,4 +1,4 @@ -/** +/* * This file is automatically generated. * Do not modify! -- ALL CHANGES WILL BE ERASED! */ diff --git a/src/test/java/rife/bld/extension/GeneratedVersionTest.java b/src/test/java/rife/bld/extension/GeneratedVersionTest.java index 32e3508..689e0d5 100644 --- a/src/test/java/rife/bld/extension/GeneratedVersionTest.java +++ b/src/test/java/rife/bld/extension/GeneratedVersionTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,23 +16,16 @@ package rife.bld.extension; -import org.assertj.core.api.AutoCloseableSoftAssertions; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import rife.bld.BaseProject; import rife.bld.Project; -import rife.bld.blueprints.BaseProjectBlueprint; import rife.bld.dependencies.VersionNumber; import rife.tools.FileUtils; import java.io.File; import java.io.IOException; import java.nio.file.Files; -import java.nio.file.Path; import java.util.Objects; -import java.util.logging.ConsoleHandler; -import java.util.logging.Level; -import java.util.logging.Logger; import static org.assertj.core.api.Assertions.assertThat; @@ -60,41 +53,6 @@ class GeneratedVersionTest { } }; - @BeforeAll - static void beforeAll() { - var level = Level.ALL; - var logger = Logger.getLogger("rife.bld.extension"); - var consoleHandler = new ConsoleHandler(); - consoleHandler.setLevel(level); - logger.addHandler(consoleHandler); - logger.setLevel(level); - logger.setUseParentHandlers(false); - } - - /** - * Compares two strings by removing all line separators and whitespace. - * - * @param text1 The first text to compare - * @param text2 The second text to compare - * @return true if the texts are equivalent when line separators are ignored, false otherwise - */ - static boolean compareTextIgnoringLineSeparators(String text1, String text2) { - // Handle null cases - if (text1 == null && text2 == null) { - return true; - } - if (text1 == null || text2 == null) { - return false; - } - - // Remove all line separators and whitespace - var cleanedText1 = text1.replaceAll("\\r?\\n|\\r|\\s", ""); - var cleanedText2 = text2.replaceAll("\\r?\\n|\\r|\\s", ""); - - // Compare the cleaned strings - return cleanedText1.equals(cleanedText2); - } - static void deleteOnExit(File folder) { folder.deleteOnExit(); for (var f : Objects.requireNonNull(folder.listFiles())) { @@ -110,43 +68,30 @@ class GeneratedVersionTest { void testBuildCustomTemplate() { var gv = new GeneratedVersion(); gv.setProject(PROJECT); - gv.setTemplate(new File(gv.getProject().srcTestResourcesDirectory().getAbsolutePath(), "version_test.txt")); + gv.setTemplate(new File(gv.getProject().srcTestResourcesDirectory().getAbsolutePath(), + "version_test.txt")); gv.setPackageName("com.example.my"); gv.setProjectName("My App"); gv.setClassName("MyVersion"); - var t = gv.buildTemplate(); - var v = gv.getProject().version(); - assertThat(v).extracting("majorInt", "minorInt", "revisionInt").as("version") - .containsExactly(2, 1, 3); - assertThat(compareTextIgnoringLineSeparators(t.getContent(), - String.format("package %s;" + - "public final class %s {" + - " public static final int PROJECT = \"%s\";" + - " public static final int MAJOR = %d;" + - " public static final int MINOR = %d;" + - " public static final int REVISION = %d;" + - " public static final String QUALIFIER = \"\";" + - " private MyVersion() {" + - " // no-op" + - " }" + - "}", gv.getPackageName(), gv.getClassName(), gv.getProjectName(), v.majorInt(), - v.minorInt(), v.revisionInt()))).as("template").isTrue(); + var t = GeneratedVersionOperation.buildTemplate(gv); + + assertThat(t.getContent()).contains("package com.example.my;").contains("class MyVersion") + .contains("MAJOR = 2").contains("MINOR = 1").contains("REVISION = 3").contains("QUALIFIER = \"\"") + .contains("private MyVersion").contains("PROJECT = \"My App\""); } @Test void testBuildTemplate() { var gv = new GeneratedVersion(); gv.setProject(PROJECT); + var t = GeneratedVersionOperation.buildTemplate(gv); - var t = gv.buildTemplate(); assertThat(t).isNotNull(); - try (var softly = new AutoCloseableSoftAssertions()) { - softly.assertThat(gv.getProject()).isEqualTo(PROJECT); - softly.assertThat(gv.getPackageName()).isEqualTo(PROJECT.pkg()); - softly.assertThat(gv.getProjectName()).isEqualTo(PROJECT.name()); - } + assertThat(gv.getProject()).isEqualTo(PROJECT); + assertThat(gv.getPackageName()).isEqualTo(PROJECT.pkg()); + assertThat(gv.getProjectName()).isEqualTo(PROJECT.name()); assertThat(t.getContent()).contains("package com.example;").contains("class GeneratedVersion") .contains("PROJECT = \"MyExample\";").contains("MAJOR = 2").contains("MINOR = 1") @@ -154,108 +99,20 @@ class GeneratedVersionTest { .contains("private GeneratedVersion"); } - @Test - void testDirectories() { - var foo = new File("foo"); - var bar = new File("bar"); - - var op = new GeneratedVersionOperation().directory(foo); - assertThat(op.generatedVersion().getDirectory()).as("as file").isEqualTo(foo); - - op = op.directory(bar.toPath()); - assertThat(op.generatedVersion().getDirectory()).as("as path").isEqualTo(bar); - - op = op.directory("foo"); - assertThat(op.generatedVersion().getDirectory()).as("as string").isEqualTo(foo); - } - - @Test - void testExample() throws Exception { - var tmpDir = Files.createTempDirectory("bld-generated-version-example-").toFile(); - tmpDir.deleteOnExit(); - - new GeneratedVersionOperation() - .fromProject(new BaseProjectBlueprint(new File("examples"), "com.example", "Example", "Example")) - .directory(tmpDir.getAbsolutePath()) - //.classTemplate(new File("examples", "my_app_version.txt")) - .classTemplate(new File("examples", "version.txt")) - .execute(); - - deleteOnExit(tmpDir); - - var template = Path.of(tmpDir.getAbsolutePath(), "com", "example", "GeneratedVersion.java"); - assertThat(template).exists(); - - var content = Files.readString(template); - assertThat(content).contains("class GeneratedVersion").contains("PROJECT = \"Example\";") - .contains("MAJOR = 0").contains("MINOR = 0").contains("REVISION = 1").contains("QUALIFIER = \"\"") - .doesNotContain("ERASED!"); // only in default template - } - - @Test - void testExecute() throws Exception { - var tmpDir = Files.createTempDirectory("bld-generated-version-execute-").toFile(); - tmpDir.deleteOnExit(); - - new GeneratedVersionOperation() - .fromProject(PROJECT) - .directory(tmpDir.getAbsolutePath()) - .extension(".java") - .classTemplate("src/test/resources/foo/version_test.txt") - .packageName("") - .className("MyVersion") - .execute(); - - deleteOnExit(tmpDir); - - var template = new File(tmpDir, "MyVersion.java"); - assertThat(template).exists(); - - var content = Files.readString(template.toPath()); - assertThat(content).contains("class MyVersion") - .contains("PROJECT = \"MyExample\";").contains("MAJOR = 2").contains("MINOR = 1") - .contains("REVISION = 3").contains("QUALIFIER = \"\"").contains("private MyVersion") - .doesNotContain("package"); - } - - @Test - void testGeneratedVersion() { - var gv = new GeneratedVersion(); - gv.setProject(PROJECT); - gv.setTemplate(new File(gv.getProject().srcTestResourcesDirectory().getAbsolutePath(), "version_test.txt")); - gv.setPackageName("com.example.cool"); - gv.setProjectName("Cool App"); - gv.setClassName("CoolVersion"); - gv.setDirectory(new File("build")); - gv.setExtension(".java"); - - try (var softly = new AutoCloseableSoftAssertions()) { - softly.assertThat(gv.getProject()).as("project").isEqualTo(PROJECT); - softly.assertThat(gv.getTemplate()).as("template").exists(); - softly.assertThat(gv.getPackageName()).as("package name").isEqualTo("com.example.cool"); - softly.assertThat(gv.getProjectName()).as("project name").isEqualTo("Cool App"); - softly.assertThat(gv.getClassName()).as("class name").isEqualTo("CoolVersion"); - softly.assertThat(gv.getExtension()).as("extension").isEqualTo(".java"); - softly.assertThat(gv.getDirectory()).as("directory").isDirectory(); - } - } - @Test void testWriteTemplate() throws IOException { - var tmpDir = Files.createTempDirectory("bld-generated-version-write-").toFile(); - tmpDir.deleteOnExit(); - var gv = new GeneratedVersion(); gv.setProject(PROJECT); - gv.setDirectory(tmpDir); + var t = GeneratedVersionOperation.buildTemplate(gv); - var t = gv.buildTemplate(); - gv.writeTemplate(t); + var tmpDir = Files.createTempDirectory("bldGeneratedVersion").toFile(); - deleteOnExit(tmpDir); + GeneratedVersionOperation.writeTemplate(t, tmpDir, gv); assertThat(gv.getClassFile()).exists(); + deleteOnExit(tmpDir); + var versionClass = FileUtils.readString(gv.getClassFile()); assertThat(versionClass).contains("package com.example;").contains("class GeneratedVersion") .contains("MAJOR = 2").contains("MINOR = 1").contains("REVISION = 3") diff --git a/src/test/resources/foo/version_test.txt b/src/test/resources/foo/version_test.txt deleted file mode 100644 index 06787e6..0000000 --- a/src/test/resources/foo/version_test.txt +++ /dev/null @@ -1,11 +0,0 @@ -public final class {{v className/}} { - public static final int PROJECT = "{{v project/}}"; - public static final int MAJOR = {{v major/}}; - public static final int MINOR = {{v minor/}}; - public static final int REVISION = {{v revision/}}; - public static final String QUALIFIER = "{{v qualifier/}}"; - - private {{v className/}}() { - // no-op - } -}