X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.util%2Fsrc%2Forg%2Fargeo%2Futil%2FLangUtils.java;h=b791f490d10dbf1146450d3b17a7eeac08927bdc;hb=050bd6a22e01442bf34962c4f378e3d92bc6eb21;hp=8810d646335056a604791cec8a545b27931be1b9;hpb=3a0d866fbeea3f78c293212f4b4fbaeba7dfe2bd;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.util/src/org/argeo/util/LangUtils.java b/org.argeo.util/src/org/argeo/util/LangUtils.java index 8810d6463..b791f490d 100644 --- a/org.argeo.util/src/org/argeo/util/LangUtils.java +++ b/org.argeo.util/src/org/argeo/util/LangUtils.java @@ -7,6 +7,9 @@ import java.io.Writer; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; +import java.time.temporal.Temporal; import java.util.Dictionary; import java.util.Enumeration; import java.util.Hashtable; @@ -38,7 +41,7 @@ public class LangUtils { * Creates a new {@link Dictionary} with one key-value pair (neither key not * value should be null) */ - public static Dictionary init(String key, Object value) { + public static Dictionary dico(String key, Object value) { assert key != null; assert value != null; Hashtable props = new Hashtable<>(); @@ -54,11 +57,11 @@ public class LangUtils { return new DictionaryKeys(props); } - public static String toJson(Dictionary props) { + static String toJson(Dictionary props) { return toJson(props, false); } - public static String toJson(Dictionary props, boolean pretty) { + static String toJson(Dictionary props, boolean pretty) { StringBuilder sb = new StringBuilder(); sb.append('{'); if (pretty) @@ -83,7 +86,7 @@ public class LangUtils { return sb.toString(); } - public static void storeAsProperties(Dictionary props, Path path) throws IOException { + static void storeAsProperties(Dictionary props, Path path) throws IOException { if (props == null) throw new IllegalArgumentException("Props cannot be null"); Properties toStore = new Properties(); @@ -96,7 +99,7 @@ public class LangUtils { } } - public static void appendAsLdif(String dnBase, String dnKey, Dictionary props, Path path) + static void appendAsLdif(String dnBase, String dnKey, Dictionary props, Path path) throws IOException { if (props == null) throw new IllegalArgumentException("Props cannot be null"); @@ -126,7 +129,7 @@ public class LangUtils { } } - public static Dictionary loadFromProperties(Path path) throws IOException { + static Dictionary loadFromProperties(Path path) throws IOException { Properties toLoad = new Properties(); try (InputStream in = Files.newInputStream(path)) { toLoad.load(in); @@ -136,7 +139,7 @@ public class LangUtils { res.put(key.toString(), toLoad.get(key)); return res; } - + /* * EXCEPTIONS */ @@ -152,12 +155,35 @@ public class LangUtils { /** Recursive chaining of messages */ private static void chainCauseMessage(StringBuffer buf, Throwable t) { - buf.append('\n').append(' ').append(t.getClass().getCanonicalName()) - .append(": ").append(t.getMessage()); + buf.append('\n').append(' ').append(t.getClass().getCanonicalName()).append(": ").append(t.getMessage()); if (t.getCause() != null) chainCauseMessage(buf, t.getCause()); } + /* + * TIME + */ + /** Formats time elapsed since start. */ + public static String since(ZonedDateTime start) { + ZonedDateTime now = ZonedDateTime.now(); + return duration(start, now); + } + + /** Formats a duration. */ + public static String duration(Temporal start, Temporal end) { + long count = ChronoUnit.DAYS.between(start, end); + if (count != 0) + return count > 1 ? count + " days" : count + " day"; + count = ChronoUnit.HOURS.between(start, end); + if (count != 0) + return count > 1 ? count + " hours" : count + " hours"; + count = ChronoUnit.MINUTES.between(start, end); + if (count != 0) + return count > 1 ? count + " minutes" : count + " minute"; + count = ChronoUnit.SECONDS.between(start, end); + return count > 1 ? count + " seconds" : count + " second"; + } + /** Singleton constructor. */ private LangUtils() {