diff --git a/build.xml b/build.xml index f34d1c92..1e009be7 100644 --- a/build.xml +++ b/build.xml @@ -1,72 +1,43 @@ - - - simple example build file - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jarDesc/RabbitInAHat.MF b/jarDesc/RabbitInAHat.MF deleted file mode 100644 index 35920e4b..00000000 --- a/jarDesc/RabbitInAHat.MF +++ /dev/null @@ -1,11 +0,0 @@ -Manifest-Version: 1.0 -Class-Path: . WhiteRabbit_lib/ojdbc5.jar WhiteRabbit_lib/ojdbc6.jar Wh - iteRabbit_lib/sqljdbc4.jar WhiteRabbit_lib/mysql-connector-java-5.1.3 - 0-bin.jar WhiteRabbit_lib/dom4j-1.6.1.jar WhiteRabbit_lib/poi-3.9-201 - 21203.jar WhiteRabbit_lib/poi-excelant-3.9-20121203.jar WhiteRabbit_l - ib/poi-ooxml-3.9-20121203.jar WhiteRabbit_lib/poi-ooxml-schemas-3.9-2 - 0121203.jar WhiteRabbit_lib/stax-api-1.0.1.jar WhiteRabbit_lib/xmlbea - ns-2.3.0.jar WhiteRabbit_lib/jtds-1.2.7.jar WhiteRabbit_lib/postgresq - l-9.3-1101.jdbc4.jar WhiteRabbit_lib/postgresql-9.3-1101.jdbc41.jar -Main-Class: org.ohdsi.rabbitInAHat.RabbitInAHat - diff --git a/jarDesc/RabbitInAHat.jardesc b/jarDesc/RabbitInAHat.jardesc deleted file mode 100644 index dcfdb269..00000000 --- a/jarDesc/RabbitInAHat.jardesc +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/jarDesc/WhiteRabbit.MF b/jarDesc/WhiteRabbit.MF deleted file mode 100644 index f61a32c9..00000000 --- a/jarDesc/WhiteRabbit.MF +++ /dev/null @@ -1,10 +0,0 @@ -Manifest-Version: 1.0 -Class-Path: . WhiteRabbit_lib/ojdbc5.jar WhiteRabbit_lib/ojdbc6.jar Wh - iteRabbit_lib/sqljdbc4.jar WhiteRabbit_lib/mysql-connector-java-5.1.3 - 0-bin.jar WhiteRabbit_lib/dom4j-1.6.1.jar WhiteRabbit_lib/poi-3.9-201 - 21203.jar WhiteRabbit_lib/poi-excelant-3.9-20121203.jar WhiteRabbit_l - ib/poi-ooxml-3.9-20121203.jar WhiteRabbit_lib/poi-ooxml-schemas-3.9-2 - 0121203.jar WhiteRabbit_lib/stax-api-1.0.1.jar WhiteRabbit_lib/xmlbea - ns-2.3.0.jar WhiteRabbit_lib/jtds-1.2.7.jar WhiteRabbit_lib/postgresq - l-9.3-1101.jdbc4.jar WhiteRabbit_lib/postgresql-9.3-1101.jdbc41.jar -Main-Class: org.ohdsi.whiteRabbit.WhiteRabbitMain diff --git a/jarDesc/WhiteRabbit.jardesc b/jarDesc/WhiteRabbit.jardesc deleted file mode 100644 index 4bfe056a..00000000 --- a/jarDesc/WhiteRabbit.jardesc +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/man/WhiteRabbit and Rabbit-In-a-Hat User Manual.docx b/man/WhiteRabbit and Rabbit-In-a-Hat User Manual.docx deleted file mode 100644 index eaec8b38..00000000 Binary files a/man/WhiteRabbit and Rabbit-In-a-Hat User Manual.docx and /dev/null differ diff --git a/man/WhiteRabbit and Rabbit-In-a-Hat User Manual.pdf b/man/WhiteRabbit and Rabbit-In-a-Hat User Manual.pdf deleted file mode 100644 index 3f0eff01..00000000 Binary files a/man/WhiteRabbit and Rabbit-In-a-Hat User Manual.pdf and /dev/null differ diff --git a/scripts/RabbitInAHat1.5GB.cmd b/scripts/RabbitInAHat1.5GB.cmd index a75d3e81..6103ebef 100644 --- a/scripts/RabbitInAHat1.5GB.cmd +++ b/scripts/RabbitInAHat1.5GB.cmd @@ -1 +1 @@ -java -Xmx1500m -jar RabbitInAHat.jar +java -Xmx1500m -jar RabbitInAHat.jar diff --git a/scripts/WhiteRabbit1.5GB.cmd b/scripts/WhiteRabbit1.5GB.cmd index caccdcde..2f0e67e5 100644 --- a/scripts/WhiteRabbit1.5GB.cmd +++ b/scripts/WhiteRabbit1.5GB.cmd @@ -1 +1 @@ -java -Xmx1500m -jar WhiteRabbit.jar +java -Xmx1500m -jar WhiteRabbit.jar diff --git a/src/org/ohdsi/rabbitInAHat/RabbitInAHat.java b/src/org/ohdsi/rabbitInAHat/RabbitInAHatMain.java similarity index 95% rename from src/org/ohdsi/rabbitInAHat/RabbitInAHat.java rename to src/org/ohdsi/rabbitInAHat/RabbitInAHatMain.java index 6f7771ff..3c423ae1 100644 --- a/src/org/ohdsi/rabbitInAHat/RabbitInAHat.java +++ b/src/org/ohdsi/rabbitInAHat/RabbitInAHatMain.java @@ -1,313 +1,315 @@ -/******************************************************************************* - * Copyright 2014 Observational Health Data Sciences and Informatics - * - * This file is part of WhiteRabbit - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -package org.ohdsi.rabbitInAHat; - -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.Image; -import java.awt.MediaTracker; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.InputEvent; -import java.awt.event.KeyEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; - -import javax.swing.BoxLayout; -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.KeyStroke; -import javax.swing.border.TitledBorder; -import javax.swing.filechooser.FileNameExtensionFilter; - -import org.ohdsi.rabbitInAHat.dataModel.Database; -import org.ohdsi.rabbitInAHat.dataModel.ETL; -import org.ohdsi.whiteRabbit.ObjectExchange; - -public class RabbitInAHat implements ResizeListener, ActionListener { - - private JFrame frame; - private JScrollPane scrollPane1; - private JScrollPane scrollPane2; - private MappingPanel tableMappingPanel; - private JSplitPane tableFieldSplitPane; - private String filename; - - public static void main(String[] args) { - new RabbitInAHat(); - } - - public RabbitInAHat() { - frame = new JFrame("Rabbit in a hat"); - - frame.addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - System.exit(0); - } - }); - frame.setPreferredSize(new Dimension(700, 600)); - - frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); - - frame.setJMenuBar(createMenuBar()); - - ETL etl = new ETL(); - etl.setCDMDatabase(Database.generateCDMModel()); - ObjectExchange.etl = etl; - - tableMappingPanel = new MappingPanel(etl.getTableToTableMapping()); - tableMappingPanel.addResizeListener(this); - scrollPane1 = new JScrollPane(tableMappingPanel); - scrollPane1.setBorder(new TitledBorder("Tables")); - scrollPane1.getVerticalScrollBar().setUnitIncrement(16); - scrollPane1.setAutoscrolls(true); - frame.addKeyListener(tableMappingPanel); - - MappingPanel fieldMappingPanel = new MappingPanel(etl.getTableToTableMapping()); - tableMappingPanel.setSlaveMappingPanel(fieldMappingPanel); - fieldMappingPanel.addResizeListener(this); - scrollPane2 = new JScrollPane(fieldMappingPanel); - scrollPane2.getVerticalScrollBar().setUnitIncrement(16); - scrollPane2.setVisible(false); - scrollPane2.setBorder(new TitledBorder("Fields")); - frame.addKeyListener(fieldMappingPanel); - tableFieldSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPane1, scrollPane2); - tableFieldSplitPane.setDividerLocation(600); - tableFieldSplitPane.setDividerSize(0); - - DetailsPanel detailsPanel = new DetailsPanel(); - detailsPanel.setBorder(new TitledBorder("Details")); - detailsPanel.setPreferredSize(new Dimension(200, 500)); - tableMappingPanel.setDetailsListener(detailsPanel); - fieldMappingPanel.setDetailsListener(detailsPanel); - JSplitPane leftRightSplinePane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tableFieldSplitPane, detailsPanel); - leftRightSplinePane.setDividerLocation(700); - frame.add(leftRightSplinePane); - - loadIcons(frame); - frame.pack(); - frame.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH); - frame.setVisible(true); - } - - private void loadIcons(JFrame f) { - List icons = new ArrayList(); - icons.add(loadIcon("RabbitInAHat16.png", f)); - icons.add(loadIcon("RabbitInAHat32.png", f)); - icons.add(loadIcon("RabbitInAHat48.png", f)); - icons.add(loadIcon("RabbitInAHat64.png", f)); - icons.add(loadIcon("RabbitInAHat128.png", f)); - icons.add(loadIcon("RabbitInAHat256.png", f)); - f.setIconImages(icons); - } - - private Image loadIcon(String name, JFrame f) { - Image icon = Toolkit.getDefaultToolkit().getImage(RabbitInAHat.class.getResource(name)); - MediaTracker mediaTracker = new MediaTracker(f); - mediaTracker.addImage(icon, 0); - try { - mediaTracker.waitForID(0); - return icon; - } catch (Exception e1) { - e1.printStackTrace(); - } - return null; - } - - private JMenuBar createMenuBar() { - JMenuBar menuBar = new JMenuBar(); - JMenu fileMenu = new JMenu("File"); - menuBar.add(fileMenu); - - JMenuItem openItem = new JMenuItem("Open ETL specs"); - openItem.addActionListener(this); - openItem.setActionCommand("Open ETL specs"); - openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK)); - fileMenu.add(openItem); - - JMenuItem openScanReportItem = new JMenuItem("Open scan report"); - openScanReportItem.addActionListener(this); - openScanReportItem.setActionCommand("Open scan report"); - fileMenu.add(openScanReportItem); - - JMenuItem saveItem = new JMenuItem("Save"); - saveItem.addActionListener(this); - saveItem.setActionCommand("Save"); - saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK)); - fileMenu.add(saveItem); - - JMenuItem saveAsItem = new JMenuItem("Save as"); - saveAsItem.addActionListener(this); - saveAsItem.setActionCommand("Save as"); - fileMenu.add(saveAsItem); - - JMenuItem generateDocItem = new JMenuItem("Generate ETL document"); - generateDocItem.addActionListener(this); - generateDocItem.setActionCommand("Generate ETL document"); - fileMenu.add(generateDocItem); - -// JMenu editMenu = new JMenu("Edit"); -// menuBar.add(editMenu); - -// JMenu viewMenu = new JMenu("View"); -// menuBar.add(viewMenu); - -// JMenu helpMenu = new JMenu("Help"); -// menuBar.add(helpMenu); - return menuBar; - } - - @Override - public void notifyResized(int height, boolean minimized, boolean maximized) { - if (scrollPane2.isVisible() == maximized) - scrollPane2.setVisible(!maximized); - - if (!maximized) - scrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); - else - scrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - - if (!minimized) - scrollPane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); - else - scrollPane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - - tableFieldSplitPane.setDividerLocation(height); - } - - @Override - public void actionPerformed(ActionEvent event) { - if (event.getActionCommand().equals("Save") || event.getActionCommand().equals("Save as")) { - if (filename == null || event.getActionCommand().equals("Save as")) { - JFileChooser fileChooser = new JFileChooser(); - if (fileChooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) { - File file = fileChooser.getSelectedFile(); - filename = file.getAbsolutePath(); - } - } - if (filename != null) { - frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - FileOutputStream fileOutputStream = null; - try { - fileOutputStream = new FileOutputStream(filename); - } catch (IOException e) { - e.printStackTrace(); - fileOutputStream = null; - } - GZIPOutputStream gzipOutputStream = null; - if (fileOutputStream != null) - try { - gzipOutputStream = new GZIPOutputStream(fileOutputStream); - } catch (IOException e) { - e.printStackTrace(); - gzipOutputStream = null; - try { - fileOutputStream.close(); - } catch (IOException e2) { - e2.printStackTrace(); - } - } - ObjectOutputStream out = null; - if (gzipOutputStream != null) - try { - out = new ObjectOutputStream(gzipOutputStream); - } catch (IOException e) { - e.printStackTrace(); - out = null; - try { - gzipOutputStream.close(); - } catch (IOException e2) { - e2.printStackTrace(); - } - } - - try { - out.writeObject(ObjectExchange.etl); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - out.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - - } - } else if (event.getActionCommand().equals("Open ETL specs")) { - JFileChooser fileChooser = new JFileChooser(); - if (fileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) { - File file = fileChooser.getSelectedFile(); - filename = file.getAbsolutePath(); - try { - frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - FileInputStream fileOutputStream = new FileInputStream(filename); - GZIPInputStream gzipOutputStream = new GZIPInputStream(fileOutputStream); - ObjectInputStream out = new ObjectInputStream(gzipOutputStream); - ObjectExchange.etl = (ETL) out.readObject(); - out.close(); - tableMappingPanel.setMapping(ObjectExchange.etl.getTableToTableMapping()); - frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - } catch (Exception e) { - e.printStackTrace(); - } - } - } else if (event.getActionCommand().equals("Open scan report")) { - JFileChooser fileChooser = new JFileChooser(); - if (fileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) { - frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - File file = fileChooser.getSelectedFile(); - ETL etl = new ETL(); - etl.setSourceDatabase(Database.generateModelFromScanReport(file.getAbsolutePath())); - etl.setCDMDatabase(Database.generateCDMModel()); - ObjectExchange.etl = etl; - tableMappingPanel.setMapping(etl.getTableToTableMapping()); - frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - } - - } else if (event.getActionCommand().equals("Generate ETL document")) { - JFileChooser fileChooser = new JFileChooser(); - fileChooser.setFileFilter(new FileNameExtensionFilter("DocX Files", "docX")); - if (fileChooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) { - File file = fileChooser.getSelectedFile(); - filename = file.getAbsolutePath(); - if (!filename.toLowerCase().endsWith(".docx")) - filename = filename + ".docx"; - ETLDocumentGenerator.generate(ObjectExchange.etl, filename); - } - } - - } -} +/******************************************************************************* + * Copyright 2014 Observational Health Data Sciences and Informatics + * + * This file is part of WhiteRabbit + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ +package org.ohdsi.rabbitInAHat; + +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.Image; +import java.awt.MediaTracker; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +import javax.swing.BoxLayout; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.KeyStroke; +import javax.swing.border.TitledBorder; +import javax.swing.filechooser.FileNameExtensionFilter; + +import org.ohdsi.rabbitInAHat.dataModel.Database; +import org.ohdsi.rabbitInAHat.dataModel.ETL; +import org.ohdsi.whiteRabbit.ObjectExchange; + +/** + * This is the main class for the RabbitInAHat application + */ +public class RabbitInAHatMain implements ResizeListener, ActionListener { + + private JFrame frame; + private JScrollPane scrollPane1; + private JScrollPane scrollPane2; + private MappingPanel tableMappingPanel; + private JSplitPane tableFieldSplitPane; + private String filename; + + public static void main(String[] args) { + new RabbitInAHatMain(); + } + + public RabbitInAHatMain() { + frame = new JFrame("Rabbit in a hat"); + + frame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + System.exit(0); + } + }); + frame.setPreferredSize(new Dimension(700, 600)); + + frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); + + frame.setJMenuBar(createMenuBar()); + + ETL etl = new ETL(); + etl.setCDMDatabase(Database.generateCDMModel()); + ObjectExchange.etl = etl; + + tableMappingPanel = new MappingPanel(etl.getTableToTableMapping()); + tableMappingPanel.addResizeListener(this); + scrollPane1 = new JScrollPane(tableMappingPanel); + scrollPane1.setBorder(new TitledBorder("Tables")); + scrollPane1.getVerticalScrollBar().setUnitIncrement(16); + scrollPane1.setAutoscrolls(true); + frame.addKeyListener(tableMappingPanel); + + MappingPanel fieldMappingPanel = new MappingPanel(etl.getTableToTableMapping()); + tableMappingPanel.setSlaveMappingPanel(fieldMappingPanel); + fieldMappingPanel.addResizeListener(this); + scrollPane2 = new JScrollPane(fieldMappingPanel); + scrollPane2.getVerticalScrollBar().setUnitIncrement(16); + scrollPane2.setVisible(false); + scrollPane2.setBorder(new TitledBorder("Fields")); + frame.addKeyListener(fieldMappingPanel); + tableFieldSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPane1, scrollPane2); + tableFieldSplitPane.setDividerLocation(600); + tableFieldSplitPane.setDividerSize(0); + + DetailsPanel detailsPanel = new DetailsPanel(); + detailsPanel.setBorder(new TitledBorder("Details")); + detailsPanel.setPreferredSize(new Dimension(200, 500)); + tableMappingPanel.setDetailsListener(detailsPanel); + fieldMappingPanel.setDetailsListener(detailsPanel); + JSplitPane leftRightSplinePane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tableFieldSplitPane, detailsPanel); + leftRightSplinePane.setDividerLocation(700); + frame.add(leftRightSplinePane); + + loadIcons(frame); + frame.pack(); + frame.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH); + frame.setVisible(true); + } + + private void loadIcons(JFrame f) { + List icons = new ArrayList(); + icons.add(loadIcon("RabbitInAHat16.png", f)); + icons.add(loadIcon("RabbitInAHat32.png", f)); + icons.add(loadIcon("RabbitInAHat48.png", f)); + icons.add(loadIcon("RabbitInAHat64.png", f)); + icons.add(loadIcon("RabbitInAHat128.png", f)); + icons.add(loadIcon("RabbitInAHat256.png", f)); + f.setIconImages(icons); + } + + private Image loadIcon(String name, JFrame f) { + Image icon = Toolkit.getDefaultToolkit().getImage(RabbitInAHatMain.class.getResource(name)); + MediaTracker mediaTracker = new MediaTracker(f); + mediaTracker.addImage(icon, 0); + try { + mediaTracker.waitForID(0); + return icon; + } catch (Exception e1) { + e1.printStackTrace(); + } + return null; + } + + private JMenuBar createMenuBar() { + JMenuBar menuBar = new JMenuBar(); + JMenu fileMenu = new JMenu("File"); + menuBar.add(fileMenu); + + JMenuItem openItem = new JMenuItem("Open ETL specs"); + openItem.addActionListener(this); + openItem.setActionCommand("Open ETL specs"); + openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK)); + fileMenu.add(openItem); + + JMenuItem openScanReportItem = new JMenuItem("Open scan report"); + openScanReportItem.addActionListener(this); + openScanReportItem.setActionCommand("Open scan report"); + fileMenu.add(openScanReportItem); + + JMenuItem saveItem = new JMenuItem("Save"); + saveItem.addActionListener(this); + saveItem.setActionCommand("Save"); + saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK)); + fileMenu.add(saveItem); + + JMenuItem saveAsItem = new JMenuItem("Save as"); + saveAsItem.addActionListener(this); + saveAsItem.setActionCommand("Save as"); + fileMenu.add(saveAsItem); + + JMenuItem generateDocItem = new JMenuItem("Generate ETL document"); + generateDocItem.addActionListener(this); + generateDocItem.setActionCommand("Generate ETL document"); + fileMenu.add(generateDocItem); + +// JMenu editMenu = new JMenu("Edit"); +// menuBar.add(editMenu); + +// JMenu viewMenu = new JMenu("View"); +// menuBar.add(viewMenu); + +// JMenu helpMenu = new JMenu("Help"); +// menuBar.add(helpMenu); + return menuBar; + } + + @Override + public void notifyResized(int height, boolean minimized, boolean maximized) { + if (scrollPane2.isVisible() == maximized) + scrollPane2.setVisible(!maximized); + + if (!maximized) + scrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + else + scrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + + if (!minimized) + scrollPane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + else + scrollPane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + + tableFieldSplitPane.setDividerLocation(height); + } + + @Override + public void actionPerformed(ActionEvent event) { + if (event.getActionCommand().equals("Save") || event.getActionCommand().equals("Save as")) { + if (filename == null || event.getActionCommand().equals("Save as")) { + JFileChooser fileChooser = new JFileChooser(); + if (fileChooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) { + File file = fileChooser.getSelectedFile(); + filename = file.getAbsolutePath(); + } + } + if (filename != null) { + frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(filename); + } catch (IOException e) { + e.printStackTrace(); + fileOutputStream = null; + } + GZIPOutputStream gzipOutputStream = null; + if (fileOutputStream != null) + try { + gzipOutputStream = new GZIPOutputStream(fileOutputStream); + } catch (IOException e) { + e.printStackTrace(); + gzipOutputStream = null; + try { + fileOutputStream.close(); + } catch (IOException e2) { + e2.printStackTrace(); + } + } + ObjectOutputStream out = null; + if (gzipOutputStream != null) + try { + out = new ObjectOutputStream(gzipOutputStream); + } catch (IOException e) { + e.printStackTrace(); + out = null; + try { + gzipOutputStream.close(); + } catch (IOException e2) { + e2.printStackTrace(); + } + } + + try { + out.writeObject(ObjectExchange.etl); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + + } + } else if (event.getActionCommand().equals("Open ETL specs")) { + JFileChooser fileChooser = new JFileChooser(); + if (fileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) { + File file = fileChooser.getSelectedFile(); + filename = file.getAbsolutePath(); + try { + frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + FileInputStream fileOutputStream = new FileInputStream(filename); + GZIPInputStream gzipOutputStream = new GZIPInputStream(fileOutputStream); + ObjectInputStream out = new ObjectInputStream(gzipOutputStream); + ObjectExchange.etl = (ETL) out.readObject(); + out.close(); + tableMappingPanel.setMapping(ObjectExchange.etl.getTableToTableMapping()); + frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } catch (Exception e) { + e.printStackTrace(); + } + } + } else if (event.getActionCommand().equals("Open scan report")) { + JFileChooser fileChooser = new JFileChooser(); + if (fileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) { + frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + File file = fileChooser.getSelectedFile(); + ETL etl = new ETL(); + etl.setSourceDatabase(Database.generateModelFromScanReport(file.getAbsolutePath())); + etl.setCDMDatabase(Database.generateCDMModel()); + ObjectExchange.etl = etl; + tableMappingPanel.setMapping(etl.getTableToTableMapping()); + frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + + } else if (event.getActionCommand().equals("Generate ETL document")) { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setFileFilter(new FileNameExtensionFilter("DocX Files", "docX")); + if (fileChooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) { + File file = fileChooser.getSelectedFile(); + filename = file.getAbsolutePath(); + if (!filename.toLowerCase().endsWith(".docx")) + filename = filename + ".docx"; + ETLDocumentGenerator.generate(ObjectExchange.etl, filename); + } + } + } +} diff --git a/src/org/ohdsi/whiteRabbit/ObjectExchange.java b/src/org/ohdsi/whiteRabbit/ObjectExchange.java index c02dd77c..78814875 100644 --- a/src/org/ohdsi/whiteRabbit/ObjectExchange.java +++ b/src/org/ohdsi/whiteRabbit/ObjectExchange.java @@ -1,28 +1,31 @@ -/******************************************************************************* - * Copyright 2014 Observational Health Data Sciences and Informatics - * - * This file is part of WhiteRabbit - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -package org.ohdsi.whiteRabbit; - -import javax.swing.JFrame; - -import org.ohdsi.rabbitInAHat.dataModel.ETL; - -public class ObjectExchange { - public static JFrame frame; - public static Console console; - public static ETL etl; -} +/******************************************************************************* + * Copyright 2014 Observational Health Data Sciences and Informatics + * + * This file is part of WhiteRabbit + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ +package org.ohdsi.whiteRabbit; + +import javax.swing.JFrame; + +import org.ohdsi.rabbitInAHat.dataModel.ETL; + +/** + * This class is used to hold global variables + */ +public class ObjectExchange { + public static JFrame frame; + public static Console console; + public static ETL etl; +} diff --git a/src/org/ohdsi/whiteRabbit/WhiteRabbitMain.java b/src/org/ohdsi/whiteRabbit/WhiteRabbitMain.java index 84318e76..7b9e929b 100644 --- a/src/org/ohdsi/whiteRabbit/WhiteRabbitMain.java +++ b/src/org/ohdsi/whiteRabbit/WhiteRabbitMain.java @@ -1,950 +1,953 @@ -/******************************************************************************* - * Copyright 2014 Observational Health Data Sciences and Informatics - * - * This file is part of WhiteRabbit - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -package org.ohdsi.whiteRabbit; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Image; -import java.awt.MediaTracker; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.File; -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JScrollPane; -import javax.swing.JSpinner; -import javax.swing.JTabbedPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.border.TitledBorder; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.filechooser.FileNameExtensionFilter; - -import org.ohdsi.databases.DbType; -import org.ohdsi.databases.RichConnection; -import org.ohdsi.utilities.DirectoryUtilities; -import org.ohdsi.utilities.StringUtilities; -import org.ohdsi.whiteRabbit.fakeDataGenerator.FakeDataGenerator; -import org.ohdsi.whiteRabbit.scan.SourceDataScan; - -public class WhiteRabbitMain { - - private JFrame frame; - private JTextField folderField; - private JTextField scanReportFileField; - - private JComboBox scanRowCount; - private JCheckBox scanValueScan; - private JSpinner scanMinCellCount; - private JSpinner generateRowCount; - private JComboBox sourceType; - private JComboBox targetType; - private JTextField targetUserField; - private JTextField targetPasswordField; - private JTextField targetServerField; - private JTextField targetDatabaseField; - private JTextField sourceDelimiterField; - private JTextField targetDelimiterField; - private JTextField sourceServerField; - private JTextField sourceUserField; - private JTextField sourcePasswordField; - private JTextField sourceDatabaseField; - private JButton addAllButton; - private JList tableList; - private List tables = new ArrayList(); - private boolean sourceIsFiles = true; - private boolean targetIsFiles = false; - - private List componentsToDisableWhenRunning = new ArrayList(); - - public static void main(String[] args) { - new WhiteRabbitMain(args); - } - - public WhiteRabbitMain(String[] args) { - frame = new JFrame("White Rabbit"); - - frame.addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - System.exit(0); - } - }); - frame.setLayout(new BorderLayout()); - - JComponent tabsPanel = createTabsPanel(); - JComponent consolePanel = createConsolePanel(); - - frame.add(consolePanel, BorderLayout.CENTER); - frame.add(tabsPanel, BorderLayout.NORTH); - - loadIcons(frame); - frame.pack(); - frame.setVisible(true); - ObjectExchange.frame = frame; - executeParameters(args); - } - - private JComponent createTabsPanel() { - JTabbedPane tabbedPane = new JTabbedPane(); - - JPanel locationPanel = createLocationsPanel(); - tabbedPane.addTab("Locations", null, locationPanel, "Specify the location of the source data and the working folder"); - - JPanel scanPanel = createScanPanel(); - tabbedPane.addTab("Scan", null, scanPanel, "Create a scan of the source data"); - - JPanel fakeDataPanel = createFakeDataPanel(); - tabbedPane.addTab("Fake data generation", null, fakeDataPanel, "Create fake data based on a scan report for development purposes"); - - return tabbedPane; - } - - private JPanel createLocationsPanel() { - JPanel panel = new JPanel(); - - panel.setLayout(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - c.fill = GridBagConstraints.BOTH; - c.weightx = 0.5; - - JPanel folderPanel = new JPanel(); - folderPanel.setLayout(new BoxLayout(folderPanel, BoxLayout.X_AXIS)); - folderPanel.setBorder(BorderFactory.createTitledBorder("Working folder")); - folderField = new JTextField(); - folderField.setText((new File("").getAbsolutePath())); - folderField.setToolTipText("The folder where all output will be written"); - folderPanel.add(folderField); - JButton pickButton = new JButton("Pick folder"); - pickButton.setToolTipText("Pick a different working folder"); - folderPanel.add(pickButton); - pickButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - pickFolder(); - } - }); - componentsToDisableWhenRunning.add(pickButton); - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 1; - panel.add(folderPanel, c); - - JPanel sourcePanel = new JPanel(); - sourcePanel.setLayout(new GridLayout(0, 2)); - sourcePanel.setBorder(BorderFactory.createTitledBorder("Source data location")); - sourcePanel.add(new JLabel("Data type")); - sourceType = new JComboBox(new String[] { "Delimited text files", "MySQL", "Oracle", "SQL Server", "PostgreSQL" }); - sourceType.setToolTipText("Select the type of source data available"); - sourceType.addItemListener(new ItemListener() { - - @Override - public void itemStateChanged(ItemEvent arg0) { - sourceIsFiles = arg0.getItem().toString().equals("Delimited text files"); - sourceServerField.setEnabled(!sourceIsFiles); - sourceUserField.setEnabled(!sourceIsFiles); - sourcePasswordField.setEnabled(!sourceIsFiles); - sourceDatabaseField.setEnabled(!sourceIsFiles); - sourceDelimiterField.setEnabled(sourceIsFiles); - addAllButton.setEnabled(!sourceIsFiles); - - if (!sourceIsFiles && arg0.getItem().toString().equals("Oracle")) { - sourceServerField - .setToolTipText("For Oracle servers this field contains the SID, servicename, and optionally the port: '/', ':/', '/', or ':/'"); - sourceUserField.setToolTipText("For Oracle servers this field contains the name of the user used to log in"); - sourcePasswordField.setToolTipText("For Oracle servers this field contains the password corresponding to the user"); - sourceDatabaseField - .setToolTipText("For Oracle servers this field contains the schema (i.e. 'user' in Oracle terms) containing the source tables"); - } else if (!sourceIsFiles && arg0.getItem().toString().equals("PostgreSQL")) { - sourceServerField.setToolTipText("For PostgreSQL servers this field contains the host name and database name (/)"); - sourceUserField.setToolTipText("The user used to log in to the server"); - sourcePasswordField.setToolTipText("The password used to log in to the server"); - sourceDatabaseField.setToolTipText("For PostgreSQL servers this field contains the schema containing the source tables"); - } else if (!sourceIsFiles) { - sourceServerField.setToolTipText("This field contains the name or IP address of the database server"); - if (arg0.getItem().toString().equals("SQL Server")) - sourceUserField - .setToolTipText("The user used to log in to the server. Optionally, the domain can be specified as / (e.g. 'MyDomain/Joe')"); - else - sourceUserField.setToolTipText("The user used to log in to the server"); - sourcePasswordField.setToolTipText("The password used to log in to the server"); - sourceDatabaseField.setToolTipText("The name of the database containing the source tables"); - } - } - }); - sourcePanel.add(sourceType); - - sourcePanel.add(new JLabel("Server location")); - sourceServerField = new JTextField("127.0.0.1"); - sourceServerField.setEnabled(false); - sourcePanel.add(sourceServerField); - sourcePanel.add(new JLabel("User name")); - sourceUserField = new JTextField(""); - sourceUserField.setEnabled(false); - sourcePanel.add(sourceUserField); - sourcePanel.add(new JLabel("Password")); - sourcePasswordField = new JPasswordField(""); - sourcePasswordField.setEnabled(false); - sourcePanel.add(sourcePasswordField); - sourcePanel.add(new JLabel("Database name")); - sourceDatabaseField = new JTextField(""); - sourceDatabaseField.setEnabled(false); - sourcePanel.add(sourceDatabaseField); - - sourcePanel.add(new JLabel("Delimiter")); - sourceDelimiterField = new JTextField(","); - sourceDelimiterField.setToolTipText("The delimiter that separates values. Enter 'tab' for tab."); - sourcePanel.add(sourceDelimiterField); - - c.gridx = 0; - c.gridy = 1; - c.gridwidth = 1; - panel.add(sourcePanel, c); - - JPanel testConnectionButtonPanel = new JPanel(); - testConnectionButtonPanel.setLayout(new BoxLayout(testConnectionButtonPanel, BoxLayout.X_AXIS)); - testConnectionButtonPanel.add(Box.createHorizontalGlue()); - - JButton testConnectionButton = new JButton("Test connection"); - testConnectionButton.setBackground(new Color(151, 220, 141)); - testConnectionButton.setToolTipText("Test the connection"); - testConnectionButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - testConnection(getSourceDbSettings()); - } - }); - componentsToDisableWhenRunning.add(testConnectionButton); - testConnectionButtonPanel.add(testConnectionButton); - - c.gridx = 0; - c.gridy = 2; - c.gridwidth = 1; - panel.add(testConnectionButtonPanel, c); - - return panel; - } - - private JPanel createScanPanel() { - JPanel panel = new JPanel(); - panel.setLayout(new BorderLayout()); - - JPanel tablePanel = new JPanel(); - tablePanel.setLayout(new BorderLayout()); - tablePanel.setBorder(new TitledBorder("Tables to scan")); - tableList = new JList(); - tableList.setToolTipText("Specify the tables (or CSV files) to be scanned here"); - tablePanel.add(new JScrollPane(tableList), BorderLayout.CENTER); - - JPanel tableButtonPanel = new JPanel(); - tableButtonPanel.setLayout(new GridLayout(3, 1)); - addAllButton = new JButton("Add all in DB"); - addAllButton.setToolTipText("Add all tables in the database"); - addAllButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - addAllTables(); - } - }); - addAllButton.setEnabled(false); - tableButtonPanel.add(addAllButton); - JButton addButton = new JButton("Add"); - addButton.setToolTipText("Add tables to list"); - addButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - pickTables(); - } - }); - tableButtonPanel.add(addButton); - JButton removeButton = new JButton("Remove"); - removeButton.setToolTipText("Remove tables from list"); - removeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - removeTables(); - } - }); - tableButtonPanel.add(removeButton); - tablePanel.add(tableButtonPanel, BorderLayout.EAST); - - panel.add(tablePanel, BorderLayout.CENTER); - - JPanel southPanel = new JPanel(); - southPanel.setLayout(new BoxLayout(southPanel, BoxLayout.Y_AXIS)); - - JPanel scanOptionsPanel = new JPanel(); - scanOptionsPanel.setLayout(new BoxLayout(scanOptionsPanel, BoxLayout.X_AXIS)); - - scanValueScan = new JCheckBox("Scan field values", true); - scanValueScan.setToolTipText("Include a frequency count of field values in the scan report"); - scanValueScan.addChangeListener(new ChangeListener() { - - @Override - public void stateChanged(ChangeEvent arg0) { - scanMinCellCount.setEnabled(((JCheckBox) arg0.getSource()).isSelected()); - scanRowCount.setEnabled(((JCheckBox) arg0.getSource()).isSelected()); - } - }); - scanOptionsPanel.add(scanValueScan); - scanOptionsPanel.add(Box.createHorizontalGlue()); - - scanOptionsPanel.add(new JLabel("Min cell count ")); - scanMinCellCount = new JSpinner(); - scanMinCellCount.setValue(25); - scanMinCellCount.setToolTipText("Minimum frequency for a field value to be included in the report"); - scanOptionsPanel.add(scanMinCellCount); - scanOptionsPanel.add(Box.createHorizontalGlue()); - - scanOptionsPanel.add(new JLabel("Rows per table ")); - scanRowCount = new JComboBox(new String[] { "100,000", "1 million", "all" }); - scanRowCount.setSelectedIndex(1); - scanRowCount.setToolTipText("Maximum number of rows per table to be scanned for field values"); - scanOptionsPanel.add(scanRowCount); - - southPanel.add(scanOptionsPanel); - - southPanel.add(Box.createVerticalStrut(3)); - - JPanel scanButtonPanel = new JPanel(); - scanButtonPanel.setLayout(new BoxLayout(scanButtonPanel, BoxLayout.X_AXIS)); - scanButtonPanel.add(Box.createHorizontalGlue()); - - JButton scanButton = new JButton("Scan tables"); - scanButton.setBackground(new Color(151, 220, 141)); - scanButton.setToolTipText("Scan the selected tables"); - scanButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - scanRun(); - } - }); - componentsToDisableWhenRunning.add(scanButton); - scanButtonPanel.add(scanButton); - southPanel.add(scanButtonPanel); - - panel.add(southPanel, BorderLayout.SOUTH); - - return panel; - } - - private JPanel createFakeDataPanel() { - JPanel panel = new JPanel(); - - panel.setLayout(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - c.fill = GridBagConstraints.BOTH; - c.weightx = 0.5; - - JPanel folderPanel = new JPanel(); - folderPanel.setLayout(new BoxLayout(folderPanel, BoxLayout.X_AXIS)); - folderPanel.setBorder(BorderFactory.createTitledBorder("Scan report file")); - scanReportFileField = new JTextField(); - scanReportFileField.setText((new File("ScanReport.xlsx").getAbsolutePath())); - scanReportFileField.setToolTipText("The path to the scan report that will be used as a template to generate the fake data"); - folderPanel.add(scanReportFileField); - JButton pickButton = new JButton("Pick file"); - pickButton.setToolTipText("Pick a scan report file"); - folderPanel.add(pickButton); - pickButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - pickScanReportFile(); - } - }); - componentsToDisableWhenRunning.add(pickButton); - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 1; - panel.add(folderPanel, c); - - JPanel targetPanel = new JPanel(); - targetPanel.setLayout(new GridLayout(0, 2)); - targetPanel.setBorder(BorderFactory.createTitledBorder("Target data location")); - targetPanel.add(new JLabel("Data type")); - // targetType = new JComboBox(new String[] { "Delimited text files", "MySQL", "Oracle", "SQL Server", "PostgreSQL" }); - targetType = new JComboBox(new String[] { "Delimited text files", "MySQL" }); - targetType.setToolTipText("Select the type of source data available"); - targetType.addItemListener(new ItemListener() { - - @Override - public void itemStateChanged(ItemEvent arg0) { - targetIsFiles = arg0.getItem().toString().equals("Delimited text files"); - targetServerField.setEnabled(!targetIsFiles); - targetUserField.setEnabled(!targetIsFiles); - targetPasswordField.setEnabled(!targetIsFiles); - targetDatabaseField.setEnabled(!targetIsFiles); - targetDelimiterField.setEnabled(targetIsFiles); - - if (!targetIsFiles && arg0.getItem().toString().equals("Oracle")) { - targetServerField - .setToolTipText("For Oracle servers this field contains the SID, servicename, and optionally the port: '/', ':/', '/', or ':/'"); - targetUserField.setToolTipText("For Oracle servers this field contains the name of the user used to log in"); - targetPasswordField.setToolTipText("For Oracle servers this field contains the password corresponding to the user"); - targetDatabaseField - .setToolTipText("For Oracle servers this field contains the schema (i.e. 'user' in Oracle terms) containing the source tables"); - } else if (!targetIsFiles && arg0.getItem().toString().equals("PostgreSQL")) { - targetServerField.setToolTipText("For PostgreSQL servers this field contains the host name and database name (/)"); - targetUserField.setToolTipText("The user used to log in to the server"); - targetPasswordField.setToolTipText("The password used to log in to the server"); - targetDatabaseField.setToolTipText("For PostgreSQL servers this field contains the schema containing the source tables"); - } else if (!targetIsFiles) { - targetServerField.setToolTipText("This field contains the name or IP address of the database server"); - if (arg0.getItem().toString().equals("SQL Server")) - targetUserField - .setToolTipText("The user used to log in to the server. Optionally, the domain can be specified as / (e.g. 'MyDomain/Joe')"); - else - targetUserField.setToolTipText("The user used to log in to the server"); - targetPasswordField.setToolTipText("The password used to log in to the server"); - targetDatabaseField.setToolTipText("The name of the database containing the source tables"); - } - } - }); - targetPanel.add(targetType); - - targetPanel.add(new JLabel("Server location")); - targetServerField = new JTextField("127.0.0.1"); - targetServerField.setEnabled(false); - targetPanel.add(targetServerField); - targetPanel.add(new JLabel("User name")); - targetUserField = new JTextField(""); - targetUserField.setEnabled(false); - targetPanel.add(targetUserField); - targetPanel.add(new JLabel("Password")); - targetPasswordField = new JPasswordField(""); - targetPasswordField.setEnabled(false); - targetPanel.add(targetPasswordField); - targetPanel.add(new JLabel("Database name")); - targetDatabaseField = new JTextField(""); - targetDatabaseField.setEnabled(false); - targetPanel.add(targetDatabaseField); - - targetPanel.add(new JLabel("Delimiter")); - targetDelimiterField = new JTextField(","); - targetDelimiterField.setToolTipText("The delimiter that separates values. Enter 'tab' for tab."); - targetDelimiterField.setEnabled(true); - targetPanel.add(targetDelimiterField); - - c.gridx = 0; - c.gridy = 1; - c.gridwidth = 1; - panel.add(targetPanel, c); - - JPanel fakeDataButtonPanel = new JPanel(); - fakeDataButtonPanel.setLayout(new BoxLayout(fakeDataButtonPanel, BoxLayout.X_AXIS)); - - fakeDataButtonPanel.add(new JLabel("Max rows per table")); - generateRowCount = new JSpinner(); - generateRowCount.setValue(10000); - fakeDataButtonPanel.add(generateRowCount); - fakeDataButtonPanel.add(Box.createHorizontalGlue()); - - JButton testConnectionButton = new JButton("Test connection"); - testConnectionButton.setBackground(new Color(151, 220, 141)); - testConnectionButton.setToolTipText("Test the connection"); - testConnectionButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - testConnection(getTargetDbSettings()); - } - }); - componentsToDisableWhenRunning.add(testConnectionButton); - fakeDataButtonPanel.add(testConnectionButton); - - JButton fakeDataButton = new JButton("Generate fake data"); - fakeDataButton.setBackground(new Color(151, 220, 141)); - fakeDataButton.setToolTipText("Generate fake data based on the scan report"); - fakeDataButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - fakeDataRun(); - } - }); - componentsToDisableWhenRunning.add(fakeDataButton); - fakeDataButtonPanel.add(fakeDataButton); - - c.gridx = 0; - c.gridy = 2; - c.gridwidth = 1; - panel.add(fakeDataButtonPanel, c); - - return panel; - } - - private JComponent createConsolePanel() { - JTextArea consoleArea = new JTextArea(); - consoleArea.setToolTipText("General progress information"); - consoleArea.setEditable(false); - Console console = new Console(); - console.setTextArea(consoleArea); - // console.setDebugFile("c:/temp/debug.txt"); - System.setOut(new PrintStream(console)); - System.setErr(new PrintStream(console)); - JScrollPane consoleScrollPane = new JScrollPane(consoleArea); - consoleScrollPane.setBorder(BorderFactory.createTitledBorder("Console")); - consoleScrollPane.setPreferredSize(new Dimension(800, 200)); - consoleScrollPane.setAutoscrolls(true); - ObjectExchange.console = console; - return consoleScrollPane; - } - - private void loadIcons(JFrame f) { - List icons = new ArrayList(); - icons.add(loadIcon("WhiteRabbit16.png", f)); - icons.add(loadIcon("WhiteRabbit32.png", f)); - icons.add(loadIcon("WhiteRabbit48.png", f)); - icons.add(loadIcon("WhiteRabbit64.png", f)); - icons.add(loadIcon("WhiteRabbit128.png", f)); - icons.add(loadIcon("WhiteRabbit256.png", f)); - f.setIconImages(icons); - } - - private Image loadIcon(String name, JFrame f) { - Image icon = Toolkit.getDefaultToolkit().getImage(WhiteRabbitMain.class.getResource(name)); - MediaTracker mediaTracker = new MediaTracker(f); - mediaTracker.addImage(icon, 0); - try { - mediaTracker.waitForID(0); - return icon; - } catch (Exception e1) { - e1.printStackTrace(); - } - return null; - } - - private void executeParameters(String[] args) { - String mode = null; - for (String arg : args) { - if (arg.startsWith("-")) { - mode = arg.toLowerCase(); - } else { - if (mode.equals("-folder")) - folderField.setText(arg); - if (mode.equals("-targetpassword")) - targetPasswordField.setText(arg); - if (mode.equals("-targetserver")) - targetServerField.setText(arg); - if (mode.equals("-targettype")) - targetType.setSelectedItem(arg); - if (mode.equals("-targetdatabase")) - targetDatabaseField.setText(arg); - if (mode.equals("-targetuser")) - targetUserField.setText(arg); - if (mode.equals("-sourceserver")) - sourceServerField.setText(arg); - if (mode.equals("-sourcetype")) - sourceType.setSelectedItem(arg); - if (mode.equals("-sourcedatabase")) - sourceDatabaseField.setText(arg); - if (mode.equals("-sourceuser")) - sourceUserField.setText(arg); - if (mode.equals("-sourcepassword")) - sourcePasswordField.setText(arg); - mode = null; - } - } - } - - private void pickFolder() { - JFileChooser fileChooser = new JFileChooser(new File(folderField.getText())); - fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - int returnVal = fileChooser.showDialog(frame, "Select folder"); - if (returnVal == JFileChooser.APPROVE_OPTION) - folderField.setText(fileChooser.getSelectedFile().getAbsolutePath()); - } - - private void pickScanReportFile() { - JFileChooser fileChooser = new JFileChooser(new File(folderField.getText())); - fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); - int returnVal = fileChooser.showDialog(frame, "Select scan report file"); - if (returnVal == JFileChooser.APPROVE_OPTION) - scanReportFileField.setText(fileChooser.getSelectedFile().getAbsolutePath()); - } - - private void removeTables() { - for (Object item : tableList.getSelectedValues()) { - tables.remove(item); - tableList.setListData(tables.toArray()); - } - } - - private void addAllTables() { - DbSettings sourceDbSettings = getSourceDbSettings(); - if (sourceDbSettings != null) { - RichConnection connection = new RichConnection(sourceDbSettings.server, sourceDbSettings.domain, sourceDbSettings.user, sourceDbSettings.password, - sourceDbSettings.dbType); - for (String table : connection.getTableNames(sourceDbSettings.database)) { - if (!tables.contains(table)) - tables.add((String) table); - tableList.setListData(tables.toArray()); - } - connection.close(); - } - } - - private void pickTables() { - DbSettings sourceDbSettings = getSourceDbSettings(); - if (sourceDbSettings != null) { - if (sourceDbSettings.dataType == DbSettings.CSVFILES) { - JFileChooser fileChooser = new JFileChooser(new File(folderField.getText())); - fileChooser.setMultiSelectionEnabled(true); - fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); - FileNameExtensionFilter filter = new FileNameExtensionFilter("Delimited text files", "csv", "txt"); - fileChooser.setFileFilter(filter); - - int returnVal = fileChooser.showDialog(frame, "Select tables"); - if (returnVal == JFileChooser.APPROVE_OPTION) { - for (File table : fileChooser.getSelectedFiles()) { - String tableName = DirectoryUtilities.getRelativePath(new File(folderField.getText()), table); - if (!tables.contains(tableName)) - tables.add(tableName); - tableList.setListData(tables.toArray()); - } - - } - } else if (sourceDbSettings.dataType == DbSettings.DATABASE) { - RichConnection connection = new RichConnection(sourceDbSettings.server, sourceDbSettings.domain, sourceDbSettings.user, - sourceDbSettings.password, sourceDbSettings.dbType); - String tableNames = StringUtilities.join(connection.getTableNames(sourceDbSettings.database), "\t"); - DBTableSelectionDialog selectionDialog = new DBTableSelectionDialog(frame, true, tableNames); - if (selectionDialog.getAnswer()) { - for (Object item : selectionDialog.getSelectedItems()) { - if (!tables.contains(item)) - tables.add((String) item); - tableList.setListData(tables.toArray()); - } - } - connection.close(); - } - } - } - - private DbSettings getSourceDbSettings() { - DbSettings dbSettings = new DbSettings(); - if (sourceType.getSelectedItem().equals("Delimited text files")) { - dbSettings.dataType = DbSettings.CSVFILES; - if (sourceDelimiterField.getText().length() == 0) { - JOptionPane.showMessageDialog(frame, "Delimiter field cannot be empty for source database", "Error connecting to server", - JOptionPane.ERROR_MESSAGE); - return null; - } - if (sourceDelimiterField.getText().toLowerCase().equals("tab")) - dbSettings.delimiter = '\t'; - else - dbSettings.delimiter = sourceDelimiterField.getText().charAt(0); - } else { - dbSettings.dataType = DbSettings.DATABASE; - dbSettings.user = sourceUserField.getText(); - dbSettings.password = sourcePasswordField.getText(); - dbSettings.server = sourceServerField.getText(); - dbSettings.database = sourceDatabaseField.getText().trim().length() == 0 ? null : sourceDatabaseField.getText(); - if (sourceType.getSelectedItem().toString().equals("MySQL")) - dbSettings.dbType = DbType.MYSQL; - else if (sourceType.getSelectedItem().toString().equals("Oracle")) - dbSettings.dbType = DbType.ORACLE; - else if (sourceType.getSelectedItem().toString().equals("PostgreSQL")) - dbSettings.dbType = DbType.POSTGRESQL; - else if (sourceType.getSelectedItem().toString().equals("SQL Server")) { - dbSettings.dbType = DbType.MSSQL; - if (sourceUserField.getText().length() != 0) { // Not using windows authentication - String[] parts = sourceUserField.getText().split("/"); - if (parts.length == 2) { - dbSettings.user = parts[1]; - dbSettings.domain = parts[0]; - } - } - } - } - return dbSettings; - } - - private void testConnection(DbSettings dbSettings) { - if (dbSettings.dataType == DbSettings.CSVFILES) { - if (new File(folderField.getText()).exists()) { - String message = "Folder " + folderField.getText() + " found"; - JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Working folder found", JOptionPane.INFORMATION_MESSAGE); - } else { - String message = "Folder " + folderField.getText() + " not found"; - JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Working folder not found", JOptionPane.ERROR_MESSAGE); - } - } else { - if (dbSettings.database == null || dbSettings.database.equals("")) { - JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap("Please specify database name", 80), "Error connecting to server", - JOptionPane.ERROR_MESSAGE); - return; - } - if (dbSettings.server == null || dbSettings.server.equals("")) { - JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap("Please specify the server", 80), "Error connecting to server", - JOptionPane.ERROR_MESSAGE); - return; - } - - RichConnection connection; - try { - connection = new RichConnection(dbSettings.server, dbSettings.domain, dbSettings.user, dbSettings.password, dbSettings.dbType); - } catch (Exception e) { - String message = "Could not connect: " + e.getMessage(); - JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Error connecting to server", JOptionPane.ERROR_MESSAGE); - return; - } - - try { - connection.getTableNames(dbSettings.database); - } catch (Exception e) { - String message = "Could not connect to database: " + e.getMessage(); - JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Error connecting to server", JOptionPane.ERROR_MESSAGE); - return; - } - - connection.close(); - String message = "Succesfully connected to " + dbSettings.database + " on server " + dbSettings.server; - JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Connection succesful", JOptionPane.INFORMATION_MESSAGE); - - } - } - - private DbSettings getTargetDbSettings() { - DbSettings dbSettings = new DbSettings(); - if (targetType.getSelectedItem().equals("Delimited text files")) { - dbSettings.dataType = DbSettings.CSVFILES; - if (targetDelimiterField.getText().length() == 0) { - JOptionPane.showMessageDialog(frame, "Delimiter field cannot be empty for target files", "Error", JOptionPane.ERROR_MESSAGE); - return null; - } - if (targetDelimiterField.getText().toLowerCase().equals("tab")) - dbSettings.delimiter = '\t'; - else - dbSettings.delimiter = targetDelimiterField.getText().charAt(0); - } else { - dbSettings.dataType = DbSettings.DATABASE; - dbSettings.user = targetUserField.getText(); - dbSettings.password = targetPasswordField.getText(); - dbSettings.server = targetServerField.getText(); - dbSettings.database = targetDatabaseField.getText(); - if (targetType.getSelectedItem().toString().equals("MySQL")) - dbSettings.dbType = DbType.MYSQL; - else if (targetType.getSelectedItem().toString().equals("Oracle")) - dbSettings.dbType = DbType.ORACLE; - else if (sourceType.getSelectedItem().toString().equals("PostgreSQL")) - dbSettings.dbType = DbType.POSTGRESQL; - else if (sourceType.getSelectedItem().toString().equals("SQL Server")) { - dbSettings.dbType = DbType.MSSQL; - if (sourceUserField.getText().length() != 0) { // Not using windows authentication - String[] parts = sourceUserField.getText().split("/"); - if (parts.length == 2) { - dbSettings.user = parts[1]; - dbSettings.domain = parts[0]; - } - } - } - - if (dbSettings.database.trim().length() == 0) { - String message = "Please specify a name for the target database"; - JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Database error", JOptionPane.ERROR_MESSAGE); - return null; - } - } - return dbSettings; - } - - private void scanRun() { - if (tables.size() == 0) { - if (sourceIsFiles) { - String message = "No files selected for scanning"; - JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "No files selected", JOptionPane.ERROR_MESSAGE); - return; - } else { - String message = "No tables were selected for scanning. Do you want to select all tables in the database for scanning?"; - String title = "No tables selected"; - int answer = JOptionPane.showConfirmDialog(ObjectExchange.frame, message, title, JOptionPane.YES_NO_OPTION); - if (answer == JOptionPane.YES_OPTION) { - addAllTables(); - } else - return; - } - } - int rowCount = 0; - if (scanRowCount.getSelectedItem().toString().equals("100,000")) - rowCount = 100000; - else if (scanRowCount.getSelectedItem().toString().equals("1 million")) - rowCount = 1000000; - if (scanRowCount.getSelectedItem().toString().equals("all")) - rowCount = -1; - - ScanThread scanThread = new ScanThread(rowCount, scanValueScan.isSelected(), Integer.parseInt(scanMinCellCount.getValue().toString())); - scanThread.start(); - } - - private void fakeDataRun() { - String filename = scanReportFileField.getText(); - if (!new File(filename).exists()) { - String message = "File " + filename + " not found"; - JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "File not found", JOptionPane.ERROR_MESSAGE); - } else { - FakeDataThread thread = new FakeDataThread(Integer.parseInt(generateRowCount.getValue().toString()), filename); - thread.start(); - } - } - - private class ScanThread extends Thread { - - private int maxRows; - private boolean scanValues; - private int minCellCount; - - public ScanThread(int maxRows, boolean scanValues, int minCellCount) { - this.maxRows = maxRows; - this.scanValues = scanValues; - this.minCellCount = minCellCount; - } - - public void run() { - for (JComponent component : componentsToDisableWhenRunning) - component.setEnabled(false); - try { - SourceDataScan sourceDataScan = new SourceDataScan(); - DbSettings dbSettings = getSourceDbSettings(); - if (dbSettings != null) { - for (String table : tables) { - if (dbSettings.dataType == DbSettings.CSVFILES) - table = folderField.getText() + "/" + table; - dbSettings.tables.add(table); - } - sourceDataScan.process(dbSettings, maxRows, scanValues, minCellCount, folderField.getText() + "/ScanReport.xlsx"); - } - } catch (Exception e) { - handleError(e); - } finally { - for (JComponent component : componentsToDisableWhenRunning) - component.setEnabled(true); - } - } - - } - - private class FakeDataThread extends Thread { - private int maxRowCount; - private String filename; - - public FakeDataThread(int maxRowCount, String filename) { - this.maxRowCount = maxRowCount; - this.filename = filename; - } - - public void run() { - for (JComponent component : componentsToDisableWhenRunning) - component.setEnabled(false); - try { - FakeDataGenerator process = new FakeDataGenerator(); - DbSettings dbSettings = getTargetDbSettings(); - if (dbSettings != null) - process.generateData(dbSettings, maxRowCount, filename, folderField.getText()); - } catch (Exception e) { - handleError(e); - } finally { - for (JComponent component : componentsToDisableWhenRunning) - component.setEnabled(true); - } - - } - } - - private class DBTableSelectionDialog extends JDialog implements ActionListener { - private static final long serialVersionUID = 4527207331482143091L; - private JButton yesButton = null; - private JButton noButton = null; - private boolean answer = false; - private JList list; - - public boolean getAnswer() { - return answer; - } - - public DBTableSelectionDialog(JFrame frame, boolean modal, String tableNames) { - super(frame, modal); - - setTitle("Select tables"); - JPanel panel = new JPanel(); - panel.setPreferredSize(new Dimension(800, 500)); - getContentPane().add(panel); - panel.setLayout(new BorderLayout()); - - JLabel message = new JLabel("Select tables"); - panel.add(message, BorderLayout.NORTH); - - list = new JList(tableNames.split("\t")); - JScrollPane scrollPane = new JScrollPane(list); - panel.add(scrollPane, BorderLayout.CENTER); - - JPanel buttonPanel = new JPanel(); - yesButton = new JButton("Select tables"); - yesButton.addActionListener(this); - buttonPanel.add(yesButton); - noButton = new JButton("Cancel"); - noButton.addActionListener(this); - buttonPanel.add(noButton); - panel.add(buttonPanel, BorderLayout.SOUTH); - - pack(); - setLocationRelativeTo(frame); - setVisible(true); - } - - public void actionPerformed(ActionEvent e) { - if (yesButton == e.getSource()) { - answer = true; - setVisible(false); - } else if (noButton == e.getSource()) { - answer = false; - setVisible(false); - } - } - - public Object[] getSelectedItems() { - return list.getSelectedValues(); - } - - } - - private void handleError(Exception e) { - System.err.println("Error: " + e.getMessage()); - String errorReportFilename = ErrorReport.generate(folderField.getText(), e); - String message = "Error: " + e.getLocalizedMessage(); - message += "\nAn error report has been generated:\n" + errorReportFilename; - System.out.println(message); - JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Error", JOptionPane.ERROR_MESSAGE); - } - -} +/******************************************************************************* + * Copyright 2014 Observational Health Data Sciences and Informatics + * + * This file is part of WhiteRabbit + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ +package org.ohdsi.whiteRabbit; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Image; +import java.awt.MediaTracker; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.File; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JScrollPane; +import javax.swing.JSpinner; +import javax.swing.JTabbedPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.border.TitledBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.filechooser.FileNameExtensionFilter; + +import org.ohdsi.databases.DbType; +import org.ohdsi.databases.RichConnection; +import org.ohdsi.utilities.DirectoryUtilities; +import org.ohdsi.utilities.StringUtilities; +import org.ohdsi.whiteRabbit.fakeDataGenerator.FakeDataGenerator; +import org.ohdsi.whiteRabbit.scan.SourceDataScan; + +/** + * This is the WhiteRabbit main class + */ +public class WhiteRabbitMain { + + private JFrame frame; + private JTextField folderField; + private JTextField scanReportFileField; + + private JComboBox scanRowCount; + private JCheckBox scanValueScan; + private JSpinner scanMinCellCount; + private JSpinner generateRowCount; + private JComboBox sourceType; + private JComboBox targetType; + private JTextField targetUserField; + private JTextField targetPasswordField; + private JTextField targetServerField; + private JTextField targetDatabaseField; + private JTextField sourceDelimiterField; + private JTextField targetDelimiterField; + private JTextField sourceServerField; + private JTextField sourceUserField; + private JTextField sourcePasswordField; + private JTextField sourceDatabaseField; + private JButton addAllButton; + private JList tableList; + private List tables = new ArrayList(); + private boolean sourceIsFiles = true; + private boolean targetIsFiles = false; + + private List componentsToDisableWhenRunning = new ArrayList(); + + public static void main(String[] args) { + new WhiteRabbitMain(args); + } + + public WhiteRabbitMain(String[] args) { + frame = new JFrame("White Rabbit"); + + frame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + System.exit(0); + } + }); + frame.setLayout(new BorderLayout()); + + JComponent tabsPanel = createTabsPanel(); + JComponent consolePanel = createConsolePanel(); + + frame.add(consolePanel, BorderLayout.CENTER); + frame.add(tabsPanel, BorderLayout.NORTH); + + loadIcons(frame); + frame.pack(); + frame.setVisible(true); + ObjectExchange.frame = frame; + executeParameters(args); + } + + private JComponent createTabsPanel() { + JTabbedPane tabbedPane = new JTabbedPane(); + + JPanel locationPanel = createLocationsPanel(); + tabbedPane.addTab("Locations", null, locationPanel, "Specify the location of the source data and the working folder"); + + JPanel scanPanel = createScanPanel(); + tabbedPane.addTab("Scan", null, scanPanel, "Create a scan of the source data"); + + JPanel fakeDataPanel = createFakeDataPanel(); + tabbedPane.addTab("Fake data generation", null, fakeDataPanel, "Create fake data based on a scan report for development purposes"); + + return tabbedPane; + } + + private JPanel createLocationsPanel() { + JPanel panel = new JPanel(); + + panel.setLayout(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + c.fill = GridBagConstraints.BOTH; + c.weightx = 0.5; + + JPanel folderPanel = new JPanel(); + folderPanel.setLayout(new BoxLayout(folderPanel, BoxLayout.X_AXIS)); + folderPanel.setBorder(BorderFactory.createTitledBorder("Working folder")); + folderField = new JTextField(); + folderField.setText((new File("").getAbsolutePath())); + folderField.setToolTipText("The folder where all output will be written"); + folderPanel.add(folderField); + JButton pickButton = new JButton("Pick folder"); + pickButton.setToolTipText("Pick a different working folder"); + folderPanel.add(pickButton); + pickButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + pickFolder(); + } + }); + componentsToDisableWhenRunning.add(pickButton); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + panel.add(folderPanel, c); + + JPanel sourcePanel = new JPanel(); + sourcePanel.setLayout(new GridLayout(0, 2)); + sourcePanel.setBorder(BorderFactory.createTitledBorder("Source data location")); + sourcePanel.add(new JLabel("Data type")); + sourceType = new JComboBox(new String[] { "Delimited text files", "MySQL", "Oracle", "SQL Server", "PostgreSQL" }); + sourceType.setToolTipText("Select the type of source data available"); + sourceType.addItemListener(new ItemListener() { + + @Override + public void itemStateChanged(ItemEvent arg0) { + sourceIsFiles = arg0.getItem().toString().equals("Delimited text files"); + sourceServerField.setEnabled(!sourceIsFiles); + sourceUserField.setEnabled(!sourceIsFiles); + sourcePasswordField.setEnabled(!sourceIsFiles); + sourceDatabaseField.setEnabled(!sourceIsFiles); + sourceDelimiterField.setEnabled(sourceIsFiles); + addAllButton.setEnabled(!sourceIsFiles); + + if (!sourceIsFiles && arg0.getItem().toString().equals("Oracle")) { + sourceServerField + .setToolTipText("For Oracle servers this field contains the SID, servicename, and optionally the port: '/', ':/', '/', or ':/'"); + sourceUserField.setToolTipText("For Oracle servers this field contains the name of the user used to log in"); + sourcePasswordField.setToolTipText("For Oracle servers this field contains the password corresponding to the user"); + sourceDatabaseField + .setToolTipText("For Oracle servers this field contains the schema (i.e. 'user' in Oracle terms) containing the source tables"); + } else if (!sourceIsFiles && arg0.getItem().toString().equals("PostgreSQL")) { + sourceServerField.setToolTipText("For PostgreSQL servers this field contains the host name and database name (/)"); + sourceUserField.setToolTipText("The user used to log in to the server"); + sourcePasswordField.setToolTipText("The password used to log in to the server"); + sourceDatabaseField.setToolTipText("For PostgreSQL servers this field contains the schema containing the source tables"); + } else if (!sourceIsFiles) { + sourceServerField.setToolTipText("This field contains the name or IP address of the database server"); + if (arg0.getItem().toString().equals("SQL Server")) + sourceUserField + .setToolTipText("The user used to log in to the server. Optionally, the domain can be specified as / (e.g. 'MyDomain/Joe')"); + else + sourceUserField.setToolTipText("The user used to log in to the server"); + sourcePasswordField.setToolTipText("The password used to log in to the server"); + sourceDatabaseField.setToolTipText("The name of the database containing the source tables"); + } + } + }); + sourcePanel.add(sourceType); + + sourcePanel.add(new JLabel("Server location")); + sourceServerField = new JTextField("127.0.0.1"); + sourceServerField.setEnabled(false); + sourcePanel.add(sourceServerField); + sourcePanel.add(new JLabel("User name")); + sourceUserField = new JTextField(""); + sourceUserField.setEnabled(false); + sourcePanel.add(sourceUserField); + sourcePanel.add(new JLabel("Password")); + sourcePasswordField = new JPasswordField(""); + sourcePasswordField.setEnabled(false); + sourcePanel.add(sourcePasswordField); + sourcePanel.add(new JLabel("Database name")); + sourceDatabaseField = new JTextField(""); + sourceDatabaseField.setEnabled(false); + sourcePanel.add(sourceDatabaseField); + + sourcePanel.add(new JLabel("Delimiter")); + sourceDelimiterField = new JTextField(","); + sourceDelimiterField.setToolTipText("The delimiter that separates values. Enter 'tab' for tab."); + sourcePanel.add(sourceDelimiterField); + + c.gridx = 0; + c.gridy = 1; + c.gridwidth = 1; + panel.add(sourcePanel, c); + + JPanel testConnectionButtonPanel = new JPanel(); + testConnectionButtonPanel.setLayout(new BoxLayout(testConnectionButtonPanel, BoxLayout.X_AXIS)); + testConnectionButtonPanel.add(Box.createHorizontalGlue()); + + JButton testConnectionButton = new JButton("Test connection"); + testConnectionButton.setBackground(new Color(151, 220, 141)); + testConnectionButton.setToolTipText("Test the connection"); + testConnectionButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + testConnection(getSourceDbSettings()); + } + }); + componentsToDisableWhenRunning.add(testConnectionButton); + testConnectionButtonPanel.add(testConnectionButton); + + c.gridx = 0; + c.gridy = 2; + c.gridwidth = 1; + panel.add(testConnectionButtonPanel, c); + + return panel; + } + + private JPanel createScanPanel() { + JPanel panel = new JPanel(); + panel.setLayout(new BorderLayout()); + + JPanel tablePanel = new JPanel(); + tablePanel.setLayout(new BorderLayout()); + tablePanel.setBorder(new TitledBorder("Tables to scan")); + tableList = new JList(); + tableList.setToolTipText("Specify the tables (or CSV files) to be scanned here"); + tablePanel.add(new JScrollPane(tableList), BorderLayout.CENTER); + + JPanel tableButtonPanel = new JPanel(); + tableButtonPanel.setLayout(new GridLayout(3, 1)); + addAllButton = new JButton("Add all in DB"); + addAllButton.setToolTipText("Add all tables in the database"); + addAllButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + addAllTables(); + } + }); + addAllButton.setEnabled(false); + tableButtonPanel.add(addAllButton); + JButton addButton = new JButton("Add"); + addButton.setToolTipText("Add tables to list"); + addButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + pickTables(); + } + }); + tableButtonPanel.add(addButton); + JButton removeButton = new JButton("Remove"); + removeButton.setToolTipText("Remove tables from list"); + removeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + removeTables(); + } + }); + tableButtonPanel.add(removeButton); + tablePanel.add(tableButtonPanel, BorderLayout.EAST); + + panel.add(tablePanel, BorderLayout.CENTER); + + JPanel southPanel = new JPanel(); + southPanel.setLayout(new BoxLayout(southPanel, BoxLayout.Y_AXIS)); + + JPanel scanOptionsPanel = new JPanel(); + scanOptionsPanel.setLayout(new BoxLayout(scanOptionsPanel, BoxLayout.X_AXIS)); + + scanValueScan = new JCheckBox("Scan field values", true); + scanValueScan.setToolTipText("Include a frequency count of field values in the scan report"); + scanValueScan.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent arg0) { + scanMinCellCount.setEnabled(((JCheckBox) arg0.getSource()).isSelected()); + scanRowCount.setEnabled(((JCheckBox) arg0.getSource()).isSelected()); + } + }); + scanOptionsPanel.add(scanValueScan); + scanOptionsPanel.add(Box.createHorizontalGlue()); + + scanOptionsPanel.add(new JLabel("Min cell count ")); + scanMinCellCount = new JSpinner(); + scanMinCellCount.setValue(25); + scanMinCellCount.setToolTipText("Minimum frequency for a field value to be included in the report"); + scanOptionsPanel.add(scanMinCellCount); + scanOptionsPanel.add(Box.createHorizontalGlue()); + + scanOptionsPanel.add(new JLabel("Rows per table ")); + scanRowCount = new JComboBox(new String[] { "100,000", "1 million", "all" }); + scanRowCount.setSelectedIndex(1); + scanRowCount.setToolTipText("Maximum number of rows per table to be scanned for field values"); + scanOptionsPanel.add(scanRowCount); + + southPanel.add(scanOptionsPanel); + + southPanel.add(Box.createVerticalStrut(3)); + + JPanel scanButtonPanel = new JPanel(); + scanButtonPanel.setLayout(new BoxLayout(scanButtonPanel, BoxLayout.X_AXIS)); + scanButtonPanel.add(Box.createHorizontalGlue()); + + JButton scanButton = new JButton("Scan tables"); + scanButton.setBackground(new Color(151, 220, 141)); + scanButton.setToolTipText("Scan the selected tables"); + scanButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + scanRun(); + } + }); + componentsToDisableWhenRunning.add(scanButton); + scanButtonPanel.add(scanButton); + southPanel.add(scanButtonPanel); + + panel.add(southPanel, BorderLayout.SOUTH); + + return panel; + } + + private JPanel createFakeDataPanel() { + JPanel panel = new JPanel(); + + panel.setLayout(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + c.fill = GridBagConstraints.BOTH; + c.weightx = 0.5; + + JPanel folderPanel = new JPanel(); + folderPanel.setLayout(new BoxLayout(folderPanel, BoxLayout.X_AXIS)); + folderPanel.setBorder(BorderFactory.createTitledBorder("Scan report file")); + scanReportFileField = new JTextField(); + scanReportFileField.setText((new File("ScanReport.xlsx").getAbsolutePath())); + scanReportFileField.setToolTipText("The path to the scan report that will be used as a template to generate the fake data"); + folderPanel.add(scanReportFileField); + JButton pickButton = new JButton("Pick file"); + pickButton.setToolTipText("Pick a scan report file"); + folderPanel.add(pickButton); + pickButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + pickScanReportFile(); + } + }); + componentsToDisableWhenRunning.add(pickButton); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + panel.add(folderPanel, c); + + JPanel targetPanel = new JPanel(); + targetPanel.setLayout(new GridLayout(0, 2)); + targetPanel.setBorder(BorderFactory.createTitledBorder("Target data location")); + targetPanel.add(new JLabel("Data type")); + // targetType = new JComboBox(new String[] { "Delimited text files", "MySQL", "Oracle", "SQL Server", "PostgreSQL" }); + targetType = new JComboBox(new String[] { "Delimited text files", "MySQL" }); + targetType.setToolTipText("Select the type of source data available"); + targetType.addItemListener(new ItemListener() { + + @Override + public void itemStateChanged(ItemEvent arg0) { + targetIsFiles = arg0.getItem().toString().equals("Delimited text files"); + targetServerField.setEnabled(!targetIsFiles); + targetUserField.setEnabled(!targetIsFiles); + targetPasswordField.setEnabled(!targetIsFiles); + targetDatabaseField.setEnabled(!targetIsFiles); + targetDelimiterField.setEnabled(targetIsFiles); + + if (!targetIsFiles && arg0.getItem().toString().equals("Oracle")) { + targetServerField + .setToolTipText("For Oracle servers this field contains the SID, servicename, and optionally the port: '/', ':/', '/', or ':/'"); + targetUserField.setToolTipText("For Oracle servers this field contains the name of the user used to log in"); + targetPasswordField.setToolTipText("For Oracle servers this field contains the password corresponding to the user"); + targetDatabaseField + .setToolTipText("For Oracle servers this field contains the schema (i.e. 'user' in Oracle terms) containing the source tables"); + } else if (!targetIsFiles && arg0.getItem().toString().equals("PostgreSQL")) { + targetServerField.setToolTipText("For PostgreSQL servers this field contains the host name and database name (/)"); + targetUserField.setToolTipText("The user used to log in to the server"); + targetPasswordField.setToolTipText("The password used to log in to the server"); + targetDatabaseField.setToolTipText("For PostgreSQL servers this field contains the schema containing the source tables"); + } else if (!targetIsFiles) { + targetServerField.setToolTipText("This field contains the name or IP address of the database server"); + if (arg0.getItem().toString().equals("SQL Server")) + targetUserField + .setToolTipText("The user used to log in to the server. Optionally, the domain can be specified as / (e.g. 'MyDomain/Joe')"); + else + targetUserField.setToolTipText("The user used to log in to the server"); + targetPasswordField.setToolTipText("The password used to log in to the server"); + targetDatabaseField.setToolTipText("The name of the database containing the source tables"); + } + } + }); + targetPanel.add(targetType); + + targetPanel.add(new JLabel("Server location")); + targetServerField = new JTextField("127.0.0.1"); + targetServerField.setEnabled(false); + targetPanel.add(targetServerField); + targetPanel.add(new JLabel("User name")); + targetUserField = new JTextField(""); + targetUserField.setEnabled(false); + targetPanel.add(targetUserField); + targetPanel.add(new JLabel("Password")); + targetPasswordField = new JPasswordField(""); + targetPasswordField.setEnabled(false); + targetPanel.add(targetPasswordField); + targetPanel.add(new JLabel("Database name")); + targetDatabaseField = new JTextField(""); + targetDatabaseField.setEnabled(false); + targetPanel.add(targetDatabaseField); + + targetPanel.add(new JLabel("Delimiter")); + targetDelimiterField = new JTextField(","); + targetDelimiterField.setToolTipText("The delimiter that separates values. Enter 'tab' for tab."); + targetDelimiterField.setEnabled(true); + targetPanel.add(targetDelimiterField); + + c.gridx = 0; + c.gridy = 1; + c.gridwidth = 1; + panel.add(targetPanel, c); + + JPanel fakeDataButtonPanel = new JPanel(); + fakeDataButtonPanel.setLayout(new BoxLayout(fakeDataButtonPanel, BoxLayout.X_AXIS)); + + fakeDataButtonPanel.add(new JLabel("Max rows per table")); + generateRowCount = new JSpinner(); + generateRowCount.setValue(10000); + fakeDataButtonPanel.add(generateRowCount); + fakeDataButtonPanel.add(Box.createHorizontalGlue()); + + JButton testConnectionButton = new JButton("Test connection"); + testConnectionButton.setBackground(new Color(151, 220, 141)); + testConnectionButton.setToolTipText("Test the connection"); + testConnectionButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + testConnection(getTargetDbSettings()); + } + }); + componentsToDisableWhenRunning.add(testConnectionButton); + fakeDataButtonPanel.add(testConnectionButton); + + JButton fakeDataButton = new JButton("Generate fake data"); + fakeDataButton.setBackground(new Color(151, 220, 141)); + fakeDataButton.setToolTipText("Generate fake data based on the scan report"); + fakeDataButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + fakeDataRun(); + } + }); + componentsToDisableWhenRunning.add(fakeDataButton); + fakeDataButtonPanel.add(fakeDataButton); + + c.gridx = 0; + c.gridy = 2; + c.gridwidth = 1; + panel.add(fakeDataButtonPanel, c); + + return panel; + } + + private JComponent createConsolePanel() { + JTextArea consoleArea = new JTextArea(); + consoleArea.setToolTipText("General progress information"); + consoleArea.setEditable(false); + Console console = new Console(); + console.setTextArea(consoleArea); + // console.setDebugFile("c:/temp/debug.txt"); + System.setOut(new PrintStream(console)); + System.setErr(new PrintStream(console)); + JScrollPane consoleScrollPane = new JScrollPane(consoleArea); + consoleScrollPane.setBorder(BorderFactory.createTitledBorder("Console")); + consoleScrollPane.setPreferredSize(new Dimension(800, 200)); + consoleScrollPane.setAutoscrolls(true); + ObjectExchange.console = console; + return consoleScrollPane; + } + + private void loadIcons(JFrame f) { + List icons = new ArrayList(); + icons.add(loadIcon("WhiteRabbit16.png", f)); + icons.add(loadIcon("WhiteRabbit32.png", f)); + icons.add(loadIcon("WhiteRabbit48.png", f)); + icons.add(loadIcon("WhiteRabbit64.png", f)); + icons.add(loadIcon("WhiteRabbit128.png", f)); + icons.add(loadIcon("WhiteRabbit256.png", f)); + f.setIconImages(icons); + } + + private Image loadIcon(String name, JFrame f) { + Image icon = Toolkit.getDefaultToolkit().getImage(WhiteRabbitMain.class.getResource(name)); + MediaTracker mediaTracker = new MediaTracker(f); + mediaTracker.addImage(icon, 0); + try { + mediaTracker.waitForID(0); + return icon; + } catch (Exception e1) { + e1.printStackTrace(); + } + return null; + } + + private void executeParameters(String[] args) { + String mode = null; + for (String arg : args) { + if (arg.startsWith("-")) { + mode = arg.toLowerCase(); + } else { + if (mode.equals("-folder")) + folderField.setText(arg); + if (mode.equals("-targetpassword")) + targetPasswordField.setText(arg); + if (mode.equals("-targetserver")) + targetServerField.setText(arg); + if (mode.equals("-targettype")) + targetType.setSelectedItem(arg); + if (mode.equals("-targetdatabase")) + targetDatabaseField.setText(arg); + if (mode.equals("-targetuser")) + targetUserField.setText(arg); + if (mode.equals("-sourceserver")) + sourceServerField.setText(arg); + if (mode.equals("-sourcetype")) + sourceType.setSelectedItem(arg); + if (mode.equals("-sourcedatabase")) + sourceDatabaseField.setText(arg); + if (mode.equals("-sourceuser")) + sourceUserField.setText(arg); + if (mode.equals("-sourcepassword")) + sourcePasswordField.setText(arg); + mode = null; + } + } + } + + private void pickFolder() { + JFileChooser fileChooser = new JFileChooser(new File(folderField.getText())); + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + int returnVal = fileChooser.showDialog(frame, "Select folder"); + if (returnVal == JFileChooser.APPROVE_OPTION) + folderField.setText(fileChooser.getSelectedFile().getAbsolutePath()); + } + + private void pickScanReportFile() { + JFileChooser fileChooser = new JFileChooser(new File(folderField.getText())); + fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + int returnVal = fileChooser.showDialog(frame, "Select scan report file"); + if (returnVal == JFileChooser.APPROVE_OPTION) + scanReportFileField.setText(fileChooser.getSelectedFile().getAbsolutePath()); + } + + private void removeTables() { + for (Object item : tableList.getSelectedValues()) { + tables.remove(item); + tableList.setListData(tables.toArray()); + } + } + + private void addAllTables() { + DbSettings sourceDbSettings = getSourceDbSettings(); + if (sourceDbSettings != null) { + RichConnection connection = new RichConnection(sourceDbSettings.server, sourceDbSettings.domain, sourceDbSettings.user, sourceDbSettings.password, + sourceDbSettings.dbType); + for (String table : connection.getTableNames(sourceDbSettings.database)) { + if (!tables.contains(table)) + tables.add((String) table); + tableList.setListData(tables.toArray()); + } + connection.close(); + } + } + + private void pickTables() { + DbSettings sourceDbSettings = getSourceDbSettings(); + if (sourceDbSettings != null) { + if (sourceDbSettings.dataType == DbSettings.CSVFILES) { + JFileChooser fileChooser = new JFileChooser(new File(folderField.getText())); + fileChooser.setMultiSelectionEnabled(true); + fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + FileNameExtensionFilter filter = new FileNameExtensionFilter("Delimited text files", "csv", "txt"); + fileChooser.setFileFilter(filter); + + int returnVal = fileChooser.showDialog(frame, "Select tables"); + if (returnVal == JFileChooser.APPROVE_OPTION) { + for (File table : fileChooser.getSelectedFiles()) { + String tableName = DirectoryUtilities.getRelativePath(new File(folderField.getText()), table); + if (!tables.contains(tableName)) + tables.add(tableName); + tableList.setListData(tables.toArray()); + } + + } + } else if (sourceDbSettings.dataType == DbSettings.DATABASE) { + RichConnection connection = new RichConnection(sourceDbSettings.server, sourceDbSettings.domain, sourceDbSettings.user, + sourceDbSettings.password, sourceDbSettings.dbType); + String tableNames = StringUtilities.join(connection.getTableNames(sourceDbSettings.database), "\t"); + DBTableSelectionDialog selectionDialog = new DBTableSelectionDialog(frame, true, tableNames); + if (selectionDialog.getAnswer()) { + for (Object item : selectionDialog.getSelectedItems()) { + if (!tables.contains(item)) + tables.add((String) item); + tableList.setListData(tables.toArray()); + } + } + connection.close(); + } + } + } + + private DbSettings getSourceDbSettings() { + DbSettings dbSettings = new DbSettings(); + if (sourceType.getSelectedItem().equals("Delimited text files")) { + dbSettings.dataType = DbSettings.CSVFILES; + if (sourceDelimiterField.getText().length() == 0) { + JOptionPane.showMessageDialog(frame, "Delimiter field cannot be empty for source database", "Error connecting to server", + JOptionPane.ERROR_MESSAGE); + return null; + } + if (sourceDelimiterField.getText().toLowerCase().equals("tab")) + dbSettings.delimiter = '\t'; + else + dbSettings.delimiter = sourceDelimiterField.getText().charAt(0); + } else { + dbSettings.dataType = DbSettings.DATABASE; + dbSettings.user = sourceUserField.getText(); + dbSettings.password = sourcePasswordField.getText(); + dbSettings.server = sourceServerField.getText(); + dbSettings.database = sourceDatabaseField.getText().trim().length() == 0 ? null : sourceDatabaseField.getText(); + if (sourceType.getSelectedItem().toString().equals("MySQL")) + dbSettings.dbType = DbType.MYSQL; + else if (sourceType.getSelectedItem().toString().equals("Oracle")) + dbSettings.dbType = DbType.ORACLE; + else if (sourceType.getSelectedItem().toString().equals("PostgreSQL")) + dbSettings.dbType = DbType.POSTGRESQL; + else if (sourceType.getSelectedItem().toString().equals("SQL Server")) { + dbSettings.dbType = DbType.MSSQL; + if (sourceUserField.getText().length() != 0) { // Not using windows authentication + String[] parts = sourceUserField.getText().split("/"); + if (parts.length == 2) { + dbSettings.user = parts[1]; + dbSettings.domain = parts[0]; + } + } + } + } + return dbSettings; + } + + private void testConnection(DbSettings dbSettings) { + if (dbSettings.dataType == DbSettings.CSVFILES) { + if (new File(folderField.getText()).exists()) { + String message = "Folder " + folderField.getText() + " found"; + JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Working folder found", JOptionPane.INFORMATION_MESSAGE); + } else { + String message = "Folder " + folderField.getText() + " not found"; + JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Working folder not found", JOptionPane.ERROR_MESSAGE); + } + } else { + if (dbSettings.database == null || dbSettings.database.equals("")) { + JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap("Please specify database name", 80), "Error connecting to server", + JOptionPane.ERROR_MESSAGE); + return; + } + if (dbSettings.server == null || dbSettings.server.equals("")) { + JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap("Please specify the server", 80), "Error connecting to server", + JOptionPane.ERROR_MESSAGE); + return; + } + + RichConnection connection; + try { + connection = new RichConnection(dbSettings.server, dbSettings.domain, dbSettings.user, dbSettings.password, dbSettings.dbType); + } catch (Exception e) { + String message = "Could not connect: " + e.getMessage(); + JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Error connecting to server", JOptionPane.ERROR_MESSAGE); + return; + } + + try { + connection.getTableNames(dbSettings.database); + } catch (Exception e) { + String message = "Could not connect to database: " + e.getMessage(); + JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Error connecting to server", JOptionPane.ERROR_MESSAGE); + return; + } + + connection.close(); + String message = "Succesfully connected to " + dbSettings.database + " on server " + dbSettings.server; + JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Connection succesful", JOptionPane.INFORMATION_MESSAGE); + + } + } + + private DbSettings getTargetDbSettings() { + DbSettings dbSettings = new DbSettings(); + if (targetType.getSelectedItem().equals("Delimited text files")) { + dbSettings.dataType = DbSettings.CSVFILES; + if (targetDelimiterField.getText().length() == 0) { + JOptionPane.showMessageDialog(frame, "Delimiter field cannot be empty for target files", "Error", JOptionPane.ERROR_MESSAGE); + return null; + } + if (targetDelimiterField.getText().toLowerCase().equals("tab")) + dbSettings.delimiter = '\t'; + else + dbSettings.delimiter = targetDelimiterField.getText().charAt(0); + } else { + dbSettings.dataType = DbSettings.DATABASE; + dbSettings.user = targetUserField.getText(); + dbSettings.password = targetPasswordField.getText(); + dbSettings.server = targetServerField.getText(); + dbSettings.database = targetDatabaseField.getText(); + if (targetType.getSelectedItem().toString().equals("MySQL")) + dbSettings.dbType = DbType.MYSQL; + else if (targetType.getSelectedItem().toString().equals("Oracle")) + dbSettings.dbType = DbType.ORACLE; + else if (sourceType.getSelectedItem().toString().equals("PostgreSQL")) + dbSettings.dbType = DbType.POSTGRESQL; + else if (sourceType.getSelectedItem().toString().equals("SQL Server")) { + dbSettings.dbType = DbType.MSSQL; + if (sourceUserField.getText().length() != 0) { // Not using windows authentication + String[] parts = sourceUserField.getText().split("/"); + if (parts.length == 2) { + dbSettings.user = parts[1]; + dbSettings.domain = parts[0]; + } + } + } + + if (dbSettings.database.trim().length() == 0) { + String message = "Please specify a name for the target database"; + JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Database error", JOptionPane.ERROR_MESSAGE); + return null; + } + } + return dbSettings; + } + + private void scanRun() { + if (tables.size() == 0) { + if (sourceIsFiles) { + String message = "No files selected for scanning"; + JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "No files selected", JOptionPane.ERROR_MESSAGE); + return; + } else { + String message = "No tables were selected for scanning. Do you want to select all tables in the database for scanning?"; + String title = "No tables selected"; + int answer = JOptionPane.showConfirmDialog(ObjectExchange.frame, message, title, JOptionPane.YES_NO_OPTION); + if (answer == JOptionPane.YES_OPTION) { + addAllTables(); + } else + return; + } + } + int rowCount = 0; + if (scanRowCount.getSelectedItem().toString().equals("100,000")) + rowCount = 100000; + else if (scanRowCount.getSelectedItem().toString().equals("1 million")) + rowCount = 1000000; + if (scanRowCount.getSelectedItem().toString().equals("all")) + rowCount = -1; + + ScanThread scanThread = new ScanThread(rowCount, scanValueScan.isSelected(), Integer.parseInt(scanMinCellCount.getValue().toString())); + scanThread.start(); + } + + private void fakeDataRun() { + String filename = scanReportFileField.getText(); + if (!new File(filename).exists()) { + String message = "File " + filename + " not found"; + JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "File not found", JOptionPane.ERROR_MESSAGE); + } else { + FakeDataThread thread = new FakeDataThread(Integer.parseInt(generateRowCount.getValue().toString()), filename); + thread.start(); + } + } + + private class ScanThread extends Thread { + + private int maxRows; + private boolean scanValues; + private int minCellCount; + + public ScanThread(int maxRows, boolean scanValues, int minCellCount) { + this.maxRows = maxRows; + this.scanValues = scanValues; + this.minCellCount = minCellCount; + } + + public void run() { + for (JComponent component : componentsToDisableWhenRunning) + component.setEnabled(false); + try { + SourceDataScan sourceDataScan = new SourceDataScan(); + DbSettings dbSettings = getSourceDbSettings(); + if (dbSettings != null) { + for (String table : tables) { + if (dbSettings.dataType == DbSettings.CSVFILES) + table = folderField.getText() + "/" + table; + dbSettings.tables.add(table); + } + sourceDataScan.process(dbSettings, maxRows, scanValues, minCellCount, folderField.getText() + "/ScanReport.xlsx"); + } + } catch (Exception e) { + handleError(e); + } finally { + for (JComponent component : componentsToDisableWhenRunning) + component.setEnabled(true); + } + } + + } + + private class FakeDataThread extends Thread { + private int maxRowCount; + private String filename; + + public FakeDataThread(int maxRowCount, String filename) { + this.maxRowCount = maxRowCount; + this.filename = filename; + } + + public void run() { + for (JComponent component : componentsToDisableWhenRunning) + component.setEnabled(false); + try { + FakeDataGenerator process = new FakeDataGenerator(); + DbSettings dbSettings = getTargetDbSettings(); + if (dbSettings != null) + process.generateData(dbSettings, maxRowCount, filename, folderField.getText()); + } catch (Exception e) { + handleError(e); + } finally { + for (JComponent component : componentsToDisableWhenRunning) + component.setEnabled(true); + } + + } + } + + private class DBTableSelectionDialog extends JDialog implements ActionListener { + private static final long serialVersionUID = 4527207331482143091L; + private JButton yesButton = null; + private JButton noButton = null; + private boolean answer = false; + private JList list; + + public boolean getAnswer() { + return answer; + } + + public DBTableSelectionDialog(JFrame frame, boolean modal, String tableNames) { + super(frame, modal); + + setTitle("Select tables"); + JPanel panel = new JPanel(); + panel.setPreferredSize(new Dimension(800, 500)); + getContentPane().add(panel); + panel.setLayout(new BorderLayout()); + + JLabel message = new JLabel("Select tables"); + panel.add(message, BorderLayout.NORTH); + + list = new JList(tableNames.split("\t")); + JScrollPane scrollPane = new JScrollPane(list); + panel.add(scrollPane, BorderLayout.CENTER); + + JPanel buttonPanel = new JPanel(); + yesButton = new JButton("Select tables"); + yesButton.addActionListener(this); + buttonPanel.add(yesButton); + noButton = new JButton("Cancel"); + noButton.addActionListener(this); + buttonPanel.add(noButton); + panel.add(buttonPanel, BorderLayout.SOUTH); + + pack(); + setLocationRelativeTo(frame); + setVisible(true); + } + + public void actionPerformed(ActionEvent e) { + if (yesButton == e.getSource()) { + answer = true; + setVisible(false); + } else if (noButton == e.getSource()) { + answer = false; + setVisible(false); + } + } + + public Object[] getSelectedItems() { + return list.getSelectedValues(); + } + + } + + private void handleError(Exception e) { + System.err.println("Error: " + e.getMessage()); + String errorReportFilename = ErrorReport.generate(folderField.getText(), e); + String message = "Error: " + e.getLocalizedMessage(); + message += "\nAn error report has been generated:\n" + errorReportFilename; + System.out.println(message); + JOptionPane.showMessageDialog(frame, StringUtilities.wordWrap(message, 80), "Error", JOptionPane.ERROR_MESSAGE); + } + +}