package org.glassfish.jdbc.devtests.v3.test; import java.io.PrintWriter; import java.sql.Connection; import java.sql.Statement; import java.util.HashMap; import java.util.Map; import javax.sql.DataSource; import org.glassfish.jdbc.devtests.v3.util.HtmlUtil; import org.glassfish.jdbc.devtests.v3.util.TablesUtil; /** * * @author jagadish */ public class MultipleConnectionCloseTest implements SimpleTest { Map<String, Boolean> resultsMap = new HashMap<String, Boolean>(); public Map<String, Boolean> runTest(DataSource ds1, PrintWriter out) { try { if (multipleCloseConnection_1(ds1, out)) { resultsMap.put("multiple-close-connection-1", true); }else{ resultsMap.put("multiple-close-connection-1", false); } } catch (Exception e) { resultsMap.put("multiple-close-connection-1", false); } try { if (multipleCloseConnection_2(ds1, out)) { resultsMap.put("multiple-close-connection-2", true); }else{ resultsMap.put("multiple-close-connection-2", false); } } catch (Exception e) { resultsMap.put("multiple-close-connection-2", false); } HtmlUtil.printHR(out); return resultsMap; } private boolean multipleCloseConnection_1(DataSource ds1, PrintWriter out) { Connection conn1 = null; boolean passed = true; //clean the database out.println("<h4> Multiple close connection - Test1 </h4>"); try { conn1 = ds1.getConnection(); } catch (Exception e) { HtmlUtil.printException(e, out); passed = false; } finally { try { if (conn1 != null) { conn1.close(); conn1.close(); } } catch (Exception e) { HtmlUtil.printException(e, out); passed = false; } } out.println("<br> Test result : " + passed); return passed; } private boolean multipleCloseConnection_2(DataSource ds1, PrintWriter out) { Connection conn1 = null; Statement stmt = null; boolean passed = true; String tableName = "multiple_close_connection_table"; String columnName = "name"; TablesUtil.createTables(ds1, out, tableName, columnName); out.println("<h4> Multiple close connection - Test2 </h4>"); try { conn1 = ds1.getConnection(); stmt = conn1.createStatement(); stmt.executeQuery("SELECT * FROM multiple_close_connection_table"); } catch (Exception e) { e.printStackTrace(); passed = false; } finally { if (stmt != null) { try { stmt.close(); } catch (Exception e) { e.printStackTrace(); passed = false; } } try { if (conn1 != null) { conn1.close(); conn1.createStatement(); // trying to create statement on a closed connection, must throw exception. } } catch (Exception e) { try { conn1.close(); } catch (Exception e1) { e.printStackTrace(); //closing a connection multiple times is a no-op. //If exception is thrown, its a failure. passed = false; } } TablesUtil.deleteTables(ds1, out, tableName); } out.println("<br> Test result : " + passed); return passed; } }