package javacodebook.server.jsp.tag;

import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.sql.*;

/**
 *  Ein Tag zur Kapselung von Datenbank-Abfragen in HTML-Seiten. Eine SQL-Abfrage
 *  wird ausgeführt und aus dem ResultSet wird eine Tabelle erzeugt.
 */
public class SQLTable extends javax.servlet.jsp.tagext.TagSupport {

    //Name des Datenbanktreibers
    private String driver;
    //Der Connect-String, mit dem die Verbindung geöffnet wird
    private String connectString;
    //Name des Datenbankusers
    private String user;
    //Password des Datenbankusers
    private String passwd;
    //Text der Abfrage
    private String queryString;

    /**
     * Die doStartTag-Methode wird aufgerufen, nachdem alle Attribute des Tags
     * gesetzt sind.
     */
    public int doStartTag()
    throws JspException {
        Connection conn = null;
        Statement stmt = null;
        try {
            //Treiber laden und Verbindung öffnen
            Class.forName(driver);
            conn = DriverManager.getConnection(connectString, user, passwd);

            //Statement erzeugen und Abfrage abschicken
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(queryString);
            ResultSetMetaData rsmd = rs.getMetaData();
            int colCount = rsmd.getColumnCount();
            JspWriter out = pageContext.getOut();
            out.println("<table border=1 cellpadding=0 cellspacing=0>");

            //Titelzeile der Tabelle aufbauen anhand der Metadaten
            out.println("<tr>");
            for(int i = 1; i <= colCount; i++)
                out.println("<th>" + rsmd.getColumnName(i) + "</th>");
            out.println("</tr>");

            //alle Zeilen des ResultSets in Tabellenzeilen ausgeben
            while(rs.next()) {
                out.println("<tr>");
                for(int i = 1; i <= colCount; i++)
                    out.println("<td>" + rs.getString(i) + "&nbsp;</td>");
                out.println("</tr>");
            }
            rs.close();
            out.println("</table>");
        } catch(Exception e) {
            e.printStackTrace(System.out);
        }
        finally {
            try { stmt.close(); } catch(Exception ignored) {}
            try { conn.close(); } catch(Exception ignored) {}
        }
        return SKIP_BODY;
    }

    /** Die Methode zur Auswertung des Attributs queryString */
    public void setQueryString(String queryString) {
        this.queryString = queryString.trim();
    }

    /** Wertet das Attributs driver aus */
    public void setDriver(String driver) {
        this.driver = driver.trim();
    }

    /** Wertet das Attributs connectString aus */
    public void setConnectString(String connectString) {
        this.connectString = connectString;
    }

    /** Wertet das Attributs user aus */
    public void setUser(String user) {
        this.user = user;
    }

    /** Wertet das Attributs passwd aus */
    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

}
