1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.seasar.cubby.dxo.impl;
17
18 import java.util.ArrayList;
19 import java.util.HashMap;
20 import java.util.List;
21 import java.util.Map;
22
23 import org.seasar.extension.dxo.converter.ConversionContext;
24 import org.seasar.extension.dxo.converter.Converter;
25 import org.seasar.extension.dxo.converter.impl.ConverterFactoryImpl;
26 import org.seasar.framework.container.ComponentDef;
27 import org.seasar.framework.container.S2Container;
28 import org.seasar.framework.container.factory.S2ContainerFactory;
29 import org.seasar.framework.log.Logger;
30 import org.seasar.framework.util.DisposableUtil;
31 import org.seasar.framework.util.ResourceUtil;
32
33
34
35
36
37
38 public class RequestParameterConverterFactoryImpl extends ConverterFactoryImpl {
39
40 private static final Logger logger = Logger
41 .getLogger(RequestParameterConverterFactoryImpl.class);
42
43 private static final Converter[] EMPTY_CONVERTER_ARRAY = new Converter[0];
44
45 private static final Map<Converter, Converter> wrapperCache = new HashMap<Converter, Converter>();
46
47 private final List<String> converterContainerPaths = new ArrayList<String>();
48
49 private final List<S2Container> containers = new ArrayList<S2Container>();
50
51 private boolean includeApplicationConverters = true;
52
53 private boolean initialized = false;
54
55 public void addConverterContainerPath(final String converterContainerPath) {
56 this.converterContainerPaths.add(converterContainerPath);
57 }
58
59 public void setIncludeApplicationConverters(
60 final boolean includeApplicationConverters) {
61 this.includeApplicationConverters = includeApplicationConverters;
62 }
63
64 @Override
65 public void initialize() {
66 if (initialized) {
67 return;
68 }
69
70 super.initialize();
71
72 final Map<Class<? extends Converter>, Converter> converterMap = new HashMap<Class<? extends Converter>, Converter>();
73 for (final String path : this.converterContainerPaths) {
74 if (ResourceUtil.isExist(path)) {
75 if (logger.isDebugEnabled()) {
76 logger.log("DCUB0011", new Object[] { path });
77 }
78 final S2Container container = S2ContainerFactory.create(path);
79 containers.add(container);
80 for (final ComponentDef componentDef : container
81 .findAllComponentDefs(Converter.class)) {
82 final Converter converter = (Converter) componentDef
83 .getComponent();
84 converterMap.put(converter.getClass(), converter);
85 if (logger.isDebugEnabled()) {
86 logger.log("DCUB0010", new Object[] { converter });
87 }
88 }
89 if (logger.isDebugEnabled()) {
90 logger
91 .log("DCUB0012",
92 new Object[] { container.getPath() });
93 }
94 }
95 }
96
97 if (includeApplicationConverters) {
98 final List<Converter> converterList = new ArrayList<Converter>(
99 converterMap.values());
100 if (logger.isDebugEnabled()) {
101 logger.log("DCUB0013", null);
102 }
103 for (final Converter converter : converters) {
104 if (!converterMap.containsKey(converter.getClass())) {
105 converterList.add(converter);
106 if (logger.isDebugEnabled()) {
107 logger.log("DCUB0010", new Object[] { converter });
108 }
109 }
110 }
111 if (logger.isDebugEnabled()) {
112 logger.log("DCUB0014", null);
113 }
114 converters = converterList.toArray(EMPTY_CONVERTER_ARRAY);
115 } else {
116 converters = converterMap.values().toArray(EMPTY_CONVERTER_ARRAY);
117 }
118
119 DisposableUtil.add(this);
120 initialized = true;
121 }
122
123 @Override
124 public void dispose() {
125 wrapperCache.clear();
126 for (final S2Container container : this.containers) {
127 container.destroy();
128 }
129 containers.clear();
130 super.dispose();
131 initialized = false;
132 }
133
134 @Override
135 @SuppressWarnings("unchecked")
136 public Converter getConverter(final Class sourceClass, final Class destClass) {
137 initialize();
138 final Converter converter = super.getConverter(sourceClass, destClass);
139 final Converter wrapper;
140 if (wrapperCache.containsKey(converter)) {
141 wrapper = wrapperCache.get(converter);
142 } else {
143 wrapper = new DisregardExceptionConverterWrapper(converter);
144 wrapperCache.put(converter, wrapper);
145 }
146 return wrapper;
147 }
148
149 static class DisregardExceptionConverterWrapper implements Converter {
150
151 private final Converter converter;
152
153 public DisregardExceptionConverterWrapper(final Converter converter) {
154 this.converter = converter;
155 }
156
157 @SuppressWarnings("unchecked")
158 public Object convert(final Object source, final Class destClass,
159 final ConversionContext context) {
160 try {
161 return converter.convert(source, destClass, context);
162 } catch (final Exception e) {
163 return null;
164 }
165 }
166
167 public void convert(final Object source, final Object dest,
168 final ConversionContext context) {
169 converter.convert(source, dest, context);
170 }
171
172 @SuppressWarnings("unchecked")
173 public Class getDestClass() {
174 return converter.getDestClass();
175 }
176
177 @SuppressWarnings("unchecked")
178 public Class[] getSourceClasses() {
179 return converter.getSourceClasses();
180 }
181
182 }
183
184 }