File:  [Repository] / FM2SQL / src / FM.java
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Mon Feb 7 13:01:58 2005 UTC (21 years, 3 months ago) by rogo
Branches: MAIN
CVS tags: HEAD
*** empty log message ***

    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:  */
   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.setVisible(true);
  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();
  351:         if (ResultWindow.counter == 1)
  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");
  440:     if (e.getType() == TableModelEvent.UPDATE && !noDBUpdate)
  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>