

import java.util.Vector;
import java.awt.*;
import javax.swing.*;
import java.sql.*;

/**
 * JDBCConnectionDialog
 * Dialogue pour la connexion &agrave; une base de donn&eacute;es via JDBC.
 * Permet de saisir les informations de connection :
 * <blockqoute>
 * <li> nom de l'utilisateur </li>
 * <li> son mot de passe </li>
 * <li> l'url du serveur de la BD </li>
 * <li> le nom du driver JDBC </li>
 * </blockqoute>
 * <P>et de r&eacute;cup&eacute;rer l'objet java.sql.Connection correspondant
 *
 * @author : Petko Valtchev, Philippe Genoud d'apr&egrave;s Philip Milne 
 *           (SUN Micro Systems).
 */

public class JDBCConnectionDialog {

   // les diff&eacute;rents titre des boutons du dialogue de connexion
   static String[] optionNames = { "Connect" , "Cancel" };

   // les TextFields pour la saisie des informations de connexion
   JTextField  userNameField;
   JTextField  passwordField;
   JComboBox  serverField;
   JComboBox driverField;

   // le Panel regroupant les "widgets" pour la connexion (TextFields
   // et Labels)
   JPanel      connectionPanel;

   
   Vector<String> server;
   Vector<String> driver;

   /**
    * Cr&eacute;ation du panel qui contientra tous les champs d'information pour la connexion.
    * Attention, le dialogue n'est pas affich&eacute;. Il ne le sera que lorsque la m&eacute;thode activate
    * sera invoqu&eacute;e.
    * @see #activate
    */
   public  JDBCConnectionDialog() {

      // Cr&eacute;ation des Labels et des Textfields pour la saisie des informations
      // de connexion
      JLabel userNameLabel = new JLabel("User name: ", JLabel.RIGHT);
      userNameField = new JTextField(20);

      JLabel passwordLabel = new JLabel("Password: ", JLabel.RIGHT);
      passwordField = new JPasswordField(20);

      JLabel serverLabel = new JLabel("Database URL: ", JLabel.RIGHT);
      server = new Vector<String>();
      server.add("jdbc:oracle:thin:@bd-oracle.etudiant.upf.pf:1521:xe");
      server.add("jdbc:mysql:///test");
      serverField = new JComboBox(server);
      serverField.setEditable(true);

      JLabel driverLabel = new JLabel("Driver: ", JLabel.RIGHT);
      driver = new Vector<String>();
      driver.add("oracle.jdbc.driver.OracleDriver");
      driver.add("com.mysql.jdbc.Driver");
      driverField = new JComboBox(driver);
      // "oracle.jdbc.driver.OracleDriver" pour oracle

      // Cr&eacute;ation d'un Panel et placement dans celui-ci des Labels 
      JPanel namePanel = new JPanel(false);
      namePanel.setLayout(new GridLayout(4, 1));
      namePanel.add(userNameLabel);
      namePanel.add(passwordLabel);
      namePanel.add(serverLabel);
      namePanel.add(driverLabel);

      // Cr&eacute;ation d'un Panel et placement dans celui-ci des TextFiels
      JPanel fieldPanel = new JPanel(false);
      fieldPanel.setLayout(new GridLayout(4, 1));
      fieldPanel.add(userNameField);
      fieldPanel.add(passwordField);
      fieldPanel.add(serverField);
      fieldPanel.add(driverField);

      // Cr&eacute;ation d'un Panel regroupant le Panel des Labels et le Panel
      // des TextFiedls
      connectionPanel = new JPanel(false);
      connectionPanel.setLayout(new BoxLayout(connectionPanel,
                                              BoxLayout.X_AXIS));

      connectionPanel.add(namePanel);
      connectionPanel.add(fieldPanel);

   }

   /** 
    * Affiche le dialogue pour la connexion.
    * @return la r&eacute;f&eacute;rence pour l'adpatateur de connexion JDBC si la connexion
    *           a &eacute;t&eacute; demand&eacute;e et a r&eacute;ussi, null sinon.
   */  
   public Connection  activate() {
      
      Connection connection = null;
      int resdialog;
      // affiche un dialogue modal
      // la valeur retourn&eacute;e correspond au choix fait par l'utilisateur
  

      resdialog  = JOptionPane.showOptionDialog(
         null, // composant parent, ici une Frame par d&eacute;faut
         connectionPanel, // le contenu du dialogue
         "Connexion JDBC",  // titre du dialogue
         JOptionPane.DEFAULT_OPTION, 
         JOptionPane.INFORMATION_MESSAGE, // type du message (utilis&eacute; pour l'icone du dialogue)
         null, // icone &agrave; afficher, ici icone par d&eacute;faut en fonction du type de message
         optionNames, //tableau de String indiquant les choix possibles pour l'utilisateur
         optionNames[0]); // la selection par defaut pour le dialogue

      if (resdialog == 0) 
      {
	   
        try {
            // cherche et charge la classe du driver
            Class.forName((String) driverField.getSelectedItem());
            System.out.println("Ouverture de la connexion  &agrave; la BD");

            // ouverture de la connection
            connection = DriverManager.getConnection( (String) serverField.getSelectedItem(), 
                      userNameField.getText(),
                      passwordField.getText());
             
        }
        catch (ClassNotFoundException ex) {
            JOptionPane.showMessageDialog(null, "Classes du driver non trouv&eacute;es", 
                    "alert", JOptionPane.ERROR_MESSAGE);
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Impossible de se connecter &agrave; cette BD", 
                    "alert", JOptionPane.ERROR_MESSAGE);
        }
      }
      
      return connection;
   }

  /**
   * retourne l'url d&eacute;signant la BD pour laquelle la connexion est &eacute;tablie.
   * @return l'url d&eacute;signant la bd
   */
  public String getDBUrl() {
    return (String) serverField.getSelectedItem();
  }

   /**
    * programme de Test de la classe JDBCConnectionDialog
    */
   public static void main(String s[]) {

      JDBCConnectionDialog dialConnexion = new JDBCConnectionDialog();
      Connection conn = dialConnexion.activate();
      if (conn == null)
         System.exit(0);
      else
         System.out.println("Connexion r&eacute;ussie");
   }

}
