Java tutorial
/* * 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.STDataType; import net.sourceforge.squirrel_sql.plugins.smarttools.SmarttoolsHelper; import net.sourceforge.squirrel_sql.plugins.smarttools.comp.STButton; import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import java.text.DateFormat; import java.text.ParseException; import java.util.Date; import java.util.List; import java.util.Vector; /** * @author Mike */ public class SmarttoolChangeValuesFrame extends DialogWidget implements ISmarttoolFrame, ActionListener { private static final long serialVersionUID = 3680564541641320485L; private final String WILDCARD = "%"; private final String INDENT = " "; private final int START_SEARCHING = 0; private final int START_CHANGEING = 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 final int TABLE_COL_MARKER = 0; private final int TABLE_COL_TABLE = 1; private final int TABLE_COL_COLUMNNAME = 2; // private final int TABLE_COL_DATATYPE = 3; // not used private final int TABLE_COL_RECORDS = 4; private final int TABLE_COL_STATUS = 5; private final int[] TABLE_DEFAULT_COL_WIDTH = new int[] { 30, 205, 210, 80, 120, 50 }; private ISession session; private Thread threadSearching = null; private Thread threadChanging = null; private boolean threadSuspended; private Vector<String> vecHeader = new Vector<String>(); private Vector<Vector<Object>> vecData = new Vector<Vector<Object>>(); private boolean operatorActionListenerDisabled = false; // visible (gui) // ------------------------------------------------------------------------ private JPanel panelMain = new JPanel(); private JLabel lblColumn = new JLabel(); private JTextField tfColumnName = new JTextField(); private JLabel lblDatatype = new JLabel(); private JComboBox cbDataType = new JComboBox(); private JCheckBox chkDisplayOnlyTablesWithData = new JCheckBox(); private JLabel lblWhere = new JLabel(); private JLabel lblOperator = new JLabel(); private JComboBox cbOperator = new JComboBox(); private JTextField tfOldValue = new JTextField(); private JLabel lblNewValue = new JLabel(); private JTextField tfNewValue = new JTextField(); private JCheckBox chkEnableChangeData = new JCheckBox(); private STButton btnSearchData = new STButton(); private STButton btnChangeData = new STButton(); private STButton btnStop = new STButton(); private JPanel panelResult = new JPanel(); private STButton btnSelectAll = new STButton(); private STButton btnSelectNone = new STButton(); private JLabel lblTitleResult = new JLabel(); private JTable tblResult = new JTable(); private STButton btnPrint = new STButton(); private JLabel lblFooterTableResult = new JLabel(); private JProgressBar pbMain = new JProgressBar(); private ImageIcon iconMarked = SmarttoolsHelper.loadIcon("gridMarked16x16.png"); private ImageIcon iconDemarked = SmarttoolsHelper.loadIcon("gridDemarked16x16.png"); /** * Constructor * * @param app * @param rsrc * @param session * @param tab */ public SmarttoolChangeValuesFrame(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(); JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.WARNING, i18n.WARNING_TITLE, JOptionPane.WARNING_MESSAGE); } private void initLayout() { this.getContentPane().setLayout(new BorderLayout()); createTableHeader(); tblResult = new JTable(vecData, vecHeader); this.getContentPane().add(createPanelMain()); initVisualObjects(); } private void initVisualObjects() { lblColumn.setText(i18n.GLOBAL_COLUMN); lblDatatype.setText(i18n.GLOBAL_DATATYPE); lblNewValue.setText(i18n.LBL_NEW_VALUE); lblTitleResult.setText(i18n.LBL_TITLE_RESULT); lblOperator.setText(i18n.GLOBAL_OPERATOR); lblNewValue.setText(i18n.LBL_NEW_VALUE); lblWhere.setText(i18n.LBL_WHERE); tfColumnName.setToolTipText(i18n.TOOLTIP_WILDCARD); tfOldValue.setToolTipText(i18n.TOOLTIP_TF_OLD_VALUE); btnSearchData.setText(i18n.LBL_BTN_SEARCHDATA); btnSearchData.setIcon(SmarttoolsHelper.loadIcon("start16x16.png")); btnSearchData.addActionListener(this); btnChangeData.setText(i18n.LBL_BTN_CHANGEDATA); btnChangeData.setIcon(SmarttoolsHelper.loadIcon("change16x16.png")); btnChangeData.addActionListener(this); btnStop.setText(i18n.GLOBAL_BTN_STOP); btnStop.setIcon(SmarttoolsHelper.loadIcon("stop16x16.png")); btnStop.addActionListener(this); btnStop.setEnabled(false); btnPrint.setText(i18n.GLOBAL_BTN_PRINT); btnPrint.setIcon(SmarttoolsHelper.loadIcon("printer16x16.png")); btnPrint.addActionListener(this); btnPrint.setEnabled(false); btnSelectAll.setText(i18n.LBL_BTN_ALL); btnSelectAll.setToolTipText(i18n.TOOLTIP_BTN_ALL); btnSelectAll.setIcon(iconMarked); btnSelectAll.addActionListener(this); btnSelectNone.setText(i18n.LBL_BTN_NONE); btnSelectNone.setToolTipText(i18n.TOOLTIP_BTN_NONE); btnSelectNone.setIcon(iconDemarked); btnSelectNone.addActionListener(this); fillDataTypes(); cbDataType.addActionListener(this); cbDataType.setSelectedIndex(0); cbOperator.addActionListener(this); chkDisplayOnlyTablesWithData.setText(i18n.LBL_CHK_ONLY_TABLES_WITH_DATA); chkEnableChangeData.setText(i18n.LBL_CHK_ENABLE_CHANGE_DATA); chkEnableChangeData.addActionListener(this); tblResult.setDefaultRenderer(Object.class, new SmarttoolChangeValuesTableCellRenderer()); tblResult.setModel(new SmarttoolChangeValuesTableModel()); tblResult.setRowSelectionAllowed(true); tblResult.setColumnSelectionAllowed(false); // tblResult.setAutoCreateRowSorter(true); tblResult.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { super.mouseClicked(e); if (tblResult.getSelectedColumn() == TABLE_COL_MARKER) { int row = tblResult.getSelectedRow(); boolean newMarkerValue = !((Boolean) tblResult.getValueAt(row, TABLE_COL_MARKER)) .booleanValue(); tblResult.setValueAt(newMarkerValue, row, TABLE_COL_MARKER); tblResult.setValueAt(newMarkerValue ? 0 : -1, row, TABLE_COL_STATUS); } } }); tblResult.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); SmarttoolsHelper.setColumnWidth(tblResult, TABLE_DEFAULT_COL_WIDTH); pbMain.setValue(0); pbMain.setStringPainted(true); controlComponents(STOP_WORKING); } private void createTableHeader() { vecHeader.add(""); vecHeader.add(i18n.GLOBAL_TABLE); vecHeader.add(i18n.GLOBAL_COLUMN); vecHeader.add(i18n.GLOBAL_DATATYPE); vecHeader.add(i18n.GLOBAL_RECORDS); vecHeader.add(i18n.GLOBAL_STATUS); } private void fillDataTypes() { cbDataType.removeAllItems(); List<STDataType> data = SmarttoolsHelper.getListSmarttoolsDataType(false); for (int i = 0; i < data.size(); i++) { cbDataType.addItem(data.get(i)); } cbDataType.setSelectedIndex(0); } public JPanel createPanelMain() { panelMain.setName("panelMain"); FormLayout formlayout1 = new FormLayout( "FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:100DLU:NONE,FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:80DLU:NONE,FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:8DLU:GROW(1.0),FILL:DEFAULT:NONE,FILL:4DLU:NONE", "CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:4DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE"); CellConstraints cc = new CellConstraints(); panelMain.setLayout(formlayout1); lblColumn.setName("lblColumn"); lblColumn.setText("column name"); panelMain.add(lblColumn, cc.xy(2, 2)); tfColumnName.setName("tfColumnName"); panelMain.add(tfColumnName, cc.xy(4, 2)); lblDatatype.setName("lblDatatype"); lblDatatype.setText("datatype"); panelMain.add(lblDatatype, cc.xy(6, 2)); cbDataType.setName("cbDataType"); panelMain.add(cbDataType, cc.xy(8, 2)); btnSearchData.setActionCommand("JButton"); btnSearchData.setName("btnSearchData"); btnSearchData.setText("search data"); panelMain.add(btnSearchData, cc.xy(13, 2)); btnChangeData.setActionCommand("JButton"); btnChangeData.setEnabled(false); btnChangeData.setName("btnChangeData"); btnChangeData.setText("change data"); panelMain.add(btnChangeData, cc.xy(13, 4)); chkDisplayOnlyTablesWithData.setActionCommand("display only rows with data"); chkDisplayOnlyTablesWithData.setName("chkDisplayOnlyTablesWithData"); chkDisplayOnlyTablesWithData.setSelected(true); chkDisplayOnlyTablesWithData.setText("display only rows with data"); panelMain.add(chkDisplayOnlyTablesWithData, cc.xy(10, 2)); btnStop.setActionCommand("stop"); btnStop.setEnabled(false); btnStop.setName("btnStop"); btnStop.setText("stop"); panelMain.add(btnStop, cc.xy(13, 6)); pbMain.setName("pbMain"); pbMain.setValue(25); panelMain.add(pbMain, cc.xywh(2, 12, 12, 1)); lblOperator.setName("lblOperator"); lblOperator.setText("operator"); panelMain.add(lblOperator, cc.xy(6, 4)); cbOperator.setName("cbOperator"); panelMain.add(cbOperator, cc.xy(8, 4)); lblNewValue.setName("lblNewValue"); lblNewValue.setText("new value"); panelMain.add(lblNewValue, cc.xy(2, 6)); tfNewValue.setName("tfNewValue"); panelMain.add(tfNewValue, cc.xy(4, 6)); chkEnableChangeData.setActionCommand("enable change data"); chkEnableChangeData.setName("chkEnableChangeData"); chkEnableChangeData.setText("enable change button"); panelMain.add(chkEnableChangeData, cc.xy(10, 6)); tfOldValue.setName("tfOldValue"); panelMain.add(tfOldValue, cc.xy(10, 4)); lblWhere.setName("lblWhere"); lblWhere.setText("where"); lblWhere.setHorizontalAlignment(JLabel.RIGHT); panelMain.add(lblWhere, cc.xy(4, 4)); lblFooterTableResult.setBackground(new Color(153, 153, 153)); lblFooterTableResult.setName("lblFooterTableResult"); lblFooterTableResult.setOpaque(true); lblFooterTableResult.setText("Finished in ..."); panelMain.add(lblFooterTableResult, cc.xywh(2, 10, 12, 1)); panelMain.add(createpanelResult(), cc.xywh(2, 8, 12, 1)); return panelMain; } public JPanel createpanelResult() { panelResult.setName("panelResult"); FormLayout formlayout1 = new FormLayout( "FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE,FILL:DEFAULT:NONE", "FILL:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE"); CellConstraints cc = new CellConstraints(); panelResult.setLayout(formlayout1); btnSelectAll.setActionCommand("all"); btnSelectAll.setName("btnSelectAll"); btnSelectAll.setText("all"); btnSelectAll.setToolTipText("select all result entries"); panelResult.add(btnSelectAll, cc.xy(1, 1)); btnSelectNone.setActionCommand("none"); btnSelectNone.setName("btnSelectNone"); btnSelectNone.setText("none"); btnSelectNone.setToolTipText("deselect all result entries"); panelResult.add(btnSelectNone, cc.xy(3, 1)); tblResult.setName("tblResult"); JScrollPane jscrollpane1 = new JScrollPane(); jscrollpane1.setViewportView(tblResult); jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); panelResult.add(jscrollpane1, cc.xywh(1, 3, 7, 1)); lblTitleResult.setBackground(new Color(153, 153, 153)); lblTitleResult.setName("lblTitleResult"); lblTitleResult.setOpaque(true); lblTitleResult.setText("Found tables and columns:"); EmptyBorder emptyborder1 = new EmptyBorder(0, 5, 0, 0); lblTitleResult.setBorder(emptyborder1); panelResult.add(lblTitleResult, cc.xy(5, 1)); btnPrint.setActionCommand("print"); btnPrint.setName("btnPrint"); btnPrint.setText(" print "); panelResult.add(btnPrint, cc.xy(7, 1)); return panelResult; } /* * (non-Javadoc) * * @see net.sourceforge.squirrel_sql.plugins.smarttools.gui.ISmarttoolFrame#setFocusToFirstEmptyInputField() */ public void setFocusToFirstEmptyInputField() { tfColumnName.requestFocusInWindow(); } private String getHeaderText() { return this.getTitle(); } private String getFooterText() { return i18n.GLOBAL_ALIAS + ": " + session.getAlias().getName() + " | " + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT).format(new Date()) + " | " + i18n.GLOBAL_PAGE + " {0}"; } private int getUsedGroup() { return ((STDataType) cbDataType.getSelectedItem()).getGroup(); } private int getUsedDataType() { return ((STDataType) cbDataType.getSelectedItem()).getJdbcType(); } private boolean isInputOK(int threadType) { if (threadType == START_SEARCHING) { if (tfColumnName.getText().trim().length() < 1) { JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.ERROR_COLUMNNAME_MISSING); tfColumnName.requestFocusInWindow(); return false; } } else { int group = getUsedGroup(); if (group == STDataType.GROUP_INT) { try { Integer.parseInt(tfNewValue.getText()); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.GLOBAL_ERROR_FORMAT_INTEGER); tfNewValue.requestFocusInWindow(); return false; } } else if (group == STDataType.GROUP_NUMERIC) { try { Double.parseDouble(tfNewValue.getText()); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.GLOBAL_ERROR_FORMAT_NUMERIC); tfNewValue.requestFocusInWindow(); return false; } } else if (group == STDataType.GROUP_DATE) { int dataType = getUsedDataType(); DateFormat df = null; if (dataType == Types.DATE) { df = DateFormat.getDateInstance(); try { df.parse(tfNewValue.getText()); } catch (ParseException ex) { JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.GLOBAL_ERROR_FORMAT_DATE); tfNewValue.requestFocusInWindow(); return false; } } else if (dataType == Types.TIMESTAMP) { df = DateFormat.getDateTimeInstance(); try { df.parse(tfNewValue.getText()); } catch (ParseException ex) { JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.GLOBAL_ERROR_FORMAT_DATETIME); tfNewValue.requestFocusInWindow(); return false; } } else if (dataType == Types.TIME) { df = DateFormat.getTimeInstance(); try { df.parse(tfNewValue.getText()); } catch (ParseException ex) { JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.GLOBAL_ERROR_FORMAT_TIME); tfNewValue.requestFocusInWindow(); return false; } } } // if (group == STDataType.GROUP_DATE) boolean selectedRowExists = false; for (int row = 0; row < tblResult.getRowCount(); row++) { if (((Boolean) tblResult.getValueAt(row, TABLE_COL_MARKER)).booleanValue()) { selectedRowExists = true; break; } } if (!selectedRowExists) { JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.ERROR_SELECT_ENTRY); return false; } } if (tfOldValue.isEnabled() && tfOldValue.getText().trim().length() == 0) { JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.ERROR_MISSING_OLD_VALUE); return false; } return true; } private String getWhereCondition(String columnName, String value) { if (cbOperator.getSelectedIndex() > 0) { return " where " + columnName + " " + (String) cbOperator.getSelectedItem() + " " + value; } else { return ""; } } private void startSearching() { if (isInputOK(START_SEARCHING)) { controlComponents(START_SEARCHING); chkEnableChangeData.setSelected(false); threadSearching = new ThreadSearching(); threadSearching.start(); } } private void startChanging() { if (isInputOK(START_CHANGEING) && JOptionPane.showConfirmDialog(session.getApplication().getMainFrame(), i18n.QUESTION_START_CHANGING, i18n.QUESTION_START_CHANGING_TITLE, JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { controlComponents(START_CHANGEING); chkEnableChangeData.setSelected(false); threadChanging = new ThreadChanging(); threadChanging.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) { if (threadSearching != null) { threadSearching = null; } else { threadChanging = null; } controlComponents(STOP_WORKING); } threadSuspended = false; } // controlling // ------------------------------------------------------------------------ public void controlComponents(int type) { boolean enabled = type == STOP_WORKING; tfColumnName.setEnabled(enabled); cbDataType.setEnabled(enabled); cbOperator.setEnabled(enabled); controlTfOldValue(enabled); chkDisplayOnlyTablesWithData.setEnabled(enabled); chkEnableChangeData.setEnabled(enabled && tblResult.getRowCount() > 0); tfNewValue.setEnabled(enabled && chkEnableChangeData.isSelected()); btnSearchData.setEnabled(enabled); btnChangeData.setEnabled(enabled && chkEnableChangeData.isSelected()); btnStop.setEnabled(!enabled); btnPrint.setEnabled(enabled && tblResult.getRowCount() > 0); btnSelectAll.setEnabled(enabled && tblResult.getRowCount() > 0); btnSelectNone.setEnabled(enabled && tblResult.getRowCount() > 0); tblResult.setEnabled(enabled); tfColumnName.setBackground(tfColumnName.isEnabled() ? Color.WHITE : Color.LIGHT_GRAY); tfNewValue.setBackground(tfNewValue.isEnabled() ? Color.WHITE : Color.LIGHT_GRAY); } private void controlTfOldValue(boolean enabled) { tfOldValue.setEnabled(enabled && cbOperator.getSelectedIndex() > 0 && !isNullOperator()); if (isNullOperator() || cbOperator.getSelectedIndex() == 0) { tfOldValue.setText(""); } tfOldValue.setBackground(tfOldValue.isEnabled() ? Color.WHITE : Color.LIGHT_GRAY); } private boolean isNullOperator() { return ((String) cbOperator.getSelectedItem()).toLowerCase().indexOf("null") > -1; } private String getOldValue() { if (isNullOperator()) { return ""; } String oldValue = tfOldValue.getText(); if (getUsedGroup() == STDataType.GROUP_CHAR || getUsedGroup() == STDataType.GROUP_DATE) { oldValue = "'" + oldValue + "'"; } return oldValue; } private String getNewValue() { String newValue = tfNewValue.getText(); if (getUsedGroup() == STDataType.GROUP_CHAR || getUsedGroup() == STDataType.GROUP_DATE) { newValue = "'" + newValue + "'"; } return newValue; } // ######################################################################## // ########## events // ######################################################################## // ------------------------------------------------------------------------ public void actionPerformed(ActionEvent e) { if (e.getSource() == btnSearchData) { startSearching(); } else if (e.getSource() == btnChangeData) { startChanging(); } else if (e.getSource() == btnStop) { stopWork(); } else if (e.getSource() == btnPrint) { SmarttoolsHelper.printTable(tblResult, getHeaderText(), getFooterText()); } else if (e.getSource() == btnSelectAll) { SmarttoolsHelper.markAllRows(tblResult, TABLE_COL_MARKER, true); ((SmarttoolChangeValuesTableModel) tblResult.getModel()).fireTableDataChanged(); } else if (e.getSource() == btnSelectNone) { SmarttoolsHelper.markAllRows(tblResult, TABLE_COL_MARKER, false); ((SmarttoolChangeValuesTableModel) tblResult.getModel()).fireTableDataChanged(); } else if (e.getSource() == chkEnableChangeData) { controlComponents(STOP_WORKING); tfNewValue.requestFocusInWindow(); } else if (e.getSource() == cbDataType) { operatorActionListenerDisabled = true; SmarttoolsHelper.fillOperatorTypes(cbOperator, getUsedGroup()); cbOperator.insertItemAt(i18n.ENTRY_NO_CONDITION, 0); operatorActionListenerDisabled = false; cbOperator.setSelectedIndex(0); } else if (e.getSource() == cbOperator) { if (!operatorActionListenerDisabled) { controlTfOldValue(true); } } } private interface i18n { // 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_STATUS = stringManager.getString("global.status"); String GLOBAL_PAGE = stringManager.getString("global.page"); String GLOBAL_ALIAS = stringManager.getString("global.alias"); String GLOBAL_OPERATOR = stringManager.getString("global.operator"); String GLOBAL_VALUE = stringManager.getString("global.value"); String GLOBAL_BTN_STOP = stringManager.getString("global.lbl.btn.stop"); String GLOBAL_BTN_PRINT = stringManager.getString("global.lbl.btn.print"); // Global errors String GLOBAL_ERROR_FORMAT_INTEGER = stringManager.getString("global.error.format.integer"); String GLOBAL_ERROR_FORMAT_NUMERIC = stringManager.getString("global.error.format.numeric"); String GLOBAL_ERROR_FORMAT_DATE = stringManager.getString("global.error.format.date"); String GLOBAL_ERROR_FORMAT_DATETIME = stringManager.getString("global.error.format.datetime"); String GLOBAL_ERROR_FORMAT_TIME = stringManager.getString("global.error.format.time"); // Misc String WARNING_TITLE = stringManager.getString("changevalues.info.warning.title"); String WARNING = stringManager.getString("changevalues.info.warning"); // Labels String LBL_COLUMNNAME = stringManager.getString("changevalues.lbl.columnname"); String LBL_NEW_VALUE = stringManager.getString("changevalues.lbl.new.value"); String LBL_WHERE = stringManager.getString("changevalues.lbl.where"); String LBL_TITLE_RESULT = stringManager.getString("changevalues.lbl.title.result"); String LBL_BTN_SEARCHDATA = stringManager.getString("changevalues.btn.searchdata"); String LBL_BTN_CHANGEDATA = stringManager.getString("changevalues.btn.changedata"); String LBL_BTN_ALL = stringManager.getString("changevalues.btn.select.all"); String LBL_BTN_NONE = stringManager.getString("changevalues.btn.select.none"); String LBL_CHK_ONLY_TABLES_WITH_DATA = stringManager .getString("changevalues.chk.lbl.only.tables.with.data"); String LBL_CHK_ENABLE_CHANGE_DATA = stringManager.getString("changevalues.chk.lbl.enable.change.data"); // Entries String ENTRY_NO_CONDITION = stringManager.getString("changevalues.entry.no.condition"); // Tooltips String TOOLTIP_WILDCARD = stringManager.getString("changevalues.tooltip.wildcard"); String TOOLTIP_BTN_ALL = stringManager.getString("changevalues.tooltip.btn.select.all"); String TOOLTIP_BTN_NONE = stringManager.getString("changevalues.tooltip.btn.select.none"); String TOOLTIP_TF_OLD_VALUE = stringManager.getString("changevalues.tooltip.old.value"); // Questions String QUESTION_CANCEL_WORK = stringManager.getString("changevalues.question.cancel.work"); String QUESTION_CANCEL_WORK_TITLE = stringManager.getString("changevalues.question.cancel.work.title"); String QUESTION_START_CHANGING = stringManager.getString("changevalues.question.start.changing"); String QUESTION_START_CHANGING_TITLE = stringManager .getString("changevalues.question.start.changing.title"); // Info String INFO_SEARCHING_FINISHED = stringManager.getString("changevalues.info.searching.finished"); String INFO_CHANGING_FINISHED = stringManager.getString("changevalues.info.changing.finished"); String INFO_CHANGING_DATA_FOR_COLUMNNAME = stringManager .getString("changevalues.info.changing.data.for.columnname"); // Errors String ERROR_COLUMNNAME_MISSING = stringManager.getString("changevalues.error.columnname.missing"); String ERROR_SEARCHING_DATA = stringManager.getString("changevalues.error.searching.data"); String ERROR_CHANGING_DATA = stringManager.getString("changevalues.error.changing.data"); String ERROR_ON_TABLE = stringManager.getString("changevalues.error.on.table"); String ERROR_CREATING_STATEMENT = stringManager.getString("changevalues.error.creating.statement"); String ERROR_CLOSING_STATEMENT = stringManager.getString("changevalues.error.closing.statement"); String ERROR_SELECT_ENTRY = stringManager.getString("changevalues.error.select.entry"); String ERROR_MISSING_OLD_VALUE = stringManager.getString("changevalues.error.missing.old.value"); } // ------------------------------------------------------------------------ // Thread SEARCHING // ------------------------------------------------------------------------ class ThreadSearching extends Thread { private Thread thisThread = null; @Override public void run() { super.run(); thisThread = Thread.currentThread(); startSearching(); controlComponents(STOP_WORKING); threadSearching = null; } private boolean isThreadInvalid() { if (thisThread != threadSearching) { return true; } try { synchronized (this) { while (threadSuspended) { wait(200); } } } catch (InterruptedException e) { } return false; } private void startSearching() { long startTime = System.currentTimeMillis(); ((DefaultTableModel) tblResult.getModel()).setDataVector(new Vector<Vector<Object>>(), vecHeader); String tableNamePattern = WILDCARD; String oldValue = getOldValue(); try { ITableInfo[] tableInfoArray = session.getMetaData().getTables(null, null, tableNamePattern, new String[] { "TABLE" }, null); 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, oldValue); pbMain.setValue(i + 1); pbMain.repaint(); if (isThreadInvalid()) { break; } } long diffTime = System.currentTimeMillis() - startTime; lblFooterTableResult.setText(" " + i18n.INFO_SEARCHING_FINISHED + " " + diffTime + " ms"); } catch (SQLException e) { log.error(e); JOptionPane.showMessageDialog(null, i18n.ERROR_SEARCHING_DATA); } } private void checkColumns(ITableInfo tableInfo, String oldValue) 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 (isStringValueCheck(tableColumnInfo) || isIntegerValueCheck(tableColumnInfo) || isNumericValueCheck(tableColumnInfo) || isDateValueCheck(tableColumnInfo)) { sql = "SELECT COUNT(*) FROM " + tableInfo.getSimpleName() + " " + getWhereCondition(tableColumnInfo.getColumnName(), oldValue); } if (sql != null) { try { resultFound = SmarttoolsHelper.checkColumnData(stmt, sql); if (resultFound > 0 || !chkDisplayOnlyTablesWithData.isSelected()) { addTableEntry(stmt, 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(stmt, tableInfo.getSimpleName(), tableColumnInfo.getColumnName(), SmarttoolsHelper.getDataTypeForDisplay(tableColumnInfo), -1); log.error(text); } } } stmt.close(); } private void addTableEntry(Statement stmt, String tableName, String columnName, String dataType, int recordsFound) throws SQLException { if (!chkDisplayOnlyTablesWithData.isSelected() || recordsFound > 0) { Vector<Object> vecRow = new Vector<Object>(); vecRow.add(Boolean.FALSE); vecRow.add(tableName); vecRow.add(columnName); vecRow.add(dataType); if (recordsFound > -1) { String records = recordsFound + "/" + SmarttoolsHelper.getRowCount(stmt, tableName); vecRow.add(records); } else { vecRow.add(i18n.ERROR_ON_TABLE); } vecRow.add(new Integer(0)); DefaultTableModel tm = (DefaultTableModel) tblResult.getModel(); tm.addRow(vecRow); tm.fireTableDataChanged(); SmarttoolsHelper.setColumnWidth(tblResult, TABLE_DEFAULT_COL_WIDTH); } } private boolean isValidColumnName(String columnName) { String columnNameInput = tfColumnName.getText(); if (columnNameInput.endsWith(WILDCARD)) { String cni = columnNameInput.replaceAll("\\" + WILDCARD, "").toLowerCase(); return columnName.toLowerCase().startsWith(cni); } else { return columnName.equalsIgnoreCase(columnNameInput); } } private boolean isStringValueCheck(TableColumnInfo tableColumnInfo) { int dataType = getUsedDataType(); return (getUsedGroup() == STDataType.GROUP_CHAR && (dataType == tableColumnInfo.getDataType() || (dataType == STDataType.USE_WHOLE_GROUP && SmarttoolsHelper.isDataTypeString(tableColumnInfo.getDataType()))) && isValidColumnName(tableColumnInfo.getColumnName())); } private boolean isIntegerValueCheck(TableColumnInfo tableColumnInfo) { int dataType = getUsedDataType(); return (getUsedGroup() == STDataType.GROUP_INT && (dataType == tableColumnInfo.getDataType() || (dataType == STDataType.USE_WHOLE_GROUP && SmarttoolsHelper.isDataTypeInt(tableColumnInfo.getDataType()))) && isValidColumnName(tableColumnInfo.getColumnName())); } private boolean isNumericValueCheck(TableColumnInfo tableColumnInfo) { int dataType = getUsedDataType(); return (getUsedGroup() == STDataType.GROUP_NUMERIC && (dataType == tableColumnInfo.getDataType() || (dataType == STDataType.USE_WHOLE_GROUP && SmarttoolsHelper.isDataTypeNumeric(tableColumnInfo.getDataType()))) && isValidColumnName(tableColumnInfo.getColumnName())); } private boolean isDateValueCheck(TableColumnInfo tableColumnInfo) { int dataType = getUsedDataType(); return (getUsedGroup() == STDataType.GROUP_DATE && (dataType == tableColumnInfo.getDataType() || (dataType == STDataType.USE_WHOLE_GROUP && SmarttoolsHelper.isDataTypeDate(tableColumnInfo.getDataType()))) && isValidColumnName(tableColumnInfo.getColumnName())); } } // ThreadSearching // ------------------------------------------------------------------------ // Thread SEARCHING // ------------------------------------------------------------------------ class ThreadChanging extends Thread { private Thread thisThread = null; @Override public void run() { super.run(); thisThread = Thread.currentThread(); startChanging(); controlComponents(STOP_WORKING); threadChanging = null; } private boolean isThreadInvalid() { if (thisThread != threadChanging) { return true; } try { synchronized (this) { while (threadSuspended) { wait(200); } } } catch (InterruptedException e) { } return false; } private void startChanging() { long startTime = System.currentTimeMillis(); String oldValue = getOldValue(); String newValue = getNewValue(); pbMain.setValue(0); pbMain.setMaximum(0); // init progressbar for (int r = 0; r < tblResult.getRowCount(); r++) { if (((Boolean) tblResult.getValueAt(r, TABLE_COL_MARKER)).booleanValue()) { pbMain.setMaximum(pbMain.getMaximum() + 1); } } Statement stmt = null; boolean error = false; try { stmt = session.getSQLConnection().createStatement(); } catch (SQLException e) { JOptionPane.showMessageDialog(null, i18n.ERROR_CREATING_STATEMENT); log.error(e); } int i = 0; for (int row = 0; row < tblResult.getRowCount(); row++) { if (((Boolean) tblResult.getValueAt(row, TABLE_COL_MARKER)).booleanValue()) { String tableName = (String) tblResult.getValueAt(row, TABLE_COL_TABLE); String columnName = (String) tblResult.getValueAt(row, TABLE_COL_COLUMNNAME); i++; pbMain.setString(tableName + "." + columnName + " " + i + "/" + pbMain.getMaximum()); try { String sql = "UPDATE " + tableName + " SET " + columnName + " = " + newValue + " " + getWhereCondition(columnName, oldValue); int rowsAffected = stmt.executeUpdate(sql); int rowCount = SmarttoolsHelper.getRowCount(stmt, tableName); tblResult.setValueAt(new Integer(1), row, TABLE_COL_STATUS); tblResult.setValueAt(rowsAffected + "/" + rowCount, row, TABLE_COL_RECORDS); } catch (SQLException e) { error = true; tblResult.setValueAt(new Integer(2), row, TABLE_COL_STATUS); log.error(e); } pbMain.setValue(i); pbMain.repaint(); if (isThreadInvalid()) { break; } } } try { stmt.close(); } catch (SQLException e) { JOptionPane.showMessageDialog(null, i18n.ERROR_CLOSING_STATEMENT); log.error(e); } long diffTime = System.currentTimeMillis() - startTime; lblFooterTableResult.setText(" " + i18n.INFO_CHANGING_FINISHED + " " + diffTime + " ms"); if (error) { JOptionPane.showMessageDialog(null, i18n.ERROR_CHANGING_DATA); } } } // ------------------------------------------------------------------------ // Table classes // ------------------------------------------------------------------------ class SmarttoolChangeValuesTableCellRenderer extends JLabel implements TableCellRenderer { private static final long serialVersionUID = -7923233754901241279L; private ImageIcon iconMarkedSelected = SmarttoolsHelper.loadIcon("gridMarkedSelected16x16.png"); private ImageIcon iconDemarkedSelected = SmarttoolsHelper.loadIcon("gridDemarkedSelected16x16.png"); private ImageIcon iconStatusInit = SmarttoolsHelper.loadIcon("statusInit16x16.png"); private ImageIcon iconStatusOk = SmarttoolsHelper.loadIcon("statusOk16x16.png"); private ImageIcon iconStatusError = SmarttoolsHelper.loadIcon("statusError16x16.png"); public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { JLabel lbl = new JLabel(); lbl.setOpaque(true); if (column == TABLE_COL_MARKER && value instanceof Boolean) { lbl.setHorizontalAlignment(SwingConstants.CENTER); if (((Boolean) value).booleanValue()) { if (isSelected) { lbl.setIcon(iconMarkedSelected); } else { lbl.setIcon(iconMarked); } } else { if (isSelected) { lbl.setIcon(iconDemarkedSelected); } else { lbl.setIcon(iconDemarked); } } } else if (column == TABLE_COL_STATUS && value instanceof Integer) { if (((Boolean) tblResult.getValueAt(row, TABLE_COL_MARKER)).booleanValue()) { int status = ((Integer) value).intValue(); lbl.setHorizontalAlignment(SwingConstants.CENTER); if (status == 0) { lbl.setIcon(iconStatusInit); } else if (status == 1) { lbl.setIcon(iconStatusOk); } else if (status == 2) { lbl.setIcon(iconStatusError); } } } else if (value instanceof String) { lbl.setText((String) value); } if (column == TABLE_COL_RECORDS) { lbl.setHorizontalAlignment(SwingConstants.CENTER); } if (isSelected) { lbl.setBackground(new Color(0, 0, 100)); lbl.setForeground(Color.LIGHT_GRAY); } return lbl; } } class SmarttoolChangeValuesTableModel extends DefaultTableModel { private static final long serialVersionUID = 1355771906563987627L; @Override public boolean isCellEditable(int row, int column) { return false; } } }