Added calc and modify functions

This commit is contained in:
Erik C. Thauvin 2023-04-04 09:01:12 -07:00
parent 3fe54858fa
commit 753f3bcf45
19 changed files with 382 additions and 343 deletions

View file

@ -1,6 +1,7 @@
# [Bld](https://github.com/rife2/rife2/wiki/What-Is-Bld) Extension to Create or Modify Properties Files
[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause)
[![Java](https://img.shields.io/badge/java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
[![GitHub CI](https://github.com/rife2/bld-property-file/actions/workflows/bld.yml/badge.svg)](https://github.com/rife2/bld-property-file/actions/workflows/bld.yml)
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).
@ -10,13 +11,12 @@ An extension for creating or modifying [property files](https://docs.oracle.com/
public void updateMajor() throws Exception {
new PropertyFileOperation(this)
.file("version.properties")
.entry(new Entry("version.major").defaultValue(0).type(Types.INT).operation(Operations.ADD))
.entry(new Entry("version.minor").value(0))
.entry(new Entry("version.patch").value(0))
.entry(new Entry("build.date").value("now").pattern("yyyy-MM-dd").type(Types.DATE))
.entry(new Entry("version.major", Types.INT).defaultValue(0).calc(ADD))
.entry(new Entry("version.minor").set(0))
.entry(new Entry("version.patch").set(0))
.entry(new Entry("build.date", Types.DATE).set("now").pattern("yyyy-MM-dd"))
.execute();
}
```
Invoking the `updateMajor` command, will create the `version.propertees`file:
@ -52,42 +52,41 @@ version.patch=0
The `PropertyFileOperation` class is used to configure the [properties file](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) location, etc.
| Attribute | Description | Required |
|:----------------|:-----------------------------------------------------------------|:---------|
| `file` | The location of the properties files to modify. | Yes |
| `comment` | Comment to be inserted at the top of the properties file. | No |
| `failOnWarning` | If set to `true`, will cause executiion to fail on any warnings. | No |
| Function | Description | Required |
|:------------------|:----------------------------------------------------------------|:---------|
| `file()` | The location of the properties files to modify. | Yes |
| `comment()` | Comment to be inserted at the top of the properties file. | No |
| `failOnWarning()` | If set to `true`, will cause execution to fail on any warnings. | No |
## Entry
The `Entry` class is used to specify modifications to be made to the [properties file](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html).
| Attribute | Description |
|:---------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `key` | The name of the property name/value pair. |
| `value` | The value of the property. |
| `defaultVlaue` | The initial value to set for the property if not already defined. For `Type.DATE`, the `now` keyword can be used. |
| `type` | Tread the value as `Types.INT`, `Types.DATE`, or `Types.STRING`. If none specified, `Types.STRING` is assumed. |
| `operation` | See [operations](#operations). |
| `pattern` | For `Types.INT` and `Types.DATE` 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 applied to `Operations.ADD` and `Operations.SUBTRACT` for `Types.DATE`. See [Units](#units). |
| Function | Description |
|:-----------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `key()` | The name of the property name/value pair. |
| `set()` | The value to set the property to, regardless of its previous value. |
| `defaultValue()` | The initial value to set for the property to, if not already defined. |
| `type()` | The value datatype, either `Types.INT`, `Types.DATE`, or `Types.STRING`. If none specified, `Types.STRING` is assumed. |
| `pattern()` | For `Types.INT` and `Types.DATE` 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` calculations. See [Units](#units). |
`key` is required. `value` or `defaultValue` are required unless the `operation` is `Operations.DELETE`.
- For convenience the `key` (and optional `type`) is first set in the constructor.
- `key` is required. `value` or `defaultValue` are required except when deleting.
- For `Type.DATE`, the `now` keyword can be used as the property value.
## Operations
## Functions
The following operations are available:
| Operation | Description |
|:-----------------------|:--------------------------------------------------------------------------|
| `Operations.ADD` | Adds a value to an entry. |
| `Operations.DELETE` | Deletes an entry. |
| `Operations.SET` | Sets the entry value. This is the default operation. |
| `Operations.SUBTRACT` | Subtracts a value from the entry. For `Types.INT` and `Types.DATE` only. |
The following function are available:
| Function | Example | Description |
|:-----------|:--------------------------------------------------------------------------------------------------------|:-------------------------------------------|
| `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 are available for `Types.DATE` with `Operations.ADD` and `Operations.SUBTRACT`:
The following units are available for `Types.DATE`:
* `Units.MILLISECOND`
* `Units.SECOND`
@ -98,18 +97,6 @@ The following units are available for `Types.DATE` with `Operations.ADD` and `Op
* `Units.MONTH`
* `Units.YEAR`
## Rules
The rules used when setting a property value are:
* If only `value` is specified, the property is set to it regardless of its previous value.
* If only `defaultValue` is specified and the property previously existed, it is unchanged.
* If only `defaultValue` is specified and the property did not exist, the property is set to `defaultValue`.
* If `value` and `defaultValue` are both specified and the property previously existed, the property is set to `value`.
* If `value` and `defaultValue` are both specified and the property did not exist, the property is set to `defaultValue`.
Operations occur after the rules are evaluated.
## Differences with the [ant PropertyFile task](https://ant.apache.org/manual/Tasks/propertyfile.html)
* The comments and layout of the original property file will not be preserved.