diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index c0ba763..bf65051 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -22,11 +22,8 @@ jobs: distribution: "zulu" java-version: ${{ matrix.java-version }} - - name: Grant execute permission for bld - run: chmod +x bld - - - name: Download the dependencies + - name: Download dependencies run: ./bld download - - name: Run tests with bld + - name: Run tests run: ./bld compile test diff --git a/README.md b/README.md index 2f550f9..af8b28a 100755 --- a/README.md +++ b/README.md @@ -69,12 +69,13 @@ The [PropertyFileOperation](https://rife2.github.io/bld-property-file/rife/bld/e The [Entry](https://rife2.github.io/bld-property-file/rife/bld/extension/propertyfile/Entry.html) class is used to specify modifications to a [String property](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html). -| Function | Description/Example | -|:-----------------|:--------------------------------------------------------------------------------------------------------| -| `defaultValue()` | The value to be used if the property doesn't exist. | -| `delete()` | Delete the property. | -| `modify()` | `modify("-foo", String::concat)`
`modify("-foo", (v, s) -> v + s)`
`modify((v, s) -> v.trim())` | Modify an entry value. | -| `set()` | The value to set the property to, regardless of its previous value. | +| Function | Description/Example | +|:-----------------|:--------------------------------------------------------------------------------------------------------------------------------------------------| +| `defaultValue()` | The value to be used if the property doesn't exist. | +| `delete()` | Delete the property. | +| `modify()` | `modify("-foo", String::concat)`
`modify("-foo", (v, s) -> v + s)`
`modify((v, s) -> v.trim())` | +| `pattern()` | If present, will parse the value as a [Formatter](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Formatter.html) pattern. | +| `set()` | The value to set the property to, regardless of its previous value. | ## EntryDate diff --git a/examples/README.md b/examples/README.md index 13b19da..ca9e01e 100644 --- a/examples/README.md +++ b/examples/README.md @@ -10,6 +10,7 @@ ./bld update-major run ./bld update-minor run ./bld update-patch run +./bld update-release run ``` # Delete Version Properties diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 0af2487..f6d642f 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,6 +1,6 @@ #Sun Apr 02 10:32:44 PDT 2023 bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension=com.uwyn.rife2:bld-property-file:0.9.6-SNAPSHOT +bld.extension=com.uwyn.rife2:bld-property-file:0.9.5 bld.repositories=MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.version=1.9.1 diff --git a/examples/src/bld/java/com/example/PropertyFileExampleBuild.java b/examples/src/bld/java/com/example/PropertyFileExampleBuild.java index c004cc1..7cc4319 100644 --- a/examples/src/bld/java/com/example/PropertyFileExampleBuild.java +++ b/examples/src/bld/java/com/example/PropertyFileExampleBuild.java @@ -42,8 +42,8 @@ public class PropertyFileExampleBuild extends Project { repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES); scope(test) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 2))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 2))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 3))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3))); } public static void main(String[] args) { @@ -107,6 +107,7 @@ public class PropertyFileExampleBuild extends Project { .entry(new EntryDate("release").now().pattern("yyyyMMddHHmmss")) // prepend 'beta.' to the release .entry(new Entry("release").modify("beta.", (v, s) -> s + v)) + .entry(buildDateEntry) .execute(); } diff --git a/examples/version.properties b/examples/version.properties index b919836..ecd44bb 100644 --- a/examples/version.properties +++ b/examples/version.properties @@ -1,6 +1,4 @@ # -#Sun Oct 22 14:31:42 PDT 2023 -release=beta.20231022143142 -version.major=1 -version.minor=0 -version.patch=1 +#Tue Jul 16 16:16:38 PDT 2024 +build.date=2024-07-16 +release=beta.20240716161638 diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 7a65d7b..4dadca8 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -1,7 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension-jacoco=com.uwyn.rife2:bld-jacoco-report:0.9.5 -bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.0 +bld.extension-jacoco=com.uwyn.rife2:bld-jacoco-report:0.9.6 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.2 bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.version=1.9.1 diff --git a/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java b/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java index 9d8ab40..63a1be2 100644 --- a/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java +++ b/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java @@ -24,7 +24,6 @@ import rife.bld.publish.PublishDeveloper; import rife.bld.publish.PublishLicense; import rife.bld.publish.PublishScm; -import java.io.IOException; import java.util.List; import static rife.bld.dependencies.Repository.MAVEN_CENTRAL; @@ -47,9 +46,9 @@ public class PropertyFileBuild extends Project { scope(compile) .include(dependency("com.uwyn.rife2", "bld", version(1, 9, 1))); scope(test) - .include(dependency("org.jsoup", "jsoup", version(1, 17, 2))) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 2))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 2))) + .include(dependency("org.jsoup", "jsoup", version(1, 18, 1))) + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 3))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3))) .include(dependency("org.assertj:assertj-joda-time:2.2.0")); javadocOperation() @@ -97,14 +96,14 @@ public class PropertyFileBuild extends Project { } @BuildCommand(summary = "Generates JaCoCo Reports") - public void jacoco() throws IOException { + public void jacoco() throws Exception { new JacocoReportOperation() .fromProject(this) .execute(); } @BuildCommand(summary = "Runs PMD analysis") - public void pmd() { + public void pmd() throws Exception { new PmdOperation() .fromProject(this) .failOnViolation(true) diff --git a/src/main/java/rife/bld/extension/propertyfile/Entry.java b/src/main/java/rife/bld/extension/propertyfile/Entry.java index 379255c..9e8009a 100644 --- a/src/main/java/rife/bld/extension/propertyfile/Entry.java +++ b/src/main/java/rife/bld/extension/propertyfile/Entry.java @@ -25,62 +25,59 @@ import java.util.function.BiFunction; * @author Geert Bevin * @since 1.0 */ -public class Entry extends EntryBase { +public class Entry extends EntryBase { + private String modifyValue_ = ""; + private BiFunction modify_; + /** - * Instantiates a new Entry. + * Creates a new {@link Entry entry}. * - * @param key the key + * @param key the required property key */ public Entry(String key) { super(key); } /** - *

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

+ * Returns the modify function. * - * @param defaultValue the default value - * @return the entry + * @return the modify function */ - @SuppressWarnings("unused") - public Entry defaultValue(Object defaultValue) { - setDefaultValue(defaultValue); - return this; + protected BiFunction modify() { + return modify_; } /** - * Sets the {@link Entry entry} up for deletion. + * Sets the modify function. * - * @return the entry - */ - public Entry delete() { - setDelete(); - return this; - } - - /** - * Creates a new {@link Entry entry}. - * - * @param modify the modification function - * @return the entry + * @param modify the modify function */ public Entry modify(BiFunction modify) { - setModify(modify); + modify_ = modify; return this; } /** - * Creates a new {@link Entry entry}. + * Sets the modify function. * * @param value the value to perform a modification with - * @param modify the modification function - * @return the entry + * @param modify the modify function */ public Entry modify(String value, BiFunction modify) { - setModifyValue(value); - setModify(modify); + modifyValue_ = value; + modify_ = modify; return this; } + /** + * Returns the value to be used in the {@link #modify_} function. + * + * @return the modify value + */ + protected String modifyValue() { + return modifyValue_; + } + /** * Sets the new {@link java.util.Properties property} value. * @@ -88,7 +85,7 @@ public class Entry extends EntryBase { * @return the entry */ public Entry set(Object s) { - setNewValue(s); + newValue(s); return this; } } diff --git a/src/main/java/rife/bld/extension/propertyfile/EntryBase.java b/src/main/java/rife/bld/extension/propertyfile/EntryBase.java index b724ed3..ca193b1 100644 --- a/src/main/java/rife/bld/extension/propertyfile/EntryBase.java +++ b/src/main/java/rife/bld/extension/propertyfile/EntryBase.java @@ -16,7 +16,6 @@ package rife.bld.extension.propertyfile; -import java.util.function.BiFunction; import java.util.function.IntFunction; /** @@ -26,17 +25,14 @@ import java.util.function.IntFunction; * @author Geert Bevin * @since 1.0 */ -@SuppressWarnings("PMD.DataClass") -public class EntryBase { +@SuppressWarnings({"unchecked", "PMD.AbstractClassWithoutAbstractMethod"}) +public abstract class EntryBase { private IntFunction calc_; private Object defaultValue_; private boolean isDelete_; private String key_; - private String modifyValue_ = ""; - private BiFunction modify_; private Object newValue_; - private String pattern_ = ""; - private EntryDate.Units unit_ = EntryDate.Units.DAY; + private Object pattern_; /** * Creates a new {@link EntryBase entry}. @@ -52,71 +48,45 @@ public class EntryBase { * * @return the calc function */ - protected IntFunction getCalc() { + protected IntFunction calc() { return calc_; } + /** + * Sets the calculation function. + * + * @param calc the calc function + */ + public T calc(IntFunction calc) { + calc_ = calc; + return (T) this; + } + /** * Returns the default value. * * @return the default value */ - protected Object getDefaultValue() { + protected Object defaultValue() { return defaultValue_; } /** - * Returns the key of the {@link java.util.Properties property}. + * Sets the initial value to set the {@link java.util.Properties property} to, if not already defined. * - * @return the key + * @param defaultValue the default value */ - protected String getKey() { - return key_; + public T defaultValue(Object defaultValue) { + defaultValue_ = defaultValue; + return (T) this; } /** - * Returns the modify function. - * - * @return the modify function + * Indicates that the {@link java.util.Properties property} is to be deleted. */ - protected BiFunction getModify() { - return modify_; - } - - /** - * Returns the value to be used in the {@link #modify_} function. - * - * @return the modify value - */ - protected String getModifyValue() { - return modifyValue_; - } - - /** - * Returns the new value to set the {@link java.util.Properties property)} to. - * - * @return the new value - */ - public Object getNewValue() { - return newValue_; - } - - /** - * Returns the pattern. - * - * @return the pattern - */ - protected String getPattern() { - return pattern_; - } - - /** - * Returns the {@link EntryDate.Units unit}. - * - * @return the unit - */ - protected EntryDate.Units getUnit() { - return unit_; + public T delete() { + isDelete_ = true; + return (T) this; } /** @@ -128,79 +98,33 @@ public class EntryBase { 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 */ - @SuppressWarnings("unused") - public EntryBase key(String key) { + public T key(String key) { key_ = key; - return this; + return (T) this; } /** - * Sets the calculation function. + * Returns the new value to set the {@link java.util.Properties property)} to. * - * @param calc the calc function + * @return the new value */ - protected void setCalc(IntFunction calc) { - calc_ = calc; - } - - /** - * Sets the initial value to set the {@link java.util.Properties property} to, if not already defined. - * - * @param defaultValue the default value - */ - protected void setDefaultValue(Object defaultValue) { - defaultValue_ = defaultValue; - } - - /** - * Sets the {@link java.util.Properties property} to be deleted. - */ - protected void setDelete() { - isDelete_ = true; - } - - /** - * Sets the key of the {@link java.util.Properties property}. - * - * @param key the {@link java.util.Properties property} key - */ - protected void setKey(String key) { - key_ = key; - } - - /** - * Sets the modify function. - * - * @param modify the modify function - */ - protected void setModify(BiFunction modify) { - modify_ = modify; - } - - /** - * Sets the modify function. - * - * @param value the value to perform a modification with - * @param modify the modify function - */ - protected void setModify(String value, BiFunction modify) { - modifyValue_ = value; - modify_ = modify; - } - - /** - * Sets the modify value. - * - * @param value the modify value. - */ - protected void setModifyValue(String value) { - modifyValue_ = value; + protected Object newValue() { + return newValue_; } /** @@ -208,26 +132,26 @@ public class EntryBase { * * @param newValue the new value */ - public void setNewValue(Object newValue) { + protected void newValue(Object newValue) { newValue_ = newValue; } /** - * Sets the {@link java.text.DecimalFormat DecimalFormat} or {@link java.time.format.DateTimeFormatter DateTimeFormatter} - * pattern to be used with {@link EntryDate} or {@link EntryInt} respectively. + * Returns the pattern. * - * @param pattern the pattern + * @return the pattern */ - protected void setPattern(String pattern) { - pattern_ = pattern; + protected Object pattern() { + return pattern_; } /** - * Sets the {@link EntryDate.Units unit} value to apply to calculations. + * Sets the {@link java.util.Formatter} pattern. * - * @param unit the {@link EntryDate.Units unit} + * @param pattern the pattern */ - protected void setUnit(EntryDate.Units unit) { - unit_ = unit; + public T pattern(Object pattern) { + pattern_ = pattern; + return (T) this; } } diff --git a/src/main/java/rife/bld/extension/propertyfile/EntryDate.java b/src/main/java/rife/bld/extension/propertyfile/EntryDate.java index a25b0e1..0a93745 100644 --- a/src/main/java/rife/bld/extension/propertyfile/EntryDate.java +++ b/src/main/java/rife/bld/extension/propertyfile/EntryDate.java @@ -19,7 +19,6 @@ package rife.bld.extension.propertyfile; import java.time.*; import java.util.Calendar; import java.util.Date; -import java.util.function.IntFunction; /** * Declares the modifications to be made to a {@link java.util.Properties Date-based property}. @@ -27,9 +26,11 @@ import java.util.function.IntFunction; * @author Erik C. Thauvin * @since 1.0 */ -public class EntryDate extends EntryBase { +public class EntryDate extends EntryBase { + private EntryDate.Units unit_ = EntryDate.Units.DAY; + /** - * Creates a new date {@link Entry entry}. + * Creates a new {@link EntryDate entry}. * * @param key the required property key */ @@ -37,46 +38,13 @@ public class EntryDate extends EntryBase { super(key); } - /** - * Creates a new {@link EntryDate entry}. - * - * @param calc the calculation function - * @return this instance - */ - public EntryDate calc(IntFunction calc) { - setCalc(calc); - return this; - } - - /** - * Sets the {@link EntryDate entry} up for deletion. - * - * @return this instance - */ - public EntryDate delete() { - setDelete(); - return this; - } - /** * Sets the new {@link java.util.Properties property} value to now. * * @return this instance */ public EntryDate now() { - setNewValue("now"); - return this; - } - - /** - * Sets the pattern for {@link EntryInt} and {@link EntryDate} to{@link java.text.DecimalFormat DecimalFormat} and - * {@link java.time.format.DateTimeFormatter DateTimeFormatter} respectively. - * - * @param pattern the pattern - * @return this instance - */ - public EntryDate pattern(String pattern) { - setPattern(pattern); + newValue("now"); return this; } @@ -87,7 +55,7 @@ public class EntryDate extends EntryBase { * @return this instance */ public EntryDate set(Instant instant) { - setNewValue(instant); + newValue(instant); return this; } @@ -98,7 +66,7 @@ public class EntryDate extends EntryBase { * @return this instance */ public EntryDate set(LocalDate date) { - setNewValue(date); + newValue(date); return this; } @@ -109,7 +77,7 @@ public class EntryDate extends EntryBase { * @return this instance */ public EntryDate set(LocalDateTime date) { - setNewValue(date); + newValue(date); return this; } @@ -120,7 +88,7 @@ public class EntryDate extends EntryBase { * @return this instance */ public EntryDate set(ZonedDateTime date) { - setNewValue(date); + newValue(date); return this; } @@ -131,7 +99,7 @@ public class EntryDate extends EntryBase { * @return this instance */ public EntryDate set(LocalTime time) { - setNewValue(time); + newValue(time); return this; } @@ -142,7 +110,7 @@ public class EntryDate extends EntryBase { * @return this instance */ public EntryDate set(Calendar cal) { - setNewValue(cal); + newValue(cal); return this; } @@ -153,10 +121,19 @@ public class EntryDate extends EntryBase { * @return this instance */ public EntryDate set(Date date) { - setNewValue(date); + newValue(date); return this; } + /** + * Returns the {@link EntryDate.Units unit}. + * + * @return the unit + */ + public EntryDate.Units unit() { + return unit_; + } + /** * Sets the {@link Units unit} value to apply to calculations for {@link EntryDate}. * @@ -164,7 +141,17 @@ public class EntryDate extends EntryBase { * @return this instance */ public EntryDate unit(Units unit) { - setUnit(unit); + unit_ = unit; + 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; } diff --git a/src/main/java/rife/bld/extension/propertyfile/EntryInt.java b/src/main/java/rife/bld/extension/propertyfile/EntryInt.java index 54226f4..896bbf1 100644 --- a/src/main/java/rife/bld/extension/propertyfile/EntryInt.java +++ b/src/main/java/rife/bld/extension/propertyfile/EntryInt.java @@ -16,17 +16,15 @@ package rife.bld.extension.propertyfile; -import java.util.function.IntFunction; - /** * Declares the modifications to be made to an {@link java.util.Properties Integer-based property}. * * @author Erik C. Thauvin * @since 1.0 */ -public class EntryInt extends EntryBase { +public class EntryInt extends EntryBase { /** - * Creates a new date {@link Entry entry}. + * Creates a new {@link EntryInt entry}. * * @param key the required property key */ @@ -34,39 +32,6 @@ public class EntryInt extends EntryBase { super(key); } - /** - * Creates a new {@link EntryInt entry}. - * - * @param calc the calculation function. - * @return this instance - */ - public EntryInt calc(IntFunction calc) { - setCalc(calc); - return this; - } - - /** - * Sets the initial value to set the {@link java.util.Properties property} to, if not already defined. - * - * @param defaultValue the default value - * @return this instance - */ - @SuppressWarnings("unused") - public EntryInt defaultValue(Object defaultValue) { - setDefaultValue(defaultValue); - return this; - } - - /** - * Sets the {@link EntryInt entry} up for deletion. - * - * @return this instance - */ - public EntryInt delete() { - setDelete(); - return this; - } - /** * Sets the new {@link java.util.Properties property} value to an integer. * @@ -74,7 +39,17 @@ public class EntryInt extends EntryBase { * @return this instance */ public EntryInt set(int i) { - setNewValue(i); + newValue(i); + return this; + } + + /** + * Sets the {@link java.text.DecimalFormat DecimalFormat} pattern. + * + * @param pattern the pattern + */ + public EntryInt pattern(String pattern) { + super.pattern(pattern); return this; } } diff --git a/src/main/java/rife/bld/extension/propertyfile/PropertyFileOperation.java b/src/main/java/rife/bld/extension/propertyfile/PropertyFileOperation.java index 0ecf5d7..c86204e 100644 --- a/src/main/java/rife/bld/extension/propertyfile/PropertyFileOperation.java +++ b/src/main/java/rife/bld/extension/propertyfile/PropertyFileOperation.java @@ -18,11 +18,14 @@ package rife.bld.extension.propertyfile; import rife.bld.BaseProject; import rife.bld.operations.AbstractOperation; +import rife.bld.operations.exceptions.ExitStatusException; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Creates or applies edits to a {@link Properties Properties} file. @@ -31,7 +34,8 @@ import java.util.Properties; * @since 1.0 */ public class PropertyFileOperation extends AbstractOperation { - private final List entries_ = new ArrayList<>(); + private final static Logger LOGGER = Logger.getLogger(PropertyFileOperation.class.getName()); + private final List> entries_ = new ArrayList<>(); private String comment_ = ""; private boolean failOnWarning_; private File file_; @@ -55,8 +59,7 @@ public class PropertyFileOperation extends AbstractOperation entry) { entries_.add(entry); return this; } @@ -66,38 +69,49 @@ public class PropertyFileOperation extends AbstractOperation " + dte.getMessage(), - dte, failOnWarning); - success = false; + throw new IllegalArgumentException( + "Non-date value for \"" + entry.key() + "\" --> " + dte.getMessage(), dte); } } - - if (success) { - p.setProperty(entry.getKey(), parsedValue); - } - - return success; + p.setProperty(entry.key(), dateValue); } /** * Processes an integer {@link Properties property}. * - * @param command the issuing command - * @param p the {@link Properties property} - * @param entry the {@link Entry} containing the {@link Properties property} edits - * @param failOnWarning the fail on warning - * @return the boolean - * @throws Exception the exception + * @param p the {@link Properties property} + * @param entry the {@link Entry} containing the {@link Properties property} edits + * @throws NumberFormatException if a parsing error occurs */ - @SuppressWarnings("PMD.SignatureDeclareThrowsException") - public static boolean processInt(String command, Properties p, EntryInt entry, boolean failOnWarning) - throws Exception { - var success = true; + public static void processInt(Properties p, EntryInt entry) throws IllegalArgumentException { int intValue = 0; try { - var fmt = new DecimalFormat(entry.getPattern()); - var value = currentValue(p.getProperty(entry.getKey()), entry.getDefaultValue(), - entry.getNewValue()); + var fmt = new DecimalFormat(objectToString(entry.pattern())); + var currentValue = currentValue(p.getProperty(entry.key()), entry.defaultValue(), entry.newValue()); - if (value != null) { - intValue = fmt.parse(String.valueOf(value)).intValue(); + if (currentValue != null) { + intValue = fmt.parse(String.valueOf(currentValue)).intValue(); } - if (entry.getCalc() != null) { - intValue = entry.getCalc().apply(intValue); + if (entry.calc() != null) { + intValue = entry.calc().apply(intValue); } - p.setProperty(entry.getKey(), fmt.format(intValue)); + + p.setProperty(entry.key(), fmt.format(intValue)); } catch (NumberFormatException | ParseException e) { - warn(command, "Non-integer value for \"" + entry.getKey() + "\" --> " + e.getMessage(), e, - failOnWarning); - success = false; + throw new IllegalArgumentException( + "Non-integer value for \"" + entry.key() + "\" --> " + e.getMessage(), e); } - - return success; } /** @@ -235,19 +224,16 @@ public final class PropertyFileUtils { * * @param p the {@link Properties property} * @param entry the {@link Entry} containing the {@link Properties property} edits - * @return the boolean */ - @SuppressWarnings("SameReturnValue") - public static boolean processString(Properties p, Entry entry) { - var value = currentValue(p.getProperty(entry.getKey()), entry.getDefaultValue(), entry.getNewValue()); + public static void processString(Properties p, Entry entry) { + var currentValue = currentValue(p.getProperty(entry.key()), entry.defaultValue(), entry.newValue()); - p.setProperty(entry.getKey(), String.valueOf(value)); + p.setProperty(entry.key(), String.format(String.valueOf(currentValue), entry.pattern())); - if (entry.getModify() != null && entry.getModifyValue() != null) { - p.setProperty(entry.getKey(), entry.getModify().apply(p.getProperty(entry.getKey()), entry.getModifyValue())); + if (entry.modify() != null && entry.modifyValue() != null) { + var modify = entry.modify().apply(p.getProperty(entry.key()), entry.modifyValue()); + p.setProperty(entry.key(), String.format(modify, entry.pattern())); } - - return true; } /** @@ -261,20 +247,8 @@ public final class PropertyFileUtils { public static void saveProperties(File file, String comment, Properties p) throws IOException { try (var output = Files.newOutputStream(file.toPath())) { p.store(output, comment); - } catch (IIOException ioe) { - throw new IIOException("An IO error occurred while saving the Properties file: " + file, ioe); - } - } - - /** - * Logs a warning. - * - * @param command the issuing command - * @param message the message to log - */ - static void warn(String command, String message) { - if (LOGGER.isLoggable(Level.WARNING)) { - LOGGER.warning('[' + command + "] " + message); + } catch (IOException ioe) { + throw new IOException("An IO error occurred while saving the Properties file: " + file, ioe); } } @@ -283,18 +257,20 @@ public final class PropertyFileUtils { * * @param command The command name * @param message the message log - * @param e the related exception * @param failOnWarning logs and throws exception if set to {@code true} - * @throws Exception the exception + * @throws ExitStatusException if a {@link Level#SEVERE} exception occurs */ - @SuppressWarnings({"PMD.SignatureDeclareThrowsException"}) - static void warn(String command, String message, Exception e, boolean failOnWarning) throws Exception { - LOGGER.warning("ahah"); + static void warn(String command, String message, boolean failOnWarning, boolean silent) + throws ExitStatusException { if (failOnWarning) { - LOGGER.log(Level.SEVERE, '[' + command + "] " + message, e); - throw e; + if (LOGGER.isLoggable(Level.SEVERE) && !silent) { + LOGGER.log(Level.SEVERE, '[' + command + "] " + message); + } + throw new ExitStatusException(ExitStatusException.EXIT_FAILURE); } else { - warn(command, message); + if (LOGGER.isLoggable(Level.WARNING) && !silent) { + LOGGER.warning('[' + command + "] " + message); + } } } } diff --git a/src/test/java/rife/bld/extension/propertyfile/PropertyFileOperationTest.java b/src/test/java/rife/bld/extension/propertyfile/PropertyFileOperationTest.java index 22dc242..6314fbc 100644 --- a/src/test/java/rife/bld/extension/propertyfile/PropertyFileOperationTest.java +++ b/src/test/java/rife/bld/extension/propertyfile/PropertyFileOperationTest.java @@ -18,6 +18,7 @@ package rife.bld.extension.propertyfile; 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; @@ -26,6 +27,7 @@ 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 { @@ -76,4 +78,10 @@ class PropertyFileOperationTest { 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); + } } diff --git a/src/test/java/rife/bld/extension/propertyfile/PropertyFileUtilsTest.java b/src/test/java/rife/bld/extension/propertyfile/PropertyFileUtilsTest.java index 3bce5aa..18bab05 100644 --- a/src/test/java/rife/bld/extension/propertyfile/PropertyFileUtilsTest.java +++ b/src/test/java/rife/bld/extension/propertyfile/PropertyFileUtilsTest.java @@ -17,19 +17,19 @@ package rife.bld.extension.propertyfile; import org.junit.jupiter.api.Test; +import rife.bld.operations.exceptions.ExitStatusException; import rife.tools.Localization; import java.io.File; -import java.io.IOException; import java.time.*; import java.util.Calendar; import java.util.Date; import java.util.Properties; -import static org.assertj.core.api.Assertions.assertThat; // NOPMD -import static org.assertj.core.api.Assertions.assertThatCode; // NOPMD -import static rife.bld.extension.propertyfile.Calc.ADD; // NOPMD -import static rife.bld.extension.propertyfile.Calc.SUB; // NOPMD +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; +import static rife.bld.extension.propertyfile.Calc.ADD; +import static rife.bld.extension.propertyfile.Calc.SUB; /** * PropertyFileUtilsTest class @@ -37,6 +37,7 @@ import static rife.bld.extension.propertyfile.Calc.SUB; // NOPMD * @author Erik C. Thauvin * @since 1.0 */ +@SuppressWarnings("PMD.AvoidDuplicateLiterals") class PropertyFileUtilsTest { final static int dayOfYear = LocalDate.now().getDayOfYear(); final static Properties p = new Properties(); @@ -49,7 +50,7 @@ class PropertyFileUtilsTest { public EntryDate newEntryDate() { p.clear(); - return new EntryDate("adate").pattern("D"); + return new EntryDate("aDate").pattern("D"); } public EntryInt newEntryInt() { @@ -58,40 +59,36 @@ class PropertyFileUtilsTest { } @Test - void parseDateSub() throws Exception { - var entryDate = newEntryDate(); - entryDate.setCalc(SUB); - PropertyFileUtils.processDate(t, p, entryDate.now(), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(now-3)").isEqualTo(String.valueOf(dayOfYear - 1)); + void parseDateSub() { + var entryDate = newEntryDate().calc(SUB); + PropertyFileUtils.processDate(p, entryDate.now()); + assertThat(p.getProperty(entryDate.key())).as("processDate(now-3)").isEqualTo(String.valueOf(dayOfYear - 1)); - entryDate.setCalc(v -> v - 2); - PropertyFileUtils.processDate(t, p, entryDate.now(), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(now-2)").isEqualTo(String.valueOf(dayOfYear - 2)); + entryDate.calc(v -> v - 2); + PropertyFileUtils.processDate(p, entryDate.now()); + assertThat(p.getProperty(entryDate.key())).as("processDate(now-2)").isEqualTo(String.valueOf(dayOfYear - 2)); - entryDate.setCalc(SUB); - PropertyFileUtils.processDate(t, p, entryDate.set(new Date()), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(date-1)").isEqualTo(String.valueOf(dayOfYear - 1)); + entryDate.calc(SUB); + PropertyFileUtils.processDate(p, entryDate.set(new Date())); + assertThat(p.getProperty(entryDate.key())).as("processDate(date-1)").isEqualTo(String.valueOf(dayOfYear - 1)); - entryDate.setCalc(v -> v - 2); - PropertyFileUtils.processDate(t, p, entryDate.set(Calendar.getInstance()), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(cal-2)").isEqualTo(String.valueOf(dayOfYear - 2)); + entryDate.calc(v -> v - 2); + PropertyFileUtils.processDate(p, entryDate.set(Calendar.getInstance())); + assertThat(p.getProperty(entryDate.key())).as("processDate(cal-2)").isEqualTo(String.valueOf(dayOfYear - 2)); - entryDate.setCalc(v -> v - 3); - PropertyFileUtils.processDate(t, p, entryDate.set(LocalDate.now()), - true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(LocalDate-3)").isEqualTo(String.valueOf(dayOfYear - 3)); + entryDate.calc(v -> v - 3); + PropertyFileUtils.processDate(p, entryDate.set(LocalDate.now())); + assertThat(p.getProperty(entryDate.key())).as("processDate(LocalDate-3)").isEqualTo(String.valueOf(dayOfYear - 3)); } @Test - void parseIntSubTest() throws Exception { - var entryInt = newEntryInt(); - entryInt.calc(SUB); - entryInt.setPattern("0000"); - PropertyFileUtils.processInt(t, p, entryInt.defaultValue("0017"), true); - assertThat(p.getProperty(entryInt.getKey())).as("sub(0017)").isEqualTo("0016"); + void parseIntSubTest() { + var entryInt = newEntryInt().calc(SUB).pattern("0000"); + PropertyFileUtils.processInt(p, entryInt.defaultValue("0017")); + assertThat(p.getProperty(entryInt.key())).as("sub(0017)").isEqualTo("0016"); - PropertyFileUtils.processInt(t, p, entryInt.set(16).calc(v -> v - 3), true); - assertThat(p.getProperty(entryInt.getKey())).as("sub(16)-3").isEqualTo("0013"); + PropertyFileUtils.processInt(p, entryInt.set(16).calc(v -> v - 3)); + assertThat(p.getProperty(entryInt.key())).as("sub(16)-3").isEqualTo("0013"); } @Test @@ -100,116 +97,118 @@ class PropertyFileUtilsTest { var entry = newEntry(); PropertyFileUtils.processString(p, entry.set(1)); PropertyFileUtils.processString(p, entry.modify("-foo", String::concat)); - assertThat(p.getProperty(entry.getKey())).as(String.format("processString(%s, %s)", entry.getKey(), - entry.getNewValue())).isEqualTo("1-foo"); + assertThat(p.getProperty(entry.key())).as(String.format("processString(%s, %s)", entry.key(), + entry.newValue())).isEqualTo("1-foo"); } @Test void parseStringCap() { var entry = newEntry(); PropertyFileUtils.processString(p, entry.set(t).modify("", (v, s) -> v.toUpperCase(Localization.getLocale()))); - assertThat(p.getProperty(entry.getKey())).as("capitalize").isEqualTo(t.toUpperCase(Localization.getLocale())); + assertThat(p.getProperty(entry.key())).as("capitalize").isEqualTo(t.toUpperCase(Localization.getLocale())); } @Test void parseStringCat() { var entry = newEntry(); - entry.set(t).setModify("-foo", String::concat); + entry.set(t).modify("-foo", String::concat); PropertyFileUtils.processString(p, entry); - assertThat(p.getProperty(entry.getKey())).as("replace").isEqualTo(t + "-foo"); + assertThat(p.getProperty(entry.key())).as("replace").isEqualTo(t + "-foo"); } + @Test + void parseStringFormat() { + var entry = new Entry("foo").set("%.2f").pattern(3.14159f); + PropertyFileUtils.processString(p, entry); + assertThat(p.getProperty(entry.key())).as("format").isEqualTo("3.14"); + } + + @Test void parseStringPrepend() { var entry = newEntry(); PropertyFileUtils.processString(p, entry.set(1)); PropertyFileUtils.processString(p, entry.modify("foo-", (v, s) -> s + v)); - assertThat(p.getProperty(entry.getKey())).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue())) + assertThat(p.getProperty(entry.key())).as(String.format("processString(%s, %s)", entry.key(), entry.newValue())) .isEqualTo("foo-1"); } @Test void parseStringReplace() { var entry = newEntry(); - entry.set(t).setModify("T", (v, s) -> v.replace("t", s)); + entry.set(t).modify("T", (v, s) -> v.replace("t", s)); PropertyFileUtils.processString(p, entry); - assertThat(p.getProperty(entry.getKey())).as("replace(t -> T)").isEqualTo("TesT"); - + assertThat(p.getProperty(entry.key())).as("replace(t -> T)").isEqualTo("TesT"); } @Test void parseStringSub() { var entry = newEntry(); PropertyFileUtils.processString(p, entry.set(t).modify((v, s) -> v.substring(1))); - assertThat(p.getProperty(entry.getKey())).as("substring(1)").isEqualTo(t.substring(1)); + assertThat(p.getProperty(entry.key())).as("substring(1)").isEqualTo(t.substring(1)); } @Test - void parseTimeTest() throws Exception { + void parseTimeTest() { var entry = new EntryDate("time").pattern("m"); var time = LocalTime.now(); - entry.setCalc(ADD); - PropertyFileUtils.processDate(t, p, entry.set(time).unit(EntryDate.Units.MINUTE), true); - assertThat(p.getProperty(entry.getKey())).as("processDate(now+1)") + entry.calc(ADD); + PropertyFileUtils.processDate(p, entry.set(time).unit(EntryDate.Units.MINUTE)); + assertThat(p.getProperty(entry.key())).as("processDate(now+1)") .isEqualTo(String.valueOf(time.plusMinutes(1).getMinute())); - entry.setCalc(SUB); - PropertyFileUtils.processDate(t, p, entry.set(time).unit(EntryDate.Units.HOUR).pattern("H"), true); - assertThat(p.getProperty(entry.getKey())).as("processDate(now+1)") + entry.calc(SUB); + PropertyFileUtils.processDate(p, entry.set(time).unit(EntryDate.Units.HOUR).pattern("H")); + assertThat(p.getProperty(entry.key())).as("processDate(now+1)") .isEqualTo(String.valueOf(time.minusHours(1).getHour())); } @Test - void processDateAddTest() throws Exception { + void processDateAddTest() { var entryDate = newEntryDate(); - entryDate.setCalc(ADD); - PropertyFileUtils.processDate(t, p, entryDate.now(), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(now+1)").isEqualTo(String.valueOf(dayOfYear + 1)); + entryDate.calc(ADD); + PropertyFileUtils.processDate(p, entryDate.now()); + assertThat(p.getProperty(entryDate.key())).as("processDate(now+1)").isEqualTo(String.valueOf(dayOfYear + 1)); - PropertyFileUtils.processDate(t, p, entryDate.now().calc(v -> v + 3), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(now+3)").isEqualTo(String.valueOf(dayOfYear + 3)); + PropertyFileUtils.processDate(p, entryDate.now().calc(v -> v + 3)); + assertThat(p.getProperty(entryDate.key())).as("processDate(now+3)").isEqualTo(String.valueOf(dayOfYear + 3)); - entryDate.setCalc(ADD); - PropertyFileUtils.processDate(t, p, entryDate.set(ZonedDateTime.now()), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(ZonedDateTime+1)") + entryDate.calc(ADD); + PropertyFileUtils.processDate(p, entryDate.set(ZonedDateTime.now())); + assertThat(p.getProperty(entryDate.key())).as("processDate(ZonedDateTime+1)") .isEqualTo(String.valueOf(dayOfYear + 1)); - PropertyFileUtils.processDate(t, p, entryDate.set(Instant.now()).calc(v -> v + 2), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(Instant+2)").isEqualTo(String.valueOf(dayOfYear + 2)); + PropertyFileUtils.processDate(p, entryDate.set(Instant.now()).calc(v -> v + 2)); + assertThat(p.getProperty(entryDate.key())).as("processDate(Instant+2)").isEqualTo(String.valueOf(dayOfYear + 2)); - entryDate.setCalc(v -> v + 3); - PropertyFileUtils.processDate(t, p, entryDate.set(LocalDateTime.now()), true); - assertThat(p.getProperty(entryDate.getKey())).as("processDate(LocalDteTime+2)").isEqualTo(String.valueOf(dayOfYear + 3)); + entryDate.calc(v -> v + 3); + PropertyFileUtils.processDate(p, entryDate.set(LocalDateTime.now())); + assertThat(p.getProperty(entryDate.key())).as("processDate(LocalDteTime+2)").isEqualTo(String.valueOf(dayOfYear + 3)); } @Test - void processIntAddTest() throws Exception { - var entryInt = newEntryInt(); - entryInt.calc(ADD); - entryInt.setDefaultValue("-1"); - PropertyFileUtils.processInt(t, p, entryInt, true); - assertThat(p.getProperty(entryInt.getKey())).as("add(-1)").isEqualTo("0"); + void processIntAddTest() { + var entryInt = newEntryInt().calc(ADD).defaultValue("-1"); + PropertyFileUtils.processInt(p, entryInt); + assertThat(p.getProperty(entryInt.key())).as("add(-1)").isEqualTo("0"); - entryInt.setKey("anint"); - entryInt.setDefaultValue("0"); - PropertyFileUtils.processInt(t, p, entryInt, true); - assertThat(p.getProperty(entryInt.getKey())).as("add(0)").isEqualTo("1"); - PropertyFileUtils.processInt(t, p, entryInt, true); - assertThat(p.getProperty(entryInt.getKey())).as("add(1)").isEqualTo("2"); + entryInt.key("anInt").defaultValue("0"); + PropertyFileUtils.processInt(p, entryInt); + assertThat(p.getProperty(entryInt.key())).as("add(0)").isEqualTo("1"); + PropertyFileUtils.processInt(p, entryInt); + assertThat(p.getProperty(entryInt.key())).as("add(1)").isEqualTo("2"); - entryInt.setKey("formatted.int"); - entryInt.setDefaultValue("0013"); - entryInt.setPattern("0000"); - PropertyFileUtils.processInt(t, p, entryInt, true); - assertThat(p.getProperty(entryInt.getKey())).as("add(0013)").isEqualTo("0014"); - PropertyFileUtils.processInt(t, p, entryInt, true); - assertThat(p.getProperty(entryInt.getKey())).as("add(0014)").isEqualTo("0015"); + entryInt.key("formatted.int").defaultValue("0013").pattern("0000"); + PropertyFileUtils.processInt(p, entryInt); + assertThat(p.getProperty(entryInt.key())).as("add(0013)").isEqualTo("0014"); + PropertyFileUtils.processInt(p, entryInt); + assertThat(p.getProperty(entryInt.key())).as("add(0014)").isEqualTo("0015"); entryInt.calc(v -> v + 2); - PropertyFileUtils.processInt(t, p, entryInt, true); - assertThat(p.getProperty(entryInt.getKey())).as("add(0015)+2").isEqualTo("0017"); + PropertyFileUtils.processInt(p, entryInt); + assertThat(p.getProperty(entryInt.key())).as("add(0015)+2").isEqualTo("0017"); } @Test @@ -217,14 +216,14 @@ class PropertyFileUtilsTest { var entry = newEntry(); PropertyFileUtils.processString(p, entry); - assertThat(entry.getNewValue()).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue())) - .isEqualTo(p.getProperty(entry.getKey())); + assertThat(entry.newValue()).as(String.format("processString(%s, %s)", entry.key(), entry.newValue())) + .isEqualTo(p.getProperty(entry.key())); - entry.setKey("version.minor"); + entry.key("version.minor"); PropertyFileUtils.processString(p, entry.set(0)); - assertThat(entry.getNewValue().toString()).as(String.format("processString(%s, %s)", entry.getKey(), entry.getNewValue())) - .isEqualTo(p.getProperty(entry.getKey())); + assertThat(entry.newValue().toString()).as(String.format("processString(%s, %s)", entry.key(), entry.newValue())) + .isEqualTo(p.getProperty(entry.key())); } @Test @@ -239,13 +238,22 @@ class PropertyFileUtilsTest { assertThatCode(() -> PropertyFileUtils.saveProperties(tmp, "Generated file - do not modify!", p)) .as("save properties").doesNotThrowAnyException(); - assertThat(PropertyFileUtils.loadProperties(t, tmp, p)).as("load properties").isTrue(); + assertThat(PropertyFileUtils.loadProperties(t, tmp, p, false)).as("load properties").isTrue(); assertThat(p.getProperty(test)).as("read property").isEqualTo(test); tmp.deleteOnExit(); } + @Test + void testChangeKey() { + var entry = new Entry("foo").key("bar"); + assertThat(entry.key()).isEqualTo("bar"); + + entry.key("foo"); + assertThat(entry.key()).isEqualTo("foo"); + } + @Test void testCurrentValue() { var value = "value"; @@ -261,9 +269,9 @@ class PropertyFileUtilsTest { @Test void testWarn() { - assertThatCode(() -> PropertyFileUtils.warn("command", "message", new IOException(t), true)) - .hasMessage(t).isInstanceOf(IOException.class); - assertThatCode(() -> PropertyFileUtils.warn("command", t, new Exception(t), false)) + assertThatCode(() -> PropertyFileUtils.warn("command", "message", true, false)) + .isInstanceOf(ExitStatusException.class); + assertThatCode(() -> PropertyFileUtils.warn("command", t, false, false)) .as("failOnWarning = false").doesNotThrowAnyException(); } }