net.sourceforge.squirrel_sql.plugins.smarttools.gui.SmarttoolFindBadNullValuesFrame.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.squirrel_sql.plugins.smarttools.gui.SmarttoolFindBadNullValuesFrame.java

Source

/*
 * Copyright (C) 2008 Michael Romankiewicz
 * microm at users.sourceforge.net
 *
 * 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.
 */
package net.sourceforge.squirrel_sql.plugins.smarttools.gui;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DialogWidget;
import net.sourceforge.squirrel_sql.client.session.ISession;
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.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
import net.sourceforge.squirrel_sql.plugins.smarttools.SmarttoolsHelper;
import net.sourceforge.squirrel_sql.plugins.smarttools.comp.STButton;

import javax.swing.*;
import javax.swing.border.EtchedBorder;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.util.Date;
import java.util.Vector;

public class SmarttoolFindBadNullValuesFrame extends DialogWidget implements ISmarttoolFrame, ActionListener {
    private static final long serialVersionUID = -1504852937961154906L;

    private final String INDENT = "   ";
    private final int START_WORKING = 1;
    private final int STOP_WORKING = 2;

    // variables
    // ========================================================================
    // non visible
    // ------------------------------------------------------------------------
    // Logger for this class
    private final static ILogger log = LoggerController.createLogger(SmarttoolFindBadNullValuesFrame.class);

    private final static StringManager stringManager = StringManagerFactory
            .getStringManager(SmarttoolFindBadNullValuesFrame.class);
    private ISession session;
    private Thread threadWork = null;
    private boolean threadSuspended;
    private Vector<String> vecHeader = new Vector<String>();
    private Vector<Vector<Object>> vecData = new Vector<Vector<Object>>();

    // visible (gui)
    // ------------------------------------------------------------------------
    private JLabel lblTitleTable = new JLabel();
    private JLabel lblTablename = new JLabel();
    private JTextField tfTablename = new JTextField();

    private STButton btnStart = new STButton();
    private STButton btnStop = new STButton();
    private JLabel lblTitleTableResult = new JLabel();
    private JLabel lblFooterTableResult = new JLabel();
    private STButton btnPrint = new STButton();
    private JTable tblResult = null;
    private JProgressBar pbMain = new JProgressBar();

    /**
     * Constructor
     * 
     * @param app
     * @param rsrc
     * @param session
     * @param tab
     */
    public SmarttoolFindBadNullValuesFrame(ISession session, String title) {
        super("Smarttool - " + title, true, true, true, true, session.getApplication());
        this.session = session;

        initLayout();
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.setVisible(true);
        this.moveToFront();
    }

    private interface i18n {
        // Labels
        String LBL_TITLE_USED_TABLES = stringManager.getString("badnullvalues.title.tables");

        String LBL_TABLENAME = stringManager.getString("badnullvalues.lbl.table.name");

        String LBL_BTN_START = stringManager.getString("global.lbl.btn.start");
        String LBL_BTN_STOP = stringManager.getString("global.lbl.btn.stop");
        String LBL_BTN_PRINT = stringManager.getString("global.lbl.btn.print");

        // Tooltips and questions
        String TOOLTIP_WILDCARD = stringManager.getString("badnullvalues.tooltip.wildcard");
        String TOOLTIP_BTN_PRINT = stringManager.getString("global.tooltip.btn.print");

        // Global misc
        String GLOBAL_RECORDS = stringManager.getString("global.records");
        String GLOBAL_TABLE = stringManager.getString("global.table");
        String GLOBAL_COLUMN = stringManager.getString("global.column");
        String GLOBAL_DATATYPE = stringManager.getString("global.datatype");
        String GLOBAL_PAGE = stringManager.getString("global.page");
        String GLOBAL_ALIAS = stringManager.getString("global.alias");

        // Questions
        String QUESTION_CANCEL_WORK = stringManager.getString("badnullvalues.question.cancel.work");
        String QUESTION_CANCEL_WORK_TITLE = stringManager.getString("badnullvalues.question.cancel.work.title");

        // Errors
        String ERROR_READ_CHECKING_DATA = stringManager.getString("badnullvalues.error.read.checking.data");
        String ERROR_ON_TABLE = stringManager.getString("badnullvalues.error.on.table");

        // Infos
        String INFO_FINISHED = stringManager.getString("badnullvalues.info.finished");
        String INFO_REPORT = stringManager.getString("badnullvalues.info.report");
    }

    private void initLayout() {
        this.getContentPane().setLayout(new BorderLayout());
        createTableHeader();
        tblResult = new JTable(vecData, vecHeader);
        this.getContentPane().add(createPanel());

        initVisualObjects();
    }

