BaseBugReport.java
上传用户:sxlinghang
上传日期:2022-07-20
资源大小:1405k
文件大小:7k
源码类别:

数据库编程

开发平台:

Java

  1. /*
  2.    Copyright (C) 2003 MySQL AB
  3.    
  4.       This program is free software; you can redistribute it and/or modify
  5.       it under the terms of the GNU General Public License as published by
  6.       the Free Software Foundation; either version 2 of the License, or
  7.       (at your option) any later version.
  8.    
  9.       This program is distributed in the hope that it will be useful,
  10.       but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.       GNU General Public License for more details.
  13.    
  14.       You should have received a copy of the GNU General Public License
  15.       along with this program; if not, write to the Free Software
  16.       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.       
  18.  */
  19. package com.mysql.jdbc.util;
  20. import java.sql.Connection;
  21. import java.sql.SQLException;
  22. import java.util.Properties;
  23. import com.mysql.jdbc.Driver;
  24. /**
  25.  * Base class to help file bug reports for Connector/J.
  26.  * 
  27.  * <p>
  28.  * MySQL AB <ul>really</ul> appreciates repeatable testcases
  29.  * when reporting bugs, so we're giving you this class to make
  30.  * that job a bit easier (and standarized).
  31.  * 
  32.  * <p>
  33.  * To create a testcase, create a class that inherits from
  34.  * this class (com.mysql.jdbc.util.BaseBugReport), and override
  35.  * the methods 'setUp', 'tearDown' and 'runTest'. 
  36.  * 
  37.  * <p>
  38.  * In the 'setUp' method, create code that creates your tables,
  39.  * and populates them with any data needed to demonstrate the bug.
  40.  * 
  41.  * <p>
  42.  * In the 'runTest' method, create code that demonstrates the bug 
  43.  * using the tables and data you created in the 'setUp' method.
  44.  * 
  45.  * <p>
  46.  * In the 'tearDown' method, drop any tables you created in the
  47.  * 'setUp' method.
  48.  * 
  49.  * <p>
  50.  * In any of the above three methods, you should use one
  51.  * of the variants of the 'getConnection' method to create a 
  52.  * JDBC connection to MySQL, which will use the default JDBC
  53.  * URL of 'jdbc:mysql:///test'.  
  54.  * 
  55.  * <p>
  56.  * If you need to use a JDBC URL that is different than 
  57.  * 'jdbc:mysql:///test', then override the method 'getUrl' as well.
  58.  * 
  59.  * <p>
  60.  * Use the 'assertTrue' methods to create conditions that must be
  61.  * met in your testcase demonstrating the behavior you are expecting
  62.  * (vs. the behavior you are observing, which is why you are most
  63.  * likely filing a bug report).
  64.  * 
  65.  * <p>
  66.  * Finally, create a 'main' method that creates a new instance
  67.  * of your testcase, and calls the 'run' method:
  68.  * 
  69.  * <p><pre>
  70.  * public static void main(String[] args) throws Exception {
  71.  *      new MyBugReport().run();
  72.  * }
  73.  * </pre>
  74.  * 
  75.  * <p>
  76.  * When filing a potential bug with MySQL Connector/J at 
  77.  * http://bugs.mysql.com/ or on the bugs mailing list, please
  78.  * include the code that you have just written using this class.
  79.  * 
  80.  * @author Mark Matthews
  81.  * @version $Id: BaseBugReport.java,v 1.1.2.1 2003/09/17 18:01:22 mmatthew Exp $
  82.  */
  83. public abstract class BaseBugReport {
  84. private Connection conn;
  85. private Driver driver;
  86. /**
  87.  * Constructor for this BugReport, sets up
  88.  * JDBC driver used to create connections.
  89.  */
  90. protected BaseBugReport() {
  91. try {
  92. this.driver = new Driver();
  93. } catch (SQLException ex) {
  94. throw new RuntimeException(ex.toString());
  95. }
  96. }
  97. /**
  98.  * Override this method with code that sets up the 
  99.  * testcase for demonstrating your bug (creating tables,
  100.  * populating data, etc).
  101.  * 
  102.  * @throws Exception if an error occurs during the
  103.  * 'setUp' phase.
  104.  */
  105. public abstract void setUp() throws Exception;
  106. /**
  107.  * Override this method with code that cleans up 
  108.  * anything created in the setUp() method.
  109.  * 
  110.  * @throws Exception if an error occurs during the
  111.  * 'tearDown' phase.
  112.  */
  113. public abstract void tearDown() throws Exception;
  114. /**
  115.  * Override this method with code that demonstrates the bug. 
  116.  * This method will be called after setUp(), and before 
  117.  * tearDown().
  118.  * 
  119.  * @throws Exception if an error occurs during your test
  120.  * run.
  121.  */
  122. public abstract void runTest() throws Exception;
  123. /**
  124.  * Runs the testcase by calling the setUp(), runTest()
  125.  * and tearDown() methods. The tearDown() method is run
  126.  * regardless of any errors occuring in the other methods.
  127.  * 
  128.  * @throws Exception if an error occurs in any of the
  129.  * aforementioned methods.
  130.  */
  131. public final void run() throws Exception {
  132. try {
  133. setUp();
  134. runTest();
  135. } finally {
  136. tearDown();
  137. }
  138. }
  139. /**
  140.  * Throws an exception with the given message if condition
  141.  * evalutates to 'false'.
  142.  * 
  143.  * @param message the message to use in the exception
  144.  * @param condition the condition to test for
  145.  * @throws Exception if !condition
  146.  */
  147. protected final void assertTrue(String message, boolean condition) throws Exception {
  148. if (!condition) {
  149. throw new Exception("Assertion failed: " + message);
  150. }
  151. }
  152. /**
  153.  * Throws an exception if condition
  154.  * evalutates to 'false'.
  155.      *
  156.  * @param condition the condition to test for
  157.  * @throws Exception if !condition
  158.  */
  159. protected final void assertTrue(boolean condition) throws Exception {
  160. assertTrue("(no message given)", condition);
  161. }
  162. /**
  163.  * Provides the JDBC URL to use to demonstrate the bug. The
  164.  * java.sql.Connection that you use to demonstrate this bug 
  165.  * will be provided by the getConnection() method using this URL.
  166.  * 
  167.  * The default value is 'jdbc:mysql:///test'
  168.  */
  169. public String getUrl() {
  170. return "jdbc:mysql:///test";
  171. }
  172. /**
  173.  * Provides a connection to the JDBC URL specified in getUrl().
  174.  * 
  175.  * If a connection already exists, that connection is returned.
  176.  * Otherwise a new connection is created.
  177.  * 
  178.  * @return a connection to the JDBC URL specified in getUrl().
  179.  * 
  180.  * @throws SQLException if an error is caused while creating the
  181.  * connection.
  182.  */
  183. public final synchronized Connection getConnection() throws SQLException {
  184. if (this.conn == null || this.conn.isClosed()) {
  185. this.conn = getNewConnection();
  186. }
  187. return this.conn;
  188. }
  189. /**
  190.  * Use this if you need to get a new connection for your 
  191.  * bug report (i.e. there's more than one connection involved).
  192.  * 
  193.  * @return a new connection to the JDBC URL specified in getUrl().
  194.  * 
  195.  * @throws SQLException if an error is caused while creating the
  196.  * connection.
  197.  */
  198. public final synchronized Connection getNewConnection() throws SQLException {
  199. return getConnection(getUrl());
  200. }
  201. /**
  202.  * Returns  a connection using the given URL.
  203.  * 
  204.  * @param url the JDBC URL to use
  205.  * @return a new java.sql.Connection to the JDBC URL.
  206.  * @throws SQLException if an error occurs getting the connection.
  207.  */
  208. public final synchronized Connection getConnection(String url) throws SQLException {
  209. return getConnection(url, null);
  210. }
  211. /**
  212.  * Returns  a connection using the given URL and properties.
  213.  * 
  214.  * @param url the JDBC URL to use
  215.  * @param props the JDBC properties to use
  216.  * @return a new java.sql.Connection to the JDBC URL.
  217.  * @throws SQLException if an error occurs getting the connection.
  218.  */
  219. public final synchronized Connection getConnection(String url, Properties props) throws SQLException {
  220. // Don't follow this example in your own code
  221. // This is to bypass the java.sql.DriverManager
  222. return this.driver.connect(url, props);
  223. }
  224. }