/* * FM2SQL.java -- Main program Filemaker to SQL Converter * Copyright (C) 2003 Robert Gordesch (rogo@mpiwg-berlin.mpg.de) * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. Please read license.txt for the full details. A copy of * the GPL may be found at http://www.gnu.org/copyleft/lgpl.html You should * have received a copy of the GNU General Public License along with this * program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA Created on 15.09.2003 by * rogo */ import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Image; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.InputEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileWriter; import java.io.PrintStream; import java.sql.SQLException; import java.sql.Statement; import java.util.Collections; import java.util.Iterator; import java.util.Vector; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JProgressBar; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel; /** * *
*

FileMaker Test (JDBC Database Driver Test)

* Main class : * contains the main Frame, all event handlers etc *
* The Database access is made over DBBean class * all other classes are just for the visualization of the data * @version 0.3( first stable release) * @author rogo * */ public class FM2SQL extends JFrame implements ActionListener, TableModelListener { private JMenuItem delimiterItem; private JCheckBoxMenuItem convertItem; private JCheckBoxMenuItem appendItem; private JCheckBoxMenuItem updateItem; private JCheckBoxMenuItem deleteItem; int mode = -1; final static int STATUS_INDEX = 0; final static int NAME_INDEX = 1; final static int ID_INDEX = 2; final static int SELECT_INDEX = 3; final static int CREATE_INDEX = 4; final static int LAYOUT_INDEX = 5; /** * The database Bean instance. * */ DBBean bean; /** * The database destination Bean instance. * */ DBBean destBean; /** * tList - Tablenames to choose from */ JList tList = new JList(new String[] { "no database", "connection", "" }); JList tListDest = new JList(new String[] { "no database connection", "", "" }); /** * sourceUrl - Database URL ComboBox */ JComboBox sourceURLBox; /** * destUrlBox - Database URL ComboBox */ JComboBox destURLBox; TableComponent table, tC; Vector tables = new Vector(); Vector layouts = new Vector(); JPanel listPanel; JPanel topPanel,topPanel2, contentPanel; JScrollPane paneDest; 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; String delimiter = ""; 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 { initializeGUI(); } public void initializeGUI() throws Exception { Image local = getToolkit().getImage(FM2SQL.class.getResource("icons/fm.jpg")); if (local != null); setIconImage(local); bean = new DBBean(); destBean = new DBBean(); sourceURLBox = new JComboBox(new String[] { "jdbc:fmpro:http://141.14.237.74:8050", "jdbc:fmpro:http://localhost", "jdbc:postgresql://foxridge/test" }); sourceURLBox.setEditable(true); sourceURLBox.setFont(new Font("Times New Roman",Font.PLAIN,14)); destURLBox = new JComboBox(new String[] { "jdbc:postgresql://foxridge/test", "jdbc:postgresql://erebos/test1" }); destURLBox.setEditable(true); destURLBox.addActionListener(this); destURLBox.setFont(new Font("Times New Roman",Font.PLAIN,14)); table = new TableComponent(); //box = new JComboBox(tables); // box.addActionListener(this); // box2.addActionListener(this); sourceURLBox.addActionListener(this); contentPanel = new JPanel(); contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS)); sourceURLBox.setMinimumSize(new Dimension(450, 25)); sourceURLBox.setMaximumSize(new Dimension(550, 25)); sourceURLBox.setPreferredSize(new Dimension(450, 25)); destURLBox.setMinimumSize(new Dimension(450, 25)); destURLBox.setMaximumSize(new Dimension(550, 25)); destURLBox.setPreferredSize(new Dimension(450, 25)); paneDest = new JScrollPane(tListDest); // tListDest.setPreferredSize(paneDest.getPreferredSize()); // paneDest.setPreferredSize(new Dimension(350, 365)); Dimension dim = paneDest.getPreferredSize(); paneDest.setMinimumSize(dim); //paneDest.setMaximumSize(new Dimension(dim.width + 50, dim.height + 50)); tC = new TableComponent(); tC.sizeToFit(450, 250); tC.tableModel.addTableModelListener(this); JPanel destPanel = new JPanel(); destPanel.setLayout(new java.awt.GridBagLayout()); 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, 365)); //tC.table.revalidate(); tC.tableScroller.setMinimumSize(new Dimension(450, 250)); // tC.tableScroller.setMaximumSize(tC.tableScroller.getPreferredSize()); topPanel = new JPanel(); topPanel.setLayout(new GridBagLayout()); topPanel2 = new JPanel(); topPanel2.setLayout(new GridBagLayout()); gbc.gridx = 0; gbc.gridy = 0; gbc.weightx = 0.1; gbc.weighty = 0.1; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.insets = new Insets(2, 2, 5, 5); gbc.ipadx = 1; gbc.ipady = 1; gbc.anchor = GridBagConstraints.WEST; listPanel.add(topPanel, gbc); destPanel.add(topPanel2, gbc); topPanel.add(new JLabel("Choose src database: ", JLabel.CENTER), gbc); topPanel2.add(new JLabel("Choose dest database : ", JLabel.CENTER), gbc); gbc.anchor = GridBagConstraints.NORTHWEST; gbc.gridy = 1; topPanel.add(sourceURLBox, gbc); topPanel2.add(destURLBox, gbc); //gbc.gridx=GridBagConstraints.RELATIVE; //dataBasePanel.add(new JLabel(" select Tables to Convert ", JLabel.LEFT)); gbc.gridy = 1; gbc.anchor = GridBagConstraints.SOUTHWEST; listPanel.add(new JLabel(" select Tables to Convert ", JLabel.LEFT), gbc); destPanel.add(new JLabel(" Tables in database ", JLabel.LEFT), gbc); // gbc.anchor = GridBagConstraints.WEST; gbc.gridy = 2; gbc.gridx = 0; // gbc.weightx = 0.0; //dataBasePanel.add(tC); gbc.anchor = GridBagConstraints.NORTHWEST; gbc.gridheight = 1; gbc.fill = GridBagConstraints.BOTH; listPanel.add(tC.tableScroller, gbc); // gbc.fill = GridBagConstraints.VERTICAL; destPanel.add(paneDest, gbc); showTables1 = new JButton("show Tables"); showTables1.setActionCommand("show Tables source"); // gbc.anchor = GridBagConstraints.NORTH; // gbc.weightx = 0.0; gbc.fill = GridBagConstraints.NONE; gbc.gridheight = 1; gbc.gridx = 0; gbc.gridy = 2; // topPanel.add(showTables1, gbc); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS)); buttonPanel.setMinimumSize(new Dimension(380, 30)); 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); JPanel buttonPanelSrc = new JPanel(); buttonPanelSrc.setLayout(new BoxLayout(buttonPanelSrc, BoxLayout.X_AXIS)); buttonPanelSrc.setMinimumSize(new Dimension(200, 30)); buttonPanelSrc.add(showTables1); topPanel.add(buttonPanelSrc, gbc); topPanel2.add(buttonPanel, gbc); // gbc.anchor = GridBagConstraints.WEST; // gbc.gridy = 1; // gbc.gridx = 2; // gbc.weightx = 0.2; // gbc.gridx = 3; // gbc.anchor = GridBagConstraints.NORTHWEST; // gbc.gridy = 1; // gbc.weightx = 1.0; //listPanel.add(buttonPanel, gbc); JSplitPane splitter = new JSplitPane(); splitter.setTopComponent(listPanel); splitter.setBottomComponent(destPanel); // contentPanel.add(dataBasePanel); // contentPanel.add(listPanel); listPanel.setMaximumSize(new Dimension(660, 750)); listPanel.setMinimumSize(new Dimension(660, 250)); listPanel.setPreferredSize(new Dimension(480, 500)); paneDest.setPreferredSize(new Dimension(250, 285)); getContentPane().add(splitter, "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)); tC.tableScroller.revalidate(); Dimension dim = getSize(); tC.tableScroller.setMinimumSize(new Dimension(dim.width-400, dim.height - topPanel.getPreferredSize().height - 100)); tC.tableScroller.setMaximumSize(getSize()); tC.tableScroller.setPreferredSize(tC.tableScroller.getMinimumSize()); paneDest.setMinimumSize(new Dimension(400, dim.height - topPanel2.getPreferredSize().height - 100)); paneDest.setMaximumSize(tC.tableScroller.getMaximumSize()); paneDest.setPreferredSize(new Dimension(400, dim.height - topPanel2.getPreferredSize().height - 100)); paneDest.validate(); // tC.tableScroller.setPreferredSize(getSize()); // @TODO new sizeToFit method for listPanel table!!! tC.sizeToFit(getWidth(), getHeight()); ((JPanel) getContentPane()).revalidate(); repaint(); setTitle("Filemaker 2 SQL 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 == sourceURLBox) { if (debug) System.out.println("hey" + sourceURLBox.getSelectedItem()); Object insObj =sourceURLBox.getSelectedItem(); ((DefaultComboBoxModel) sourceURLBox.getModel()).removeElement(insObj); ((DefaultComboBoxModel) sourceURLBox.getModel()).insertElementAt(insObj, 0); sourceURLBox.setSelectedItem(insObj); } else if (src == destURLBox) { if (debug) System.out.println("hey" + destURLBox.getSelectedItem()); //((DefaultComboBoxModel) box4.getModel()).insertElementAt(box4.getSelectedItem(), 0); try { String selected = (String) destURLBox.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)); } destURLBox.setModel(new DefaultComboBoxModel(urls)); destURLBox.setSelectedItem(selected); } catch (Exception e5) { } } } if (command == "comboBoxChanged") { try { //System.out.println("hallo " + (e.getSource() == box3)); Object src = e.getSource(); if (src == sourceURLBox&&!noUserUpdate) { Thread thread = new Thread() { public void run() { try { PasswordDialog dialog = new PasswordDialog(fmInstance, bean); dialog.setLocationRelativeTo(sourceURLBox); dialog.thread = Thread.currentThread(); fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); fmInstance.setEnabled(false); dialog.setVisible(true); String url = sourceURLBox.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 == destURLBox&&!noUserUpdate) { Thread thread = new Thread() { public void run() { try { PasswordDialog dialog = new PasswordDialog(fmInstance, destBean); dialog.setLocationRelativeTo(destURLBox); dialog.thread = Thread.currentThread(); fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); fmInstance.setEnabled(false); dialog.setVisible(true); destBean.setConnection((String) destURLBox.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 2 SQL 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) { } } if (command.equals("Delimiter")) { new DelimiterDialog(fmInstance).setVisible(true); //delimiter = JOptionPane.showInputDialog(fmInstance,"Enter delimiter String",delimiter); } if (command == "Convert Mode") { System.out.println("Convert Mode selected"); convert.setText("Convert Tables"); convert.setActionCommand("Convert Tables"); convert.setToolTipText("Normal table conversion existing table will be deleted"); mode = Convert.DataBase.CONVERT_MODE; } if (command == "Append Mode") { System.out.println("Append Mode selected"); convert.setText("Append Tables"); convert.setActionCommand("Append Tables"); convert.setToolTipText("Appends data to an existing table"); mode = Convert.DataBase.APPEND_MODE; } if (command == "Update Mode") { System.out.println("Update Mode selected"); convert.setText("Update Tables"); convert.setActionCommand("Update Tables"); convert.setToolTipText("Updates data that has been changed in source"); mode = Convert.DataBase.UPDATE_MODE; } if (command == "Delete Mode") { System.out.println("Delete Mode selected"); convert.setText("Delete Tables"); convert.setActionCommand("Delete Tables"); convert.setToolTipText("Deletes data that has been deleted in source"); mode = Convert.DataBase.DELETE_MODE; } //writing config if (command.equals("save 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("open 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")||command.equals("Append Tables")) { Thread thread = new Thread() { public void run() { setEnabled(false); convert(); setEnabled(true); } }; thread.start(); } if (command.equals("Update Tables")) { Thread thread = new Thread() { public void run() { setEnabled(false); update(); setEnabled(true); } }; thread.start(); } if (command.equals("Delete Tables")) { Thread thread = new Thread() { public void run() { setEnabled(false); delete(); 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(); } if(command.equals("Quit")) { fmInstance.dispose(); System.exit(0); } } /** * Updates the content of source to destination and makes new table if necessary */ public void update() { 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.update(bean.url, destURLBox.getSelectedItem().toString(), vectors[0], vectors[1], vectors[2], vectors[3],vectors[4], mode); destBean.setConnection((String) destURLBox.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(), "Update of table failed"); fmInstance.setEnabled(true); } } public void delete() { 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.delete(bean.url, destURLBox.getSelectedItem().toString(), vectors[0], vectors[1], vectors[2], vectors[3],vectors[4], mode); destBean.setConnection((String) destURLBox.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(), "Delete of table failed"); fmInstance.setEnabled(true); } } /** * 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, destURLBox.getSelectedItem().toString(), vectors[0], vectors[1],vectors[2],vectors[3],vectors[4],mode,delimiter); destBean.setConnection((String) destURLBox.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(); if(convertItem.isSelected()) mode = Convert.DataBase.CONVERT_MODE; else if(appendItem.isSelected()) mode = Convert.DataBase.APPEND_MODE; else if(updateItem.isSelected()) mode = Convert.DataBase.UPDATE_MODE; else if(deleteItem.isSelected()) mode = Convert.DataBase.DELETE_MODE; // TODO add id vector in table and write it out Convert.DataBase source = new Convert.DataBase(bean,vectors[0],vectors[1],vectors[2],vectors[3],vectors[4],mode); Convert.DataBase destination = new Convert.DataBase(destBean,new Vector(),new Vector(),new Vector(),new Vector(),new Vector(),-1); source.delimiter =delimiter; 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); Convert.DataBase destBase = (Convert.DataBase) databases.lastElement(); //destBase.bean.getConnection(); noUserUpdate = true; destBean=destBase.bean; Object destObj =destBean.url; ((DefaultComboBoxModel) destURLBox.getModel()).removeElement(destObj); ((DefaultComboBoxModel) destURLBox.getModel()).insertElementAt(destObj,0); destURLBox.setSelectedItem(destObj); databases.remove(destBase); for (Iterator iter = databases.iterator(); iter.hasNext();) { Convert.DataBase database = (Convert.DataBase) iter.next(); if (database.mode == Convert.DataBase.CONVERT_MODE) { convertItem.doClick(); } else if (database.mode == Convert.DataBase.APPEND_MODE) { appendItem.doClick(); } else if (database.mode == Convert.DataBase.UPDATE_MODE) { updateItem.doClick(); } else if (database.mode == Convert.DataBase.DELETE_MODE) { deleteItem.doClick(); } delimiter=database.delimiter; database.bean.getConnection(); bean = database.bean; Object obj =bean.url; ((DefaultComboBoxModel) sourceURLBox.getModel()).removeElement(obj); ((DefaultComboBoxModel) sourceURLBox.getModel()).insertElementAt(obj,0); sourceURLBox.setSelectedItem(obj); fillTable(); Vector tables=database.bean.getTableNames(); Collections.sort(tables,String.CASE_INSENSITIVE_ORDER); int[] indices = new int[database.tables.size()]; for (int i =0;i 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) destURLBox.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,NAME_INDEX).toString(); String layout = (model.getValueAt(row,LAYOUT_INDEX)!=null) ?((JComboBox)model.getValueAt(row,LAYOUT_INDEX)).getSelectedItem().toString():""; String query = model.getValueAt(row,SELECT_INDEX).toString(); String create = model.getValueAt(row,CREATE_INDEX).toString(); String id = (model.getValueAt(row,ID_INDEX)!=null) ?((JComboBox)model.getValueAt(row,ID_INDEX)).getSelectedItem().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,CREATE_INDEX); } if (columnName.equals("Layouts")) { bean.makeQuery("select * from"+bean.getQC()+table+bean.getQC()+" layout "+bean.getQC()+layout+bean.getQC(),1); Vector idVec = bean.getColumnNames(); if (idVec == null) idVec = new Vector(); idVec.add(0, ""); JComboBox box = ((JComboBox) model.getValueAt(row, ID_INDEX)); box.setModel(new DefaultComboBoxModel(idVec)); box.setSelectedItem(id); tC.tableModel.fireTableCellUpdated(row,ID_INDEX); } } /* 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"); menu.setMnemonic('F'); JMenuItem item = new JMenuItem("open XML Config"); item.setToolTipText("opens a XML config file for batch conversion"); item.setMnemonic('i'); item.setAccelerator(KeyStroke.getKeyStroke('O',InputEvent.CTRL_DOWN_MASK)); item.addActionListener(fm); menu.add(item); item = new JMenuItem("save XML Config"); item.setToolTipText("saves the current selections in an XML config file for batch conversion"); item.setAccelerator(KeyStroke.getKeyStroke('S',InputEvent.CTRL_DOWN_MASK)); item.setMnemonic('x'); item.addActionListener(fm); menu.add(item); item = new JMenuItem("Quit"); item.setMnemonic('Q'); item.setToolTipText("Quits the application"); item.setAccelerator(KeyStroke.getKeyStroke('Q',InputEvent.CTRL_DOWN_MASK)); item.addActionListener(fm); menu.add(item); menubar.add(menu); menu = new JMenu("Options"); menu.setMnemonic('O'); ButtonGroup bgrp = new ButtonGroup(); convertItem = new JCheckBoxMenuItem("Convert Mode"); convertItem.setToolTipText("Normal table conversion existing table will be deleted"); convertItem.addActionListener(fm); bgrp.add(convertItem); menu.add(convertItem); menubar.add(menu); appendItem = new JCheckBoxMenuItem("Append Mode"); appendItem.setToolTipText("Appends data to an existing table"); appendItem.addActionListener(fm); bgrp.add(appendItem); menu.add(appendItem); menubar.add(menu); updateItem = new JCheckBoxMenuItem("Update Mode"); updateItem.setToolTipText("Updates data in an existing table"); updateItem.addActionListener(fm); bgrp.add(updateItem); menu.add(updateItem); deleteItem = new JCheckBoxMenuItem("Delete Mode"); deleteItem.setToolTipText("Deletes data in an existing table \n that has been deleted in source table"); deleteItem.addActionListener(fm); bgrp.add(deleteItem); menu.add(deleteItem); menubar.add(menu); item = new JMenuItem("show Driver features"); item.setToolTipText("shows the features of the selected driver"); item.addActionListener(fm); menu.add(item); menubar.add(menu); delimiterItem = new JMenuItem("Delimiter"); delimiterItem.setToolTipText("Delimiter for FM Arrayfields"); delimiterItem.addActionListener(fm); menu.add(delimiterItem); menubar.add(menu); // item.addActionListener(fm); // menu.add(item); menubar.add(menu); menu.setBackground(fm.getBackground()); menubar.setBackground(fm.getBackground()); convertItem.doClick(); setJMenuBar(menubar); } /** * open the log file (index.html) */ public static void openLog() throws Exception { StringBuffer buff = new StringBuffer(); buff.append(""); buff.append(""); buff.append("\n"); buff.append("FileMaker Test"); buff.append("\n"); buff.append("\n"); buff.append("\n"); buff.append("
\n"); buff.append("\n

"); buff.append("FileMaker Test"); buff.append("

\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(""); logFile.write(entry + ""); logFile.write("
\n
\n"); logFile.flush(); } /** * closes the log file invoked then the application closes */ public static void closeLog() throws Exception { logFile.write("\n"); logFile.write("\n"); 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; DBBean bean; public ProgressDialog(JFrame frame,DBBean bean) { super(frame); this.bean = bean; 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); try { ProgressDialog.this.bean.getConnection().close(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } thread.stop(); } }); pack(); } } public static class DelimiterDialog extends JDialog { JLabel table = new JLabel(" "); JLabel status = new JLabel(" "); JLabel title = new JLabel(" "); JPanel content = new JPanel(); JPanel titlePanel = new JPanel(); JPanel delimiterPanel = new JPanel(); JPanel buttonPanel = new JPanel(); JTextField delimiter = new JTextField(10); JButton cancel = new JButton("Cancel"); JButton ok = new JButton("Ok"); Thread thread; public DelimiterDialog(JFrame frame) { super(frame); setTitle("Delimiter Editor"); setModal(true); content = new JPanel(true); delimiter.setText(fmInstance.delimiter); ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent e) { fmInstance.delimiter=parseDelimiter(delimiter.getText()); setVisible(false); } }; this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { cancel.doClick(); } }); //delimiter.setText(fmInstance.delimiter); delimiter.addActionListener(al); content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); title = new JLabel("Enter Delimiter "); 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(new JLabel("")); content.add(delimiterPanel); content.add(buttonPanel); content.add(Box.createRigidArea(new java.awt.Dimension(0, 15))); delimiterPanel.add(new JLabel("Delimiter: ")); delimiterPanel.add(delimiter); 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(); setLocationRelativeTo(fmInstance); } public String parseDelimiter(Object o) { String str = o.toString(); StringBuffer sbuff = new StringBuffer(); int length = str.length(); for(int i = 0;i