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