diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index ddcc35c..21cca4a 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -4,29 +4,48 @@ on: [ push, pull_request, workflow_dispatch ] jobs: build-bld-project: - runs-on: ubuntu-latest - strategy: matrix: - java-version: [ 17, 19, 20 ] + 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 }} steps: - name: Checkout source repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up JDK ${{ matrix.java-version }} - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - distribution: 'zulu' + distribution: "zulu" java-version: ${{ matrix.java-version }} - - name: Grant execute permission for bld - run: chmod +x bld - - - name: Download the dependencies + - name: Download dependencies [examples] + working-directory: examples run: ./bld download - - name: Run tests with bld + - 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 run: ./bld compile test \ No newline at end of file diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index f6122cd..508f6a5 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -30,14 +30,14 @@ jobs: steps: - name: Checkout source repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 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@v1 + uses: actions/upload-pages-artifact@v3 with: # Upload generated Javadocs repository - path: 'build/javadoc/' + path: "build/javadoc/" - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v1 \ No newline at end of file + uses: actions/deploy-pages@v4 diff --git a/.idea/bld.xml b/.idea/bld.xml new file mode 100644 index 0000000..6600cee --- /dev/null +++ b/.idea/bld.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/copyright/Apache_License.xml b/.idea/copyright/Apache_License.xml index 206aa7d..4446c15 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 new file mode 100644 index 0000000..81220b4 --- /dev/null +++ b/.idea/icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/.idea/intellij-javadocs-4.0.1.xml b/.idea/intellij-javadocs-4.0.1.xml new file mode 100644 index 0000000..e537645 --- /dev/null +++ b/.idea/intellij-javadocs-4.0.1.xml @@ -0,0 +1,141 @@ + + + + + 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 f07cc1c..153a060 100644 --- a/.idea/libraries/bld.xml +++ b/.idea/libraries/bld.xml @@ -2,11 +2,12 @@ - + - + + @@ -14,4 +15,4 @@ - \ No newline at end of file + diff --git a/.idea/libraries/compile.xml b/.idea/libraries/compile.xml index 9bd86aa..99cc0c0 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 81feb0b..56ddbf1 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 13b6513..f72f7a3 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 0c58f2f..4e11c3d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - @@ -18,11 +17,6 @@ - diff --git a/.vscode/launch.json b/.vscode/launch.json index d4838b5..2d63b46 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,12 +1,6 @@ { "version": "0.2.0", "configurations": [ - { - "type": "java", - "name": "Run Main", - "request": "launch", - "mainClass": "rife.bld.extension.propertyfile.PropertyFileOperation" - }, { "type": "java", "name": "Run Tests", diff --git a/.vscode/settings.json b/.vscode/settings.json index 5dd7145..ba429d0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,13 +3,13 @@ "src/main/java", "src/main/resources", "src/test/java", - "src/bld/java" + "src/test/resources", + "src/bld/java", + "src/bld/resources" ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}bld-1.7.0-SNAPSHOT.jar", - "lib/compile/*.jar", - "lib/runtime/*.jar", - "lib/test/*.jar" + "${HOME}/.bld/dist/bld-2.2.1.jar", + "lib/**/*.jar" ] } diff --git a/README.md b/README.md index 2649957..b7ae443 100755 --- a/README.md +++ b/README.md @@ -1,15 +1,23 @@ -# [Bld](https://rife2.com/bld) Extension to Create or Modify Properties Files +# [bld](https://rife2.com/bld) Extension to Create or Modify Properties Files [![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Java](https://img.shields.io/badge/java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) -[![bld](https://img.shields.io/badge/1.7.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) +[![bld](https://img.shields.io/badge/2.2.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) [![Release](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/releases/com/uwyn/rife2/bld-property-file/maven-metadata.xml?color=blue)](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-property-file) [![Snapshot](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/snapshots/com/uwyn/rife2/bld-property-file/maven-metadata.xml?label=snapshot)](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-property-file) [![GitHub CI](https://github.com/rife2/bld-property-file/actions/workflows/bld.yml/badge.svg)](https://github.com/rife2/bld-property-file/actions/workflows/bld.yml) -To install, please refer to the [extensions documentation](https://github.com/rife2/bld/wiki/Extensions). +To install the latest version, add the following to the `lib/bld/bld-wrapper.properties` file: -To create or modifying [property files](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) with [bld](https://rife2.com/bld), add the follwing to your build file: +```properties +bld.extension-property-file=com.uwyn.rife2:bld-property-file +``` + +For more information, please refer to the [extensions](https://github.com/rife2/bld/wiki/Extensions) documentation. + +## Create or Modify Property Files + +To create or modify [property files](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) with [bld](https://rife2.com/bld), add the follwing to your build file: ```java @BuildCommand @@ -24,6 +32,7 @@ public void updateMajor() throws Exception { .execute(); } ``` + Invoking the `updateMajor` command, will create the `version.propertees`file: ```sh @@ -68,12 +77,13 @@ The [PropertyFileOperation](https://rife2.github.io/bld-property-file/rife/bld/e The [Entry](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.html) class is used to specify modifications to a [String property](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html). -| Function | Description/Example | -|:-----------------|:--------------------------------------------------------------------------------------------------------| -| `defaultValue()` | The value to be used if the property doesn't exist. | -| `delete()` | Delete the property. | -| `modify()` | `modify("-foo", String::concat)`
`modify("-foo", (v, s) -> v + s)`
`modify((v, s) -> v.trim())` | Modify an entry value. | -| `set()` | The value to set the property to, regardless of its previous value. | +| Function | Description/Example | +|:-----------------|:--------------------------------------------------------------------------------------------------------------------------------------------------| +| `defaultValue()` | The value to be used if the property doesn't exist. | +| `delete()` | Delete the property. | +| `modify()` | `modify("-foo", String::concat)`
`modify("-foo", (v, s) -> v + s)`
`modify((v, s) -> v.trim())` | +| `pattern()` | If present, will parse the value as a [Formatter](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Formatter.html) pattern. | +| `set()` | The value to set the property to, regardless of its previous value. | ## EntryDate @@ -115,4 +125,4 @@ The [EntryInt](https://rife2.github.io/bld-property-file/rife/bld/extension/prop | `pattern()` | If present, will parse the value as a [DecimalFormat](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/text/DecimalFormat.html) pattern. | | `set()` | The [integer value](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Integer.html) to set the property to, regardless of its previous value. | -It is inspired by the [ant PropertyFile task](https://ant.apache.org/manual/Tasks/propertyfile.html). \ No newline at end of file +It is inspired by the [ant PropertyFile task](https://ant.apache.org/manual/Tasks/propertyfile.html). diff --git a/config/pmd.xml b/config/pmd.xml index 41ca08b..2641880 100644 --- a/config/pmd.xml +++ b/config/pmd.xml @@ -7,9 +7,9 @@ - - + + @@ -24,8 +24,8 @@ - + @@ -35,8 +35,15 @@ - + + + + + + + + @@ -46,8 +53,6 @@ - - @@ -101,4 +106,4 @@ - \ No newline at end of file + diff --git a/examples/.idea/libraries/bld.xml b/examples/.idea/libraries/bld.xml index f67b643..b1bce61 100644 --- a/examples/.idea/libraries/bld.xml +++ b/examples/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/examples/.idea/libraries/compile.xml b/examples/.idea/libraries/compile.xml index 9bd86aa..99cc0c0 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 81feb0b..56ddbf1 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 13b6513..f72f7a3 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 7010ea3..0e7a921 100644 --- a/examples/.idea/misc.xml +++ b/examples/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/examples/.vscode/launch.json b/examples/.vscode/launch.json index c868458..d8eb2e0 100644 --- a/examples/.vscode/launch.json +++ b/examples/.vscode/launch.json @@ -1,12 +1,6 @@ { "version": "0.2.0", "configurations": [ - { - "type": "java", - "name": "Run Main", - "request": "launch", - "mainClass": "com.example.PropertyFileExampleMain" - }, { "type": "java", "name": "Run Tests", @@ -18,7 +12,8 @@ "--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 5ae2eaa..ba429d0 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/bld/java" + "src/test/resources", + "src/bld/java", + "src/bld/resources" ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}bld-1.7.0.jar", - "lib/compile/*.jar", - "lib/runtime/*.jar", - "lib/test/*.jar" + "${HOME}/.bld/dist/bld-2.2.1.jar", + "lib/**/*.jar" ] } diff --git a/examples/README.md b/examples/README.md index 616986c..ca9e01e 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,57 +1,20 @@ -# [Bld Property File](https://github.com/rife2/bld-property-file) Extension Examples +# Compile and Run Example -## 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 -./bld updateRelease run -``` -Upon execution, the `version.properties` file will be created and displayed: - -```shell -./bld updateMajor run +```console +./bld compile run ``` -```text -+---------------------------+ -| version.properties | -+---------------------------+ -# -#Sun Apr 02 23:51:39 PDT 2023 -build.date=2023-04-02 -version.major=1 -version.minor=0 -version.patch=0 +# Update Version Properties + +```console +./bld update-major run +./bld update-minor run +./bld update-patch run +./bld update-release run ``` -Subsequent commands will reflect the modifications to the -`version.major`, `version.minor` or `version.patch` properties: +# Delete Version Properties -```shell -./bld upatePatch run -``` - -```text -+---------------------------+ -| 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 +```console +./bld delete-version run +``` \ No newline at end of file diff --git a/examples/lib/bld/bld-wrapper.jar b/examples/lib/bld/bld-wrapper.jar index fdfb8dc..2e6f0b2 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 affc4fc..804e68c 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.2 -bld.repositories=RIFE2_SNAPSHOTS,RIFE2_RELEASES,MAVEN_CENTRAL bld.downloadExtensionSources=true bld.downloadLocation= -bld.version=1.7.1 +bld.extension=com.uwyn.rife2:bld-property-file:0.9.9 +bld.repositories=MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES +bld.version=2.2.1 diff --git a/examples/src/bld/java/com/example/PropertyFileExampleBuild.java b/examples/src/bld/java/com/example/PropertyFileExampleBuild.java index 5fae690..8f9a29c 100644 --- a/examples/src/bld/java/com/example/PropertyFileExampleBuild.java +++ b/examples/src/bld/java/com/example/PropertyFileExampleBuild.java @@ -14,6 +14,17 @@ import static rife.bld.dependencies.Repository.RIFE2_RELEASES; 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"); @@ -24,20 +35,22 @@ public class PropertyFileExampleBuild extends Project { version = version(0, 1, 0); javaRelease = 17; + downloadSources = true; autoDownloadPurge = true; + repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES); scope(test) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 9, 3))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 9, 3))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1))); } public static void main(String[] args) { new PropertyFileExampleBuild().start(args); } - @BuildCommand(summary = "Updates major version") + @BuildCommand(value = "update-major", summary = "Updates major version") public void updateMajor() throws Exception { new PropertyFileOperation() .fromProject(this) @@ -53,7 +66,7 @@ public class PropertyFileExampleBuild extends Project { .execute(); } - @BuildCommand(summary = "Updates minor version") + @BuildCommand(value = "update-minor", summary = "Updates minor version") public void updateMinor() throws Exception { new PropertyFileOperation() .fromProject(this) @@ -69,7 +82,7 @@ public class PropertyFileExampleBuild extends Project { .execute(); } - @BuildCommand(summary = "Updates patch version") + @BuildCommand(value = "update-patch", summary = "Updates patch version") public void updatePatch() throws Exception { new PropertyFileOperation() .fromProject(this) @@ -85,7 +98,7 @@ public class PropertyFileExampleBuild extends Project { .execute(); } - @BuildCommand(summary = "Updates the release") + @BuildCommand(value = "update-release", summary = "Updates the release") public void updateRelease() throws Exception { new PropertyFileOperation() .fromProject(this) @@ -94,10 +107,11 @@ public class PropertyFileExampleBuild extends Project { .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(summary = "Delete version properties") + @BuildCommand(value = "delete-version", summary = "Delete version properties") public void deleteVersion() throws Exception { new PropertyFileOperation() .fromProject(this) @@ -109,4 +123,4 @@ public class PropertyFileExampleBuild extends Project { .entry(buildDateEntry.delete()) .execute(); } -} \ No newline at end of file +} diff --git a/examples/version.properties b/examples/version.properties new file mode 100644 index 0000000..2d06736 --- /dev/null +++ b/examples/version.properties @@ -0,0 +1,7 @@ +# +#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 c8095fc..b067ce9 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 20ccfbf..42fad1d 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -1,7 +1,6 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true -bld.extension-pmd=com.uwyn.rife2:bld-pmd:0.9.2 -bld.extension-jacoco=com.uwyn.rife2:bld-jacoco-report:0.9.0 -bld.repositories=RIFE2_SNAPSHOTS,RIFE2_RELEASES,MAVEN_CENTRAL bld.downloadLocation= -bld.version=1.7.1 +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 diff --git a/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java b/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java index a74c606..fbfd1e7 100644 --- a/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java +++ b/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java @@ -1,18 +1,31 @@ +/* + * 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.JacocoReportOperation; import rife.bld.extension.PmdOperation; 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.MAVEN_CENTRAL; -import static rife.bld.dependencies.Repository.RIFE2_RELEASES; +import static rife.bld.dependencies.Repository.*; import static rife.bld.dependencies.Scope.compile; import static rife.bld.dependencies.Scope.test; import static rife.bld.operations.JavadocOptions.DocLinkOption.NO_MISSING; @@ -21,45 +34,58 @@ public class PropertyFileBuild extends Project { public PropertyFileBuild() { pkg = "rife.bld.extension"; name = "bld-property-file"; - version = version(0, 9, 2, "SNAPSHOT"); + version = version(0, 9, 9); javaRelease = 17; downloadSources = true; autoDownloadPurge = true; - repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES); + repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS); - var rife2 = version(1, 7, 0); scope(compile) - .include(dependency("com.uwyn.rife2", "rife2", rife2)) - .include(dependency("com.uwyn.rife2", "bld", version(1, 7, 1))); + .include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1))); scope(test) - .include(dependency("org.jsoup", "jsoup", version(1, 16, 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))) + .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() .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() .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("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")) + .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")) .signKey(property("sign.key")) .signPassphrase(property("sign.passphrase")); } @@ -68,15 +94,8 @@ public class PropertyFileBuild extends Project { new PropertyFileBuild().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() { + public void pmd() throws Exception { new PmdOperation() .fromProject(this) .failOnViolation(true) diff --git a/src/main/java/rife/bld/extension/propertyfile/Calc.java b/src/main/java/rife/bld/extension/propertyfile/Calc.java index d6b2f70..4c3f8bf 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 the original author or authors. + * 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 + * 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,7 +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; @@ -38,6 +44,7 @@ public final class Calc { * Adds {@code 1} to the value. * * @param v the value + * @return the new value */ public static Integer add(int v) { return v + 1; @@ -47,6 +54,7 @@ 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 bd8087b..3cdf925 100644 --- a/src/main/java/rife/bld/extension/propertyfile/Entry.java +++ b/src/main/java/rife/bld/extension/propertyfile/Entry.java @@ -1,17 +1,17 @@ /* - * Copyright 2023 the original author or authors. + * 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 + * 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; @@ -25,59 +25,67 @@ import java.util.function.BiFunction; * @author Geert Bevin * @since 1.0 */ -public class Entry extends EntryBase { +public class Entry extends EntryBase { + private String modifyValue_ = ""; + private BiFunction modify_; + + /** + * Creates a new {@link Entry entry}. + * + * @param key the required property key + */ public Entry(String key) { super(key); } /** - *

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

