package me.osm.gazetter.join.out_handlers; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; /** * Store and parse options for out handler * */ public class HandlerOptions { private Map<String, List<String>> vals = new HashMap<String, List<String>>(); private HandlerOptions() { } /** * Parse string option * * @param key option key * @param def default value * * @return value * */ public String getString(String key, String def) { List<String> list = vals.get(key); if(list == null || list.isEmpty()) { return def; } return list.get(0); } /** * Parse list of options * * @param key option key * @param def default value * * @return List of parsed string option values * */ public List<String> getList(String key, List<String> def) { if(vals.get(key) == null) { return def; } return vals.get(key); } /** * @param key option key * @return true if option appears in user input */ public boolean has (String key) { return vals.containsKey(key); } /** * Parse flag option * * @param key option key * @param def default value * @param missed what to return if there is no flag * * @return missed if there is no <b>key</b> parameter * def if <b>key</b> appears without any particular value * */ public boolean getFlag (String key, Boolean def, Boolean missed) { if(vals.containsKey(key)) { if(vals.get(key).size() == 0) { return def; } return vals.get(key).iterator().next().equals("true"); } return missed; } /** * Parse user input * * @param options from shell * @param argNames argument/option names * * @return parsed options */ public static HandlerOptions parse(List<String> options, Collection<String> argNames) { HandlerOptions result = new HandlerOptions(); List<String> vals = null; List<String> positional = new ArrayList<String>(); String asOneString = StringUtils.join(options, " "); options = Arrays.asList(StringUtils.split(asOneString, " =")); for(String o : options ) { if(argNames.contains(o)) { vals = new ArrayList<String>(); result.vals.put(o, vals); } else if (vals != null) { vals.add(o); } else { positional.add(o); } } if(!positional.isEmpty()) { result.vals.put(null, positional); } return result; } }