/*
 * -------------------------------------------------------------------------
 *      $Id: SampleJDBC.java,v 1.5 2004/05/26 20:30:01 estewart Exp $
 * -------------------------------------------------------------------------
 *      Copyright (c) 1999 Visual Numerics Inc. All Rights Reserved.
 *
 *      This software is confidential information which is proprietary to
 *      and a trade secret of Visual Numerics, Inc.  Use, duplication or
 *      disclosure is subject to the terms of an appropriate license
 *      agreement.
 *
 *      VISUAL NUMERICS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
 *      SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING
 *      BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,
 *      FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. VISUAL
 *      NUMERICS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
 *      AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
 *      ITS DERIVATIVES.
 *--------------------------------------------------------------------------
 */

package com.imsl.demo.SampleJDBC;

/**
 *  Use a simple select statement to read all values in a MS Access
 *  database using the JDBC-ODBC bridge.
 *  The results are printed to the screen, but can be collected and
 *  sent to a IMSL Java Library chart type for display
 *
 * @author     Jerry Mariani
 * @created    October 23, 2002
 */

public class SampleJDBC extends com.imsl.chart.JFrameChart {
    
    static final int MAXROWS = 50;
    
    public SampleJDBC(boolean exitOnClose) {
        if (!exitOnClose) {
            Object l[] = getListeners(java.awt.event.WindowListener.class);
            for (int k = 0; k < l.length; k++) {
                removeWindowListener((java.awt.event.WindowListener) l[k]);
            }
        }

        com.imsl.demo.gallery.Describe des = new com.imsl.demo.gallery.Describe(this, "/com/imsl/demo/SampleJDBC/JDBC.html");
        des.show();
        java.awt.Dimension dess = des.getSize();
        java.awt.Dimension ss = getToolkit().getScreenSize();
        int w = Math.min(ss.width/2, ss.height-dess.height-32);
        setSize(w, w);
        setLocation(ss.width-dess.width, dess.height);
        setTitle("JDBC Query Results");
        
        int id;
        java.sql.Date dt;
        float open, high, low, close;
        int cnt = 0;
        StringBuffer result;
        
        // set up the chart
        com.imsl.chart.Chart chart = getChart();
        com.imsl.chart.AxisXY axis = new com.imsl.chart.AxisXY(chart);
        axis.getAxisX().getAxisTitle().setTitle("                               Date");
        axis.getAxisX().getAxisLabel().setTextFormat(new java.text.SimpleDateFormat("MM/dd/yy"));
        axis.getAxisX().setCustomTransform(new com.imsl.chart.TransformDate());
        axis.getAxisX().setTransform(com.imsl.chart.AxisXY.TRANSFORM_CUSTOM);
        axis.getAxisX().getAxisLabel().setTextAngle(90);
        axis.getAxisX().setSkipWeekends(true);
        axis.getAxisY().getAxisTitle().setTitle("Price of Gold per Ounce");
        axis.getAxisY().getAxisLabel().setTextFormat(new java.text.DecimalFormat("$ #0"));

        // set up collector
        java.util.Date startDate = new java.util.Date();
        double listOpen[] = new double[MAXROWS];
        double listHigh[] = new double[MAXROWS];
        double listLow[] = new double[MAXROWS];
        double listClose[] = new double[MAXROWS];
        final java.text.DecimalFormat df = new java.text.DecimalFormat("##0.00");
        
        // the included xau.mdb must be registered in the ODBC Manager as "xau"
        // see the JDBC.html docs for more information.
        try {
            
            // connect to ODBC database
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            String url = "jdbc:odbc:xau";
            
            // connect
            java.sql.Connection con = java.sql.DriverManager.getConnection(url, "xau", "sql");
            
            // create Statement object
            java.sql.Statement stmt = con.createStatement();
            stmt.setMaxRows(MAXROWS);
            String sqlselect = "Select id, date, open, high, low, close from xau";
            
            // run query
            java.sql.ResultSet rs = stmt.executeQuery(sqlselect);
                        
            // process results
            while(rs.next()) {
                
                result  = new StringBuffer();
                id      = rs.getInt(1);
                dt      = rs.getDate(2);
                open    = rs.getFloat(3);
                high    = rs.getFloat(4);
                low     = rs.getFloat(5);
                close   = rs.getFloat(6);
                
                result.append(id + " ");
                result.append(dt.toString() + " ");
                result.append(df.format(open) + " ");
                result.append(df.format(high) + " ");
                result.append(df.format(low) + " ");
                result.append(df.format(close));
                
                System.out.println("Values are: " + result);
                
                // collect data into something to pass to the charting routines here
                if (cnt == 0) {
                    startDate = dt;
                }
                listOpen[cnt] = open;
                listHigh[cnt] = high;
                listLow[cnt] = low;
                listClose[cnt] = close;
                cnt++;
            }

            //close connection
            con.close();

        } catch (Exception e) {
            String name = e.toString().substring(0,e.toString().indexOf(':'));
            String text = e.getMessage() + "\nPlease review the documentation JDBC.html for more information";
            javax.swing.JOptionPane.showMessageDialog(this, e.getMessage(), name, javax.swing.JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            return;
        }
        
        // define data for the chart
        com.imsl.chart.Candlestick cs = new com.imsl.chart.Candlestick(axis, startDate, listHigh, listLow, listClose, listOpen);
        cs.getUp().setFillColor("green");
        cs.getDown().setFillColor("red");
    }
    
    public static void main(String args[]) {
        boolean exitOnClose = true;
        if (args.length > 0 && args[0].equals("-noexit")) {
            exitOnClose = false;
        }
        new SampleJDBC(exitOnClose).show();
    }
}