/* * Copyright 2007 - 2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.sf.jailer.ui; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Point; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.net.URL; import java.sql.Connection; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import net.sf.jailer.database.BasicDataSource; import net.sf.jailer.database.Session; import net.sf.jailer.modelbuilder.JDBCMetaDataBasedModelElementFinder; import net.sf.jailer.util.ClasspathUtil; import net.sf.jailer.util.CsvFile; import net.sf.jailer.util.CsvFile.Line; import net.sf.jailer.util.Pair; /** * Database connection dialog. * * @author Ralf Wisser */ public class DbConnectionDialog extends javax.swing.JDialog { /** * <code>true</code> if valid connection is available. */ public boolean isConnected = false; /** * Holds connection information. */ public static class ConnectionInfo implements Serializable, Cloneable { @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } private static final long serialVersionUID = -8034755966212631808L; public String alias = ""; public String driverClass = ""; public String url = ""; public String user = ""; public String password = ""; public String jar1 = ""; public String jar2 = ""; public transient String dataModelFolder; /** * Constructor. */ public ConnectionInfo() { dataModelFolder = DataModelManager.getCurrentModelSubfolder(); } } /** * List of available connections. */ private List<ConnectionInfo> connectionList; /** * Currently selected connection. */ public ConnectionInfo currentConnection; /** * The parent frame. */ private final java.awt.Frame parent; /** * Gets connection to DB. * * @return <code>true</code> if connection succeeded */ public boolean connect(String reason) { setTitle((reason == null ? "" : (reason + " - ")) + "Connect."); refresh(); setVisible(true); return isConnected; } private final InfoBar infoBar; private final String currentModelSubfolder = DataModelManager.getCurrentModelSubfolder(); /** Creates new form DbConnectionDialog */ public DbConnectionDialog(java.awt.Frame parent, DbConnectionDialog other, String applicationName) { this(parent, applicationName, other.infoBar == null? null : new InfoBar(other.infoBar)); this.isConnected = other.isConnected; this.connectionList = other.connectionList; if (other.currentConnection != null) { try { this.currentConnection = (ConnectionInfo) other.currentConnection.clone(); } catch (CloneNotSupportedException e) { this.currentConnection = other.currentConnection; } } } /** * Creates new form DbConnectionDialog * * @param applicationName application name. Used to create the name of the demo database alias. */ public DbConnectionDialog(java.awt.Frame parent, String applicationName, InfoBar infoBar) { super(parent, true); this.parent = parent; this.infoBar = infoBar; loadConnectionList(); initComponents(); if (infoBar == null) { infoBar = new InfoBar("Connect with Database", "Select a connection to the database, or create a new connection.\n" + "New connections will be assigned to the datamodel \"" + DataModelManager.getModelDetails(DataModelManager.getCurrentModelSubfolder()).a + "\"."); } UIUtil.replace(infoBarLabel, infoBar); int i; initTableModel(); final TableCellRenderer defaultTableCellRenderer = connectionsTable .getDefaultRenderer(String.class); connectionsTable.setShowGrid(false); connectionsTable.setDefaultRenderer(Object.class, new TableCellRenderer() { public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component render = defaultTableCellRenderer .getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if (render instanceof JLabel) { if (!isSelected) { final Color BG1 = new Color(255, 255, 255); final Color BG2 = new Color(230, 255, 255); ((JLabel) render) .setBackground((row % 2 == 0) ? BG1 : BG2); } else { ((JLabel) render).setBackground(new Color(160, 160, 255)); } boolean inContext = isAssignedToDataModel(row); if (inContext) { ((JLabel) render).setForeground(Color.black); } else { ((JLabel) render).setForeground(Color.gray); } } return render; } }); connectionsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); connectionsTable.getSelectionModel().addListSelectionListener( new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent evt) { refresh(); } }); connectionsTable.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent me) { JTable table =(JTable) me.getSource(); Point p = me.getPoint(); int row = table.rowAtPoint(p); if (me.getClickCount() >= 2) { connectionsTable.getSelectionModel().setSelectionInterval(row, row); refresh(); if (jButton1.isEnabled()) { connect(); } } } }); if (currentConnection != null) { i = connectionList.indexOf(currentConnection); if (i >= 0) { connectionsTable.getSelectionModel().setSelectionInterval(i, i); } } addComponentListener(new ComponentListener() { @Override public void componentShown(ComponentEvent e) { if (connectionList != null && connectionList.isEmpty()) { newButtonActionPerformed(null); } } @Override public void componentHidden(ComponentEvent e) { } @Override public void componentMoved(ComponentEvent e) { } @Override public void componentResized(ComponentEvent e) { } }); setLocation(100, 150); pack(); setSize(Math.max(710, getWidth()), 450); refresh(); UIUtil.initPeer(); } /** * Initializes the table model. */ private Object[][] initTableModel() { Object[][] data = new Object[connectionList.size()][]; int i = 0; for (ConnectionInfo ci: connectionList) { Pair<String, Long> modelDetails = DataModelManager.getModelDetails(ci.dataModelFolder); data[i++] = new Object[] { ci.alias, ci.user, ci.url, modelDetails == null? "" : modelDetails.a }; } DefaultTableModel tableModel = new DefaultTableModel(data, new String[] { "Alias", "User", "URL", "Data Model" }) { @Override public boolean isCellEditable(int row, int column) { return false; } private static final long serialVersionUID = 1535384744352159695L; }; connectionsTable.setModel(tableModel); return data; } private boolean inRefresh = false; private String jdbcHelpURL = "http://jailer.sourceforge.net/doc/jdbc.html?src=app"; public synchronized void setJdbcHelpURL(String jdbcHelpURL) { this.jdbcHelpURL = jdbcHelpURL; } /** * Refreshes the dialog after model changes. */ private void refresh() { if (inRefresh) return; inRefresh = true; try { int selectedRow = connectionsTable.getSelectedRow(); Object[][] data = initTableModel(); if (selectedRow >= 0) { connectionsTable.getSelectionModel().setSelectionInterval(selectedRow, selectedRow); currentConnection = connectionList.get(selectedRow); } else { currentConnection = null; } for (int i = 0; i < connectionsTable.getColumnCount(); i++) { TableColumn column = connectionsTable.getColumnModel().getColumn(i); int width = 1; Component comp = connectionsTable.getDefaultRenderer(String.class). getTableCellRendererComponent( connectionsTable, column.getHeaderValue(), false, false, 0, i); width = Math.max(width, comp.getPreferredSize().width); for (int line = 0; line < data.length; ++line) { comp = connectionsTable.getDefaultRenderer(String.class). getTableCellRendererComponent( connectionsTable, data[line][i], false, false, line, i); width = Math.max(width, comp.getPreferredSize().width); } column.setPreferredWidth(width); } editButton.setEnabled(currentConnection != null); deleteButton.setEnabled(currentConnection != null); copy.setEnabled(currentConnection != null); jButton1.setEnabled(currentConnection != null && selectedRow >= 0 && selectedRow < connectionList.size() && isAssignedToDataModel(selectedRow)); } finally { inRefresh = false; } } /** * File to store connections. */ private static String CONNECTIONS_FILE = ".connections"; /** * Stores the connections into the CONNECTIONS_FILE. */ private void store() { try { File file = new File(CONNECTIONS_FILE); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)); out.writeObject(connectionList); out.writeInt(connectionList.indexOf(currentConnection)); List<String> dataModels = new ArrayList<String>(); for (ConnectionInfo ci: connectionList) { dataModels.add(ci.dataModelFolder); } out.writeObject(dataModels); out.close(); } catch (Exception e) { e.printStackTrace(); } } /** * Loads connection list. */ @SuppressWarnings("unchecked") private void loadConnectionList() { connectionList = new ArrayList<ConnectionInfo>(); currentConnection = null; boolean ok = false; boolean preV4 = true; try { File file = new File(CONNECTIONS_FILE); if (file.exists()) { ObjectInputStream in = new ObjectInputStream(new FileInputStream(CONNECTIONS_FILE)); List<ConnectionInfo> cis = (List<ConnectionInfo>) in.readObject(); int i = in.readInt(); try { List<String> dma = (List<String>) in.readObject(); for (int n = 0; n < dma.size(); ++n) { cis.get(n).dataModelFolder = dma.get(n); } preV4 = false; } catch (Throwable t) { // ignore. pre 4.0 files do not contain data model assignments. } in.close(); connectionList = cis; if (i >= 0 && i < connectionList.size()) { // currentConnection = connectionList.get(i); } ok = true; } } catch (Exception e) { e.printStackTrace(); } if (!ok) { // migration of old settings try { File settingsFile = new File(".connect.ui"); if (settingsFile.exists()) { ObjectInputStream in = new ObjectInputStream( new FileInputStream(settingsFile)); Map<String, Map<String, String>> settings = (Map<String, Map<String, String>>) in .readObject(); in.close(); for (String name : settings.keySet()) { if (settings.get(name).get("dbUser").trim().length() > 0) { ConnectionInfo ci = new ConnectionInfo(); ci.alias = name; ci.driverClass = settings.get(name).get("driver"); ci.user = settings.get(name).get("dbUser"); ci.url = settings.get(name).get("dbUrl"); ci.password = settings.get(name).get("password"); ci.jar1 = settings.get(name).get("jar1"); ci.jar2 = settings.get(name).get("jar2"); connectionList.add(ci); } } } } catch (Exception e) { // ignore } } if (connectionList.size() == 0) { ConnectionInfo ci = new ConnectionInfo(); ci.alias = "Demo Scott"; ci.driverClass = "org.h2.Driver"; ci.jar1 = "lib" + File.separator + "h2-1.3.160.jar"; ci.url = "jdbc:h2:demo-scott"; ci.user = "sa"; ci.password = ""; ci.dataModelFolder = "Demo-Scott"; connectionList.add(ci); store(); } if (preV4) { ConnectionInfo ci = new ConnectionInfo(); ci.alias = "Demo Sakila"; ci.driverClass = "org.h2.Driver"; ci.jar1 = "lib" + File.separator + "h2-1.3.160.jar"; ci.url = "jdbc:h2:demo-sakila"; ci.user = "sa"; ci.password = ""; ci.dataModelFolder = "Demo-Sakila"; connectionList.add(ci); store(); } if (connectionList.size() == 1) { currentConnection = connectionList.get(0); } Collections.sort(connectionList, new Comparator<ConnectionInfo>() { @Override public int compare(ConnectionInfo o1, ConnectionInfo o2) { if (currentModelSubfolder != null) { boolean c1 = currentModelSubfolder.equals(o1.dataModelFolder); boolean c2 = currentModelSubfolder.equals(o2.dataModelFolder); if (c1 && !c2) return -1; if (!c1 && c2) return 1; } return o1.alias.compareTo(o2.alias); } }); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; jPanel1 = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); jButton2 = new javax.swing.JButton(); jButton1 = new javax.swing.JButton(); jPanel3 = new javax.swing.JPanel(); newButton = new javax.swing.JButton(); editButton = new javax.swing.JButton(); copy = new javax.swing.JButton(); deleteButton = new javax.swing.JButton(); infoBarLabel = new javax.swing.JLabel(); jPanel4 = new javax.swing.JPanel(); jScrollPane2 = new javax.swing.JScrollPane(); connectionsTable = new javax.swing.JTable(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Connect with DB"); getContentPane().setLayout(new java.awt.CardLayout()); jPanel1.setLayout(new java.awt.GridBagLayout()); jPanel2.setLayout(new java.awt.GridBagLayout()); jButton2.setText(" Cancel "); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 0, 0, 4); jPanel2.add(jButton2, gridBagConstraints); jButton1.setText(" Connect "); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 0, 4); jPanel2.add(jButton1, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 100; gridBagConstraints.gridwidth = 20; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; jPanel1.add(jPanel2, gridBagConstraints); jPanel3.setLayout(new java.awt.GridBagLayout()); newButton.setText(" New "); newButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { newButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 10; gridBagConstraints.gridy = 10; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(16, 4, 2, 0); jPanel3.add(newButton, gridBagConstraints); editButton.setText(" Edit "); editButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { editButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 10; gridBagConstraints.gridy = 11; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 4, 2, 0); jPanel3.add(editButton, gridBagConstraints); copy.setText(" Copy "); copy.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { copyActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 10; gridBagConstraints.gridy = 20; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 4, 2, 0); jPanel3.add(copy, gridBagConstraints); deleteButton.setText(" Delete "); deleteButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { deleteButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 10; gridBagConstraints.gridy = 30; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(0, 4, 2, 0); jPanel3.add(deleteButton, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 10; gridBagConstraints.gridy = 20; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; jPanel1.add(jPanel3, gridBagConstraints); infoBarLabel.setText("info bar"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 11; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; jPanel1.add(infoBarLabel, gridBagConstraints); jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder("Connections")); jPanel4.setLayout(new java.awt.GridBagLayout()); connectionsTable.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {null, null, null, null}, {null, null, null, null}, {null, null, null, null}, {null, null, null, null} }, new String [] { "Title 1", "Title 2", "Title 3", "Title 4" } )); jScrollPane2.setViewportView(connectionsTable); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; jPanel4.add(jScrollPane2, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 20; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; jPanel1.add(jPanel4, gridBagConstraints); getContentPane().add(jPanel1, "card2"); pack(); }// </editor-fold>//GEN-END:initComponents private void copyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copyActionPerformed if (currentConnection != null) { int i = connectionList.indexOf(currentConnection); if (i >= 0) { for (int nr = 1; ; ++nr) { String newAlias = "Copy of " + currentConnection.alias + (nr > 1? " (" + nr + ")" : ""); boolean found = false; for (ConnectionInfo ci: connectionList) { if (ci.alias.equals(newAlias)) { found = true; break; } } if (!found) { ConnectionInfo ci = new ConnectionInfo(); ci.alias = newAlias; ci.driverClass = currentConnection.driverClass; ci.jar1 = currentConnection.jar1; ci.jar2 = currentConnection.jar2; ci.password = currentConnection.password; ci.url = currentConnection.url; ci.user = currentConnection.user; connectionList.add(i + 1, ci); connectionsTable.getSelectionModel().setSelectionInterval(i + 1, i + 1); refresh(); store(); break; } } } } }//GEN-LAST:event_copyActionPerformed private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed if (currentConnection != null) { int i = connectionList.indexOf(currentConnection); if (i >= 0) { if (JOptionPane.showConfirmDialog(this, "Delete '" + currentConnection.alias + "'?", "Delete", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { connectionList.remove(i); connectionsTable.getSelectionModel().clearSelection(); refresh(); store(); } } } }//GEN-LAST:event_deleteButtonActionPerformed private void newButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newButtonActionPerformed ConnectionInfo ci = new ConnectionInfo(); try { CsvFile drivers = new CsvFile(new File("driverlist.csv")); List<Line> lines = new ArrayList<Line>(drivers.getLines()); Collections.sort(lines, new Comparator<Line>() { public int compare(Line o1, Line o2) { return o1.cells.get(0).compareTo(o2.cells.get(0)); } }); List<String> dbmsNames = new ArrayList<String>(); for (Line line: lines) { if (line.cells.get(0).length() > 0) { dbmsNames.add(line.cells.get(0)); } } String s = (String) JOptionPane.showInputDialog(this, "Select DBMS", "Select DBMS", JOptionPane.QUESTION_MESSAGE, null, dbmsNames.toArray(), dbmsNames.get(0)); if (s == null) return; for (Line line: lines) { if (line.cells.get(0).equals(s)) { ci.url = line.cells.get(1); ci.driverClass = line.cells.get(2); String[] jars = line.cells.get(3).replace("/", File.separator).split(" "); if (jars.length > 0) { ci.jar1 = jars[0]; } if (jars.length > 1) { ci.jar2 = jars[1]; } ci.alias = s; } } } catch (Exception e) { } if (edit(ci, true)) { for (int nr = 1; ; ++nr) { String newAlias = ci.alias + (nr > 1? " (" + nr + ")" : ""); boolean found = false; for (ConnectionInfo ci2: connectionList) { if (newAlias.equals(ci2.alias)) { found = true; break; } } if (!found) { ci.alias = newAlias; connectionList.add(0, ci); int i = 0; connectionsTable.getSelectionModel().setSelectionInterval(i, i); refresh(); store(); break; } } } }//GEN-LAST:event_newButtonActionPerformed private void editButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editButtonActionPerformed if (currentConnection == null) return; if (edit(currentConnection, false)) { refresh(); store(); } }//GEN-LAST:event_editButtonActionPerformed private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed isConnected = false; setVisible(false); }//GEN-LAST:event_jButton2ActionPerformed /** * Opens detail editor for a connection. * * @param ci the connection * @param forNew * @return <code>true</code> if connection has been edited */ private boolean edit(ConnectionInfo ci, boolean forNew) { return new DbConnectionDetailsEditor(parent, jdbcHelpURL, forNew).edit(ci); } private void connect() { if (currentConnection == null) { return; } isConnected = false; try { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); if (testConnection(this, currentConnection)) { isConnected = true; setVisible(false); } } finally { setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { connect(); }// GEN-LAST:event_jButton1ActionPerformed public static boolean testConnection(Component parent, ConnectionInfo ci) { String d1 = ci.jar1.trim(); String d2 = ci.jar2.trim(); if (d1.length() == 0) { d1 = null; } if (d2.length() == 0) { d2 = null; } URL[] urls; try { urls = ClasspathUtil.toURLArray(d1, d2); } catch (Exception e) { UIUtil.showException(parent, "Error loading driver jars", e, UIUtil.EXCEPTION_CONTEXT_USER_ERROR); return false; } try { BasicDataSource dataSource = new BasicDataSource(ci.driverClass, ci.url, ci.user, ci.password, 0, urls); Connection con = dataSource.getConnection(); con.close(); return true; } catch (Exception e) { if (e.getCause() instanceof ClassNotFoundException) { UIUtil.showException(parent, "Could not connect to DB", new ClassNotFoundException("JDBC driver class not found: '" + e.getMessage() + "'", e.getCause()), UIUtil.EXCEPTION_CONTEXT_USER_ERROR); } else { UIUtil.showException(parent, "Could not connect to DB", e, UIUtil.EXCEPTION_CONTEXT_USER_ERROR); } return false; } } /** * Gets all DB schemas. * * @param defaultSchema array of size 1 to put default schema into (null if no schema exists) * @return all DB schemas */ public List<String> getDBSchemas(String[] defaultSchema) throws Exception { BasicDataSource dataSource = new BasicDataSource(currentConnection.driverClass, currentConnection.url, currentConnection.user, currentConnection.password, 0, ClasspathUtil.toURLArray(currentConnection.jar1, currentConnection.jar2)); Session session = new Session(dataSource, dataSource.dbms); List<String> schemas = JDBCMetaDataBasedModelElementFinder.getSchemas( session, currentConnection.user); defaultSchema[0] = JDBCMetaDataBasedModelElementFinder .getDefaultSchema(session, currentConnection.user); session.shutDown(); return schemas; } /** * Selects the DB-schema to analyze. * * @param isDefaultSchema * array with a least one field to be set to true if the selected * schema is the default schema * @return the DB-schema to analyze */ public String selectDBSchema(Component parent, boolean[] isDefaultSchema) throws Exception { BasicDataSource dataSource = new BasicDataSource(currentConnection.driverClass, currentConnection.url, currentConnection.user, currentConnection.password, 0, ClasspathUtil.toURLArray(currentConnection.jar1, currentConnection.jar2)); Session session = new Session(dataSource, dataSource.dbms); List<String> schemas = JDBCMetaDataBasedModelElementFinder.getSchemas( session, currentConnection.user); String defaultSchema = JDBCMetaDataBasedModelElementFinder .getDefaultSchema(session, currentConnection.user); session.shutDown(); isDefaultSchema[0] = false; if (schemas.size() == 1) { if (schemas.get(0).equalsIgnoreCase(currentConnection.user)) { isDefaultSchema[0] = true; } return schemas.get(0); } if (schemas.isEmpty()) { isDefaultSchema[0] = true; return null; } String s = (String) JOptionPane.showInputDialog(parent, "Select schema to analyze", "Schema", JOptionPane.QUESTION_MESSAGE, null, schemas.toArray(), defaultSchema); if (s == null) { isDefaultSchema[0] = true; return ""; } if (s.equalsIgnoreCase(defaultSchema)) { isDefaultSchema[0] = true; } return s; } /** * Adds jailer cli-arguments for DB connection. * * @param args * the arg-list to add arguments to */ public void addDbArgs(List<String> args) { args.add(currentConnection.driverClass); args.add(currentConnection.url); args.add(currentConnection.user); args.add(currentConnection.password); if (currentConnection.jar1.trim().length() > 0) { args.add("-jdbcjar"); args.add(currentConnection.jar1.trim()); } if (currentConnection.jar2.trim().length() > 0) { args.add("-jdbcjar2"); args.add(currentConnection.jar2.trim()); } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTable connectionsTable; private javax.swing.JButton copy; private javax.swing.JButton deleteButton; private javax.swing.JButton editButton; private javax.swing.JLabel infoBarLabel; private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JButton newButton; // End of variables declaration//GEN-END:variables public String getPassword() { return currentConnection.password; } private boolean isAssignedToDataModel(int row) { String rowFN = connectionList.get(row).dataModelFolder; String fn = currentModelSubfolder; return fn == null && rowFN == null || (fn != null && fn.equals(rowFN)); } private static final long serialVersionUID = -3983034803834547687L; public URL[] currentJarURLs() throws Exception { if (currentConnection != null) { return ClasspathUtil.toURLArray(currentConnection.jar1, currentConnection.jar2); } return null; } }