/* =====================================
  ApJava.java	Abril 12, 2001
 
  (C) Copyright 2000 - 2001 Javaxe
      Todos os direitos reservados
      Grupo de Estudos Java, Salvador/Ba
 
   Email.: javaxe@uol.com.br
   Autor.: Daniel de Souza Vasconcelos
   Última Atualização.: Abr 14, 2001
    ==================================== */

/*
  Esta classe mostra como recuperar informações de um banco de dados Interbase
  com o auxílio de um Driver JDBC. É preciso ter instalado o Driver Interclient 2.0
  e o Interbase 6.01
  Qualquer dúvida ou esclarecimento contacte javaxe@uol.com.br
  Grupo Javaxe.:
    - Equipe Banco de Dados
	Daniel de Souza Vasconcelos
	Danilo Monteiro
	Franklin Joffly Lima
    - Equipe Conexões e Redes
	Flávio Calazans
	Henrique Farias Ciríaco
	Marcos Cunha Navarro
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;
import java.util.*;

public class ApJava extends JFrame {
   private Connection conApJava;  // Conexão que será criada com o banco
   private JTable vTabela; 	  // Tabela onde os registros serão inseridos
   private JMenuBar barPrincipal; // Menu da aplicação
   private JMenu mnuOpcoes;
   private JMenuItem itens;

   public ApJava()
   {
     componentes();
    // sUrl especifica o banco de dados ao qual o programa se conecta, usando JDBC
    // para conectar um banco de dados Interbase
    String sUrl = "jdbc:interbase://127.0.0.1/D:/Javaxe/ApJava.gdb";
    String vUsuario = "SYSDBA";
    String vSenha = "masterkey";

    // Carrega o Driver JDBC e abre a conexão com o banco
    try{
     Class.forName("interbase.interclient.Driver");
     conApJava = DriverManager.getConnection(sUrl, vUsuario, vSenha);
    }
     catch(ClassNotFoundException cnfex){ // Excessões geradas
	String Msg = "Impossível carregar o seguinte driver JDBC: " + cnfex.getMessage() + "\nSe o mesmo estiver instalado favor verificar a variável de ambiente CLASSPATH\n\n";
        String Titulo = " Erro ao carregar Driver JDBC";

	// cnfex.getMessage() => retorna interbase.interclient.Driver
	JOptionPane.showMessageDialog(null, Msg , Titulo, JOptionPane.WARNING_MESSAGE);
        System.exit(1); // termina o programa
    }
    catch(SQLException sqlex){
	String Msg = "Não foi possível conectar o banco de dados ...";
        String Titulo = " Erro ao tentar conectar base de dados !";

	JOptionPane.showMessageDialog(null, Msg , Titulo, JOptionPane.WARNING_MESSAGE);
        sqlex.printStackTrace();
    }
     getTable();
     resize(500, 300);
     setLocation(50, 50);
     show();
  
   }

   public void componentes(){ // Contrói a interface da aplicação{ Menu }

     JMenuBar mnubarJavaxe;
     JMenu mnuArquivo, mnuAjuda, AjuJavaxe;
     JMenuItem ArqFechar;
     JMenuItem  AjuSobre;

     mnubarJavaxe = new JMenuBar(); // Adcionando a barra de menus
     setJMenuBar(mnubarJavaxe);

	// Menu Arquivo
     mnuArquivo = new JMenu("Arquivo", true); // Criando o menu
     mnuArquivo.setMnemonic('v');
     mnubarJavaxe.add(mnuArquivo);

     ArqFechar = new JMenuItem("Fechar");
     ArqFechar.setMnemonic('F');
     ArqFechar.addActionListener(
      new ActionListener(){
        public void actionPerformed( ActionEvent e){
	  System.exit(0);
        }
      }
     );
     mnuArquivo.add(ArqFechar);

 	// Menu Ajuda
     mnuAjuda = new JMenu("Ajuda");
     mnuAjuda.setMnemonic('d');
     mnubarJavaxe.add(mnuAjuda);

     AjuSobre = new JMenuItem("Sobre Javaxe InterBase Access");
     AjuSobre.setMnemonic('S');
     AjuSobre.addActionListener(
      new ActionListener(){
        public void actionPerformed( ActionEvent e){
	   Copy frmSobre = new Copy(); // Copy, classe de Copyright do Javaxe
	   frmSobre.setSize(350, 300);
	   frmSobre.setLocation(20,20);
	   frmSobre.setResizable(false);
        }
      }
     );
     mnuAjuda.add(AjuSobre);
   }

   private void getTable(){
     Statement smtp;
     ResultSet consApJava;

     try{ // Gera a Query para o banco
       String consulta = "SELECT * FROM TBLDADOS";

       smtp = conApJava.createStatement();
       consApJava = smtp.executeQuery(consulta);
       PrintQuery(consApJava);
       smtp.close();
     }
     catch (SQLException sqlex){ // Erro ao executar a Query no banco
       sqlex.printStackTrace();
     }
   }

   private void PrintQuery(ResultSet rs) throws SQLException{
     // posiciona-se no primeiro registro
     boolean registro = rs.next();

     // Se não houver registros exibe mensagem
     if (!registro){
       JOptionPane.showMessageDialog(null, "Consulta não retornou nenhum valor" , " Registro vazio", JOptionPane.WARNING_MESSAGE);
       return;
     }

     setTitle("Javaxe Interbase Access 1.08, Copyright Javaxe ®");
     Vector colunas = new Vector();
     Vector linhas = new Vector();

     try{
       // Obtém a estrutura da tabela do banco, que será adcionado a tabela
       ResultSetMetaData rsmd = rs.getMetaData();

       for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
         colunas.addElement( rsmd.getColumnName(i) );

       // Obtém dados da linha
       do{
         linhas.addElement(getNextRow(rs,rsmd));
       } while (rs.next());

       // Cria tabela e exibe o conteúdo do ResultSet
       vTabela = new JTable(linhas, colunas);
       JScrollPane scroller = new JScrollPane(vTabela);
       getContentPane().add(
         scroller, BorderLayout.CENTER
       );
       validate();
     }
     catch(SQLException sqlex){
       sqlex.printStackTrace();
     }
   }

   private Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd) throws SQLException{
     Vector curLinha = new Vector();

     for ( int i = 1; i <= rsmd.getColumnCount(); ++i)
       switch (rsmd.getColumnType(i)){
         case Types.VARCHAR:
           curLinha.addElement(rs.getString(i));
           break;
         case Types.INTEGER:
           curLinha.addElement(new Long(rs.getLong(i)));
           break;
         default:
           System.out.println("Tipo era: " + rsmd.getColumnTypeName(i));
       }
      return curLinha;
   }

   public void shutDown(){
     try{ // Fecha a conexão co o banco de dados
       conApJava.close();
     }
     catch(SQLException sqlex){ // Não foi possível fechar a conexão
       System.err.println("Erro ao fechar conexão com o banco...");
       sqlex.printStackTrace();
     }
   }

   public static void main( String args[] )
   {
      final ApJava app = new ApJava();

      app.addWindowListener(
         new WindowAdapter() {
            public void windowClosing( WindowEvent e )
            {
    	       app.shutDown();
               System.exit( 0 );
            }
         }
      );
   }
}
