From e1d81e04bc4abb9541666cd42516656e097ae94d Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 9 Jun 2011 23:09:55 +0000 Subject: [PATCH] prepared Spring's DataSource and RowSet adapters for forward compatibility with JDBC 4.1 --- .../jndi/SimpleNamingContextTests.java | 12 ++++--- .../core/SqlRowSetResultSetExtractor.java | 33 +++++++++++++++++-- .../jdbc/datasource/AbstractDataSource.java | 12 ++++++- .../jdbc/datasource/DelegatingDataSource.java | 12 ++++++- .../embedded/EmbeddedDatabaseFactory.java | 7 +++- 5 files changed, 66 insertions(+), 10 deletions(-) diff --git a/org.springframework.context/src/test/java/org/springframework/jndi/SimpleNamingContextTests.java b/org.springframework.context/src/test/java/org/springframework/jndi/SimpleNamingContextTests.java index 2ba662aedc5..bc635f183da 100644 --- a/org.springframework.context/src/test/java/org/springframework/jndi/SimpleNamingContextTests.java +++ b/org.springframework.context/src/test/java/org/springframework/jndi/SimpleNamingContextTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,15 +16,13 @@ package org.springframework.jndi; -import static org.junit.Assert.*; - import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; - +import java.util.logging.Logger; import javax.naming.Binding; import javax.naming.Context; import javax.naming.InitialContext; @@ -36,9 +34,12 @@ import javax.naming.spi.InitialContextFactory; import javax.sql.DataSource; import org.junit.Test; + import org.springframework.mock.jndi.SimpleNamingContext; import org.springframework.mock.jndi.SimpleNamingContextBuilder; +import static org.junit.Assert.*; + /** * @author Juergen Hoeller @@ -250,4 +251,7 @@ class StubDataSource implements DataSource { return null; } + public Logger getParentLogger() { + return null; + } } diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/SqlRowSetResultSetExtractor.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/SqlRowSetResultSetExtractor.java index 6d94175b1ad..ba62017d274 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/SqlRowSetResultSetExtractor.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/SqlRowSetResultSetExtractor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package org.springframework.jdbc.core; +import java.lang.reflect.Method; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.rowset.CachedRowSet; @@ -24,6 +25,7 @@ import com.sun.rowset.CachedRowSetImpl; import org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSet; import org.springframework.jdbc.support.rowset.SqlRowSet; +import org.springframework.util.ReflectionUtils; /** * ResultSetExtractor implementation that returns a Spring SqlRowSet @@ -31,7 +33,8 @@ import org.springframework.jdbc.support.rowset.SqlRowSet; * *

The default implementation uses a standard JDBC CachedRowSet underneath. * This means that JDBC RowSet support needs to be available at runtime: - * by default, Sun's com.sun.rowset.CachedRowSetImpl class. + * by default, Sun's com.sun.rowset.CachedRowSetImpl class on Java 5 and 6, + * or the javax.sql.rowset.RowSetProvider mechanism on Java 7 / JDBC 4.1. * * @author Juergen Hoeller * @since 1.2 @@ -42,6 +45,24 @@ import org.springframework.jdbc.support.rowset.SqlRowSet; */ public class SqlRowSetResultSetExtractor implements ResultSetExtractor { + private static Object rowSetFactory = null; + + private static Method createCachedRowSet = null; + + static { + ClassLoader cl = SqlRowSetResultSetExtractor.class.getClassLoader(); + try { + Class rowSetProviderClass = cl.loadClass("javax.sql.rowset.RowSetProvider"); + Method newFactory = rowSetProviderClass.getMethod("newFactory"); + rowSetFactory = ReflectionUtils.invokeMethod(newFactory, null); + createCachedRowSet = rowSetFactory.getClass().getMethod("createCachedRowSet"); + } + catch (Exception ex) { + // JDBC 4.1 API not available - fall back to Sun CachedRowSetImpl + } + } + + public SqlRowSet extractData(ResultSet rs) throws SQLException { return createSqlRowSet(rs); } @@ -75,7 +96,13 @@ public class SqlRowSetResultSetExtractor implements ResultSetExtractor