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 else if (methodName.equals("next")) {
075 if (_resultSet.isBeforeFirst()) {
076 _next = _resultSet.next();
077 }
078
079 Object returnValue = _next;
080
081 _cacheColumnValues();
082
083 if (_next) {
084 _next = _resultSet.next();
085 }
086
087 return returnValue;
088 }
089 else {
090 Object column = arguments[0];
091
092 if (column instanceof String) {
093 String columnString = (String)column;
094
095 column = columnString.toLowerCase();
096 }
097
098 Object returnValue = _columnValues.get(column);
099
100 if (methodName.equals("getBoolean")) {
101 if ((returnValue == null) || !(returnValue instanceof Number)) {
102 return GetterUtil.getBoolean(returnValue);
103 }
104 else {
105 Number number = (Number)returnValue;
106
107 double doubleValue = number.doubleValue();
108
109 if (doubleValue == 0.0) {
110 return false;
111 }
112 else {
113 return true;
114 }
115 }
116 }
117 else if (methodName.equals("getDouble")) {
118 if ((returnValue == null) || !(returnValue instanceof Number)) {
119 return GetterUtil.getDouble(returnValue);
120 }
121 else {
122 Number number = (Number)returnValue;
123
124 return number.doubleValue();
125 }
126 }
127 else if (methodName.equals("getFloat")) {
128 if ((returnValue == null) || !(returnValue instanceof Number)) {
129 return GetterUtil.getFloat(returnValue);
130 }
131 else {
132 Number number = (Number)returnValue;
133
134 return number.floatValue();
135 }
136 }
137 else if (methodName.equals("getInt")) {
138 if ((returnValue == null) || !(returnValue instanceof Number)) {
139 return GetterUtil.getInteger(returnValue);
140 }
141 else {
142 Number number = (Number)returnValue;
143
144 return number.intValue();
145 }
146 }
147 else if (methodName.equals("getLong")) {
148 if ((returnValue == null) || !(returnValue instanceof Number)) {
149 return GetterUtil.getLong(returnValue);
150 }
151 else {
152 Number number = (Number)returnValue;
153
154 return number.longValue();
155 }
156 }
157 else if (methodName.equals("getShort")) {
158 if ((returnValue == null) || !(returnValue instanceof Number)) {
159 return GetterUtil.getShort(returnValue);
160 }
161 else {
162 Number number = (Number)returnValue;
163
164 return number.shortValue();
165 }
166 }
167 else if (methodName.equals("getString")) {
168 if ((returnValue == null) || (returnValue instanceof String)) {
169 return returnValue;
170 }
171 else {
172 return String.valueOf(returnValue);
173 }
174 }
175
176 return returnValue;
177 }
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 }