diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index 21cca4a..b94976b 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -3,49 +3,30 @@ name: bld-ci on: [ push, pull_request, workflow_dispatch ] jobs: - build-bld-project: + build-gradle-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, 19, 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 run [examples] - working-directory: examples - run: ./bld compile run - - - name: Update version properties and run [examples] - working-directory: examples - run: | - ./bld update-major run - ./bld update-minor run - ./bld update-patch run - ./bld update-release run - - - name: Delete version properties and run [examples] - working-directory: examples - run: ./bld delete-version run - - - name: Download dependencies - run: ./bld download - - - name: Run tests + - name: Run tests with bld run: ./bld compile test \ No newline at end of file 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/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index d91f848..0000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/copyright/Apache_License.xml b/.idea/copyright/Apache_License.xml index 4446c15..206aa7d 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 e537645..0000000 --- a/.idea/intellij-javadocs-4.0.1.xml +++ /dev/null @@ -1,141 +0,0 @@ - - - - - UPDATE - false - true - - METHOD - FIELD - TYPE - - - PUBLIC - DEFAULT - PROTECTED - - - - - - ^.*(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} if an error occurs\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..0f59db6 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 56ddbf1..81feb0b 100644 --- a/.idea/libraries/runtime.xml +++ b/.idea/libraries/runtime.xml @@ -7,7 +7,7 @@ - - + + \ No newline at end of file diff --git a/.idea/libraries/test.xml b/.idea/libraries/test.xml index f72f7a3..13b6513 100644 --- a/.idea/libraries/test.xml +++ b/.idea/libraries/test.xml @@ -7,7 +7,7 @@ - - + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 4e11c3d..a9eecbd 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,3 +1,4 @@ + @@ -8,13 +9,6 @@ - - - - - - - \ No newline at end of file diff --git a/examples/.idea/libraries/runtime.xml b/examples/.idea/libraries/runtime.xml index 56ddbf1..81feb0b 100644 --- a/examples/.idea/libraries/runtime.xml +++ b/examples/.idea/libraries/runtime.xml @@ -7,7 +7,7 @@ - - + + \ No newline at end of file diff --git a/examples/.idea/libraries/test.xml b/examples/.idea/libraries/test.xml index f72f7a3..13b6513 100644 --- a/examples/.idea/libraries/test.xml +++ b/examples/.idea/libraries/test.xml @@ -7,7 +7,7 @@ - - + + \ No newline at end of file diff --git a/examples/.idea/misc.xml b/examples/.idea/misc.xml index 0e7a921..7010ea3 100644 --- a/examples/.idea/misc.xml +++ b/examples/.idea/misc.xml @@ -1,3 +1,4 @@ + diff --git a/examples/.vscode/launch.json b/examples/.vscode/launch.json index d8eb2e0..c868458 100644 --- a/examples/.vscode/launch.json +++ b/examples/.vscode/launch.json @@ -1,6 +1,12 @@ { "version": "0.2.0", "configurations": [ + { + "type": "java", + "name": "Run Main", + "request": "launch", + "mainClass": "com.example.PropertyFileExampleMain" + }, { "type": "java", "name": "Run Tests", @@ -12,8 +18,7 @@ "--disable-banner", "--disable-ansi-colors", "--exclude-engine=junit-platform-suite", - "--exclude-engine=junit-vintage" - ] + "--exclude-engine=junit-vintage"] } ] } diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index ba429d0..2aea7f2 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}/.rife2/dist/rife2-1.5.16.jar", + "lib/compile/*.jar", + "lib/runtime/*.jar", + "lib/test/*.jar" ] } diff --git a/examples/README.md b/examples/README.md index ca9e01e..0eec846 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,20 +1,56 @@ -# Compile and Run Example +# [Bld Property File](https://github.com/rife2/bld-property-file) Extension Examples -```console -./bld compile run +## Compile + +First make sure the project up-to-date and compiled: + +```shell +./bld download compile +``` +## Run + +To run the examples, issue one of the following command or combination there off. + +```shell +./bld updateMajor run +./bld updateMinor run +./bld updatePatch run +``` +Upon execution, the `version.properties` file will be created and displayed: + +```shell +./bld updateMajor run ``` -# Update Version Properties - -```console -./bld update-major run -./bld update-minor run -./bld update-patch run -./bld update-release run +```shell ++---------------------------+ +| version.properties | ++---------------------------+ +# +#Sun Apr 02 23:51:39 PDT 2023 +build.date=2023-04-02 +version.major=1 +version.minor=0 +version.patch=0 ``` -# Delete Version Properties +Subsequent commands will reflect the modifications to the +`version.major`, `version.minor` or `version.patch` properties: -```console -./bld delete-version run -``` \ No newline at end of file +```shell +./bld upatePatch run +``` + +```shell ++---------------------------+ +| version.properties | ++---------------------------+ +# +#Sun Apr 02 23:55:09 PDT 2023 +build.date=2023-04-02 +version.major=1 +version.minor=0 +version.patch=10 +``` + +[View the Examples Build](https://github.com/rife2/bld-property-file/blob/master/examples/src/bld/java/com/example/PropertyFileExampleBuild.java) \ No newline at end of file diff --git a/examples/lib/bld/bld-wrapper.jar b/examples/lib/bld/bld-wrapper.jar index 2e6f0b2..ca16d0f 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 804e68c..c772cae 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,6 +1,6 @@ #Sun Apr 02 10:32:44 PDT 2023 +bld.extension=com.uwyn.rife2:bld-property-file:0.9.0 +bld.repositories=MAVEN_LOCAL,RIFE2 bld.downloadExtensionSources=true -bld.downloadLocation= -bld.extension=com.uwyn.rife2:bld-property-file:0.9.9 -bld.repositories=MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES -bld.version=2.2.1 +rife2.downloadLocation= +rife2.version=1.5.16 \ No newline at end of file diff --git a/examples/src/bld/java/com/example/PropertyFileExampleBuild.java b/examples/src/bld/java/com/example/PropertyFileExampleBuild.java index 8f9a29c..12d44ed 100644 --- a/examples/src/bld/java/com/example/PropertyFileExampleBuild.java +++ b/examples/src/bld/java/com/example/PropertyFileExampleBuild.java @@ -3,30 +3,18 @@ package com.example; import rife.bld.BuildCommand; import rife.bld.Project; import rife.bld.extension.propertyfile.Entry; -import rife.bld.extension.propertyfile.EntryDate; -import rife.bld.extension.propertyfile.EntryInt; +import rife.bld.extension.propertyfile.Entry.Types; import rife.bld.extension.propertyfile.PropertyFileOperation; import java.util.List; import static rife.bld.dependencies.Repository.MAVEN_CENTRAL; -import static rife.bld.dependencies.Repository.RIFE2_RELEASES; +import static rife.bld.dependencies.Repository.SONATYPE_SNAPSHOTS; import static rife.bld.dependencies.Scope.test; import static rife.bld.extension.propertyfile.Calc.ADD; -/** - * Example build. - * - *
    - *
  • ./bld updateMajor run
  • - *
  • ./bld updateMinor run
  • - *
  • ./bld updatePath run
  • - *
  • ./bld updateRelease run
  • - *
  • ./bld deleteVersion run
  • - *
- */ public class PropertyFileExampleBuild extends Project { - final EntryDate buildDateEntry = new EntryDate("build.date").now().pattern("yyyy-MM-dd"); + final Entry buildDateEntry = new Entry("build.date").set("now").pattern("yyyy-MM-dd").type(Types.DATE); public PropertyFileExampleBuild() { pkg = "com.example"; @@ -34,93 +22,70 @@ public class PropertyFileExampleBuild extends Project { mainClass = "com.example.PropertyFileExampleMain"; version = version(0, 1, 0); - javaRelease = 17; - downloadSources = true; - autoDownloadPurge = true; - - repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES); - + repositories = List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS); 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, 9, 2))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 9, 2))); } public static void main(String[] args) { new PropertyFileExampleBuild().start(args); } - @BuildCommand(value = "update-major", summary = "Updates major version") + @BuildCommand(summary = "Updates major version") public void updateMajor() throws Exception { - new PropertyFileOperation() - .fromProject(this) + new PropertyFileOperation(this) .file("version.properties") // set the major version to 1 if it doesn't exist, increase by 1 - .entry(new EntryInt("version.major").defaultValue(0).calc(ADD)) + .entry(new Entry("version.major").defaultValue(0).type(Types.INT).calc(ADD)) // set the minor version to 0 - .entry(new EntryInt("version.minor").set(0)) + .entry(new Entry("version.minor").set(0)) // set the patch version to 0 - .entry(new EntryInt("version.patch").set(0)) + .entry(new Entry("version.patch").set(0)) // set the build date to the current date .entry(buildDateEntry) .execute(); } - @BuildCommand(value = "update-minor", summary = "Updates minor version") + @BuildCommand(summary = "Updates minor version") public void updateMinor() throws Exception { - new PropertyFileOperation() - .fromProject(this) + new PropertyFileOperation(this) .file("version.properties") // set the major version to 1 if it doesn't exist - .entry(new EntryInt("version.major").defaultValue(1)) + .entry(new Entry("version.major").defaultValue(1)) // set the minor version to 0 if it doesn't exist, increase by 1 - .entry(new EntryInt("version.minor").defaultValue(-1).calc(ADD)) + .entry(new Entry("version.minor").defaultValue(-1).type(Types.INT).calc(ADD)) // set the patch version to 0 - .entry(new EntryInt("version.patch").set(0)) + .entry(new Entry("version.patch").set(0)) // set the build date to the current date .entry(buildDateEntry) .execute(); } - @BuildCommand(value = "update-patch", summary = "Updates patch version") + @BuildCommand(summary = "Updates patch version") public void updatePatch() throws Exception { - new PropertyFileOperation() - .fromProject(this) + new PropertyFileOperation(this) .file("version.properties") // set the major version to 1 if it doesn't exist - .entry(new EntryInt("version.major").defaultValue(1)) + .entry(new Entry("version.major").defaultValue(1)) // set the minor version to 0 if it doesn't exist - .entry(new EntryInt("version.minor").defaultValue(0)) + .entry(new Entry("version.minor").defaultValue(0)) // set the patch version to 10 if it doesn't exist, increase by 10 - .entry(new EntryInt("version.patch").defaultValue(0).calc(v -> v + 10)) + .entry(new Entry("version.patch").defaultValue(0).type(Types.INT).calc(v -> v + 10)) // set the build date to the current date .entry(buildDateEntry) .execute(); } - @BuildCommand(value = "update-release", summary = "Updates the release") - public void updateRelease() throws Exception { - new PropertyFileOperation() - .fromProject(this) - .file("version.properties") - // set the release to current date/time - .entry(new EntryDate("release").now().pattern("yyyyMMddHHmmss")) - // prepend 'beta.' to the release - .entry(new Entry("release").modify("beta.", (v, s) -> s + v)) - .entry(buildDateEntry) - .execute(); - } - - @BuildCommand(value = "delete-version", summary = "Delete version properties") + @BuildCommand(summary = "Delete version properties") public void deleteVersion() throws Exception { - new PropertyFileOperation() - .fromProject(this) + new PropertyFileOperation(this) .file("version.properties") .entry(new Entry("version.major").delete()) .entry(new Entry("version.minor").delete()) .entry(new Entry("version.patch").delete()) - .entry(new Entry("release").delete()) .entry(buildDateEntry.delete()) .execute(); } -} +} \ No newline at end of file diff --git a/examples/version.properties b/examples/version.properties deleted file mode 100644 index 2d06736..0000000 --- a/examples/version.properties +++ /dev/null @@ -1,7 +0,0 @@ -# -#Mon Jan 13 22:23:02 PST 2025 -build.date=2025-01-13 -release=beta.20250113222132 -version.major=3 -version.minor=1 -version.patch=20 diff --git a/lib/bld/bld-wrapper.jar b/lib/bld/bld-wrapper.jar index b067ce9..dece4d4 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..6f6b0bc 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -1,6 +1,2 @@ -bld.downloadExtensionJavadoc=false -bld.downloadExtensionSources=true -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 +#Sat Apr 01 10:09:33 PDT 2023 +rife2.version=1.5.16 diff --git a/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java b/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java index fbfd1e7..0ed8df1 100644 --- a/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java +++ b/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java @@ -1,25 +1,8 @@ -/* - * Copyright 2023-2025 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. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package rife.bld.extension.propertyfile; -import rife.bld.BuildCommand; import rife.bld.Project; -import rife.bld.extension.PmdOperation; import rife.bld.publish.PublishDeveloper; +import rife.bld.publish.PublishInfo; import rife.bld.publish.PublishLicense; import rife.bld.publish.PublishScm; @@ -34,72 +17,46 @@ public class PropertyFileBuild extends Project { public PropertyFileBuild() { pkg = "rife.bld.extension"; name = "bld-property-file"; - version = version(0, 9, 9); - - javaRelease = 17; - downloadSources = true; - autoDownloadPurge = true; - repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS); - - scope(compile) - .include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1))); - scope(test) - .include(dependency("org.jsoup", "jsoup", version(1, 19, 1))) - .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-joda-time:2.2.0")); - - javadocOperation() - .javadocOptions() - .author() + version = version(0, 9, 0); + javadocOptions .docLint(NO_MISSING) - .link("https://rife2.github.io/bld/") .link("https://rife2.github.io/rife2/"); - - publishOperation() - .repository(version.isSnapshot() ? repository("rife2-snapshot") : repository("rife2")) - .repository(repository("github")) - .info() + publishRepository = repository("https://repo.rife2.com/releases", + property("rife2.username"), + property("rife2.password")); + publishInfo = new PublishInfo() .groupId("com.uwyn.rife2") .artifactId("bld-property-file") .description("bld Extension to Create or Modify Properties Files") .url("https://github.com/rife2/bld-property-file") - .developer( - new PublishDeveloper().id("ethauvin") - .name("Erik C. Thauvin") - .email("erik@thauvin.net") - .url("https://erik.thauvin.net/") - ) - .developer( - new PublishDeveloper() - .id("gbevin") - .name("Geert Bevin") - .email("gbevin@uwyn.com") - .url("https://github.com/gbevin") - ) - .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/bld-property-file.git") - .developerConnection("scm:git:git@github.com:rife2/bld-property-file.git") - .url("https://github.com/rife2/bld-property-file")) + .developer(new PublishDeveloper().id("ethauvin").name("Erik C. Thauvin").email("erik@thauvin.net") + .url("https://erik.thauvin.net/")) + .developer(new PublishDeveloper().id("gbevin").name("Geert Bevin").email("geert@uwyn.com") + .url("https://github.com/gbevin")) + .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/bld-property-file.git") + .developerConnection("scm:git:git@github.com:rife2/bld-property-file.git") + .url("https://github.com/rife2/bld-property-file")) .signKey(property("sign.key")) .signPassphrase(property("sign.passphrase")); + + javaRelease = 17; + downloadSources = true; + autoDownloadPurge = true; + repositories = List.of(MAVEN_CENTRAL, RIFE2); + + scope(compile) + .include(dependency("com.uwyn.rife2", "rife2", version(1, 5, 16))); + scope(test) + .include(dependency("org.jsoup", "jsoup", version(1, 15, 4))) + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 9, 2))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 9, 2))) + .include(dependency("org.assertj:assertj-joda-time:2.2.0")); + } public static void main(String[] args) { new PropertyFileBuild().start(args); } - - @BuildCommand(summary = "Runs PMD analysis") - public void pmd() throws Exception { - new PmdOperation() - .fromProject(this) - .failOnViolation(true) - .ruleSets("config/pmd.xml") - .execute(); - } -} +} \ No newline at end of file diff --git a/src/main/java/rife/bld/extension/propertyfile/Calc.java b/src/main/java/rife/bld/extension/propertyfile/Calc.java index 4c3f8bf..9e90642 100644 --- a/src/main/java/rife/bld/extension/propertyfile/Calc.java +++ b/src/main/java/rife/bld/extension/propertyfile/Calc.java @@ -1,17 +1,17 @@ /* - * 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. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * https://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package rife.bld.extension.propertyfile; @@ -26,25 +26,13 @@ import java.util.function.IntFunction; * @since 1.0 */ public final class Calc { - /** - * The add function. - */ public static final IntFunction ADD = Calc::add; - /** - * The sub function. - */ public static final IntFunction SUB = Calc::sub; - - private Calc() { - // no-op - } - /** * Adds {@code 1} to the value. * * @param v the value - * @return the new value */ public static Integer add(int v) { return v + 1; @@ -54,7 +42,6 @@ public final class Calc { * Subtracts {@code 1} to the value. * * @param v the value - * @return the new value */ public static Integer sub(int v) { return v - 1; diff --git a/src/main/java/rife/bld/extension/propertyfile/Entry.java b/src/main/java/rife/bld/extension/propertyfile/Entry.java index 3cdf925..a75993a 100644 --- a/src/main/java/rife/bld/extension/propertyfile/Entry.java +++ b/src/main/java/rife/bld/extension/propertyfile/Entry.java @@ -1,33 +1,42 @@ /* - * 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. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * https://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package rife.bld.extension.propertyfile; import java.util.function.BiFunction; +import java.util.function.IntFunction; /** - * Declares the modifications to be made to a {@link java.util.Properties String-based property}. + * Declares the modifications to be made to a {@link java.util.Properties Properties} file. * * @author Erik C. Thauvin * @author Geert Bevin * @since 1.0 */ -public class Entry extends EntryBase { - private String modifyValue_ = ""; - private BiFunction modify_; +public class Entry { + private String key; + private String defaultValue; + private String newValue; + private String modifyValue; + private boolean isDelete; + private Types type = Types.STRING; + private String pattern = ""; + private Units unit = Units.DAY; + private IntFunction calc; + private BiFunction modify; /** * Creates a new {@link Entry entry}. @@ -35,57 +44,318 @@ public class Entry extends EntryBase { * @param key the required property key */ public Entry(String key) { - super(key); + this.key = key; + } + + /** + * Creates a new {@link Entry entry}. + * + * @param key the required property key + * @param type the value {@link Types Type} + */ + public Entry(String key, Types type) { + this.key = key; + this.type = type; + } + + /** + * Returns the value to be used in the {@link #modify} function. + */ + public String getModifyValue() { + return modifyValue; } /** * Returns the modify function. - * - * @return the modify function */ - protected BiFunction modify() { - return modify_; + public BiFunction getModify() { + return modify; } /** - * Sets the modify function. - * - * @param modify the modify function + * Set the modify function. */ - public Entry modify(BiFunction modify) { - modify_ = modify; - return this; + public void setModify(BiFunction modify) { + this.modify = modify; } /** - * Sets the modify function. + * Set the modify function. + * + * @param value the value to perform a modification with + */ + public void setModify(String value, BiFunction modify) { + this.modifyValue = value; + this.modify = modify; + } + + /** + * Creates a new {@link Entry entry}. * * @param value the value to perform a modification with - * @param modify the modify function + * @param modify the modification function */ public Entry modify(String value, BiFunction modify) { - modifyValue_ = value; - modify_ = modify; + modifyValue = value; + setModify(modify); return this; } /** - * Returns the value to be used in the {@link #modify_} function. + * Creates a new {@link Entry entry}. * - * @return the modify value + * @param modify the modification function */ - protected String modifyValue() { - return modifyValue_; + public Entry modify(BiFunction modify) { + setModify(modify); + return this; } /** - * Sets the new {@link java.util.Properties property} value. - * - * @param s The new value - * @return the entry + * Returns {@code true} if the {@link Entry} is to be deleted. */ - public Entry set(Object s) { - newValue(s); + public boolean isDelete() { + return isDelete; + } + + /** + * Sets whether the {@link Entry} should be deleted. + */ + public void setDelete(boolean delete) { + isDelete = delete; + } + + /** + * Returns the calculation function. + */ + public IntFunction getCalc() { + return calc; + } + + /** + * Sets the calculation function. + */ + public void setCalc(IntFunction calc) { + this.calc = calc; + } + + /** + * Creates a new {@link Entry entry}. + * + * @param calc the calculation function. + */ + public Entry calc(IntFunction calc) { + setCalc(calc); return this; } + + /** + * Returns the key of the {@link java.util.Properties property}. + */ + public String getKey() { + return key; + } + + /** + * Sets the key of the {@link java.util.Properties property}. + * + * @param key the {@link java.util.Properties property} key + */ + public void setKey(String key) { + this.key = key; + } + + /** + * Returns the default value. + */ + public String getDefaultValue() { + return defaultValue; + } + + /** + *

Sets the initial value to set the {@link java.util.Properties property} to, if not already defined.

+ * + *

The {@code now} keyword can be used for {@link Types#DATE Types.DATE}

+ * + * @param defaultValue the default value + */ + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + + /** + * Return the value {@link Types Type}. + */ + public Types getType() { + return type; + } + + /** + * Sets the value {@link Types Type}, if none is specified {@link Types#STRING Types.STRING} is assumed. + * + * @param type the value {@link Types Type} + */ + public void setType(Types type) { + this.type = type; + } + + /** + * Returns the pattern. + */ + public String getPattern() { + return pattern; + } + + /** + * Sets the {@link java.text.DecimalFormat DecimalFormat} or {@link java.text.SimpleDateFormat SimpleDateFormat} + * pattern to be used with {@link Types#INT Types.INT} or {@link Types#DATE Types.DATE} respectively. + * + * @param pattern the pattern + */ + public void setPattern(String pattern) { + this.pattern = pattern; + } + + /** + * Return the {@link Units unit}. + */ + public Units getUnit() { + return unit; + } + + /** + * Sets the {@link Units unit} value to apply to {@link Calc#ADD add} and {@link Calc#SUB subtract} calculations + * for {@link Types#DATE Types.DATE}. + * + * @param unit the {@link Units unit} + */ + public void setUnit(Units unit) { + this.unit = unit; + } + + /** + * Sets the key of the {@link java.util.Properties property}. + * + * @param key the {@link java.util.Properties property} key + */ + @SuppressWarnings("unused") + public Entry key(String key) { + setKey(key); + return this; + } + + /** + * Returns the new value to set the {@link java.util.Properties property)} to. + */ + public String getNewValue() { + return newValue; + } + + /** + * Sets a new value to set the {@link java.util.Properties property} to, regardless of its previous value. + * + *

The {@code now} keyword can be used for {@link Types#DATE Types.DATE}

+ * + * @param newValue the {@link java.util.Properties property} new value + */ + @SuppressWarnings("unused") + public Entry set(Object newValue) { + if (newValue != null) { + this.newValue = String.valueOf(newValue); + } else { + this.newValue = null; + } + return this; + } + + /** + *

Sets the initial value to set the {@link java.util.Properties property} to, if not already defined.

+ * + *

The {@code now} keyword can be used for {@link Types#DATE Types.DATE}

+ * + * @param defaultValue the default value + */ + @SuppressWarnings("unused") + public Entry defaultValue(Object defaultValue) { + if (defaultValue != null) { + setDefaultValue(String.valueOf(defaultValue)); + } else { + setDefaultValue(null); + } + return this; + } + + /** + * Sets the value {@link Types Type}, if none is specified {@link Types#STRING Types.STRING} is assumed. + * + * @param type the value {@link Types Type} + */ + public Entry type(Types type) { + setType(type); + return this; + } + + /** + *

Sets the pattern for {@link Types#INT Types.INT} and {@link Types#DATE Types.DATE} to + * {@link java.text.DecimalFormat DecimalFormat} and {@link java.text.SimpleDateFormat SimpleDateFormat} + * respectively.

+ * + * @param pattern the pattern + */ + public Entry pattern(String pattern) { + setPattern(pattern); + return this; + } + + /** + * Sets the {@link Units unit} value to apply to {@link Calc#ADD add} and {@link Calc#SUB subtract} calculations + * for {@link Types#DATE Types.DATE}. + * + * @param unit the {@link Units unit} + */ + @SuppressWarnings("unused") + public Entry unit(Units unit) { + setUnit(unit); + return this; + } + + /** + * Sets the {@link Entry entry} up for deletion. + */ + public Entry delete() { + isDelete = true; + return this; + } + + /** + * The available datatypes. + * + *
    + *
  • {@link Types#DATE DATE}
  • + *
  • {@link Types#INT INT}
  • + *
  • {@link Types#STRING STRING}
  • + *
+ */ + public enum Types { + DATE, INT, STRING + } + + /** + * The units available for {@link Types#DATE Type.DATE} {@link Calc#ADD add} + * and {@link Calc#SUB subtract} calculations. + * + *
    + *
  • {@link Units#SECOND SECOND}
  • + *
  • {@link Units#MINUTE MINUTE}
  • + *
  • {@link Units#MILLISECOND MILLISECOND}
  • + *
  • {@link Units#HOUR HOUR}
  • + *
  • {@link Units#DAY DAY}
  • + *
  • {@link Units#WEEK WEEK}
  • + *
  • {@link Units#MONTH MONTH}
  • + *
  • {@link Units#YEAR YEAR}
  • + *
+ */ + public enum Units { + MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, YEAR + } } diff --git a/src/main/java/rife/bld/extension/propertyfile/EntryBase.java b/src/main/java/rife/bld/extension/propertyfile/EntryBase.java deleted file mode 100644 index ff9f05e..0000000 --- a/src/main/java/rife/bld/extension/propertyfile/EntryBase.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2023-2025 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. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rife.bld.extension.propertyfile; - -import java.util.function.IntFunction; - -/** - * Declares the modifications to be made to a {@link java.util.Properties property}. - * - * @author Erik C. Thauvin - * @author Geert Bevin - * @since 1.0 - */ -@SuppressWarnings({"unchecked", "PMD.AbstractClassWithoutAbstractMethod"}) -public abstract class EntryBase { - private IntFunction calc_; - private Object defaultValue_; - private boolean isDelete_; - private String key_; - private Object newValue_; - private Object pattern_; - - /** - * Creates a new {@link EntryBase entry}. - * - * @param key the required property key - */ - public EntryBase(String key) { - key_ = key; - } - - /** - * Returns the calculation function. - * - * @return the calc function - */ - protected IntFunction calc() { - return calc_; - } - - /** - * Sets the calculation function. - * - * @param calc the calc function - */ - public T calc(IntFunction calc) { - calc_ = calc; - return (T) this; - } - - /** - * Returns the default value. - * - * @return the default value - */ - protected Object defaultValue() { - return defaultValue_; - } - - /** - * Sets the initial value to set the {@link java.util.Properties property} to, if not already defined. - * - * @param defaultValue the default value - */ - public T defaultValue(Object defaultValue) { - defaultValue_ = defaultValue; - return (T) this; - } - - /** - * Indicates that the {@link java.util.Properties property} is to be deleted. - */ - public T delete() { - isDelete_ = true; - return (T) this; - } - - /** - * Returns {@code true} if the {@link java.util.Properties property} is to be deleted. - * - * @return {@code true} or {@code false} - */ - protected boolean isDelete() { - return isDelete_; - } - - /** - * Returns the key of the {@link java.util.Properties property}. - * - * @return the key - */ - protected String key() { - return key_; - } - - /** - * Sets the key of the {@link java.util.Properties property}. - * - * @param key the {@link java.util.Properties property} key - * @return this instance - */ - public T key(String key) { - key_ = key; - return (T) this; - } - - /** - * Returns the new value to set the {@link java.util.Properties property)} to. - * - * @return the new value - */ - protected Object newValue() { - return newValue_; - } - - /** - * Sets a new value for {@link java.util.Properties property}. - * - * @param newValue the new value - */ - protected void newValue(Object newValue) { - newValue_ = newValue; - } - - /** - * Returns the pattern. - * - * @return the pattern - */ - protected Object pattern() { - return pattern_; - } - - /** - * Sets the {@link java.util.Formatter} pattern. - * - * @param pattern the pattern - */ - public T pattern(Object pattern) { - pattern_ = pattern; - return (T) this; - } -} diff --git a/src/main/java/rife/bld/extension/propertyfile/EntryDate.java b/src/main/java/rife/bld/extension/propertyfile/EntryDate.java deleted file mode 100644 index 8990119..0000000 --- a/src/main/java/rife/bld/extension/propertyfile/EntryDate.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright 2023-2025 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. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rife.bld.extension.propertyfile; - -import java.time.*; -import java.util.Calendar; -import java.util.Date; - -/** - * Declares the modifications to be made to a {@link java.util.Properties Date-based property}. - * - * @author Erik C. Thauvin - * @since 1.0 - */ -public class EntryDate extends EntryBase { - private EntryDate.Units unit_ = EntryDate.Units.DAY; - - /** - * Creates a new {@link EntryDate entry}. - * - * @param key the required property key - */ - public EntryDate(String key) { - super(key); - } - - /** - * Sets the new {@link java.util.Properties property} value to now. - * - * @return this instance - */ - public EntryDate now() { - newValue("now"); - return this; - } - - /** - * Sets the {@link java.time.format.DateTimeFormatter DateTimeFormatter} pattern. - * - * @param pattern the pattern - */ - public EntryDate pattern(String pattern) { - super.pattern(pattern); - return this; - } - - /** - * Sets the new {@link java.util.Properties property} value to an {@link Instant} - * - * @param instant the {@link Instant} to set the value to - * @return this instance - */ - public EntryDate set(Instant instant) { - newValue(instant); - return this; - } - - /** - * Sets the new {@link java.util.Properties property} value to a {@link LocalDate} - * - * @param date the {@link LocalDate} to set the value to - * @return this instance - */ - public EntryDate set(LocalDate date) { - newValue(date); - return this; - } - - /** - * Sets the new {@link java.util.Properties property} value to a {@link LocalDateTime} - * - * @param date the {@link LocalDateTime} to set the value to - * @return this instance - */ - public EntryDate set(LocalDateTime date) { - newValue(date); - return this; - } - - /** - * Sets the new {@link java.util.Properties property} value to a {@link ZonedDateTime} - * - * @param date the {@link ZonedDateTime} to set the value to - * @return this instance - */ - public EntryDate set(ZonedDateTime date) { - newValue(date); - return this; - } - - /** - * Sets the new {@link java.util.Properties property} value to a {@link LocalTime} - * - * @param time the {@link LocalTime} to set the value to - * @return this instance - */ - public EntryDate set(LocalTime time) { - newValue(time); - return this; - } - - /** - * Sets the new {@link java.util.Properties property} value to a {@link Calendar} - * - * @param cal the {@link Calendar} to set the value to - * @return this instance - */ - public EntryDate set(Calendar cal) { - newValue(cal); - return this; - } - - /** - * Sets the new {@link java.util.Properties property} value to a {@link Date} - * - * @param date the {@link Date} to set the value to - * @return this instance - */ - public EntryDate set(Date date) { - newValue(date); - return this; - } - - /** - * Returns the {@link EntryDate.Units unit}. - * - * @return the unit - */ - public EntryDate.Units unit() { - return unit_; - } - - /** - * Sets the {@link Units unit} value to apply to calculations for {@link EntryDate}. - * - * @param unit the {@link Units unit} - * @return this instance - */ - public EntryDate unit(Units unit) { - unit_ = unit; - return this; - } - - /** - * The units available for {@link EntryDate} calculations. - * - *
    - *
  • {@link Units#SECOND SECOND}
  • - *
  • {@link Units#MINUTE MINUTE}
  • - *
  • {@link Units#HOUR HOUR}
  • - *
  • {@link Units#DAY DAY}
  • - *
  • {@link Units#WEEK WEEK}
  • - *
  • {@link Units#MONTH MONTH}
  • - *
  • {@link Units#YEAR YEAR}
  • - *
- */ - public enum Units { - /** - * Second units. - */ - SECOND, - /** - * Minute units. - */ - MINUTE, - /** - * Hour units. - */ - HOUR, - /** - * Day units. - */ - DAY, - /** - * Week units. - */ - WEEK, - /** - * Month units. - */ - MONTH, - /** - * Year units. - */ - YEAR - } -} diff --git a/src/main/java/rife/bld/extension/propertyfile/EntryInt.java b/src/main/java/rife/bld/extension/propertyfile/EntryInt.java deleted file mode 100644 index b2e0e91..0000000 --- a/src/main/java/rife/bld/extension/propertyfile/EntryInt.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2023-2025 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. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rife.bld.extension.propertyfile; - -/** - * Declares the modifications to be made to an {@link java.util.Properties Integer-based property}. - * - * @author Erik C. Thauvin - * @since 1.0 - */ -public class EntryInt extends EntryBase { - /** - * Creates a new {@link EntryInt entry}. - * - * @param key the required property key - */ - public EntryInt(String key) { - super(key); - } - - /** - * Sets the {@link java.text.DecimalFormat DecimalFormat} pattern. - * - * @param pattern the pattern - */ - public EntryInt pattern(String pattern) { - super.pattern(pattern); - return this; - } - - /** - * Sets the new {@link java.util.Properties property} value to an integer. - * - * @param i The integer to set the value to - * @return this instance - */ - public EntryInt set(int i) { - newValue(i); - return this; - } -} diff --git a/src/main/java/rife/bld/extension/propertyfile/PropertyFileOperation.java b/src/main/java/rife/bld/extension/propertyfile/PropertyFileOperation.java index f51b288..bd6757a 100644 --- a/src/main/java/rife/bld/extension/propertyfile/PropertyFileOperation.java +++ b/src/main/java/rife/bld/extension/propertyfile/PropertyFileOperation.java @@ -1,32 +1,29 @@ /* - * 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. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * https://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package rife.bld.extension.propertyfile; -import rife.bld.BaseProject; +import rife.bld.Project; import rife.bld.operations.AbstractOperation; -import rife.bld.operations.exceptions.ExitStatusException; import java.io.File; -import java.nio.file.Path; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; -import java.util.logging.Level; -import java.util.logging.Logger; /** * Creates or applies edits to a {@link Properties Properties} file. @@ -35,22 +32,14 @@ import java.util.logging.Logger; * @since 1.0 */ public class PropertyFileOperation extends AbstractOperation { - private static final Logger LOGGER = Logger.getLogger(PropertyFileOperation.class.getName()); - private final List> entries_ = new ArrayList<>(); - private String comment_ = ""; - private boolean failOnWarning_; - private File file_; - private BaseProject project_; + private final List entries = new ArrayList<>(); + private final Project project; + private File file; + private String comment = ""; + private boolean failOnWarning; - /** - * Sets the comment to be inserted at the top of the {@link java.util.Properties} file. - * - * @param comment the header comment - * @return this instance - */ - public PropertyFileOperation comment(String comment) { - comment_ = comment; - return this; + public PropertyFileOperation(Project project) { + this.project = project; } /** @@ -58,10 +47,54 @@ public class PropertyFileOperation extends AbstractOperation entry) { - entries_.add(entry); + @SuppressWarnings("unused") + public PropertyFileOperation entry(Entry entry) { + entries.add(entry); + return this; + } + + /** + * Sets the location of the {@link java.util.Properties} file to be edited. + * + * @param file the file to be edited + */ + @SuppressWarnings("unused") + public PropertyFileOperation file(String file) { + this.file = new File(file); + return this; + } + + /** + * Sets the location of the {@link java.util.Properties} file to be edited. + * + * @param file the file to be edited + */ + @SuppressWarnings("unused") + public PropertyFileOperation file(File file) { + this.file = file; + return this; + } + + /** + * Sets the command to return a failure on any warnings. + * + * @param failOnWarning if set to {@code true}, the task will fail on any warnings. + */ + @SuppressWarnings("unused") + public PropertyFileOperation failOnWarning(boolean failOnWarning) { + this.failOnWarning = failOnWarning; + return this; + } + + /** + * Sets the comment to be inserted at the top of the {@link java.util.Properties} file. + * + * @param comment the header comment + */ + @SuppressWarnings("unused") + public PropertyFileOperation comment(String comment) { + this.comment = comment; return this; } @@ -70,139 +103,46 @@ public class PropertyFileOperation extends AbstractOperation + success = PropertyFileUtils.processDate(commandName, properties, entry, failOnWarning); + case INT -> + success = PropertyFileUtils.processInt(commandName, properties, entry, failOnWarning); + default -> success = PropertyFileUtils.processString(properties, entry); } } } } } - - if (success) { - PropertyFileUtils.saveProperties(file_, comment_, properties); - } - } - - /** - * Sets the {@link #execute() execution} to return a failure on any warnings. - * - * @param failOnWarning if set to {@code true}, the execution will fail on any warnings. - * @return this instance - */ - public PropertyFileOperation failOnWarning(boolean failOnWarning) { - failOnWarning_ = failOnWarning; - return this; - } - - /** - * Sets the location of the {@link java.util.Properties} file to be edited. - * - * @param file the file to be edited - * @return this instance - */ - public PropertyFileOperation file(File file) { - file_ = file; - return this; - } - - /** - * Sets the location of the {@link java.util.Properties} file to be edited. - * - * @param file the file to be edited - * @return this instance - */ - public PropertyFileOperation file(String file) { - return file(new File(file)); - } - - /** - * Retrieves the location of the {@link java.util.Properties} file to be edited. - * - * @return the properties file - */ - public File file() { - return file_; - } - - /** - * Sets the location of the {@link java.util.Properties} file to be edited. - * - * @param file the file to be edited - * @return this instance - */ - public PropertyFileOperation file(Path file) { - return file(file.toFile()); - } - - /** - * Creates a new operation. - * - * @param project the project - * @return this instance - */ - public PropertyFileOperation fromProject(BaseProject project) { - project_ = project; - return this; - } - - /** - * Logs a warning. - * - * @param command The command name - * @param message the message log - * @throws ExitStatusException if a {@link Level#SEVERE} exception occurs - */ - private void warn(String command, String message) throws ExitStatusException { - if (failOnWarning_) { - if (LOGGER.isLoggable(Level.SEVERE) && !silent()) { - LOGGER.log(Level.SEVERE, '[' + command + "] " + message); - throw new ExitStatusException(ExitStatusException.EXIT_FAILURE); - } - } else { - if (LOGGER.isLoggable(Level.WARNING) && !silent()) { - LOGGER.warning('[' + command + "] " + message); - } + if (failOnWarning && !success) { + throw new RuntimeException("Properties file configuration failed: " + file); + } else if (success) { + PropertyFileUtils.saveProperties(file, comment, properties); } } } diff --git a/src/main/java/rife/bld/extension/propertyfile/PropertyFileUtils.java b/src/main/java/rife/bld/extension/propertyfile/PropertyFileUtils.java index c27ec48..eb47799 100644 --- a/src/main/java/rife/bld/extension/propertyfile/PropertyFileUtils.java +++ b/src/main/java/rife/bld/extension/propertyfile/PropertyFileUtils.java @@ -1,59 +1,120 @@ /* - * 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. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * https://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package rife.bld.extension.propertyfile; -import rife.bld.operations.exceptions.ExitStatusException; +import rife.bld.extension.propertyfile.Entry.Units; +import rife.tools.Localization; +import javax.imageio.IIOException; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.StandardOpenOption; import java.text.DecimalFormat; import java.text.ParseException; -import java.time.*; -import java.time.format.DateTimeFormatter; +import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; +import java.util.Map; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; + /** - * Collection of common methods used in this project. + * Collection of utility-type methods commonly used in this project. * * @author Erik C. Thauvin * @since 1.0 */ public final class PropertyFileUtils { - private static final Logger LOGGER = Logger.getLogger(PropertyFileUtils.class.getName()); + private final static Logger LOGGER = Logger.getLogger(PropertyFileUtils.class.getName()); + + private final static Map CALENDAR_FIELDS = + Map.of(Units.MILLISECOND, Calendar.MILLISECOND, + Units.SECOND, Calendar.SECOND, + Units.MINUTE, Calendar.MINUTE, + Units.HOUR, Calendar.HOUR_OF_DAY, + Units.DAY, Calendar.DATE, + Units.WEEK, Calendar.WEEK_OF_YEAR, + Units.MONTH, Calendar.MONTH, + Units.YEAR, Calendar.YEAR); private PropertyFileUtils() { // no-op } + /** + * Processes a date {@link Properties property}. + * + * @param command the issuing command + * @param p the {@link Properties property} + * @param entry the {@link Entry} containing the {@link Properties property} edits + * @return {@code true} if successful + */ + public static boolean processDate(String command, Properties p, Entry entry, boolean failOnWarning) { + var success = true; + var cal = Calendar.getInstance(); + String value = PropertyFileUtils.currentValue(p.getProperty(entry.getKey()), entry.getDefaultValue(), + entry.getNewValue()); + + var pattern = entry.getPattern(); + SimpleDateFormat fmt; + if (pattern.isBlank()) { + fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm", Localization.getLocale()); + } else { + fmt = new SimpleDateFormat(entry.getPattern(), Localization.getLocale()); + } + + if ("now".equalsIgnoreCase(value) || value.isBlank()) { + cal.setTime(new Date()); + } else { + try { + cal.setTime(fmt.parse(value)); + } catch (ParseException pe) { + warn(command, "Non-date value for \"" + entry.getKey() + "\" --> " + pe.getMessage(), + pe, failOnWarning); + success = false; + } + } + + var offset = 0; + + if (entry.getCalc() != null) { + offset = entry.getCalc().apply(offset); + } + + //noinspection MagicConstant + cal.add(CALENDAR_FIELDS.getOrDefault(entry.getUnit(), Calendar.DATE), offset); + + p.setProperty(entry.getKey(), fmt.format(cal.getTime())); + + return success; + } + /** * Returns the new value, value or default value depending on which is specified. * * @param value the value - * @param defaultValue the default value * @param newValue the new value - * @return the object + * @param defaultValue the default value + * @return the current value */ - public static Object currentValue(String value, Object defaultValue, Object newValue) { + public static String currentValue(String value, String defaultValue, String newValue) { if (newValue != null) { return newValue; } else if (value == null) { @@ -63,160 +124,37 @@ public final class PropertyFileUtils { } } - /** - * Loads a {@link Properties properties} file. - * - * @param command the issuing command - * @param file the file location - * @param p the {@link Properties properties} to load into. - * @return the boolean - * @throws ExitStatusException if an error occurred - */ - public static boolean loadProperties(String command, File file, Properties p, boolean silent) - throws ExitStatusException { - boolean success = true; - if (file != null) { - if (file.exists()) { - try (var propStream = Files.newInputStream(file.toPath(), StandardOpenOption.READ)) { - p.load(propStream); - } catch (IOException ioe) { - warn(command, "Could not load properties file: " + ioe.getMessage(), true, silent); - success = false; - } - } - } else { - warn(command, "Please specify the properties file location.", true, silent); - success = false; - } - return success; - } - - private static String objectToString(Object o) { - if (o == null) { - return ""; - } else { - return String.valueOf(o); - } - } - - /** - * Processes a date {@link Properties property}. - * - * @param p the {@link Properties property} - * @param entry the {@link Entry} containing the {@link Properties property} edits - * @throws DateTimeException if a parsing error occurs - */ - @SuppressWarnings("PMD.ExceptionAsFlowControl") - public static void processDate(Properties p, EntryDate entry) throws IllegalArgumentException { - var currentValue = currentValue(null, entry.defaultValue(), entry.newValue()); - var pattern = objectToString(entry.pattern()); - - var dateValue = String.valueOf(currentValue); - if (pattern != null && !pattern.isBlank()) { - var offset = 0; - - if (entry.calc() != null) { - offset = entry.calc().apply(offset); - } - - var dtf = DateTimeFormatter.ofPattern(pattern); - var unit = entry.unit(); - - try { - if (currentValue instanceof String) { - if ("now".equalsIgnoreCase((String) currentValue)) { - currentValue = ZonedDateTime.now(); - } else { - throw new DateTimeException("Excepted: Calendar, Date or java.time."); - } - } else if (currentValue instanceof LocalDateTime) { - currentValue = ((LocalDateTime) currentValue).atZone(ZoneId.systemDefault()); - } else if (currentValue instanceof Date) { - currentValue = ((Date) currentValue).toInstant().atZone(ZoneId.systemDefault()); - } else if (currentValue instanceof Calendar) { - currentValue = ((Calendar) currentValue).toInstant().atZone(ZoneId.systemDefault()); - } else if (currentValue instanceof Instant) { - currentValue = ((Instant) currentValue).atZone(ZoneId.systemDefault()); - } - - if (currentValue instanceof LocalDate) { - if (offset != 0) { - if (unit == EntryDate.Units.DAY) { - currentValue = ((LocalDate) currentValue).plusDays(offset); - } else if (unit == EntryDate.Units.MONTH) { - currentValue = ((LocalDate) currentValue).plusMonths(offset); - } else if (unit == EntryDate.Units.WEEK) { - currentValue = ((LocalDate) currentValue).plusWeeks(offset); - } else if (unit == EntryDate.Units.YEAR) { - currentValue = ((LocalDate) currentValue).plusYears(offset); - } - } - dateValue = dtf.format((LocalDate) currentValue); - } else if (currentValue instanceof LocalTime) { - if (offset != 0) { - if (unit == EntryDate.Units.SECOND) { - currentValue = ((LocalTime) currentValue).plusSeconds(offset); - } else if (unit == EntryDate.Units.MINUTE) { - currentValue = ((LocalTime) currentValue).plusMinutes(offset); - } else if (unit == EntryDate.Units.HOUR) { - currentValue = ((LocalTime) currentValue).plusHours(offset); - } - } - dateValue = dtf.format((LocalTime) currentValue); - } else if (currentValue instanceof ZonedDateTime) { - if (offset != 0) { - if (unit == EntryDate.Units.DAY) { - currentValue = ((ZonedDateTime) currentValue).plusDays(offset); - } else if (unit == EntryDate.Units.MONTH) { - currentValue = ((ZonedDateTime) currentValue).plusMonths(offset); - } else if (unit == EntryDate.Units.WEEK) { - currentValue = ((ZonedDateTime) currentValue).plusWeeks(offset); - } else if (unit == EntryDate.Units.YEAR) { - currentValue = ((ZonedDateTime) currentValue).plusYears(offset); - } else if (unit == EntryDate.Units.SECOND) { - currentValue = ((ZonedDateTime) currentValue).plusSeconds(offset); - } else if (unit == EntryDate.Units.MINUTE) { - currentValue = ((ZonedDateTime) currentValue).plusMinutes(offset); - } else if (unit == EntryDate.Units.HOUR) { - currentValue = ((ZonedDateTime) currentValue).plusHours(offset); - } - } - dateValue = dtf.format((ZonedDateTime) currentValue); - } - } catch (DateTimeException dte) { - throw new IllegalArgumentException( - "Non-date value for \"" + entry.key() + "\" --> " + dte.getMessage(), dte); - } - } - p.setProperty(entry.key(), dateValue); - } - /** * Processes an integer {@link Properties property}. * - * @param p the {@link Properties property} - * @param entry the {@link Entry} containing the {@link Properties property} edits - * @throws NumberFormatException if a parsing error occurs + * @param command the issuing command + * @param p the {@link Properties property} + * @param entry the {@link Entry} containing the {@link Properties property} edits + * @return {@code true} if successful */ - public static void processInt(Properties p, EntryInt entry) throws IllegalArgumentException { + public static boolean processInt(String command, Properties p, Entry entry, boolean failOnWarning) { + var success = true; int intValue = 0; try { - var fmt = new DecimalFormat(objectToString(entry.pattern())); - var currentValue = currentValue(p.getProperty(entry.key()), entry.defaultValue(), entry.newValue()); + var fmt = new DecimalFormat(entry.getPattern()); + String value = PropertyFileUtils.currentValue(p.getProperty(entry.getKey()), entry.getDefaultValue(), + entry.getNewValue()); - if (currentValue != null) { - intValue = fmt.parse(String.valueOf(currentValue)).intValue(); + if (value != null) { + intValue = fmt.parse(value).intValue(); } - if (entry.calc() != null) { - intValue = entry.calc().apply(intValue); + if (entry.getCalc() != null) { + intValue = entry.getCalc().apply(intValue); } - - p.setProperty(entry.key(), fmt.format(intValue)); + p.setProperty(entry.getKey(), fmt.format(intValue)); } catch (NumberFormatException | ParseException e) { - throw new IllegalArgumentException( - "Non-integer value for \"" + entry.key() + "\" --> " + e.getMessage(), e); + warn(command, "Non-integer value for \"" + entry.getKey() + "\" --> " + e.getMessage(), e, + failOnWarning); + success = false; } + + return success; } /** @@ -224,31 +162,30 @@ public final class PropertyFileUtils { * * @param p the {@link Properties property} * @param entry the {@link Entry} containing the {@link Properties property} edits + * @return {@code true} if successful */ - public static void processString(Properties p, Entry entry) { - var currentValue = currentValue(p.getProperty(entry.key()), entry.defaultValue(), entry.newValue()); + public static boolean processString(Properties p, Entry entry) { + var value = PropertyFileUtils.currentValue(p.getProperty(entry.getKey()), entry.getDefaultValue(), + entry.getNewValue()); - p.setProperty(entry.key(), String.format(String.valueOf(currentValue), entry.pattern())); + p.setProperty(entry.getKey(), value); - if (entry.modify() != null && entry.modifyValue() != null) { - var modify = entry.modify().apply(p.getProperty(entry.key()), entry.modifyValue()); - p.setProperty(entry.key(), String.format(modify, entry.pattern())); + if (entry.getModify() != null && entry.getModifyValue() != null) { + p.setProperty(entry.getKey(), entry.getModify().apply(p.getProperty(entry.getKey()), entry.getModifyValue())); } + + return true; } /** - * Saves a {@link Properties properties} file. + * Logs a warning. * - * @param file the file location - * @param comment the header comment - * @param p the {@link Properties} to save into the file - * @throws IOException the io exception + * @param command the issuing command + * @param message the message to log */ - public static void saveProperties(File file, String comment, Properties p) throws IOException { - try (var output = Files.newOutputStream(file.toPath())) { - p.store(output, comment); - } catch (IOException ioe) { - throw new IOException("An IO error occurred while saving the Properties file: " + file, ioe); + static void warn(String command, String message) { + if (LOGGER.isLoggable(Level.WARNING)) { + LOGGER.warning('[' + command + "] " + message); } } @@ -257,20 +194,57 @@ public final class PropertyFileUtils { * * @param command The command name * @param message the message log - * @param failOnWarning logs and throws exception if set to {@code true} - * @throws ExitStatusException if a {@link Level#SEVERE} exception occurs + * @param e the related exception + * @param failOnWarning skips logging the exception if set to {@code false} */ - static void warn(String command, String message, boolean failOnWarning, boolean silent) - throws ExitStatusException { - if (failOnWarning) { - if (LOGGER.isLoggable(Level.SEVERE) && !silent) { - LOGGER.log(Level.SEVERE, '[' + command + "] " + message); - } - throw new ExitStatusException(ExitStatusException.EXIT_FAILURE); - } else { - if (LOGGER.isLoggable(Level.WARNING) && !silent) { + static void warn(String command, String message, Exception e, boolean failOnWarning) { + if (LOGGER.isLoggable(Level.WARNING)) { + if (failOnWarning) { + LOGGER.log(Level.WARNING, '[' + command + "] " + message, e); + } else { LOGGER.warning('[' + command + "] " + message); } } } + + /** + * Loads a {@link Properties properties} file. + * + * @param command the issuing command + * @param file the file location. + * @param p the {@link Properties properties} to load into. + * @return {@code true} if successful + */ + public static boolean loadProperties(String command, File file, Properties p) { + boolean success = true; + if (file != null) { + if (file.exists()) { + try (var propStream = Files.newInputStream(file.toPath(), StandardOpenOption.READ)) { + p.load(propStream); + } catch (IOException ioe) { + warn(command, "Could not load properties file: " + ioe.getMessage(), ioe, true); + success = false; + } + } + } else { + warn(command, "Please specify the properties file location."); + success = false; + } + return success; + } + + /** + * Saves a {@link Properties properties} file. + * + * @param file the file location + * @param comment the header comment + * @param p the {@link Properties} to save into the file + */ + public static void saveProperties(File file, String comment, Properties p) throws IOException { + try (var output = Files.newOutputStream(file.toPath())) { + p.store(output, comment); + } catch (IIOException ioe) { + throw new IIOException("An IO error occurred while saving the Properties file: " + file, ioe); + } + } } diff --git a/src/test/java/rife/bld/extension/propertyfile/PropertyFileOperationTest.java b/src/test/java/rife/bld/extension/propertyfile/PropertyFileOperationTest.java deleted file mode 100644 index a0d949d..0000000 --- a/src/test/java/rife/bld/extension/propertyfile/PropertyFileOperationTest.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2023-2025 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. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rife.bld.extension.propertyfile; - -import org.assertj.core.api.AutoCloseableSoftAssertions; -import org.junit.jupiter.api.Test; -import rife.bld.Project; -import rife.bld.operations.exceptions.ExitStatusException; - -import java.io.File; -import java.nio.file.Files; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.Properties; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatCode; -import static rife.bld.extension.propertyfile.Calc.ADD; - -class PropertyFileOperationTest { - @Test - @SuppressWarnings("PMD.AvoidDuplicateLiterals") - void testExecute() throws Exception { - var tmpFile = File.createTempFile("property-file-", "properties"); - tmpFile.deleteOnExit(); - - new PropertyFileOperation() - .fromProject(new Project()) - .file(tmpFile) - .comment("This is a comment") - .failOnWarning(true) - .entry(new EntryInt("version.major").defaultValue(0).calc(ADD)) - .entry(new EntryInt("version.minor").set(0)) - .entry(new EntryInt("version.patch").set(0)) - .entry(new EntryDate("build.date").now().pattern("yyyy-MM-dd")) - .execute(); - - var p = new Properties(); - p.load(Files.newInputStream(tmpFile.toPath())); - - try (var softly = new AutoCloseableSoftAssertions()) { - softly.assertThat(p.getProperty("version.major")).as("major").isEqualTo("1"); - softly.assertThat(p.getProperty("version.minor")).as("minor").isEqualTo("0"); - softly.assertThat(p.getProperty("version.patch")).as("patch").isEqualTo("0"); - softly.assertThat(p.getProperty("build.date")).as("date") - .isEqualTo(LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE)); - } - - new PropertyFileOperation() - .fromProject(new Project()) - .file(tmpFile.getAbsolutePath()) - .entry(new EntryInt("version.major").calc(c -> c + 2)) - .execute(); - - p.load(Files.newInputStream(tmpFile.toPath())); - assertThat(p.getProperty("version.major")).as("major+2").isEqualTo("3"); - - new PropertyFileOperation() - .fromProject(new Project()) - .file(tmpFile) - .entry(new EntryInt("build.date").delete()) - .execute(); - - p.clear(); - p.load(Files.newInputStream(tmpFile.toPath())); - - assertThat(p.getProperty("build.date")).as("dalete build.date").isNull(); - assertThat(p).as("version keys").containsKeys("version.major", "version.minor", "version.patch"); - } - - @Test - void testExecuteNoProject() { - var op = new PropertyFileOperation(); - assertThatCode(op::execute).isInstanceOf(ExitStatusException.class); - } - - @Test - void testFile() { - var foo = new File("foo"); - - var op = new PropertyFileOperation().file("foo"); - assertThat(op.file()).as("as string").isEqualTo(foo); - - op = new PropertyFileOperation().file(foo); - assertThat(op.file()).as("as file").isEqualTo(foo); - - op = new PropertyFileOperation().file(foo.toPath()); - assertThat(op.file()).as("as path").isEqualTo(foo); - } -} diff --git a/src/test/java/rife/bld/extension/propertyfile/PropertyFileUtilsTest.java b/src/test/java/rife/bld/extension/propertyfile/PropertyFileUtilsTest.java index a3b6695..5471073 100644 --- a/src/test/java/rife/bld/extension/propertyfile/PropertyFileUtilsTest.java +++ b/src/test/java/rife/bld/extension/propertyfile/PropertyFileUtilsTest.java @@ -1,28 +1,27 @@ /* - * 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. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * https://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package rife.bld.extension.propertyfile; import org.junit.jupiter.api.Test; -import rife.bld.operations.exceptions.ExitStatusException; import rife.tools.Localization; import java.io.File; -import java.time.*; -import java.util.Calendar; +import java.io.IOException; +import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; @@ -37,229 +36,122 @@ import static rife.bld.extension.propertyfile.Calc.SUB; * @author Erik C. Thauvin * @since 1.0 */ -@SuppressWarnings("PMD.AvoidDuplicateLiterals") class PropertyFileUtilsTest { - final static Properties p = new Properties(); - final static String t = "test"; - - public Entry newEntry() { - p.clear(); - return new Entry("version.major").set("1"); - } - - public EntryDate newEntryDate() { - p.clear(); - return new EntryDate("aDate").pattern("D"); - } - - public EntryInt newEntryInt() { - p.clear(); - return new EntryInt("version.patch"); - } - - @Test - void parseDateSub() { - var entryDate = newEntryDate().calc(SUB); - PropertyFileUtils.processDate(p, entryDate.now()); - assertThat(p.getProperty(entryDate.key())).as("processDate(now-3)").isEqualTo(String.valueOf( - LocalDateTime.now().minusDays(1).getDayOfYear())); - - entryDate.calc(v -> v - 2); - PropertyFileUtils.processDate(p, entryDate.now()); - assertThat(p.getProperty(entryDate.key())).as("processDate(now-2)").isEqualTo(String.valueOf( - LocalDateTime.now().minusDays(2).getDayOfYear())); - - entryDate.calc(SUB); - PropertyFileUtils.processDate(p, entryDate.set(new Date())); - assertThat(p.getProperty(entryDate.key())).as("processDate(date-1)").isEqualTo(String.valueOf( - LocalDateTime.now().minusDays(1).getDayOfYear())); - - entryDate.calc(v -> v - 2); - PropertyFileUtils.processDate(p, entryDate.set(Calendar.getInstance())); - assertThat(p.getProperty(entryDate.key())).as("processDate(cal-2)").isEqualTo(String.valueOf( - LocalDateTime.now().minusDays(2).getDayOfYear())); - - entryDate.calc(v -> v - 3); - PropertyFileUtils.processDate(p, entryDate.set(LocalDate.now())); - assertThat(p.getProperty(entryDate.key())).as("processDate(LocalDate-3)").isEqualTo(String.valueOf( - LocalDateTime.now().minusDays(3).getDayOfYear())); - } - - @Test - void parseIntSubTest() { - var entryInt = newEntryInt().calc(SUB).pattern("0000"); - PropertyFileUtils.processInt(p, entryInt.defaultValue("0017")); - assertThat(p.getProperty(entryInt.key())).as("sub(0017)").isEqualTo("0016"); - - PropertyFileUtils.processInt(p, entryInt.set(16).calc(v -> v - 3)); - assertThat(p.getProperty(entryInt.key())).as("sub(16)-3").isEqualTo("0013"); - } - - @Test - @SuppressWarnings("PMD.AvoidDuplicateLiterals") - void parseStringAppend() { - var entry = newEntry(); - PropertyFileUtils.processString(p, entry.set(1)); - PropertyFileUtils.processString(p, entry.modify("-foo", String::concat)); - assertThat(p.getProperty(entry.key())).as(String.format("processString(%s, %s)", entry.key(), - entry.newValue())).isEqualTo("1-foo"); - } - - @Test - void parseStringCap() { - var entry = newEntry(); - PropertyFileUtils.processString(p, entry.set(t).modify("", (v, s) -> v.toUpperCase(Localization.getLocale()))); - assertThat(p.getProperty(entry.key())).as("capitalize").isEqualTo(t.toUpperCase(Localization.getLocale())); - - } - - @Test - void parseStringCat() { - var entry = newEntry(); - entry.set(t).modify("-foo", String::concat); - PropertyFileUtils.processString(p, entry); - assertThat(p.getProperty(entry.key())).as("replace").isEqualTo(t + "-foo"); - } - - @Test - void parseStringFormat() { - var entry = new Entry("foo").set("%.2f").pattern(3.14159f); - PropertyFileUtils.processString(p, entry); - assertThat(p.getProperty(entry.key())).as("format").isEqualTo("3.14"); - } - - - @Test - void parseStringPrepend() { - var entry = newEntry(); - PropertyFileUtils.processString(p, entry.set(1)); - PropertyFileUtils.processString(p, entry.modify("foo-", (v, s) -> s + v)); - assertThat(p.getProperty(entry.key())).as(String.format("processString(%s, %s)", entry.key(), entry.newValue())) - .isEqualTo("foo-1"); - } - - @Test - void parseStringReplace() { - var entry = newEntry(); - entry.set(t).modify("T", (v, s) -> v.replace("t", s)); - PropertyFileUtils.processString(p, entry); - assertThat(p.getProperty(entry.key())).as("replace(t -> T)").isEqualTo("TesT"); - } - - @Test - void parseStringSub() { - var entry = newEntry(); - PropertyFileUtils.processString(p, entry.set(t).modify((v, s) -> v.substring(1))); - assertThat(p.getProperty(entry.key())).as("substring(1)").isEqualTo(t.substring(1)); - } - - @Test - void parseTimeTest() { - var entry = new EntryDate("time").pattern("m"); - var time = LocalTime.now(); - - entry.calc(ADD); - PropertyFileUtils.processDate(p, entry.set(time).unit(EntryDate.Units.MINUTE)); - assertThat(p.getProperty(entry.key())).as("processDate(now+1)") - .isEqualTo(String.valueOf(time.plusMinutes(1).getMinute())); - - entry.calc(SUB); - PropertyFileUtils.processDate(p, entry.set(time).unit(EntryDate.Units.HOUR).pattern("H")); - assertThat(p.getProperty(entry.key())).as("processDate(now+1)") - .isEqualTo(String.valueOf(time.minusHours(1).getHour())); - } - - @Test - void processDateAddTest() { - var entryDate = newEntryDate(); - entryDate.calc(ADD); - PropertyFileUtils.processDate(p, entryDate.now()); - assertThat(p.getProperty(entryDate.key())).as("processDate(now+1)").isEqualTo(String.valueOf( - LocalDateTime.now().plusDays(1).getDayOfYear())); - - PropertyFileUtils.processDate(p, entryDate.now().calc(v -> v + 3)); - assertThat(p.getProperty(entryDate.key())).as("processDate(now+3)").isEqualTo(String.valueOf( - LocalDateTime.now().plusDays(3).getDayOfYear())); - - entryDate.calc(ADD); - PropertyFileUtils.processDate(p, entryDate.set(ZonedDateTime.now())); - assertThat(p.getProperty(entryDate.key())).as("processDate(ZonedDateTime+1)") - .isEqualTo(String.valueOf(LocalDateTime.now().plusDays(1).getDayOfYear())); - - PropertyFileUtils.processDate(p, entryDate.set(Instant.now()).calc(v -> v + 2)); - assertThat(p.getProperty(entryDate.key())).as("processDate(Instant+2)").isEqualTo(String.valueOf( - LocalDateTime.now().plusDays(2).getDayOfYear())); - - entryDate.calc(v -> v + 3); - PropertyFileUtils.processDate(p, entryDate.set(LocalDateTime.now())); - assertThat(p.getProperty(entryDate.key())).as("processDate(LocalDteTime+2)") - .isEqualTo(String.valueOf(LocalDateTime.now().plusDays(3).getDayOfYear())); - } - - @Test - void processIntAddTest() { - var entryInt = newEntryInt().calc(ADD).defaultValue("-1"); - PropertyFileUtils.processInt(p, entryInt); - assertThat(p.getProperty(entryInt.key())).as("add(-1)").isEqualTo("0"); - - entryInt.key("anInt").defaultValue("0"); - PropertyFileUtils.processInt(p, entryInt); - assertThat(p.getProperty(entryInt.key())).as("add(0)").isEqualTo("1"); - PropertyFileUtils.processInt(p, entryInt); - assertThat(p.getProperty(entryInt.key())).as("add(1)").isEqualTo("2"); - - entryInt.key("formatted.int").defaultValue("0013").pattern("0000"); - PropertyFileUtils.processInt(p, entryInt); - assertThat(p.getProperty(entryInt.key())).as("add(0013)").isEqualTo("0014"); - PropertyFileUtils.processInt(p, entryInt); - assertThat(p.getProperty(entryInt.key())).as("add(0014)").isEqualTo("0015"); - - entryInt.calc(v -> v + 2); - PropertyFileUtils.processInt(p, entryInt); - assertThat(p.getProperty(entryInt.key())).as("add(0015)+2").isEqualTo("0017"); - } + final Properties p = new Properties(); + final String t = "test"; @Test void processStringTest() { - var entry = newEntry(); + var entry = new Entry("version.major").set("1"); + PropertyFileUtils.processString(p, entry); - assertThat(entry.newValue()).as(String.format("processString(%s, %s)", entry.key(), entry.newValue())) - .isEqualTo(p.getProperty(entry.key())); + assertThat(entry.getNewValue()).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue())) + .isEqualTo(p.getProperty(entry.getKey())); - entry.key("version.minor"); + entry.setKey("version.minor"); PropertyFileUtils.processString(p, entry.set(0)); - assertThat(entry.newValue().toString()).as(String.format("processString(%s, %s)", entry.key(), entry.newValue())) - .isEqualTo(p.getProperty(entry.key())); + assertThat(entry.getNewValue()).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue())) + .isEqualTo(p.getProperty(entry.getKey())); + + // APPEND + PropertyFileUtils.processString(p, entry.modify("-foo", String::concat)); + assertThat(p.getProperty(entry.getKey())).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue())) + .isEqualTo("0-foo"); + + // PREPEND + PropertyFileUtils.processString(p, entry.modify("foo-", (v, s) -> s + v)); + assertThat(p.getProperty(entry.getKey())).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue())) + .isEqualTo("foo-0"); + // CAP + PropertyFileUtils.processString(p, entry.set(t).modify((v, s) -> v.toUpperCase(Localization.getLocale()))); + assertThat(p.getProperty(entry.getKey())).as("capitalize").isEqualTo(t.toUpperCase(Localization.getLocale())); + + // REPLACE + entry.set(t).setModify("T", (v, s) -> v.replace("t", s)); + PropertyFileUtils.processString(p, entry); + assertThat(p.getProperty(entry.getKey())).as("replace").isEqualTo("TesT"); + + // SUBSTRING + entry.set(t).setModify((v, s) -> v.substring(1)); + PropertyFileUtils.processString(p, entry); + assertThat(p.getProperty(entry.getKey())).as("substring").isEqualTo(t.substring(1)); } @Test - void savePropertiesTest() throws Exception { - var p = new Properties(); - var test = "test"; + void processIntTest() { + var entry = new Entry("version.patch").type(Entry.Types.INT); - p.put(test, test); + // ADD + entry.calc(ADD); + entry.setDefaultValue("-1"); + PropertyFileUtils.processInt(t, p, entry, true); + assertThat(p.getProperty(entry.getKey())).as("add(-1)").isEqualTo("0"); - var tmp = File.createTempFile(test, ".properties"); + entry.setKey("anint"); + entry.setDefaultValue("0"); + PropertyFileUtils.processInt(t, p, entry, true); + assertThat(p.getProperty(entry.getKey())).as("add(0)").isEqualTo("1"); + PropertyFileUtils.processInt(t, p, entry, true); + assertThat(p.getProperty(entry.getKey())).as("add(1)").isEqualTo("2"); - assertThatCode(() -> PropertyFileUtils.saveProperties(tmp, "Generated file - do not modify!", p)) - .as("save properties").doesNotThrowAnyException(); + entry.setKey("formated.int"); + entry.setDefaultValue("0013"); + entry.setPattern("0000"); + PropertyFileUtils.processInt(t, p, entry, true); + assertThat(p.getProperty(entry.getKey())).as("add(0013)").isEqualTo("0014"); + PropertyFileUtils.processInt(t, p, entry, true); + assertThat(p.getProperty(entry.getKey())).as("add(0014)").isEqualTo("0015"); - assertThat(PropertyFileUtils.loadProperties(t, tmp, p, false)).as("load properties").isTrue(); + entry.setKey("formated.int"); + entry.calc(v -> v + 2); + entry.setDefaultValue("0013"); + entry.setPattern("0000"); + PropertyFileUtils.processInt(t, p, entry, true); + assertThat(p.getProperty(entry.getKey())).as("add(0013)+2").isEqualTo("0017"); - assertThat(p.getProperty(test)).as("read property").isEqualTo(test); + // SUBTRACT + entry.calc(SUB); + entry.setPattern("0000"); + PropertyFileUtils.processInt(t, p, entry, true); + assertThat(p.getProperty(entry.getKey())).as("sub(0017)").isEqualTo("0016"); - tmp.deleteOnExit(); + PropertyFileUtils.processInt(t, p, entry.calc(v -> v - 3), true); + assertThat(p.getProperty(entry.getKey())).as("sub(0017)-3").isEqualTo("0013"); } @Test - void testChangeKey() { - var entry = new Entry("foo").key("bar"); - assertThat(entry.key()).isEqualTo("bar"); + void processDateTest() { + var entry = new Entry("adate", Entry.Types.DATE).pattern("D"); + var day = new SimpleDateFormat(entry.getPattern(), Localization.getLocale()).format(new Date()); + var dayInt = Integer.parseInt(day); - entry.key("foo"); - assertThat(entry.key()).isEqualTo("foo"); + assertThat(PropertyFileUtils.processDate(t, p, entry.set("a"), false)).as("processDate(a)").isFalse(); + + PropertyFileUtils.processDate(t, p, entry.set("99"), true); + assertThat(p.getProperty(entry.getKey())).as("processDate(99)").isEqualTo("99"); + + PropertyFileUtils.processDate(t, p, entry.set("noew"), true); + assertThat(p.getProperty(entry.getKey())).as("processDate(now)").isEqualTo(day); + + // ADD + entry.setCalc(ADD); + PropertyFileUtils.processDate(t, p, entry.set(dayInt), true); + assertThat(p.getProperty(entry.getKey())).as("processDate(now+1)").isEqualTo(String.valueOf(dayInt + 1)); + + entry.setCalc(v -> v + 3); + PropertyFileUtils.processDate(t, p, entry.set(dayInt), true); + assertThat(p.getProperty(entry.getKey())).as("processDate(now+3)").isEqualTo(String.valueOf(dayInt + 3)); + + // SUBTRACT + entry.setCalc(SUB); + PropertyFileUtils.processDate(t, p, entry.set(dayInt), true); + assertThat(p.getProperty(entry.getKey())).as("processDate(now-3)").isEqualTo(String.valueOf(dayInt - 1)); + + entry.setCalc(v -> v - 2); + PropertyFileUtils.processDate(t, p, entry.set(dayInt), true); + assertThat(p.getProperty(entry.getKey())).as("processDate(now-2)").isEqualTo(String.valueOf(dayInt - 2)); } @Test @@ -276,10 +168,21 @@ class PropertyFileUtilsTest { } @Test - void testWarn() { - assertThatCode(() -> PropertyFileUtils.warn("command", "message", true, false)) - .isInstanceOf(ExitStatusException.class); - assertThatCode(() -> PropertyFileUtils.warn("command", t, false, false)) - .as("failOnWarning = false").doesNotThrowAnyException(); + void savePropertiesTest() throws IOException { + var p = new Properties(); + var test = "test"; + + p.put(test, test); + + var tmp = File.createTempFile(test, ".properties"); + + assertThatCode(() -> PropertyFileUtils.saveProperties(tmp, "Generated file - do not modify!", p)) + .as("save properties").doesNotThrowAnyException(); + + assertThat(PropertyFileUtils.loadProperties(t, tmp, p)).as("load properties").isTrue(); + + assertThat(p.getProperty(test)).as("read property").isEqualTo(test); + + tmp.deleteOnExit(); } -} +} \ No newline at end of file