1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.seasar.cubby.spi.impl;
18
19 import java.util.HashMap;
20 import java.util.Map;
21
22 import org.seasar.cubby.converter.Converter;
23
24
25
26
27
28
29 public abstract class AbstractCachedConverterProvider extends
30 AbstractConverterProvider {
31
32
33 private final Map<String, Converter> converterCache = new HashMap<String, Converter>();
34
35
36
37
38 @Override
39 public Converter getConverter(final Class<?> parameterType,
40 final Class<?> objectType) {
41 final Class<?> destType = ConversionUtils
42 .getWrapperClassIfPrimitive(objectType);
43 final String cacheKey = cacheKey(parameterType, destType);
44 final Converter converter = converterCache.get(cacheKey);
45 if (converter != null) {
46 return converter;
47 }
48 return detectConverter(parameterType, destType);
49 }
50
51 private Converter detectConverter(final Class<?> parameterType,
52 final Class<?> objectType) {
53 final Converter converter = super.getConverter(parameterType,
54 objectType);
55 final String cacheKey = cacheKey(parameterType, objectType);
56 converterCache.put(cacheKey, converter);
57 return converter;
58 }
59
60 private static String cacheKey(final Class<?> parameterType,
61 final Class<?> objectType) {
62 if (parameterType == null) {
63 return objectType.getName();
64 }
65 return parameterType.getName() + objectType.getName();
66 }
67
68
69
70
71 protected void clear() {
72 this.converterCache.clear();
73 }
74
75 }