}
}
}
private Converter cacheConverter(final XStreamConverter annotation, final Class<?> targetType) {
Converter result = null;
final Object[] args;
final List<Object> parameter = new ArrayList<Object>();
if (targetType != null && annotation.useImplicitType()) {
parameter.add(targetType);
}
final List<Object> arrays = new ArrayList<Object>();
arrays.add(annotation.booleans());
arrays.add(annotation.bytes());
arrays.add(annotation.chars());
arrays.add(annotation.doubles());
arrays.add(annotation.floats());
arrays.add(annotation.ints());
arrays.add(annotation.longs());
arrays.add(annotation.shorts());
arrays.add(annotation.strings());
arrays.add(annotation.types());
for (final Object array : arrays) {
if (array != null) {
final int length = Array.getLength(array);
for (int i = 0; i < length; i++) {
final Object object = Array.get(array, i);
if (!parameter.contains(object)) {
parameter.add(object);
}
}
}
}
final Class<? extends ConverterMatcher> converterType = annotation.value();
Map<List<Object>, Converter> converterMapping = converterCache.get(converterType);
if (converterMapping != null) {
result = converterMapping.get(parameter);
}
if (result == null) {
final int size = parameter.size();
if (size > 0) {
args = new Object[arguments.length + size];
System.arraycopy(arguments, 0, args, size, arguments.length);
System.arraycopy(parameter.toArray(new Object[size]), 0, args, 0, size);
} else {
args = arguments;
}
final Converter converter;
try {
if (SingleValueConverter.class.isAssignableFrom(converterType)
&& !Converter.class.isAssignableFrom(converterType)) {
final SingleValueConverter svc = (SingleValueConverter)DependencyInjectionFactory.newInstance(
converterType, args);