/**
* 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.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.joda.convert.StringConverter;
import com.opengamma.sesame.function.ParameterUtils;
import com.opengamma.util.ArgumentChecker;
@SuppressWarnings("unchecked")
abstract class CollectionConverter implements StringConverter<Object> {
private final StringConverter<Object> _elementConverter;
CollectionConverter(StringConverter<Object> elementConverter) {
_elementConverter = ArgumentChecker.notNull(elementConverter, "elementConverter");
}
@Override
public Collection<?> convertFromString(Class<?> type, String value) {
Collection<String> stringValues = StringParser.parse(value);
Collection<Object> convertedValues = createEmptyCollection(stringValues.size());
for (String stringValue : stringValues) {
convertedValues.add(_elementConverter.convertFromString(type, stringValue));
}
return convertedValues;
}
protected abstract Collection<Object> createEmptyCollection(int size);
@Override
public String convertToString(Object value) {
ArgumentChecker.notNull(value, "value");
if (!(value instanceof Collection<?>)) {
throw new IllegalArgumentException("value must be a collection. " + value);
}
Collection<Object> list = (Collection<Object>) value;
List<String> convertedElements = new ArrayList<>(list.size());
for (Object item : list) {
convertedElements.add(ParameterUtils.escapeString(_elementConverter.convertToString(item)));
}
return StringUtils.join(convertedElements, " ");
}
public static StringConverter<Object> create(Class<?> collectionType, StringConverter<Object> elementConverter) {
if (collectionType == List.class) {
return new ListConverter(elementConverter);
}
if (collectionType == Set.class) {
return new SetConverter(elementConverter);
}
throw new IllegalArgumentException("Unexpected collection type " + collectionType);
}
private static class SetConverter extends CollectionConverter {
/* package */ SetConverter(StringConverter<Object> elementConverter) {
super(elementConverter);
}
@Override
protected Collection<Object> createEmptyCollection(int size) {
return new HashSet<>(size);
}
}
private static class ListConverter extends CollectionConverter {
/* package */ ListConverter(StringConverter<Object> elementConverter) {
super(elementConverter);
}
@Override
protected Collection<Object> createEmptyCollection(int size) {
return new ArrayList<>(size);
}
}
}