    public JPanel createPanel() {
        JPanel jpanel1 = new JPanel();
        FormLayout formlayout1 = new FormLayout(
                "FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE",
                "CENTER:2DLU:NONE,FILL:DEFAULT:NONE,CENTER:DEFAULT:NONE,FILL:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE");
        CellConstraints cc = new CellConstraints();
        jpanel1.setLayout(formlayout1);

        pbMain.setName("pbMain");
        pbMain.setValue(25);
        jpanel1.add(pbMain, cc.xywh(2, 11, 3, 1));

        tblResult.setName("taResult");
        JScrollPane jscrollpane1 = new JScrollPane();
        jscrollpane1.setViewportView(tblResult);
        jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        jpanel1.add(jscrollpane1, cc.xywh(2, 7, 3, 1));

        jpanel1.add(createpanelTableAndColumn(), cc.xy(2, 2));
        jpanel1.add(createPanelButton(), cc.xy(4, 2));
        lblTitleTableResult.setBackground(new Color(102, 102, 102));
        lblTitleTableResult.setName("lblTitleTableResult");
        lblTitleTableResult.setOpaque(true);
        lblTitleTableResult.setText(" Searching for ...");
        jpanel1.add(lblTitleTableResult, cc.xy(2, 4));

        lblFooterTableResult.setBackground(new Color(102, 102, 102));
        lblFooterTableResult.setName("lblFooterTableResult");
        lblFooterTableResult.setOpaque(true);
        lblFooterTableResult.setText(" Finshed in ...");
        jpanel1.add(lblFooterTableResult, cc.xywh(2, 9, 3, 1));

        btnPrint.setActionCommand("Print");
        btnPrint.setName("btnPrint");
        btnPrint.setText("Print");
        jpanel1.add(btnPrint, cc.xy(4, 4));

        return jpanel1;
    }

    public JPanel createpanelTableAndColumn() {
        JPanel jpanel1 = new JPanel();
        jpanel1.setName("panelTableAndColumn");
        EtchedBorder etchedborder1 = new EtchedBorder(EtchedBorder.RAISED, null, null);
        jpanel1.setBorder(etchedborder1);
        FormLayout formlayout1 = new FormLayout(
                "FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE",
                "CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE");
        CellConstraints cc = new CellConstraints();
        jpanel1.setLayout(formlayout1);

        lblTitleTable.setBackground(new Color(102, 102, 102));
        lblTitleTable.setName("lblTitleTable");
        lblTitleTable.setOpaque(true);
        lblTitleTable.setText(" Used tables");
        jpanel1.add(lblTitleTable, cc.xywh(1, 1, 5, 1));

        lblTablename.setName("lblTablename");
        lblTablename.setText("table name");
        jpanel1.add(lblTablename, cc.xy(2, 3));

        tfTablename.setName("tfTablename");
        jpanel1.add(tfTablename, cc.xy(4, 3));

        return jpanel1;
    }

    public JPanel createPanelButton() {
        JPanel jpanel1 = new JPanel();
        jpanel1.setName("panelButton");
        FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:NONE",
                "CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE");
        CellConstraints cc = new CellConstraints();
        jpanel1.setLayout(formlayout1);

        btnStart.setActionCommand("Start");
        btnStart.setName("btnStart");
        btnStart.setText("Start");
        jpanel1.add(btnStart, cc.xy(1, 1));

        btnStop.setActionCommand("Stop");
        btnStop.setName("btnStop");
        btnStop.setText("Stop");
        jpanel1.add(btnStop, cc.xy(1, 3));

