net.sourceforge.squirrel_sql.plugins.dataimport.gui.ImportFileDialog.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.squirrel_sql.plugins.dataimport.gui.ImportFileDialog.java

Source

package net.sourceforge.squirrel_sql.plugins.dataimport.gui;
/*
 * Copyright (C) 2007 Thorsten Mrell
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import net.sourceforge.squirrel_sql.client.gui.IOkClosePanelListener;
import net.sourceforge.squirrel_sql.client.gui.OkClosePanel;
import net.sourceforge.squirrel_sql.client.gui.OkClosePanelEvent;
import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DialogWidget;
import net.sourceforge.squirrel_sql.client.session.ISession;
import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
import net.sourceforge.squirrel_sql.fw.sql.ITableInfo;
import net.sourceforge.squirrel_sql.fw.sql.TableColumnInfo;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
import net.sourceforge.squirrel_sql.plugins.dataimport.ImportDataIntoTableExecutor;
import static net.sourceforge.squirrel_sql.plugins.dataimport.gui.SpecialColumnMapping.*;
import net.sourceforge.squirrel_sql.plugins.dataimport.importer.IFileImporter;
import net.sourceforge.squirrel_sql.plugins.dataimport.importer.csv.CSVFileImporter;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.Vector;

/**
 * This dialog has some options to specify how the file is imported into
 * the database.
 * 
 * @author Thorsten Mrell
 */
public class ImportFileDialog extends DialogWidget {
    private static final long serialVersionUID = 3470927611018381204L;

    private static final StringManager stringMgr = StringManagerFactory.getStringManager(ImportFileDialog.class);

    private String[][] previewData = null;
    private List<String> importerColumns = new Vector<String>();

    private JTable previewTable = null;
    private JTable mappingTable = null;
    private JCheckBox headersIncluded = null;
    private JCheckBox suggestColumns = null;
    private JCheckBox suggestColumnsIgnoreCase = null;
    private JCheckBox oneToOneMapping = null;
    private JCheckBox safeMode = null;
    private OkClosePanel btnsPnl = new OkClosePanel();

    private ISession session = null;
    private IFileImporter importer = null;
    private ITableInfo table = null;
    private TableColumnInfo[] columns = null;

    /**
     * The standard constructor
     * 
     * @param session The session
     * @param importer The file importer
     * @param table The table to import into
     * @param columns The columns of the import table
     */
    public ImportFileDialog(ISession session, IFileImporter importer, ITableInfo table, TableColumnInfo[] columns) {
        //i18n[ImportFileDialog.fileImport=Import file]
        super(stringMgr.getString("ImportFileDialog.fileImport"), true, session.getApplication());
        this.session = session;
        this.importer = importer;
        this.table = table;
        this.columns = columns;

        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        makeToolWindow(true);

        final JPanel content = new JPanel(new BorderLayout());
        content.add(createMainPanel(), BorderLayout.CENTER);
        setContentPane(content);
        btnsPnl.makeOKButtonDefault();
        btnsPnl.getRootPane().setDefaultButton(btnsPnl.getOKButton());
        pack();
    }

