/**
* 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;
}
}
}