File:  [Repository] / FM2SQL / Attic / FM2SQL.java
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Fri Dec 5 11:46:39 2003 UTC (20 years, 6 months ago) by rogo
Branches: MAIN
CVS tags: HEAD
Initial revision

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.TableModel;

import Convert.DataBase;

import java.awt.event.*;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.*;
import java.sql.*;
import java.util.*;
import java.io.*;
/**
 *
 * <br>
 * <h2>FileMaker Test (JDBC Database Driver Test)</h2>
 * Main class :
 * contains the main Frame, all event handlers etc
 * <br>
 * The Database access is made over DBBean class
 * all other classes are just for the visualization of the data
 *  @version 0.2( first stable release)
 *  @author rogo
 *
 */
public class FM2SQL extends JFrame implements ActionListener, TableModelListener
{
  /**
  * The database Bean instance.
  *
  */
  DBBean bean;
  /**
   * The database destination Bean instance.
   *
   */
  DBBean destBean;

  /**
   *  box - Tablenames
   */

  JComboBox box;
  /**
   *  tList - Tablenames to choose from
   */

  JList tList = new JList(new String[] { "no database", "connection", "" });
  JList tListDest = new JList(new String[] { "no database connection", "", "" });

  /**
   *  box2 - Layout names
   */

  JComboBox box2;
  /**
  *  box3 - Database URLs
  */
  JComboBox box3;
  /**
  *  box4 - Database URLs
  */
  JComboBox box4;

  TableComponent table, tC;
  Vector tables = new Vector();
  Vector layouts = new Vector();
  JPanel listPanel;
  JPanel topPanel, contentPanel;
  FM2SQL fm = this;
  boolean noDBUpdate = false;
  boolean noUserUpdate = false;
  int id = 0;
  static boolean debug = false;
  /**
  * The result window used for query results
  */
  MultiResultWindow window;
  /**
   * The result window used for query results
   */
  MultiResultWindow windowDest;

  static FM2SQL fmInstance;
  static String url = "jdbc:fmpro:http://141.14.237.42";
  JButton showTables = new JButton(), showTables1 = new JButton();
  JButton convert  = new JButton();
  JButton dropTables  = new JButton();

  int oldWidth = 0, oldHeight = 0;
  boolean resize = true;
  static FileWriter logFile;
  Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
  JFileChooser configExportFileChooser;
  JFileChooser configImportFileChooser;
 
