/** * Copyright (c) 2004-2011 Wang Jinbao(Julian Wong), http://www.ralasafe.com * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php */ package org.ralasafe.db; import java.lang.reflect.Method; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.ralasafe.RalasafeException; /** * Mapping a javabean to query result. This adapter adapters resultset to javabean. * A query may use where conditions, this adapter adapters javabean to preparedstatement. */ public class JavaBeanColumnAdapter implements ColumnAdapter { private static Log log=LogFactory.getLog( JavaBeanColumnAdapter.class ); private String origField; private String field; private String getterStr; private String setterStr; private String className; private Method setter; private Method getter; private ResultSetReader rsReader; private PstmtSetter pstmtSetter; public JavaBeanColumnAdapter(String field, String className) { this.origField = field; this.field = field.substring(0, 1).toUpperCase() + field.substring(1); this.getterStr = "get" + this.field; this.setterStr = "set" + this.field; this.className = className; rsReader=ResultSetReaderUtil.getReader( className ); pstmtSetter=PstmtSetterUtil.getSetter( className ); } private void initSetterMethod(Object o) throws Exception { Class valueClass; Class clas = o.getClass(); if (className.equals("int")) valueClass = Integer.TYPE; else if (className.equals("float")) valueClass = Float.TYPE; else if (className.equals("long")) valueClass = Long.TYPE; else if (className.equals("double")) valueClass = Double.TYPE; else if (className.equals("boolean")) valueClass = Boolean.TYPE; else valueClass = Class.forName(className); setter = clas.getMethod(setterStr, new Class[] { valueClass }); } private void initGetterMethod(Object o) throws Exception { Class clas = o.getClass(); // try getField method first try { getter = clas.getMethod(getterStr, new Class[] {}); } catch( NoSuchMethodException e ) { if( "boolean".equals( className ) || "java.lang.Boolean".equals( className ) ) { // for boolean try, try isField method this.getterStr = "is" + this.field; getter = clas.getMethod(getterStr, new Class[] {}); } else { throw e; } } } public void readResultSet(ResultSet rs, String columnName, Object o) throws SQLException { if( setter==null ) { try { initSetterMethod( o ); } catch( Exception e ) { e.printStackTrace(); throw new RalasafeException( e ); } } try { Object readValue=rsReader.reader( rs, columnName ); setter.invoke(o, new Object[] { readValue }); } catch (Exception e) { e.printStackTrace(); throw new RalasafeException(e); } } public void readResultSet(ResultSet rs, int columnIndex, Object o) throws SQLException { if( setter==null ) { try { initSetterMethod( o ); } catch( Exception e ) { log.error( "", e ); throw new RalasafeException( e ); } } try { Object readValue=rsReader.reader( rs, columnIndex ); setter.invoke(o, new Object[] { readValue }); } catch (Exception e) { log.error( "", e ); throw new RalasafeException(e); } } public void setPreparedStatement(PreparedStatement pstmt, int paramIndex, Object o) throws SQLException { try { Object setValue=null; if (o instanceof MapStorgeObject) { MapStorgeObject mso = (MapStorgeObject) o; setValue = mso.get(this.origField); } else { if( getter==null ) { initGetterMethod(o); } setValue=getter.invoke(o, new Object[] {}); } pstmtSetter.set( pstmt, paramIndex, setValue ); } catch( Exception e ) { log.error( "", e ); throw new RalasafeException( e ); } } public Object extractFieldValue(Object o) { try { if( getter==null ) { initGetterMethod(o); } return getter.invoke(o, new Object[] {}); } catch (Exception e) { log.error( "", e ); return null; } } }