        return jpanel1;
    }

    public void setFocusToFirstEmptyInputField() {
        // nothing to do
    }

    private void initVisualObjects() {
        lblTitleTable.setText(i18n.LBL_TITLE_USED_TABLES);
        lblTablename.setText(i18n.LBL_TABLENAME);
        lblTitleTableResult.setText(" " + i18n.INFO_REPORT);
        lblFooterTableResult.setText("");

        tfTablename.setToolTipText(i18n.TOOLTIP_WILDCARD);

        btnStart.setText(i18n.LBL_BTN_START);
        btnStart.setIcon(SmarttoolsHelper.loadIcon("start16x16.png"));
        btnStart.addActionListener(this);

        btnStop.setText(i18n.LBL_BTN_STOP);
        btnStop.setIcon(SmarttoolsHelper.loadIcon("stop16x16.png"));
        btnStop.addActionListener(this);
        btnStop.setEnabled(false);

        btnPrint.setText(i18n.LBL_BTN_PRINT);
        btnPrint.setIcon(SmarttoolsHelper.loadIcon("printer16x16.png"));
        btnPrint.addActionListener(this);
        btnPrint.setEnabled(false);

        pbMain.setValue(0);
        pbMain.setStringPainted(true);
    }

    private void createTableHeader() {
        vecHeader.add(i18n.GLOBAL_TABLE);
        vecHeader.add(i18n.GLOBAL_COLUMN);
        vecHeader.add(i18n.GLOBAL_DATATYPE);
        vecHeader.add(i18n.GLOBAL_RECORDS);
    }

    // controlling
    // ------------------------------------------------------------------------
    public void controlComponents(int type) {
        if (type == START_WORKING || type == STOP_WORKING) {
            boolean b = type == STOP_WORKING;
            tfTablename.setEnabled(b);
            btnStart.setEnabled(b);
            btnStop.setEnabled(!b);
            btnPrint.setEnabled(b && tblResult.getRowCount() > 0);
        }
    }

    // user checks
    // ------------------------------------------------------------------------
    private void startWork() {
        controlComponents(START_WORKING);
        threadWork = new ThreadWork();
        threadWork.start();
    }

    private void stopWork() {
        threadSuspended = true;
        if (JOptionPane.showConfirmDialog(session.getApplication().getMainFrame(), i18n.QUESTION_CANCEL_WORK,
                i18n.QUESTION_CANCEL_WORK_TITLE, JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
            threadWork = null;
            controlComponents(STOP_WORKING);
        }
        threadSuspended = false;
    }

    private void printResult() {
        SmarttoolsHelper.printTable(tblResult, this.getTitle(),
                i18n.GLOBAL_ALIAS + ": " + session.getAlias().getName() + " | "
                        + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT).format(new Date())
                        + " | " + i18n.GLOBAL_PAGE + " {0}");
    }

    // ########################################################################
    // ########## events
    // ########################################################################
    // ------------------------------------------------------------------------
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btnStart) {
            startWork();
        } else if (e.getSource() == btnStop) {
            stopWork();
        } else if (e.getSource() == btnPrint) {
            printResult();
        }
    }

    // ------------------------------------------------------------------------
    class ThreadWork extends Thread {
        private Thread thisThread = null;

        @Override
        public void run() {
            super.run();
            thisThread = Thread.currentThread();

            startTest();

            controlComponents(STOP_WORKING);
            threadWork = null;
        }

        private boolean isThreadInvalid() {
            if (thisThread != threadWork) {
                return true;
            }
            try {
                synchronized (this) {
                    while (threadSuspended) {
                        wait(200);
                    }
                }
            } catch (InterruptedException e) {
            }
            return false;
        }

        private void startTest() {
            long startTime = System.currentTimeMillis();

            ((DefaultTableModel) tblResult.getModel()).setDataVector(new Vector<Vector<Object>>(), vecHeader);

            String tableNamePattern = tfTablename.getText().trim();
            if (tableNamePattern.length() == 0) {
                tableNamePattern = "%";
            }
            try {
                ITableInfo[] tableInfoArray = session.getMetaData().getTables(null, null, tableNamePattern,
                        new String[] { "TABLE" }, null);
                lblFooterTableResult.setText("");
                pbMain.setValue(0);
                pbMain.setMaximum(tableInfoArray.length);

                for (int i = 0; i < tableInfoArray.length; i++) {
                    ITableInfo tableInfo = tableInfoArray[i];
                    pbMain.setString(tableInfo.getSimpleName() + " " + (i + 1) + "/" + pbMain.getMaximum());

                    checkColumns(tableInfo);

                    pbMain.setValue(i + 1);
                    pbMain.repaint();
                    if (isThreadInvalid()) {
                        break;
                    }
                }
                long diffTime = System.currentTimeMillis() - startTime;
                lblFooterTableResult.setText(" " + i18n.INFO_FINISHED + " " + diffTime + " ms");
            } catch (SQLException e) {
                log.error(e);
                JOptionPane.showMessageDialog(null, i18n.ERROR_READ_CHECKING_DATA);
            }
        }

        private void checkColumns(ITableInfo tableInfo) throws SQLException {
            TableColumnInfo[] columnInfos = session.getMetaData().getColumnInfo(tableInfo);
            Statement stmt = session.getSQLConnection().createStatement();
            int resultFound = 0;

            for (int c = 0; c < columnInfos.length; c++) {
                TableColumnInfo tableColumnInfo = columnInfos[c];
                String sql = null;

                if (tableColumnInfo.isNullAllowed() == 0) {
                    sql = "SELECT COUNT(*) FROM " + tableInfo.getSimpleName() + " WHERE "
                            + tableColumnInfo.getColumnName() + " IS NULL";
                }

                if (sql != null) {
                    try {
                        resultFound = SmarttoolsHelper.checkColumnData(stmt, sql);
                        if (resultFound > 0) {
                            addTableEntry(tableInfo.getSimpleName(), tableColumnInfo.getColumnName(),
                                    SmarttoolsHelper.getDataTypeForDisplay(tableColumnInfo), resultFound + "");
                        }
                    } catch (SQLException e) {
                        String text = INDENT + i18n.ERROR_ON_TABLE + " [" + tableInfo.getSimpleName() + "] "
                                + i18n.GLOBAL_COLUMN + " [" + tableColumnInfo.getColumnName() + "] :"
                                + e.getLocalizedMessage();
                        addTableEntry(tableInfo.getSimpleName(), tableColumnInfo.getColumnName(),
                                SmarttoolsHelper.getDataTypeForDisplay(tableColumnInfo), i18n.ERROR_ON_TABLE);
                        log.error(text);
                    }
                }
            }
            stmt.close();
        }

        private void addTableEntry(String tableName, String columnName, String dataType, String recordsFound) {
            Vector<Object> vecRow = new Vector<Object>();
            vecRow.add(tableName);
            vecRow.add(columnName);
            vecRow.add(dataType);
            vecRow.add(recordsFound);
            DefaultTableModel tm = (DefaultTableModel) tblResult.getModel();
            tm.addRow(vecRow);
            tm.fireTableDataChanged();
        }
    }
}