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