code: static List<String> valueAsStringList(Map<String, Object> map, Key key, List<String> defaultValue) {
          Validate.notNullOrEmpty(key.key, "Key for plugin configuration must be set");
          if (map.containsKey(key.key)) {
              Object rawMapOrObject = map.get(key.key);
  
              // handles non-nested content
              if (key.subKey == null) {
                  if (rawMapOrObject == null) {
                      return defaultValue;
                  } else {
                      return tokenize(rawMapOrObject, key.delimiter);
                  }
              }
  
              // go for nested content
              if (rawMapOrObject == null) {
                  return defaultValue;
  
              } else if (!(rawMapOrObject instanceof Map)) {
                  return Arrays.asList(rawMapOrObject.toString());
              }
  
              // 1/ we can either have <excludes>foo,bar</excludes>
              // 2/ or <excludes><exclude>foo</exclude><exclude>bar</exclude></excludes>
              @SuppressWarnings("unchecked")
              Map<String, Object> subMap = (Map<String, Object>) rawMapOrObject;
              Object nestedRaw = subMap.get(key.subKey);
              if (nestedRaw == null) {
                  return defaultValue;
              }
              // format 2/
              else if (nestedRaw instanceof Iterable<?>) {
                  List<String> list = new ArrayList<String>();
                  for (Object nested : (Iterable<?>) nestedRaw) {
                      list.addAll(tokenize(nested, key.delimiter));
                  }
                  return list;
              }
              // format 1/
              else {
                  return tokenize(nestedRaw, key.delimiter);
              }
          }
          return defaultValue;
      }
docs: Fetches a value specified by key
  
  @param map XPP3 map equivalent
  @param key navigation key
  @param defaultValue Default value if no such key exists
  @return List representation of the value