baliuka 2003/03/16 08:23:48
Modified: dbutils/src/java/org/apache/commons/dbutils DbUtils.java
MapHandler.java ProcedureUtils.java
dbutils/src/test/org/apache/commons/dbutils Demo.java
ProcedureUtilsTest.java
Added: dbutils/src/java/org/apache/commons/dbutils
BeanCollectionHandler.java BeanHandler.java
Log:
adde support for beans
Revision Changes Path
1.21 +142 -75
jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/DbUtils.java
Index: DbUtils.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/DbUtils.java,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- DbUtils.java 16 Mar 2003 14:00:15 -0000 1.20
+++ DbUtils.java 16 Mar 2003 16:23:47 -0000 1.21
@@ -68,17 +68,17 @@
static{
- DEFAULTS.put(int.class, new Integer(0));
- DEFAULTS.put(short.class, new Short((short)0));
- DEFAULTS.put(byte.class, new Byte((byte)0));
- DEFAULTS.put(float.class, new Float(0f));
- DEFAULTS.put(double.class, new Double(0.0));
- DEFAULTS.put(long.class, new Long(0L));
- DEFAULTS.put(boolean.class, Boolean.FALSE);
- DEFAULTS.put(char.class, new Character('\u0000'));
-
+ DEFAULTS.put(int.class, new Integer(0));
+ DEFAULTS.put(short.class, new Short((short)0));
+ DEFAULTS.put(byte.class, new Byte((byte)0));
+ DEFAULTS.put(float.class, new Float(0f));
+ DEFAULTS.put(double.class, new Double(0.0));
+ DEFAULTS.put(long.class, new Long(0L));
+ DEFAULTS.put(boolean.class, Boolean.FALSE);
+ DEFAULTS.put(char.class, new Character('\u0000'));
+
}
-
+
public static abstract class ListAdapter extends ArrayList implements
ResultSetHandler{
public final Object handle(java.sql.ResultSet rs, Object[] params, Object
userObject) throws java.sql.SQLException{
@@ -141,13 +141,13 @@
}
- public static Object executeQuery(Connection connection, String query,
- Object[] vals, ResultSetHandler rsh, ResultSetMetaDataHandler
rsmdh) throws SQLException{
- return executeQuery(connection,query, vals, rsh, rsmdh, null );
-}
+ public static Object executeQuery(Connection connection, String query,
+ Object[] vals, ResultSetHandler rsh, ResultSetMetaDataHandler rsmdh) throws
SQLException{
+ return executeQuery(connection,query, vals, rsh, rsmdh, null );
+ }
- public static Object executeQuery(Connection connection, String query,
- Object[] vals, ResultSetHandler rsh, ResultSetMetaDataHandler
rsmdh, Object userObject)
+ public static Object executeQuery(Connection connection, String query,
+ Object[] vals, ResultSetHandler rsh, ResultSetMetaDataHandler rsmdh, Object
userObject)
throws SQLException {
PreparedStatement stmt = null;
@@ -183,15 +183,15 @@
}
static void rethrow(SQLException cause, String sql,Object[] vals )throws
SQLException{
-
- StringBuffer msg =
- new StringBuffer(cause.getMessage() + " in query " + sql);
+
+ StringBuffer msg =
+ new StringBuffer(cause.getMessage() + " in query " + sql);
if (vals != null) {
msg.append(java.util.Arrays.asList(vals).toString());
}
SQLException newsqle = new SQLException(msg.toString());
- newsqle.setNextException(cause);
- throw newsqle;
+ newsqle.setNextException(cause);
+ throw newsqle;
}
@@ -229,8 +229,8 @@
}
- public static List executeListQuery(Connection connection,
- String query, Object[] vals, Object userObject )
+ public static List executeListQuery(Connection connection,
+ String query, Object[] vals, Object userObject )
throws SQLException {
return executeListQuery(connection, query, vals, null, userObject);
}
@@ -241,8 +241,8 @@
* inside an List.
* Null values in the Object array will be passed to the driver.
*/
- public static List executeListQuery(Connection connection,
- String query, Object[] vals, ResultSetMetaDataHandler rsmdh, Object
userObject )
+ public static List executeListQuery(Connection connection,
+ String query, Object[] vals, ResultSetMetaDataHandler rsmdh, Object userObject )
throws SQLException {
return (List)executeQuery(connection,query,vals,
@@ -253,7 +253,7 @@
}
}
-
+
, rsmdh
, userObject );
@@ -301,68 +301,135 @@
return false;
}
}
-
- /**
+
+ /**
* Create an Map from a ResultSet.
* It is assumed that next() has already been called on the ResultSet.
*/
-
+
public static java.util.Map resultSetToMap(ResultSet rs) throws SQLException {
- java.util.Map result = new java.util.Hashtable();
- ResultSetMetaData rsmd = rs.getMetaData();
- int cnt = rsmd.getColumnCount();
- for( int i = 1; i <= cnt; i++ ){
+ java.util.Map result = new java.util.Hashtable();
+ ResultSetMetaData rsmd = rs.getMetaData();
+ int cnt = rsmd.getColumnCount();
+ for( int i = 1; i <= cnt; i++ ){
Object value = rs.getObject(i);
if(!rs.wasNull()){
- result.put(rsmd.getColumnName(i),value);
+ result.put(rsmd.getColumnName(i),value);
}
- }
- return result;
+ }
+ return result;
}
/**
* Create an Bean from a ResultSet.
* It is assumed that next() has already been called on the ResultSet.
*/
-
- public static Object resultSetToBean(ResultSet rs, Object obj) throws
SQLException {
-
- try{
-
- java.beans.BeanInfo bInfo = java.beans.Introspector.getBeanInfo(
- obj.getClass());
- java.beans.PropertyDescriptor pd[] = bInfo.getPropertyDescriptors();
-
- ResultSetMetaData rsmd = rs.getMetaData();
- int cnt = rsmd.getColumnCount();
- LOOP:
- for( int i = 1; i <= cnt; i++ ){
- String name = rsmd.getColumnName(i);
- for( int j = 0; j < pd.length; j++ ){
- if(name.equals(pd[j].getName())){
- Object value = rs.getObject(i);
- if(!rs.wasNull() && pd[j].getPropertyType().isPrimitive() ){
- value = DEFAULTS.get( pd[j].getPropertyType() );
- }
- try{
-
- pd[j].getWriteMethod().invoke(obj, new Object[]{ value });
-
- }catch(Exception e){
- throw new DbException( "can not set " + name , e);
- }
- continue LOOP;
- }
- }
- throw new SQLException(name + " not found in " + obj.getClass().getName()
);
- }
- }catch(java.beans.IntrospectionException ie){
- throw new DbException(ie);
- }
- return obj;
+ public static Object resultSetToBean(ResultSet rs, Object obj) throws
SQLException {
+
+ try{
+
+ java.beans.BeanInfo bInfo = java.beans.Introspector.getBeanInfo(
+ obj.getClass());
+ java.beans.PropertyDescriptor pd[] = bInfo.getPropertyDescriptors();
+
+ ResultSetMetaData rsmd = rs.getMetaData();
+ int cnt = rsmd.getColumnCount();
+ LOOP:
+ for( int i = 1; i <= cnt; i++ ){
+ String name = rsmd.getColumnName(i);
+ for( int j = 0; j < pd.length; j++ ){
+ if(name.equals(pd[j].getName())){
+ Object value = rs.getObject(i);
+ if( rs.wasNull() &&
pd[j].getPropertyType().isPrimitive() ){
+ value = DEFAULTS.get( pd[j].getPropertyType() );
+ }
+ try{
+
+ pd[j].getWriteMethod().invoke(obj, new Object[]{
value });
+ continue LOOP;
+
+ }catch(Exception e){
+ throw new DbException( "can not set " + name , e);
+ }
+
+ }
+ }
+ throw new SQLException(name + " not found in " +
obj.getClass().getName() );
+ }
+ }catch(java.beans.IntrospectionException ie){
+ throw new DbException(ie);
+ }
+
+ return obj;
}
/**
+ * optimized for collections of beans
+ *
+ */
+ public static java.util.Collection resultSetToBeanCollection(ResultSet rs,
Class cls) throws SQLException {
+ java.util.List results = new java.util.Vector();
+ try{
+
+ if(rs.next()){
+
+ java.beans.BeanInfo bInfo =
java.beans.Introspector.getBeanInfo(cls);
+ java.beans.PropertyDescriptor pd[] =
bInfo.getPropertyDescriptors();
+ ResultSetMetaData rsmd = rs.getMetaData();
+ int cnt = rsmd.getColumnCount();
+ int nameToIndex[] = new int[ cnt + 1 ];
+
+ LOOP:
+ for( int i = 1; i <= cnt; i++ ){
+ for( int j = 0; j < pd.length; j++ ){
+ String name = rsmd.getColumnName(i);
+ if(name.equals(pd[i].getName())){
+ nameToIndex[i] = j;
+ continue LOOP;
+ }
+ }
+ throw new SQLException(" index not found for " +
pd[i].getName() );
+ }
+ do{
+
+ Object obj;
+ try{
+
+ obj = cls.newInstance();
+
+ }catch(Exception e){
+ throw new DbException( "can not create " +
cls.getName() , e);
+ }
+
+ for(int i = 1; i < cnt; i++){
+ Object value = rs.getObject(i);
+ int index = nameToIndex[i];
+ if( rs.wasNull() &&
pd[index].getPropertyType().isPrimitive() ){
+ value = DEFAULTS.get( pd[index].getPropertyType() );
+ }
+ try{
+
+ pd[i].getWriteMethod().invoke(obj, new Object[]{
value });
+
+
+ }catch(Exception e){
+ throw new DbException( "can not set " +
pd[index].getName() , e);
+ }
+ }
+ results.add(obj);
+ }while(rs.next());
+ }
+
+ }catch(java.beans.IntrospectionException ie){
+ throw new DbException(ie);
+ }
+
+
+ return results;
+ }
+
+
+ /**
* Create an Object array from a ResultSet.
* It is assumed that next() has already been called on the ResultSet.
*/
@@ -428,7 +495,7 @@
}
rs.close();
}
-
+
/**
* Close a connection, avoid closing if null and hide
* any exceptions that occur.
@@ -464,9 +531,9 @@
// quiet
}
}
-
+
/**
- * Close a connection, statement and resultset, avoiding
+ * Close a connection, statement and resultset, avoiding
* closing if null and hiding any exceptions that occur.
*/
public static void closeQuietly(Connection conn, Statement stmt, ResultSet rs) {
1.2 +1 -1
jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/MapHandler.java
Index: MapHandler.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/MapHandler.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- MapHandler.java 16 Mar 2003 13:28:53 -0000 1.1
+++ MapHandler.java 16 Mar 2003 16:23:47 -0000 1.2
@@ -8,7 +8,7 @@
*/
public class MapHandler implements ResultSetHandler {
- /** Creates a new instance of VectorHandler */
+ /** Creates a new instance of MapHandler */
public MapHandler() {
}
1.12 +220 -184
jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/ProcedureUtils.java
Index: ProcedureUtils.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/ProcedureUtils.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- ProcedureUtils.java 16 Mar 2003 13:28:53 -0000 1.11
+++ ProcedureUtils.java 16 Mar 2003 16:23:47 -0000 1.12
@@ -179,8 +179,8 @@
ProcedureDescriptor descriptor = new ProcedureDescriptor();
Object textArgs[] = new Object[proc.getParameterTypes().length];
Arrays.fill(textArgs,"");
- descriptor.dynamic = !sb.toString().equals(
- MessageFormat.format(sb.toString(),textArgs) );
+ descriptor.dynamic = !sb.toString().equals(
+ MessageFormat.format(sb.toString(),textArgs) );
if(indexes.size() > 0){
@@ -204,27 +204,27 @@
return descriptor;
}
-
+
private static boolean isCollection(Class cls){
-
- return cls.isAssignableFrom(Collection.class);
- }
-
+
+ return cls.isAssignableFrom(Collection.class);
+ }
+
private static boolean isMap(Class cls){
-
- return cls.isAssignableFrom(Map.class);
- }
-
- private static boolean isVector(Class cls){
-
- return cls.isArray() && ! cls.getComponentType().isPrimitive();
- }
+
+ return cls.isAssignableFrom(Map.class);
+ }
- private static boolean isScalar(Class cls){
+ private static boolean isVector(Class cls){
+
+ return cls.isArray() && ! cls.getComponentType().isPrimitive();
+ }
+ private static boolean isScalar(Class cls){
+
return cls.isPrimitive() || Number.class.isAssignableFrom(cls) ||
- Character.class == cls || String.class == cls ||
- Boolean.class == cls || java.util.Date.class.isAssignableFrom(cls);
+ Character.class == cls || String.class == cls ||
+ Boolean.class == cls || java.util.Date.class.isAssignableFrom(cls);
}
@@ -232,30 +232,68 @@
Method methods[] = cls.getDeclaredMethods();
LOOP:
- for(int i=0; i< methods.length; i++ ){
-
- if(methods[i].getName().equals(jmethod.getName()) ){
-
- JavaParameter jparams[] = jmethod.getParameters();
- Class params[] = methods[i].getParameterTypes();
+ for(int i=0; i< methods.length; i++ ){
- if( params.length == jparams.length ){
+ if(methods[i].getName().equals(jmethod.getName()) ){
- for( int j = 0; j < params.length; j++ ){
+ JavaParameter jparams[] = jmethod.getParameters();
+ Class params[] = methods[i].getParameterTypes();
+
+ if( params.length == jparams.length ){
-
if(!params[j].getName().equals(jparams[j].getType().getValue()) ){
- continue LOOP;
+ for( int j = 0; j < params.length; j++ ){
+
+
if(!params[j].getName().equals(jparams[j].getType().getValue()) ){
+ continue LOOP;
+ }
+
}
+ return methods[i];
}
- return methods[i];
}
+ }
+
+ throw new IllegalStateException("metadata not found for " + jmethod);
+ }
+
+ static Class resolve(ClassLoader loader,String imports[], String name){
+
+ String names[] = {
+ name,
+ "org.apache.commons.dbutils." + name
+ };
+
+
+ for(int i = 0; i < names.length; i++){
+
+ try{
+
+ return loader.loadClass(names[i]);
+
+ }catch(ClassNotFoundException cnfe){
+
+ }
+
+ }
+ for(int i = 0; i < imports.length; i++){
+
+ try{
+ if(imports[i].endsWith( name )){
+ return loader.loadClass(imports[i]);
+ }else if(imports[i].endsWith("*")){
+
+ return loader.loadClass(
+ imports[i].substring(0,imports[i].length() - 1 ) + name);
+ }
+
+ }catch(ClassNotFoundException cnfe){
}
}
- throw new IllegalStateException("metadata not found for " + jmethod);
+ return null;
}
static ResultSetHandler findHandler(Method method, JavaMethod jmethod){
@@ -264,6 +302,18 @@
ResultSetHandler handler = null;
String name = null;
+
+ String imports[] = jmethod.getParentClass().
+ getParentSource().getImports();
+
+ Set set = new java.util.HashSet();
+ set.addAll( Arrays.asList(imports) );
+ set.add(jmethod.getParentClass().getPackage() + ".*");
+
+ imports = (String[])set.toArray(new String[]{});
+
+ ClassLoader loader = method.getDeclaringClass().getClassLoader();
+
DocletTag tag = jmethod.getTagByName(HANDLER_TAG);
@@ -273,6 +323,24 @@
name = (name == null || name.trim().length() == 0 ? null : name.trim()
);
}
+ if( "bean".equals( name ) ){
+
+ return new BeanHandler(method.getReturnType());
+ }
+
+ if( name != null && name.startsWith("beans") &&
isCollection(method.getReturnType()) ){
+ java.util.StringTokenizer st = new java.util.StringTokenizer(name,"()
\t");
+ st.nextToken();
+ if(st.hasMoreElements()){
+ Class cls = resolve(loader,imports,st.nextToken());
+ if(cls != null){
+ return new BeanCollectionHandler(cls);
+ }
+ }
+ }
+
+
+
handler = (ResultSetHandler)PREDEFINED_HANDLERS.get(name);
if(name != null && handler != null ){
@@ -300,57 +368,20 @@
return MAP_HANDLER;
}
-
-
-
- if(name != null){
- String imports[] = jmethod.getParentClass().
- getParentSource().getImports();
- String names[] = {
- name,
- jmethod.getParentClass().getPackage() + "." + name,
- "org.apache.commons.dbutils." + name
- };
-
-
- ClassLoader loader = method.getDeclaringClass().getClassLoader();
-
- try{
-
- for(int i = 0; i < names.length; i++){
-
- try{
-
- return
(ResultSetHandler)loader.loadClass(names[i]).newInstance();
-
- }catch(ClassNotFoundException cnfe){
-
- }
-
- }
- for(int i = 0; i < imports.length; i++){
-
- try{
- if(imports[i].endsWith( name )){
- return
(ResultSetHandler)loader.loadClass(imports[i]).newInstance();
- }else if(imports[i].endsWith("*")){
-
- return (ResultSetHandler)loader.loadClass(
- imports[i].substring(0,imports[i].length() - 1 ) +
name).newInstance();
- }
-
- }catch(ClassNotFoundException cnfe){
-
- }
+ try{
+ if(name != null){
+ Class cls = resolve(loader,imports,name);
+ if(cls != null){
+ return (ResultSetHandler)cls.newInstance();
}
-
- }catch(Exception e){
- throw new IllegalStateException( e.getMessage() + ":" + name +
- " not found for " + method );
}
+ }catch(Exception e){
+ throw new IllegalStateException( e.getMessage() + ":" + name +
+ " not found for " + method );
}
+
throw new IllegalStateException( "Handler not found for " + method );
}
@@ -387,69 +418,69 @@
}
desctiptors.put( method,
- compile( method, sql, handler, update,
+ compile( method, sql, handler, update,
jmethods[i].getTagByName(CACHE_TAG) != null,
jmethods[i].getTagByName(FLUSH_TAG) != null
- )
+ )
);
}
return desctiptors;
}
-
+
static Object convert( Class to, Object from, Method forErrorReport ){
if( from == null ){
- if(to.isPrimitive()){
- throw new IllegalStateException("can not convert null to primitive as
return value in " +
- forErrorReport
- );
- }else{
- return null;
- }
-
+ if(to.isPrimitive()){
+ throw new IllegalStateException("can not convert null to primitive
as return value in " +
+ forErrorReport
+ );
+ }else{
+ return null;
+ }
+
}
if( to.isAssignableFrom(from.getClass()) ){
- return from;
-
+ return from;
+
}else{
-
- if(to.isPrimitive() &&
- ( ( from instanceof Number ) ||
- from.getClass() == Boolean.class ||
- from.getClass() == Character.class ) ){
+ if(to.isPrimitive() &&
+ ( ( from instanceof Number ) ||
+ from.getClass() == Boolean.class ||
+ from.getClass() == Character.class ) ){
+
return from;
}
- throw new IllegalStateException("can not convert " +
from.getClass().getName()
- + " to " + to.getName() + " as return value in " +
- forErrorReport
+ throw new IllegalStateException("can not convert " +
from.getClass().getName()
+ + " to " + to.getName() + " as return value in " +
+ forErrorReport
);
-
+
}
-
+
}
public static void flush(Object procedures){
-
+
Invocation inv = (Invocation)Proxy.getInvocationHandler(procedures);
inv.CACHE.clear();
}
public static Connection getConnection(Object procedures){
-
+
Invocation inv = (Invocation)Proxy.getInvocationHandler(procedures);
return inv.connection;
}
public static void connect(Object procedures, Connection connection){
-
+
Invocation inv = (Invocation)Proxy.getInvocationHandler(procedures);
inv.connection = connection;
}
@@ -473,50 +504,50 @@
}
static class CacheKey{
- Method method;
- Object[] args;
- int hash ;
-
- CacheKey( Method method, Object[] args ){
- this.method = method;
- this.args = args;
- hash = method.hashCode();
- for(int i=0; i< args.length; i++){
- hash += 3*(args[i] == null ? 0 : args[i].hashCode());
- }
-
- }
-
- public int hashCode(){
- return hash;
- }
- public boolean equals( Object obj ){
- if(obj != null && ( obj instanceof CacheKey)){
-
- CacheKey key = (CacheKey)obj;
- if(key.method == method || key.method.equals(method)){
-
- for( int i = 0; i < args.length; i++ ){
- if( args[i] == key.args[i] ){
- continue;
- }
- if( args[i] == null || key.args[i] == null ||
- !args[i].equals(key.args[i]) ){
- return false;
- }
- }
- return true;
-
+ Method method;
+ Object[] args;
+ int hash ;
+
+ CacheKey( Method method, Object[] args ){
+ this.method = method;
+ this.args = args;
+ hash = method.hashCode();
+ for(int i=0; i< args.length; i++){
+ hash += 3*(args[i] == null ? 0 : args[i].hashCode());
+ }
+
+ }
+
+ public int hashCode(){
+ return hash;
+ }
+ public boolean equals( Object obj ){
+ if(obj != null && ( obj instanceof CacheKey)){
+
+ CacheKey key = (CacheKey)obj;
+ if(key.method == method || key.method.equals(method)){
+
+ for( int i = 0; i < args.length; i++ ){
+ if( args[i] == key.args[i] ){
+ continue;
+ }
+ if( args[i] == null || key.args[i] == null ||
+ !args[i].equals(key.args[i]) ){
+ return false;
+ }
+ }
+ return true;
+
+ }else{
+ return false;
+ }
+
}else{
return false;
}
-
- }else{
- return false;
}
- }
-
-
+
+
}
static class Invocation implements InvocationHandler{
@@ -535,8 +566,13 @@
int len = descriptor.indexMap.length;
Object pargs[] = new Object[ len ];
for(int i = 0; i < len; i++ ){
- pargs[i] = args[ descriptor.indexMap[i] ];
+ try{
+ pargs[i] = args[ descriptor.indexMap[i] ];
+ }catch(ArrayIndexOutOfBoundsException ae){
+ throw new DbException( "parameter " + i +" out of range (" +
descriptor.indexMap[i] + ")" ,ae);
+ }
}
+
return pargs;
}
@@ -568,29 +604,29 @@
CacheKey key = null;
Object value = null;
if(descriptor.cached){
- key = new CacheKey(method,args);
- value = CACHE.get(key);
- if( value != null ){
- return value;
- }
- }
+ key = new CacheKey(method,args);
+ value = CACHE.get(key);
+ if( value != null ){
+ return value;
+ }
+ }
value = convert( method.getReturnType(), DbUtils.executeQuery(
connection,
descriptor.dynamic ?
MessageFormat.format(descriptor.jdbcSQL,args) : descriptor.jdbcSQL,
prepareArgs(descriptor,args),
descriptor.handler,
null,args
),method);
- if(descriptor.cached && value != null){
- CACHE.put(key,value);
- }
- return value;
+ if(descriptor.cached && value != null){
+ CACHE.put(key,value);
+ }
+ return value;
}else{
int updateCount = DbUtils.executeUpdate( connection,
descriptor.dynamic ?
MessageFormat.format(descriptor.jdbcSQL,args) : descriptor.jdbcSQL,
prepareArgs(descriptor,args)
);
if(descriptor.flushOnExecute && updateCount > 0 ){
- CACHE.clear();
+ CACHE.clear();
}
if(method.getReturnType() == Void.TYPE ){
return null;
@@ -636,97 +672,97 @@
private ReferenceQueue m_queue = new ReferenceQueue();
SoftRefMemoryCache(){
- this(256);
+ this(256);
}
-
+
/**
* Creates new SoftRefMemoryCache
*
[EMAIL PROTECTED] map
[EMAIL PROTECTED] maxStrongRefCount
*/
- SoftRefMemoryCache( int maxStrongRefCount) {
-
+ SoftRefMemoryCache( int maxStrongRefCount) {
+
if (maxStrongRefCount < 0) {
throw new java.lang.IllegalArgumentException();
}
this.m_maxStrongRefCount = maxStrongRefCount;
-
+
if (maxStrongRefCount > 0) {
m_strongRefs = new Object[maxStrongRefCount];
}
}
-
-
+
+
/**
* Get the object associated to the given unique key.
*
[EMAIL PROTECTED] key the Key Object
[EMAIL PROTECTED] requested object or null
*/
- Object get(Object key) {
+ Object get(Object key) {
removeSoftRef();
Object object = null;
SoftRef ref = (SoftRef) m_map.get(key);
-
+
if (ref != null) {
object = ref.get();
}
-
+
addStrongRef(object);
return object;
}
-
+
/**
* Cache the object associated to the given unique key.
*
[EMAIL PROTECTED] key the key object
[EMAIL PROTECTED] object
*/
- void put(Object key, Object object) {
+ void put(Object key, Object object) {
removeSoftRef();
internalStoreObject(key, object);
}
-
+
void clear(){
- removeSoftRef();
- if(m_map.size() > 0){
- m_map.clear();
- if(m_strongRefs != null){
- Arrays.fill(m_strongRefs, null);
- }
- }
- }
+ removeSoftRef();
+ if(m_map.size() > 0){
+ m_map.clear();
+ if(m_strongRefs != null){
+ Arrays.fill(m_strongRefs, null);
+ }
+ }
+ }
private SoftRef makeValue(Object key, Object value, ReferenceQueue queue) {
return new SoftRef(key, value, queue);
}
-
+
// remove unused keys
private void removeSoftRef() {
SoftRef ref = (SoftRef) m_queue.poll();
-
+
while (ref != null) {
m_map.remove(ref.key);
ref = (SoftRef) m_queue.poll();
}
}
-
+
private void addStrongRef(Object object) {
if (m_strongRefs != null) {
m_strongRefs[(m_current++) % m_maxStrongRefCount] = object;
}
}
-
+
private void internalStoreObject(Object key, Object object) {
SoftRef ref = makeValue(key, object, m_queue);
addStrongRef(ref.get());
m_map.put(key, ref);
}
-
- final static class SoftRef extends SoftReference {
- private Object key;
-
+
+ final static class SoftRef extends SoftReference {
+ private Object key;
+
private SoftRef(Object key, Object object, ReferenceQueue queue) {
super(object, queue);
this.key = key;
1.1
jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/BeanCollectionHandler.java
Index: BeanCollectionHandler.java
===================================================================
package org.apache.commons.dbutils;
/**
*
* @author baliuka
*/
public class BeanCollectionHandler implements ResultSetHandler{
private Class type;
/** Creates a new instance of BeanCollectionHandler */
public BeanCollectionHandler(Class type) {
this.type = type;
}
public Object handle(java.sql.ResultSet rs, Object[] params, Object userObject)
throws java.sql.SQLException {
return DbUtils.resultSetToBeanCollection(rs,type);
}
}
1.1
jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/BeanHandler.java
Index: BeanHandler.java
===================================================================
package org.apache.commons.dbutils;
import java.util.*;
/**
*
* @author baliuka
*/
public class BeanHandler implements ResultSetHandler{
private Class type;
/** Creates a new instance of BeanHandler */
public BeanHandler(Class type) {
this.type = type;
}
public Object handle(java.sql.ResultSet rs, Object[] params, Object userObject)
throws java.sql.SQLException {
Object bean;
if(rs.next()){
try{
bean = type.newInstance();
}catch(Exception e){
throw new DbException(e);
}
DbUtils.resultSetToBean(rs, bean);
if(rs.next()){
throw new java.sql.SQLException();
}
return bean;
}
throw new java.sql.SQLException();
}
}
1.10 +13 -4
jakarta-commons-sandbox/dbutils/src/test/org/apache/commons/dbutils/Demo.java
Index: Demo.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/dbutils/src/test/org/apache/commons/dbutils/Demo.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Demo.java 16 Mar 2003 13:28:53 -0000 1.9
+++ Demo.java 16 Mar 2003 16:23:48 -0000 1.10
@@ -57,19 +57,28 @@
*/
public Map getRowAsMap( int id );
-
/**
[EMAIL PROTECTED] SELECT id, name FROM TBL WHERE ID=$1
[EMAIL PROTECTED] DemoBeanHandler
*/
public DemoBean getRowAsBean( DemoBean bean, int id );
+
+ /**
+ [EMAIL PROTECTED] SELECT id, name FROM TBL WHERE ID=$0
+ [EMAIL PROTECTED] bean
+ */
+ public DemoBean getRowAsBean( int id );
+
+ /**
+ [EMAIL PROTECTED] SELECT id, name FROM TBL
+ [EMAIL PROTECTED] beans(DemoBean)
+ */
+ public java.util.Collection getBeans();
/**
[EMAIL PROTECTED] SELECT * FROM {0}
*/
- public java.util.Collection getAll( String tbl );
-
-
+ public java.util.Collection getAll( String tbl );
/**
1.9 +13 -0
jakarta-commons-sandbox/dbutils/src/test/org/apache/commons/dbutils/ProcedureUtilsTest.java
Index: ProcedureUtilsTest.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/dbutils/src/test/org/apache/commons/dbutils/ProcedureUtilsTest.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ProcedureUtilsTest.java 16 Mar 2003 13:28:53 -0000 1.8
+++ ProcedureUtilsTest.java 16 Mar 2003 16:23:48 -0000 1.9
@@ -111,13 +111,16 @@
assertTrue( !demo.exists(1) );
assertTrue( demo.add(1,"test") == 1 );
assertTrue( demo.exists(1) );
+
for( int i = 0; i< 10;i++){
demo.add(i + 2,"test" + i);
}
+
demo.print(System.out);
System.out.println("DYNAMIC SQL:");
demo.dynamicPrint(System.out,"TBL","ID",8);
Integer max = demo.maxId("TBL");
+
assertTrue( max != null );
assertTrue("cached query", max == demo.maxId("TBL") );
assertTrue( demo.now() != null );
@@ -125,10 +128,20 @@
assertTrue(demo.getRow(max.intValue()).length == 2 );
assertTrue(demo.getRowAsMap(max.intValue()).size() == 2 );
assertTrue(demo.getAll("TBL").size() > 2 );
+
DemoBean bean = new DemoBean();
demo.getRowAsBean(bean, max.intValue());
assertTrue( bean.getId() == max.intValue() );
assertTrue( bean.getName() != null );
+
+
+ bean = demo.getRowAsBean( max.intValue());
+ assertTrue( bean.getId() == max.intValue() );
+ assertTrue( bean.getName() != null );
+
+ Collection col = demo.getBeans();
+
+ assertTrue( col.size() == max.intValue() );
demo.clear();
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]