package hudson.util;
import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;
import com.thoughtworks.xstream.converters.basic.StringConverter;
import org.apache.commons.collections.map.LRUMap;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class LRUStringConverter extends AbstractSingleValueConverter {
/**
* A Map to store strings as long as needed to map similar strings onto the same instance and conserve memory. The
* map can be set from the outside during construction, so it can be a LRU map or a weak map, synchronised or not.
*/
private final Map<String,String> cache;
public LRUStringConverter() {
this(1000);
}
public LRUStringConverter(int size) {
cache = Collections.synchronizedMap(new LRUMap(size));
}
public boolean canConvert(final Class type) {
return type.equals(String.class);
}
public Object fromString(final String str) {
String s = cache.get(str);
if (s == null) {
cache.put(str, str);
s = str;
}
return s;
}
}