Skip to content
This repository was archived by the owner on Nov 15, 2022. It is now read-only.

Commit 7165b9d

Browse files
h2002044yaminikb
authored andcommitted
Fixes 21536: NPE in SQL Trace implementation (#21984)
1 parent 5cec308 commit 7165b9d

File tree

5 files changed

+107
-35
lines changed

5 files changed

+107
-35
lines changed

appserver/jdbc/jdbc-ra/jdbc-core/src/main/java/com/sun/gjc/util/SQLTraceDelegator.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@
4444
import com.sun.gjc.monitoring.SQLTraceProbeProvider;
4545
import java.util.ArrayList;
4646
import java.util.List;
47+
import java.util.logging.Level;
48+
import java.util.logging.Logger;
49+
50+
import com.sun.logging.LogDomains;
4751
import org.glassfish.api.jdbc.SQLTraceListener;
4852
import org.glassfish.api.jdbc.SQLTraceRecord;
4953

@@ -56,7 +60,14 @@
5660
*/
5761
//@Singleton
5862
public class SQLTraceDelegator implements SQLTraceListener {
59-
63+
64+
private static Logger _logger;
65+
66+
static {
67+
_logger = LogDomains
68+
.getLogger(MethodExecutor.class, LogDomains.RSR_LOGGER);
69+
}
70+
6071
//List of listeners
6172
protected List<SQLTraceListener> sqlTraceListenersList;
6273
private String poolName;
@@ -91,7 +102,15 @@ public void registerSQLTraceListener(SQLTraceListener listener) {
91102
public void sqlTrace(SQLTraceRecord record) {
92103
if (sqlTraceListenersList != null) {
93104
for (SQLTraceListener listener : sqlTraceListenersList) {
94-
listener.sqlTrace(record);
105+
try {
106+
listener.sqlTrace(record);
107+
}catch(Exception e){
108+
//it is possible that any of the implementations may fail processing a trace record.
109+
//do not propagate such failures. Log them as FINEST.
110+
if(_logger.isLoggable(Level.FINEST)){
111+
_logger.log(Level.FINEST, "exception from one of the SQL trace listeners ["+listener.getClass().getName()+"]", e);
112+
}
113+
}
95114
}
96115
}
97116

appserver/tests/appserv-tests/devtests/jdbc/tracingsql/ejb/SimpleBMPBean.java

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ public boolean statementTest() {
8585
result = true;
8686
}
8787

88+
System.out.println("Inserting null entry into null_entry_table");
89+
stmt.executeUpdate("INSERT INTO null_entry_table VALUES(null)");
90+
91+
92+
8893
}catch(SQLException sqe){}finally{
8994
try{
9095
if(stmt != null){
@@ -100,34 +105,58 @@ public boolean statementTest() {
100105
}
101106
return result;
102107
}
103-
public boolean preparedStatementTest(){
108+
109+
public boolean preparedStatementTest() {
104110
boolean result = false;
105111
Connection conFromDS = null;
106112
Connection conFromStatement = null;
107113
PreparedStatement stmt = null;
108-
try{
114+
PreparedStatement stmt2 = null;
115+
try {
109116
conFromDS = ds.getConnection();
110-
stmt = conFromDS.prepareStatement("select * from customer_stmt_wrapper");
117+
stmt = conFromDS.prepareStatement(
118+
"select * from customer_stmt_wrapper");
111119
conFromStatement = stmt.getConnection();
112120

113-
System.out.println("Prepared statement Test : conFromDS : " + conFromDS);
114-
System.out.println("Prepared statement Test : conFromStatement : " + conFromStatement);
115-
if( conFromDS==conFromStatement || conFromDS.equals(conFromStatement) ){
121+
System.out
122+
.println("Prepared statement Test : conFromDS : " + conFromDS);
123+
System.out.println("Prepared statement Test : conFromStatement : " +
124+
conFromStatement);
125+
if (conFromDS == conFromStatement ||
126+
conFromDS.equals(conFromStatement)) {
116127
result = true;
117128
}
118129

119-
}catch(SQLException sqe){}finally{
120-
try{
121-
if(stmt != null){
130+
// Test to ensure that inserting null values does not result in tracing implementations to fail.
131+
System.out.println("Inserting null entry into null_entry_table");
132+
133+
stmt2 = conFromDS
134+
.prepareStatement("INSERT INTO null_entry_table VALUES(?)");
135+
stmt2.setString(1, null);
136+
stmt2.executeUpdate();
137+
138+
} catch (SQLException sqe) {
139+
} finally {
140+
try {
141+
if (stmt != null) {
122142
stmt.close();
123143
}
124-
}catch(SQLException sqe){}
144+
} catch (SQLException sqe) {
145+
}
125146

126-
try{
127-
if(conFromDS != null){
147+
try {
148+
if (stmt2 != null) {
149+
stmt2.close();
150+
}
151+
} catch (SQLException sqe) {
152+
}
153+
154+
try {
155+
if (conFromDS != null) {
128156
conFromDS.close();
129157
}
130-
}catch(SQLException sqe){}
158+
} catch (SQLException sqe) {
159+
}
131160
}
132161
return result;
133162
}
@@ -243,6 +272,7 @@ public boolean compareRecords() {
243272
rs = stmt.executeQuery("select * from expected_sql_trace");
244273
rs1 = stmt1.executeQuery("select * from sql_trace");
245274

275+
System.out.println("@@@@ ------------------------------------------");
246276
for(int i=0; i<5; i++) {
247277

248278
String className ="";
@@ -268,6 +298,7 @@ public boolean compareRecords() {
268298
System.out.println("@@@@@ expectedMethod = " + expectedMethodName + "---");
269299
System.out.println("@@@@@ expectedArgs = " + expectedArgs + "---");
270300
}
301+
System.out.println("@@@@ ------------------------------------------");
271302

272303
if(className.equals(expectedClassName) && methodName.equals(expectedMethodName) && args.equals(expectedArgs)) {
273304
result = true;

appserver/tests/appserv-tests/devtests/jdbc/tracingsql/logger/com/sun/s1asdev/jdbc/tracingsql/logger/TraceLogger.java

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,13 @@
4242

4343
import org.glassfish.api.jdbc.SQLTraceListener;
4444
import org.glassfish.api.jdbc.SQLTraceRecord;
45-
import javax.sql.*;
46-
import java.sql.*;
47-
import javax.naming.*;
48-
import java.rmi.*;
49-
import java.util.*;
45+
46+
import javax.naming.InitialContext;
47+
import javax.naming.NamingException;
48+
import javax.sql.DataSource;
49+
import java.sql.Connection;
50+
import java.sql.PreparedStatement;
51+
import java.sql.SQLException;
5052

5153
public class TraceLogger implements SQLTraceListener {
5254

@@ -63,21 +65,27 @@ public TraceLogger() {
6365
*/
6466
public void sqlTrace(SQLTraceRecord record) {
6567

66-
try {
67-
//System.out.println("### ds=" + ds);
68+
try {
69+
//System.out.println("### ds=" + ds);
6870

69-
Object[] params = record.getParams();
70-
StringBuffer argsBuf = new StringBuffer();
71-
if(params != null && params.length > 0) {
72-
for(Object param : params) {
73-
argsBuf.append(param.toString() + ";");
74-
}
75-
}
76-
//System.out.println(">>>>> class=" + record.getClassName() + " method=" + record.getMethodName() + " args=" + argsBuf.toString());
77-
writeRecord(ds, record.getClassName(), record.getMethodName(), argsBuf.toString());
78-
} catch(Exception ex) {
79-
ex.printStackTrace();
80-
}
71+
Object[] params = record.getParams();
72+
StringBuffer argsBuf = new StringBuffer();
73+
if (params != null && params.length > 0) {
74+
for (Object param : params) {
75+
if (param != null) {
76+
argsBuf.append(param.toString() + ";");
77+
}
78+
}
79+
}
80+
System.out.println(
81+
"SQLTrace called: Details: class=" + record.getClassName() +
82+
" method=" + record.getMethodName() + " args=" +
83+
argsBuf.toString());
84+
writeRecord(ds, record.getClassName(), record.getMethodName(),
85+
argsBuf.toString());
86+
} catch (Exception ex) {
87+
ex.printStackTrace();
88+
}
8189
}
8290

8391
public void writeRecord(DataSource ds, String classname, String methodname, String args) {

appserver/tests/appserv-tests/devtests/jdbc/tracingsql/sql/create_pointbase.sql

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ CREATE TABLE sql_trace (
1717
args char(200)
1818
);
1919

20+
Drop table null_entry_table;
21+
22+
CREATE TABLE null_entry_table (
23+
field1 char(100)
24+
);
25+
26+
2027
Drop table expected_sql_trace;
2128

2229
CREATE TABLE expected_sql_trace (
@@ -30,4 +37,10 @@ INSERT INTO expected_sql_trace VALUES('org.apache.derby.client.net.NetConnection
3037

3138
INSERT INTO expected_sql_trace VALUES('com.sun.gjc.spi.jdbc40.PreparedStatementWrapper40', 'getConnection', '');
3239

40+
INSERT INTO expected_sql_trace VALUES('org.apache.derby.client.net.NetConnection40', 'prepareStatement', 'INSERT INTO null_entry_table VALUES(?);1003;1007;');
41+
42+
INSERT INTO expected_sql_trace VALUES('com.sun.gjc.spi.jdbc40.PreparedStatementWrapper40', 'setString', '1;');
43+
44+
INSERT INTO expected_sql_trace VALUES('com.sun.gjc.spi.jdbc40.PreparedStatementWrapper40', 'executeUpdate', '');
45+
3346
INSERT INTO expected_sql_trace VALUES('com.sun.gjc.spi.jdbc40.PreparedStatementWrapper40', 'close', '');
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
Drop table customer_stmt_wrapper;
1+
Drop table customer_stmt_wrapper;
2+
Drop table null_entry_table;

0 commit comments

Comments
 (0)