* Created by: Gyuri Lajos @ Easysoft
* 
* This is a demonstration JDBC applet connecting to a selected ODBC
* data source via the Easysoft JDBC-ODBC Bridge and displaying the
* result of a query.
*
* The method doTask() can be overwritten in subclasses to cary out
* other JDBC tasks given an open connection to the selected database.
*
*
* A APPLET tag shown below can be used to launch the applet
*
*  
* <APPLET CODE = "OutputApplet"
*         ARCHIVE = "../jars/EJOB.jar" 
*         WIDTH = "440"
*         HEIGHT = "300">
*     <PARAM NAME = "jdbcUrl" VALUE = "jdbc:easysoft:"></PARAM>
*     <PARAM NAME = "query" VALUE = "select * from coffees"></PARAM>
* </APPLET>
* 
*/

import java.applet.Applet;
import java.sql.*;

public class QueryApplet extends Applet implements Runnable {
    private Thread worker;
    private java.awt.TextArea textA=null;
    private java.awt.TextArea textR=null;
    private String message = "Initializing";

    /* 
     * JDBC url to use to connect to. This can be overridden in the 
     * applet parameter: jdbcUrl 
     */
    public  String url = "jdbc:easysoft:";

    /* 
     * query to run: JOB runs DatabaseMetaData.getTables() when query="tables" 
     * This can be overridden in the applet parameter: query 
     */
    public  String query = "tables";

    public synchronized void start() {
    // Every time "start" is called we create a worker thread to
    // re-evaluate the database query.
    if (worker == null) {   
        message = "Connecting to database";
        worker = new Thread(this);
        worker.start();
    
    }
    }

    public void  init () {
    // Get query parameter
    String queryParameter = "";
    try {
        queryParameter = getParameter("query");
    }
    catch (Exception e) 
        { // quietly ignore this if not running in browser
        }
    if (queryParameter!=null && !queryParameter.equals(""))
        query=queryParameter;

    // Getting the parameter for jdbcUrl from the calling html file
    // This enables retargeting of the applet 
    String jdbcUrl = "";
    
    try {
        jdbcUrl = getParameter("jdbcUrl");
    }
    catch (Exception e) 
        { // quetly ignore this if not running in browser
        }

    
    if (jdbcUrl!=null && !jdbcUrl.equals("")) url =  jdbcUrl;

    if (textA==null) {
        textA = new java.awt.TextArea(message,2,50);
        add(textA);
    }  
    if (textR==null) {
        textR = new java.awt.TextArea(message,12,50);
        add(textR);
    }
    }

    /**
     * The "run" method is called from the worker thread. Notice that
     * because this method is doing potentially slow databases accesses
     * we avoid making it a synchronized method.
     */

    public void run() {
    try {
        Connection con = getJOBConnection();
        doTask(con);    
    } catch(Exception ex) {
        setError( ex.getMessage());
    }

    }
    
    public Connection getJOBConnection() throws SQLException {
    
    // Load the driver
    try {
        Class.forName("easysoft.sql.jobDriver").newInstance();
    } catch(Exception ex) {
        throw new SQLException("Can't find Database driver class: " + ex);
    }

    // Now establish connection with via the Driver manager
    Connection con = DriverManager.getConnection(url);
    return con;
    }

    /**
     * In subclasses this method can be overwritten to execute different
     * db tasks then this given an open connection to the JDBC data source
     * specified in the applet tag
     */
    public void doTask(Connection con)  throws SQLException {
    // Create a statement Object
    Statement stmt = con.createStatement();
    // Execute a query returning a result set
    ResultSet rs = stmt.executeQuery(query);
    // Get the metadata for the result set
    ResultSetMetaData rsmd = rs.getMetaData();
    // Find out the number of columns in the resultset
    int columnCount = rsmd.getColumnCount();
    //StringBuffer data = new StringBuffer();
    String data = "";
    String rowData = "";
    // While there are rows in the result set
    while (rs.next()) {
        rowData = "";
        // get the data for each column in a row and
        // construct a string of comma separated column values
        for (int i = 1; i<= columnCount; i++) {
       rowData = rowData + rs.getString(i) + ", ";
        }
        data = data + rowData + "\n";
    }
    // Update result set text area
    textR.setText(data);
    // Close result set to release database resources
    rs.close();
    // Close Statement to release database resources
    stmt.close();
    //Close Connection to release database resources
    con.close();
   textA.setText("Run complete");

    }


    /**
     * This private method is used to record an error message for
     * later display.
     */

    synchronized void setError(String mess) {
    textA.setText(mess);
    worker = null;
    // And ask AWT to repaint this applet.
    repaint();
    }
}