package beast.core.parameter; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import beast.core.CalculationNode; import beast.core.Description; import beast.core.Input; @Description("Unordered set mapping keys to values") abstract public class Map<T> extends CalculationNode { final public Input<java.util.Map<java.lang.String, T>> defaultInput = new Input<>("*", "Input containing the map", new LinkedHashMap<>()); public java.util.Map<java.lang.String, T> map; public Map() { // set up type of default input, since it cannot be discovered through introspection defaultInput.setType(mapType()); } abstract protected Class<?> mapType(); @Override public void initAndValidate() { map = defaultInput.get(); } @SuppressWarnings("unchecked") @Override public void setInputValue(java.lang.String name, Object value) { //try { for (Input<?> input : listInputs()) { if (input != defaultInput && input.getName().equals(name)) { input.setValue(value, this); return; } } //} catch (IllegalAccessException e) { // e.printStackTrace(); // throw new RuntimeException("Failed to set input named '" + name + "' with value '" + value + "'"); //} map = defaultInput.get(); if (defaultInput.getType().equals(List.class)) { if (defaultInput.get().containsKey(name)) { List<Object> list = (List<Object>) defaultInput.get().get(name); list.add(value); } else { List<Object> list = new ArrayList<>(); list.add(value); defaultInput.get().put(name, (T) list); } } else { defaultInput.get().put(name, (T) value); } } ; @Override final public Input<?> getInput(java.lang.String name) { //try { for (Input<?> input : listInputs()) { if (input != defaultInput && input.getName().equals(name)) { return input; } } //} catch (IllegalAccessException e) { // e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. // throw new RuntimeException("Failed to get input named '" + name + "'"); //} return defaultInput; } /** * some utility methods * */ public T get(String key) { return map.get(key); } public boolean contains(String key) { return map.containsKey(key); } public T remove(String key) { return map.remove(key); } }