1: import javax.swing.*;
2: import javax.swing.event.*;
3: import java.awt.event.*;
4: import java.awt.Dimension;
5: import java.awt.FlowLayout;
6: import java.awt.Image;
7: import java.sql.*;
8: import java.util.*;
9: import java.io.*;
10: /**
11: *
12: * <br>
13: * <h2>FileMaker Test (JDBC Database Driver Test)</h2>
14: * Main class :
15: * contains the main Frame, all event handlers etc
16: * <br>
17: * The Database access is made over DBBean class
18: * all other classes are just for the visualization of the data
19: * @version 0.1( first stable release)
20: * @author rogo
21: *
22: */
23: public class FM extends JFrame implements ActionListener, TableModelListener
24: {
25: /**
26: * The database Bean instance.
27: *
28: */
29: DBBean bean;
30:
31: /**
32: * box - Tablenames
33: */
34:
35: JComboBox box;
36:
37: /**
38: * box2 - Layout names
39: */
40:
41: JComboBox box2;
42: /**
43: * box3 - Database URLs
44: */
45:
46: JComboBox box3;
47: TableComponent table;
48: JTextField queryField = new JTextField("select titel from HowTos", 60);
49: Vector tables = new Vector();
50: Vector layouts = new Vector();
51:
52: FM fm = this;
53: boolean noDBUpdate = false;
54: int id = 0;
55: /**
56: * The result window used for query results
57: */
58: ResultWindow window;
59: static FM fmInstance;
60: static String url = "jdbc:fmpro:http://141.14.237.42";//"jdbc:odbc:rogo2";
61: static String url2 = "jdbc:postgresql://chrysantheme2/postgres";
62:
63: JPanel topPanel, contentPanel;
64: int oldWidth = 0, oldHeight = 0;
65: boolean resize = true;
66: static FileWriter logFile;
67: /**
68: * tries to connect to database specified in url-Variable.
69: * initializes all GUI components, then fails throws an exception
70: *
71: */
72: public FM() throws Exception
73: {
74:
75: /* DBFront rock = new DBFront();
76: rock.setURL("jdbc:odbc:rogo2");
77: rock.setQuery("select productname,groupid from products");
78: rock.query();
79: System.out.println(rock.getNextRow());
80: System.out.println(rock.getNextRow());
81: System.out.println(rock.getNextRow());
82: System.out.println(rock.getNextRow());
83: System.out.println(rock.getColumnNames());
84: rock.setQuery("select productname from products");
85: rock.query();
86: System.out.println(rock.getNextRow());
87: System.out.println(rock.getNextRow());
88: System.out.println(rock.getNextRow());
89: System.out.println(rock.getNextRow());
90: System.out.println(rock.getColumnNames());
91: */
92: Image local = getToolkit().getImage(getClass().getResource("icons/fm.jpg"));
93: if (local != null);
94: setIconImage(local);
95: bean = new DBBean();
96: //tables = bean.getTableNames();
97: //Collections.sort(tables);
98: //layouts = bean.getLayoutNames((String) tables.get(0));
99: //Collections.sort(layouts);
100: box2 = new JComboBox();
101: box3 = new JComboBox(new String[] { "jdbc:fmpro:http://localhost", "jdbc:fmpro:http://141.14.237.42","jdbc:fmpro:http://141.14.237.74:8050", "jdbc:odbc:rogo","jdbc:postgresql://erebos/test" });
102: box3.setEditable(true);
103:
104: // Vector[] data = bean.getQueryData((String) tables.get(0));
105: table = new TableComponent();
106: // table.tableModel.setDataVector(data[0], data[1]);
107: // table.tableModel.setRowCount((table.screenSize.height) / 20);
108: // table.enlarge(getWidth(), getHeight());
109:
110: //id = table.tableModel.findColumn("ID");
111:
112: //System.out.println("ID is at " + id);
113:
114: box = new JComboBox(tables);
115: box.addActionListener(this);
116: box2.addActionListener(this);
117: box3.addActionListener(this);
118:
119: contentPanel = new JPanel();
120: contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
121: topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 5));
122: topPanel.add(Box.createRigidArea(new Dimension(10, 0)));
123: topPanel.add(new JLabel("Choose table: "));
124: topPanel.add(box);
125: topPanel.add(Box.createRigidArea(new Dimension(10, 0)));
126: topPanel.add(new JLabel("Choose layout: "));
127: topPanel.add(box2);
128: topPanel.add(Box.createRigidArea(new Dimension(10, 0)));
129: topPanel.add(new JLabel("Choose dbURL: "));
130: topPanel.add(box3);
131:
132: JPanel queryPanel = new JPanel();
133: queryPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
134: //topPanel.add(Box.createRigidArea(new Dimension(10, 0)));
135: queryPanel.add(new JLabel("Enter query: "));
136: queryPanel.add(Box.createRigidArea(new Dimension(5, 0)));
137:
138: queryPanel.add(queryField);
139: queryPanel.add(Box.createRigidArea(new Dimension(10, 0)));
140: JButton makeQuery = new JButton("make Query");
141: queryPanel.add(makeQuery);
142: makeQuery.addActionListener(fm);
143: queryField.addActionListener(fm);
144: contentPanel.add(topPanel);
145: contentPanel.add(queryPanel);
146: //System.out.println(contentPanel.getPreferredSize());
147: getContentPane().add(contentPanel, "North");
148: getContentPane().add(table);
149: this.addWindowListener(new WindowAdapter()
150: {
151: public void windowClosing(WindowEvent e)
152: {
153: try
154: {
155: closeLog();
156: } catch (Exception e5)
157: {
158: System.out.println("Error while closing logfile " + e5);
159: }
160: System.exit(0);
161: }
162: });
163: addComponentListener(new ComponentAdapter()
164: {
165: public void componentResized(ComponentEvent e)
166: {
167:
168: // System.out.println("Window resized " + getWidth() + " " + getHeight());
169: //Dimension size=table.tableScroller.getPreferredSize();
170: //table.setAutoResizeMode(table.AUTO_RESIZE_OFF);
171: // if (table.tableScroller.getPreferredSize().width < getWidth() && fm.isVisible())
172: // table.sizeToFit(getWidth(), getHeight());
173: if (oldWidth != getWidth() || oldHeight != getHeight())
174: {
175: table.enlarge(getWidth(), getHeight());
176:
177: Dimension dim = table.table.getPreferredSize();
178: int size = contentPanel.getPreferredSize().height + new JScrollBar().getPreferredSize().height + new JMenuBar().getPreferredSize().height + 10;
179: table.tableScroller.setPreferredSize(new Dimension(getWidth() - 15, getHeight() - size));
180: Dimension d2 = table.tableScroller.getPreferredSize();
181:
182: oldWidth = getWidth();
183: oldHeight = getHeight();
184: // System.out.println("fit" + getWidth() + " " + oldWidth);
185: //table.table.setPreferredScrollableViewportSize(dim);
186:
187: table.setPreferredSize(new Dimension(d2.width + 15, d2.height + 5));
188: table.table.revalidate();
189: table.tableScroller.revalidate();
190: table.revalidate();
191: if (getHeight() > table.table.getPreferredSize().height + (2 * size))
192: setSize(getWidth(), table.table.getPreferredSize().height + 2 * size);
193: // System.out.println("size" + size);
194: }
195: repaint();
196: setTitle("Filemaker Database Test - Table " + fm.box.getSelectedItem());
197:
198: }
199: });
200: setMenu();
201: setSize(700, 600);
202: pack();
203:
204: setVisible(true);
205:
206: // repaint();
207:
208: }
209:
210: /**
211: *
212: */
213: public static void main(String[] args)
214: {
215: try
216: {
217: System.setErr(System.out);
218: if (System.getProperty("os.name").startsWith("W"))
219: javax.swing.UIManager.setLookAndFeel(new com.sun.java.swing.plaf.windows.WindowsLookAndFeel());
220:
221: fmInstance = new FM();
222: fmInstance.table.tableModel.addTableModelListener(fmInstance);
223: if (!new File("./html").exists())
224: new File("./html").mkdirs();
225: logFile = new FileWriter("./html/index.html");
226: openLog();
227: // Statement stm = fm.bean.getConnection().createStatement();
228: // stm.executeUpdate("DELETE FROM \""+fm.tables.get(0)+"\" WHERE \"erstellt von\"='rogo') ");
229: // stm.executeUpdate("INSERT INTO \""+fm.tables.get(0)+"\" (TITLE,) VALUES ('Hier kommt Rogo') ");
230: // stm.executeUpdate("UPDATE \""+fm.tables.get(1)+"\" SET \"Year\"='2001' WHERE ID='IT00002' ");
231:
232: // this.setDataVector(tableData, columnNames);
233: // System.out.println(tableData + " " + columnNames);
234:
235: } catch (Exception e)
236: {
237: JOptionPane pane = new JOptionPane(e.getMessage() + " \n URL: " + url, JOptionPane.ERROR_MESSAGE);
238:
239: JDialog dialog = pane.createDialog(null, " Exception occured while connecting");
240: e.printStackTrace();
241: dialog.addWindowListener(new WindowAdapter()
242: {
243: public void windowClosing(WindowEvent e)
244: {
245: System.exit(0);
246: }
247: });
248: dialog.addComponentListener(new ComponentAdapter()
249: {
250:
251: public void componentHidden(ComponentEvent e)
252: {
253:
254: System.exit(0);
255: }
256: });
257: dialog.show();
258: }
259: }
260: public void actionPerformed(ActionEvent e)
261: {
262: String command = e.getActionCommand();
263: // System.out.println("command " + command);
264: if (command == "comboBoxEdited")
265: {
266: System.out.println("hey" + box3.getSelectedItem());
267: ((DefaultComboBoxModel) box3.getModel()).insertElementAt(box3.getSelectedItem(), 0);
268: }
269: if (command == "comboBoxChanged")
270: {
271: try
272: {
273:
274: if (e.getSource() == box3)
275: {
276: String url = box3.getSelectedItem().toString();
277: bean.url = (url != null) ? url : bean.url;
278: bean.connection = null;
279: bean.getConnection();
280: tables = bean.getTableNames();
281: Collections.sort(tables);
282: layouts = bean.getLayoutNames((String) tables.get(0));
283: Collections.sort(layouts);
284: box.setModel(new DefaultComboBoxModel(tables));
285: box2.setModel(new DefaultComboBoxModel(layouts));
286:
287: }
288: if (e.getSource() != box2)
289: box2.setModel(new DefaultComboBoxModel(bean.getLayoutNames(box.getSelectedItem().toString())));
290: String query = "select * from " + bean.getQC() + box.getSelectedItem() + bean.getQC();
291: if (box2.getSelectedItem() != "")
292: query += " layout " + bean.getQC() + box2.getSelectedItem() + bean.getQC();
293:
294: Vector[] data = bean.getQueryData(query, bean.getMaxHits());
295: noDBUpdate = true;
296: if (data[0].isEmpty() || data[1].isEmpty())
297: {
298: if (!data[0].isEmpty())
299: {
300: data[0] = new Vector();
301: Vector row = new Vector();
302: row.add("Error empty layout!!!");
303: data[0].addElement(row);
304: }
305: // if (data[1].isEmpty())
306: {
307: data[1] = new Vector();
308:
309: data[1].addElement("Error empty layout!!!");
310: }
311: }
312: table.tableModel.setDataVector(data[0], data[1]);
313: int numRows = table.screenSize.height / 20;
314: table.tableModel.setRowCount((numRows > table.tableModel.getRowCount()) ? numRows : table.tableModel.getRowCount());
315: noDBUpdate = false;
316: //table.vergroessern(getWidth(),getHeight());
317: id = table.tableModel.findColumn("ID");
318: // System.out.println("ID is at " + id);
319: setTitle("Filemaker Database Test - Table " + fm.box.getSelectedItem());
320: pack();
321:
322: } catch (Exception e2)
323: {
324: }
325: }
326: if (command == "show Driver features")
327: {
328: ResultWindow result = new ResultWindow(this);
329: try
330: {
331: Vector[] vecs = bean.TestDB(bean.getConnection().getMetaData());
332: result.updateResult(vecs[0], vecs[1]);
333: // result.pack();
334: result.title = "Database features";
335: result.setVisible(true);
336: String name = result.writeResult();
337: if (result.counter == 1)
338: appendLog(result.title, name);
339: } catch (Exception e2)
340: {
341: }
342: }
343: if (command.equals("make Query"))
344: testQuery(queryField.getText());
345: if (e.getSource() == queryField)
346: testQuery(queryField.getText());
347:
348: }
349: /**
350: * Test the specified Query and display the result
351: */
352: public void testQuery(String query)
353: {
354: if (query == "")
355: query = "select Titel,Standort,id from HowTos";
356:
357: if (window == null)
358: window = new ResultWindow(fm);
359: for (int i = 0; i < tables.size(); ++i)
360: if (query.toLowerCase().indexOf(((String) tables.get(i)).toLowerCase()) >= 0)
361: {
362: window.title = " Table " + (String) tables.get(i) + " - Query done: " + query;
363: break;
364: } else
365: window.title = "Error! - No valid tablename found";
366:
367: try
368: {
369: if ((query.toLowerCase().indexOf("insert") >= 0) || (query.toLowerCase().indexOf("delete") >= 0) || (query.toLowerCase().indexOf("alter") >= 0) || (query.toLowerCase().indexOf("update") >= 0))
370: {
371: Statement stm = fm.bean.getConnection().createStatement();
372: stm.executeUpdate(query);
373: Vector vec = new Vector();
374: Vector vec2 = new Vector();
375: Vector vec3 = new Vector();
376: vec2.add(query);
377: vec3.add(vec2);
378: vec.add("Insert, update, etc done! No results available");
379: // vec.add("no Results were produced");
380:
381: window.updateResult(vec3, vec);
382: window.pack();
383: window.setVisible(true);
384:
385: } else
386: {
387: Vector[] vecs = bean.getQueryData(query, bean.getMaxHits());
388: if (vecs[1].isEmpty())
389: throw new Exception("Wrong columnname");
390: window.updateResult(vecs[0], vecs[1]);
391: window.pack();
392: String name = window.writeResult();
393: appendLog(window.title, name);
394: }
395: window.setVisible(true);
396: } catch (Exception e)
397: {
398: System.out.println("Exception occured");
399: System.out.println(e.getMessage());
400: Vector vec = new Vector();
401: Vector vec2 = new Vector();
402: Vector vec3 = new Vector();
403: vec2.add(e.getMessage());
404: vec3.add(vec2);
405: vec.add("Exception occured! No results available");
406: //vec.add("no Results were produced");
407:
408: window.updateResult(vec3, vec);
409: window.pack();
410: window.setVisible(true);
411:
412: }
413:
414: }
415: /**
416: * invoked then the user changes the table or the tableModel changes
417: */
418: public void tableChanged(TableModelEvent e)
419: {
420: // if (e.getType() == e.INSERT)
421: //System.out.println("Insert done");
422: // if (e.getType() == e.UPDATE)
423: // System.out.println("Update done");
424: //if (e.getType() == e.DELETE)
425: //System.out.println("Delete done");
426: if (e.getType() == e.UPDATE && !noDBUpdate)
427: {
428: int row = e.getFirstRow(), col = e.getColumn();
429: String columnName = table.tableModel.getColumnName(col);
430: if (id == -1)
431: return;
432: Object test = table.tableModel.getValueAt(row, id);
433: String idVal = (test == null) ? "" : test.toString();
434: String value = table.tableModel.getValueAt(row, col).toString();
435:
436: System.out.println("Got in " + columnName + " " + idVal + " " + box.getSelectedItem());
437: if (table.tableModel.getValueAt(row, col) instanceof Vector)
438: {
439: System.out.println("found a Vector");
440: return;
441: }
442: try
443: {
444: Statement stm = bean.getConnection().createStatement();
445: // stm.executeUpdate("DELETE FROM \""+fm.tables.get(0)+"\" WHERE \"erstellt von\"='rogo') ");
446:
447: if (idVal == "")
448: stm.executeUpdate("INSERT INTO " + bean.getQC() + box.getSelectedItem() + bean.getQC() + " (" + bean.getQC() + columnName + bean.getQC() + ") VALUES ('" + value + "') ");
449: else
450: stm.executeUpdate("UPDATE " + bean.getQC() + box.getSelectedItem() + bean.getQC() + " SET " + bean.getQC() + columnName + bean.getQC() + "='" + value + "' WHERE ID='" + idVal + "' ");
451: } catch (Exception e2)
452: {
453: System.out.println(e2.getMessage());
454: }
455: }
456: }
457:
458: /**
459: * initialize the menubar
460: */
461: private void setMenu()
462: {
463: JMenuBar menubar = new JMenuBar();
464: JMenu menu = new JMenu("Options");
465: JMenuItem item = new JMenuItem("show Driver features");
466: item.addActionListener(fm);
467: menu.add(item);
468: menubar.add(menu);
469: menu.setBackground(fm.getBackground());
470: menubar.setBackground(fm.getBackground());
471: setJMenuBar(menubar);
472: }
473: /**
474: * open the log file (index.html)
475: */
476:
477: public static void openLog() throws Exception
478: {
479:
480: StringBuffer buff = new StringBuffer();
481: buff.append("<html>");
482: buff.append("<head>");
483: buff.append("\n<title>");
484: buff.append("FileMaker Test");
485: buff.append("</title>\n");
486: buff.append("</head>\n");
487:
488: buff.append("<body>\n");
489: buff.append("<center>\n");
490: buff.append("\n<h3>");
491: buff.append("FileMaker Test");
492: buff.append("</h3>\n");
493:
494: logFile.write(TableComponent.convertUml(buff).toString());
495: logFile.flush();
496: }
497: /**
498: * Append one entry to the log file(index.html)
499: */
500: public static void appendLog(String entry, String name) throws Exception
501: {
502: logFile.write("<a href=\"./" + name.substring(name.lastIndexOf("/") + 1) + "\">");
503: logFile.write(entry + "</a>");
504: logFile.write("<br>\n<br>\n");
505: logFile.flush();
506: }
507: /**
508: * closes the log file invoked then the application closes
509: */
510: public static void closeLog() throws Exception
511: {
512: logFile.write("\n</body>");
513: logFile.write("\n</html>");
514:
515: logFile.close();
516: }
517: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>