001
014
015 package com.liferay.portal.kernel.upgrade.dao.orm;
016
017 import com.liferay.portal.kernel.upgrade.UpgradeException;
018 import com.liferay.portal.kernel.util.GetterUtil;
019 import com.liferay.portal.kernel.util.StringPool;
020
021 import java.lang.reflect.InvocationHandler;
022 import java.lang.reflect.Method;
023
024 import java.sql.ResultSet;
025 import java.sql.ResultSetMetaData;
026 import java.sql.SQLException;
027 import java.sql.Types;
028
029 import java.util.ArrayList;
030 import java.util.HashMap;
031 import java.util.List;
032 import java.util.Map;
033
034
037 public class UpgradeOptimizedResultSetHandler implements InvocationHandler {
038
039 public UpgradeOptimizedResultSetHandler(ResultSet resultSet)
040 throws SQLException {
041
042 _resultSet = resultSet;
043
044 _columnNames.add(StringPool.BLANK);
045
046 ResultSetMetaData resultSetMetaData = _resultSet.getMetaData();
047
048 for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
049 int columnType = resultSetMetaData.getColumnType(i);
050
051 _columnTypes.put(i, columnType);
052
053 String columnName = resultSetMetaData.getColumnName(i);
054
055 _columnNames.add(columnName);
056
057 String lowerCaseColumnName = columnName.toLowerCase();
058
059 _columnTypes.put(lowerCaseColumnName, columnType);
060 }
061 }
062
063 public Object invoke(Object proxy, Method method, Object[] arguments)
064 throws Throwable {
065
066 String methodName = method.getName();
067
068 if (methodName.equals("close")) {
069 _resultSet.close();
070
071 return null;
072 }
073 else if (methodName.equals("next")) {
074 if (_resultSet.isBeforeFirst()) {
075 _next = _resultSet.next();
076 }
077
078 Object returnValue = _next;
079
080 _cacheColumnValues();
081
082 if (_next) {
083 _next = _resultSet.next();
084 }
085
086 return returnValue;
087 }
088 else {
089 Object column = arguments[0];
090
091 if (column instanceof String) {
092 String columnString = (String)column;
093
094 column = columnString.toLowerCase();
095 }
096
097 Object returnValue = _columnValues.get(column);
098
099 if (methodName.equals("getBoolean")) {
100 if ((returnValue == null) || !(returnValue instanceof Number)) {
101 return GetterUtil.getBoolean(returnValue);
102 }
103 else {
104 Number number = (Number)returnValue;
105
106 double doubleValue = number.doubleValue();
107
108 if (doubleValue == 0.0) {
109 return false;
110 }
111 else {
112 return true;
113 }
114 }
115 }
116 else if (methodName.equals("getDouble")) {
117 if ((returnValue == null) || !(returnValue instanceof Number)) {
118 return GetterUtil.getDouble(returnValue);
119 }
120 else {
121 Number number = (Number)returnValue;
122
123 return number.doubleValue();
124 }
125 }
126 else if (methodName.equals("getFloat")) {
127 if ((returnValue == null) || !(returnValue instanceof Number)) {
128 return GetterUtil.getFloat(returnValue);
129 }
130 else {
131 Number number = (Number)returnValue;
132
133 return number.floatValue();
134 }
135 }
136 else if (methodName.equals("getInt")) {
137 if ((returnValue == null) || !(returnValue instanceof Number)) {
138 return GetterUtil.getInteger(returnValue);
139 }
140 else {
141 Number number = (Number)returnValue;
142
143 return number.intValue();
144 }
145 }
146 else if (methodName.equals("getLong")) {
147 if ((returnValue == null) || !(returnValue instanceof Number)) {
148 return GetterUtil.getLong(returnValue);
149 }
150 else {
151 Number number = (Number)returnValue;
152
153 return number.longValue();
154 }
155 }
156 else if (methodName.equals("getShort")) {
157 if ((returnValue == null) || !(returnValue instanceof Number)) {
158 return GetterUtil.getShort(returnValue);
159 }
160 else {
161 Number number = (Number)returnValue;
162
163 return number.shortValue();
164 }
165 }
166 else if (methodName.equals("getString")) {
167 if ((returnValue == null) || (returnValue instanceof String)) {
168 return returnValue;
169 }
170 else {
171 return String.valueOf(returnValue);
172 }
173 }
174
175 return returnValue;
176 }
177 }
178
179 private void _cacheColumnValues() throws Exception {
180 _columnValues.clear();
181
182 if (!_next) {
183 return;
184 }
185
186 for (int i = 1; i < _columnNames.size(); ++i) {
187 String columnName = _columnNames.get(i);
188
189 String lowerCaseColumnName = columnName.toLowerCase();
190
191 Integer columnType = _columnTypes.get(lowerCaseColumnName);
192
193 Object value = _getValue(columnName, columnType);
194
195 _columnValues.put(i, value);
196
197 _columnValues.put(lowerCaseColumnName, value);
198 }
199 }
200
201 private Object _getValue(String name, Integer type) throws Exception {
202 Object value = null;
203
204 int t = type.intValue();
205
206 if (t == Types.BIGINT) {
207 value = GetterUtil.getLong(_resultSet.getLong(name));
208 }
209 else if (t == Types.BINARY) {
210 value = _resultSet.getBytes(name);
211 }
212 else if (t == Types.BIT) {
213 value = GetterUtil.getBoolean(_resultSet.getBoolean(name));
214 }
215 else if (t == Types.BLOB) {
216 value = _resultSet.getBytes(name);
217 }
218 else if (t == Types.BOOLEAN) {
219 value = GetterUtil.getBoolean(_resultSet.getBoolean(name));
220 }
221 else if (t == Types.CHAR) {
222 value = GetterUtil.getString(_resultSet.getString(name));
223 }
224 else if (t == Types.CLOB) {
225 value = GetterUtil.getString(_resultSet.getString(name));
226 }
227 else if (t == Types.DATE) {
228 value = _resultSet.getDate(name);
229 }
230 else if (t == Types.DECIMAL) {
231 value = _resultSet.getBigDecimal(name);
232 }
233 else if (t == Types.DOUBLE) {
234 value = GetterUtil.getDouble(_resultSet.getDouble(name));
235 }
236 else if (t == Types.FLOAT) {
237 value = GetterUtil.getFloat(_resultSet.getFloat(name));
238 }
239 else if (t == Types.INTEGER) {
240 value = GetterUtil.getInteger(_resultSet.getInt(name));
241 }
242 else if (t == Types.LONGNVARCHAR) {
243 value = GetterUtil.getString(_resultSet.getString(name));
244 }
245 else if (t == Types.LONGVARBINARY) {
246 value = _resultSet.getBytes(name);
247 }
248 else if (t == Types.LONGVARCHAR) {
249 value = GetterUtil.getString(_resultSet.getString(name));
250 }
251 else if (t == Types.NCHAR) {
252 value = GetterUtil.getString(_resultSet.getString(name));
253 }
254 else if (t == Types.NCLOB) {
255 value = GetterUtil.getString(_resultSet.getString(name));
256 }
257 else if (t == Types.NUMERIC) {
258 value = GetterUtil.getLong(_resultSet.getLong(name));
259 }
260 else if (t == Types.NVARCHAR) {
261 value = GetterUtil.getString(_resultSet.getString(name));
262 }
263 else if (t == Types.REAL) {
264 value = GetterUtil.getFloat(_resultSet.getFloat(name));
265 }
266 else if (t == Types.ROWID) {
267 value = GetterUtil.getFloat(_resultSet.getFloat(name));
268 }
269 else if (t == Types.SMALLINT) {
270 value = GetterUtil.getShort(_resultSet.getShort(name));
271 }
272 else if (t == Types.SQLXML) {
273 value = GetterUtil.getString(_resultSet.getString(name));
274 }
275 else if (t == Types.TIME) {
276 value = _resultSet.getTime(name);
277 }
278 else if (t == Types.TIMESTAMP) {
279 value = _resultSet.getTimestamp(name);
280 }
281 else if (t == Types.TINYINT) {
282 value = GetterUtil.getShort(_resultSet.getShort(name));
283 }
284 else if (t == Types.VARBINARY) {
285 value = _resultSet.getBytes(name);
286 }
287 else if (t == Types.VARCHAR) {
288 value = GetterUtil.getString(_resultSet.getString(name));
289 }
290 else {
291 throw new UpgradeException(
292 "Upgrade code using unsupported class type " + type);
293 }
294
295 return value;
296 }
297
298 private List<String> _columnNames = new ArrayList<String>();
299 private Map<Object, Integer> _columnTypes = new HashMap<Object, Integer>();
300 private Map<Object, Object> _columnValues = new HashMap<Object, Object>();
301 private boolean _next;
302 private ResultSet _resultSet;
303
304 }