/******************************************************************************* * Copyright 2016 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.Color; import java.awt.Cursor; import java.awt.Desktop; 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.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import javax.swing.*; import javax.swing.border.TitledBorder; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; import org.ohdsi.rabbitInAHat.dataModel.Database; import org.ohdsi.rabbitInAHat.dataModel.Database.CDMVersion; import org.ohdsi.rabbitInAHat.dataModel.ETL; import org.ohdsi.rabbitInAHat.dataModel.Field; import org.ohdsi.rabbitInAHat.dataModel.MappableItem; import org.ohdsi.rabbitInAHat.dataModel.StemTableAdd; import org.ohdsi.rabbitInAHat.dataModel.Table; import org.ohdsi.whiteRabbit.ObjectExchange; /** * This is the main class for the RabbitInAHat application */ public class RabbitInAHatMain implements ResizeListener, ActionListener { public final static String ACTION_CMD_SAVE = "Save"; public final static String ACTION_CMD_SAVE_AS = "Save As"; public final static String ACTION_CMD_OPEN_ETL_SPECS = "Open ETL Specs"; public final static String ACTION_CMD_OPEN_SCAN_REPORT = "Open Scan Report"; public final static String ACTION_CMD_GENERATE_ETL_DOCUMENT = "Generate ETL Document"; public final static String ACTION_CMD_GENERATE_TEST_FRAMEWORK = "Generate ETL Test Framework"; public final static String ACTION_CMD_GENERATE_PACKAGE_TEST_FRAMEWORK = "Generate ETL Test Framework (for R Packages)"; public final static String ACTION_CMD_DISCARD_COUNTS = "Discard Value Counts"; public final static String ACTION_CMD_FILTER = "Filter"; public final static String ACTION_CMD_MAKE_MAPPING = "Make Mappings"; public final static String ACTION_CMD_REMOVE_MAPPING = "Remove Mappings"; public final static String ACTION_CMD_SET_TARGET_V4 = "CDM v4"; public final static String ACTION_CMD_SET_TARGET_V5 = "CDM v5.0.0"; public final static String ACTION_CMD_SET_TARGET_V501 = "CDM v5.0.1"; public final static String ACTION_ADD_STEM_TABLE = "Add stem table"; public final static String ACTION_CMD_SET_TARGET_CUSTOM = "Load Custom..."; public final static String ACTION_CMD_MARK_COMPLETED = "Mark Highlighted As Complete"; public final static String ACTION_CMD_UNMARK_COMPLETED = "Mark Highlighted As Incomplete"; public final static String ACTION_CMD_HELP = "Open help Wiki"; public final static String WIKI_URL = "http://www.ohdsi.org/web/wiki/doku.php?id=documentation:software:whiterabbit#rabbit-in-a-hat"; private final static FileFilter FILE_FILTER_GZ = new FileNameExtensionFilter("GZIP Files (*.gz)", "gz"); private final static FileFilter FILE_FILTER_JSON = new FileNameExtensionFilter("JSON Files (*.json)", "json"); private final static FileFilter FILE_FILTER_DOCX = new FileNameExtensionFilter("Microsoft Word documents (*.docx)", "docx"); private final static FileFilter FILE_FILTER_CSV = new FileNameExtensionFilter("Text Files (*.csv)", "csv"); private final static FileFilter FILE_FILTER_R = new FileNameExtensionFilter("R script (*.r)", "r"); private final static FileFilter FILE_FILTER_XLSX = new FileNameExtensionFilter("XLSX files (*.xlsx)", "xlsx"); private JFrame frame; private JScrollPane scrollPane1; private JScrollPane scrollPane2; private MappingPanel tableMappingPanel; private MappingPanel fieldMappingPanel; private DetailsPanel detailsPanel; private JSplitPane tableFieldSplitPane; private JFileChooser chooser; public static void main(String[] args) { new RabbitInAHatMain(args); } public RabbitInAHatMain(String[] args) { // Set look and feel to the system look and feel try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ex) { ex.printStackTrace(); } 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.setTargetDatabase(Database.generateCDMModel(CDMVersion.CDMV501)); 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); scrollPane1.setOpaque(true); scrollPane1.setBackground(Color.WHITE); 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")); tableFieldSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPane1, scrollPane2); tableFieldSplitPane.setDividerLocation(600); tableFieldSplitPane.setDividerSize(0); detailsPanel = new DetailsPanel(); detailsPanel.setBorder(new TitledBorder("Details")); detailsPanel.setPreferredSize(new Dimension(200, 500)); detailsPanel.setMinimumSize(new Dimension(0, 0)); tableMappingPanel.setDetailsListener(detailsPanel); fieldMappingPanel.setDetailsListener(detailsPanel); JSplitPane leftRightSplinePane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tableFieldSplitPane, detailsPanel); leftRightSplinePane.setResizeWeight(0.40); frame.add(leftRightSplinePane); loadIcons(frame); frame.pack(); frame.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH); frame.setVisible(true); if (args.length > 0) { doOpenSpecs(args[0]); } } private void loadIcons(JFrame f) { List<Image> icons = new ArrayList<Image>(); 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"); int menuShortcutMask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); menuBar.add(fileMenu); JMenuItem openScanReportItem = new JMenuItem(ACTION_CMD_OPEN_SCAN_REPORT); openScanReportItem.addActionListener(this); openScanReportItem.setActionCommand(ACTION_CMD_OPEN_SCAN_REPORT); fileMenu.add(openScanReportItem); JMenuItem openItem = new JMenuItem(ACTION_CMD_OPEN_ETL_SPECS); openItem.addActionListener(this); openItem.setActionCommand(ACTION_CMD_OPEN_ETL_SPECS); openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, menuShortcutMask)); fileMenu.add(openItem); JMenuItem saveItem = new JMenuItem(ACTION_CMD_SAVE); saveItem.addActionListener(this); saveItem.setActionCommand(ACTION_CMD_SAVE); saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, menuShortcutMask)); fileMenu.add(saveItem); JMenuItem saveAsItem = new JMenuItem(ACTION_CMD_SAVE_AS); saveAsItem.addActionListener(this); saveAsItem.setActionCommand(ACTION_CMD_SAVE_AS); fileMenu.add(saveAsItem); JMenuItem generateDocItem = new JMenuItem(ACTION_CMD_GENERATE_ETL_DOCUMENT); generateDocItem.addActionListener(this); generateDocItem.setActionCommand(ACTION_CMD_GENERATE_ETL_DOCUMENT); fileMenu.add(generateDocItem); JMenuItem generateTestFrameworkItem = new JMenuItem(ACTION_CMD_GENERATE_TEST_FRAMEWORK); generateTestFrameworkItem.addActionListener(this); generateTestFrameworkItem.setActionCommand(ACTION_CMD_GENERATE_TEST_FRAMEWORK); fileMenu.add(generateTestFrameworkItem); JMenuItem generatePackageTestFrameworkItem = new JMenuItem(ACTION_CMD_GENERATE_PACKAGE_TEST_FRAMEWORK); generatePackageTestFrameworkItem.addActionListener(this); generatePackageTestFrameworkItem.setActionCommand(ACTION_CMD_GENERATE_PACKAGE_TEST_FRAMEWORK); fileMenu.add(generatePackageTestFrameworkItem); JMenu editMenu = new JMenu("Edit"); menuBar.add(editMenu); JMenuItem discardCounts = new JMenuItem(ACTION_CMD_DISCARD_COUNTS); discardCounts.addActionListener(this); discardCounts.setActionCommand(ACTION_CMD_DISCARD_COUNTS); editMenu.add(discardCounts); JMenuItem filter = new JMenuItem(ACTION_CMD_FILTER); filter.addActionListener(this); filter.setActionCommand(ACTION_CMD_FILTER); filter.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, menuShortcutMask)); editMenu.add(filter); JMenu setTarget = new JMenu("Set Target Database"); JMenuItem targetCDMV4 = new JMenuItem(ACTION_CMD_SET_TARGET_V4); targetCDMV4.addActionListener(this); targetCDMV4.setActionCommand(ACTION_CMD_SET_TARGET_V4); setTarget.add(targetCDMV4); JMenuItem targetCDMV5 = new JMenuItem(ACTION_CMD_SET_TARGET_V5); targetCDMV5.addActionListener(this); targetCDMV5.setActionCommand(ACTION_CMD_SET_TARGET_V5); setTarget.add(targetCDMV5); JMenuItem targetCDMV501 = new JMenuItem(ACTION_CMD_SET_TARGET_V501); targetCDMV501.addActionListener(this); targetCDMV501.setActionCommand(ACTION_CMD_SET_TARGET_V501); setTarget.add(targetCDMV501); JMenuItem loadTarget = new JMenuItem(ACTION_CMD_SET_TARGET_CUSTOM); loadTarget.addActionListener(this); loadTarget.setActionCommand(ACTION_CMD_SET_TARGET_CUSTOM); setTarget.add(loadTarget); editMenu.add(setTarget); JMenuItem addStemTable = new JMenuItem(ACTION_ADD_STEM_TABLE); addStemTable.addActionListener(this); addStemTable.setActionCommand(ACTION_ADD_STEM_TABLE); editMenu.add(addStemTable); JMenu arrowMenu = new JMenu("Arrows"); menuBar.add(arrowMenu); JMenuItem makeMappings = new JMenuItem(ACTION_CMD_MAKE_MAPPING); makeMappings.addActionListener(this); makeMappings.setActionCommand(ACTION_CMD_MAKE_MAPPING); makeMappings.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, menuShortcutMask)); arrowMenu.add(makeMappings); JMenuItem removeMappings = new JMenuItem(ACTION_CMD_REMOVE_MAPPING); removeMappings.addActionListener(this); removeMappings.setActionCommand(ACTION_CMD_REMOVE_MAPPING); removeMappings.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, menuShortcutMask)); arrowMenu.add(removeMappings); JMenuItem markCompleted = new JMenuItem(ACTION_CMD_MARK_COMPLETED); markCompleted.addActionListener(this); markCompleted.setActionCommand(ACTION_CMD_MARK_COMPLETED); markCompleted.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, menuShortcutMask)); arrowMenu.add(markCompleted); JMenuItem unmarkCompleted = new JMenuItem(ACTION_CMD_UNMARK_COMPLETED); unmarkCompleted.addActionListener(this); unmarkCompleted.setActionCommand(ACTION_CMD_UNMARK_COMPLETED); unmarkCompleted.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, menuShortcutMask)); arrowMenu.add(unmarkCompleted); // JMenu viewMenu = new JMenu("View"); // menuBar.add(viewMenu); JMenu helpMenu = new JMenu("Help"); menuBar.add(helpMenu); JMenuItem helpItem = new JMenuItem(ACTION_CMD_HELP); helpItem.addActionListener(this); helpItem.setActionCommand(ACTION_CMD_HELP); helpMenu.add(helpItem); return menuBar; } @Override public void notifyResized(int height, boolean minimized, boolean maximized) { if (scrollPane2.isVisible() == maximized) scrollPane2.setVisible(!maximized); if (!maximized) scrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); else scrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); if (!minimized) scrollPane2.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); else scrollPane2.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); tableFieldSplitPane.setDividerLocation(height); } /** * Display file chooser for a path to save or open to * * @param saveMode * true to display a save dialog, false for open * @param filter * restrict files displayed * @return if file selected, absolute path of selected file otherwise null */ private String choosePath(boolean saveMode, FileFilter... filter) { String result = null; if (chooser == null) { chooser = new JFileChooser(); } chooser.resetChoosableFileFilters(); chooser.setFileFilter(filter[0]); for (int i = 1; i < filter.length; i++) chooser.addChoosableFileFilter(filter[i]); int dialogResult = saveMode ? chooser.showSaveDialog(frame) : chooser.showOpenDialog(frame); if (dialogResult == JFileChooser.APPROVE_OPTION) result = chooser.getSelectedFile().getAbsolutePath(); return result; } private String chooseSavePath(FileFilter... fileFilter) { String path = choosePath(true, fileFilter); if (path != null && fileFilter[0] == FILE_FILTER_GZ && !path.toLowerCase().endsWith(".json.gz") && !path.toLowerCase().endsWith(".json")) path += ".json.gz"; if (path != null && fileFilter[0] == FILE_FILTER_DOCX && !path.toLowerCase().endsWith(".docx")) path += ".docx"; return path; } private String chooseOpenPath(FileFilter... fileFilter) { return choosePath(false, fileFilter); } @Override public void actionPerformed(ActionEvent event) { switch (event.getActionCommand()) { case ACTION_CMD_SAVE: String filename = ObjectExchange.etl.getFilename(); doSave((filename == null || !filename.toLowerCase().endsWith(".json.gz")) ? chooseSavePath(FILE_FILTER_GZ) : filename); break; case ACTION_CMD_SAVE_AS: doSave(chooseSavePath(FILE_FILTER_GZ, FILE_FILTER_JSON)); break; case ACTION_CMD_OPEN_ETL_SPECS: doOpenSpecs(chooseOpenPath(FILE_FILTER_GZ, FILE_FILTER_JSON)); break; case ACTION_CMD_OPEN_SCAN_REPORT: doOpenScanReport(chooseOpenPath(FILE_FILTER_XLSX)); break; case ACTION_CMD_GENERATE_ETL_DOCUMENT: doGenerateEtlDoc(chooseSavePath(FILE_FILTER_DOCX)); break; case ACTION_CMD_GENERATE_TEST_FRAMEWORK: doGenerateTestFramework(chooseSavePath(FILE_FILTER_R)); break; case ACTION_CMD_GENERATE_PACKAGE_TEST_FRAMEWORK: doGeneratePackageTestFramework(chooseSavePath(FILE_FILTER_R)); break; case ACTION_CMD_DISCARD_COUNTS: doDiscardCounts(); break; case ACTION_CMD_FILTER: doOpenFilterDialog(); break; case ACTION_CMD_MAKE_MAPPING: doMakeMappings(); break; case ACTION_CMD_REMOVE_MAPPING: doRemoveMappings(); break; case ACTION_CMD_SET_TARGET_V4: doSetTargetCDM(CDMVersion.CDMV4); break; case ACTION_CMD_SET_TARGET_V5: doSetTargetCDM(CDMVersion.CDMV5); break; case ACTION_CMD_SET_TARGET_V501: doSetTargetCDM(CDMVersion.CDMV501); break; case ACTION_CMD_SET_TARGET_CUSTOM: doSetTargetCustom(chooseOpenPath(FILE_FILTER_CSV)); break; case ACTION_ADD_STEM_TABLE: doAddStemTable(); break; case ACTION_CMD_MARK_COMPLETED: doMarkCompleted(); break; case ACTION_CMD_UNMARK_COMPLETED: doUnmarkCompleted(); break; case ACTION_CMD_HELP: doOpenWiki(); break; } } private void doAddStemTable() { ETL etl = ObjectExchange.etl; StemTableAdd.addStemTable(etl); ObjectExchange.etl = etl; tableMappingPanel.setMapping(etl.getTableToTableMapping()); } private void doGenerateTestFramework(String filename) { if (filename != null) { frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); ETLTestFrameWorkGenerator.generate(ObjectExchange.etl, filename); frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } private void doGeneratePackageTestFramework(String filename) { if (filename != null) { frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); ETLPackageTestFrameWorkGenerator.generate(ObjectExchange.etl, filename); frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } private void doOpenWiki() { try { Desktop desktop = Desktop.getDesktop(); desktop.browse(new URI(WIKI_URL)); } catch (URISyntaxException | IOException ex) { } } private void doSetTargetCustom(String fileName) { if (fileName != null) { File file = new File(fileName); InputStream stream; try { stream = new FileInputStream(file); ETL etl = new ETL(ObjectExchange.etl.getSourceDatabase(), Database.generateModelFromCSV(stream, file.getName())); etl.copyETLMappings(ObjectExchange.etl); tableMappingPanel.setMapping(etl.getTableToTableMapping()); ObjectExchange.etl = etl; } catch (IOException e) { // Do nothing if error } } } private void doSetTargetCDM(CDMVersion cdmVersion) { ETL etl = new ETL(ObjectExchange.etl.getSourceDatabase(), Database.generateCDMModel(cdmVersion)); etl.copyETLMappings(ObjectExchange.etl); tableMappingPanel.setMapping(etl.getTableToTableMapping()); ObjectExchange.etl = etl; } private void doOpenFilterDialog() { FilterDialog filter; filter = new FilterDialog(frame); filter.setFilterPanel(tableMappingPanel); filter.setVisible(true); } private void doMakeMappings() { if (this.tableMappingPanel.isMaximized()) { this.tableMappingPanel.makeMapSelectedSourceAndTarget(); } else { this.fieldMappingPanel.makeMapSelectedSourceAndTarget(); } } private void doRemoveMappings() { if (this.tableMappingPanel.isMaximized()) { this.tableMappingPanel.removeMapSelectedSourceAndTarget(); } else { this.fieldMappingPanel.removeMapSelectedSourceAndTarget(); } } private void doDiscardCounts() { ObjectExchange.etl.discardCounts(); detailsPanel.refresh(); } private void doSave(String filename) { if (filename != null) { frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); ETL.FileFormat fileFormat = filename.endsWith("json.gz") ? ETL.FileFormat.GzipJson : filename.endsWith("json") ? ETL.FileFormat.Json : ETL.FileFormat.Binary; ObjectExchange.etl.save(filename, fileFormat); frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } private void doOpenSpecs(String filename) { if (filename != null) { frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); ETL.FileFormat fileFormat = filename.endsWith(".json.gz") ? ETL.FileFormat.GzipJson : filename.endsWith(".json") ? ETL.FileFormat.Json : ETL.FileFormat.Binary; try { ObjectExchange.etl = ETL.fromFile(filename, fileFormat); tableMappingPanel.setMapping(ObjectExchange.etl.getTableToTableMapping()); } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(null, "Invalid File Format", "Error", JOptionPane.ERROR_MESSAGE); } frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } private void doOpenScanReport(String filename) { if (filename != null) { boolean replace = true; if (ObjectExchange.etl.getSourceDatabase().getTables().size() != 0) { Object[] options = { "Replace current data", "Load data on field values only" }; int result = JOptionPane.showOptionDialog(frame, "You already have source data loaded. Do you want to", "Replace source data?", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); if (result == -1) return; if (result == 1) replace = false; } frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); if (replace) { ETL etl = new ETL(); try { etl.setSourceDatabase(Database.generateModelFromScanReport(filename)); etl.setTargetDatabase(ObjectExchange.etl.getTargetDatabase()); tableMappingPanel.setMapping(etl.getTableToTableMapping()); ObjectExchange.etl = etl; } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(null, "Invalid File Format", "Error", JOptionPane.ERROR_MESSAGE); } } else { try { Database newData = Database.generateModelFromScanReport(filename); Database oldData = ObjectExchange.etl.getSourceDatabase(); for (Table newTable : newData.getTables()) { Table oldTable = (Table) findByName(newTable.getName(), oldData.getTables()); if (oldTable != null) { for (Field newField : newTable.getFields()) { Field oldField = (Field) findByName(newField.getName(), oldTable.getFields()); if (oldField != null) { oldField.setValueCounts(newField.getValueCounts()); } } } } } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(null, "Invalid File Format", "Error", JOptionPane.ERROR_MESSAGE); } } frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } private MappableItem findByName(String name, List<? extends MappableItem> list) { for (MappableItem item : list) if (item.getName().toLowerCase().equals(name.toLowerCase())) return item; return null; } private void doGenerateEtlDoc(String filename) { if (filename != null) { frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); ETLDocumentGenerator.generate(ObjectExchange.etl, filename); frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } private void doMarkCompleted() { this.tableMappingPanel.markCompleted(); this.fieldMappingPanel.markCompleted(); } private void doUnmarkCompleted() { this.tableMappingPanel.unmarkCompleted(); this.fieldMappingPanel.unmarkCompleted(); } }