+ * Returns the modify function. * - * @param defaultValue the default value + * @return the modify function */ - @SuppressWarnings("unused") - public Entry defaultValue(Object defaultValue) { - setDefaultValue(defaultValue); - return this; + protected BiFunction modify() { + return modify_; } /** - * Sets the {@link Entry entry} up for deletion. - */ - public Entry delete() { - setDelete(true); - return this; - } - - /** - * Creates a new {@link Entry entry}. + * Sets the modify function. * - * @param modify the modification function + * @param modify the modify function */ public Entry modify(BiFunction modify) { - setModify(modify); + modify_ = modify; return this; } /** - * Creates a new {@link Entry entry}. + * Sets the modify function. * * @param value the value to perform a modification with - * @param modify the modification function + * @param modify the modify function */ public Entry modify(String value, BiFunction modify) { - setModifyValue(value); - setModify(modify); + modifyValue_ = value; + modify_ = modify; return this; } + /** + * Returns the value to be used in the {@link #modify_} function. + * + * @return the modify value + */ + protected String modifyValue() { + return modifyValue_; + } + /** * Sets the new {@link java.util.Properties property} value. * * @param s The new value + * @return the entry */ public Entry set(Object s) { - setNewValue(s); + newValue(s); return this; } } diff --git a/src/main/java/rife/bld/extension/propertyfile/EntryBase.java b/src/main/java/rife/bld/extension/propertyfile/EntryBase.java index 3c7733e..ff9f05e 100644 --- a/src/main/java/rife/bld/extension/propertyfile/EntryBase.java +++ b/src/main/java/rife/bld/extension/propertyfile/EntryBase.java @@ -1,22 +1,21 @@ /* - * Copyright 2023 the original author or authors. + * 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 + * 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; /** @@ -26,17 +25,14 @@ import java.util.function.IntFunction; * @author Geert Bevin * @since 1.0 */ -@SuppressWarnings("PMD.DataClass") -public class EntryBase { - private IntFunction calc; - private Object defaultValue; - private boolean isDelete; - private String key; - private BiFunction modify; - private String modifyValue = ""; - private Object newValue; - private String pattern = ""; - private EntryDate.Units unit = EntryDate.Units.DAY; +@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}. @@ -44,88 +40,35 @@ public class EntryBase { * @param key the required property key */ public EntryBase(String key) { - this.key = key; + key_ = key; } /** * Returns the calculation function. - */ - protected IntFunction getCalc() { - return calc; - } - - /** - * Returns the default value. - */ - protected Object getDefaultValue() { - return defaultValue; - } - - /** - * Returns the key of the {@link java.util.Properties property}. - */ - protected String getKey() { - return key; - } - - /** - * Returns the modify function. - */ - protected BiFunction getModify() { - return modify; - } - - /** - * Returns the value to be used in the {@link #modify} function. - */ - protected String getModifyValue() { - return modifyValue; - } - - /** - * Returns the new value to set the {@link java.util.Properties property)} to. - */ - public Object getNewValue() { - return newValue; - } - - /** - * Returns the pattern. - */ - protected String getPattern() { - return pattern; - } - - /** - * Returns the {@link EntryDate.Units unit}. - */ - protected EntryDate.Units getUnit() { - return unit; - } - - /** - * Returns {@code true} if the {@link java.util.Properties property} is to be deleted. - */ - protected boolean isDelete() { - return isDelete; - } - - /** - * Sets the key of the {@link java.util.Properties property}. * - * @param key the {@link java.util.Properties property} key + * @return the calc function */ - @SuppressWarnings("unused") - public EntryBase key(String key) { - setKey(key); - return this; + protected IntFunction calc() { + return calc_; } /** * Sets the calculation function. + * + * @param calc the calc function */ - protected void setCalc(IntFunction calc) { - this.calc = calc; + public T calc(IntFunction calc) { + calc_ = calc; + return (T) this; + } + + /** + * Returns the default value. + * + * @return the default value + */ + protected Object defaultValue() { + return defaultValue_; } /** @@ -133,50 +76,55 @@ public class EntryBase { * * @param defaultValue the default value */ - protected void setDefaultValue(Object defaultValue) { - this.defaultValue = defaultValue; + public T defaultValue(Object defaultValue) { + defaultValue_ = defaultValue; + return (T) this; } /** - * Sets whether the {@link java.util.Properties property} should be deleted. + * Indicates that the {@link java.util.Properties property} is to be deleted. */ - protected void setDelete(boolean delete) { - isDelete = delete; + 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 */ - protected void setKey(String key) { - this.key = key; + public T key(String key) { + key_ = key; + return (T) this; } /** - * Sets the modify function. - */ - protected void setModify(BiFunction modify) { - this.modify = modify; - } - - /** - * Sets the modify function. + * Returns the new value to set the {@link java.util.Properties property)} to. * - * @param value the value to perform a modification with + * @return the new value */ - protected void setModify(String value, BiFunction modify) { - this.modifyValue = value; - this.modify = modify; - } - - /** - * Sets the modify value. - * - * @param value the modify value. - */ - protected void setModifyValue(String value) { - this.modifyValue = value; + protected Object newValue() { + return newValue_; } /** @@ -184,26 +132,26 @@ public class EntryBase { * * @param newValue the new value */ - public void setNewValue(Object newValue) { - this.newValue = newValue; + protected void newValue(Object newValue) { + newValue_ = newValue; } /** - * Sets the {@link java.text.DecimalFormat DecimalFormat} or {@link java.time.format.DateTimeFormatter DateTimeFormatter} - * pattern to be used with {@link EntryDate} or {@link EntryInt} respectively. + * Returns the pattern. + * + * @return the pattern + */ + protected Object pattern() { + return pattern_; + } + + /** + * Sets the {@link java.util.Formatter} pattern. * * @param pattern the pattern */ - protected void setPattern(String pattern) { - this.pattern = pattern; - } - - /** - * Sets the {@link EntryDate.Units unit} value to apply to calculations. - * - * @param unit the {@link EntryDate.Units unit} - */ - protected void setUnit(EntryDate.Units unit) { - this.unit = unit; + 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 index 51e6630..8990119 100644 --- a/src/main/java/rife/bld/extension/propertyfile/EntryDate.java +++ b/src/main/java/rife/bld/extension/propertyfile/EntryDate.java @@ -1,17 +1,17 @@ /* - * Copyright 2023 the original author or authors. + * 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 + * 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; @@ -19,7 +19,6 @@ package rife.bld.extension.propertyfile; import java.time.*; import java.util.Calendar; import java.util.Date; -import java.util.function.IntFunction; /** * Declares the modifications to be made to a {@link java.util.Properties Date-based property}. @@ -27,9 +26,11 @@ import java.util.function.IntFunction; * @author Erik C. Thauvin * @since 1.0 */ -public class EntryDate extends EntryBase { +public class EntryDate extends EntryBase { + private EntryDate.Units unit_ = EntryDate.Units.DAY; + /** - * Creates a new date {@link Entry entry}. + * Creates a new {@link EntryDate entry}. * * @param key the required property key */ @@ -37,40 +38,23 @@ public class EntryDate extends EntryBase { super(key); } - /** - * Creates a new {@link EntryDate entry}. - * - * @param calc the calculation function - */ - public EntryDate calc(IntFunction calc) { - setCalc(calc); - return this; - } - - /** - * Sets the {@link EntryDate entry} up for deletion. - */ - public EntryDate delete() { - setDelete(true); - return this; - } - /** * Sets the new {@link java.util.Properties property} value to now. + * + * @return this instance */ public EntryDate now() { - setNewValue("now"); + newValue("now"); return this; } /** - * Sets the pattern for {@link EntryInt} and {@link EntryDate} to{@link java.text.DecimalFormat DecimalFormat} and - * {@link java.time.format.DateTimeFormatter DateTimeFormatter} respectively. + * Sets the {@link java.time.format.DateTimeFormatter DateTimeFormatter} pattern. * * @param pattern the pattern */ public EntryDate pattern(String pattern) { - setPattern(pattern); + super.pattern(pattern); return this; } @@ -78,9 +62,10 @@ public class EntryDate extends EntryBase { * 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) { - setNewValue(instant); + newValue(instant); return this; } @@ -88,9 +73,10 @@ public class EntryDate extends EntryBase { * 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) { - setNewValue(date); + newValue(date); return this; } @@ -98,9 +84,10 @@ public class EntryDate extends EntryBase { * 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) { - setNewValue(date); + newValue(date); return this; } @@ -108,9 +95,10 @@ public class EntryDate extends EntryBase { * 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) { - setNewValue(date); + newValue(date); return this; } @@ -118,9 +106,10 @@ public class EntryDate extends EntryBase { * 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) { - setNewValue(time); + newValue(time); return this; } @@ -128,9 +117,10 @@ public class EntryDate extends EntryBase { * 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) { - setNewValue(cal); + newValue(cal); return this; } @@ -138,19 +128,30 @@ public class EntryDate extends EntryBase { * 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) { - setNewValue(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) { - setUnit(unit); + unit_ = unit; return this; } @@ -168,6 +169,33 @@ public class EntryDate extends EntryBase { * */ public enum Units { - SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, YEAR + /** + * 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 index 9dd619b..b2e0e91 100644 --- a/src/main/java/rife/bld/extension/propertyfile/EntryInt.java +++ b/src/main/java/rife/bld/extension/propertyfile/EntryInt.java @@ -1,32 +1,30 @@ /* - * Copyright 2023 the original author or authors. + * 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 + * 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.IntFunction; - /** * 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 { +public class EntryInt extends EntryBase { /** - * Creates a new date {@link Entry entry}. + * Creates a new {@link EntryInt entry}. * * @param key the required property key */ @@ -35,31 +33,12 @@ public class EntryInt extends EntryBase { } /** - * Creates a new {@link EntryInt entry}. + * Sets the {@link java.text.DecimalFormat DecimalFormat} pattern. * - * @param calc the calculation function. + * @param pattern the pattern */ - public EntryInt calc(IntFunction calc) { - setCalc(calc); - return this; - } - - /** - * Sets the initial value to set the {@link java.util.Properties property} to, if not already defined. - * - * @param defaultValue the default value - */ - @SuppressWarnings("unused") - public EntryInt defaultValue(Object defaultValue) { - setDefaultValue(defaultValue); - return this; - } - - /** - * Sets the {@link EntryInt entry} up for deletion. - */ - public EntryInt delete() { - setDelete(true); + public EntryInt pattern(String pattern) { + super.pattern(pattern); return this; } @@ -67,9 +46,10 @@ public class EntryInt extends EntryBase { * 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) { - setNewValue(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 9364be2..f51b288 100644 --- a/src/main/java/rife/bld/extension/propertyfile/PropertyFileOperation.java +++ b/src/main/java/rife/bld/extension/propertyfile/PropertyFileOperation.java @@ -1,28 +1,32 @@ /* - * Copyright 2023 the original author or authors. + * 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 + * 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.operations.AbstractOperation; +import rife.bld.operations.exceptions.ExitStatusException; import java.io.File; +import java.nio.file.Path; 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. @@ -31,20 +35,21 @@ import java.util.Properties; * @since 1.0 */ public class PropertyFileOperation extends AbstractOperation { - private final List entries = new ArrayList<>(); - private String comment = ""; - private boolean failOnWarning; - private File file; - private BaseProject project; + 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_; /** * Sets the comment to be inserted at the top of the {@link java.util.Properties} file. * * @param comment the header comment + * @return this instance */ - @SuppressWarnings("unused") public PropertyFileOperation comment(String comment) { - this.comment = comment; + comment_ = comment; return this; } @@ -53,10 +58,10 @@ public class PropertyFileOperation extends AbstractOperation entry) { + entries_.add(entry); return this; } @@ -65,38 +70,49 @@ public class PropertyFileOperation extends AbstractOperation " + dte.getMessage(), - dte, failOnWarning); - success = false; + throw new IllegalArgumentException( + "Non-date value for \"" + entry.key() + "\" --> " + dte.getMessage(), dte); } } - - if (success) { - p.setProperty(entry.getKey(), parsedValue); - } - - return success; + p.setProperty(entry.key(), dateValue); } /** * Processes an integer {@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 + * @param p the {@link Properties property} + * @param entry the {@link Entry} containing the {@link Properties property} edits + * @throws NumberFormatException if a parsing error occurs */ - @SuppressWarnings("PMD.SignatureDeclareThrowsException") - public static boolean processInt(String command, Properties p, EntryInt entry, boolean failOnWarning) - throws Exception { - var success = true; + public static void processInt(Properties p, EntryInt entry) throws IllegalArgumentException { int intValue = 0; try { - var fmt = new DecimalFormat(entry.getPattern()); - var value = currentValue(p.getProperty(entry.getKey()), entry.getDefaultValue(), - entry.getNewValue()); + var fmt = new DecimalFormat(objectToString(entry.pattern())); + var currentValue = currentValue(p.getProperty(entry.key()), entry.defaultValue(), entry.newValue()); - if (value != null) { - intValue = fmt.parse(String.valueOf(value)).intValue(); + if (currentValue != null) { + intValue = fmt.parse(String.valueOf(currentValue)).intValue(); } - if (entry.getCalc() != null) { - intValue = entry.getCalc().apply(intValue); + if (entry.calc() != null) { + intValue = entry.calc().apply(intValue); } - p.setProperty(entry.getKey(), fmt.format(intValue)); + + p.setProperty(entry.key(), fmt.format(intValue)); } catch (NumberFormatException | ParseException e) { - warn(command, "Non-integer value for \"" + entry.getKey() + "\" --> " + e.getMessage(), e, - failOnWarning); - success = false; + throw new IllegalArgumentException( + "Non-integer value for \"" + entry.key() + "\" --> " + e.getMessage(), e); } - - return success; } /** @@ -229,16 +225,15 @@ public final class PropertyFileUtils { * @param p the {@link Properties property} * @param entry the {@link Entry} containing the {@link Properties property} edits */ - public static boolean processString(Properties p, Entry entry) { - var value = currentValue(p.getProperty(entry.getKey()), entry.getDefaultValue(), entry.getNewValue()); + public static void processString(Properties p, Entry entry) { + var currentValue = currentValue(p.getProperty(entry.key()), entry.defaultValue(), entry.newValue()); - p.setProperty(entry.getKey(), String.valueOf(value)); + p.setProperty(entry.key(), String.format(String.valueOf(currentValue), entry.pattern())); - if (entry.getModify() != null && entry.getModifyValue() != null) { - p.setProperty(entry.getKey(), entry.getModify().apply(p.getProperty(entry.getKey()), entry.getModifyValue())); + 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())); } - - return true; } /** @@ -247,24 +242,13 @@ public final class PropertyFileUtils { * @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 */ 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); - } - } - - /** - * Logs a warning. - * - * @param command the issuing command - * @param message the message to log - */ - static void warn(String command, String message) { - if (LOGGER.isLoggable(Level.WARNING)) { - LOGGER.warning('[' + command + "] " + message); + } catch (IOException ioe) { + throw new IOException("An IO error occurred while saving the Properties file: " + file, ioe); } } @@ -273,16 +257,20 @@ public final class PropertyFileUtils { * * @param command The command name * @param message the message log - * @param e the related exception * @param failOnWarning logs and throws exception if set to {@code true} + * @throws ExitStatusException if a {@link Level#SEVERE} exception occurs */ - @SuppressWarnings({"PMD.SignatureDeclareThrowsException"}) - static void warn(String command, String message, Exception e, boolean failOnWarning) throws Exception { + static void warn(String command, String message, boolean failOnWarning, boolean silent) + throws ExitStatusException { if (failOnWarning) { - LOGGER.log(Level.SEVERE, '[' + command + "] " + message, e); - throw e; + if (LOGGER.isLoggable(Level.SEVERE) && !silent) { + LOGGER.log(Level.SEVERE, '[' + command + "] " + message); + } + throw new ExitStatusException(ExitStatusException.EXIT_FAILURE); } else { - warn(command, message); + if (LOGGER.isLoggable(Level.WARNING) && !silent) { + LOGGER.warning('[' + command + "] " + message); + } } } } diff --git a/src/test/java/rife/bld/extension/propertyfile/PropertyFileOperationTest.java b/src/test/java/rife/bld/extension/propertyfile/PropertyFileOperationTest.java new file mode 100644 index 0000000..a0d949d --- /dev/null +++ b/src/test/java/rife/bld/extension/propertyfile/PropertyFileOperationTest.java @@ -0,0 +1,104 @@ +/* + * 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 56ef198..a3b6695 100644 --- a/src/test/java/rife/bld/extension/propertyfile/PropertyFileUtilsTest.java +++ b/src/test/java/rife/bld/extension/propertyfile/PropertyFileUtilsTest.java @@ -1,35 +1,35 @@ /* - * Copyright 2023 the original author or authors. + * 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 + * 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.io.IOException; import java.time.*; import java.util.Calendar; import java.util.Date; import java.util.Properties; -import static org.assertj.core.api.Assertions.assertThat; // NOPMD -import static org.assertj.core.api.Assertions.assertThatCode; // NOPMD -import static rife.bld.extension.propertyfile.Calc.ADD; // NOPMD -import static rife.bld.extension.propertyfile.Calc.SUB; // NOPMD +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; +import static rife.bld.extension.propertyfile.Calc.ADD; +import static rife.bld.extension.propertyfile.Calc.SUB; /** * PropertyFileUtilsTest class @@ -37,8 +37,8 @@ import static rife.bld.extension.propertyfile.Calc.SUB; // NOPMD * @author Erik C. Thauvin * @since 1.0 */ +@SuppressWarnings("PMD.AvoidDuplicateLiterals") class PropertyFileUtilsTest { - final static int dayOfYear = LocalDate.now().getDayOfYear(); final static Properties p = new Properties(); final static String t = "test"; @@ -49,7 +49,7 @@ class PropertyFileUtilsTest { public EntryDate newEntryDate() { p.clear(); - return new EntryDate("adate").pattern("D"); + return new EntryDate("aDate").pattern("D"); } public EntryInt newEntryInt() { @@ -58,42 +58,41 @@ class PropertyFileUtilsTest { } @Test - @SuppressWarnings("PMD.SignatureDeclareThrowsException") - void parseDateSub() throws Exception { - var entryDate = newEntryDate(); - entryDate.setCalc(SUB); - PropertyFileUtils.processDate(t, p, entryDate.now(), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(now-3)").isEqualTo(String.valueOf(dayOfYear - 1)); + 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.setCalc(v -> v - 2); - PropertyFileUtils.processDate(t, p, entryDate.now(), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(now-2)").isEqualTo(String.valueOf(dayOfYear - 2)); + 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.setCalc(SUB); - PropertyFileUtils.processDate(t, p, entryDate.set(new Date()), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(date-1)").isEqualTo(String.valueOf(dayOfYear - 1)); + 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.setCalc(v -> v - 2); - PropertyFileUtils.processDate(t, p, entryDate.set(Calendar.getInstance()), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(cal-2)").isEqualTo(String.valueOf(dayOfYear - 2)); + 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.setCalc(v -> v - 3); - PropertyFileUtils.processDate(t, p, entryDate.set(LocalDate.now()), - true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(LocalDate-3)").isEqualTo(String.valueOf(dayOfYear - 3)); + 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 - @SuppressWarnings("PMD.SignatureDeclareThrowsException") - void parseIntSubTest() throws Exception { - var entryInt = newEntryInt(); - entryInt.calc(SUB); - entryInt.setPattern("0000"); - PropertyFileUtils.processInt(t, p, entryInt.defaultValue("0017"), true); - assertThat(p.getProperty(entryInt.getKey())).as("sub(0017)").isEqualTo("0016"); + 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(t, p, entryInt.set(16).calc(v -> v - 3), true); - assertThat(p.getProperty(entryInt.getKey())).as("sub(16)-3").isEqualTo("0013"); + PropertyFileUtils.processInt(p, entryInt.set(16).calc(v -> v - 3)); + assertThat(p.getProperty(entryInt.key())).as("sub(16)-3").isEqualTo("0013"); } @Test @@ -102,119 +101,122 @@ class PropertyFileUtilsTest { var entry = newEntry(); PropertyFileUtils.processString(p, entry.set(1)); PropertyFileUtils.processString(p, entry.modify("-foo", String::concat)); - assertThat(p.getProperty(entry.getKey())).as(String.format("processString(%s, %s)", entry.getKey(), - entry.getNewValue())).isEqualTo("1-foo"); + 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.getKey())).as("capitalize").isEqualTo(t.toUpperCase(Localization.getLocale())); + assertThat(p.getProperty(entry.key())).as("capitalize").isEqualTo(t.toUpperCase(Localization.getLocale())); } @Test void parseStringCat() { var entry = newEntry(); - entry.set(t).setModify("-foo", String::concat); + entry.set(t).modify("-foo", String::concat); PropertyFileUtils.processString(p, entry); - assertThat(p.getProperty(entry.getKey())).as("replace").isEqualTo(t + "-foo"); + 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.getKey())).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue())) + 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).setModify("T", (v, s) -> v.replace("t", s)); + entry.set(t).modify("T", (v, s) -> v.replace("t", s)); PropertyFileUtils.processString(p, entry); - assertThat(p.getProperty(entry.getKey())).as("replace(t -> T)").isEqualTo("TesT"); - + 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.getKey())).as("substring(1)").isEqualTo(t.substring(1)); + assertThat(p.getProperty(entry.key())).as("substring(1)").isEqualTo(t.substring(1)); } @Test - @SuppressWarnings("PMD.SignatureDeclareThrowsException") - void parseTimeTest() throws Exception { + void parseTimeTest() { var entry = new EntryDate("time").pattern("m"); var time = LocalTime.now(); - entry.setCalc(ADD); - PropertyFileUtils.processDate(t, p, entry.set(time).unit(EntryDate.Units.MINUTE), true); - assertThat(p.getProperty(entry.getKey())).as("processDate(now+1)") + 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.setCalc(SUB); - PropertyFileUtils.processDate(t, p, entry.set(time).unit(EntryDate.Units.HOUR).pattern("H"), true); - assertThat(p.getProperty(entry.getKey())).as("processDate(now+1)") + 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 - @SuppressWarnings("PMD.SignatureDeclareThrowsException") - void processDateAddTest() throws Exception { + void processDateAddTest() { var entryDate = newEntryDate(); - entryDate.setCalc(ADD); - PropertyFileUtils.processDate(t, p, entryDate.now(), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(now+1)").isEqualTo(String.valueOf(dayOfYear + 1)); + 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(t, p, entryDate.now().calc(v -> v + 3), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(now+3)").isEqualTo(String.valueOf(dayOfYear + 3)); + 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.setCalc(ADD); - PropertyFileUtils.processDate(t, p, entryDate.set(ZonedDateTime.now()), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(ZonedDateTime+1)") - .isEqualTo(String.valueOf(dayOfYear + 1)); + 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(t, p, entryDate.set(Instant.now()).calc(v -> v + 2), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(Instant+2)").isEqualTo(String.valueOf(dayOfYear + 2)); + 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.setCalc(v -> v + 3); - PropertyFileUtils.processDate(t, p, entryDate.set(LocalDateTime.now()), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(LocalDteTime+2)").isEqualTo(String.valueOf(dayOfYear + 3)); + 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 - @SuppressWarnings("PMD.SignatureDeclareThrowsException") - void processIntAddTest() throws Exception { - var entryInt = newEntryInt(); - entryInt.calc(ADD); - entryInt.setDefaultValue("-1"); - PropertyFileUtils.processInt(t, p, entryInt, true); - assertThat(p.getProperty(entryInt.getKey())).as("add(-1)").isEqualTo("0"); + void processIntAddTest() { + var entryInt = newEntryInt().calc(ADD).defaultValue("-1"); + PropertyFileUtils.processInt(p, entryInt); + assertThat(p.getProperty(entryInt.key())).as("add(-1)").isEqualTo("0"); - entryInt.setKey("anint"); - entryInt.setDefaultValue("0"); - PropertyFileUtils.processInt(t, p, entryInt, true); - assertThat(p.getProperty(entryInt.getKey())).as("add(0)").isEqualTo("1"); - PropertyFileUtils.processInt(t, p, entryInt, true); - assertThat(p.getProperty(entryInt.getKey())).as("add(1)").isEqualTo("2"); + 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.setKey("formatted.int"); - entryInt.setDefaultValue("0013"); - entryInt.setPattern("0000"); - PropertyFileUtils.processInt(t, p, entryInt, true); - assertThat(p.getProperty(entryInt.getKey())).as("add(0013)").isEqualTo("0014"); - PropertyFileUtils.processInt(t, p, entryInt, true); - assertThat(p.getProperty(entryInt.getKey())).as("add(0014)").isEqualTo("0015"); + 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(t, p, entryInt, true); - assertThat(p.getProperty(entryInt.getKey())).as("add(0015)+2").isEqualTo("0017"); + PropertyFileUtils.processInt(p, entryInt); + assertThat(p.getProperty(entryInt.key())).as("add(0015)+2").isEqualTo("0017"); } @Test @@ -222,18 +224,17 @@ class PropertyFileUtilsTest { var entry = newEntry(); PropertyFileUtils.processString(p, entry); - assertThat(entry.getNewValue()).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue())) - .isEqualTo(p.getProperty(entry.getKey())); + assertThat(entry.newValue()).as(String.format("processString(%s, %s)", entry.key(), entry.newValue())) + .isEqualTo(p.getProperty(entry.key())); - entry.setKey("version.minor"); + entry.key("version.minor"); PropertyFileUtils.processString(p, entry.set(0)); - assertThat(entry.getNewValue().toString()).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue())) - .isEqualTo(p.getProperty(entry.getKey())); + assertThat(entry.newValue().toString()).as(String.format("processString(%s, %s)", entry.key(), entry.newValue())) + .isEqualTo(p.getProperty(entry.key())); } @Test - @SuppressWarnings("PMD.SignatureDeclareThrowsException") void savePropertiesTest() throws Exception { var p = new Properties(); var test = "test"; @@ -245,13 +246,22 @@ class PropertyFileUtilsTest { 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(PropertyFileUtils.loadProperties(t, tmp, p, false)).as("load properties").isTrue(); assertThat(p.getProperty(test)).as("read property").isEqualTo(test); tmp.deleteOnExit(); } + @Test + void testChangeKey() { + var entry = new Entry("foo").key("bar"); + assertThat(entry.key()).isEqualTo("bar"); + + entry.key("foo"); + assertThat(entry.key()).isEqualTo("foo"); + } + @Test void testCurrentValue() { var value = "value"; @@ -267,9 +277,9 @@ class PropertyFileUtilsTest { @Test void testWarn() { - assertThatCode(() -> PropertyFileUtils.warn("command", "message", new IOException(t), true)) - .hasMessage(t).isInstanceOf(IOException.class); - assertThatCode(() -> PropertyFileUtils.warn("command", t, new Exception(t), false)) + assertThatCode(() -> PropertyFileUtils.warn("command", "message", true, false)) + .isInstanceOf(ExitStatusException.class); + assertThatCode(() -> PropertyFileUtils.warn("command", t, false, false)) .as("failOnWarning = false").doesNotThrowAnyException(); } -} \ No newline at end of file +}