Compare commits
62 commits
Author | SHA1 | Date | |
---|---|---|---|
8f405448d2 | |||
9e6ac15b75 | |||
ec09c06b3d | |||
17742ad075 | |||
6139eb8245 | |||
3eab7e7b5e | |||
0218439665 | |||
0ddf538af9 | |||
ee124c567e | |||
33c3e22861 | |||
3b5b2596ea | |||
cc755c7b1e | |||
ca4ba41e21 | |||
7637f90bc5 | |||
7af0b06d14 | |||
75abe7c657 | |||
4571ce9767 | |||
d27869df5d | |||
3758df5080 | |||
4162c64ab9 | |||
69a431e6ab | |||
daf45f674c | |||
94efbbf7df | |||
f8cceedc35 | |||
77b9ea0f61 | |||
4fa6ec6306 | |||
592a269ec8 | |||
791db7f890 | |||
ade7898516 | |||
2600e74be7 | |||
15034b4363 | |||
2c796a1260 | |||
c1774e61ab | |||
7714e1028c | |||
accf0d638a | |||
fb75d12740 | |||
23540cbc8e | |||
dacacbab56 | |||
b8cd4925a3 | |||
bd27eac071 | |||
3db6ca026d | |||
f2eeb1f1f9 | |||
09cdfea6b8 | |||
2b5f29a016 | |||
375c4a70e2 | |||
2df3714d7a | |||
6faaa0aa57 | |||
1a2362d511 | |||
95147aa7da | |||
d315ebc551 | |||
ea19c6b822 | |||
accae48297 | |||
d5d1b64038 | |||
3e5e636b2e | |||
bcf789dd9a | |||
aea77d6216 | |||
dd302a54e1 | |||
c758270144 | |||
00cbeb8ad6 | |||
f89285da45 | |||
3038f20315 | |||
0cf1c230d4 |
39 changed files with 1028 additions and 718 deletions
41
.github/workflows/bld.yml
vendored
41
.github/workflows/bld.yml
vendored
|
@ -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
|
12
.github/workflows/pages.yml
vendored
12
.github/workflows/pages.yml
vendored
|
@ -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
|
||||
uses: actions/deploy-pages@v4
|
||||
|
|
6
.idea/bld.xml
generated
Normal file
6
.idea/bld.xml
generated
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="BldConfiguration">
|
||||
<events />
|
||||
</component>
|
||||
</project>
|
2
.idea/copyright/Apache_License.xml
generated
2
.idea/copyright/Apache_License.xml
generated
|
@ -1,6 +1,6 @@
|
|||
<component name="CopyrightManager">
|
||||
<copyright>
|
||||
<option name="notice" value=" Copyright &#36;today.year 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." />
|
||||
<option name="notice" value="Copyright 2023-&#36;today.year 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." />
|
||||
<option name="myName" value="Apache License" />
|
||||
</copyright>
|
||||
</component>
|
13
.idea/icon.svg
generated
Normal file
13
.idea/icon.svg
generated
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 179 108" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1,0,0,1,-210.511,-96.3382)">
|
||||
<g transform="matrix(1,0,0,1,-23.3386,-649.816)">
|
||||
<g transform="matrix(0.221288,0,0,0.24,73.9536,390.254)">
|
||||
<path d="M722.568,1482.92L722.568,1921.1L808.968,1921.1L808.968,1888.7C822.168,1907.9 846.168,1930.1 893.568,1930.1C933.168,1930.1 961.968,1917.5 985.368,1893.5C1012.97,1865.9 1027.37,1827.5 1027.37,1786.1C1027.37,1741.7 1011.17,1705.1 985.368,1680.5C961.968,1658.3 928.968,1644.5 892.368,1644.5C862.968,1644.5 830.568,1654.1 808.968,1683.5L808.968,1482.92L722.568,1482.92ZM871.368,1718.9C888.768,1718.9 903.768,1723.7 917.568,1736.9C930.168,1748.9 938.568,1766.3 938.568,1787.9C938.568,1807.7 930.168,1825.1 917.568,1837.1C904.368,1849.7 887.568,1855.7 872.568,1855.7C856.368,1855.7 837.168,1849.1 823.368,1835.9C813.168,1826.3 803.568,1810.1 803.568,1787.9C803.568,1765.1 812.568,1749.5 822.768,1738.7C836.568,1724.3 852.768,1718.9 871.368,1718.9Z" style="fill:rgb(35,146,255);fill-rule:nonzero;"/>
|
||||
<rect x="1083.77" y="1482.92" width="86.4" height="438.182" style="fill:rgb(250,144,82);fill-rule:nonzero;"/>
|
||||
<path d="M1531.37,1482.92L1444.97,1482.92L1444.97,1683.5C1423.37,1654.1 1390.97,1644.5 1361.57,1644.5C1324.97,1644.5 1291.97,1658.3 1268.57,1680.5C1242.77,1705.1 1226.57,1741.7 1226.57,1786.1C1226.57,1827.5 1240.97,1865.9 1268.57,1893.5C1291.97,1917.5 1320.77,1930.1 1360.37,1930.1C1407.77,1930.1 1431.77,1907.9 1444.97,1888.7L1444.97,1921.1L1531.37,1921.1L1531.37,1482.92ZM1382.57,1718.9C1401.17,1718.9 1417.37,1724.3 1431.17,1738.7C1441.37,1749.5 1450.37,1765.1 1450.37,1787.9C1450.37,1810.1 1440.77,1826.3 1430.57,1835.9C1416.77,1849.1 1397.57,1855.7 1381.37,1855.7C1366.37,1855.7 1349.57,1849.7 1336.37,1837.1C1323.77,1825.1 1315.37,1807.7 1315.37,1787.9C1315.37,1766.3 1323.77,1748.9 1336.37,1736.9C1350.17,1723.7 1365.17,1718.9 1382.57,1718.9Z" style="fill:rgb(35,146,255);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
141
.idea/intellij-javadocs-4.0.1.xml
generated
Normal file
141
.idea/intellij-javadocs-4.0.1.xml
generated
Normal file
|
@ -0,0 +1,141 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="JavaDocConfiguration">
|
||||
<GENERAL>
|
||||
<MODE>UPDATE</MODE>
|
||||
<OVERRIDDEN_METHODS>false</OVERRIDDEN_METHODS>
|
||||
<SPLITTED_CLASS_NAME>true</SPLITTED_CLASS_NAME>
|
||||
<LEVELS>
|
||||
<LEVEL>METHOD</LEVEL>
|
||||
<LEVEL>FIELD</LEVEL>
|
||||
<LEVEL>TYPE</LEVEL>
|
||||
</LEVELS>
|
||||
<VISIBILITIES>
|
||||
<VISIBILITY>PUBLIC</VISIBILITY>
|
||||
<VISIBILITY>DEFAULT</VISIBILITY>
|
||||
<VISIBILITY>PROTECTED</VISIBILITY>
|
||||
</VISIBILITIES>
|
||||
</GENERAL>
|
||||
<TEMPLATES>
|
||||
<CLASSES>
|
||||
<CLASS>
|
||||
<KEY>^.*(public|protected|private)*.+interface\s+\w+.*</KEY>
|
||||
<VALUE>/**\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> */</VALUE>
|
||||
</CLASS>
|
||||
<CLASS>
|
||||
<KEY>^.*(public|protected|private)*.+enum\s+\w+.*</KEY>
|
||||
<VALUE>/**\n
|
||||
* The enum ${name}.\n
|
||||
*/</VALUE>
|
||||
</CLASS>
|
||||
<CLASS>
|
||||
<KEY>^.*(public|protected|private)*.+class\s+\w+.*</KEY>
|
||||
<VALUE>/**\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> */</VALUE>
|
||||
</CLASS>
|
||||
<CLASS>
|
||||
<KEY>.+</KEY>
|
||||
<VALUE>/**\n
|
||||
* The type ${name}.\n
|
||||
*/</VALUE>
|
||||
</CLASS>
|
||||
</CLASSES>
|
||||
<CONSTRUCTORS>
|
||||
<CONSTRUCTOR>
|
||||
<KEY>.+</KEY>
|
||||
<VALUE>/**\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> */</VALUE>
|
||||
</CONSTRUCTOR>
|
||||
</CONSTRUCTORS>
|
||||
<METHODS>
|
||||
<METHOD>
|
||||
<KEY>^.*(public|protected|private)*\s*.*(\w(\s*<.+>)*)+\s+get\w+\s*\(.*\).+</KEY>
|
||||
<VALUE>/**\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> */</VALUE>
|
||||
</METHOD>
|
||||
<METHOD>
|
||||
<KEY>^.*(public|protected|private)*\s*.*(void|\w(\s*<.+>)*)+\s+set\w+\s*\(.*\).+</KEY>
|
||||
<VALUE>/**\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> */</VALUE>
|
||||
</METHOD>
|
||||
<METHOD>
|
||||
<KEY>^.*((public\s+static)|(static\s+public))\s+void\s+main\s*\(\s*String\s*(\[\s*\]|\.\.\.)\s+\w+\s*\).+</KEY>
|
||||
<VALUE>/**\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> */</VALUE>
|
||||
</METHOD>
|
||||
<METHOD>
|
||||
<KEY>.+</KEY>
|
||||
<VALUE>/**\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> */</VALUE>
|
||||
</METHOD>
|
||||
</METHODS>
|
||||
<FIELDS>
|
||||
<FIELD>
|
||||
<KEY>^.*(public|protected|private)*.+static.*(\w\s\w)+.+</KEY>
|
||||
<VALUE>/**\n
|
||||
* The constant ${element.getName()}.\n
|
||||
*/</VALUE>
|
||||
</FIELD>
|
||||
<FIELD>
|
||||
<KEY>^.*(public|protected|private)*.*(\w\s\w)+.+</KEY>
|
||||
<VALUE>/**\n
|
||||
<#if element.parent.isInterface()> * The constant ${element.getName()}.\n
|
||||
<#else> * The ${name}.\n
|
||||
</#if> */</VALUE>
|
||||
</FIELD>
|
||||
<FIELD>
|
||||
<KEY>.+</KEY>
|
||||
<VALUE>/**\n
|
||||
<#if element.parent.isEnum()> *${name} ${typeName}.\n
|
||||
<#else> * The ${name}.\n
|
||||
</#if>*/</VALUE>
|
||||
</FIELD>
|
||||
</FIELDS>
|
||||
</TEMPLATES>
|
||||
</component>
|
||||
</project>
|
5
.idea/libraries/bld.xml
generated
5
.idea/libraries/bld.xml
generated
|
@ -2,11 +2,12 @@
|
|||
<library name="bld">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-1.7.0.jar!/" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-1.7.0-sources.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1-sources.jar!/" />
|
||||
</SOURCES>
|
||||
<excluded>
|
||||
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />
|
||||
|
|
4
.idea/libraries/compile.xml
generated
4
.idea/libraries/compile.xml
generated
|
@ -7,7 +7,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/compile" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
4
.idea/libraries/runtime.xml
generated
4
.idea/libraries/runtime.xml
generated
|
@ -7,7 +7,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/runtime" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
4
.idea/libraries/test.xml
generated
4
.idea/libraries/test.xml
generated
|
@ -7,7 +7,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/test" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
6
.idea/misc.xml
generated
6
.idea/misc.xml
generated
|
@ -1,4 +1,3 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="EntryPointsManager">
|
||||
<pattern value="rife.bld.extension.propertyFile.Entry" method="defaultValue" />
|
||||
|
@ -18,11 +17,6 @@
|
|||
<pattern value="rife.bld.extension.propertyfile.PropertyFileOperation" />
|
||||
</component>
|
||||
<component name="PDMPlugin">
|
||||
<option name="customRuleSets">
|
||||
<list>
|
||||
<option value="K:\java\semver\config\pmd.xml" />
|
||||
</list>
|
||||
</option>
|
||||
<option name="skipTestSources" value="false" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="17" project-jdk-type="JavaSDK">
|
||||
|
|
6
.vscode/launch.json
vendored
6
.vscode/launch.json
vendored
|
@ -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",
|
||||
|
|
10
.vscode/settings.json
vendored
10
.vscode/settings.json
vendored
|
@ -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"
|
||||
]
|
||||
}
|
||||
|
|
30
README.md
30
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
|
||||
|
||||
[](https://opensource.org/licenses/Apache-2.0)
|
||||
[](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
|
||||
[](https://rife2.com/bld)
|
||||
[](https://rife2.com/bld)
|
||||
[](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-property-file)
|
||||
[](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-property-file)
|
||||
[](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)`<br/>`modify("-foo", (v, s) -> v + s)`<br/>`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)`<br/>`modify("-foo", (v, s) -> v + s)`<br/>`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
|
||||
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
<!-- BEST PRACTICES -->
|
||||
<rule ref="category/java/bestpractices.xml">
|
||||
<exclude name="AvoidPrintStackTrace"/>
|
||||
<exclude name="JUnit4TestShouldUseTestAnnotation"/>
|
||||
<exclude name="JUnitTestContainsTooManyAsserts"/>
|
||||
<exclude name="GuardLogStatement"/>
|
||||
<exclude name="UnitTestContainsTooManyAsserts"/>
|
||||
<exclude name="UnitTestShouldUseTestAnnotation"/>
|
||||
</rule>
|
||||
|
||||
<rule ref="category/java/bestpractices.xml/MissingOverride">
|
||||
|
@ -24,8 +24,8 @@
|
|||
<rule ref="category/java/codestyle.xml">
|
||||
<exclude name="AtLeastOneConstructor"/>
|
||||
<exclude name="ClassNamingConventions"/>
|
||||
<exclude name="ConfusingTernary"/>
|
||||
<exclude name="CommentDefaultAccessModifier"/>
|
||||
<exclude name="ConfusingTernary"/>
|
||||
<exclude name="FieldNamingConventions"/>
|
||||
<exclude name="LocalVariableCouldBeFinal"/>
|
||||
<exclude name="LongVariable"/>
|
||||
|
@ -35,8 +35,15 @@
|
|||
<exclude name="ShortClassName"/>
|
||||
<exclude name="ShortMethodName"/>
|
||||
<exclude name="ShortVariable"/>
|
||||
<exclude name="UselessParentheses"/>
|
||||
<exclude name="UseExplicitTypes"/>
|
||||
<exclude name="UseUnderscoresInNumericLiterals"/>
|
||||
<exclude name="UselessParentheses"/>
|
||||
</rule>
|
||||
|
||||
<rule ref="category/java/codestyle.xml/UnnecessaryImport">
|
||||
<properties>
|
||||
<property name="violationSuppressRegex" value="Unused (static|.*\.\*).*"/>
|
||||
</properties>
|
||||
</rule>
|
||||
|
||||
<!-- DESIGN -->
|
||||
|
@ -46,8 +53,6 @@
|
|||
<exclude name="AvoidUncheckedExceptionsInSignatures"/>
|
||||
<exclude name="CognitiveComplexity"/>
|
||||
<exclude name="CyclomaticComplexity"/>
|
||||
<exclude name="ExcessiveClassLength"/>
|
||||
<exclude name="ExcessiveMethodLength"/>
|
||||
<exclude name="ExcessiveParameterList"/>
|
||||
<exclude name="ExcessivePublicCount"/>
|
||||
<exclude name="GodClass"/>
|
||||
|
|
4
examples/.idea/libraries/bld.xml
generated
4
examples/.idea/libraries/bld.xml
generated
|
@ -2,12 +2,12 @@
|
|||
<library name="bld">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-1.7.0.jar!/" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-1.7.0-sources.jar!/" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1-sources.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/bld" recursive="false" />
|
||||
|
|
4
examples/.idea/libraries/compile.xml
generated
4
examples/.idea/libraries/compile.xml
generated
|
@ -7,7 +7,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/compile" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
4
examples/.idea/libraries/runtime.xml
generated
4
examples/.idea/libraries/runtime.xml
generated
|
@ -7,7 +7,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/runtime" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
4
examples/.idea/libraries/test.xml
generated
4
examples/.idea/libraries/test.xml
generated
|
@ -7,7 +7,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/test" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
1
examples/.idea/misc.xml
generated
1
examples/.idea/misc.xml
generated
|
@ -1,4 +1,3 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="EntryPointsManager">
|
||||
<list size="1">
|
||||
|
|
9
examples/.vscode/launch.json
vendored
9
examples/.vscode/launch.json
vendored
|
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
10
examples/.vscode/settings.json
vendored
10
examples/.vscode/settings.json
vendored
|
@ -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"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -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
|
||||
```console
|
||||
./bld delete-version 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)
|
Binary file not shown.
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
* <ul style="list-style-type:none">
|
||||
* <li>./bld updateMajor run</li>
|
||||
* <li>./bld updateMinor run</li>
|
||||
* <li>./bld updatePath run</li>
|
||||
* <li>./bld updateRelease run</li>
|
||||
* <li>./bld deleteVersion run</li>
|
||||
* </ul>
|
||||
*/
|
||||
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)
|
||||
|
|
7
examples/version.properties
Normal file
7
examples/version.properties
Normal file
|
@ -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
|
Binary file not shown.
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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<Integer> ADD = Calc::add;
|
||||
/**
|
||||
* The sub function.
|
||||
*/
|
||||
public static final IntFunction<Integer> 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;
|
||||
|
|
|
@ -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 <a href="https://github.com/gbevin">Geert Bevin</a>
|
||||
* @since 1.0
|
||||
*/
|
||||
public class Entry extends EntryBase {
|
||||
public class Entry extends EntryBase<Entry> {
|
||||
private String modifyValue_ = "";
|
||||
private BiFunction<String, String, String> modify_;
|
||||
|
||||
/**
|
||||
* Creates a new {@link Entry entry}.
|
||||
*
|
||||
* @param key the required property key
|
||||
*/
|
||||
public Entry(String key) {
|
||||
super(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Sets the initial value to set the {@link java.util.Properties property} to, if not already defined.</p>
|
||||
* 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<String, String, String> 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<String, String, String> 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<String, String, String> 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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 <a href="https://github.com/gbevin">Geert Bevin</a>
|
||||
* @since 1.0
|
||||
*/
|
||||
@SuppressWarnings("PMD.DataClass")
|
||||
public class EntryBase {
|
||||
private IntFunction<Integer> calc;
|
||||
private Object defaultValue;
|
||||
private boolean isDelete;
|
||||
private String key;
|
||||
private BiFunction<String, String, String> 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<T> {
|
||||
private IntFunction<Integer> 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<Integer> 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<String, String, String> 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<Integer> calc() {
|
||||
return calc_;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the calculation function.
|
||||
*
|
||||
* @param calc the calc function
|
||||
*/
|
||||
protected void setCalc(IntFunction<Integer> calc) {
|
||||
this.calc = calc;
|
||||
public T calc(IntFunction<Integer> 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<String, String, String> 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<String, String, String> 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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
||||
* @since 1.0
|
||||
*/
|
||||
public class EntryDate extends EntryBase {
|
||||
public class EntryDate extends EntryBase<EntryDate> {
|
||||
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<Integer> 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 {
|
|||
* </uL>
|
||||
*/
|
||||
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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
||||
* @since 1.0
|
||||
*/
|
||||
public class EntryInt extends EntryBase {
|
||||
public class EntryInt extends EntryBase<EntryInt> {
|
||||
/**
|
||||
* 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<Integer> 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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<PropertyFileOperation> {
|
||||
private final List<EntryBase> 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<EntryBase<?>> 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<PropertyFileOperati
|
|||
* file.
|
||||
*
|
||||
* @param entry the {@link Entry entry}
|
||||
* @return this instance
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public PropertyFileOperation entry(EntryBase entry) {
|
||||
entries.add(entry);
|
||||
public PropertyFileOperation entry(EntryBase<?> entry) {
|
||||
entries_.add(entry);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -65,38 +70,49 @@ public class PropertyFileOperation extends AbstractOperation<PropertyFileOperati
|
|||
*/
|
||||
@Override
|
||||
public void execute() throws Exception {
|
||||
var commandName = project.getCurrentCommandName();
|
||||
var properties = new Properties();
|
||||
var success = false;
|
||||
if (project_ == null) {
|
||||
if (LOGGER.isLoggable(Level.SEVERE) && !silent()) {
|
||||
LOGGER.log(Level.SEVERE, "A project is required");
|
||||
}
|
||||
throw new ExitStatusException(ExitStatusException.EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (file == null) {
|
||||
PropertyFileUtils.warn(commandName, "A properties file must be specified.");
|
||||
var commandName = project_.getCurrentCommandName();
|
||||
var properties = new Properties();
|
||||
var success = true;
|
||||
|
||||
if (file_ == null) {
|
||||
warn(commandName, "A properties file must be specified.");
|
||||
} else {
|
||||
success = PropertyFileUtils.loadProperties(commandName, file, properties);
|
||||
success = PropertyFileUtils.loadProperties(commandName, file_, properties, silent());
|
||||
}
|
||||
|
||||
if (success) {
|
||||
for (var entry : entries) {
|
||||
if (entry.getKey().isBlank()) {
|
||||
PropertyFileUtils.warn(commandName, "An entry key must specified.");
|
||||
for (var entry : entries_) {
|
||||
if (entry.key().isBlank()) {
|
||||
warn(commandName, "An entry key must specified.");
|
||||
} else {
|
||||
var key = entry.getKey();
|
||||
Object value = entry.getNewValue();
|
||||
Object defaultValue = entry.getDefaultValue();
|
||||
var key = entry.key();
|
||||
Object value = entry.newValue();
|
||||
Object defaultValue = entry.defaultValue();
|
||||
var p = properties.getProperty(key);
|
||||
if (entry.isDelete()) {
|
||||
properties.remove(key);
|
||||
} else if ((value == null || String.valueOf(value).isBlank())
|
||||
&& (defaultValue == null || String.valueOf(defaultValue).isBlank())
|
||||
&& (p == null || p.isBlank())) {
|
||||
PropertyFileUtils.warn(commandName, "An entry must be set or have a default value: " + key);
|
||||
warn(commandName, "An entry must be set or have a default value: " + key);
|
||||
} else {
|
||||
if (entry instanceof EntryDate) {
|
||||
success = PropertyFileUtils.processDate(commandName, properties, (EntryDate) entry, failOnWarning);
|
||||
} else if (entry instanceof EntryInt) {
|
||||
success = PropertyFileUtils.processInt(commandName, properties, (EntryInt) entry, failOnWarning);
|
||||
} else {
|
||||
success = PropertyFileUtils.processString(properties, (Entry) entry);
|
||||
try {
|
||||
if (entry instanceof EntryDate) {
|
||||
PropertyFileUtils.processDate(properties, (EntryDate) entry);
|
||||
} else if (entry instanceof EntryInt) {
|
||||
PropertyFileUtils.processInt(properties, (EntryInt) entry);
|
||||
} else {
|
||||
PropertyFileUtils.processString(properties, (Entry) entry);
|
||||
}
|
||||
} catch (IllegalArgumentException e) {
|
||||
warn(commandName, e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -104,7 +120,7 @@ public class PropertyFileOperation extends AbstractOperation<PropertyFileOperati
|
|||
}
|
||||
|
||||
if (success) {
|
||||
PropertyFileUtils.saveProperties(file, comment, properties);
|
||||
PropertyFileUtils.saveProperties(file_, comment_, properties);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -112,10 +128,10 @@ public class PropertyFileOperation extends AbstractOperation<PropertyFileOperati
|
|||
* 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
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public PropertyFileOperation failOnWarning(boolean failOnWarning) {
|
||||
this.failOnWarning = failOnWarning;
|
||||
failOnWarning_ = failOnWarning;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -123,10 +139,10 @@ public class PropertyFileOperation extends AbstractOperation<PropertyFileOperati
|
|||
* Sets the location of the {@link java.util.Properties} file to be edited.
|
||||
*
|
||||
* @param file the file to be edited
|
||||
* @return this instance
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public PropertyFileOperation file(File file) {
|
||||
this.file = file;
|
||||
file_ = file;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -134,18 +150,59 @@ public class PropertyFileOperation extends AbstractOperation<PropertyFileOperati
|
|||
* Sets the location of the {@link java.util.Properties} file to be edited.
|
||||
*
|
||||
* @param file the file to be edited
|
||||
* @return this instance
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public PropertyFileOperation file(String file) {
|
||||
this.file = new File(file);
|
||||
return this;
|
||||
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) {
|
||||
this.project = 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
/*
|
||||
* 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 javax.imageio.IIOException;
|
||||
import rife.bld.operations.exceptions.ExitStatusException;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
|
@ -38,7 +39,7 @@ import java.util.logging.Logger;
|
|||
* @since 1.0
|
||||
*/
|
||||
public final class PropertyFileUtils {
|
||||
private final static Logger LOGGER = Logger.getLogger(PropertyFileUtils.class.getName());
|
||||
private static final Logger LOGGER = Logger.getLogger(PropertyFileUtils.class.getName());
|
||||
|
||||
private PropertyFileUtils() {
|
||||
// no-op
|
||||
|
@ -48,8 +49,9 @@ public final class PropertyFileUtils {
|
|||
* Returns the new value, value or default value depending on which is specified.
|
||||
*
|
||||
* @param value the value
|
||||
* @param newValue the new value
|
||||
* @param defaultValue the default value
|
||||
* @param newValue the new value
|
||||
* @return the object
|
||||
*/
|
||||
public static Object currentValue(String value, Object defaultValue, Object newValue) {
|
||||
if (newValue != null) {
|
||||
|
@ -67,160 +69,154 @@ public final class PropertyFileUtils {
|
|||
* @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
|
||||
*/
|
||||
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
|
||||
public static boolean loadProperties(String command, File file, Properties p) throws Exception {
|
||||
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(), ioe, true);
|
||||
warn(command, "Could not load properties file: " + ioe.getMessage(), true, silent);
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
warn(command, "Please specify the properties file location.");
|
||||
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 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 DateTimeException if a parsing error occurs
|
||||
*/
|
||||
@SuppressWarnings({"PMD.SignatureDeclareThrowsException", "PMD.ExceptionAsFlowControl"})
|
||||
public static boolean processDate(String command, Properties p, EntryDate entry, boolean failOnWarning)
|
||||
throws Exception {
|
||||
var success = true;
|
||||
var value = currentValue(null, entry.getDefaultValue(),
|
||||
entry.getNewValue());
|
||||
@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 pattern = entry.getPattern();
|
||||
|
||||
String parsedValue = String.valueOf(value);
|
||||
var dateValue = String.valueOf(currentValue);
|
||||
if (pattern != null && !pattern.isBlank()) {
|
||||
var offset = 0;
|
||||
|
||||
if (entry.getCalc() != null) {
|
||||
offset = entry.getCalc().apply(offset);
|
||||
if (entry.calc() != null) {
|
||||
offset = entry.calc().apply(offset);
|
||||
}
|
||||
|
||||
var dtf = DateTimeFormatter.ofPattern(pattern);
|
||||
var unit = entry.getUnit();
|
||||
var unit = entry.unit();
|
||||
|
||||
try {
|
||||
if (value instanceof String) {
|
||||
if ("now".equalsIgnoreCase((String) value)) {
|
||||
value = ZonedDateTime.now();
|
||||
if (currentValue instanceof String) {
|
||||
if ("now".equalsIgnoreCase((String) currentValue)) {
|
||||
currentValue = ZonedDateTime.now();
|
||||
} else {
|
||||
throw new DateTimeException("Excepted: Calendar, Date or java.time.");
|
||||
}
|
||||
} else if (value instanceof LocalDateTime) {
|
||||
value = ((LocalDateTime) value).atZone(ZoneId.systemDefault());
|
||||
} else if (value instanceof Date) {
|
||||
value = ((Date) value).toInstant().atZone(ZoneId.systemDefault());
|
||||
} else if (value instanceof Calendar) {
|
||||
value = ((Calendar) value).toInstant().atZone(ZoneId.systemDefault());
|
||||
} else if (value instanceof Instant) {
|
||||
value = ((Instant) value).atZone(ZoneId.systemDefault());
|
||||
} 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 (value instanceof LocalDate) {
|
||||
if (currentValue instanceof LocalDate) {
|
||||
if (offset != 0) {
|
||||
if (unit == EntryDate.Units.DAY) {
|
||||
value = ((LocalDate) value).plusDays(offset);
|
||||
currentValue = ((LocalDate) currentValue).plusDays(offset);
|
||||
} else if (unit == EntryDate.Units.MONTH) {
|
||||
value = ((LocalDate) value).plusMonths(offset);
|
||||
currentValue = ((LocalDate) currentValue).plusMonths(offset);
|
||||
} else if (unit == EntryDate.Units.WEEK) {
|
||||
value = ((LocalDate) value).plusWeeks(offset);
|
||||
currentValue = ((LocalDate) currentValue).plusWeeks(offset);
|
||||
} else if (unit == EntryDate.Units.YEAR) {
|
||||
value = ((LocalDate) value).plusYears(offset);
|
||||
currentValue = ((LocalDate) currentValue).plusYears(offset);
|
||||
}
|
||||
}
|
||||
parsedValue = dtf.format((LocalDate) value);
|
||||
} else if (value instanceof LocalTime) {
|
||||
dateValue = dtf.format((LocalDate) currentValue);
|
||||
} else if (currentValue instanceof LocalTime) {
|
||||
if (offset != 0) {
|
||||
if (unit == EntryDate.Units.SECOND) {
|
||||
value = ((LocalTime) value).plusSeconds(offset);
|
||||
currentValue = ((LocalTime) currentValue).plusSeconds(offset);
|
||||
} else if (unit == EntryDate.Units.MINUTE) {
|
||||
value = ((LocalTime) value).plusMinutes(offset);
|
||||
currentValue = ((LocalTime) currentValue).plusMinutes(offset);
|
||||
} else if (unit == EntryDate.Units.HOUR) {
|
||||
value = ((LocalTime) value).plusHours(offset);
|
||||
currentValue = ((LocalTime) currentValue).plusHours(offset);
|
||||
}
|
||||
}
|
||||
parsedValue = dtf.format((LocalTime) value);
|
||||
} else if (value instanceof ZonedDateTime) {
|
||||
dateValue = dtf.format((LocalTime) currentValue);
|
||||
} else if (currentValue instanceof ZonedDateTime) {
|
||||
if (offset != 0) {
|
||||
if (unit == EntryDate.Units.DAY) {
|
||||
value = ((ZonedDateTime) value).plusDays(offset);
|
||||
currentValue = ((ZonedDateTime) currentValue).plusDays(offset);
|
||||
} else if (unit == EntryDate.Units.MONTH) {
|
||||
value = ((ZonedDateTime) value).plusMonths(offset);
|
||||
currentValue = ((ZonedDateTime) currentValue).plusMonths(offset);
|
||||
} else if (unit == EntryDate.Units.WEEK) {
|
||||
value = ((ZonedDateTime) value).plusWeeks(offset);
|
||||
currentValue = ((ZonedDateTime) currentValue).plusWeeks(offset);
|
||||
} else if (unit == EntryDate.Units.YEAR) {
|
||||
value = ((ZonedDateTime) value).plusYears(offset);
|
||||
currentValue = ((ZonedDateTime) currentValue).plusYears(offset);
|
||||
} else if (unit == EntryDate.Units.SECOND) {
|
||||
value = ((ZonedDateTime) value).plusSeconds(offset);
|
||||
currentValue = ((ZonedDateTime) currentValue).plusSeconds(offset);
|
||||
} else if (unit == EntryDate.Units.MINUTE) {
|
||||
value = ((ZonedDateTime) value).plusMinutes(offset);
|
||||
currentValue = ((ZonedDateTime) currentValue).plusMinutes(offset);
|
||||
} else if (unit == EntryDate.Units.HOUR) {
|
||||
value = ((ZonedDateTime) value).plusHours(offset);
|
||||
currentValue = ((ZonedDateTime) currentValue).plusHours(offset);
|
||||
}
|
||||
}
|
||||
parsedValue = dtf.format((ZonedDateTime) value);
|
||||
dateValue = dtf.format((ZonedDateTime) currentValue);
|
||||
}
|
||||
} catch (DateTimeException dte) {
|
||||
warn(command, "Non-date value for \"" + entry.getKey() + "\" --> " + 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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 <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
||||
* @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();
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue