/** * Copyright 2005-2016 Red Hat, Inc. * * Red Hat licenses this file to you under the Apache License, version * 2.0 (the "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. */ package io.fabric8.utils; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * Some helper methods for working with maps */ public class Maps { public static boolean isNullOrEmpty(Map map) { return map == null || map.isEmpty(); } /** * Copies the entries for the given keys form the input map to the output map */ public static <K,V> void putAll(Map<K,V> output, Map<K,V> input, K... keys) { for (K key : keys) { V value = input.get(key); if (value != null) { output.put(key, value); } } } /** * Returns the boolean value of the given property in the map or false */ public static boolean booleanValue(Map<String,?> map, String key) { return booleanValue(map, key, false); } /** * Returns the boolean value of the given property in the map or returns the default value if its not present */ public static boolean booleanValue(Map<String,?> map, String key, boolean defaultValue) { Object obj = map.get(key); if (obj == null) { return defaultValue; } else if (obj instanceof Boolean) { Boolean value = (Boolean)obj; return value.booleanValue(); } else { String text = obj.toString(); return Boolean.parseBoolean(text); } } /** * Returns the Integer value of the given property in the map or null */ public static Integer integerValue(Map<String,?> map, String key) { return integerValue(map, key, null); } /** * Returns the Integer value of the given property in the map or returns the default value if its not present */ public static Integer integerValue(Map<String,?> map, String key, Integer defaultValue) { Object obj = map.get(key); if (obj instanceof Integer) { return (Integer) obj; } else if (obj instanceof Number) { Number number = (Number) obj; return number.intValue(); } else if (obj != null) { String text = obj.toString(); if (Strings.isNotBlank(text)) { return Integer.parseInt(text); } } return defaultValue; } /** * Returns the Long value of the given property in the map or null */ public static Long longValue(Map<String,?> map, String key) { return longValue(map, key, null); } /** * Returns the Integer value of the given property in the map or returns the default value if its not present */ public static Long longValue(Map<String,?> map, String key, Long defaultValue) { Object obj = map.get(key); if (obj instanceof Long) { return (Long) obj; } else if (obj instanceof Number) { Number number = (Number) obj; return number.longValue(); } else if (obj != null) { String text = obj.toString(); if (Strings.isNotBlank(text)) { return Long.parseLong(text); } } return defaultValue; } protected static Object valueOrNull(Map<String, Object> map, String key) { return value(map, key, null); } /** * Returns the value of the given property in the map */ public static Object value(Map<String,Object> map, String key, Object defaultValue) { Object obj = map.get(key); if (obj == null) { return defaultValue; } else { return obj; } } /** * Returns the String value of the given property in the map or null */ public static String stringValue(Map map, String key) { return stringValue(map, key, null); } /** * Returns the String value of the given property in the map if its defined or the default value */ public static String stringValue(Map map, String key, String defaultValue) { Object obj = map.get(key); if (obj == null) { return defaultValue; } else if (obj instanceof String) { return (String) obj; } else { return String.valueOf(obj); } } /** * Sets the value in the map for the given key; if the value is null then remove the value from the map */ public static void setValue(Map map, String key, Object value) { if (value != null) { map.put(key, value); } else { map.remove(key); } } /** * Returns the string values for the given key. If the value is a String then it is split using a comma */ public static String[] stringValues(Map map, String key) { Object obj = map.get(key); if (obj instanceof String[]) { return (String[]) obj; } else if (obj instanceof String) { String text = (String) obj; return text.split(","); } return null; } /** * Sets the string values in the map for the given key, using a comma to separate the values as a String */ public static void setStringValues(Map map, String key, String[] values) { if (values != null) { String text = Arrays.join(",", values); map.put(key, text); } else { map.remove(key); } } /** * Returns a list of values for the given key. If its not a list then just return a single value as a List */ public static List listValue(Map<String, Object> map, String key) { Object value = null; if (map != null) { value = map.get(key); } if (value instanceof List) { return (List) value; } else if (value instanceof Object[]) { return java.util.Arrays.asList((Object[]) value); } else if (value != null) { List list = new ArrayList(); list.add(value); return list; } return null; } public static String valueAsString(Map<String, Object> map, String key) { if (map != null) { Object value = valueOrNull(map, key); if (value != null) { return value.toString(); } } return null; } public static String nestedValueAsString(Map<String, Object> map, String... names) { int lastIdx = names.length -1; for (int i = 0; i < lastIdx; i++) { if (map == null) { return null; } map = (Map<String, Object>) value(map, names[i], null); } return valueAsString(map, names[lastIdx]); } /** * Parses text from an environment variable of the form "key=value,key2=value2" into a Map */ public static LinkedHashMap<String, String> parseMap(String text) { LinkedHashMap<String, String> answer = new LinkedHashMap<>(); if (Strings.isNotBlank(text)) { String[] entries = text.split(","); if (entries != null) { for (String entry : entries) { String[] values = entry.split("=", 2); if (values != null && values.length == 2) { answer.put(values[0], values[1]); } } } } return answer; } }