cache invalidation

This commit is contained in:
Keith Donald 2010-04-19 01:45:27 +00:00
parent bf03d0d56f
commit 594596f361
1 changed files with 15 additions and 12 deletions

View File

@ -74,7 +74,7 @@ public class GenericConversionService implements ConversionService, ConverterReg
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
public String toString() { public String toString() {
return "null"; return "NO_MATCH";
} }
}; };
@ -85,13 +85,6 @@ public class GenericConversionService implements ConversionService, ConverterReg
// implementing ConverterRegistry // implementing ConverterRegistry
public void addConverter(GenericConverter converter) {
Set<GenericConverter.ConvertiblePair> convertibleTypes = converter.getConvertibleTypes();
for (GenericConverter.ConvertiblePair convertibleType : convertibleTypes) {
getMatchableConvertersList(convertibleType.getSourceType(), convertibleType.getTargetType()).add(converter);
}
}
public void addConverter(Converter<?, ?> converter) { public void addConverter(Converter<?, ?> converter) {
GenericConverter.ConvertiblePair typeInfo = getRequiredTypeInfo(converter, Converter.class); GenericConverter.ConvertiblePair typeInfo = getRequiredTypeInfo(converter, Converter.class);
if (typeInfo == null) { if (typeInfo == null) {
@ -110,10 +103,18 @@ public class GenericConversionService implements ConversionService, ConverterReg
addConverter(new ConverterFactoryAdapter(typeInfo, converterFactory)); addConverter(new ConverterFactoryAdapter(typeInfo, converterFactory));
} }
public void removeConvertible(Class<?> sourceType, Class<?> targetType) { public void addConverter(GenericConverter converter) {
getSourceConverterMap(sourceType).remove(targetType); Set<GenericConverter.ConvertiblePair> convertibleTypes = converter.getConvertibleTypes();
for (GenericConverter.ConvertiblePair convertibleType : convertibleTypes) {
getMatchableConverters(convertibleType.getSourceType(), convertibleType.getTargetType()).add(converter);
}
invalidateCache();
} }
public void removeConvertible(Class<?> sourceType, Class<?> targetType) {
getSourceConverterMap(sourceType).remove(targetType);
invalidateCache();
}
// implementing ConversionService // implementing ConversionService
@ -210,7 +211,6 @@ public class GenericConversionService implements ConversionService, ConverterReg
return builder.toString(); return builder.toString();
} }
// subclassing hooks // subclassing hooks
/** /**
@ -295,7 +295,6 @@ public class GenericConversionService implements ConversionService, ConverterReg
} }
} }
// internal helpers // internal helpers
private GenericConverter.ConvertiblePair getRequiredTypeInfo(Object converter, Class<?> genericIfc) { private GenericConverter.ConvertiblePair getRequiredTypeInfo(Object converter, Class<?> genericIfc) {
@ -303,7 +302,7 @@ public class GenericConversionService implements ConversionService, ConverterReg
return (args != null ? new GenericConverter.ConvertiblePair(args[0], args[1]) : null); return (args != null ? new GenericConverter.ConvertiblePair(args[0], args[1]) : null);
} }
private MatchableConverters getMatchableConvertersList(Class<?> sourceType, Class<?> targetType) { private MatchableConverters getMatchableConverters(Class<?> sourceType, Class<?> targetType) {
Map<Class<?>, MatchableConverters> sourceMap = getSourceConverterMap(sourceType); Map<Class<?>, MatchableConverters> sourceMap = getSourceConverterMap(sourceType);
MatchableConverters matchable = sourceMap.get(targetType); MatchableConverters matchable = sourceMap.get(targetType);
if (matchable == null) { if (matchable == null) {
@ -313,6 +312,10 @@ public class GenericConversionService implements ConversionService, ConverterReg
return matchable; return matchable;
} }
private void invalidateCache() {
this.converterCache.clear();
}
private Map<Class<?>, MatchableConverters> getSourceConverterMap(Class<?> sourceType) { private Map<Class<?>, MatchableConverters> getSourceConverterMap(Class<?> sourceType) {
Map<Class<?>, MatchableConverters> sourceMap = converters.get(sourceType); Map<Class<?>, MatchableConverters> sourceMap = converters.get(sourceType);
if (sourceMap == null) { if (sourceMap == null) {