/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.graph.convert; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.joda.convert.StringConverter; import com.opengamma.sesame.function.ParameterUtils; import com.opengamma.util.ArgumentChecker; @SuppressWarnings("unchecked") class MapConverter implements StringConverter { private final StringConverter _keyConverter; private final StringConverter _valueConverter; private final Class<?> _keyType; private final Class<?> _valueType; public MapConverter(Class<?> keyType, StringConverter keyConverter, Class<?> valueType, StringConverter valueConverter) { _keyType = keyType; _valueType = valueType; _keyConverter = ArgumentChecker.notNull(keyConverter, "keyConverter"); _valueConverter = ArgumentChecker.notNull(valueConverter, "valueConverter"); } @Override public Map<?, ?> convertFromString(Class type, String value) { List<String> strings = StringParser.parse(value); Map<Object, Object> map = new HashMap<>(); if ((strings.size() % 2) != 0) { throw new IllegalArgumentException("A map must be specified as 'key value key value' but an odd number of " + "items were found (" + strings.size() + ")"); } for (int i = 0; i < (strings.size() / 2); i++) { String keyStr = strings.get(i * 2); String valStr = strings.get((i * 2) + 1); Object key = _keyConverter.convertFromString(_keyType, keyStr); Object val = _valueConverter.convertFromString(_valueType, valStr); map.put(key, val); } return map; } @Override public String convertToString(Object value) { Map<Object, Object> map = (Map<Object, Object>) value; List<String> strings = new ArrayList<>(map.size() * 2); for (Map.Entry<Object, Object> entry : map.entrySet()) { Object key = entry.getKey(); Object val = entry.getValue(); String keyStr = _keyConverter.convertToString(key); String valStr = _valueConverter.convertToString(val); strings.add(ParameterUtils.escapeString(keyStr)); strings.add(ParameterUtils.escapeString(valStr)); } return StringUtils.join(strings, " "); } }