    private Component createMainPanel() {
        btnsPnl.addListener(new MyOkClosePanelListener());

        final FormLayout layout = new FormLayout(
                // Columns
                "left:pref:grow",
                // Rows
                //            "12dlu, 6dlu, 12dlu, 6dlu, 80dlu:grow, 6dlu, 12dlu,              6dlu, 80dlu:grow, 6dlu, pref"
                "12dlu, 6dlu, 12dlu, 6dlu, 80dlu:grow, 6dlu, 12dlu, 2dlu, 12dlu, 2dlu, 12dlu, 2dlu, 12dlu, 6dlu, 80dlu:grow, 6dlu, pref");

        PanelBuilder builder = new PanelBuilder(layout);
        CellConstraints cc = new CellConstraints();
        builder.setDefaultDialogBorder();

        previewTable = new JTable();
        JScrollPane scrollPane = new JScrollPane(previewTable);

        mappingTable = new JTable(new ColumnMappingTableModel(columns));
        JScrollPane scrollPane2 = new JScrollPane(mappingTable);

        //i18n[ImportFileDialog.headersIncluded=Headers in first line]
        headersIncluded = new JCheckBox(stringMgr.getString("ImportFileDialog.headersIncluded"));
        headersIncluded.setSelected(true);
        headersIncluded.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GUIUtils.processOnSwingEventThread(new Runnable() {
                    public void run() {
                        ImportFileDialog.this.updatePreviewData();
                    }
                });
            }
        });

        // i18n[ImportFileDialog.suggestColumns=Suggest columns (find matching columns)]
        suggestColumns = new JCheckBox(stringMgr.getString("ImportFileDialog.suggestColumns"));
        suggestColumns.setSelected(false);
        suggestColumns.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GUIUtils.processOnSwingEventThread(new Runnable() {
                    public void run() {
                        if (oneToOneMapping.isSelected()) {
                            oneToOneMapping.setSelected(false);
                        }
                        ImportFileDialog.this.suggestColumns();
                    }
                });
            }
        });
        // i18n[ImportFileDialog.suggestColumnsIgnoreCase=ignore case]
        suggestColumnsIgnoreCase = new JCheckBox(stringMgr.getString("ImportFileDialog.suggestColumnsIgnoreCase"));
        suggestColumnsIgnoreCase.setSelected(false);
        suggestColumnsIgnoreCase.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GUIUtils.processOnSwingEventThread(new Runnable() {
                    public void run() {
                        ImportFileDialog.this.suggestColumns();
                    }
                });
            }
        });
        oneToOneMapping = new JCheckBox(stringMgr.getString("ImportFileDialog.oneToOneMapping"));
        oneToOneMapping.setSelected(false);
        oneToOneMapping.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                GUIUtils.processOnSwingEventThread(new Runnable() {
                    public void run() {
                        if (suggestColumns.isSelected()) {
                            suggestColumns.setSelected(false);
                        }
                        if (suggestColumnsIgnoreCase.isSelected()) {
                            suggestColumnsIgnoreCase.setSelected(false);
                        }
                        ImportFileDialog.this.oneToOneColumns();
                    }
                });
            }
        });
        safeMode = new JCheckBox(stringMgr.getString("ImportFileDialog.safetySwitch"));
        safeMode.setSelected(true);

        int y = 1;
        //i18n[ImportFileDialog.dataPreview=Data preview]
        builder.add(new JLabel(stringMgr.getString("ImportFileDialog.dataPreview")), cc.xy(1, y));

        y += 2;
        builder.add(headersIncluded, cc.xy(1, y));

        y += 2;
        builder.add(scrollPane, cc.xy(1, y));

        y += 2;
        builder.add(suggestColumns, cc.xy(1, y));

        y += 2;
        builder.add(suggestColumnsIgnoreCase, cc.xy(1, y));

        y += 2;
        builder.add(oneToOneMapping, cc.xy(1, y));

        y += 2;
        builder.add(safeMode, cc.xy(1, y));

        y += 2;
        builder.add(scrollPane2, cc.xy(1, y));

        y += 2;
        builder.add(btnsPnl, cc.xywh(1, y, 1, 1));

        return builder.getPanel();
    }

    /**
     * Sets the preview data for the dialog
     * 
     * @param data
     */
    public void setPreviewData(String[][] data) {
        previewData = data;
        updatePreviewData();
    }

    private void updatePreviewData() {
        JComboBox editBox = new JComboBox();
        editBox.addItem(SKIP.getVisibleString());
        editBox.addItem(FIXED_VALUE.getVisibleString());
        editBox.addItem(AUTO_INCREMENT.getVisibleString());
        editBox.addItem(NULL.getVisibleString());

        editBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int selectedRow = mappingTable.getSelectedRow();
                if (selectedRow == -1) {
                    return;
                }
                TableModel model = mappingTable.getModel();
                String comboValue = ((JComboBox) e.getSource()).getSelectedItem().toString();
                int fixedValueColumnIdx = ColumnMappingConstants.INDEX_FIXEDVALUE_COLUMN;
                if (comboValue.equals(AUTO_INCREMENT.getVisibleString())) {
                    // If the user picks auto-increment, auto-fill the "Fixed value" column with 0 for the start 
                    // value if it is currently empty.
                    if (model.getValueAt(selectedRow, fixedValueColumnIdx) == null
                            || "".equals(model.getValueAt(selectedRow, fixedValueColumnIdx))) {
                        model.setValueAt("0", selectedRow, fixedValueColumnIdx);
                    }

                } else if (!comboValue.equals(FIXED_VALUE.getVisibleString())) {
                    // If the user chooses neither Fixed value nor Auto-Increment, then clear the "Fixed value" 
                    // field if it has a value.
                    model.setValueAt("", selectedRow, fixedValueColumnIdx);
                }
                mappingTable.clearSelection();
            }

        });

        if (previewData != null && previewData.length > 0) {
            String[] headers = new String[previewData[0].length];
            String[][] data = previewData;

            if (headersIncluded.isSelected()) {
                for (int i = 0; i < headers.length; i++) {
                    headers[i] = data[0][i];
                }
                data = new String[previewData.length - 1][];
                for (int i = 1; i < previewData.length; i++) {
                    data[i - 1] = previewData[i];
                }
            } else {
                for (int i = 0; i < headers.length; i++) {
                    //i18n[ImportFileDialog.column=Column]
                    headers[i] = stringMgr.getString("ImportFileDialog.column") + i;
                }
            }

            importerColumns.clear();
            for (int i = 0; i < headers.length; i++) {
                importerColumns.add(headers[i]);
            }

            for (String header : headers) {
                editBox.addItem(header);
            }
            previewTable.setModel(new DefaultTableModel(data, headers));
        }
        mappingTable.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(editBox));
        ((ColumnMappingTableModel) mappingTable.getModel()).resetMappings();
        if (suggestColumns.isSelected()) {
            this.suggestColumns();
        } else if (oneToOneMapping.isSelected()) {
            this.oneToOneColumns();
        }

    }

    public void suggestColumns() {
        final ColumnMappingTableModel columnMappingTableModel = ((ColumnMappingTableModel) mappingTable.getModel());
        final boolean ignorecase = suggestColumnsIgnoreCase.isSelected();
        if (suggestColumns.isSelected()) {
            for (String importerColumn : importerColumns) {
                if (null != importerColumn && !importerColumn.isEmpty()) {
                    final TableColumnInfo suggestedColumn = suggestColumn(importerColumn, ignorecase);
                    if (suggestedColumn != null) {
                        final String suggestedColumnName = suggestedColumn.getColumnName();
                        int row = columnMappingTableModel.findTableColumn(suggestedColumnName);
                        columnMappingTableModel.setValueAt(importerColumn, row,
                                ColumnMappingConstants.INDEX_IMPORTFILE_COLUMN);
                    }
                }
            }
        } else {
            columnMappingTableModel.resetMappings();
        }
    }

    protected void oneToOneColumns() {
        final ColumnMappingTableModel columnMappingTableModel = ((ColumnMappingTableModel) mappingTable.getModel());
        if (oneToOneMapping.isSelected()) {
            int i = 0;
            for (String importerColumn : importerColumns) {
                if (null != importerColumn && !importerColumn.isEmpty() && i < columns.length) {
                    final TableColumnInfo suggestedColumn = columns[i++];
                    if (suggestedColumn != null) {
                        final String suggestedColumnName = suggestedColumn.getColumnName();
                        int row = columnMappingTableModel.findTableColumn(suggestedColumnName);
                        columnMappingTableModel.setValueAt(importerColumn, row,
                                ColumnMappingConstants.INDEX_IMPORTFILE_COLUMN);
                    }
                }
            }
        } else {
            columnMappingTableModel.resetMappings();
        }
    }

    private TableColumnInfo suggestColumn(final String importerColumn, final boolean ignoreCase) {
        for (TableColumnInfo colInfo : columns) {
            if (!ignoreCase && colInfo.getColumnName().equals(importerColumn)) {
                return colInfo;
            } else if (ignoreCase && colInfo.getColumnName().equalsIgnoreCase(importerColumn)) {
                return colInfo;
            }
        }
        return null;
    }

    /**
     * This is invoked if the user presses ok
     */
    public void ok() {
        dispose();
        //Set the SafetySwitch of the CSVReader
        if (importer instanceof CSVFileImporter) {
            ((CSVFileImporter) importer).setSafetySwitch(safeMode.isSelected());
        }
        ImportDataIntoTableExecutor executor = new ImportDataIntoTableExecutor(session, table, columns,
                importerColumns, (ColumnMappingTableModel) mappingTable.getModel(), importer);
        executor.setSkipHeader(headersIncluded.isSelected());
        executor.execute();
    }

    private final class MyOkClosePanelListener implements IOkClosePanelListener {
        /**
         * Callback for the ok key.
         * 
         * @param evt the event
         */
        public void okPressed(OkClosePanelEvent evt) {
            ImportFileDialog.this.ok();
        }

        /**
         * Callback for the close key.
         * 
         * @param evt the event
         */
        public void closePressed(OkClosePanelEvent evt) {
            ImportFileDialog.this.dispose();
        }

        /**
         * Callback for the cancel key.
         * 
         * @param evt the event
         */
        public void cancelPressed(OkClosePanelEvent evt) {
            ImportFileDialog.this.dispose();
        }
    }

}