  /**
   * tries to connect to database specified in url-Variable.
   * initializes all GUI components, then fails throws an exception
   *
   */
  public FM2SQL() throws Exception
  {
    Image local = getToolkit().getImage(getClass().getResource("icons/fm.jpg"));
    if (local != null);
    setIconImage(local);
    bean = new DBBean();
    destBean = new DBBean();
    box2 = new JComboBox();
    box3 = new JComboBox(new String[] { "jdbc:fmpro:http://141.14.237.74:8050", "jdbc:fmpro:http://localhost", "jdbc:postgresql://foxridge/test" });
    box3.setEditable(true);
    box4 = new JComboBox(new String[] {"jdbc:postgresql://foxridge/test","jdbc:postgresql://erebos/test1" });
    box4.setEditable(true);
    box4.addActionListener(this);
    table = new TableComponent();
    box = new JComboBox(tables);
    box.addActionListener(this);
    box2.addActionListener(this);
    box3.addActionListener(this);

    contentPanel = new JPanel();
    contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
    topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 5));
    topPanel.add(Box.createRigidArea(new Dimension(10, 0)));
    topPanel.add(new JLabel("FileMaker DB "));
    topPanel.add(new JLabel("PostgresSQL "));
    //tListDest.setMinimumSize(new Dimension(120, 250));
    //tListDest.setMaximumSize(new Dimension(230, 250));
    //tListDest.setPreferredSize(new Dimension(230, 250));

    box3.setMinimumSize(new Dimension(200, 20));
    box3.setMaximumSize(new Dimension(320, 20));
    box3.setPreferredSize(new Dimension(320, 20));
    box4.setMinimumSize(new Dimension(200, 20));
    box4.setMaximumSize(new Dimension(320, 20));
    box4.setPreferredSize(new Dimension(330, 20));

    tC = new TableComponent();
    tC.sizeToFit(450, 250);
    tC.tableModel.addTableModelListener(this);
    JPanel dataBasePanel = new JPanel();
    dataBasePanel.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 2));
    dataBasePanel.add(Box.createRigidArea(new Dimension(10, 0)));
    dataBasePanel.add(new JLabel("Choose src database: "));
    dataBasePanel.add(box3);
    dataBasePanel.add(Box.createRigidArea(new Dimension(10, 0)));
    dataBasePanel.add(new JLabel("Choose dest database : "));
    dataBasePanel.add(Box.createRigidArea(new Dimension(5, 0)));

    dataBasePanel.add(box4);
    dataBasePanel.add(Box.createRigidArea(new Dimension(10, 0)));
    listPanel = new JPanel();
    listPanel.setLayout(new java.awt.GridBagLayout());
    java.awt.GridBagConstraints gbc = new java.awt.GridBagConstraints();
    JScrollPane pane = new JScrollPane(tList);
    tC.tableScroller.setPreferredSize(new Dimension(450, 265));
    tC.table.revalidate();
    tC.setMinimumSize(tC.tableScroller.getPreferredSize());
    tC.setMaximumSize(tC.tableScroller.getPreferredSize());

    //gbc.gridx=GridBagConstraints.RELATIVE;   
    gbc.gridx = 0;
    gbc.weightx = 1.0;
    gbc.weighty = 0.0;
    gbc.gridwidth = 2;
    gbc.gridheight = 1;
    gbc.anchor = GridBagConstraints.NORTHWEST;
    listPanel.add(new JLabel("  select Tables to Convert  ", JLabel.LEFT), gbc);
    gbc.gridx = 2;
    listPanel.add(new JLabel("  Tables in database  ", JLabel.CENTER), gbc);

    gbc.anchor = GridBagConstraints.WEST;
    gbc.gridy = 1;
    gbc.gridx = 0;
    gbc.gridwidth = 1;
    gbc.weightx = 0.0;
    listPanel.add(tC, gbc);
    JScrollPane paneDest = new JScrollPane(tListDest);
    showTables1 = new JButton("show Tables");
    showTables1.setActionCommand("show Tables source");
    gbc.anchor = GridBagConstraints.NORTH;
    gbc.weightx = 0.0;
    gbc.gridx = 1;
    listPanel.add(showTables1, gbc);
    paneDest.setPreferredSize(new Dimension(250, 265));
    paneDest.setMinimumSize(paneDest.getPreferredSize());
    paneDest.setMaximumSize(paneDest.getPreferredSize());
    gbc.anchor = GridBagConstraints.WEST;
    gbc.gridy = 1;
    gbc.gridx = 2;
    gbc.weightx = 0.2;
    listPanel.add(paneDest, gbc);
    JPanel buttonPanel = new JPanel();
    buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
    convert = new JButton("Convert Tables");
    showTables = new JButton("show Tables");
    dropTables = new JButton("drop Tables");
    //   System.out.println(convert.getPreferredSize());
    showTables.setMinimumSize(convert.getPreferredSize());
    dropTables.setMinimumSize(convert.getPreferredSize());
    showTables.setMaximumSize(convert.getPreferredSize());
    dropTables.setMaximumSize(convert.getPreferredSize());
    showTables.setPreferredSize(convert.getPreferredSize());
    dropTables.setPreferredSize(convert.getPreferredSize());

    showTables.addActionListener(fm);
    showTables1.addActionListener(fm);

    buttonPanel.add(showTables);
    buttonPanel.add(convert);
    convert.addActionListener(fm);
    dropTables.addActionListener(fm);
    buttonPanel.add(dropTables);
    gbc.gridx = 3;
    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.gridy = 1;
    gbc.weightx = 1.0;
    listPanel.add(buttonPanel, gbc);
    contentPanel.add(dataBasePanel);
    contentPanel.add(listPanel);
    listPanel.setMaximumSize(new Dimension(getPreferredSize().width, 550));
    listPanel.setMinimumSize(new Dimension(getPreferredSize().width, 150));
    listPanel.setPreferredSize(new Dimension(getPreferredSize().width, 350));

    getContentPane().add(contentPanel, "Center");
    this.addWindowListener(new WindowAdapter()
    {
      public void windowClosing(WindowEvent e)
      {
        System.exit(0);
      }
    });
    addComponentListener(new ComponentAdapter()
    {
      public void componentResized(ComponentEvent e)
      {

        if (oldWidth != getWidth() || oldHeight != getHeight())
        {
          table.sizeToFit(getWidth(), getHeight());

          Dimension dim = table.table.getPreferredSize();
          int size = contentPanel.getPreferredSize().height + new JScrollBar().getPreferredSize().height + new JMenuBar().getPreferredSize().height + 10;

          table.tableScroller.setPreferredSize(new Dimension(getWidth() - 15, getHeight() - size));
          Dimension d2 = table.tableScroller.getPreferredSize();

          oldWidth = getWidth();
          oldHeight = getHeight();

          table.setPreferredSize(new Dimension(d2.width + 15, d2.height + 5));
          table.table.revalidate();
          table.tableScroller.revalidate();
          table.revalidate();
          if (getHeight() > table.table.getPreferredSize().height + (2 * size))
            setSize(getWidth(), table.table.getPreferredSize().height + 2 * size);
          // System.out.println("size" + size);
        }
        listPanel.setMaximumSize(new Dimension(getPreferredSize().width - 5, 550));
        listPanel.setMinimumSize(new Dimension(getPreferredSize().width - 5, 200));
        listPanel.setPreferredSize(new Dimension(getPreferredSize().width - 5, 370));

        ((JPanel) getContentPane()).revalidate();
        repaint();
        setTitle("Filemaker To Postgres Conversion Tool ");

      }
    });

    setMenu();
    //setSize(800, 600);
    pack();
    setLocation((screenSize.width - getWidth()) / 2, (screenSize.height - getHeight()) / 2);
    //setVisible(true);
    validate();

    // repaint();

  }

  /**
   *
   */
  public static void main(String[] args)
  {
    try
    {
      System.setErr(System.out);
//         Properties prop = System.getProperties();
  // Enumeration enum= prop.keys();
//  while(enum.hasMoreElements())
//System.out.println(enum.nextElement());
     
      if (System.getProperty("os.name").startsWith("W"))
        // javax.swing.UIManager.setLookAndFeel(
        //    new com.sun.java.swing.plaf.windows.WindowsLookAndFeel());
        javax.swing.UIManager.put("Table.focusCellHighlightBorder", new javax.swing.border.LineBorder(java.awt.Color.black));
      javax.swing.UIManager.put("Table.focusCellBackground", new java.awt.Color(227, 227, 227, 127));

      fmInstance = new FM2SQL();
      fmInstance.table.tableModel.addTableModelListener(fmInstance);
      fmInstance.setVisible(true);
      /*   if (!new File("./html").exists())
           new File("./html").mkdirs();
         logFile = new FileWriter("./html/index.html");
         openLog();
      */
    } catch (Exception e)
    {
      JOptionPane pane = new JOptionPane(e.getMessage() + "  \n URL: " + url, JOptionPane.ERROR_MESSAGE);

      JDialog dialog = pane.createDialog(null, " Exception occured while connecting");
      e.printStackTrace();
      dialog.addWindowListener(new WindowAdapter()
      {
        public void windowClosing(WindowEvent e)
        {
          System.exit(0);
        }
      });
      dialog.addComponentListener(new ComponentAdapter()
      {

        public void componentHidden(ComponentEvent e)
        {

          System.exit(0);
        }
      });
      dialog.show();
    }
  }
  public void actionPerformed(ActionEvent e)
  {
    String command = e.getActionCommand();
    if (debug)
      System.out.println("command " + command);
    if (command == "comboBoxEdited")
    {
      Object src = e.getSource();
      if (src == box3)
      {
        if (debug)
          System.out.println("hey" + box3.getSelectedItem());
        Object insObj =box3.getSelectedItem();
        ((DefaultComboBoxModel) box3.getModel()).removeElement(insObj);
   
        ((DefaultComboBoxModel) box3.getModel()).insertElementAt(insObj, 0);
        box3.setSelectedItem(insObj);
      } else if (src == box4)
      {
        if (debug)
          System.out.println("hey" + box4.getSelectedItem());
        //((DefaultComboBoxModel) box4.getModel()).insertElementAt(box4.getSelectedItem(), 0);
        try
        {
          String selected = (String) box4.getSelectedItem();
          destBean.setConnection(selected);
          Vector catalogs = destBean.getCatalogs();
          Vector urls = new Vector();
          for (int i = 0; i < catalogs.size(); ++i)
          {
            urls.add(destBean.url.substring(0, destBean.url.lastIndexOf("/") + 1) + catalogs.get(i));
          }
          box4.setModel(new DefaultComboBoxModel(urls));
          box4.setSelectedItem(selected);
        } catch (Exception e5)
        {
        }
      }
    }
    if (command == "comboBoxChanged")
    {
      try
      {
        //System.out.println("hallo " + (e.getSource() == box3));

        Object src = e.getSource();
        if (src == box3&&!noUserUpdate)
        {
          Thread thread = new Thread()
          {
            public void run()
            {

              try
              {
                PasswordDialog dialog = new PasswordDialog(fmInstance, bean);
                dialog.setLocationRelativeTo(box3);
                dialog.thread = Thread.currentThread();
                fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                fmInstance.setEnabled(false);
                dialog.setVisible(true);
                String url = box3.getSelectedItem().toString();
                bean.url = (url != null) ? url : bean.url;
                bean.connection = null;
                bean.getConnection();
                tables = bean.getTableNames();
                fillTable();
                fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
								fmInstance.setEnabled(true);
                //  System.out.println("hallo" + tables + " ");
              } catch (Exception e5)
              {
                ByteArrayOutputStream b = new ByteArrayOutputStream();
                PrintStream stream = new PrintStream(b);
                e5.printStackTrace(stream);
                fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
								fmInstance.setEnabled(true);
                Vector header = new Vector();
                header.add("no database");
                header.add("connection");
                Vector rows = new Vector();
                //rows.add(header);
                noDBUpdate=true;
                tC.tableModel.setDataVector(rows, header);
                tC.tableModel.setRowCount(20);
                tC.revalidate();
                tC.tableModel.fireTableDataChanged();
                noDBUpdate=false;
                showErrorDialog(b.toString(), "Error occured !");
              }
            }
          };
          thread.start();
        } else if (src == box4&&!noUserUpdate)
        {
          Thread thread = new Thread()
          {
            public void run()
            {

              try
              {

                PasswordDialog dialog = new PasswordDialog(fmInstance, destBean);
                dialog.setLocationRelativeTo(box4);
                dialog.thread = Thread.currentThread();
                fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
								fmInstance.setEnabled(false);
                dialog.setVisible(true);
                destBean.setConnection((String) box4.getSelectedItem());
                DefaultListModel model = new DefaultListModel();
                Vector tables = destBean.getTableNames();
                for (int j = 0; j < tables.size(); ++j)
                  model.addElement(tables.get(j));
                //  System.out.println("hallo" + tables + " ");
                tListDest.setModel(model);
                //  System.out.println("hallo" + tables + " ");
                fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
								fmInstance.setEnabled(true);
              } catch (Exception e5)
              {
                ByteArrayOutputStream b = new ByteArrayOutputStream();
                PrintStream stream = new PrintStream(b);
                e5.printStackTrace(stream);
								fmInstance.setEnabled(true);
                fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                DefaultListModel model = new DefaultListModel();
                model.addElement("no database connection");
                tListDest.setModel(model);

                showErrorDialog(b.toString(), "Error occured !");
              }
            }
          };
          thread.start();

        }
        setTitle("Filemaker To Postgres Conversion Tool ");
        // pack();

      } catch (Exception e4)
      {
        ByteArrayOutputStream b = new ByteArrayOutputStream();
        PrintStream stream = new PrintStream(b);
        e4.printStackTrace(stream);
        showErrorDialog(b.toString(), "Open of table failed");

      }
    }
    if (command == "show Driver features")
    {
      ResultWindow result = new ResultWindow(this);
      try
      {
        Vector[] vecs = bean.TestDB(bean.getConnection().getMetaData());
        result.updateResult(vecs[0], vecs[1]);
        // result.pack();
        result.title = "Database features";
        result.setVisible(true);
        String name = result.writeResult();
      } catch (Exception e2)
      {
      }
    }
   //writing config
    if (command.equals("export XML Config"))
    {
      if (configExportFileChooser == null)
      {
        configExportFileChooser = new JFileChooser();
        configExportFileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        configExportFileChooser.setFileFilter(new XMLFilter());
        configExportFileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
        configExportFileChooser.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent e2)
          {
            System.out.println(e2.getActionCommand());
            if (!e2.getActionCommand().toString().equals("ApproveSelection"))
              return;

            Thread thread = new Thread()
            {
              public void run()
              {
                File configFile = configExportFileChooser.getSelectedFile();
                writeConfig(configFile.toString());

              }
            };
            thread.start();

          }
        });
      }
      configExportFileChooser.rescanCurrentDirectory();
      configExportFileChooser.showDialog(fmInstance, " Save ");
   
    }
    if (command.equals("import XML Config"))
    {
      if (configImportFileChooser == null)
      {
        configImportFileChooser = new JFileChooser();
        configImportFileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        configImportFileChooser.setFileFilter(new XMLFilter());
        configImportFileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
        configImportFileChooser.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent e2)
          {
            System.out.println(e2.getActionCommand());
            if (!e2.getActionCommand().toString().equals("ApproveSelection"))
              return;

            Thread thread = new Thread()
            {
              public void run()
              {
                File configFile = configImportFileChooser.getSelectedFile();
                readXMLConfig(configFile.toString());

              }
            };
            thread.start();

          }
        });
      }
      configImportFileChooser.rescanCurrentDirectory();
      configImportFileChooser.showDialog(fmInstance, " Open ");
   
    }
      
     
    if (command.equals("Convert Tables"))
    {

      Thread thread = new Thread()
      {
        public void run()
        {
          setEnabled(false);
          convert();
          setEnabled(true);
        }

      };
      thread.start();
    }
    if (command.equals("show Tables"))
    {
      Thread thread = new Thread()
      {
        public void run()
        {
					fmInstance.setEnabled(false);
          boolean visible = showTable(1);
          window.validate();
          window.setVisible(visible);
					fmInstance.setEnabled(true);

        }
      };
      thread.start();
      //  System.out.println("hello");

    }
    if (command.equals("show Tables source"))
    {
      Thread thread = new Thread()
      {
        public void run()
        {
					fmInstance.setEnabled(false);
          boolean visible = showTable(0);
          window.validate();
          window.setVisible(visible);
					fmInstance.setEnabled(true);
        }
      };
      thread.start();
      //		System.out.println("hello"+thread);

    }

    if (command.equals("drop Tables"))
    {
      Thread thread = new Thread()
      {
        public void run()
        {
          dropTable();
        }
      };
      thread.start();
    }
  }
  /**
   * Copys the content of source to destination and makes new table if necessary
   */
  public void convert()
  {

    Vector vectors[] = getListFromTable();
    Convert.user = bean.user;
    Convert.passwd = bean.passwd;
    Convert.userDest = destBean.user;
    Convert.passwdDest = destBean.passwd;
    try
    {
      fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
      fmInstance.setEnabled(false);
      Convert.convert(bean.url, box4.getSelectedItem().toString(), vectors[0], vectors[1],vectors[2],vectors[3]);

      destBean.setConnection((String) box4.getSelectedItem());
      DefaultListModel model = new DefaultListModel();
      tables = destBean.getTableNames();
      for (int j = 0; j < tables.size(); ++j)
        model.addElement(tables.get(j));
      if (debug)
        System.out.println("hallo" + tables + " ");
      tListDest.setModel(model);
      fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    } catch (Exception e4)
    {
      ByteArrayOutputStream b = new ByteArrayOutputStream();
      PrintStream stream = new PrintStream(b);
      e4.printStackTrace(stream);
      showErrorDialog(b.toString(), "Conversion of table failed");
      fmInstance.setEnabled(true);
    }
  }
  public void writeConfig(String file)
  {
    fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    fmInstance.setEnabled(false);

    Vector vectors[] = getListFromTable();
    Convert.DataBase source = new Convert.DataBase(bean,vectors[0],vectors[1],vectors[2],vectors[3]);
    Convert.DataBase destination = new Convert.DataBase(destBean,new Vector(),new Vector(),new Vector(),new Vector());
   
    try
    {
      Convert.writeConfig(file,source,destination);
      fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
      fmInstance.setEnabled(true);

    } catch (Exception e)
    {
      fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
      fmInstance.setEnabled(true);

      ByteArrayOutputStream b = new ByteArrayOutputStream();
      PrintStream stream = new PrintStream(b);
      e.printStackTrace(stream);
      showErrorDialog(b.toString(), "Error while writing xml config  !");
  }
  
  }
  public void readXMLConfig(String file)
  {
     
    try
    {
      fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
      fmInstance.setEnabled(false);
      Vector databases = Convert.getXMLConfig(file);
      DataBase destBase = (DataBase) databases.lastElement();
      //destBase.bean.getConnection();
      noUserUpdate = true;
      destBean=destBase.bean;
      Object destObj =destBean.url;
      ((DefaultComboBoxModel) box4.getModel()).removeElement(destObj);
      ((DefaultComboBoxModel) box4.getModel()).insertElementAt(destObj,0);
       box4.setSelectedItem(destObj);
      //@TODO comboBox action Events should do nothing on config file read+combox in table should be updated
      databases.remove(destBase);
      for (Iterator iter = databases.iterator(); iter.hasNext();)
      {
        Convert.DataBase database = (Convert.DataBase) iter.next();
        database.bean.getConnection();
        bean = database.bean;
        Object obj =bean.url;
        ((DefaultComboBoxModel) box3.getModel()).removeElement(obj);
        ((DefaultComboBoxModel) box3.getModel()).insertElementAt(obj,0);
        box3.setSelectedItem(obj);
        fillTable();
        Vector tables=database.bean.getTableNames();
        Collections.sort(tables,String.CASE_INSENSITIVE_ORDER);
        for (int i =0;i<database.tables.size();++i)
        {
          String table = (String) database.tables.get(i);
          int index=tables.indexOf(table);
          if(index<0) throw new RuntimeException("Error table \""+table+"\" does no longer exist\n at server "+bean.url +"\n or you mispelled the tablename.");
          noDBUpdate = true;
          tC.tableModel.setValueAt(new TableComponent.SQLCommand(database.selects.get(i).toString()),index,2);
          String create =database.creates.get(i).toString();
          tC.tableModel.setValueAt(new TableComponent.SQLCommand(create.equals("") ? create:"           "+create),index,3);
          Object comboBox=tC.tableModel.getValueAt(index,1);
          if(comboBox!=null) ((JComboBox)comboBox).setSelectedItem(database.layouts.get(i));  
          tC.tableModel.fireTableDataChanged();
          noDBUpdate = false;
          noUserUpdate = false;
        
        }
       destBean.getConnection();
      
        DefaultListModel model = new DefaultListModel();
         tables = destBean.getTableNames();
        for (int j = 0; j < tables.size(); ++j)
          model.addElement(tables.get(j));
        //  System.out.println("hallo" + tables + " ");
        tListDest.setModel(model);
        fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
        fmInstance.setEnabled(true);
             
      }
       
    } catch (Exception e)
    {
      noUserUpdate = false;
      noDBUpdate = false;
      fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
      fmInstance.setEnabled(true);
   
      ByteArrayOutputStream b = new ByteArrayOutputStream();
      PrintStream stream = new PrintStream(b);
      e.printStackTrace(stream);
      showErrorDialog(b.toString(), "Error while reading xml config  !");
    }

  }
  public boolean showTable(int list)
  {
    ProgressDialog dialog = new ProgressDialog(fm);
    dialog.setTitle("Preparing tables to be displayed");
    dialog.thread = Thread.currentThread();
    dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    String query = new String();
    Object[] objs = tListDest.getSelectedValues();
    Vector[] vectors = getListFromTable();
    Vector tables = (list == 0) ? vectors[0] : new Vector();
    if (list > 0)
      for (int i = 0; i < objs.length; ++i)
      {
        if (debug)
          System.out.println(objs[i]);
        tables.add(objs[i]);
      }
    if (window != null)
      window.dispose();
    if (windowDest != null)
      windowDest.dispose();

    window = new MultiResultWindow(fm);
    if (list > 0)
    {
      windowDest = new MultiResultWindow(fm);
      window = windowDest;
    }
    dialog.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 500) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2);
    dialog.setSize(500, 250);
    if (!tables.isEmpty())
      dialog.show();
    dialog.title.setText("Preparing tables to be diplayed");
    for (int i = 0; i < tables.size(); ++i)
    {
      dialog.table.setText("Getting table " + tables.get(i));
      dialog.status.setText("Table " + (i + 1) + " of " + tables.size());

       if(list==0)
       query = "select * from " + bean.getQC() +tables.get(i).toString() + bean.getQC();
    else
    query = "select * from " + destBean.getQC() +tables.get(i).toString() + destBean.getQC();
 if(list==0) query = vectors[2].get(i).toString();
      if (list == 0 && vectors[1].get(i) != null)
        if (vectors[1].get(i).toString() != "")
          {
						String layout =" layout " + bean.getQC() + vectors[1].get(i).toString() + bean.getQC();
            String name = tables.get(i).toString();
            StringBuffer queryLayout=new StringBuffer(query);
            queryLayout.insert(queryLayout.indexOf(name)+name.length()+1," "+layout);
            query=queryLayout.toString();
          }
       if(debug)
       showErrorDialog("query in show tables is "+query,"Hello");
      window.title = " Table ;-) " + (String) tables.get(i);
      //    break;
      //  } else
      //    window.title = "Error! - No valid tablename found";

      try
      {
        if ((query.toLowerCase().indexOf("insert") >= 0)
          || (query.toLowerCase().indexOf("delete") >= 0)
          || (query.toLowerCase().indexOf("alter") >= 0)
          || (query.toLowerCase().indexOf("update") >= 0))
        {
          Statement stm = (list > 0) ? destBean.getConnection().createStatement() : bean.getConnection().createStatement();
          stm.executeUpdate(query);
          Vector vec = new Vector();
          Vector vec2 = new Vector();
          Vector vec3 = new Vector();
          vec2.add(query);
          vec3.add(vec2);
          vec.add("Insert, update, etc done! No results available");
          // vec.add("no Results were produced");

          window.updateResult(vec3, vec);
          //window.pack();
          //  window.setVisible(true);

        } else
        {
          Vector[] vecs = (list > 0) ? destBean.getQueryData(query, dialog, 50) : bean.getQueryData(query, dialog, 50);
          if (vecs[1].isEmpty())
            throw new Exception("Wrong columnname or Empty Layout");
          window.updateResult(vecs[0], vecs[1]);

          //window.pack();
          //String name = window.writeResult();
          //appendLog(window.title, name);
        }

        //window.setVisible(true);

      } catch (Exception e)
      {
        System.out.println("Exception occured");
        e.printStackTrace();
        Vector vec = new Vector();
        Vector vec2 = new Vector();
        Vector vec3 = new Vector();
        vec2.add(e.getMessage());
        vec3.add(vec2);
        vec.add("Exception occured! No results available");
        //vec.add("no Results were produced");

        window.updateResult(vec3, vec);
        //window.pack();
        // window.setVisible(true);
        fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

      }
    } // to for
    window.pack();
    window.setSize(700, 600);

    window.oldTabCount = 10000;
    dialog.dispose();
    fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

    return !tables.isEmpty();

  }

  public void dropTable()
  {
    String query = new String();
    Object[] objs = tListDest.getSelectedValues();
    Vector tables = new Vector();
    for (int i = 0; i < objs.length; ++i)
    {
      System.out.println(objs[i]);
      tables.add(objs[i]);
    }

    for (int i = 0; i < tables.size(); ++i)
    {

      query = "drop table "+destBean.getQC() + tables.get(i) + destBean.getQC();

      try
      {
        Statement stm = destBean.getConnection().createStatement();
        stm.executeUpdate(query);
      } catch (Exception e)
      {
        ByteArrayOutputStream b = new ByteArrayOutputStream();
        PrintStream stream = new PrintStream(b);
        e.printStackTrace(stream);
        showErrorDialog(b.toString(), "Open of table failed");

      }
    } // to for
    try
    {
      destBean.setConnection((String) box4.getSelectedItem());
      DefaultListModel model = new DefaultListModel();
      tables = destBean.getTableNames();
      for (int j = 0; j < tables.size(); ++j)
        model.addElement(tables.get(j));
      System.out.println("hallo" + tables + " ");
      tListDest.setModel(model);
    } catch (Exception e4)
    {
    }

  }
  /**
   * invoked then the user changes the table or the tableModel changes
   */
  public void tableChanged(TableModelEvent e)
  {
    //  if (e.getType() == e.INSERT)
    //System.out.println("Insert done");
    // if (e.getType() == e.UPDATE)
    // System.out.println("Update done");
    //if (e.getType() == e.DELETE)
   // System.out.println("Delete done");
    if (e.getType() == e.UPDATE && !noDBUpdate)
    {
      int row = e.getFirstRow(), col = e.getColumn();
      System.out.println("Got in " + row + " " + col );
      TableModel model =  (TableModel)e.getSource();
      String columnName = model.getColumnName(col);
      Object test = model.getValueAt(row, col);
      String idVal = (test == null) ? "" : test.toString();
      String value = (test == null) ? "" : test.toString();;

      System.out.println("Got in " + columnName +" "+idVal);
      try
      {
        if(columnName.equals("select")||columnName.equals("Layouts"))
        {
          String table = model.getValueAt(row,0).toString();
          String layout = (model.getValueAt(row,1)!=null) ?((JComboBox)model.getValueAt(row,1)).getSelectedItem().toString():"";
          String query =  model.getValueAt(row,2).toString();
          String create = model.getValueAt(row,3).toString();
          System.out.println("table" +table+" layout "+layout+" query "+query);
          if(!create.equals(""))
          {
            Object[] options = { "Yes","No"};
            int option=showDialog("Create Statement not empty! Do you want to overwrite?","create statement",options ); 
            if(option==0) 
            model.setValueAt(createStatement(table,destBean,layout,query),row,3);
          }
       
       
        }
/*        Statement stm = bean.getConnection().createStatement();
        //  stm.executeUpdate("DELETE FROM \""+fm.tables.get(0)+"\" WHERE \"erstellt von\"='rogo') ");

        if (idVal == "")
          stm.executeUpdate("INSERT  INTO " + DBBean.quoteChar + box.getSelectedItem() + DBBean.quoteChar + " (" + DBBean.quoteChar + columnName + DBBean.quoteChar + ")  VALUES ('" + value + "') ");
        else
          stm.executeUpdate(
            "UPDATE   " + DBBean.quoteChar + box.getSelectedItem() + DBBean.quoteChar + " SET  " + DBBean.quoteChar + columnName + DBBean.quoteChar + "='" + value + "' WHERE ID='" + idVal + "' ");
  */
          } catch (Exception e2)
           {
             fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
             ByteArrayOutputStream b = new ByteArrayOutputStream();
             PrintStream stream = new PrintStream(b);
             e2.printStackTrace(stream);
             showErrorDialog(b.toString(), "Error while updating table  !");
           }
    }
  }

  /**
   * initialize the menubar
   */
  private void setMenu()
  {
    JMenuBar menubar = new JMenuBar();
    JMenu menu = new JMenu("File");
   
    JMenuItem item = new JMenuItem("import XML Config");
    item.addActionListener(fm);
    menu.add(item);
    item = new JMenuItem("export XML Config");
    item.addActionListener(fm);
    menu.add(item);
    menubar.add(menu);
    menu = new JMenu("Options");
  
    item = new JMenuItem("show Driver features");
    item.addActionListener(fm);
    menu.add(item);
    menubar.add(menu);
  
    item.addActionListener(fm);
    menu.add(item);
  
    menubar.add(menu);
  
    menu.setBackground(fm.getBackground());
    menubar.setBackground(fm.getBackground());
    setJMenuBar(menubar);
  }
  /**
   *  open the log  file (index.html)
   */

  public static void openLog() throws Exception
  {

    StringBuffer buff = new StringBuffer();
    buff.append("<html>");
    buff.append("<head>");
    buff.append("\n<title>");
    buff.append("FileMaker Test");
    buff.append("</title>\n");
    buff.append("</head>\n");

    buff.append("<body>\n");
    buff.append("<center>\n");
    buff.append("\n<h3>");
    buff.append("FileMaker Test");
    buff.append("</h3>\n");

    logFile.write(TableComponent.convertUml(buff).toString());
    logFile.flush();
  }
  /**
   * Append one entry to the log file(index.html)
   */
  public static void appendLog(String entry, String name) throws Exception
  {
    logFile.write("<a href=\"./" + name.substring(name.lastIndexOf("/") + 1) + "\">");
    logFile.write(entry + "</a>");
    logFile.write("<br>\n<br>\n");
    logFile.flush();
  }
  /**
   * closes the log file invoked then the application closes
   */
  public static void closeLog() throws Exception
  {
    logFile.write("\n</body>");
    logFile.write("\n</html>");

    logFile.close();
  }
  public static void showErrorDialog(String message, String title)
  {
    JDialog dialog = new JDialog(fmInstance);
    dialog.setTitle(title);
    JTextArea text = new JTextArea();
    JScrollPane scroller = new JScrollPane(text);
    dialog.getContentPane().add(scroller);
    text.append(message);
    dialog.setSize(600, 300);
    dialog.setLocationRelativeTo(fmInstance);
    dialog.show();
    //JOptionPane.showMessageDialog(null, message, title, JOptionPane.ERROR_MESSAGE);
  }
  public static class ProgressDialog extends JDialog
  {
    JLabel table = new JLabel("    ");
    JLabel status = new JLabel("    ");
    JLabel title = new JLabel("     ");
    JPanel content = new JPanel();
    JPanel titlePanel = new JPanel();
    JPanel labelPanel = new JPanel();
    JPanel statusPanel = new JPanel();
    JPanel buttonPanel = new JPanel();

    JProgressBar progress = new JProgressBar();
    JButton cancel = new JButton("Cancel");
    Thread thread;
    public ProgressDialog(JFrame frame)
    {
      super(frame);
      content = new JPanel(true);
      //content.setBorder(BorderFactory.createRaisedBevelBorder());
      content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
      title = new JLabel("Progress of conversion");
      title.setHorizontalTextPosition(title.CENTER);
      titlePanel.add(title);
      buttonPanel.add(cancel);
      // content.add(titlePanel);
      content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
      content.add(labelPanel);
      content.add(new JLabel(""));
      content.add(progress);
      content.add(statusPanel);
      content.add(buttonPanel);
      content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
      labelPanel.add(table);
      statusPanel.add(status);
      getContentPane().add(titlePanel, "North");
      getContentPane().add(content, "Center");
      this.addWindowListener(new WindowAdapter()
      {
        public void windowClosing(WindowEvent e)
        {
          cancel.doClick();
        }
      });

      cancel.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
        {
          fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
					fmInstance.setEnabled(true);
          setVisible(false);
          thread.stop();
        }
      });
      pack();

    }

  }
  public static class PasswordDialog extends JDialog
  {
    JLabel table = new JLabel("    ");
    JLabel status = new JLabel("    ");
    JLabel title = new JLabel("     ");
    JPanel content = new JPanel();
    JPanel titlePanel = new JPanel();
    JPanel userPanel = new JPanel();
    JPanel passwordPanel = new JPanel();
    JPanel buttonPanel = new JPanel();
    JTextField user = new JTextField(10);
    JTextField passwd = new JPasswordField(10);

    JButton cancel = new JButton("Cancel");
    JButton ok = new JButton("Ok");
    DBBean bean = null;
    Thread thread;
    public PasswordDialog(JFrame frame, DBBean localBean)
    {
      super(frame);
      setTitle("PasswordDialog");
      setModal(true);
      content = new JPanel(true);
      this.bean = localBean;
      //content.setBorder(BorderFactory.createRaisedBevelBorder());
      ActionListener al = new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
        {
          bean.setUserAndPasswd(user.getText(), passwd.getText());
          setVisible(false);
        }

      };
      this.addWindowListener(new WindowAdapter()
      {
        public void windowClosing(WindowEvent e)
        {
          cancel.doClick();
        }
      });

      user.setText(localBean.user);
      passwd.setText(localBean.passwd);
      user.addActionListener(al);
      passwd.addActionListener(al);
      content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
      title = new JLabel("Enter user and password ");
      title.setHorizontalTextPosition(title.CENTER);
      titlePanel.add(title);
      buttonPanel.add(ok);
      buttonPanel.add(cancel);
      content.add(titlePanel);
      content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
      // content.add(labelPanel);
      content.add(new JLabel(""));
      content.add(userPanel);
      content.add(passwordPanel);
      content.add(buttonPanel);
      content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
      //labelPanel.add(table);
      userPanel.add(new JLabel("Username:  "));
      userPanel.add(user);
      passwordPanel.add(new JLabel("Password:  "));
      passwordPanel.add(passwd);
      passwd.setPreferredSize(user.getPreferredSize());
      passwd.setMinimumSize(passwd.getPreferredSize());
      passwd.setMaximumSize(passwd.getPreferredSize());
      passwd.setSize(passwd.getPreferredSize());
        getContentPane().add(titlePanel, "North");
      getContentPane().add(content, "Center");
      ok.addActionListener(al);
      cancel.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
        {
          fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
					fmInstance.setEnabled(true);
          setVisible(false);
          thread.stop();
        }

      });
      pack();

    }

  }
  public void fillTable()
  {
    noDBUpdate = true;
    Vector tableNames = bean.getTableNames();
    Collections.sort(tableNames, String.CASE_INSENSITIVE_ORDER);
    Vector[] data = new Vector[2];
    data[1] = new Vector();
    data[1].add("Table");
    data[1].add("Layouts");
		data[1].add("select");
    data[1].add("create");
   
    data[0] = new Vector();

    for (int i = 0; i < tableNames.size(); i++)
    {
      String name = tableNames.get(i).toString();
      Vector layouts = new Vector();
      try
      {
        layouts = bean.getLayoutNames(name);
      } catch (SQLException e)
      {
        layouts = new Vector();
      }
      Vector dataRow = new Vector();
      dataRow.add(name);
      if (!layouts.isEmpty())
        dataRow.add(new JComboBox(layouts));
      else
        dataRow.add(null);
      dataRow.add(new TableComponent.SQLCommand("select * from "+bean.getQC()+name+bean.getQC()));
     
        data[0].add(dataRow);
    dataRow.add(new TableComponent.SQLCommand(""));
      //System.out.println(dataRow);
    }
    tC.tableModel.setDataVector(data[0], data[1]);
    tC.revalidate();
    tC.tableModel.fireTableDataChanged();
    noDBUpdate = false;
  
  }
  public Vector[] getListFromTable()
  {
    Vector[] vec = new Vector[4];
    vec[0] = new Vector();
    vec[1] = new Vector();
		vec[2] = new Vector();
    vec[3] = new Vector();
    int[] rows = tC.table.getSelectedRows();
    for (int i = 0; i < rows.length; i++)
    {
      //System.out.println(tC.tableModel.getValueAt(rows[i],1));
      vec[0].add(tC.tableModel.getValueAt(rows[i], 0));
      JComboBox box = ((JComboBox) tC.tableModel.getValueAt(rows[i], 1));
      String layoutName = (box != null) ? box.getSelectedItem().toString() : "";
      vec[1].add(layoutName);
      vec[2].add(tC.tableModel.getValueAt(rows[i], 2).toString());
      vec[3].add(tC.tableModel.getValueAt(rows[i], 3).toString());
  
    }
    return vec;
  }
  public void setEnabled(boolean state)
  {
    showTables.setEnabled(state);
    showTables1.setEnabled(state);
    convert.setEnabled(state);
    dropTables.setEnabled(state);
    box3.setEnabled(state);
    box4.setEnabled(state);

  }
  public TableComponent.SQLCommand createStatement(String table,DBBean beanDest,String layout,String query)  throws SQLException
  {
    fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        
    if(beanDest.url.equals("")) beanDest.url=box4.getSelectedItem().toString();
    StringBuffer command = new StringBuffer(50);
    command.append("\n           CREATE TABLE ");
    command.append(beanDest.getQC());
    command.append(Convert.convertText(table));
    command.append(beanDest.getQC());
    command.append("\n             ( ");
    String type = null;
   // String query = "select * from " + bean.getQC() +table + bean.getQC();
   if (!layout.equals(""))
     {
       layout = " layout " + bean.getQC() + layout + bean.getQC();
       StringBuffer queryLayout = new StringBuffer(query);
       queryLayout.insert(queryLayout.indexOf(table) + table.length() + 1, " " + layout);
       query = queryLayout.toString();
       System.out.println("added layout  "+ query);
        
     }
      Vector[] result=bean.getQueryData(query,1);
    for (int i = 0; i < result[1].size() - 1; ++i)
    {
      type = bean.metaData.getColumnTypeName(i + 1);
      //   System.out.println(i+" "+result[1].get(i)+" "+type);
      type = (type.equals("NUMBER")) ? "INT4" : type;
      type = (type.equals("CONTAINER")) ? "TEXT" : type;
      type = type.toUpperCase(); 
      if(i==0)
      command.append(beanDest.getQC() + Convert.convertText((String) result[1].get(i)) + beanDest.getQC() + " " + type + ", ");
      else
      command.append("               "+beanDest.getQC() + Convert.convertText((String) result[1].get(i)) + beanDest.getQC() + " " + type + ", ");
      command.append("\n");
    }
    type = bean.metaData.getColumnTypeName(result[1].size());
    type = (type.equals("NUMBER")) ? "INT4" : type;
    type = (type.equals("CONTAINER")) ? "TEXT" : type;
    type = type.toUpperCase(); 
    command.append("               "+beanDest.getQC() + Convert.convertText((String) result[1].get(result[1].size() - 1)) + beanDest.getQC() + " " + type);
    command.append("\n             )\n");
    fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
   
   return new TableComponent.SQLCommand(command.toString());
  }
  static class XMLFilter extends javax.swing.filechooser.FileFilter
  {
    public boolean accept(java.io.File file)
    {
      if (file.getName().toLowerCase().endsWith(".xml") || file.isDirectory())
        return true;
      else
        return false;
    }
    public String getDescription()
    {
      return "Batch Convert XML File";
    }

  }
  public static int showDialog(String message, String title, Object[] options)
  {
    int option = JOptionPane.showOptionDialog(null, message, title, JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
    return option;
  
  }

}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>