View Javadoc

1   /*   Copyright (C) 2003 Finalist IT Group
2    *
3    *   This file is part of JAG - the Java J2EE Application Generator
4    *
5    *   JAG is free software; you can redistribute it and/or modify
6    *   it under the terms of the GNU General Public License as published by
7    *   the Free Software Foundation; either version 2 of the License, or
8    *   (at your option) any later version.
9    *   JAG is distributed in the hope that it will be useful,
10   *   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   *   GNU General Public License for more details.
13   *   You should have received a copy of the GNU General Public License
14   *   along with JAG; if not, write to the Free Software
15   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16   */
17  package com.finalist.jaggenerator.modules;
18  
19  import com.finalist.jaggenerator.Database;
20  import com.finalist.jaggenerator.DatabaseManager;
21  import com.finalist.jaggenerator.ExtensionsFileFilter;
22  import com.finalist.jaggenerator.JagGenerator;
23  
24  import javax.swing.*;
25  import javax.swing.event.TableModelEvent;
26  import javax.swing.event.TableModelListener;
27  import javax.swing.table.DefaultTableModel;
28  import javax.swing.table.TableColumn;
29  import javax.swing.table.TableModel;
30  import java.io.File;
31  import java.util.*;
32  
33  /***
34   * The JFrame GUI behind the DatabaseManager.
35   *
36   * @author  m.oconnor
37   */
38  public class DatabaseManagerFrame extends javax.swing.JFrame {
39     private static DatabaseManagerFrame ourInstance;
40     private static final List newDatabases = new ArrayList();
41     public static final String SELECT = "< select >";
42     private static final String DRIVER_IMPORT_FILECHOOSER = "import driver";
43     private static final String[] ACCEPTABLE_EXTENSIONS = new String[] {"class", "jar", "zip"};
44     private static final Vector COLUMN_NAMES = new Vector(Arrays.asList(new String[]{
45        "Database Type",
46        "Driver File",
47        "Driver Class",
48        "Type Mapping",
49     }));
50  
51  
52     /***
53      * Only one instance of the DatabaseManagerFrame is allowed - this method obtains the one and only instance.
54      * @return
55      */
56     public synchronized static DatabaseManagerFrame getInstance() {
57        if (ourInstance == null) {
58           ourInstance = new DatabaseManagerFrame();
59        }
60        return ourInstance;
61     }
62  
63     /***
64      * Whenever the frame is shown, reinitialise the list.
65      */
66     public void show() {
67        newDatabases.clear();
68        refreshModel();
69        super.show();
70     }
71  
72     private DatabaseManagerFrame() {
73        initComponents();
74        postInit();
75     }
76  
77  
78     private void postInit() {
79        this.setLocationRelativeTo(JagGenerator.jagGenerator);
80        jTable1.setSurrendersFocusOnKeystroke(true);
81        refreshModel();
82     }
83  
84     private void refreshModel() {
85        jTable1.setModel(new DefaultTableModel(getData(), COLUMN_NAMES) {
86           //The middle two columns are not editable
87           public boolean isCellEditable(int row, int column) {
88              if (column == 1 || column == 2) {
89                 return false;
90              }
91              return super.isCellEditable(row, column);
92           }
93        });
94  
95        TableColumn typeMappingColumn = jTable1.getColumnModel().getColumn(3);
96        jTable1.getModel().addTableModelListener(new TableModelListener() {
97           //when the user selects a type mapping and hasn't yet set a DB name,
98           //make the DB name to the same value as the type mapping..
99           public void tableChanged(TableModelEvent e) {
100             int column = e.getColumn();
101             if (column != 3) return; //only interested in user selecting a typemapping
102 
103             int row = e.getFirstRow();
104             TableModel model = (TableModel) e.getSource();
105             String dbName = (String) model.getValueAt(row, 0);
106             if (!Database.ENTER_DB_NAME.equals(dbName)) return;
107             String typeMapping = (String) model.getValueAt(row, column);
108             model.setValueAt(typeMapping, row, 0);
109          }
110       });
111 
112       JComboBox comboBox = new JComboBox();
113       comboBox.addItem(SELECT);
114       String[] typeMappings = DatabaseManager.getInstance().getTypeMappings();
115       for (int i = 0; i < typeMappings.length; i++) {
116          comboBox.addItem(typeMappings[i]);
117       }
118 
119       typeMappingColumn.setCellEditor(new DefaultCellEditor(comboBox));
120    }
121 
122    private Vector getData() {
123       Vector data = new Vector();
124       ArrayList temp = new ArrayList();
125       temp.addAll(Arrays.asList(DatabaseManager.getInstance().getSupportedDatabases()));
126       temp.addAll(newDatabases);
127       Iterator dbs = temp.iterator();
128       while (dbs.hasNext()) {
129          Database db = (Database) dbs.next();
130          Vector vickie = new Vector();
131          vickie.add(db.getDbName());
132          vickie.add(db.getFilename());
133          vickie.add(db.getDriverClass());
134          vickie.add(db.getTypeMapping());
135          data.add(vickie);
136       }
137 
138       return data;
139    }
140 
141 
142    /*** This method is called from within the constructor to
143     * initialize the form.
144     * WARNING: Do NOT modify this code. The content of this method is
145     * always regenerated by the Form Editor.
146     */
147     private void initComponents() {//GEN-BEGIN:initComponents
148         jScrollPane1 = new javax.swing.JScrollPane();
149         jTable1 = new javax.swing.JTable();
150         jLabel1 = new javax.swing.JLabel();
151         jPanel1 = new javax.swing.JPanel();
152         addButtonPanel = new javax.swing.JPanel();
153         addButton = new javax.swing.JButton();
154         cancelButtonPanel = new javax.swing.JPanel();
155         CancelButton = new javax.swing.JButton();
156         saveButtonPanel = new javax.swing.JPanel();
157         OKButton = new javax.swing.JButton();
158 
159         setTitle("JAG Database Driver Manager");
160         addWindowListener(new java.awt.event.WindowAdapter() {
161             public void windowClosing(java.awt.event.WindowEvent evt) {
162                 exitForm(evt);
163             }
164         });
165 
166         jScrollPane1.setPreferredSize(new java.awt.Dimension(700, 300));
167         jTable1.setModel(new javax.swing.table.DefaultTableModel(
168             new Object [][] {
169                 {null, null, null, null},
170                 {null, null, null, null},
171                 {null, null, null, null},
172                 {null, null, null, null}
173             },
174             new String [] {
175                 "Title 1", "Title 2", "Title 3", "Title 4"
176             }
177         ));
178         jScrollPane1.setViewportView(jTable1);
179 
180         getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
181 
182         jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
183         jLabel1.setText("JAG Supported Databases");
184         jLabel1.setMaximumSize(new java.awt.Dimension(149, 32));
185         jLabel1.setMinimumSize(new java.awt.Dimension(149, 32));
186         jLabel1.setPreferredSize(new java.awt.Dimension(149, 32));
187         jLabel1.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
188         getContentPane().add(jLabel1, java.awt.BorderLayout.NORTH);
189 
190         jPanel1.setLayout(new java.awt.BorderLayout());
191 
192         addButton.setText("Add new JDBC driver..");
193         addButton.addActionListener(new java.awt.event.ActionListener() {
194             public void actionPerformed(java.awt.event.ActionEvent evt) {
195                 addButtonActionPerformed(evt);
196             }
197         });
198 
199         addButtonPanel.add(addButton);
200 
201         jPanel1.add(addButtonPanel, java.awt.BorderLayout.CENTER);
202 
203         CancelButton.setText("Cancel");
204         CancelButton.addActionListener(new java.awt.event.ActionListener() {
205             public void actionPerformed(java.awt.event.ActionEvent evt) {
206                 CancelButtonActionPerformed(evt);
207             }
208         });
209 
210         cancelButtonPanel.add(CancelButton);
211 
212         jPanel1.add(cancelButtonPanel, java.awt.BorderLayout.WEST);
213 
214         OKButton.setText("Save");
215         OKButton.addActionListener(new java.awt.event.ActionListener() {
216             public void actionPerformed(java.awt.event.ActionEvent evt) {
217                 OKButtonActionPerformed(evt);
218             }
219         });
220 
221         saveButtonPanel.add(OKButton);
222 
223         jPanel1.add(saveButtonPanel, java.awt.BorderLayout.EAST);
224 
225         getContentPane().add(jPanel1, java.awt.BorderLayout.SOUTH);
226 
227         pack();
228     }//GEN-END:initComponents
229 
230     private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addButtonActionPerformed
231       JagGenerator.logToConsole("Importing new database driver(s).  Please wait...");
232       final JFileChooser fileChooser =
233             new JFileChooser(JagGenerator.getFileChooserStartDir(DRIVER_IMPORT_FILECHOOSER));
234       ExtensionsFileFilter filter = new ExtensionsFileFilter(ACCEPTABLE_EXTENSIONS);
235       fileChooser.setDialogTitle("JDBC Driver Import: Choose a class / archive file..");
236       fileChooser.setFileFilter(filter);
237       int fileChooserStatus = fileChooser.showOpenDialog(null);
238       if (fileChooserStatus == JFileChooser.APPROVE_OPTION) {
239          File driverFile = fileChooser.getSelectedFile();
240          newDatabases.addAll(DatabaseManager.getInstance().addDrivers(driverFile));
241          JagGenerator.logToConsole("...Driver import complete.");
242          JagGenerator.setFileChooserStartDir(DRIVER_IMPORT_FILECHOOSER, driverFile);
243          refreshModel();
244 
245       } else {
246          JagGenerator.logToConsole("...aborted!");
247       }
248     }//GEN-LAST:event_addButtonActionPerformed
249 
250     private void CancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CancelButtonActionPerformed
251         hide();
252     }//GEN-LAST:event_CancelButtonActionPerformed
253 
254    private void OKButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_OKButtonActionPerformed
255       //We have to explicitly tell the table's cell editor to accept all 'partial' typed-in values
256       //(i.e. the value contained by the cell that was being edited when the OK button was pressed..
257       if (jTable1.getCellEditor() != null) {
258          jTable1.getCellEditor().stopCellEditing();
259       }
260       ArrayList databases = new ArrayList();
261       for (int row = 0; row < jTable1.getRowCount(); row++) {
262          Database db = new Database();
263          String dbName = (String) jTable1.getModel().getValueAt(row, 0);
264          db.setDbName(dbName);
265          db.setFilename((String) jTable1.getModel().getValueAt(row, 1));
266          db.setDriverClass((String) jTable1.getModel().getValueAt(row, 2));
267 
268          String mapping = (String) jTable1.getModel().getValueAt(row, 3);
269          if (SELECT.equals(mapping)) {
270             JOptionPane.showMessageDialog(this,
271                   "Please select a mapping for the new database driver from the drop-down list.",
272                   "Missing Type Mapping!!", javax.swing.JOptionPane.ERROR_MESSAGE);
273             return;
274          }
275 
276          db.setTypeMapping(mapping);
277          databases.add(db);
278       }
279 
280       DatabaseManager.getInstance().setDatabases(databases);
281       hide();
282 
283    }//GEN-LAST:event_OKButtonActionPerformed
284 
285    /*** Exit the Application */
286    private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
287       this.hide();
288    }//GEN-LAST:event_exitForm
289 
290     // Variables declaration - do not modify//GEN-BEGIN:variables
291     private javax.swing.JButton CancelButton;
292     private javax.swing.JButton OKButton;
293     private javax.swing.JButton addButton;
294     private javax.swing.JPanel addButtonPanel;
295     private javax.swing.JPanel cancelButtonPanel;
296     private javax.swing.JLabel jLabel1;
297     private javax.swing.JPanel jPanel1;
298     private javax.swing.JScrollPane jScrollPane1;
299     private javax.swing.JTable jTable1;
300     private javax.swing.JPanel saveButtonPanel;
301     // End of variables declaration//GEN-END:variables
302 
303 }