/** * Copyright (c) 2011-2012, James Zhan 詹波 (jfinal@126.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jfinal.plugin.activerecord; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.sql.Blob; import java.sql.Clob; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Types; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * ModelBuilder. */ public class ModelBuilder { @SuppressWarnings({"rawtypes", "unchecked"}) public static final <T> List<T> build(ResultSet rs, Class<? extends Model> modelClass) throws SQLException, InstantiationException, IllegalAccessException { List<T> result = new ArrayList<T>(); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); String[] labelNames = new String[columnCount + 1]; int[] types = new int[columnCount + 1]; buildLabelNamesAndTypes(rsmd, labelNames, types); while (rs.next()) { Model<?> ar = modelClass.newInstance(); Map<String, Object> attrs = ar.getAttrs(); for (int i=1; i<=columnCount; i++) { Object value; if (types[i] < Types.BLOB) value = rs.getObject(i); else if (types[i] == Types.CLOB) value = handleClob(rs.getClob(i)); else if (types[i] == Types.NCLOB) value = handleClob(rs.getNClob(i)); else if (types[i] == Types.BLOB) value = handleBlob(rs.getBlob(i)); else value = rs.getObject(i); attrs.put(labelNames[i].toLowerCase(), value); } result.add((T)ar); } return result; } private static final void buildLabelNamesAndTypes(ResultSetMetaData rsmd, String[] labelNames, int[] types) throws SQLException { for (int i=1; i<labelNames.length; i++) { labelNames[i] = rsmd.getColumnLabel(i); types[i] = rsmd.getColumnType(i); } } public static byte[] handleBlob(Blob blob) throws SQLException { if (blob == null) return null; InputStream is = null; try { is = blob.getBinaryStream(); byte[] data = new byte[(int)blob.length()]; // byte[] data = new byte[is.available()]; is.read(data); is.close(); return data; } catch (IOException e) { throw new RuntimeException(e); } finally { try {is.close();} catch (IOException e) {throw new RuntimeException(e);} } } public static String handleClob(Clob clob) throws SQLException { if (clob == null) return null; Reader reader = null; try { reader = clob.getCharacterStream(); char[] buffer = new char[(int)clob.length()]; reader.read(buffer); return new String(buffer); } catch (IOException e) { throw new RuntimeException(e); } finally { try {reader.close();} catch (IOException e) {throw new RuntimeException(e);} } } /* backup before use columnType @SuppressWarnings({"rawtypes", "unchecked"}) static final <T> List<T> build(ResultSet rs, Class<? extends Model> modelClass) throws SQLException, InstantiationException, IllegalAccessException { List<T> result = new ArrayList<T>(); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); String[] labelNames = getLabelNames(rsmd, columnCount); while (rs.next()) { Model<?> ar = modelClass.newInstance(); Map<String, Object> attrs = ar.getAttrs(); for (int i=1; i<=columnCount; i++) { Object attrValue = rs.getObject(i); attrs.put(labelNames[i], attrValue); } result.add((T)ar); } return result; } private static final String[] getLabelNames(ResultSetMetaData rsmd, int columnCount) throws SQLException { String[] result = new String[columnCount + 1]; for (int i=1; i<=columnCount; i++) result[i] = rsmd.getColumnLabel(i); return result; } */ /* backup @SuppressWarnings({"rawtypes", "unchecked"}) static final <T> List<T> build(ResultSet rs, Class<? extends Model> modelClass) throws SQLException, InstantiationException, IllegalAccessException { List<T> result = new ArrayList<T>(); ResultSetMetaData rsmd = rs.getMetaData(); List<String> labelNames = getLabelNames(rsmd); while (rs.next()) { Model<?> ar = modelClass.newInstance(); Map<String, Object> attrs = ar.getAttrs(); for (String lableName : labelNames) { Object attrValue = rs.getObject(lableName); attrs.put(lableName, attrValue); } result.add((T)ar); } return result; } private static final List<String> getLabelNames(ResultSetMetaData rsmd) throws SQLException { int columCount = rsmd.getColumnCount(); List<String> result = new ArrayList<String>(); for (int i=1; i<=columCount; i++) { result.add(rsmd.getColumnLabel(i)); } return result; } */ }