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>