diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index bf65051..c0ba763 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -22,8 +22,11 @@ jobs: distribution: "zulu" java-version: ${{ matrix.java-version }} - - name: Download dependencies + - name: Grant execute permission for bld + run: chmod +x bld + + - name: Download the dependencies run: ./bld download - - name: Run tests + - name: Run tests with bld run: ./bld compile test diff --git a/README.md b/README.md index af8b28a..2f550f9 100755 --- a/README.md +++ b/README.md @@ -69,13 +69,12 @@ 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())` | -| `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. | +| 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. | ## EntryDate diff --git a/examples/README.md b/examples/README.md index ca9e01e..13b19da 100644 --- a/examples/README.md +++ b/examples/README.md @@ -10,7 +10,6 @@ ./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 f6d642f..0af2487 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.5 +bld.extension=com.uwyn.rife2:bld-property-file:0.9.6-SNAPSHOT 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 7cc4319..c004cc1 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, 3))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 2))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 2))); } public static void main(String[] args) { @@ -107,7 +107,6 @@ 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 ecd44bb..b919836 100644 --- a/examples/version.properties +++ b/examples/version.properties @@ -1,4 +1,6 @@ # -#Tue Jul 16 16:16:38 PDT 2024 -build.date=2024-07-16 -release=beta.20240716161638 +#Sun Oct 22 14:31:42 PDT 2023 +release=beta.20231022143142 +version.major=1 +version.minor=0 +version.patch=1 diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 4dadca8..7a65d7b 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.6 -bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.2 +bld.extension-jacoco=com.uwyn.rife2:bld-jacoco-report:0.9.5 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.0 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 63a1be2..9d8ab40 100644 --- a/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java +++ b/src/bld/java/rife/bld/extension/propertyfile/PropertyFileBuild.java @@ -24,6 +24,7 @@ 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; @@ -46,9 +47,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, 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.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.assertj:assertj-joda-time:2.2.0")); javadocOperation() @@ -96,14 +97,14 @@ public class PropertyFileBuild extends Project { } @BuildCommand(summary = "Generates JaCoCo Reports") - public void jacoco() throws Exception { + public void jacoco() throws IOException { new JacocoReportOperation() .fromProject(this) .execute(); } @BuildCommand(summary = "Runs PMD analysis") - public void pmd() throws Exception { + public void pmd() { 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 9e8009a..379255c 100644 --- a/src/main/java/rife/bld/extension/propertyfile/Entry.java +++ b/src/main/java/rife/bld/extension/propertyfile/Entry.java @@ -25,59 +25,62 @@ import java.util.function.BiFunction; * @author Geert Bevin * @since 1.0 */ -public class Entry extends EntryBase { - private String modifyValue_ = ""; - private BiFunction modify_; - +public class Entry extends EntryBase { /** - * Creates a new {@link Entry entry}. + * Instantiates a new Entry. * - * @param key the required property key + * @param key the key */ public Entry(String key) { super(key); } /** - * Returns the modify function. + *

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

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