View Javadoc

1   /*
2    * Copyright 2004-2008 the Seasar Foundation and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
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   * @author baba
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 }