X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.util%2Fsrc%2Forg%2Fargeo%2Futil%2FLangUtils.java;h=16229453776e04ed968457183aa225fd578d6c0a;hb=00baea7c5c7bdddf6dd5aa1fae8edaf2ed7a6400;hp=968f8ffe1543335d1126d958d14b092f79d60305;hpb=3a410067ad1efc482f3a445a7c03b60be077cda0;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 968f8ffe1..162294537 100644 --- a/org.argeo.util/src/org/argeo/util/LangUtils.java +++ b/org.argeo.util/src/org/argeo/util/LangUtils.java @@ -10,16 +10,19 @@ import java.nio.file.StandardOpenOption; import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; import java.time.temporal.Temporal; +import java.util.ArrayList; import java.util.Dictionary; import java.util.Enumeration; import java.util.HashMap; import java.util.Hashtable; +import java.util.List; import java.util.Map; import java.util.Properties; import javax.naming.InvalidNameException; import javax.naming.ldap.LdapName; +/** Utilities around Java basic features. */ public class LangUtils { /* * NON-API OSGi @@ -35,28 +38,43 @@ public class LangUtils { return res; } + /* + * MAP + */ + /** + * Creates a new {@link Dictionary} with one key-value pair. Key should not be + * null, but if the value is null, it returns an empty {@link Dictionary}. + */ + public static Map map(String key, Object value) { + assert key != null; + HashMap props = new HashMap<>(); + if (value != null) + props.put(key, value); + return props; + } + /* * DICTIONARY */ /** - * Creates a new {@link Dictionary} with one key-value pair (neither key not - * value should be null) + * Creates a new {@link Dictionary} with one key-value pair. Key should not be + * null, but if the value is null, it returns an empty {@link Dictionary}. */ public static Dictionary dict(String key, Object value) { assert key != null; - assert value != null; Hashtable props = new Hashtable<>(); - props.put(key, value); + if (value != null) + props.put(key, value); return props; } - /**@deprecated Use {@link #dict(String, Object)} instead.*/ + /** @deprecated Use {@link #dict(String, Object)} instead. */ @Deprecated public static Dictionary dico(String key, Object value) { return dict(key, value); } - + /** Converts a {@link Dictionary} to a {@link Map} of strings. */ public static Map dictToStringMap(Dictionary properties) { if (properties == null) { @@ -71,6 +89,29 @@ public class LangUtils { return res; } + /** + * Get a string property from this map, expecting to find it, or + * null if not found. + */ + public static String get(Map map, String key) { + Object res = map.get(key); + if (res == null) + return null; + return res.toString(); + } + + /** + * Get a string property from this map, expecting to find it. + * + * @throws IllegalArgumentException if the key was not found + */ + public static String getNotNull(Map map, String key) { + Object res = map.get(key); + if (res == null) + throw new IllegalArgumentException("Map " + map + " should contain key " + key); + return res.toString(); + } + /** * Wraps the keys of the provided {@link Dictionary} as an {@link Iterable}. */ @@ -162,6 +203,35 @@ public class LangUtils { return res; } + /* + * COLLECTIONS + */ + /** + * Convert a comma-separated separated {@link String} or a {@link String} array + * to a {@link List} of {@link String}, trimming them. Useful to quickly + * interpret OSGi services properties. + * + * @return a {@link List} containing the trimmed {@link String}s, or an empty + * {@link List} if the argument was null. + */ + public static List toStringList(Object value) { + List values = new ArrayList<>(); + if (value == null) + return values; + String[] arr; + if (value instanceof String) { + arr = ((String) value).split(","); + } else if (value instanceof String[]) { + arr = (String[]) value; + } else { + throw new IllegalArgumentException("Unsupported value type " + value.getClass()); + } + for (String str : arr) { + values.add(str.trim()); + } + return values; + } + /* * EXCEPTIONS */