SiLeBAT/FSK-Lab

View on GitHub
org.hsh.bfr.db/src/org/hsh/bfr/db/gui/Login.java

Summary

Maintainability
F
1 wk
Test Coverage
/*******************************************************************************
 * Copyright (c) 2015 Federal Institute for Risk Assessment (BfR), Germany
 *
 * 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 3 of the License, or
 * (at your option) 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, see <http://www.gnu.org/licenses/>.
 *
 * Contributors:
 *     Department Biological Safety - BfR
 *******************************************************************************/
package org.hsh.bfr.db.gui;

import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.factories.CC;
import com.jgoodies.forms.layout.FormLayout;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.hsh.bfr.db.*;
import org.hsh.bfr.db.gui.dbtable.MyDBTable;
import org.hsh.bfr.db.gui.dbtree.MyDBTree;
import org.knime.core.node.NodeLogger;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.sql.ResultSet;
import java.util.ResourceBundle;

/**
 * @author Armin Weiser
 */
public class Login extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private boolean firstRun;

    public Login(final boolean firstRun) {
        this.firstRun = firstRun;
        initComponents();
        //DBKernel.prefs = Preferences.userNodeForPackage(this.getClass());
        String lastUser = DBKernel.prefs.get("LAST_USER_LOGIN", "");
        String lastDBPath = DBKernel.prefs.get("LAST_DB_PATH", DBKernel.HSHDB_PATH);
        textField1.setText(lastUser);
        textField2.setText(lastDBPath);
        /*
         * if (DBKernel.debug &&
         * lastUser.equals(DBKernel.getTempSA(lastDBPath))) {
         * passwordField1.setText(DBKernel.getTempSAPass(lastDBPath));
         * //this.setTitle(textField1.getFont().getName() + " - " +
         * textField1.getFont().getSize()); }
         */
    }

    public Login(String dbPath, String username, String password, boolean readOnly, Boolean autoUpdate) {
        this.firstRun = false;
        initComponents();
        textField1.setText(username);
        passwordField1.setText(password);
        textField2.setText(dbPath);
        checkBox1.setSelected(false);
        checkBox2.setSelected(readOnly);
        startTheDB(autoUpdate, false);
    }

    private void startTheDB(Boolean autoUpdate, boolean openTheGui) {
        MainFrame mf = null;
        DBKernel.myDBi = MyDBI.loadDB(textField2.getText() + System.getProperty("file.separator") + DBKernel.dbKennung + ".xml");
        if (DBKernel.myDBi != null) {
            DBKernel.HSHDB_PATH = textField2.getText();
            mf = loadDBNew(DBKernel.myDBi, textField2.getText(), autoUpdate, openTheGui, autoUpdate == null);
        } else {
            DBKernel.HSHDB_PATH = textField2.getText();
            if (DBKernel.isHsqlServer(DBKernel.HSHDB_PATH)) {
                DBKernel.isServerConnection = true;
            } else {
                DBKernel.isServerConnection = false;
                if (!DBKernel.HSHDB_PATH.endsWith(System.getProperty("file.separator"))) {
                    DBKernel.HSHDB_PATH += System.getProperty("file.separator");
                }
            }
            mf = loadDB(autoUpdate, openTheGui, autoUpdate == null);
        }
        if (mf != null) {
            // check if the cache is ok
            try {
                ResultSet rs = DBKernel.getResultSet("SELECT " + DBKernel.delimitL("Druck") + " FROM " + DBKernel.delimitL("CACHE_TS"), true);
                if (rs == null || !rs.first()) {
                    DBKernel.sendRequest("DROP TABLE " + DBKernel.delimitL("CACHE_TS") + " IF EXISTS", true, true);
                }
                rs = DBKernel.getResultSet("SELECT " + DBKernel.delimitL("Druck") + " FROM " + DBKernel.delimitL("CACHE_selectEstModel1"), true);
                if (rs == null || !rs.first()) {
                    DBKernel.sendRequest("DROP TABLE " + DBKernel.delimitL("CACHE_selectEstModel1") + " IF EXISTS", true, true);
                }
            }
            catch (Exception e) {}
            /*
            //DBKernel.saveUP2PrefsTEMP(DBKernel.HSHDB_PATH);
            
              DBKernel.sendRequest("DELETE FROM " +
              DBKernel.delimitL("Infotabelle") + " WHERE " +
              DBKernel.delimitL("Parameter") + " = 'DBuuid'", false);
              //DBKernel.sendRequest("DELETE FROM " + DBKernel.delimitL("DateiSpeicher"), false);
              DBKernel.sendRequest("DELETE FROM " +
              DBKernel.delimitL("ChangeLog"), false);
              DBKernel.sendRequest("DROP TABLE " +
              DBKernel.delimitL("CACHE_TS") + " IF EXISTS", false, true);
              DBKernel.sendRequest("DROP TABLE " +
              DBKernel.delimitL("CACHE_selectEstModel") + " IF EXISTS", false,
              true); DBKernel.sendRequest("DROP TABLE " +
              DBKernel.delimitL("CACHE_selectEstModel1") + " IF EXISTS", false,
              true); DBKernel.sendRequest("DROP TABLE " +
              DBKernel.delimitL("CACHE_selectEstModel2") + " IF EXISTS", false,
              true); DBKernel.sendRequest("CHECKPOINT DEFRAG", false);
              
              System.err.println("DB cleaned up!");
              */
              /*
              DBKernel.sendRequest("DELETE FROM " + DBKernel.delimitL("Sekundaermodelle_Primaermodelle") + " WHERE " + DBKernel.delimitL("GlobalModel") + "=3", false);
              DBKernel.sendRequest("DELETE FROM " + DBKernel.delimitL("GlobalModels") + " WHERE " + DBKernel.delimitL("ID") + "=3", false);
              */
            /*
             * try { ResultSet rs = DBKernel.getResultSet("SELECT " +
             * DBKernel.delimitL("GeschaetzteModelle") + "." +
             * DBKernel.delimitL("ID") + "," +
             * DBKernel.delimitL("Versuchsbedingungen") + "." +
             * DBKernel.delimitL("Referenz") + " FROM " +
             * DBKernel.delimitL("GeschaetzteModelle") + " LEFT JOIN " +
             * DBKernel.delimitL("Versuchsbedingungen") + " ON " +
             * DBKernel.delimitL("GeschaetzteModelle") + "." +
             * DBKernel.delimitL("Versuchsbedingung") + "=" +
             * DBKernel.delimitL("Versuchsbedingungen") + "." +
             * DBKernel.delimitL("ID") + " WHERE " +
             * DBKernel.delimitL("Versuchsbedingungen") + "." +
             * DBKernel.delimitL("Referenz") + " IS NOT NULL", false); if (rs !=
             * null && rs.first()) { do { DBKernel.sendRequest("INSERT INTO " +
             * DBKernel.delimitL("GeschaetztesModell_Referenz") + " (" +
             * DBKernel.delimitL("GeschaetztesModell") + "," +
             * DBKernel.delimitL("Literatur") + ") VALUES (" + rs.getInt("ID") +
             * "," + rs.getInt("Referenz") + ")", false); } while (rs.next()); }
             * } catch (Exception e1) {e1.printStackTrace();}
             */
        }

        //UpdateChecker.check4Updates_148_149(null);
        /*
         * 
         * DBKernel.sendRequest("DELETE FROM " +
         * DBKernel.delimitL("ModellkatalogParameter") + " WHERE " +
         * DBKernel.delimitL("Modell") + " >= 47 AND " +
         * DBKernel.delimitL("Modell") + " <= 49", false);
         * DBKernel.sendRequest("DELETE FROM " +
         * DBKernel.delimitL("Modell_Referenz") + " WHERE " +
         * DBKernel.delimitL("Modell") + " >= 47 AND " +
         * DBKernel.delimitL("Modell") + " <= 49", false);
         * DBKernel.sendRequest("DELETE FROM " +
         * DBKernel.delimitL("Modellkatalog") + " WHERE " +
         * DBKernel.delimitL("ID") + " >= 47 AND " + DBKernel.delimitL("ID") +
         * " <= 49", false); DBKernel.sendRequest("DELETE FROM " +
         * DBKernel.delimitL("Literatur") + " WHERE " + DBKernel.delimitL("ID")
         * + " <= 239", false);
         */
        //MyList myList = loadDB(); UpdateChecker.temporarily(myList);
        /*
         * DBKernel.sendRequest("CREATE USER " +
         * DBKernel.delimitL(DBKernel.getTempSA()) + " PASSWORD '" +
         * DBKernel.getTempSAPass() + "' ADMIN", false);
         * DBKernel.sendRequest("DROP USER " + DBKernel.delimitL("SA"), false);
         */
        /*
         * DBKernel.mergeIDs("Station", 786, 769); DBKernel.mergeIDs("Station",
         * 770, 763); DBKernel.mergeIDs("Station", 766, 11);
         * DBKernel.mergeIDs("Station", 473, 484); DBKernel.mergeIDs("Station",
         * 783, 28); DBKernel.mergeIDs("Station", 784, 30);
         */
    }

    private void okButtonActionPerformed(final ActionEvent e) {
        try {
            this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
            startTheDB(null, true);
        } finally {
            this.setCursor(Cursor.getDefaultCursor());
        }
    }

    private void cancelButtonActionPerformed(final ActionEvent e) {
        this.dispose();
    }

    private void changePasswort(final MyDBTable myDB, String username, final String newPassword) throws Exception {
        boolean isAdmin = DBKernel.isAdmin();
        if (isAdmin) {
            DBKernel.sendRequest("SET PASSWORD '" + newPassword + "';", false); // MD5.encode(newPassword, "UTF-8")
        } else {
            DBKernel.closeDBConnections(false);
            DBKernel.getDefaultAdminConn();
            DBKernel.sendRequest("ALTER USER " + DBKernel.delimitL(username) + " SET PASSWORD '" + newPassword + "';", false); // MD5.encode(newPassword, "UTF-8")
            DBKernel.closeDBConnections(false);
            myDB.initConn(username, newPassword); // MD5.encode(newPassword, "UTF-8")
        }
    }

    private MainFrame initGui(MyDBTable myDB) {
        DBKernel.myDBi = new MyDBTablesNew();
        MyDBTree myDBTree = new MyDBTree();
        MyList myList = new MyList(myDB, myDBTree);
        myList.addAllTables();
        MainFrame mf = new MainFrame(myList);
        mf.setTopTable(myDB);
        try {
            myDB.initConn(DBKernel.getDBConnection());
        } catch (Exception e) {
            e.printStackTrace();
        }
        DBKernel.mainFrame = mf;
        return mf;
    }

    private MainFrame loadDB(Boolean autoUpdate, boolean openTheGui, boolean beInteractive) {
        MainFrame mf = null;
        MyDBTable myDB = null;
        boolean doUpdates = false;
        try {
            // Datenbank schon vorhanden?
            if (DBKernel.softwareVersion.equals("1.8.6")) DBKernel.dbKennung = "pmm";
            boolean noDBThere = !DBKernel.DBFilesDa(DBKernel.HSHDB_PATH, DBKernel.dbKennung);
            if (noDBThere && DBKernel.softwareVersion.equals("1.8.6")) {
                noDBThere = !DBKernel.DBFilesDa(DBKernel.HSHDB_PATH, "DB");
                if (!noDBThere) DBKernel.dbKennung = "DB";
            }

            myDB = new MyDBTable();
            // Login fehlgeschlagen
            String username = textField1.getText();
            String password = new String(passwordField1.getPassword());
            DBKernel.prefs.putBoolean("DB_READONLY", checkBox2.isSelected());
            DBKernel.prefs.prefsFlush();
            //MD5.encode(password, "UTF-8");
            if (!myDB.initConn(username, password)) {
                if (DBKernel.passFalse) {
                    passwordField1.setBackground(Color.RED);
                    passwordField2.setBackground(Color.WHITE);
                    passwordField3.setBackground(Color.WHITE);
                    passwordField1.requestFocus();
                }
                return mf;
            }

            // Login succeeded
            DBKernel.prefs.put("LAST_USER_LOGIN", username);
            DBKernel.prefs.put("LAST_DB_PATH", DBKernel.HSHDB_PATH);
            DBKernel.prefs.prefsFlush();
            MyLogger.handleMessage("HSHDB_PATH: " + DBKernel.HSHDB_PATH);
            // Datenbank erstellen
            if (noDBThere) {
            } else if ((!DBKernel.isServerConnection) && (beInteractive || autoUpdate)) {// UPDATE? // true || 
                int dbAlt = isDBVeraltet(beInteractive, null);
                if (dbAlt == JOptionPane.YES_OPTION) {
                    doUpdates = true;
                } else if (dbAlt == JOptionPane.CANCEL_OPTION) {
                    DBKernel.closeDBConnections(false);
                    return mf;
                }
            } else {
                String dbVersion = DBKernel.getDBVersionFromDB();
                String softwareVersion = DBKernel.softwareVersion;
                VersionComprator cmp = new VersionComprator();
                int result = cmp.compare(dbVersion, softwareVersion);
                if (result != 0) {
                    String msg = "Login rejected!\n";
                    if (result < 0) msg += "Softwareversion (" + softwareVersion + ") neuer als DB-Version (" + dbVersion + ")???";
                    else msg += "Bitte Software aktualisieren!!!";
                    InfoBox ib = new InfoBox(this, msg, true, new Dimension(600, 120), null, true);
                    ib.setVisible(true);
                    return mf;
                }
            }

            // Passwort ändern
            if (checkBox1.isSelected()) {
                if (passwordField2.getPassword().length >= 0) {
                    String newPassword = new String(passwordField2.getPassword());
                    if (newPassword.length() == 0) { // Passwörter dürfen nicht leer sein!
                        passwordField1.setBackground(Color.WHITE);
                        passwordField2.setBackground(Color.RED);
                        passwordField3.setBackground(Color.RED);
                        passwordField2.requestFocus();
                        return mf;
                    }
                    if (newPassword.equals(new String(passwordField3.getPassword()))) {
                        changePasswort(myDB, username, newPassword);
                    } else {
                        passwordField1.setBackground(Color.WHITE);
                        passwordField2.setBackground(Color.WHITE);
                        passwordField3.setBackground(Color.RED);
                        passwordField3.requestFocus();
                        return mf;
                    }
                } else {
                    passwordField1.setBackground(Color.WHITE);
                    passwordField2.setBackground(Color.RED);
                    passwordField3.setBackground(Color.WHITE);
                    passwordField2.requestFocus();
                    return mf;
                }
            }

            // Login succeeded: DB erstellen/starten, GUI aufbauen
            // Datenbank füllen            
            if (noDBThere) {
                int answer = JOptionPane.NO_OPTION; // YES_OPTION
                if (beInteractive) {
                    answer = JOptionPane.showConfirmDialog(
                            this,
                            "There is no database.\nYou have two opportunities:\n- creating an empty one <Yes>\n- creating the default one with some prefilled sample data <No>\nDo you wish to create the empty one?",
                            "No database...", JOptionPane.YES_NO_OPTION);
                }
                if (answer == JOptionPane.YES_OPTION) {
                    mf = initGui(myDB);
                    DBKernel.myDBi.bootstrapDB();
                } else {
                    File temp = DBKernel.getCopyOfInternalDB();
                    if (DBKernel.myDBi != null && DBKernel.myDBi.getConn() != null) {
                        if (BackupMyDBI.doRestore(myDB, temp, true, true)) {
                            DBKernel.myDBi.addUserInCaseNotThere(username, password);
                        }
                        else {  // Passwort hat sich verändert innerhalb der 2 beteiligten Datenbanken...
                            passwordField1.setBackground(Color.RED);
                            passwordField2.setBackground(Color.WHITE);
                            passwordField3.setBackground(Color.WHITE);
                            passwordField1.requestFocus();
                            return mf;
                        }
                    } else {
                        if (!Backup.doRestore(myDB, temp, true)) { // Passwort hat sich verändert innerhalb der 2 beteiligten Datenbanken...
                            passwordField1.setBackground(Color.RED);
                            passwordField2.setBackground(Color.WHITE);
                            passwordField3.setBackground(Color.WHITE);
                            passwordField1.requestFocus();
                            return mf;
                        }
                    }                    

                    IWorkbenchWindow eclipseWindow = null;
                    
                    try{
                        eclipseWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
                    }
                    catch (Exception e) {}
                    
                    if (eclipseWindow != null && DBKernel.isKrise) {                        
                        MessageDialog.openInformation(eclipseWindow.getShell(), "Internal database created", "Internal database created in folder '" + DBKernel.HSHDB_PATH + "'");
                    } else {
                        NodeLogger logger = NodeLogger.getLogger("Login");
                        logger.info("Internal database created in folder '" + DBKernel.HSHDB_PATH + "'");
                    }
                                        
                    mf = initGui(myDB);
                }
            } else {
                mf = initGui(myDB);

                if (doUpdates) {
                    if (doTheUpdates(DBKernel.HSHDB_PATH)) return loadDB(autoUpdate, openTheGui, beInteractive);
                    else return mf;
                }
            }

            startMainFrame(mf, myDB, openTheGui);
        } catch (Exception e) {
            MyLogger.handleException(e);
        }
        return mf;
    }

    private boolean doTheUpdates(String dbPath) {
        boolean dl = DBKernel.dontLog;
        DBKernel.dontLog = true;
        try {
            boolean isAdmin = DBKernel.isAdmin();
            if (!isAdmin) {
                DBKernel.closeDBConnections(false);
                DBKernel.getDefaultAdminConn();
            }
            if (DBKernel.getDBVersionFromDB().equals("1.7.0")) {
                UpdateChecker.check4Updates_170_171();
                DBKernel.setDBVersion("1.7.1");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.7.1")) {
                UpdateChecker.check4Updates_171_172();
                DBKernel.setDBVersion("1.7.2");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.7.2")) {
                UpdateChecker.check4Updates_172_173();
                DBKernel.setDBVersion("1.7.3");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.7.3")) {
                UpdateChecker.check4Updates_173_174();
                DBKernel.setDBVersion("1.7.4");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.7.4")) {
                UpdateChecker.check4Updates_174_175();
                DBKernel.setDBVersion("1.7.5");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.7.5")) {
                UpdateChecker.check4Updates_175_176();
                DBKernel.setDBVersion("1.7.6");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.7.6")) {
                UpdateChecker.check4Updates_176_177();
                DBKernel.setDBVersion("1.7.7");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.7.7")) {
                UpdateChecker.check4Updates_177_178();
                DBKernel.setDBVersion("1.7.8");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.7.8")) {
                UpdateChecker.check4Updates_178_179();
                DBKernel.setDBVersion("1.7.9");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.7.9")) {
                UpdateChecker.check4Updates_179_180();
                DBKernel.setDBVersion("1.8.0");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.8.0")) {
                UpdateChecker.check4Updates_180_181();
                DBKernel.setDBVersion("1.8.1");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.8.1")) {
                UpdateChecker.check4Updates_181_182();
                DBKernel.setDBVersion("1.8.2");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.8.2")) {
                UpdateChecker.check4Updates_182_1820();
                DBKernel.setDBVersion("1.8.2.0");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.8.2.0")) {
                UpdateChecker.check4Updates_1820_18200();
                DBKernel.setDBVersion("1.8.2.0.0");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.8.2.0.0")) {
                UpdateChecker.check4Updates_182_183();
                DBKernel.setDBVersion("1.8.3");
            }
            if (DBKernel.getDBVersionFromDB().equals("1.8.3")) {
                DBKernel.setDBVersion("1.8.5");                
            }
            if (DBKernel.getDBVersionFromDB().equals("1.8.5")) {
                // rename
                DBKernel.closeDBConnections(true);
                DBKernel.copyFiles2NewKennung(dbPath, "DB", "pmm", false);
                DBKernel.dbKennung = "pmm";
                DBKernel.setDBVersion("1.8.6");
            }

            DBKernel.closeDBConnections(false);
        } catch (Exception e) {
            e.printStackTrace();
            DBKernel.dontLog = dl;
            return false;
        }
        DBKernel.dontLog = dl;
        return true;
    }

    private void startMainFrame(MainFrame mf, MyDBTable myDB, boolean openTheGui) {
        if (mf != null) {
            if (!mf.getMyList().setSelection(DBKernel.prefs.get("LAST_SELECTED_TABLE", null))) {
                mf.getMyList().setSelection(null);
            }

            if (this.isVisible()) this.dispose();//this.setVisible(false);
            mf.pack();
            boolean full = Boolean.parseBoolean(DBKernel.prefs.get("LAST_MainFrame_FULL", "FALSE"));

            // Determine the new location of the window
            int defaultW = 1000;
            int defaultH = 600;
            Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
            int defaultX = (dim.width-defaultW)/2;
            int defaultY = (dim.height-defaultH)/2;
            
            int w = Integer.parseInt(DBKernel.prefs.get("LAST_MainFrame_WIDTH", "" + defaultW));
            int h = Integer.parseInt(DBKernel.prefs.get("LAST_MainFrame_HEIGHT", "" + defaultH));
            int x = Integer.parseInt(DBKernel.prefs.get("LAST_MainFrame_X", "" + defaultX));
            int y = Integer.parseInt(DBKernel.prefs.get("LAST_MainFrame_Y", "" + defaultY));
            mf.setPreferredSize(new Dimension(w, h));
            mf.setBounds(x, y, w, h);
            if (full) mf.setExtendedState(JFrame.MAXIMIZED_BOTH);
            else mf.setExtendedState(JFrame.NORMAL);
            if (openTheGui) {
                mf.setVisible(true);
                mf.toFront();
                myDB.grabFocus();//myDB.selectCell(0, 0);
                //getAllMetaData(myList);            
            }
        }
    }

    void dropDatabase() {
        DBKernel.closeDBConnections(false);
        File f = new File(DBKernel.HSHDB_PATH);
        File[] files = f.listFiles();
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                if (files[i].isFile() && files[i].getName().startsWith(DBKernel.dbKennung + ".")) {
                    files[i].delete();
                }
            }
            System.gc();
        }
    }

    private void thisWindowClosing(final WindowEvent e) {
        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
            this.setVisible(false);
            if (firstRun) {
                DBKernel.closeDBConnections(false);
                this.dispose();
                System.exit(0);
            }
        }
    }

    private void textField1KeyReleased(final KeyEvent e) {
        this_keyReleased(e);
    }

    private void passwordField1KeyReleased(final KeyEvent e) {
        this_keyReleased(e);
    }

    private void this_keyReleased(final KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            okButtonActionPerformed(null);
        }
    }

    private void checkBox1ActionPerformed(final ActionEvent e) {
        passwordField2.setEnabled(checkBox1.isSelected());
        passwordField3.setEnabled(checkBox1.isSelected());
    }

    private void passwordField2KeyReleased(final KeyEvent e) {
        this_keyReleased(e);
    }

    private void passwordField3KeyReleased(final KeyEvent e) {
        this_keyReleased(e);
    }

    private void checkBox1KeyReleased(final KeyEvent e) {
        this_keyReleased(e);
    }

    private void thisWindowOpened(final WindowEvent e) {
        passwordField1.requestFocus();
    }

    private void button1ActionPerformed(final ActionEvent e) {
        JFileChooser chooser = new JFileChooser();
        chooser.setCurrentDirectory(new java.io.File(textField2.getText()));
        chooser.setDialogTitle("Wähle Ordner der Datenbank");
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        chooser.setAcceptAllFileFilterUsed(false);
        if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            textField2.setText(chooser.getSelectedFile().getAbsolutePath());
        } else {
            MyLogger.handleMessage("No Selection ");
        }
    }

    private void textField2KeyReleased(final KeyEvent e) {
        this_keyReleased(e);
    }

    private MainFrame loadDBNew(MyDBI myDBi, String dbPath, Boolean autoUpdate, boolean openTheGui, boolean beInteractive) {
        MainFrame mf = null;
        MyDBTable myDB = null;
        boolean doUpdates = false;
        try {
            // Datenbank schon vorhanden?
            if (myDBi.getSoftwareVersion().equals("1.8.6")) DBKernel.dbKennung = "pmm";
            boolean noDBThere = !DBKernel.DBFilesDa(dbPath, DBKernel.dbKennung);
            if (noDBThere && myDBi.getSoftwareVersion().equals("1.8.6")) {
                noDBThere = !DBKernel.DBFilesDa(dbPath, "DB");
                if (!noDBThere) DBKernel.dbKennung = "DB";
            }

            myDB = new MyDBTable();
            // Login fehlgeschlagen
            String username = textField1.getText();
            String password = new String(passwordField1.getPassword());
            DBKernel.prefs.putBoolean("DB_READONLY", checkBox2.isSelected());
            DBKernel.prefs.prefsFlush();
            if (!myDBi.establishDBConnection(username, password, dbPath)) {
                if (myDBi.getPassFalse()) {
                    passwordField1.setBackground(Color.RED);
                    passwordField2.setBackground(Color.WHITE);
                    passwordField3.setBackground(Color.WHITE);
                    passwordField1.requestFocus();
                }
                return mf;
            }
            myDB.initConn(myDBi.getConn());

            DBKernel.prefs.put("LAST_USER_LOGIN", username);
            DBKernel.prefs.put("LAST_DB_PATH", dbPath);
            DBKernel.prefs.prefsFlush();
            MyLogger.handleMessage("DB_PATH: " + dbPath);
            // Datenbank erstellen
            if (noDBThere) {
            } else if (!myDBi.isServerConnection() && (beInteractive || autoUpdate)) {// UPDATE?
                int dbAlt = isDBVeraltet(beInteractive, myDBi);
                if (dbAlt == JOptionPane.YES_OPTION) {
                    doUpdates = true;
                } else if (dbAlt == JOptionPane.CANCEL_OPTION) {
                    myDBi.closeDBConnections(false);
                    return mf;
                }
            } else {
                String dbVersion = myDBi.getDBVersionFromDB();
                String softwareVersion = myDBi.getSoftwareVersion();
                VersionComprator cmp = new VersionComprator();
                int result = cmp.compare(dbVersion, softwareVersion);
                if (result != 0) {
                    String msg = "Login rejected!\n";
                    if (result < 0) msg += "Softwareversion (" + softwareVersion + ") neuer als DB-Version (" + dbVersion + ")???";
                    else msg += "Bitte Software aktualisieren!!!";
                    InfoBox ib = new InfoBox(this, msg, true, new Dimension(600, 120), null, true);
                    ib.setVisible(true);
                    return mf;
                }
            }

            // Passwort ändern
            if (checkBox1.isSelected()) {
                if (passwordField2.getPassword().length >= 0) {
                    String newPassword = new String(passwordField2.getPassword());
                    if (newPassword.length() == 0) { // Passwörter dürfen nicht leer sein!
                        passwordField1.setBackground(Color.WHITE);
                        passwordField2.setBackground(Color.RED);
                        passwordField3.setBackground(Color.RED);
                        passwordField2.requestFocus();
                        return mf;
                    }
                    if (newPassword.equals(new String(passwordField3.getPassword()))) {
                        myDBi.changePasswort(newPassword);
                        myDB.initConn(myDBi.getConn());
                    } else {
                        passwordField1.setBackground(Color.WHITE);
                        passwordField2.setBackground(Color.WHITE);
                        passwordField3.setBackground(Color.RED);
                        passwordField3.requestFocus();
                        return mf;
                    }
                } else {
                    passwordField1.setBackground(Color.WHITE);
                    passwordField2.setBackground(Color.RED);
                    passwordField3.setBackground(Color.WHITE);
                    passwordField2.requestFocus();
                    return mf;
                }
            }

            // Login succeeded: DB erstellen/starten, GUI aufbauen
            // Datenbank füllen            
            mf = initGuiNew(myDB);
            if (!myDBi.isServerConnection() && noDBThere) {
                myDBi.bootstrapDB();
            } else {
                if (doUpdates) {
                    if (doTheUpdates(dbPath)) return loadDBNew(myDBi, dbPath, autoUpdate, openTheGui, beInteractive);
                    else return mf;
                }
            }

            startMainFrame(mf, myDB, openTheGui);
        } catch (Exception e) {
            MyLogger.handleException(e);
        }
        return mf;
    }

    private String getSoftwareVersion(MyDBI myDBi) {
        return myDBi == null ? DBKernel.softwareVersion : myDBi.getSoftwareVersion();
    }
    private int isDBVeraltet(boolean beInteractive, MyDBI myDBi) {
        int result = JOptionPane.NO_OPTION;

        String dbVersion = (myDBi == null ? DBKernel.getDBVersionFromDB() : myDBi.getDBVersionFromDB());
        MyLogger.handleMessage("DBVersion: " + dbVersion);
        if (dbVersion == null || !dbVersion.equals(getSoftwareVersion(myDBi))) {
            if (beInteractive) result = askVeraltetDBBackup(myDBi);
            else result = JOptionPane.YES_OPTION;
        }
        return result;
    }

    private int askVeraltetDBBackup(MyDBI myDBi) {
        int result = JOptionPane.YES_OPTION;
        int retVal = JOptionPane.showConfirmDialog(this, "Die Datenbank ist veraltet und muss ersetzt werden.\nSoll zuvor ein Backup der alten Datenbank erstellt werden?",
                "Backup erstellen?", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
        if (retVal == JOptionPane.YES_OPTION) {
            if (myDBi != null && myDBi.getConn() != null) {
                if (!BackupMyDBI.dbBackup(this)) {
                    result = JOptionPane.CANCEL_OPTION;
                }
            } else {
                if (!Backup.dbBackup(this)) {
                    result = JOptionPane.CANCEL_OPTION;
                }
            }
        } else if (retVal == JOptionPane.NO_OPTION) {
            retVal = JOptionPane.showConfirmDialog(this, "Die Datenbank wirklich ohne Backup überschreiben?? Sicher?", "Sicher?", JOptionPane.YES_NO_OPTION,
                    JOptionPane.QUESTION_MESSAGE);
            if (retVal == JOptionPane.YES_OPTION) {
                ;
            } else {
                return askVeraltetDBBackup(myDBi);
            }
        } else {
            result = JOptionPane.CANCEL_OPTION;
        }
        return result;
    }

    private MainFrame initGuiNew(MyDBTable myDB) {
        MyDBTree myDBTree = new MyDBTree();
        MyList myList = new MyList(myDB, myDBTree);
        myList.addAllTables();
        MainFrame mf = new MainFrame(myList);
        mf.setTopTable(myDB);
        DBKernel.mainFrame = mf;
        return mf;
    }

    private void initComponents() {
        // JFormDesigner - Component initialization - DO NOT MODIFY  //GEN-BEGIN:initComponents
        ResourceBundle bundle = ResourceBundle.getBundle("org.hsh.bfr.db.gui.PanelProps");
        dialogPane = new JPanel();
        contentPanel = new JPanel();
        label1 = new JLabel();
        textField1 = new JTextField();
        label2 = new JLabel();
        passwordField1 = new JPasswordField();
        button1 = new JButton();
        textField2 = new JTextField();
        checkBox2 = new JCheckBox();
        checkBox1 = new JCheckBox();
        label3 = new JLabel();
        passwordField2 = new JPasswordField();
        label4 = new JLabel();
        passwordField3 = new JPasswordField();
        buttonBar = new JPanel();
        okButton = new JButton();
        cancelButton = new JButton();

        //======== this ========
        setTitle(bundle.getString("Login.this.title"));
        setAlwaysOnTop(true);
        setIconImage(new ImageIcon(getClass().getResource("/org/hsh/bfr/db/gui/res/Database.gif")).getImage());
        setFont(new Font("Tahoma", Font.PLAIN, 13));
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                thisWindowClosing(e);
            }

            @Override
            public void windowOpened(WindowEvent e) {
                thisWindowOpened(e);
            }
        });
        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());

        //======== dialogPane ========
        {
            dialogPane.setBorder(Borders.DIALOG);
            dialogPane.setFont(new Font("Tahoma", Font.PLAIN, 13));
            dialogPane.setLayout(new BorderLayout());

            //======== contentPanel ========
            {
                contentPanel.setFont(new Font("Tahoma", Font.PLAIN, 13));
                contentPanel.setLayout(new FormLayout("default, 10dlu, default:grow", "5*(default, $lgap), default"));

                //---- label1 ----
                label1.setText(bundle.getString("Login.label1.text"));
                label1.setFont(new Font("Tahoma", Font.PLAIN, 13));
                contentPanel.add(label1, CC.xy(1, 1));

                //---- textField1 ----
                textField1.setFont(new Font("Tahoma", Font.PLAIN, 13));
                textField1.addKeyListener(new KeyAdapter() {
                    @Override
                    public void keyReleased(KeyEvent e) {
                        textField1KeyReleased(e);
                    }
                });
                contentPanel.add(textField1, CC.xy(3, 1));

                //---- label2 ----
                label2.setText(bundle.getString("Login.label2.text"));
                label2.setFont(new Font("Tahoma", Font.PLAIN, 13));
                contentPanel.add(label2, CC.xy(1, 3));

                //---- passwordField1 ----
                passwordField1.setFont(new Font("Tahoma", Font.PLAIN, 13));
                passwordField1.addKeyListener(new KeyAdapter() {
                    @Override
                    public void keyReleased(KeyEvent e) {
                        passwordField1KeyReleased(e);
                    }
                });
                contentPanel.add(passwordField1, CC.xy(3, 3));

                //---- button1 ----
                button1.setText(bundle.getString("Login.button1.text"));
                button1.setFont(new Font("Tahoma", Font.PLAIN, 13));
                button1.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        button1ActionPerformed(e);
                    }
                });
                contentPanel.add(button1, CC.xy(1, 5));

                //---- textField2 ----
                textField2.setFont(new Font("Tahoma", Font.PLAIN, 13));
                textField2.addKeyListener(new KeyAdapter() {
                    @Override
                    public void keyReleased(KeyEvent e) {
                        textField2KeyReleased(e);
                    }
                });
                contentPanel.add(textField2, CC.xy(3, 5));

                //---- checkBox2 ----
                checkBox2.setText(bundle.getString("Login.checkBox2.text"));
                checkBox2.setSelected(true);
                contentPanel.add(checkBox2, CC.xy(1, 7));

                //---- checkBox1 ----
                checkBox1.setText(bundle.getString("Login.checkBox1.text"));
                checkBox1.setFont(new Font("Tahoma", Font.PLAIN, 13));
                checkBox1.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        checkBox1ActionPerformed(e);
                    }
                });
                checkBox1.addKeyListener(new KeyAdapter() {
                    @Override
                    public void keyReleased(KeyEvent e) {
                        checkBox1KeyReleased(e);
                    }
                });
                contentPanel.add(checkBox1, CC.xy(3, 7));

                //---- label3 ----
                label3.setText(bundle.getString("Login.label3.text"));
                label3.setFont(new Font("Tahoma", Font.PLAIN, 13));
                contentPanel.add(label3, CC.xy(1, 9));

                //---- passwordField2 ----
                passwordField2.setEnabled(false);
                passwordField2.setFont(new Font("Tahoma", Font.PLAIN, 13));
                passwordField2.addKeyListener(new KeyAdapter() {
                    @Override
                    public void keyReleased(KeyEvent e) {
                        passwordField2KeyReleased(e);
                    }
                });
                contentPanel.add(passwordField2, CC.xy(3, 9));

                //---- label4 ----
                label4.setText(bundle.getString("Login.label4.text"));
                label4.setFont(new Font("Tahoma", Font.PLAIN, 13));
                contentPanel.add(label4, CC.xy(1, 11));

                //---- passwordField3 ----
                passwordField3.setEnabled(false);
                passwordField3.setFont(new Font("Tahoma", Font.PLAIN, 13));
                passwordField3.addKeyListener(new KeyAdapter() {
                    @Override
                    public void keyReleased(KeyEvent e) {
                        passwordField3KeyReleased(e);
                    }
                });
                contentPanel.add(passwordField3, CC.xy(3, 11));
            }
            dialogPane.add(contentPanel, BorderLayout.CENTER);

            //======== buttonBar ========
            {
                buttonBar.setBorder(Borders.BUTTON_BAR_PAD);
                buttonBar.setFont(new Font("Tahoma", Font.PLAIN, 13));
                buttonBar.setLayout(new FormLayout("$glue, $button, $rgap, $button", "pref"));

                //---- okButton ----
                okButton.setText("OK");
                okButton.setFont(new Font("Tahoma", Font.PLAIN, 13));
                okButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        okButtonActionPerformed(e);
                    }
                });
                buttonBar.add(okButton, CC.xy(2, 1));

                //---- cancelButton ----
                cancelButton.setText("Cancel");
                cancelButton.setIcon(null);
                cancelButton.setFont(new Font("Tahoma", Font.PLAIN, 13));
                cancelButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        cancelButtonActionPerformed(e);
                    }
                });
                buttonBar.add(cancelButton, CC.xy(4, 1));
            }
            dialogPane.add(buttonBar, BorderLayout.SOUTH);
        }
        contentPane.add(dialogPane, BorderLayout.CENTER);
        setSize(435, 245);
        setLocationRelativeTo(getOwner());
        // JFormDesigner - End of component initialization  //GEN-END:initComponents
    }

    // JFormDesigner - Variables declaration - DO NOT MODIFY  //GEN-BEGIN:variables

    private JPanel dialogPane;
    private JPanel contentPanel;
    private JLabel label1;
    private JTextField textField1;
    private JLabel label2;
    private JPasswordField passwordField1;
    private JButton button1;
    private JTextField textField2;
    private JCheckBox checkBox2;
    private JCheckBox checkBox1;
    private JLabel label3;
    private JPasswordField passwordField2;
    private JLabel label4;
    private JPasswordField passwordField3;
    private JPanel buttonBar;
    private JButton okButton;
    private JButton cancelButton;
    // JFormDesigner - End of variables declaration  //GEN-END:variables

}