view src/ConnectionManager/src/connectionmanager/DatabaseDialog.java @ 39:11e3ed9d2115 database-connection-manager

Implement databases listing in database connection dialog
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Mon, 05 Dec 2011 16:20:06 +0100
parents 960fe1aa1c10
children
line wrap: on
line source

package connectionmanager;

import java.util.HashSet;
import java.util.ArrayList;
import javax.swing.DefaultComboBoxModel;
import javax.swing.table.TableModel;

public class DatabaseDialog extends javax.swing.JDialog {

  public boolean cancelled = true;
  public String hostname;
  public String database;
  private TableModel model;

  public DatabaseDialog(javax.swing.JDialog parent, TableModel model) {
    super(parent, true);
    this.model = model;
    initComponents();
    initHostnameCombo();
    initDatabaseCombo();
    super.setLocationRelativeTo(parent);
    super.getRootPane().setDefaultButton(okButton);
    if (hostnameCombo.getModel().getSize() == 1) {
      databaseCombo.requestFocus();
    }
  }

  @SuppressWarnings("unchecked")
  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
  private void initComponents() {

    jLabel10 = new javax.swing.JLabel();
    jLabel9 = new javax.swing.JLabel();
    databaseCombo = new javax.swing.JComboBox();
    okButton = new javax.swing.JButton();
    cancelButton = new javax.swing.JButton();
    hostnameCombo = new javax.swing.JComboBox();
    listButton = new javax.swing.JButton();

    setTitle("Database connection");
    setLocationByPlatform(true);
    setModal(true);
    setResizable(false);

    jLabel10.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
    jLabel10.setText("Database:");

    jLabel9.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
    jLabel9.setText("Hostname:");

    databaseCombo.setEditable(true);

    okButton.setText("Ok");
    okButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        okButtonActionPerformed(evt);
      }
    });

    cancelButton.setText("Cancel");
    cancelButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        cancelButtonActionPerformed(evt);
      }
    });

    hostnameCombo.setEditable(true);
    hostnameCombo.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        hostnameComboActionPerformed(evt);
      }
    });

    listButton.setText("List databases");
    listButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        listButtonActionPerformed(evt);
      }
    });

    org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
      layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
      .add(layout.createSequentialGroup()
        .addContainerGap()
        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
          .add(layout.createSequentialGroup()
            .add(jLabel9)
            .add(18, 18, 18)
            .add(hostnameCombo, 0, 240, Short.MAX_VALUE))
          .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
            .add(jLabel10)
            .add(21, 21, 21)
            .add(databaseCombo, 0, 240, Short.MAX_VALUE))
          .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
            .add(listButton)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 134, Short.MAX_VALUE)
            .add(cancelButton)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(okButton)))
        .addContainerGap())
    );
    layout.setVerticalGroup(
      layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
      .add(layout.createSequentialGroup()
        .addContainerGap()
        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
          .add(hostnameCombo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
          .add(jLabel9))
        .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
          .add(databaseCombo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
          .add(jLabel10))
        .add(30, 30, 30)
        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
          .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
            .add(okButton)
            .add(cancelButton))
          .add(listButton))
        .addContainerGap())
    );

    pack();
  }// </editor-fold>//GEN-END:initComponents

    private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
      cancelled = true;
      doClose();
    }//GEN-LAST:event_cancelButtonActionPerformed

    private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
      cancelled = false;
      hostname = (String) hostnameCombo.getSelectedItem();
      database = (String) databaseCombo.getSelectedItem();
      doClose();
    }//GEN-LAST:event_okButtonActionPerformed

    private void hostnameComboActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_hostnameComboActionPerformed
      initDatabaseCombo();
    }//GEN-LAST:event_hostnameComboActionPerformed

private void listButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_listButtonActionPerformed
  // selected hostname
  hostname = (String) hostnameCombo.getSelectedItem();
  // users for given hostname
  HashSet<String> usernames = new HashSet<String>();
  int rows = model.getRowCount();
  for (int i = 0; i < rows; i++) {
    if (model.getValueAt(i, 0).equals(hostname)) {
      String username = (String) model.getValueAt(i, 2);
      if (username != null) {
        usernames.add(username);
      }
    }    
  }
  // credentials dialog
  String[] users = new String[usernames.size()];
  usernames.toArray(users);
  java.util.Arrays.sort(users);
  CredentialsDialog dialog = new CredentialsDialog(this, hostname, users);
  dialog.setVisible(true);
  
  try {
    // connect to database
    Class.forName("com.mysql.jdbc.Driver");
    String url = String.format("jdbc:mysql://%s/", hostname);
    java.sql.Connection conn = java.sql.DriverManager.getConnection(url, dialog.username, dialog.password);
    // list databases
    java.sql.Statement stmt = conn.createStatement();
    java.sql.ResultSet rs = stmt.executeQuery("SHOW DATABASES");
    ArrayList<String> databases = new ArrayList<String>();
    while (rs.next()) {
      String db = rs.getString(1);
      if (! db.equals("information_schema")) {
        databases.add(db);
      }
    }
    // add to combo box
    databaseCombo.setModel(new DefaultComboBoxModel(databases.toArray()));
    // show list
    databaseCombo.setPopupVisible(true);
    // give focus to list
    databaseCombo.getEditor().getEditorComponent().requestFocus();
  } catch (Exception ex) { }
}//GEN-LAST:event_listButtonActionPerformed

  private void initHostnameCombo() {
    HashSet<String> hostnames = new HashSet<String>();
    int rows = model.getRowCount();
    for (int i = 0; i < rows; i++) {
      hostnames.add((String) model.getValueAt(i, 0));
    }
    hostnameCombo.setModel(new DefaultComboBoxModel(hostnames.toArray()));
  }

  private void initDatabaseCombo() {
    HashSet<String> databases = new HashSet<String>();
    hostname = (String) hostnameCombo.getSelectedItem();
    int rows = model.getRowCount();
    for (int i = 0; i < rows; i++) {
      if (hostname.equals((String) model.getValueAt(i, 0))) {
        databases.add((String) model.getValueAt(i, 1));
      }
    }
    databaseCombo.setModel(new DefaultComboBoxModel(databases.toArray()));
  }

  private void doClose() {
    setVisible(false);
    dispose();

  }
  // Variables declaration - do not modify//GEN-BEGIN:variables
  private javax.swing.JButton cancelButton;
  private javax.swing.JComboBox databaseCombo;
  private javax.swing.JComboBox hostnameCombo;
  private javax.swing.JLabel jLabel10;
  private javax.swing.JLabel jLabel9;
  private javax.swing.JButton listButton;
  private javax.swing.JButton okButton;
  // End of variables declaration//GEN-END:variables
}