Compare commits
81 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 | |||
3a0144ea07 | |||
04ff860a4f | |||
a264895c49 | |||
22475b87b1 | |||
84f5906d5d | |||
16f6e1de67 | |||
50c676b5a2 | |||
dc1cebc327 | |||
9dfde85473 | |||
b5af26c074 | |||
575f5288c5 | |||
ff346ed9c1 | |||
0e89117b7f | |||
fedb9ff53d | |||
bd0b504800 | |||
51002b337f | |||
473a70329e | |||
99c3774227 | |||
20fc225b41 |
40 changed files with 1714 additions and 907 deletions
43
.github/workflows/bld.yml
vendored
43
.github/workflows/bld.yml
vendored
|
@ -3,30 +3,49 @@ name: bld-ci
|
||||||
on: [ push, pull_request, workflow_dispatch ]
|
on: [ push, pull_request, workflow_dispatch ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-gradle-project:
|
build-bld-project:
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
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:
|
steps:
|
||||||
- name: Checkout source repository
|
- name: Checkout source repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Set up JDK ${{ matrix.java-version }}
|
- name: Set up JDK ${{ matrix.java-version }}
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: "zulu"
|
||||||
java-version: ${{ matrix.java-version }}
|
java-version: ${{ matrix.java-version }}
|
||||||
|
|
||||||
- name: Grant execute permission for bld
|
- name: Download dependencies [examples]
|
||||||
run: chmod +x bld
|
working-directory: examples
|
||||||
|
|
||||||
- name: Download the dependencies
|
|
||||||
run: ./bld download
|
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
|
run: ./bld compile test
|
12
.github/workflows/pages.yml
vendored
12
.github/workflows/pages.yml
vendored
|
@ -30,14 +30,14 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout source repository
|
- name: Checkout source repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Set up JDK 17
|
- name: Set up JDK 17
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: "zulu"
|
||||||
java-version: 17
|
java-version: 17
|
||||||
|
|
||||||
- name: Build Javadocs
|
- name: Build Javadocs
|
||||||
|
@ -47,11 +47,11 @@ jobs:
|
||||||
uses: actions/configure-pages@v3
|
uses: actions/configure-pages@v3
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-pages-artifact@v1
|
uses: actions/upload-pages-artifact@v3
|
||||||
with:
|
with:
|
||||||
# Upload generated Javadocs repository
|
# Upload generated Javadocs repository
|
||||||
path: 'build/javadoc/'
|
path: "build/javadoc/"
|
||||||
|
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
id: deployment
|
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>
|
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<state>
|
||||||
|
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Erik's Code Style" />
|
||||||
|
</state>
|
||||||
|
</component>
|
2
.idea/copyright/Apache_License.xml
generated
2
.idea/copyright/Apache_License.xml
generated
|
@ -1,6 +1,6 @@
|
||||||
<component name="CopyrightManager">
|
<component name="CopyrightManager">
|
||||||
<copyright>
|
<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" />
|
<option name="myName" value="Apache License" />
|
||||||
</copyright>
|
</copyright>
|
||||||
</component>
|
</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">
|
<library name="bld">
|
||||||
<CLASSES>
|
<CLASSES>
|
||||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||||
<root url="jar://$USER_HOME$/.rife2/dist/rife2-1.5.16.jar!/" />
|
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
|
||||||
</CLASSES>
|
</CLASSES>
|
||||||
<JAVADOC />
|
<JAVADOC />
|
||||||
<SOURCES>
|
<SOURCES>
|
||||||
<root url="jar://$USER_HOME$/.rife2/dist/rife2-1.5.16-sources.jar!/" />
|
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||||
|
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1-sources.jar!/" />
|
||||||
</SOURCES>
|
</SOURCES>
|
||||||
<excluded>
|
<excluded>
|
||||||
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />
|
<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>
|
<SOURCES>
|
||||||
<root url="file://$PROJECT_DIR$/lib/compile" />
|
<root url="file://$PROJECT_DIR$/lib/compile" />
|
||||||
</SOURCES>
|
</SOURCES>
|
||||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" />
|
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" />
|
||||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" type="SOURCES" />
|
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" type="SOURCES" />
|
||||||
</library>
|
</library>
|
||||||
</component>
|
</component>
|
4
.idea/libraries/runtime.xml
generated
4
.idea/libraries/runtime.xml
generated
|
@ -7,7 +7,7 @@
|
||||||
<SOURCES>
|
<SOURCES>
|
||||||
<root url="file://$PROJECT_DIR$/lib/runtime" />
|
<root url="file://$PROJECT_DIR$/lib/runtime" />
|
||||||
</SOURCES>
|
</SOURCES>
|
||||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" />
|
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" />
|
||||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" type="SOURCES" />
|
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" type="SOURCES" />
|
||||||
</library>
|
</library>
|
||||||
</component>
|
</component>
|
4
.idea/libraries/test.xml
generated
4
.idea/libraries/test.xml
generated
|
@ -7,7 +7,7 @@
|
||||||
<SOURCES>
|
<SOURCES>
|
||||||
<root url="file://$PROJECT_DIR$/lib/test" />
|
<root url="file://$PROJECT_DIR$/lib/test" />
|
||||||
</SOURCES>
|
</SOURCES>
|
||||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" />
|
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" />
|
||||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" type="SOURCES" />
|
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" type="SOURCES" />
|
||||||
</library>
|
</library>
|
||||||
</component>
|
</component>
|
8
.idea/misc.xml
generated
8
.idea/misc.xml
generated
|
@ -1,4 +1,3 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="EntryPointsManager">
|
<component name="EntryPointsManager">
|
||||||
<pattern value="rife.bld.extension.propertyFile.Entry" method="defaultValue" />
|
<pattern value="rife.bld.extension.propertyFile.Entry" method="defaultValue" />
|
||||||
|
@ -9,6 +8,13 @@
|
||||||
<pattern value="rife.bld.extension.propertyfile.Entry" method="delete" />
|
<pattern value="rife.bld.extension.propertyfile.Entry" method="delete" />
|
||||||
<pattern value="rife.bld.extension.propertyfile.Entry" />
|
<pattern value="rife.bld.extension.propertyfile.Entry" />
|
||||||
<pattern value="rife.bld.extension.propertyfile.Entry" method="setDelete" />
|
<pattern value="rife.bld.extension.propertyfile.Entry" method="setDelete" />
|
||||||
|
<pattern value="rife.bld.extension.propertyfile.EntryDate" method="delete" />
|
||||||
|
<pattern value="rife.bld.extension.propertyfile.EntryDate" />
|
||||||
|
<pattern value="rife.bld.extension.propertyfile.EntryInt" method="delete" />
|
||||||
|
<pattern value="rife.bld.extension.propertyfile.PropertyFileBuild" method="jacoco" />
|
||||||
|
<pattern value="rife.bld.extension.propertyfile.PropertyFileBuild" method="pmd" />
|
||||||
|
<pattern value="rife.bld.extension.propertyfile.PropertyFileOperation" method="fromProject" />
|
||||||
|
<pattern value="rife.bld.extension.propertyfile.PropertyFileOperation" />
|
||||||
</component>
|
</component>
|
||||||
<component name="PDMPlugin">
|
<component name="PDMPlugin">
|
||||||
<option name="skipTestSources" value="false" />
|
<option name="skipTestSources" value="false" />
|
||||||
|
|
6
.vscode/launch.json
vendored
6
.vscode/launch.json
vendored
|
@ -1,12 +1,6 @@
|
||||||
{
|
{
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
|
||||||
"type": "java",
|
|
||||||
"name": "Run Main",
|
|
||||||
"request": "launch",
|
|
||||||
"mainClass": "rife.bld.extension.propertyfile.PropertyFileOperation"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"type": "java",
|
"type": "java",
|
||||||
"name": "Run Tests",
|
"name": "Run Tests",
|
||||||
|
|
10
.vscode/settings.json
vendored
10
.vscode/settings.json
vendored
|
@ -3,13 +3,13 @@
|
||||||
"src/main/java",
|
"src/main/java",
|
||||||
"src/main/resources",
|
"src/main/resources",
|
||||||
"src/test/java",
|
"src/test/java",
|
||||||
"src/bld/java"
|
"src/test/resources",
|
||||||
|
"src/bld/java",
|
||||||
|
"src/bld/resources"
|
||||||
],
|
],
|
||||||
"java.configuration.updateBuildConfiguration": "automatic",
|
"java.configuration.updateBuildConfiguration": "automatic",
|
||||||
"java.project.referencedLibraries": [
|
"java.project.referencedLibraries": [
|
||||||
"${HOME}/.rife2/dist/rife2-1.5.16.jar",
|
"${HOME}/.bld/dist/bld-2.2.1.jar",
|
||||||
"lib/compile/*.jar",
|
"lib/**/*.jar"
|
||||||
"lib/runtime/*.jar",
|
|
||||||
"lib/test/*.jar"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
89
README.md
89
README.md
|
@ -1,24 +1,38 @@
|
||||||
# [Bld](https://github.com/rife2/rife2/wiki/What-Is-Bld) Extension to Create or Modify Properties Files
|
# [bld](https://rife2.com/bld) Extension to Create or Modify Properties Files
|
||||||
|
|
||||||
[](http://opensource.org/licenses/BSD-3-Clause)
|
[](https://opensource.org/licenses/Apache-2.0)
|
||||||
[](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
|
[](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
|
||||||
[](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-property-file)
|
[](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)
|
[](https://github.com/rife2/bld-property-file/actions/workflows/bld.yml)
|
||||||
|
|
||||||
An extension for creating or modifying [property files](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) with [bld](https://github.com/rife2/rife2/wiki/What-Is-Bld). It is inspired by the [ant PropertyFile task](https://ant.apache.org/manual/Tasks/propertyfile.html).
|
To install the latest version, add the following to the `lib/bld/bld-wrapper.properties` 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
|
```java
|
||||||
@BuildCommand
|
@BuildCommand
|
||||||
public void updateMajor() throws Exception {
|
public void updateMajor() throws Exception {
|
||||||
new PropertyFileOperation(this)
|
new PropertyFileOperation()
|
||||||
|
.fromProject(this)
|
||||||
.file("version.properties")
|
.file("version.properties")
|
||||||
.entry(new Entry("version.major", Types.INT).defaultValue(0).calc(ADD))
|
.entry(new EntryInt("version.major").defaultValue(0).calc(ADD))
|
||||||
.entry(new Entry("version.minor").set(0))
|
.entry(new EntryInt("version.minor").set(0))
|
||||||
.entry(new Entry("version.patch").set(0))
|
.entry(new EntryInt("version.patch").set(0))
|
||||||
.entry(new Entry("build.date", Types.DATE).set("now").pattern("yyyy-MM-dd"))
|
.entry(new EntryDate("build.date").now().pattern("yyyy-MM-dd"))
|
||||||
.execute();
|
.execute();
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Invoking the `updateMajor` command, will create the `version.propertees`file:
|
Invoking the `updateMajor` command, will create the `version.propertees`file:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
@ -61,33 +75,34 @@ The [PropertyFileOperation](https://rife2.github.io/bld-property-file/rife/bld/e
|
||||||
|
|
||||||
## Entry
|
## Entry
|
||||||
|
|
||||||
The [Entry](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.html) class is used to specify modifications to be made to the [properties file](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html).
|
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 |
|
| Function | Description/Example |
|
||||||
|:-----------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|:-----------------|:--------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| `key()` | The name of the property name/value pair. |
|
| `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. |
|
| `set()` | The value to set the property to, regardless of its previous value. |
|
||||||
| `type()` | The value datatype, either [Types.INT](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.Types.html), [Types.DATE](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.Types.html), or [Types.STRING](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.Types.html). If none specified, [Types.STRING](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.Types.html) is assumed. |
|
|
||||||
| `pattern()` | For [Types.INT](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.Types.html) and [Types.DATE](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.Types.html) only. If present, will parse the value as [DecimalFormat](https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html) or [SimpleDateFormat](https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html) patterns, respectively. |
|
|
||||||
| `unit()` | The unit value to be used with [Types.DATE](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.Types.html) calculations. See [Units](#units). |
|
|
||||||
|
|
||||||
- For convenience the `key` (and optional `type`) is first set in the constructor.
|
## EntryDate
|
||||||
- The `key` is required.
|
|
||||||
- A `set` value or `defaultValue` are required except when deleting.
|
|
||||||
- For [Types.DATE](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.Types.html), the `now` keyword can be used as the property value.
|
|
||||||
|
|
||||||
## Functions
|
The [EntryDate](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/EntryDate.html) class is used to specify modifications to a [date property](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html).
|
||||||
|
|
||||||
The following function are available:
|
| Function | Description/Example |
|
||||||
|
|:-----------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| `calc()` | `calc(ADD)`<br/>`calc(v -> v + 1)`<br/>`calc(SUB)`<br/>`calc(v -> v - 1)` |
|
||||||
|
| `delete()` | Delete the property. |
|
||||||
|
| `now()` | Set the entry to the current date/time. |
|
||||||
|
| `pattern()` | If present, will parse the value as a [DateTimeFormatter](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/format/DateTimeFormatter.html) pattern. |
|
||||||
|
| `set()` | The [Calendar](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Calendar.html), [Date](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Date.html), or [java.time](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/package-summary.html) value to set the property to, regardless of its previous value. |
|
||||||
|
| `unit()` | The unit to be used calculations. See [Units](#units). |
|
||||||
|
|
||||||
| Function | Example | Description |
|
- `set` or `now` are required.
|
||||||
|:-----------|:--------------------------------------------------------------------------------------------------------|:-------------------------------------------|
|
|
||||||
| `calc()` | `calc(ADD)`<br/>`calc(v -> v + 1)`<br/>`calc(SUB)`<br/>`calc(v -> v - 1)` | Perform a calculation with an entry value. |
|
|
||||||
| `modify()` | `modify("-foo", String::concat)`<br/>`modify("-foo", (v, s) -> v + s)`<br/>`modify((v, s) -> v.trim())` | Modify an entry value. |
|
|
||||||
| `delete()` | `delete()` | Delete an entry. |
|
|
||||||
## Units
|
|
||||||
|
|
||||||
The following [Units](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.Units.html) are available for [Types.DATE](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.Types.html):
|
### Units
|
||||||
|
|
||||||
|
The following [Units](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/EntryDate.Units.html) are available:
|
||||||
|
|
||||||
* `Units.MILLISECOND`
|
* `Units.MILLISECOND`
|
||||||
* `Units.SECOND`
|
* `Units.SECOND`
|
||||||
|
@ -98,8 +113,16 @@ The following [Units](https://rife2.github.io/bld-property-file/rife/bld/extensi
|
||||||
* `Units.MONTH`
|
* `Units.MONTH`
|
||||||
* `Units.YEAR`
|
* `Units.YEAR`
|
||||||
|
|
||||||
## Differences with the [ant PropertyFile task](https://ant.apache.org/manual/Tasks/propertyfile.html)
|
## EntryInt
|
||||||
|
|
||||||
* The comments and layout of the original property file will not be preserved.
|
The [EntryInt](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/EntryInt.html) class is used to specify modifications to a [integer property](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html).
|
||||||
* The `jdkproperties` parameter is not implemented.
|
|
||||||
* The default [Types.DATE](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.Types.html) pattern is `yyyy-MM-dd HH:mm` and not `yyyy/MM/dd HH:mm`.
|
| Function | Description/Example |
|
||||||
|
|:-----------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| `defaultValue()` | The value to be used if the property doesn't exist. |
|
||||||
|
| `calc()` | `calc(ADD)`<br/>`calc(v -> v + 1)`<br/>`calc(SUB)`<br/>`calc(v -> v - 1)` |
|
||||||
|
| `delete()` | Delete the property. |
|
||||||
|
| `pattern()` | If present, will parse the value as a [DecimalFormat](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/text/DecimalFormat.html) pattern. |
|
||||||
|
| `set()` | The [integer value](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Integer.html) to set the property to, regardless of its previous value. |
|
||||||
|
|
||||||
|
It is inspired by the [ant PropertyFile task](https://ant.apache.org/manual/Tasks/propertyfile.html).
|
||||||
|
|
109
config/pmd.xml
Normal file
109
config/pmd.xml
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<ruleset name="erik"
|
||||||
|
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
|
||||||
|
<description>Erik's Ruleset</description>
|
||||||
|
<!-- BEST PRACTICES -->
|
||||||
|
<rule ref="category/java/bestpractices.xml">
|
||||||
|
<exclude name="AvoidPrintStackTrace"/>
|
||||||
|
<exclude name="GuardLogStatement"/>
|
||||||
|
<exclude name="UnitTestContainsTooManyAsserts"/>
|
||||||
|
<exclude name="UnitTestShouldUseTestAnnotation"/>
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<rule ref="category/java/bestpractices.xml/MissingOverride">
|
||||||
|
<properties>
|
||||||
|
<property name="violationSuppressXPath"
|
||||||
|
value="//MethodDeclaration[@Name='hashCode' or @Name='equals' or @Name='toString']"/>
|
||||||
|
</properties>
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- CODE STYLE -->
|
||||||
|
<rule ref="category/java/codestyle.xml">
|
||||||
|
<exclude name="AtLeastOneConstructor"/>
|
||||||
|
<exclude name="ClassNamingConventions"/>
|
||||||
|
<exclude name="CommentDefaultAccessModifier"/>
|
||||||
|
<exclude name="ConfusingTernary"/>
|
||||||
|
<exclude name="FieldNamingConventions"/>
|
||||||
|
<exclude name="LocalVariableCouldBeFinal"/>
|
||||||
|
<exclude name="LongVariable"/>
|
||||||
|
<exclude name="MethodArgumentCouldBeFinal"/>
|
||||||
|
<exclude name="OnlyOneReturn"/>
|
||||||
|
<exclude name="PackageCase"/>
|
||||||
|
<exclude name="ShortClassName"/>
|
||||||
|
<exclude name="ShortMethodName"/>
|
||||||
|
<exclude name="ShortVariable"/>
|
||||||
|
<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 -->
|
||||||
|
<rule ref="category/java/design.xml">
|
||||||
|
<exclude name="AvoidCatchingGenericException"/>
|
||||||
|
<exclude name="AvoidDeeplyNestedIfStmts"/>
|
||||||
|
<exclude name="AvoidUncheckedExceptionsInSignatures"/>
|
||||||
|
<exclude name="CognitiveComplexity"/>
|
||||||
|
<exclude name="CyclomaticComplexity"/>
|
||||||
|
<exclude name="ExcessiveParameterList"/>
|
||||||
|
<exclude name="ExcessivePublicCount"/>
|
||||||
|
<exclude name="GodClass"/>
|
||||||
|
<exclude name="LawOfDemeter"/>
|
||||||
|
<exclude name="LoosePackageCoupling"/>
|
||||||
|
<exclude name="NPathComplexity"/>
|
||||||
|
<exclude name="NcssCount"/>
|
||||||
|
<exclude name="TooManyFields"/>
|
||||||
|
<exclude name="TooManyMethods"/>
|
||||||
|
<exclude name="UseObjectForClearerAPI"/>
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<!-- DOCUMENTATION -->
|
||||||
|
<rule ref="category/java/documentation.xml">
|
||||||
|
<exclude name="CommentRequired"/>
|
||||||
|
<exclude name="CommentSize"/>
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<!-- ERROR PRONE -->
|
||||||
|
<rule ref="category/java/errorprone.xml">
|
||||||
|
<exclude name="AssignmentInOperand"/>
|
||||||
|
<exclude name="AvoidCatchingNPE"/>
|
||||||
|
<exclude name="AvoidDuplicateLiterals"/>
|
||||||
|
<exclude name="AvoidFieldNameMatchingMethodName"/>
|
||||||
|
<exclude name="AvoidFieldNameMatchingTypeName"/>
|
||||||
|
<exclude name="AvoidLiteralsInIfCondition"/>
|
||||||
|
<exclude name="NullAssignment"/>
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<rule ref="category/java/errorprone.xml/AssignmentInOperand">
|
||||||
|
<properties>
|
||||||
|
<property name="allowWhile" value="true"/>
|
||||||
|
<property name="allowFor" value="true"/>
|
||||||
|
<property name="allowIf" value="true"/>
|
||||||
|
</properties>
|
||||||
|
</rule>
|
||||||
|
<rule ref="category/java/errorprone.xml/AvoidDuplicateLiterals">
|
||||||
|
<properties>
|
||||||
|
<property name="skipAnnotations" value="true"/>
|
||||||
|
</properties>
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<!-- MULTITHREADING -->
|
||||||
|
<rule ref="category/java/multithreading.xml">
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<!-- PERFORMANCE -->
|
||||||
|
<rule ref="category/java/performance.xml">
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<!-- SECURITY -->
|
||||||
|
<rule ref="category/java/security.xml">
|
||||||
|
</rule>
|
||||||
|
</ruleset>
|
4
examples/.idea/libraries/bld.xml
generated
4
examples/.idea/libraries/bld.xml
generated
|
@ -2,12 +2,12 @@
|
||||||
<library name="bld">
|
<library name="bld">
|
||||||
<CLASSES>
|
<CLASSES>
|
||||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||||
<root url="jar://$USER_HOME$/.rife2/dist/rife2-1.5.16.jar!/" />
|
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
|
||||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||||
</CLASSES>
|
</CLASSES>
|
||||||
<JAVADOC />
|
<JAVADOC />
|
||||||
<SOURCES>
|
<SOURCES>
|
||||||
<root url="jar://$USER_HOME$/.rife2/dist/rife2-1.5.16-sources.jar!/" />
|
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1-sources.jar!/" />
|
||||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||||
</SOURCES>
|
</SOURCES>
|
||||||
<jarDirectory url="file://$PROJECT_DIR$/lib/bld" recursive="false" />
|
<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>
|
<SOURCES>
|
||||||
<root url="file://$PROJECT_DIR$/lib/compile" />
|
<root url="file://$PROJECT_DIR$/lib/compile" />
|
||||||
</SOURCES>
|
</SOURCES>
|
||||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" />
|
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" />
|
||||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" type="SOURCES" />
|
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" type="SOURCES" />
|
||||||
</library>
|
</library>
|
||||||
</component>
|
</component>
|
4
examples/.idea/libraries/runtime.xml
generated
4
examples/.idea/libraries/runtime.xml
generated
|
@ -7,7 +7,7 @@
|
||||||
<SOURCES>
|
<SOURCES>
|
||||||
<root url="file://$PROJECT_DIR$/lib/runtime" />
|
<root url="file://$PROJECT_DIR$/lib/runtime" />
|
||||||
</SOURCES>
|
</SOURCES>
|
||||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" />
|
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" />
|
||||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" type="SOURCES" />
|
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" type="SOURCES" />
|
||||||
</library>
|
</library>
|
||||||
</component>
|
</component>
|
4
examples/.idea/libraries/test.xml
generated
4
examples/.idea/libraries/test.xml
generated
|
@ -7,7 +7,7 @@
|
||||||
<SOURCES>
|
<SOURCES>
|
||||||
<root url="file://$PROJECT_DIR$/lib/test" />
|
<root url="file://$PROJECT_DIR$/lib/test" />
|
||||||
</SOURCES>
|
</SOURCES>
|
||||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" />
|
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" />
|
||||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" type="SOURCES" />
|
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" type="SOURCES" />
|
||||||
</library>
|
</library>
|
||||||
</component>
|
</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">
|
<project version="4">
|
||||||
<component name="EntryPointsManager">
|
<component name="EntryPointsManager">
|
||||||
<list size="1">
|
<list size="1">
|
||||||
|
|
9
examples/.vscode/launch.json
vendored
9
examples/.vscode/launch.json
vendored
|
@ -1,12 +1,6 @@
|
||||||
{
|
{
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
|
||||||
"type": "java",
|
|
||||||
"name": "Run Main",
|
|
||||||
"request": "launch",
|
|
||||||
"mainClass": "com.example.PropertyFileExampleMain"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"type": "java",
|
"type": "java",
|
||||||
"name": "Run Tests",
|
"name": "Run Tests",
|
||||||
|
@ -18,7 +12,8 @@
|
||||||
"--disable-banner",
|
"--disable-banner",
|
||||||
"--disable-ansi-colors",
|
"--disable-ansi-colors",
|
||||||
"--exclude-engine=junit-platform-suite",
|
"--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/java",
|
||||||
"src/main/resources",
|
"src/main/resources",
|
||||||
"src/test/java",
|
"src/test/java",
|
||||||
"src/bld/java"
|
"src/test/resources",
|
||||||
|
"src/bld/java",
|
||||||
|
"src/bld/resources"
|
||||||
],
|
],
|
||||||
"java.configuration.updateBuildConfiguration": "automatic",
|
"java.configuration.updateBuildConfiguration": "automatic",
|
||||||
"java.project.referencedLibraries": [
|
"java.project.referencedLibraries": [
|
||||||
"${HOME}/.rife2/dist/rife2-1.5.16.jar",
|
"${HOME}/.bld/dist/bld-2.2.1.jar",
|
||||||
"lib/compile/*.jar",
|
"lib/**/*.jar"
|
||||||
"lib/runtime/*.jar",
|
|
||||||
"lib/test/*.jar"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,56 +1,20 @@
|
||||||
# [Bld Property File](https://github.com/rife2/bld-property-file) Extension Examples
|
# Compile and Run Example
|
||||||
|
|
||||||
## Compile
|
```console
|
||||||
|
./bld compile run
|
||||||
First make sure the project up-to-date and compiled:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
./bld download compile
|
|
||||||
```
|
|
||||||
## Run
|
|
||||||
|
|
||||||
To run the examples, issue one of the following command or combination there off.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
./bld updateMajor run
|
|
||||||
./bld updateMinor run
|
|
||||||
./bld updatePatch run
|
|
||||||
```
|
|
||||||
Upon execution, the `version.properties` file will be created and displayed:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
./bld updateMajor run
|
|
||||||
```
|
```
|
||||||
|
|
||||||
```shell
|
# Update Version Properties
|
||||||
+---------------------------+
|
|
||||||
| version.properties |
|
```console
|
||||||
+---------------------------+
|
./bld update-major run
|
||||||
#
|
./bld update-minor run
|
||||||
#Sun Apr 02 23:51:39 PDT 2023
|
./bld update-patch run
|
||||||
build.date=2023-04-02
|
./bld update-release run
|
||||||
version.major=1
|
|
||||||
version.minor=0
|
|
||||||
version.patch=0
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Subsequent commands will reflect the modifications to the
|
# Delete Version Properties
|
||||||
`version.major`, `version.minor` or `version.patch` properties:
|
|
||||||
|
|
||||||
```shell
|
```console
|
||||||
./bld upatePatch run
|
./bld delete-version run
|
||||||
```
|
```
|
||||||
|
|
||||||
```shell
|
|
||||||
+---------------------------+
|
|
||||||
| version.properties |
|
|
||||||
+---------------------------+
|
|
||||||
#
|
|
||||||
#Sun Apr 02 23:55:09 PDT 2023
|
|
||||||
build.date=2023-04-02
|
|
||||||
version.major=1
|
|
||||||
version.minor=0
|
|
||||||
version.patch=10
|
|
||||||
```
|
|
||||||
|
|
||||||
[View the Examples Build](https://github.com/rife2/bld-property-file/blob/master/examples/src/bld/java/com/example/PropertyFileExampleBuild.java)
|
|
Binary file not shown.
|
@ -1,6 +1,6 @@
|
||||||
#Sun Apr 02 10:32:44 PDT 2023
|
#Sun Apr 02 10:32:44 PDT 2023
|
||||||
bld.extension=com.uwyn.rife2:bld-property-file:0.9.0
|
|
||||||
bld.repositories=MAVEN_LOCAL,RIFE2
|
|
||||||
bld.downloadExtensionSources=true
|
bld.downloadExtensionSources=true
|
||||||
rife2.downloadLocation=
|
bld.downloadLocation=
|
||||||
rife2.version=1.5.16
|
bld.extension=com.uwyn.rife2:bld-property-file:0.9.9
|
||||||
|
bld.repositories=MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
|
||||||
|
bld.version=2.2.1
|
||||||
|
|
|
@ -3,18 +3,30 @@ package com.example;
|
||||||
import rife.bld.BuildCommand;
|
import rife.bld.BuildCommand;
|
||||||
import rife.bld.Project;
|
import rife.bld.Project;
|
||||||
import rife.bld.extension.propertyfile.Entry;
|
import rife.bld.extension.propertyfile.Entry;
|
||||||
import rife.bld.extension.propertyfile.Entry.Types;
|
import rife.bld.extension.propertyfile.EntryDate;
|
||||||
|
import rife.bld.extension.propertyfile.EntryInt;
|
||||||
import rife.bld.extension.propertyfile.PropertyFileOperation;
|
import rife.bld.extension.propertyfile.PropertyFileOperation;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static rife.bld.dependencies.Repository.MAVEN_CENTRAL;
|
import static rife.bld.dependencies.Repository.MAVEN_CENTRAL;
|
||||||
import static rife.bld.dependencies.Repository.SONATYPE_SNAPSHOTS;
|
import static rife.bld.dependencies.Repository.RIFE2_RELEASES;
|
||||||
import static rife.bld.dependencies.Scope.test;
|
import static rife.bld.dependencies.Scope.test;
|
||||||
import static rife.bld.extension.propertyfile.Calc.ADD;
|
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 {
|
public class PropertyFileExampleBuild extends Project {
|
||||||
final Entry buildDateEntry = new Entry("build.date").set("now").pattern("yyyy-MM-dd").type(Types.DATE);
|
final EntryDate buildDateEntry = new EntryDate("build.date").now().pattern("yyyy-MM-dd");
|
||||||
|
|
||||||
public PropertyFileExampleBuild() {
|
public PropertyFileExampleBuild() {
|
||||||
pkg = "com.example";
|
pkg = "com.example";
|
||||||
|
@ -22,69 +34,92 @@ public class PropertyFileExampleBuild extends Project {
|
||||||
mainClass = "com.example.PropertyFileExampleMain";
|
mainClass = "com.example.PropertyFileExampleMain";
|
||||||
version = version(0, 1, 0);
|
version = version(0, 1, 0);
|
||||||
|
|
||||||
|
javaRelease = 17;
|
||||||
|
|
||||||
downloadSources = true;
|
downloadSources = true;
|
||||||
repositories = List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS);
|
autoDownloadPurge = true;
|
||||||
|
|
||||||
|
repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES);
|
||||||
|
|
||||||
scope(test)
|
scope(test)
|
||||||
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 9, 2)))
|
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1)))
|
||||||
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 9, 2)));
|
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
new PropertyFileExampleBuild().start(args);
|
new PropertyFileExampleBuild().start(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@BuildCommand(summary = "Updates major version")
|
@BuildCommand(value = "update-major", summary = "Updates major version")
|
||||||
public void updateMajor() throws Exception {
|
public void updateMajor() throws Exception {
|
||||||
new PropertyFileOperation(this)
|
new PropertyFileOperation()
|
||||||
|
.fromProject(this)
|
||||||
.file("version.properties")
|
.file("version.properties")
|
||||||
// set the major version to 1 if it doesn't exist, increase by 1
|
// set the major version to 1 if it doesn't exist, increase by 1
|
||||||
.entry(new Entry("version.major").defaultValue(0).type(Types.INT).calc(ADD))
|
.entry(new EntryInt("version.major").defaultValue(0).calc(ADD))
|
||||||
// set the minor version to 0
|
// set the minor version to 0
|
||||||
.entry(new Entry("version.minor").set(0))
|
.entry(new EntryInt("version.minor").set(0))
|
||||||
// set the patch version to 0
|
// set the patch version to 0
|
||||||
.entry(new Entry("version.patch").set(0))
|
.entry(new EntryInt("version.patch").set(0))
|
||||||
// set the build date to the current date
|
// set the build date to the current date
|
||||||
.entry(buildDateEntry)
|
.entry(buildDateEntry)
|
||||||
.execute();
|
.execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
@BuildCommand(summary = "Updates minor version")
|
@BuildCommand(value = "update-minor", summary = "Updates minor version")
|
||||||
public void updateMinor() throws Exception {
|
public void updateMinor() throws Exception {
|
||||||
new PropertyFileOperation(this)
|
new PropertyFileOperation()
|
||||||
|
.fromProject(this)
|
||||||
.file("version.properties")
|
.file("version.properties")
|
||||||
// set the major version to 1 if it doesn't exist
|
// set the major version to 1 if it doesn't exist
|
||||||
.entry(new Entry("version.major").defaultValue(1))
|
.entry(new EntryInt("version.major").defaultValue(1))
|
||||||
// set the minor version to 0 if it doesn't exist, increase by 1
|
// set the minor version to 0 if it doesn't exist, increase by 1
|
||||||
.entry(new Entry("version.minor").defaultValue(-1).type(Types.INT).calc(ADD))
|
.entry(new EntryInt("version.minor").defaultValue(-1).calc(ADD))
|
||||||
// set the patch version to 0
|
// set the patch version to 0
|
||||||
.entry(new Entry("version.patch").set(0))
|
.entry(new EntryInt("version.patch").set(0))
|
||||||
// set the build date to the current date
|
// set the build date to the current date
|
||||||
.entry(buildDateEntry)
|
.entry(buildDateEntry)
|
||||||
.execute();
|
.execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
@BuildCommand(summary = "Updates patch version")
|
@BuildCommand(value = "update-patch", summary = "Updates patch version")
|
||||||
public void updatePatch() throws Exception {
|
public void updatePatch() throws Exception {
|
||||||
new PropertyFileOperation(this)
|
new PropertyFileOperation()
|
||||||
|
.fromProject(this)
|
||||||
.file("version.properties")
|
.file("version.properties")
|
||||||
// set the major version to 1 if it doesn't exist
|
// set the major version to 1 if it doesn't exist
|
||||||
.entry(new Entry("version.major").defaultValue(1))
|
.entry(new EntryInt("version.major").defaultValue(1))
|
||||||
// set the minor version to 0 if it doesn't exist
|
// set the minor version to 0 if it doesn't exist
|
||||||
.entry(new Entry("version.minor").defaultValue(0))
|
.entry(new EntryInt("version.minor").defaultValue(0))
|
||||||
// set the patch version to 10 if it doesn't exist, increase by 10
|
// set the patch version to 10 if it doesn't exist, increase by 10
|
||||||
.entry(new Entry("version.patch").defaultValue(0).type(Types.INT).calc(v -> v + 10))
|
.entry(new EntryInt("version.patch").defaultValue(0).calc(v -> v + 10))
|
||||||
// set the build date to the current date
|
// set the build date to the current date
|
||||||
.entry(buildDateEntry)
|
.entry(buildDateEntry)
|
||||||
.execute();
|
.execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
@BuildCommand(summary = "Delete version properties")
|
@BuildCommand(value = "update-release", summary = "Updates the release")
|
||||||
|
public void updateRelease() throws Exception {
|
||||||
|
new PropertyFileOperation()
|
||||||
|
.fromProject(this)
|
||||||
|
.file("version.properties")
|
||||||
|
// set the release to current date/time
|
||||||
|
.entry(new EntryDate("release").now().pattern("yyyyMMddHHmmss"))
|
||||||
|
// prepend 'beta.' to the release
|
||||||
|
.entry(new Entry("release").modify("beta.", (v, s) -> s + v))
|
||||||
|
.entry(buildDateEntry)
|
||||||
|
.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
@BuildCommand(value = "delete-version", summary = "Delete version properties")
|
||||||
public void deleteVersion() throws Exception {
|
public void deleteVersion() throws Exception {
|
||||||
new PropertyFileOperation(this)
|
new PropertyFileOperation()
|
||||||
|
.fromProject(this)
|
||||||
.file("version.properties")
|
.file("version.properties")
|
||||||
.entry(new Entry("version.major").delete())
|
.entry(new Entry("version.major").delete())
|
||||||
.entry(new Entry("version.minor").delete())
|
.entry(new Entry("version.minor").delete())
|
||||||
.entry(new Entry("version.patch").delete())
|
.entry(new Entry("version.patch").delete())
|
||||||
|
.entry(new Entry("release").delete())
|
||||||
.entry(buildDateEntry.delete())
|
.entry(buildDateEntry.delete())
|
||||||
.execute();
|
.execute();
|
||||||
}
|
}
|
||||||
|
|
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,2 +1,6 @@
|
||||||
#Sat Apr 01 10:09:33 PDT 2023
|
bld.downloadExtensionJavadoc=false
|
||||||
rife2.version=1.5.16
|
bld.downloadExtensionSources=true
|
||||||
|
bld.downloadLocation=
|
||||||
|
bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.2.2
|
||||||
|
bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
|
||||||
|
bld.version=2.2.1
|
||||||
|
|
|
@ -1,8 +1,25 @@
|
||||||
|
/*
|
||||||
|
* 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;
|
package rife.bld.extension.propertyfile;
|
||||||
|
|
||||||
|
import rife.bld.BuildCommand;
|
||||||
import rife.bld.Project;
|
import rife.bld.Project;
|
||||||
|
import rife.bld.extension.PmdOperation;
|
||||||
import rife.bld.publish.PublishDeveloper;
|
import rife.bld.publish.PublishDeveloper;
|
||||||
import rife.bld.publish.PublishInfo;
|
|
||||||
import rife.bld.publish.PublishLicense;
|
import rife.bld.publish.PublishLicense;
|
||||||
import rife.bld.publish.PublishScm;
|
import rife.bld.publish.PublishScm;
|
||||||
|
|
||||||
|
@ -17,46 +34,72 @@ public class PropertyFileBuild extends Project {
|
||||||
public PropertyFileBuild() {
|
public PropertyFileBuild() {
|
||||||
pkg = "rife.bld.extension";
|
pkg = "rife.bld.extension";
|
||||||
name = "bld-property-file";
|
name = "bld-property-file";
|
||||||
version = version(0, 9, 0);
|
version = version(0, 9, 9);
|
||||||
javadocOptions
|
|
||||||
.docLint(NO_MISSING)
|
|
||||||
.link("https://rife2.github.io/rife2/");
|
|
||||||
publishRepository = repository("https://repo.rife2.com/releases",
|
|
||||||
property("rife2.username"),
|
|
||||||
property("rife2.password"));
|
|
||||||
publishInfo = new PublishInfo()
|
|
||||||
.groupId("com.uwyn.rife2")
|
|
||||||
.artifactId("bld-property-file")
|
|
||||||
.description("bld Extension to Create or Modify Properties Files")
|
|
||||||
.url("https://github.com/rife2/bld-property-file")
|
|
||||||
.developer(new PublishDeveloper().id("ethauvin").name("Erik C. Thauvin").email("erik@thauvin.net")
|
|
||||||
.url("https://erik.thauvin.net/"))
|
|
||||||
.developer(new PublishDeveloper().id("gbevin").name("Geert Bevin").email("geert@uwyn.com")
|
|
||||||
.url("https://github.com/gbevin"))
|
|
||||||
.license(new PublishLicense().name("The Apache License, Version 2.0")
|
|
||||||
.url("http://www.apache.org/licenses/LICENSE-2.0.txt"))
|
|
||||||
.scm(new PublishScm().connection("scm:git:https://github.com/rife2/bld-property-file.git")
|
|
||||||
.developerConnection("scm:git:git@github.com:rife2/bld-property-file.git")
|
|
||||||
.url("https://github.com/rife2/bld-property-file"))
|
|
||||||
.signKey(property("sign.key"))
|
|
||||||
.signPassphrase(property("sign.passphrase"));
|
|
||||||
|
|
||||||
javaRelease = 17;
|
javaRelease = 17;
|
||||||
downloadSources = true;
|
downloadSources = true;
|
||||||
autoDownloadPurge = true;
|
autoDownloadPurge = true;
|
||||||
repositories = List.of(MAVEN_CENTRAL, RIFE2);
|
repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS);
|
||||||
|
|
||||||
scope(compile)
|
scope(compile)
|
||||||
.include(dependency("com.uwyn.rife2", "rife2", version(1, 5, 16)));
|
.include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1)));
|
||||||
scope(test)
|
scope(test)
|
||||||
.include(dependency("org.jsoup", "jsoup", version(1, 15, 4)))
|
.include(dependency("org.jsoup", "jsoup", version(1, 19, 1)))
|
||||||
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 9, 2)))
|
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1)))
|
||||||
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 9, 2)))
|
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1)))
|
||||||
.include(dependency("org.assertj:assertj-joda-time:2.2.0"));
|
.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("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"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
new PropertyFileBuild().start(args);
|
new PropertyFileBuild().start(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@BuildCommand(summary = "Runs PMD analysis")
|
||||||
|
public void pmd() throws Exception {
|
||||||
|
new PmdOperation()
|
||||||
|
.fromProject(this)
|
||||||
|
.failOnViolation(true)
|
||||||
|
.ruleSets("config/pmd.xml")
|
||||||
|
.execute();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -26,13 +26,25 @@ import java.util.function.IntFunction;
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
public final class Calc {
|
public final class Calc {
|
||||||
|
/**
|
||||||
|
* The add function.
|
||||||
|
*/
|
||||||
public static final IntFunction<Integer> ADD = Calc::add;
|
public static final IntFunction<Integer> ADD = Calc::add;
|
||||||
|
/**
|
||||||
|
* The sub function.
|
||||||
|
*/
|
||||||
public static final IntFunction<Integer> SUB = Calc::sub;
|
public static final IntFunction<Integer> SUB = Calc::sub;
|
||||||
|
|
||||||
|
|
||||||
|
private Calc() {
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds {@code 1} to the value.
|
* Adds {@code 1} to the value.
|
||||||
*
|
*
|
||||||
* @param v the value
|
* @param v the value
|
||||||
|
* @return the new value
|
||||||
*/
|
*/
|
||||||
public static Integer add(int v) {
|
public static Integer add(int v) {
|
||||||
return v + 1;
|
return v + 1;
|
||||||
|
@ -42,6 +54,7 @@ public final class Calc {
|
||||||
* Subtracts {@code 1} to the value.
|
* Subtracts {@code 1} to the value.
|
||||||
*
|
*
|
||||||
* @param v the value
|
* @param v the value
|
||||||
|
* @return the new value
|
||||||
*/
|
*/
|
||||||
public static Integer sub(int v) {
|
public static Integer sub(int v) {
|
||||||
return v - 1;
|
return v - 1;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -17,26 +17,17 @@
|
||||||
package rife.bld.extension.propertyfile;
|
package rife.bld.extension.propertyfile;
|
||||||
|
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.IntFunction;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Declares the modifications to be made to a {@link java.util.Properties Properties} file.
|
* Declares the modifications to be made to a {@link java.util.Properties String-based property}.
|
||||||
*
|
*
|
||||||
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
||||||
* @author <a href="https://github.com/gbevin">Geert Bevin</a>
|
* @author <a href="https://github.com/gbevin">Geert Bevin</a>
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
public class Entry {
|
public class Entry extends EntryBase<Entry> {
|
||||||
private String key;
|
private String modifyValue_ = "";
|
||||||
private String defaultValue;
|
private BiFunction<String, String, String> modify_;
|
||||||
private String newValue;
|
|
||||||
private String modifyValue;
|
|
||||||
private boolean isDelete;
|
|
||||||
private Types type = Types.STRING;
|
|
||||||
private String pattern = "";
|
|
||||||
private Units unit = Units.DAY;
|
|
||||||
private IntFunction<Integer> calc;
|
|
||||||
private BiFunction<String, String, String> modify;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link Entry entry}.
|
* Creates a new {@link Entry entry}.
|
||||||
|
@ -44,318 +35,57 @@ public class Entry {
|
||||||
* @param key the required property key
|
* @param key the required property key
|
||||||
*/
|
*/
|
||||||
public Entry(String key) {
|
public Entry(String key) {
|
||||||
this.key = key;
|
super(key);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new {@link Entry entry}.
|
|
||||||
*
|
|
||||||
* @param key the required property key
|
|
||||||
* @param type the value {@link Types Type}
|
|
||||||
*/
|
|
||||||
public Entry(String key, Types type) {
|
|
||||||
this.key = key;
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the value to be used in the {@link #modify} function.
|
|
||||||
*/
|
|
||||||
public String getModifyValue() {
|
|
||||||
return modifyValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the modify function.
|
* Returns the modify function.
|
||||||
*/
|
|
||||||
public BiFunction<String, String, String> getModify() {
|
|
||||||
return modify;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the modify function.
|
|
||||||
*/
|
|
||||||
public void setModify(BiFunction<String, String, String> modify) {
|
|
||||||
this.modify = modify;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the modify function.
|
|
||||||
*
|
*
|
||||||
* @param value the value to perform a modification with
|
* @return the modify function
|
||||||
*/
|
*/
|
||||||
public void setModify(String value, BiFunction<String, String, String> modify) {
|
protected BiFunction<String, String, String> modify() {
|
||||||
this.modifyValue = value;
|
return modify_;
|
||||||
this.modify = modify;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link Entry entry}.
|
* Sets the modify function.
|
||||||
*
|
*
|
||||||
* @param value the value to perform a modification with
|
* @param modify the modify function
|
||||||
* @param modify the modification function
|
|
||||||
*/
|
|
||||||
public Entry modify(String value, BiFunction<String, String, String> modify) {
|
|
||||||
modifyValue = value;
|
|
||||||
setModify(modify);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new {@link Entry entry}.
|
|
||||||
*
|
|
||||||
* @param modify the modification function
|
|
||||||
*/
|
*/
|
||||||
public Entry modify(BiFunction<String, String, String> modify) {
|
public Entry modify(BiFunction<String, String, String> modify) {
|
||||||
setModify(modify);
|
modify_ = modify;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns {@code true} if the {@link Entry} is to be deleted.
|
* Sets the modify function.
|
||||||
*/
|
|
||||||
public boolean isDelete() {
|
|
||||||
return isDelete;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets whether the {@link Entry} should be deleted.
|
|
||||||
*/
|
|
||||||
public void setDelete(boolean delete) {
|
|
||||||
isDelete = delete;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the calculation function.
|
|
||||||
*/
|
|
||||||
public IntFunction<Integer> getCalc() {
|
|
||||||
return calc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the calculation function.
|
|
||||||
*/
|
|
||||||
public void setCalc(IntFunction<Integer> calc) {
|
|
||||||
this.calc = calc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new {@link Entry entry}.
|
|
||||||
*
|
*
|
||||||
* @param calc the calculation function.
|
* @param value the value to perform a modification with
|
||||||
|
* @param modify the modify function
|
||||||
*/
|
*/
|
||||||
public Entry calc(IntFunction<Integer> calc) {
|
public Entry modify(String value, BiFunction<String, String, String> modify) {
|
||||||
setCalc(calc);
|
modifyValue_ = value;
|
||||||
|
modify_ = modify;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the key of the {@link java.util.Properties property}.
|
* Returns the value to be used in the {@link #modify_} function.
|
||||||
*/
|
|
||||||
public String getKey() {
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the key of the {@link java.util.Properties property}.
|
|
||||||
*
|
*
|
||||||
* @param key the {@link java.util.Properties property} key
|
* @return the modify value
|
||||||
*/
|
*/
|
||||||
public void setKey(String key) {
|
protected String modifyValue() {
|
||||||
this.key = key;
|
return modifyValue_;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the default value.
|
* Sets the new {@link java.util.Properties property} value.
|
||||||
*/
|
|
||||||
public String getDefaultValue() {
|
|
||||||
return defaultValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>Sets the initial value to set the {@link java.util.Properties property} to, if not already defined.</p>
|
|
||||||
*
|
*
|
||||||
* <p>The {@code now} keyword can be used for {@link Types#DATE Types.DATE}</p>
|
* @param s The new value
|
||||||
*
|
* @return the entry
|
||||||
* @param defaultValue the default value
|
|
||||||
*/
|
*/
|
||||||
public void setDefaultValue(String defaultValue) {
|
public Entry set(Object s) {
|
||||||
this.defaultValue = defaultValue;
|
newValue(s);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the value {@link Types Type}.
|
|
||||||
*/
|
|
||||||
public Types getType() {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the value {@link Types Type}, if none is specified {@link Types#STRING Types.STRING} is assumed.
|
|
||||||
*
|
|
||||||
* @param type the value {@link Types Type}
|
|
||||||
*/
|
|
||||||
public void setType(Types type) {
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the pattern.
|
|
||||||
*/
|
|
||||||
public String getPattern() {
|
|
||||||
return pattern;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the {@link java.text.DecimalFormat DecimalFormat} or {@link java.text.SimpleDateFormat SimpleDateFormat}
|
|
||||||
* pattern to be used with {@link Types#INT Types.INT} or {@link Types#DATE Types.DATE} respectively.
|
|
||||||
*
|
|
||||||
* @param pattern the pattern
|
|
||||||
*/
|
|
||||||
public void setPattern(String pattern) {
|
|
||||||
this.pattern = pattern;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the {@link Units unit}.
|
|
||||||
*/
|
|
||||||
public Units getUnit() {
|
|
||||||
return unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the {@link Units unit} value to apply to {@link Calc#ADD add} and {@link Calc#SUB subtract} calculations
|
|
||||||
* for {@link Types#DATE Types.DATE}.
|
|
||||||
*
|
|
||||||
* @param unit the {@link Units unit}
|
|
||||||
*/
|
|
||||||
public void setUnit(Units unit) {
|
|
||||||
this.unit = unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the key of the {@link java.util.Properties property}.
|
|
||||||
*
|
|
||||||
* @param key the {@link java.util.Properties property} key
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public Entry key(String key) {
|
|
||||||
setKey(key);
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the new value to set the {@link java.util.Properties property)} to.
|
|
||||||
*/
|
|
||||||
public String getNewValue() {
|
|
||||||
return newValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets a new value to set the {@link java.util.Properties property} to, regardless of its previous value.
|
|
||||||
*
|
|
||||||
* <p>The {@code now} keyword can be used for {@link Types#DATE Types.DATE}</p>
|
|
||||||
*
|
|
||||||
* @param newValue the {@link java.util.Properties property} new value
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public Entry set(Object newValue) {
|
|
||||||
if (newValue != null) {
|
|
||||||
this.newValue = String.valueOf(newValue);
|
|
||||||
} else {
|
|
||||||
this.newValue = null;
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>Sets the initial value to set the {@link java.util.Properties property} to, if not already defined.</p>
|
|
||||||
*
|
|
||||||
* <p>The {@code now} keyword can be used for {@link Types#DATE Types.DATE}</p>
|
|
||||||
*
|
|
||||||
* @param defaultValue the default value
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public Entry defaultValue(Object defaultValue) {
|
|
||||||
if (defaultValue != null) {
|
|
||||||
setDefaultValue(String.valueOf(defaultValue));
|
|
||||||
} else {
|
|
||||||
setDefaultValue(null);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the value {@link Types Type}, if none is specified {@link Types#STRING Types.STRING} is assumed.
|
|
||||||
*
|
|
||||||
* @param type the value {@link Types Type}
|
|
||||||
*/
|
|
||||||
public Entry type(Types type) {
|
|
||||||
setType(type);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>Sets the pattern for {@link Types#INT Types.INT} and {@link Types#DATE Types.DATE} to
|
|
||||||
* {@link java.text.DecimalFormat DecimalFormat} and {@link java.text.SimpleDateFormat SimpleDateFormat}
|
|
||||||
* respectively.</p>
|
|
||||||
*
|
|
||||||
* @param pattern the pattern
|
|
||||||
*/
|
|
||||||
public Entry pattern(String pattern) {
|
|
||||||
setPattern(pattern);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the {@link Units unit} value to apply to {@link Calc#ADD add} and {@link Calc#SUB subtract} calculations
|
|
||||||
* for {@link Types#DATE Types.DATE}.
|
|
||||||
*
|
|
||||||
* @param unit the {@link Units unit}
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public Entry unit(Units unit) {
|
|
||||||
setUnit(unit);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the {@link Entry entry} up for deletion.
|
|
||||||
*/
|
|
||||||
public Entry delete() {
|
|
||||||
isDelete = true;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The available datatypes.
|
|
||||||
*
|
|
||||||
* <uL>
|
|
||||||
* <li>{@link Types#DATE DATE}</li>
|
|
||||||
* <li>{@link Types#INT INT}</li>
|
|
||||||
* <li>{@link Types#STRING STRING}</li>
|
|
||||||
* </uL>
|
|
||||||
*/
|
|
||||||
public enum Types {
|
|
||||||
DATE, INT, STRING
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The units available for {@link Types#DATE Type.DATE} {@link Calc#ADD add}
|
|
||||||
* and {@link Calc#SUB subtract} calculations.
|
|
||||||
*
|
|
||||||
* <uL>
|
|
||||||
* <li>{@link Units#SECOND SECOND}</li>
|
|
||||||
* <li>{@link Units#MINUTE MINUTE}</li>
|
|
||||||
* <li>{@link Units#MILLISECOND MILLISECOND}</li>
|
|
||||||
* <li>{@link Units#HOUR HOUR}</li>
|
|
||||||
* <li>{@link Units#DAY DAY}</li>
|
|
||||||
* <li>{@link Units#WEEK WEEK}</li>
|
|
||||||
* <li>{@link Units#MONTH MONTH}</li>
|
|
||||||
* <li>{@link Units#YEAR YEAR}</li>
|
|
||||||
* </uL>
|
|
||||||
*/
|
|
||||||
public enum Units {
|
|
||||||
MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, YEAR
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
157
src/main/java/rife/bld/extension/propertyfile/EntryBase.java
Normal file
157
src/main/java/rife/bld/extension/propertyfile/EntryBase.java
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2023-2025 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package rife.bld.extension.propertyfile;
|
||||||
|
|
||||||
|
import java.util.function.IntFunction;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declares the modifications to be made to a {@link java.util.Properties property}.
|
||||||
|
*
|
||||||
|
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
||||||
|
* @author <a href="https://github.com/gbevin">Geert Bevin</a>
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
@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}.
|
||||||
|
*
|
||||||
|
* @param key the required property key
|
||||||
|
*/
|
||||||
|
public EntryBase(String key) {
|
||||||
|
key_ = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the calculation function.
|
||||||
|
*
|
||||||
|
* @return the calc function
|
||||||
|
*/
|
||||||
|
protected IntFunction<Integer> calc() {
|
||||||
|
return calc_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the calculation function.
|
||||||
|
*
|
||||||
|
* @param calc the calc function
|
||||||
|
*/
|
||||||
|
public T calc(IntFunction<Integer> calc) {
|
||||||
|
calc_ = calc;
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the default value.
|
||||||
|
*
|
||||||
|
* @return the default value
|
||||||
|
*/
|
||||||
|
protected Object defaultValue() {
|
||||||
|
return defaultValue_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the initial value to set the {@link java.util.Properties property} to, if not already defined.
|
||||||
|
*
|
||||||
|
* @param defaultValue the default value
|
||||||
|
*/
|
||||||
|
public T defaultValue(Object defaultValue) {
|
||||||
|
defaultValue_ = defaultValue;
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that the {@link java.util.Properties property} is to be deleted.
|
||||||
|
*/
|
||||||
|
public T delete() {
|
||||||
|
isDelete_ = true;
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns {@code true} if the {@link java.util.Properties property} is to be deleted.
|
||||||
|
*
|
||||||
|
* @return {@code true} or {@code false}
|
||||||
|
*/
|
||||||
|
protected boolean isDelete() {
|
||||||
|
return isDelete_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the key of the {@link java.util.Properties property}.
|
||||||
|
*
|
||||||
|
* @return the key
|
||||||
|
*/
|
||||||
|
protected String key() {
|
||||||
|
return key_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the key of the {@link java.util.Properties property}.
|
||||||
|
*
|
||||||
|
* @param key the {@link java.util.Properties property} key
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public T key(String key) {
|
||||||
|
key_ = key;
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the new value to set the {@link java.util.Properties property)} to.
|
||||||
|
*
|
||||||
|
* @return the new value
|
||||||
|
*/
|
||||||
|
protected Object newValue() {
|
||||||
|
return newValue_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a new value for {@link java.util.Properties property}.
|
||||||
|
*
|
||||||
|
* @param newValue the new value
|
||||||
|
*/
|
||||||
|
protected void newValue(Object newValue) {
|
||||||
|
newValue_ = newValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the pattern.
|
||||||
|
*
|
||||||
|
* @return the pattern
|
||||||
|
*/
|
||||||
|
protected Object pattern() {
|
||||||
|
return pattern_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the {@link java.util.Formatter} pattern.
|
||||||
|
*
|
||||||
|
* @param pattern the pattern
|
||||||
|
*/
|
||||||
|
public T pattern(Object pattern) {
|
||||||
|
pattern_ = pattern;
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
}
|
201
src/main/java/rife/bld/extension/propertyfile/EntryDate.java
Normal file
201
src/main/java/rife/bld/extension/propertyfile/EntryDate.java
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2023-2025 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package rife.bld.extension.propertyfile;
|
||||||
|
|
||||||
|
import java.time.*;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declares the modifications to be made to a {@link java.util.Properties Date-based property}.
|
||||||
|
*
|
||||||
|
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
public class EntryDate extends EntryBase<EntryDate> {
|
||||||
|
private EntryDate.Units unit_ = EntryDate.Units.DAY;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link EntryDate entry}.
|
||||||
|
*
|
||||||
|
* @param key the required property key
|
||||||
|
*/
|
||||||
|
public EntryDate(String key) {
|
||||||
|
super(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the new {@link java.util.Properties property} value to now.
|
||||||
|
*
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public EntryDate now() {
|
||||||
|
newValue("now");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the {@link java.time.format.DateTimeFormatter DateTimeFormatter} pattern.
|
||||||
|
*
|
||||||
|
* @param pattern the pattern
|
||||||
|
*/
|
||||||
|
public EntryDate pattern(String pattern) {
|
||||||
|
super.pattern(pattern);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the new {@link java.util.Properties property} value to an {@link Instant}
|
||||||
|
*
|
||||||
|
* @param instant the {@link Instant} to set the value to
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public EntryDate set(Instant instant) {
|
||||||
|
newValue(instant);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the new {@link java.util.Properties property} value to a {@link LocalDate}
|
||||||
|
*
|
||||||
|
* @param date the {@link LocalDate} to set the value to
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public EntryDate set(LocalDate date) {
|
||||||
|
newValue(date);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the new {@link java.util.Properties property} value to a {@link LocalDateTime}
|
||||||
|
*
|
||||||
|
* @param date the {@link LocalDateTime} to set the value to
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public EntryDate set(LocalDateTime date) {
|
||||||
|
newValue(date);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the new {@link java.util.Properties property} value to a {@link ZonedDateTime}
|
||||||
|
*
|
||||||
|
* @param date the {@link ZonedDateTime} to set the value to
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public EntryDate set(ZonedDateTime date) {
|
||||||
|
newValue(date);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the new {@link java.util.Properties property} value to a {@link LocalTime}
|
||||||
|
*
|
||||||
|
* @param time the {@link LocalTime} to set the value to
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public EntryDate set(LocalTime time) {
|
||||||
|
newValue(time);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the new {@link java.util.Properties property} value to a {@link Calendar}
|
||||||
|
*
|
||||||
|
* @param cal the {@link Calendar} to set the value to
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public EntryDate set(Calendar cal) {
|
||||||
|
newValue(cal);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the new {@link java.util.Properties property} value to a {@link Date}
|
||||||
|
*
|
||||||
|
* @param date the {@link Date} to set the value to
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public EntryDate set(Date date) {
|
||||||
|
newValue(date);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link EntryDate.Units unit}.
|
||||||
|
*
|
||||||
|
* @return the unit
|
||||||
|
*/
|
||||||
|
public EntryDate.Units unit() {
|
||||||
|
return unit_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the {@link Units unit} value to apply to calculations for {@link EntryDate}.
|
||||||
|
*
|
||||||
|
* @param unit the {@link Units unit}
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public EntryDate unit(Units unit) {
|
||||||
|
unit_ = unit;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The units available for {@link EntryDate} calculations.
|
||||||
|
*
|
||||||
|
* <uL>
|
||||||
|
* <li>{@link Units#SECOND SECOND}</li>
|
||||||
|
* <li>{@link Units#MINUTE MINUTE}</li>
|
||||||
|
* <li>{@link Units#HOUR HOUR}</li>
|
||||||
|
* <li>{@link Units#DAY DAY}</li>
|
||||||
|
* <li>{@link Units#WEEK WEEK}</li>
|
||||||
|
* <li>{@link Units#MONTH MONTH}</li>
|
||||||
|
* <li>{@link Units#YEAR YEAR}</li>
|
||||||
|
* </uL>
|
||||||
|
*/
|
||||||
|
public enum Units {
|
||||||
|
/**
|
||||||
|
* Second units.
|
||||||
|
*/
|
||||||
|
SECOND,
|
||||||
|
/**
|
||||||
|
* Minute units.
|
||||||
|
*/
|
||||||
|
MINUTE,
|
||||||
|
/**
|
||||||
|
* Hour units.
|
||||||
|
*/
|
||||||
|
HOUR,
|
||||||
|
/**
|
||||||
|
* Day units.
|
||||||
|
*/
|
||||||
|
DAY,
|
||||||
|
/**
|
||||||
|
* Week units.
|
||||||
|
*/
|
||||||
|
WEEK,
|
||||||
|
/**
|
||||||
|
* Month units.
|
||||||
|
*/
|
||||||
|
MONTH,
|
||||||
|
/**
|
||||||
|
* Year units.
|
||||||
|
*/
|
||||||
|
YEAR
|
||||||
|
}
|
||||||
|
}
|
55
src/main/java/rife/bld/extension/propertyfile/EntryInt.java
Normal file
55
src/main/java/rife/bld/extension/propertyfile/EntryInt.java
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2023-2025 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package rife.bld.extension.propertyfile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declares the modifications to be made to an {@link java.util.Properties Integer-based property}.
|
||||||
|
*
|
||||||
|
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
public class EntryInt extends EntryBase<EntryInt> {
|
||||||
|
/**
|
||||||
|
* Creates a new {@link EntryInt entry}.
|
||||||
|
*
|
||||||
|
* @param key the required property key
|
||||||
|
*/
|
||||||
|
public EntryInt(String key) {
|
||||||
|
super(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the {@link java.text.DecimalFormat DecimalFormat} pattern.
|
||||||
|
*
|
||||||
|
* @param pattern the pattern
|
||||||
|
*/
|
||||||
|
public EntryInt pattern(String pattern) {
|
||||||
|
super.pattern(pattern);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the new {@link java.util.Properties property} value to an integer.
|
||||||
|
*
|
||||||
|
* @param i The integer to set the value to
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public EntryInt set(int i) {
|
||||||
|
newValue(i);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -16,14 +16,17 @@
|
||||||
|
|
||||||
package rife.bld.extension.propertyfile;
|
package rife.bld.extension.propertyfile;
|
||||||
|
|
||||||
import rife.bld.Project;
|
import rife.bld.BaseProject;
|
||||||
import rife.bld.operations.AbstractOperation;
|
import rife.bld.operations.AbstractOperation;
|
||||||
|
import rife.bld.operations.exceptions.ExitStatusException;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates or applies edits to a {@link Properties Properties} file.
|
* Creates or applies edits to a {@link Properties Properties} file.
|
||||||
|
@ -32,14 +35,22 @@ import java.util.Properties;
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
public class PropertyFileOperation extends AbstractOperation<PropertyFileOperation> {
|
public class PropertyFileOperation extends AbstractOperation<PropertyFileOperation> {
|
||||||
private final List<Entry> entries = new ArrayList<>();
|
private static final Logger LOGGER = Logger.getLogger(PropertyFileOperation.class.getName());
|
||||||
private final Project project;
|
private final List<EntryBase<?>> entries_ = new ArrayList<>();
|
||||||
private File file;
|
private String comment_ = "";
|
||||||
private String comment = "";
|
private boolean failOnWarning_;
|
||||||
private boolean failOnWarning;
|
private File file_;
|
||||||
|
private BaseProject project_;
|
||||||
|
|
||||||
public PropertyFileOperation(Project project) {
|
/**
|
||||||
this.project = 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
|
||||||
|
*/
|
||||||
|
public PropertyFileOperation comment(String comment) {
|
||||||
|
comment_ = comment;
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -47,54 +58,10 @@ public class PropertyFileOperation extends AbstractOperation<PropertyFileOperati
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
* @param entry the {@link Entry entry}
|
* @param entry the {@link Entry entry}
|
||||||
|
* @return this instance
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unused")
|
public PropertyFileOperation entry(EntryBase<?> entry) {
|
||||||
public PropertyFileOperation entry(Entry entry) {
|
entries_.add(entry);
|
||||||
entries.add(entry);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the location of the {@link java.util.Properties} file to be edited.
|
|
||||||
*
|
|
||||||
* @param file the file to be edited
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public PropertyFileOperation file(String file) {
|
|
||||||
this.file = new File(file);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the location of the {@link java.util.Properties} file to be edited.
|
|
||||||
*
|
|
||||||
* @param file the file to be edited
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public PropertyFileOperation file(File file) {
|
|
||||||
this.file = file;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the command to return a failure on any warnings.
|
|
||||||
*
|
|
||||||
* @param failOnWarning if set to {@code true}, the task will fail on any warnings.
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public PropertyFileOperation failOnWarning(boolean failOnWarning) {
|
|
||||||
this.failOnWarning = failOnWarning;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the comment to be inserted at the top of the {@link java.util.Properties} file.
|
|
||||||
*
|
|
||||||
* @param comment the header comment
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public PropertyFileOperation comment(String comment) {
|
|
||||||
this.comment = comment;
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,46 +70,139 @@ public class PropertyFileOperation extends AbstractOperation<PropertyFileOperati
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void execute() throws Exception {
|
public void execute() throws Exception {
|
||||||
if (project == null) {
|
if (project_ == null) {
|
||||||
throw new IOException("A project must be specified.");
|
if (LOGGER.isLoggable(Level.SEVERE) && !silent()) {
|
||||||
|
LOGGER.log(Level.SEVERE, "A project is required");
|
||||||
}
|
}
|
||||||
if (file == null) {
|
throw new ExitStatusException(ExitStatusException.EXIT_FAILURE);
|
||||||
throw new IOException("A properties file location must be specified.");
|
|
||||||
}
|
}
|
||||||
var commandName = project.getCurrentCommandName();
|
|
||||||
var success = false;
|
var commandName = project_.getCurrentCommandName();
|
||||||
var properties = new Properties();
|
var properties = new Properties();
|
||||||
success = PropertyFileUtils.loadProperties(commandName, file, properties);
|
var success = true;
|
||||||
if (success) {
|
|
||||||
for (var entry : entries) {
|
if (file_ == null) {
|
||||||
if (entry.getKey().isBlank()) {
|
warn(commandName, "A properties file must be specified.");
|
||||||
PropertyFileUtils.warn(commandName, "At least one entry key must specified.");
|
|
||||||
success = false;
|
|
||||||
} else {
|
} else {
|
||||||
var key = entry.getKey();
|
success = PropertyFileUtils.loadProperties(commandName, file_, properties, silent());
|
||||||
var value = entry.getNewValue();
|
}
|
||||||
var defaultValue = entry.getDefaultValue();
|
|
||||||
|
if (success) {
|
||||||
|
for (var entry : entries_) {
|
||||||
|
if (entry.key().isBlank()) {
|
||||||
|
warn(commandName, "An entry key must specified.");
|
||||||
|
} else {
|
||||||
|
var key = entry.key();
|
||||||
|
Object value = entry.newValue();
|
||||||
|
Object defaultValue = entry.defaultValue();
|
||||||
|
var p = properties.getProperty(key);
|
||||||
if (entry.isDelete()) {
|
if (entry.isDelete()) {
|
||||||
properties.remove(key);
|
properties.remove(key);
|
||||||
} else if ((value == null || value.isBlank()) && (defaultValue == null || defaultValue.isBlank())) {
|
} else if ((value == null || String.valueOf(value).isBlank())
|
||||||
PropertyFileUtils.warn(commandName, "An entry must be set or have a default value: " + key);
|
&& (defaultValue == null || String.valueOf(defaultValue).isBlank())
|
||||||
success = false;
|
&& (p == null || p.isBlank())) {
|
||||||
|
warn(commandName, "An entry must be set or have a default value: " + key);
|
||||||
} else {
|
} else {
|
||||||
switch (entry.getType()) {
|
try {
|
||||||
case DATE ->
|
if (entry instanceof EntryDate) {
|
||||||
success = PropertyFileUtils.processDate(commandName, properties, entry, failOnWarning);
|
PropertyFileUtils.processDate(properties, (EntryDate) entry);
|
||||||
case INT ->
|
} else if (entry instanceof EntryInt) {
|
||||||
success = PropertyFileUtils.processInt(commandName, properties, entry, failOnWarning);
|
PropertyFileUtils.processInt(properties, (EntryInt) entry);
|
||||||
default -> success = PropertyFileUtils.processString(properties, entry);
|
} else {
|
||||||
|
PropertyFileUtils.processString(properties, (Entry) entry);
|
||||||
|
}
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
warn(commandName, e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (failOnWarning && !success) {
|
|
||||||
throw new RuntimeException("Properties file configuration failed: " + file);
|
if (success) {
|
||||||
} else if (success) {
|
PropertyFileUtils.saveProperties(file_, comment_, properties);
|
||||||
PropertyFileUtils.saveProperties(file, comment, properties);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the {@link #execute() execution} to return a failure on any warnings.
|
||||||
|
*
|
||||||
|
* @param failOnWarning if set to {@code true}, the execution will fail on any warnings.
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public PropertyFileOperation failOnWarning(boolean failOnWarning) {
|
||||||
|
failOnWarning_ = failOnWarning;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the location of the {@link java.util.Properties} file to be edited.
|
||||||
|
*
|
||||||
|
* @param file the file to be edited
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public PropertyFileOperation file(File file) {
|
||||||
|
file_ = file;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the location of the {@link java.util.Properties} file to be edited.
|
||||||
|
*
|
||||||
|
* @param file the file to be edited
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public PropertyFileOperation file(String file) {
|
||||||
|
return file(new File(file));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the location of the {@link java.util.Properties} file to be edited.
|
||||||
|
*
|
||||||
|
* @return the properties file
|
||||||
|
*/
|
||||||
|
public File file() {
|
||||||
|
return file_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the location of the {@link java.util.Properties} file to be edited.
|
||||||
|
*
|
||||||
|
* @param file the file to be edited
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public PropertyFileOperation file(Path file) {
|
||||||
|
return file(file.toFile());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new operation.
|
||||||
|
*
|
||||||
|
* @param project the project
|
||||||
|
* @return this instance
|
||||||
|
*/
|
||||||
|
public PropertyFileOperation fromProject(BaseProject project) {
|
||||||
|
project_ = project;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs a warning.
|
||||||
|
*
|
||||||
|
* @param command The command name
|
||||||
|
* @param message the message log
|
||||||
|
* @throws ExitStatusException if a {@link Level#SEVERE} exception occurs
|
||||||
|
*/
|
||||||
|
private void warn(String command, String message) throws ExitStatusException {
|
||||||
|
if (failOnWarning_) {
|
||||||
|
if (LOGGER.isLoggable(Level.SEVERE) && !silent()) {
|
||||||
|
LOGGER.log(Level.SEVERE, '[' + command + "] " + message);
|
||||||
|
throw new ExitStatusException(ExitStatusException.EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (LOGGER.isLoggable(Level.WARNING) && !silent()) {
|
||||||
|
LOGGER.warning('[' + command + "] " + message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -16,105 +16,44 @@
|
||||||
|
|
||||||
package rife.bld.extension.propertyfile;
|
package rife.bld.extension.propertyfile;
|
||||||
|
|
||||||
import rife.bld.extension.propertyfile.Entry.Units;
|
import rife.bld.operations.exceptions.ExitStatusException;
|
||||||
import rife.tools.Localization;
|
|
||||||
|
|
||||||
import javax.imageio.IIOException;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.StandardOpenOption;
|
import java.nio.file.StandardOpenOption;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.time.*;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Collection of utility-type methods commonly used in this project.
|
* Collection of common methods used in this project.
|
||||||
*
|
*
|
||||||
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
public final class PropertyFileUtils {
|
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 final static Map<Units, Integer> CALENDAR_FIELDS =
|
|
||||||
Map.of(Units.MILLISECOND, Calendar.MILLISECOND,
|
|
||||||
Units.SECOND, Calendar.SECOND,
|
|
||||||
Units.MINUTE, Calendar.MINUTE,
|
|
||||||
Units.HOUR, Calendar.HOUR_OF_DAY,
|
|
||||||
Units.DAY, Calendar.DATE,
|
|
||||||
Units.WEEK, Calendar.WEEK_OF_YEAR,
|
|
||||||
Units.MONTH, Calendar.MONTH,
|
|
||||||
Units.YEAR, Calendar.YEAR);
|
|
||||||
|
|
||||||
private PropertyFileUtils() {
|
private PropertyFileUtils() {
|
||||||
// no-op
|
// no-op
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Processes a date {@link Properties property}.
|
|
||||||
*
|
|
||||||
* @param command the issuing command
|
|
||||||
* @param p the {@link Properties property}
|
|
||||||
* @param entry the {@link Entry} containing the {@link Properties property} edits
|
|
||||||
* @return {@code true} if successful
|
|
||||||
*/
|
|
||||||
public static boolean processDate(String command, Properties p, Entry entry, boolean failOnWarning) {
|
|
||||||
var success = true;
|
|
||||||
var cal = Calendar.getInstance();
|
|
||||||
String value = PropertyFileUtils.currentValue(p.getProperty(entry.getKey()), entry.getDefaultValue(),
|
|
||||||
entry.getNewValue());
|
|
||||||
|
|
||||||
var pattern = entry.getPattern();
|
|
||||||
SimpleDateFormat fmt;
|
|
||||||
if (pattern.isBlank()) {
|
|
||||||
fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm", Localization.getLocale());
|
|
||||||
} else {
|
|
||||||
fmt = new SimpleDateFormat(entry.getPattern(), Localization.getLocale());
|
|
||||||
}
|
|
||||||
|
|
||||||
if ("now".equalsIgnoreCase(value) || value.isBlank()) {
|
|
||||||
cal.setTime(new Date());
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
cal.setTime(fmt.parse(value));
|
|
||||||
} catch (ParseException pe) {
|
|
||||||
warn(command, "Non-date value for \"" + entry.getKey() + "\" --> " + pe.getMessage(),
|
|
||||||
pe, failOnWarning);
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var offset = 0;
|
|
||||||
|
|
||||||
if (entry.getCalc() != null) {
|
|
||||||
offset = entry.getCalc().apply(offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
//noinspection MagicConstant
|
|
||||||
cal.add(CALENDAR_FIELDS.getOrDefault(entry.getUnit(), Calendar.DATE), offset);
|
|
||||||
|
|
||||||
p.setProperty(entry.getKey(), fmt.format(cal.getTime()));
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the new value, value or default value depending on which is specified.
|
* Returns the new value, value or default value depending on which is specified.
|
||||||
*
|
*
|
||||||
* @param value the value
|
* @param value the value
|
||||||
* @param newValue the new value
|
|
||||||
* @param defaultValue the default value
|
* @param defaultValue the default value
|
||||||
* @return the current value
|
* @param newValue the new value
|
||||||
|
* @return the object
|
||||||
*/
|
*/
|
||||||
public static String currentValue(String value, String defaultValue, String newValue) {
|
public static Object currentValue(String value, Object defaultValue, Object newValue) {
|
||||||
if (newValue != null) {
|
if (newValue != null) {
|
||||||
return newValue;
|
return newValue;
|
||||||
} else if (value == null) {
|
} else if (value == null) {
|
||||||
|
@ -125,112 +64,176 @@ public final class PropertyFileUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Processes an integer {@link Properties property}.
|
* Loads a {@link Properties properties} file.
|
||||||
*
|
*
|
||||||
* @param command the issuing command
|
* @param command the issuing command
|
||||||
* @param p the {@link Properties property}
|
* @param file the file location
|
||||||
* @param entry the {@link Entry} containing the {@link Properties property} edits
|
* @param p the {@link Properties properties} to load into.
|
||||||
* @return {@code true} if successful
|
* @return the boolean
|
||||||
|
* @throws ExitStatusException if an error occurred
|
||||||
*/
|
*/
|
||||||
public static boolean processInt(String command, Properties p, Entry entry, boolean failOnWarning) {
|
public static boolean loadProperties(String command, File file, Properties p, boolean silent)
|
||||||
var success = true;
|
throws ExitStatusException {
|
||||||
int intValue = 0;
|
boolean success = true;
|
||||||
try {
|
if (file != null) {
|
||||||
var fmt = new DecimalFormat(entry.getPattern());
|
if (file.exists()) {
|
||||||
String value = PropertyFileUtils.currentValue(p.getProperty(entry.getKey()), entry.getDefaultValue(),
|
try (var propStream = Files.newInputStream(file.toPath(), StandardOpenOption.READ)) {
|
||||||
entry.getNewValue());
|
p.load(propStream);
|
||||||
|
} catch (IOException ioe) {
|
||||||
if (value != null) {
|
warn(command, "Could not load properties file: " + ioe.getMessage(), true, silent);
|
||||||
intValue = fmt.parse(value).intValue();
|
success = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (entry.getCalc() != null) {
|
} else {
|
||||||
intValue = entry.getCalc().apply(intValue);
|
warn(command, "Please specify the properties file location.", true, silent);
|
||||||
}
|
|
||||||
p.setProperty(entry.getKey(), fmt.format(intValue));
|
|
||||||
} catch (NumberFormatException | ParseException e) {
|
|
||||||
warn(command, "Non-integer value for \"" + entry.getKey() + "\" --> " + e.getMessage(), e,
|
|
||||||
failOnWarning);
|
|
||||||
success = false;
|
success = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String objectToString(Object o) {
|
||||||
|
if (o == null) {
|
||||||
|
return "";
|
||||||
|
} else {
|
||||||
|
return String.valueOf(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes a date {@link Properties property}.
|
||||||
|
*
|
||||||
|
* @param p the {@link Properties property}
|
||||||
|
* @param entry the {@link Entry} containing the {@link Properties property} edits
|
||||||
|
* @throws DateTimeException if a parsing error occurs
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("PMD.ExceptionAsFlowControl")
|
||||||
|
public static void processDate(Properties p, EntryDate entry) throws IllegalArgumentException {
|
||||||
|
var currentValue = currentValue(null, entry.defaultValue(), entry.newValue());
|
||||||
|
var pattern = objectToString(entry.pattern());
|
||||||
|
|
||||||
|
var dateValue = String.valueOf(currentValue);
|
||||||
|
if (pattern != null && !pattern.isBlank()) {
|
||||||
|
var offset = 0;
|
||||||
|
|
||||||
|
if (entry.calc() != null) {
|
||||||
|
offset = entry.calc().apply(offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
var dtf = DateTimeFormatter.ofPattern(pattern);
|
||||||
|
var unit = entry.unit();
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (currentValue instanceof String) {
|
||||||
|
if ("now".equalsIgnoreCase((String) currentValue)) {
|
||||||
|
currentValue = ZonedDateTime.now();
|
||||||
|
} else {
|
||||||
|
throw new DateTimeException("Excepted: Calendar, Date or java.time.");
|
||||||
|
}
|
||||||
|
} else if (currentValue instanceof LocalDateTime) {
|
||||||
|
currentValue = ((LocalDateTime) currentValue).atZone(ZoneId.systemDefault());
|
||||||
|
} else if (currentValue instanceof Date) {
|
||||||
|
currentValue = ((Date) currentValue).toInstant().atZone(ZoneId.systemDefault());
|
||||||
|
} else if (currentValue instanceof Calendar) {
|
||||||
|
currentValue = ((Calendar) currentValue).toInstant().atZone(ZoneId.systemDefault());
|
||||||
|
} else if (currentValue instanceof Instant) {
|
||||||
|
currentValue = ((Instant) currentValue).atZone(ZoneId.systemDefault());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentValue instanceof LocalDate) {
|
||||||
|
if (offset != 0) {
|
||||||
|
if (unit == EntryDate.Units.DAY) {
|
||||||
|
currentValue = ((LocalDate) currentValue).plusDays(offset);
|
||||||
|
} else if (unit == EntryDate.Units.MONTH) {
|
||||||
|
currentValue = ((LocalDate) currentValue).plusMonths(offset);
|
||||||
|
} else if (unit == EntryDate.Units.WEEK) {
|
||||||
|
currentValue = ((LocalDate) currentValue).plusWeeks(offset);
|
||||||
|
} else if (unit == EntryDate.Units.YEAR) {
|
||||||
|
currentValue = ((LocalDate) currentValue).plusYears(offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dateValue = dtf.format((LocalDate) currentValue);
|
||||||
|
} else if (currentValue instanceof LocalTime) {
|
||||||
|
if (offset != 0) {
|
||||||
|
if (unit == EntryDate.Units.SECOND) {
|
||||||
|
currentValue = ((LocalTime) currentValue).plusSeconds(offset);
|
||||||
|
} else if (unit == EntryDate.Units.MINUTE) {
|
||||||
|
currentValue = ((LocalTime) currentValue).plusMinutes(offset);
|
||||||
|
} else if (unit == EntryDate.Units.HOUR) {
|
||||||
|
currentValue = ((LocalTime) currentValue).plusHours(offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dateValue = dtf.format((LocalTime) currentValue);
|
||||||
|
} else if (currentValue instanceof ZonedDateTime) {
|
||||||
|
if (offset != 0) {
|
||||||
|
if (unit == EntryDate.Units.DAY) {
|
||||||
|
currentValue = ((ZonedDateTime) currentValue).plusDays(offset);
|
||||||
|
} else if (unit == EntryDate.Units.MONTH) {
|
||||||
|
currentValue = ((ZonedDateTime) currentValue).plusMonths(offset);
|
||||||
|
} else if (unit == EntryDate.Units.WEEK) {
|
||||||
|
currentValue = ((ZonedDateTime) currentValue).plusWeeks(offset);
|
||||||
|
} else if (unit == EntryDate.Units.YEAR) {
|
||||||
|
currentValue = ((ZonedDateTime) currentValue).plusYears(offset);
|
||||||
|
} else if (unit == EntryDate.Units.SECOND) {
|
||||||
|
currentValue = ((ZonedDateTime) currentValue).plusSeconds(offset);
|
||||||
|
} else if (unit == EntryDate.Units.MINUTE) {
|
||||||
|
currentValue = ((ZonedDateTime) currentValue).plusMinutes(offset);
|
||||||
|
} else if (unit == EntryDate.Units.HOUR) {
|
||||||
|
currentValue = ((ZonedDateTime) currentValue).plusHours(offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dateValue = dtf.format((ZonedDateTime) currentValue);
|
||||||
|
}
|
||||||
|
} catch (DateTimeException dte) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Non-date value for \"" + entry.key() + "\" --> " + dte.getMessage(), dte);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p.setProperty(entry.key(), dateValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes an integer {@link Properties property}.
|
||||||
|
*
|
||||||
|
* @param p the {@link Properties property}
|
||||||
|
* @param entry the {@link Entry} containing the {@link Properties property} edits
|
||||||
|
* @throws NumberFormatException if a parsing error occurs
|
||||||
|
*/
|
||||||
|
public static void processInt(Properties p, EntryInt entry) throws IllegalArgumentException {
|
||||||
|
int intValue = 0;
|
||||||
|
try {
|
||||||
|
var fmt = new DecimalFormat(objectToString(entry.pattern()));
|
||||||
|
var currentValue = currentValue(p.getProperty(entry.key()), entry.defaultValue(), entry.newValue());
|
||||||
|
|
||||||
|
if (currentValue != null) {
|
||||||
|
intValue = fmt.parse(String.valueOf(currentValue)).intValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry.calc() != null) {
|
||||||
|
intValue = entry.calc().apply(intValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
p.setProperty(entry.key(), fmt.format(intValue));
|
||||||
|
} catch (NumberFormatException | ParseException e) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Non-integer value for \"" + entry.key() + "\" --> " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Processes a string {@link Properties property}.
|
* Processes a string {@link Properties property}.
|
||||||
*
|
*
|
||||||
* @param p the {@link Properties property}
|
* @param p the {@link Properties property}
|
||||||
* @param entry the {@link Entry} containing the {@link Properties property} edits
|
* @param entry the {@link Entry} containing the {@link Properties property} edits
|
||||||
* @return {@code true} if successful
|
|
||||||
*/
|
*/
|
||||||
public static boolean processString(Properties p, Entry entry) {
|
public static void processString(Properties p, Entry entry) {
|
||||||
var value = PropertyFileUtils.currentValue(p.getProperty(entry.getKey()), entry.getDefaultValue(),
|
var currentValue = currentValue(p.getProperty(entry.key()), entry.defaultValue(), entry.newValue());
|
||||||
entry.getNewValue());
|
|
||||||
|
|
||||||
p.setProperty(entry.getKey(), value);
|
p.setProperty(entry.key(), String.format(String.valueOf(currentValue), entry.pattern()));
|
||||||
|
|
||||||
if (entry.getModify() != null && entry.getModifyValue() != null) {
|
if (entry.modify() != null && entry.modifyValue() != null) {
|
||||||
p.setProperty(entry.getKey(), entry.getModify().apply(p.getProperty(entry.getKey()), entry.getModifyValue()));
|
var modify = entry.modify().apply(p.getProperty(entry.key()), entry.modifyValue());
|
||||||
|
p.setProperty(entry.key(), String.format(modify, entry.pattern()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs a warning.
|
|
||||||
*
|
|
||||||
* @param command The command name
|
|
||||||
* @param message the message log
|
|
||||||
* @param e the related exception
|
|
||||||
* @param failOnWarning skips logging the exception if set to {@code false}
|
|
||||||
*/
|
|
||||||
static void warn(String command, String message, Exception e, boolean failOnWarning) {
|
|
||||||
if (LOGGER.isLoggable(Level.WARNING)) {
|
|
||||||
if (failOnWarning) {
|
|
||||||
LOGGER.log(Level.WARNING, '[' + command + "] " + message, e);
|
|
||||||
} else {
|
|
||||||
LOGGER.warning('[' + command + "] " + message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads a {@link Properties properties} file.
|
|
||||||
*
|
|
||||||
* @param command the issuing command
|
|
||||||
* @param file the file location.
|
|
||||||
* @param p the {@link Properties properties} to load into.
|
|
||||||
* @return {@code true} if successful
|
|
||||||
*/
|
|
||||||
public static boolean loadProperties(String command, File file, Properties p) {
|
|
||||||
boolean success = true;
|
|
||||||
if (file != null) {
|
|
||||||
if (file.exists()) {
|
|
||||||
try (var propStream = Files.newInputStream(file.toPath(), StandardOpenOption.READ)) {
|
|
||||||
p.load(propStream);
|
|
||||||
} catch (IOException ioe) {
|
|
||||||
warn(command, "Could not load properties file: " + ioe.getMessage(), ioe, true);
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
warn(command, "Please specify the properties file location.");
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
return success;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -239,12 +242,35 @@ public final class PropertyFileUtils {
|
||||||
* @param file the file location
|
* @param file the file location
|
||||||
* @param comment the header comment
|
* @param comment the header comment
|
||||||
* @param p the {@link Properties} to save into the file
|
* @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 {
|
public static void saveProperties(File file, String comment, Properties p) throws IOException {
|
||||||
try (var output = Files.newOutputStream(file.toPath())) {
|
try (var output = Files.newOutputStream(file.toPath())) {
|
||||||
p.store(output, comment);
|
p.store(output, comment);
|
||||||
} catch (IIOException ioe) {
|
} catch (IOException ioe) {
|
||||||
throw new IIOException("An IO error occurred while saving the Properties file: " + file, ioe);
|
throw new IOException("An IO error occurred while saving the Properties file: " + file, ioe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs a warning.
|
||||||
|
*
|
||||||
|
* @param command The command name
|
||||||
|
* @param message the message log
|
||||||
|
* @param failOnWarning logs and throws exception if set to {@code true}
|
||||||
|
* @throws ExitStatusException if a {@link Level#SEVERE} exception occurs
|
||||||
|
*/
|
||||||
|
static void warn(String command, String message, boolean failOnWarning, boolean silent)
|
||||||
|
throws ExitStatusException {
|
||||||
|
if (failOnWarning) {
|
||||||
|
if (LOGGER.isLoggable(Level.SEVERE) && !silent) {
|
||||||
|
LOGGER.log(Level.SEVERE, '[' + command + "] " + message);
|
||||||
|
}
|
||||||
|
throw new ExitStatusException(ExitStatusException.EXIT_FAILURE);
|
||||||
|
} else {
|
||||||
|
if (LOGGER.isLoggable(Level.WARNING) && !silent) {
|
||||||
|
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,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -17,11 +17,12 @@
|
||||||
package rife.bld.extension.propertyfile;
|
package rife.bld.extension.propertyfile;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
import rife.bld.operations.exceptions.ExitStatusException;
|
||||||
import rife.tools.Localization;
|
import rife.tools.Localization;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.time.*;
|
||||||
import java.text.SimpleDateFormat;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
@ -36,122 +37,229 @@ import static rife.bld.extension.propertyfile.Calc.SUB;
|
||||||
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("PMD.AvoidDuplicateLiterals")
|
||||||
class PropertyFileUtilsTest {
|
class PropertyFileUtilsTest {
|
||||||
final Properties p = new Properties();
|
final static Properties p = new Properties();
|
||||||
final String t = "test";
|
final static String t = "test";
|
||||||
|
|
||||||
|
public Entry newEntry() {
|
||||||
|
p.clear();
|
||||||
|
return new Entry("version.major").set("1");
|
||||||
|
}
|
||||||
|
|
||||||
|
public EntryDate newEntryDate() {
|
||||||
|
p.clear();
|
||||||
|
return new EntryDate("aDate").pattern("D");
|
||||||
|
}
|
||||||
|
|
||||||
|
public EntryInt newEntryInt() {
|
||||||
|
p.clear();
|
||||||
|
return new EntryInt("version.patch");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void parseDateSub() {
|
||||||
|
var entryDate = newEntryDate().calc(SUB);
|
||||||
|
PropertyFileUtils.processDate(p, entryDate.now());
|
||||||
|
assertThat(p.getProperty(entryDate.key())).as("processDate(now-3)").isEqualTo(String.valueOf(
|
||||||
|
LocalDateTime.now().minusDays(1).getDayOfYear()));
|
||||||
|
|
||||||
|
entryDate.calc(v -> v - 2);
|
||||||
|
PropertyFileUtils.processDate(p, entryDate.now());
|
||||||
|
assertThat(p.getProperty(entryDate.key())).as("processDate(now-2)").isEqualTo(String.valueOf(
|
||||||
|
LocalDateTime.now().minusDays(2).getDayOfYear()));
|
||||||
|
|
||||||
|
entryDate.calc(SUB);
|
||||||
|
PropertyFileUtils.processDate(p, entryDate.set(new Date()));
|
||||||
|
assertThat(p.getProperty(entryDate.key())).as("processDate(date-1)").isEqualTo(String.valueOf(
|
||||||
|
LocalDateTime.now().minusDays(1).getDayOfYear()));
|
||||||
|
|
||||||
|
entryDate.calc(v -> v - 2);
|
||||||
|
PropertyFileUtils.processDate(p, entryDate.set(Calendar.getInstance()));
|
||||||
|
assertThat(p.getProperty(entryDate.key())).as("processDate(cal-2)").isEqualTo(String.valueOf(
|
||||||
|
LocalDateTime.now().minusDays(2).getDayOfYear()));
|
||||||
|
|
||||||
|
entryDate.calc(v -> v - 3);
|
||||||
|
PropertyFileUtils.processDate(p, entryDate.set(LocalDate.now()));
|
||||||
|
assertThat(p.getProperty(entryDate.key())).as("processDate(LocalDate-3)").isEqualTo(String.valueOf(
|
||||||
|
LocalDateTime.now().minusDays(3).getDayOfYear()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void parseIntSubTest() {
|
||||||
|
var entryInt = newEntryInt().calc(SUB).pattern("0000");
|
||||||
|
PropertyFileUtils.processInt(p, entryInt.defaultValue("0017"));
|
||||||
|
assertThat(p.getProperty(entryInt.key())).as("sub(0017)").isEqualTo("0016");
|
||||||
|
|
||||||
|
PropertyFileUtils.processInt(p, entryInt.set(16).calc(v -> v - 3));
|
||||||
|
assertThat(p.getProperty(entryInt.key())).as("sub(16)-3").isEqualTo("0013");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@SuppressWarnings("PMD.AvoidDuplicateLiterals")
|
||||||
|
void parseStringAppend() {
|
||||||
|
var entry = newEntry();
|
||||||
|
PropertyFileUtils.processString(p, entry.set(1));
|
||||||
|
PropertyFileUtils.processString(p, entry.modify("-foo", String::concat));
|
||||||
|
assertThat(p.getProperty(entry.key())).as(String.format("processString(%s, %s)", entry.key(),
|
||||||
|
entry.newValue())).isEqualTo("1-foo");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void parseStringCap() {
|
||||||
|
var entry = newEntry();
|
||||||
|
PropertyFileUtils.processString(p, entry.set(t).modify("", (v, s) -> v.toUpperCase(Localization.getLocale())));
|
||||||
|
assertThat(p.getProperty(entry.key())).as("capitalize").isEqualTo(t.toUpperCase(Localization.getLocale()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void parseStringCat() {
|
||||||
|
var entry = newEntry();
|
||||||
|
entry.set(t).modify("-foo", String::concat);
|
||||||
|
PropertyFileUtils.processString(p, entry);
|
||||||
|
assertThat(p.getProperty(entry.key())).as("replace").isEqualTo(t + "-foo");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void parseStringFormat() {
|
||||||
|
var entry = new Entry("foo").set("%.2f").pattern(3.14159f);
|
||||||
|
PropertyFileUtils.processString(p, entry);
|
||||||
|
assertThat(p.getProperty(entry.key())).as("format").isEqualTo("3.14");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void parseStringPrepend() {
|
||||||
|
var entry = newEntry();
|
||||||
|
PropertyFileUtils.processString(p, entry.set(1));
|
||||||
|
PropertyFileUtils.processString(p, entry.modify("foo-", (v, s) -> s + v));
|
||||||
|
assertThat(p.getProperty(entry.key())).as(String.format("processString(%s, %s)", entry.key(), entry.newValue()))
|
||||||
|
.isEqualTo("foo-1");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void parseStringReplace() {
|
||||||
|
var entry = newEntry();
|
||||||
|
entry.set(t).modify("T", (v, s) -> v.replace("t", s));
|
||||||
|
PropertyFileUtils.processString(p, entry);
|
||||||
|
assertThat(p.getProperty(entry.key())).as("replace(t -> T)").isEqualTo("TesT");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void parseStringSub() {
|
||||||
|
var entry = newEntry();
|
||||||
|
PropertyFileUtils.processString(p, entry.set(t).modify((v, s) -> v.substring(1)));
|
||||||
|
assertThat(p.getProperty(entry.key())).as("substring(1)").isEqualTo(t.substring(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void parseTimeTest() {
|
||||||
|
var entry = new EntryDate("time").pattern("m");
|
||||||
|
var time = LocalTime.now();
|
||||||
|
|
||||||
|
entry.calc(ADD);
|
||||||
|
PropertyFileUtils.processDate(p, entry.set(time).unit(EntryDate.Units.MINUTE));
|
||||||
|
assertThat(p.getProperty(entry.key())).as("processDate(now+1)")
|
||||||
|
.isEqualTo(String.valueOf(time.plusMinutes(1).getMinute()));
|
||||||
|
|
||||||
|
entry.calc(SUB);
|
||||||
|
PropertyFileUtils.processDate(p, entry.set(time).unit(EntryDate.Units.HOUR).pattern("H"));
|
||||||
|
assertThat(p.getProperty(entry.key())).as("processDate(now+1)")
|
||||||
|
.isEqualTo(String.valueOf(time.minusHours(1).getHour()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void processDateAddTest() {
|
||||||
|
var entryDate = newEntryDate();
|
||||||
|
entryDate.calc(ADD);
|
||||||
|
PropertyFileUtils.processDate(p, entryDate.now());
|
||||||
|
assertThat(p.getProperty(entryDate.key())).as("processDate(now+1)").isEqualTo(String.valueOf(
|
||||||
|
LocalDateTime.now().plusDays(1).getDayOfYear()));
|
||||||
|
|
||||||
|
PropertyFileUtils.processDate(p, entryDate.now().calc(v -> v + 3));
|
||||||
|
assertThat(p.getProperty(entryDate.key())).as("processDate(now+3)").isEqualTo(String.valueOf(
|
||||||
|
LocalDateTime.now().plusDays(3).getDayOfYear()));
|
||||||
|
|
||||||
|
entryDate.calc(ADD);
|
||||||
|
PropertyFileUtils.processDate(p, entryDate.set(ZonedDateTime.now()));
|
||||||
|
assertThat(p.getProperty(entryDate.key())).as("processDate(ZonedDateTime+1)")
|
||||||
|
.isEqualTo(String.valueOf(LocalDateTime.now().plusDays(1).getDayOfYear()));
|
||||||
|
|
||||||
|
PropertyFileUtils.processDate(p, entryDate.set(Instant.now()).calc(v -> v + 2));
|
||||||
|
assertThat(p.getProperty(entryDate.key())).as("processDate(Instant+2)").isEqualTo(String.valueOf(
|
||||||
|
LocalDateTime.now().plusDays(2).getDayOfYear()));
|
||||||
|
|
||||||
|
entryDate.calc(v -> v + 3);
|
||||||
|
PropertyFileUtils.processDate(p, entryDate.set(LocalDateTime.now()));
|
||||||
|
assertThat(p.getProperty(entryDate.key())).as("processDate(LocalDteTime+2)")
|
||||||
|
.isEqualTo(String.valueOf(LocalDateTime.now().plusDays(3).getDayOfYear()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void processIntAddTest() {
|
||||||
|
var entryInt = newEntryInt().calc(ADD).defaultValue("-1");
|
||||||
|
PropertyFileUtils.processInt(p, entryInt);
|
||||||
|
assertThat(p.getProperty(entryInt.key())).as("add(-1)").isEqualTo("0");
|
||||||
|
|
||||||
|
entryInt.key("anInt").defaultValue("0");
|
||||||
|
PropertyFileUtils.processInt(p, entryInt);
|
||||||
|
assertThat(p.getProperty(entryInt.key())).as("add(0)").isEqualTo("1");
|
||||||
|
PropertyFileUtils.processInt(p, entryInt);
|
||||||
|
assertThat(p.getProperty(entryInt.key())).as("add(1)").isEqualTo("2");
|
||||||
|
|
||||||
|
entryInt.key("formatted.int").defaultValue("0013").pattern("0000");
|
||||||
|
PropertyFileUtils.processInt(p, entryInt);
|
||||||
|
assertThat(p.getProperty(entryInt.key())).as("add(0013)").isEqualTo("0014");
|
||||||
|
PropertyFileUtils.processInt(p, entryInt);
|
||||||
|
assertThat(p.getProperty(entryInt.key())).as("add(0014)").isEqualTo("0015");
|
||||||
|
|
||||||
|
entryInt.calc(v -> v + 2);
|
||||||
|
PropertyFileUtils.processInt(p, entryInt);
|
||||||
|
assertThat(p.getProperty(entryInt.key())).as("add(0015)+2").isEqualTo("0017");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void processStringTest() {
|
void processStringTest() {
|
||||||
var entry = new Entry("version.major").set("1");
|
var entry = newEntry();
|
||||||
|
|
||||||
PropertyFileUtils.processString(p, entry);
|
PropertyFileUtils.processString(p, entry);
|
||||||
|
|
||||||
assertThat(entry.getNewValue()).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue()))
|
assertThat(entry.newValue()).as(String.format("processString(%s, %s)", entry.key(), entry.newValue()))
|
||||||
.isEqualTo(p.getProperty(entry.getKey()));
|
.isEqualTo(p.getProperty(entry.key()));
|
||||||
|
|
||||||
entry.setKey("version.minor");
|
entry.key("version.minor");
|
||||||
|
|
||||||
PropertyFileUtils.processString(p, entry.set(0));
|
PropertyFileUtils.processString(p, entry.set(0));
|
||||||
assertThat(entry.getNewValue()).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue()))
|
assertThat(entry.newValue().toString()).as(String.format("processString(%s, %s)", entry.key(), entry.newValue()))
|
||||||
.isEqualTo(p.getProperty(entry.getKey()));
|
.isEqualTo(p.getProperty(entry.key()));
|
||||||
|
|
||||||
// APPEND
|
|
||||||
PropertyFileUtils.processString(p, entry.modify("-foo", String::concat));
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue()))
|
|
||||||
.isEqualTo("0-foo");
|
|
||||||
|
|
||||||
// PREPEND
|
|
||||||
PropertyFileUtils.processString(p, entry.modify("foo-", (v, s) -> s + v));
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue()))
|
|
||||||
.isEqualTo("foo-0");
|
|
||||||
// CAP
|
|
||||||
PropertyFileUtils.processString(p, entry.set(t).modify((v, s) -> v.toUpperCase(Localization.getLocale())));
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("capitalize").isEqualTo(t.toUpperCase(Localization.getLocale()));
|
|
||||||
|
|
||||||
// REPLACE
|
|
||||||
entry.set(t).setModify("T", (v, s) -> v.replace("t", s));
|
|
||||||
PropertyFileUtils.processString(p, entry);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("replace").isEqualTo("TesT");
|
|
||||||
|
|
||||||
// SUBSTRING
|
|
||||||
entry.set(t).setModify((v, s) -> v.substring(1));
|
|
||||||
PropertyFileUtils.processString(p, entry);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("substring").isEqualTo(t.substring(1));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void processIntTest() {
|
void savePropertiesTest() throws Exception {
|
||||||
var entry = new Entry("version.patch").type(Entry.Types.INT);
|
var p = new Properties();
|
||||||
|
var test = "test";
|
||||||
|
|
||||||
// ADD
|
p.put(test, test);
|
||||||
entry.calc(ADD);
|
|
||||||
entry.setDefaultValue("-1");
|
|
||||||
PropertyFileUtils.processInt(t, p, entry, true);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("add(-1)").isEqualTo("0");
|
|
||||||
|
|
||||||
entry.setKey("anint");
|
var tmp = File.createTempFile(test, ".properties");
|
||||||
entry.setDefaultValue("0");
|
|
||||||
PropertyFileUtils.processInt(t, p, entry, true);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("add(0)").isEqualTo("1");
|
|
||||||
PropertyFileUtils.processInt(t, p, entry, true);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("add(1)").isEqualTo("2");
|
|
||||||
|
|
||||||
entry.setKey("formated.int");
|
assertThatCode(() -> PropertyFileUtils.saveProperties(tmp, "Generated file - do not modify!", p))
|
||||||
entry.setDefaultValue("0013");
|
.as("save properties").doesNotThrowAnyException();
|
||||||
entry.setPattern("0000");
|
|
||||||
PropertyFileUtils.processInt(t, p, entry, true);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("add(0013)").isEqualTo("0014");
|
|
||||||
PropertyFileUtils.processInt(t, p, entry, true);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("add(0014)").isEqualTo("0015");
|
|
||||||
|
|
||||||
entry.setKey("formated.int");
|
assertThat(PropertyFileUtils.loadProperties(t, tmp, p, false)).as("load properties").isTrue();
|
||||||
entry.calc(v -> v + 2);
|
|
||||||
entry.setDefaultValue("0013");
|
|
||||||
entry.setPattern("0000");
|
|
||||||
PropertyFileUtils.processInt(t, p, entry, true);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("add(0013)+2").isEqualTo("0017");
|
|
||||||
|
|
||||||
// SUBTRACT
|
assertThat(p.getProperty(test)).as("read property").isEqualTo(test);
|
||||||
entry.calc(SUB);
|
|
||||||
entry.setPattern("0000");
|
|
||||||
PropertyFileUtils.processInt(t, p, entry, true);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("sub(0017)").isEqualTo("0016");
|
|
||||||
|
|
||||||
PropertyFileUtils.processInt(t, p, entry.calc(v -> v - 3), true);
|
tmp.deleteOnExit();
|
||||||
assertThat(p.getProperty(entry.getKey())).as("sub(0017)-3").isEqualTo("0013");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void processDateTest() {
|
void testChangeKey() {
|
||||||
var entry = new Entry("adate", Entry.Types.DATE).pattern("D");
|
var entry = new Entry("foo").key("bar");
|
||||||
var day = new SimpleDateFormat(entry.getPattern(), Localization.getLocale()).format(new Date());
|
assertThat(entry.key()).isEqualTo("bar");
|
||||||
var dayInt = Integer.parseInt(day);
|
|
||||||
|
|
||||||
assertThat(PropertyFileUtils.processDate(t, p, entry.set("a"), false)).as("processDate(a)").isFalse();
|
entry.key("foo");
|
||||||
|
assertThat(entry.key()).isEqualTo("foo");
|
||||||
PropertyFileUtils.processDate(t, p, entry.set("99"), true);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("processDate(99)").isEqualTo("99");
|
|
||||||
|
|
||||||
PropertyFileUtils.processDate(t, p, entry.set("noew"), true);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("processDate(now)").isEqualTo(day);
|
|
||||||
|
|
||||||
// ADD
|
|
||||||
entry.setCalc(ADD);
|
|
||||||
PropertyFileUtils.processDate(t, p, entry.set(dayInt), true);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("processDate(now+1)").isEqualTo(String.valueOf(dayInt + 1));
|
|
||||||
|
|
||||||
entry.setCalc(v -> v + 3);
|
|
||||||
PropertyFileUtils.processDate(t, p, entry.set(dayInt), true);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("processDate(now+3)").isEqualTo(String.valueOf(dayInt + 3));
|
|
||||||
|
|
||||||
// SUBTRACT
|
|
||||||
entry.setCalc(SUB);
|
|
||||||
PropertyFileUtils.processDate(t, p, entry.set(dayInt), true);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("processDate(now-3)").isEqualTo(String.valueOf(dayInt - 1));
|
|
||||||
|
|
||||||
entry.setCalc(v -> v - 2);
|
|
||||||
PropertyFileUtils.processDate(t, p, entry.set(dayInt), true);
|
|
||||||
assertThat(p.getProperty(entry.getKey())).as("processDate(now-2)").isEqualTo(String.valueOf(dayInt - 2));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -168,21 +276,10 @@ class PropertyFileUtilsTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void savePropertiesTest() throws IOException {
|
void testWarn() {
|
||||||
var p = new Properties();
|
assertThatCode(() -> PropertyFileUtils.warn("command", "message", true, false))
|
||||||
var test = "test";
|
.isInstanceOf(ExitStatusException.class);
|
||||||
|
assertThatCode(() -> PropertyFileUtils.warn("command", t, false, false))
|
||||||
p.put(test, test);
|
.as("failOnWarning = false").doesNotThrowAnyException();
|
||||||
|
|
||||||
var tmp = File.createTempFile(test, ".properties");
|
|
||||||
|
|
||||||
assertThatCode(() -> PropertyFileUtils.saveProperties(tmp, "Generated file - do not modify!", p))
|
|
||||||
.as("save properties").doesNotThrowAnyException();
|
|
||||||
|
|
||||||
assertThat(PropertyFileUtils.loadProperties(t, tmp, p)).as("load properties").isTrue();
|
|
||||||
|
|
||||||
assertThat(p.getProperty(test)).as("read property").isEqualTo(test);
|
|
||||||
|
|
||||||
tmp.deleteOnExit();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue