1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
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
98
99 public void tableChanged(TableModelEvent e) {
100 int column = e.getColumn();
101 if (column != 3) return;
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() {
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 }
229
230 private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {
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 }
249
250 private void CancelButtonActionPerformed(java.awt.event.ActionEvent evt) {
251 hide();
252 }
253
254 private void OKButtonActionPerformed(java.awt.event.ActionEvent evt) {
255
256
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 }
284
285 /*** Exit the Application */
286 private void exitForm(java.awt.event.WindowEvent evt) {
287 this.hide();
288 }
289
290
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
302
303 }