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);
+ }
+
+}