de.mendelson.comm.as2.client.AS2Gui.java Source code

Java tutorial

Introduction

Here is the source code for de.mendelson.comm.as2.client.AS2Gui.java

Source

//$Header: /cvsroot-fuse/mec-as2/39/mendelson/comm/as2/client/AS2Gui.java,v 1.1 2012/04/18 14:10:23 heller Exp $
package de.mendelson.comm.as2.client;

import de.mendelson.comm.as2.AS2ServerVersion;
import de.mendelson.comm.as2.client.about.AboutDialog;
import de.mendelson.comm.as2.client.manualsend.JDialogManualSend;
import de.mendelson.comm.as2.clientserver.message.DeleteMessageRequest;
import de.mendelson.comm.as2.clientserver.message.RefreshClientCEMDisplay;
import de.mendelson.comm.as2.clientserver.message.RefreshClientMessageOverviewList;
import de.mendelson.util.security.cert.clientserver.RefreshKeystoreCertificates;
import de.mendelson.comm.as2.clientserver.message.RefreshTablePartnerData;
import de.mendelson.comm.as2.database.DBDriverManager;
import de.mendelson.comm.as2.importexport.ConfigurationExportRequest;
import de.mendelson.comm.as2.importexport.ConfigurationExportResponse;
import de.mendelson.comm.as2.importexport.JDialogImportConfiguration;
import de.mendelson.comm.as2.message.AS2Info;
import de.mendelson.comm.as2.message.AS2Message;
import de.mendelson.comm.as2.message.AS2MessageInfo;
import de.mendelson.comm.as2.message.AS2Payload;
import de.mendelson.comm.as2.message.MessageAccessDB;
import de.mendelson.comm.as2.message.MessageOverviewFilter;
import de.mendelson.comm.as2.message.loggui.DialogMessageDetails;
import de.mendelson.comm.as2.message.loggui.TableModelMessageOverview;
import de.mendelson.comm.as2.partner.Partner;
import de.mendelson.comm.as2.partner.PartnerAccessDB;
import de.mendelson.comm.as2.partner.gui.JDialogPartnerConfig;
import de.mendelson.comm.as2.preferences.JDialogPreferences;
import de.mendelson.comm.as2.preferences.PreferencesAS2;
import de.mendelson.comm.as2.preferences.PreferencesPanel;
import de.mendelson.comm.as2.preferences.PreferencesPanelDirectories;
import de.mendelson.comm.as2.preferences.PreferencesPanelMDN;
import de.mendelson.comm.as2.preferences.PreferencesPanelNotification;
import de.mendelson.comm.as2.preferences.PreferencesPanelProxy;
import de.mendelson.comm.as2.preferences.PreferencesPanelSecurity;
import de.mendelson.comm.as2.preferences.PreferencesPanelSystemMaintenance;
import de.mendelson.comm.as2.server.AS2Server;
import de.mendelson.util.*;
import de.mendelson.util.clientserver.ClientsideMessageProcessor;
import de.mendelson.util.clientserver.GUIClient;
import de.mendelson.util.clientserver.clients.datatransfer.DownloadRequestFile;
import de.mendelson.util.clientserver.clients.datatransfer.DownloadResponseFile;
import de.mendelson.util.clientserver.clients.datatransfer.TransferClient;
import de.mendelson.util.clientserver.clients.datatransfer.TransferClientWithProgress;
import de.mendelson.util.clientserver.messages.ClientServerMessage;
import de.mendelson.util.clientserver.messages.ServerInfo;
import de.mendelson.util.clientserver.user.User;
import de.mendelson.util.log.panel.LogConsolePanel;
import de.mendelson.util.tables.JTableColumnResizer;
import de.mendelson.util.tables.TableCellRendererDate;
import java.awt.Desktop;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.sql.Connection;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.event.RowSorterEvent;
import javax.swing.event.RowSorterListener;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import oracle.help.Help;
import oracle.help.library.helpset.HelpSet;
/*
 * Copyright (C) mendelson-e-commerce GmbH Berlin Germany
 *
 * This software is subject to the license agreement set forth in the license.
 * Please read and agree to all terms before using this software. Other product
 * and brand names are trademarks of their respective owners.
 */
import org.apache.http.Header;

/**
 * Main GUI for the control of the mendelson AS2 server
 *
 * @author S.Heller
 * @version $Revision: 1.1 $
 */
public class AS2Gui extends GUIClient implements ListSelectionListener, RowSorterListener,
        ClientsideMessageProcessor, MouseListener, PopupMenuListener {

    /**
     * Preferences of the application
     */
    private PreferencesAS2 clientPreferences = new PreferencesAS2();
    private Logger logger = Logger.getLogger("de.mendelson.as2.client");
    /**
     * Resourcebundle to localize the GUI
     */
    private MecResourceBundle rb = null;
    /**
     * actual loaded helpset
     */
    private HelpSet helpSet = null;
    /**
     * Actual help component
     */
    private Help help = null;
    /**
     * Flag to show/hide the filter panel
     */
    private boolean showFilterPanel = false;
    /**
     * download URL for the new version
     */
    private String downloadURLNewVersion = "http://www.mendelson-e-c.com";
    /**
     * DB connection
     */
    private Connection configConnection = null;
    private Connection runtimeConnection = null;
    /**
     * Refresh thread for the transaction overview - schedules the refresh requests
     */
    private RefreshThread refreshThread = new RefreshThread();
    /**
     * Store if the help has been displayed already
     */
    private boolean helpHasBeenDisplayed = false;
    /**
     * Host to connect to
     */
    private String host;

    /**
     * Creates new form NewJFrame
     */
    public AS2Gui(Splash splash, String host) {
        this.host = host;
        //Set System default look and feel
        try {
            //support the command line option -Dswing.defaultlaf=...
            if (System.getProperty("swing.defaultlaf") == null) {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            }
        } catch (Exception e) {
            this.logger.warning(this.getClass().getName() + ":" + e.getMessage());
        }
        //load resource bundle
        try {
            this.rb = (MecResourceBundle) ResourceBundle.getBundle(ResourceBundleAS2Gui.class.getName());
        } catch (MissingResourceException e) {
            throw new RuntimeException("Oops..resource bundle " + e.getClassName() + " not found.");
        }
        initComponents();
        this.jButtonNewVersion.setVisible(false);
        this.jPanelRefreshWarning.setVisible(false);
        //set preference values to the GUI
        this.setBounds(this.clientPreferences.getInt(PreferencesAS2.FRAME_X),
                this.clientPreferences.getInt(PreferencesAS2.FRAME_Y),
                this.clientPreferences.getInt(PreferencesAS2.FRAME_WIDTH),
                this.clientPreferences.getInt(PreferencesAS2.FRAME_HEIGHT));
        //ensure to display all messages
        this.getLogger().setLevel(Level.ALL);
        LogConsolePanel consolePanel = new LogConsolePanel(this.getLogger());
        //define the colors for the log levels
        consolePanel.setColor(Level.SEVERE, LogConsolePanel.COLOR_BROWN);
        consolePanel.setColor(Level.WARNING, LogConsolePanel.COLOR_BLUE);
        consolePanel.setColor(Level.INFO, LogConsolePanel.COLOR_BLACK);
        consolePanel.setColor(Level.CONFIG, LogConsolePanel.COLOR_DARK_GREEN);
        consolePanel.setColor(Level.FINE, LogConsolePanel.COLOR_DARK_GREEN);
        consolePanel.setColor(Level.FINER, LogConsolePanel.COLOR_DARK_GREEN);
        consolePanel.setColor(Level.FINEST, LogConsolePanel.COLOR_DARK_GREEN);
        this.jPanelServerLog.add(consolePanel);
        this.setTitle(AS2ServerVersion.getProductName() + " " + AS2ServerVersion.getVersion());
        //initialize the help system if available
        this.initializeJavaHelp();
        this.jTableMessageOverview.getSelectionModel().addListSelectionListener(this);
        this.jTableMessageOverview.getTableHeader().setReorderingAllowed(false);
        //icon columns
        TableColumn column = this.jTableMessageOverview.getColumnModel().getColumn(0);
        column.setMaxWidth(20);
        column.setResizable(false);
        column = this.jTableMessageOverview.getColumnModel().getColumn(1);
        column.setMaxWidth(20);
        column.setResizable(false);
        this.jTableMessageOverview.setDefaultRenderer(Date.class,
                new TableCellRendererDate(DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT)));
        //add row sorter
        RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(this.jTableMessageOverview.getModel());
        jTableMessageOverview.setRowSorter(sorter);
        sorter.addRowSorterListener(this);
        this.jPanelFilterOverview.setVisible(this.showFilterPanel);
        this.jMenuItemHelpForum.setEnabled(Desktop.isDesktopSupported());
        //destroy splash, possible login screen for the client should come up
        if (splash != null) {
            splash.destroy();
        }
        this.setButtonState();
        this.jTableMessageOverview.addMouseListener(this);
        //popup menu issues
        this.jPopupMenu.setInvoker(this.jScrollPaneMessageOverview);
        this.jPopupMenu.addPopupMenuListener(this);
        super.addMessageProcessor(this);
        //perform the connection to the server
        //warning! this works for localhost only so far
        int clientServerCommPort = this.clientPreferences.getInt(PreferencesAS2.CLIENTSERVER_COMM_PORT);
        if (splash != null) {
            splash.destroy();
        }
        this.browserLinkedPanel.cyleText(new String[] {
                "For additional EDI software to convert and process your data please contact <a href='http://www.mendelson-e-c.com'>mendelson-e-commerce GmbH</a>",
                "To buy a commercial license please visit the <a href='http://shop.mendelson-e-c.com/'>mendelson online shop</a>",
                "Most trading partners demand a trusted certificate - Order yours at the <a href='http://ca.mendelson-e-c.com'>mendelson CA</a> now!",
                "Looking for additional secure data transmission software? Try the <a href='http://oftp2.mendelson-e-c.com'>mendelson OFTP2</a> solution!",
                "You want to send EDIFACT data from your SAP system? Ask <a href='mailto:info@mendelson.de?subject=Please%20inform%20me%20about%20your%20SAP%20integration%20solutions'>mendelson-e-commerce GmbH</a> for a solution.",
                "You need a secure FTP solution? <a href='mailto:info@mendelson.de?subject=Please%20inform%20me%20about%20your%20SFTP%20solution'>Ask us</a> for the mendelson SFTP software.",
                "Convert flat files, EDIFACT, SAP IDos, VDA, inhouse formats? <a href='mailto:info@mendelson.de?subject=Please%20inform%20me%20about%20your%20converter%20solution'>Ask us</a> for the mendelson EDI converter.",
                "For commercial support of this software please buy a license at <a href='http://as2.mendelson-e-c.com'>the mendelson AS2</a> website.",
                "Have a look at the <a href='http://www.mendelson-e-c.com/products_mbi.php'>mendelson business integration</a> for a powerful EDI solution.",
                "The <a href='mailto:info@mendelson.de?subject=Please%20inform%20me%20about%20your%20RosettaNet%20solution'>mendelson RosettaNet solution</a> supports RNIF 1.1 and RNIF 2.0.",
                "The <a href='http://www.mendelson-e-c.com/products_ide.php'>mendelson converter IDE</a> is the graphical mapper for the mendelson converter.",
                "To process any XML data and convert it to EDIFACT, VDA, flat files, IDocs and inhouse formats use <a href='http://www.mendelson-e-c.com/products_converter.php'>the mendelson converter</a>.",
                "To transmit your EDI data via HTTP/S please <a href='mailto:info@mendelson.de?subject=Please%20inform%20me%20about%20your%20HTTPS%20solution'>ask us</a> for the mendelson HTTPS solution.",
                "If you have questions regarding this product please refer to the <a href='http://community.mendelson-e-c.com/'>mendelson community</a>.", });
        this.connect(new InetSocketAddress(host, clientServerCommPort), 5000);
        Runnable dailyNewsThread = new Runnable() {

            @Override
            public void run() {
                while (true) {
                    long lastUpdateCheck = Long.valueOf(clientPreferences.get(PreferencesAS2.LAST_UPDATE_CHECK));
                    //check only once a day even if the system is started n times a day
                    if (lastUpdateCheck < (System.currentTimeMillis() - TimeUnit.HOURS.toMillis(23))) {
                        clientPreferences.put(PreferencesAS2.LAST_UPDATE_CHECK,
                                String.valueOf(System.currentTimeMillis()));
                        jButtonNewVersion.setVisible(false);
                        String version = (AS2ServerVersion.getVersion() + " " + AS2ServerVersion.getBuild())
                                .replace(' ', '+');
                        Header[] header = htmlPanel.setURL(
                                "http://www.mendelson.de/en/mecas2/client_welcome.php?version=" + version,
                                AS2ServerVersion.getProductName() + " " + AS2ServerVersion.getVersion(),
                                new File("start/client_welcome.html"));
                        if (header != null) {
                            String downloadURL = null;
                            String actualBuild = null;
                            for (Header singleHeader : header) {
                                if (singleHeader.getName().equals("x-actual-build")) {
                                    actualBuild = singleHeader.getValue().trim();
                                }
                                if (singleHeader.getName().equals("x-download-url")) {
                                    downloadURL = singleHeader.getValue().trim();
                                }
                            }
                            if (downloadURL != null && actualBuild != null) {
                                try {
                                    int thisBuild = AS2ServerVersion.getBuildNo();
                                    int availableBuild = Integer.valueOf(actualBuild);
                                    if (thisBuild < availableBuild) {
                                        jButtonNewVersion.setVisible(true);
                                    }
                                    downloadURLNewVersion = downloadURL;
                                } catch (Exception e) {
                                    //nop
                                }
                            }
                        }
                    } else {
                        htmlPanel.setPage(new File("start/client_welcome.html"));
                    }
                    try {
                        //check once a day for new update
                        Thread.sleep(TimeUnit.DAYS.toMillis(1));
                    } catch (InterruptedException e) {
                        //nop
                    }
                }
            }
        };
        Executors.newSingleThreadExecutor().submit(dailyNewsThread);
        this.as2StatusBar.setConnectedHost(this.host);
    }

    @Override
    public void loginRequestedFromServer() {
        this.performLogin("admin", "admin".toCharArray(), AS2ServerVersion.getFullProductName());
    }

    /**
     * Mainly impossible in the open source version
     */
    @Override
    public void loginFailureIncompatibleClient() {
        System.exit(1);
    }

    @Override
    public Logger getLogger() {
        return (this.logger);
    }

    /**
     * Stores the actual GUIs preferences to restore the GUI at the next program
     * start
     */
    private void savePreferences() {
        this.clientPreferences.putInt(PreferencesAS2.FRAME_X, (int) this.getBounds().getX());
        this.clientPreferences.putInt(PreferencesAS2.FRAME_Y, (int) this.getBounds().getY());
        this.clientPreferences.putInt(PreferencesAS2.FRAME_WIDTH, (int) this.getBounds().getWidth());
        this.clientPreferences.putInt(PreferencesAS2.FRAME_HEIGHT, (int) this.getBounds().getHeight());
    }

    /**
     * Initialized a help set by a given name
     */
    private void initializeJavaHelp() {
        try {
            //At the moment only english and german help systems are implemented.
            String filename = null;
            //If the found default is none of them, set the english help as
            //default!
            if (!Locale.getDefault().getLanguage().equals(Locale.GERMANY.getLanguage())
                    && !Locale.getDefault().getLanguage().equals(Locale.US.getLanguage())) {
                this.getLogger().warning("Sorry, there is no specific HELPSET available for your language, ");
                this.getLogger().warning("the english help will be displayed.");
                filename = "as2help/as2_en.hs";
            } else {
                filename = "as2help/as2_" + Locale.getDefault().getLanguage() + ".hs";
            }

            File helpSetFile = new File(filename);
            URL helpURL = helpSetFile.toURI().toURL();
            this.helpSet = new HelpSet(helpURL);
            this.help = new Help(true, false, true);
            Help.setHelpLocale(Locale.getDefault());
            help.setIconImage(
                    new ImageIcon(getClass().getResource("/de/mendelson/comm/as2/client/questionmark16x16.gif"))
                            .getImage());
            help.addBook(helpSet);
            help.setDefaultTopicID("as2_main");
            try {
                URL url = new File("./as2_help_favories.xml").toURI().toURL();
                help.enableFavoritesNavigator(url);
            } catch (MalformedURLException ignore) {
            }
        } catch (Exception e) {
            // could not find it! Disable menu item
            this.getLogger().warning("Helpset not found, helpsystem is disabled!");
            this.jMenuItemHelpSystem.setEnabled(false);
        }

    }

    private void updatePartnerFilter(Partner[] partner) {
        Partner selectedPartner = null;
        if (this.jComboBoxFilterPartner.getSelectedIndex() > 0) {
            selectedPartner = (Partner) this.jComboBoxFilterPartner.getSelectedItem();
        }

        Arrays.sort(partner);
        this.jComboBoxFilterPartner.removeAllItems();
        this.jComboBoxFilterPartner.addItem(this.rb.getResourceString("filter.none"));
        for (Partner singlePartner : partner) {
            this.jComboBoxFilterPartner.addItem(singlePartner);
        }

        if (selectedPartner != null) {
            this.jComboBoxFilterPartner.setSelectedItem(selectedPartner);
        }

        if (this.jComboBoxFilterPartner.getSelectedItem() == null) {
            this.jComboBoxFilterPartner.setSelectedIndex(0);
        }

    }

    /**
     * Scrolls to an entry of the passed table
     *
     * @param table Table to to scroll in
     * @param row Row to ensure visibility
     */
    private void makeRowVisible(JTable table, int row) {
        if (table.getColumnCount() == 0) {
            return;
        }
        if (row < 0 || row >= table.getRowCount()) {
            throw new IllegalArgumentException("Requested ensure visible of row " + String.valueOf(row)
                    + ", table has only " + table.getRowCount() + " rows.");
        }
        Rectangle visible = table.getVisibleRect();
        Rectangle cell = table.getCellRect(row, 0, true);
        if (cell.y < visible.y) {
            visible.y = cell.y;
            table.scrollRectToVisible(visible);
        } else if (cell.y + cell.height > visible.y + visible.height) {
            visible.y = cell.y + cell.height - visible.height;
            table.scrollRectToVisible(visible);
        }
    }

    /**
     * Displays details for the selected msg row
     */
    private void showSelectedRowDetails() {
        if (this.runtimeConnection == null) {
            return;
        }
        final String uniqueId = this.getClass().getName() + ".showSelectedRowDetails." + System.currentTimeMillis();
        Runnable runnable = new Runnable() {

            @Override
            public void run() {

                try {
                    AS2Gui.this.jButtonMessageDetails.setEnabled(false);
                    AS2Gui.this.as2StatusBar.startProgressIndeterminate(AS2Gui.this.rb.getResourceString("details"),
                            uniqueId);
                    int selectedRow = AS2Gui.this.jTableMessageOverview.getSelectedRow();
                    if (selectedRow >= 0) {
                        AS2Message message = ((TableModelMessageOverview) AS2Gui.this.jTableMessageOverview
                                .getModel()).getRow(selectedRow);
                        AS2MessageInfo info = (AS2MessageInfo) message.getAS2Info();
                        //download the full payload from the server
                        MessageAccessDB messageAccess = new MessageAccessDB(AS2Gui.this.configConnection,
                                AS2Gui.this.runtimeConnection);
                        List<AS2Payload> payloads = messageAccess.getPayload(info.getMessageId());
                        message.setPayloads(payloads);
                        DialogMessageDetails dialog = new DialogMessageDetails(AS2Gui.this,
                                AS2Gui.this.configConnection, AS2Gui.this.runtimeConnection,
                                AS2Gui.this.getBaseClient(), info, message.getPayloads());
                        AS2Gui.this.as2StatusBar.stopProgressIfExists(uniqueId);
                        dialog.setVisible(true);
                    }
                } catch (Exception e) {
                    //nop
                } finally {
                    AS2Gui.this.as2StatusBar.stopProgressIfExists(uniqueId);
                    AS2Gui.this.setButtonState();
                }
            }
        };
        Executors.newSingleThreadExecutor().submit(runnable);
    }

    /**
     * Enables/disables the buttons of this GUI
     */
    private void setButtonState() {
        this.jButtonMessageDetails.setEnabled(this.jTableMessageOverview.getSelectedRow() >= 0);
        this.jButtonDeleteMessage.setEnabled(this.jTableMessageOverview.getSelectedRow() >= 0);
        //check if min one of the selected rows has the state "stopped" or "finished"
        int[] selectedRows = this.jTableMessageOverview.getSelectedRows();
        AS2Message[] overviewRows = ((TableModelMessageOverview) this.jTableMessageOverview.getModel())
                .getRows(selectedRows);
        boolean deletableRowSelected = false;
        for (int i = 0; i < overviewRows.length; i++) {
            AS2MessageInfo info = (AS2MessageInfo) overviewRows[i].getAS2Info();
            if (info.getState() == AS2Message.STATE_FINISHED || info.getState() == AS2Message.STATE_STOPPED) {
                deletableRowSelected = true;
                break;

            }

        }
        this.jButtonDeleteMessage.setEnabled(deletableRowSelected);
        ImageIcon iconBase = new ImageIcon(
                this.getClass().getResource("/de/mendelson/comm/as2/client/filter16x16.gif"));
        if (this.filterIsSet()) {
            ImageUtil imageUtil = new ImageUtil();
            ImageIcon iconActive = new ImageIcon(
                    this.getClass().getResource("/de/mendelson/comm/as2/client/mini_filteractive.gif"));
            this.jButtonFilter.setIcon(imageUtil.mixImages(iconBase, iconActive));
        } else {
            this.jButtonFilter.setIcon(iconBase);
        }

    }

    /**
     * Returns if a filter is set on the message overview entries
     */
    private boolean filterIsSet() {
        return (!this.jCheckBoxFilterShowOk.isSelected() || !this.jCheckBoxFilterShowPending.isSelected()
                || !this.jCheckBoxFilterShowStopped.isSelected()
                || this.jComboBoxFilterPartner.getSelectedIndex() > 0);
    }

    /**
     * Makes this a ListSelectionListener
     */
    @Override
    public void valueChanged(ListSelectionEvent listSelectionEvent) {
        this.as2StatusBar.setSelectedTransactionCount(this.jTableMessageOverview.getSelectedRowCount());
        this.setButtonState();
    }

    /**
     * Deletes the actual selected AS2 rows from the database, filesystem etc
     */
    private void deleteSelectedMessages() {
        if (this.runtimeConnection == null) {
            return;
        }
        int requestValue = JOptionPane.showConfirmDialog(this,
                this.rb.getResourceString("dialog.msg.delete.message"),
                this.rb.getResourceString("dialog.msg.delete.title"), JOptionPane.YES_NO_OPTION);
        if (requestValue != JOptionPane.YES_OPTION) {
            return;
        }
        int[] selectedRows = this.jTableMessageOverview.getSelectedRows();
        AS2Message[] overviewRows = ((TableModelMessageOverview) this.jTableMessageOverview.getModel())
                .getRows(selectedRows);
        List<AS2MessageInfo> deleteList = new ArrayList<AS2MessageInfo>();
        for (AS2Message message : overviewRows) {
            deleteList.add((AS2MessageInfo) message.getAS2Info());
        }
        DeleteMessageRequest request = new DeleteMessageRequest();
        request.setDeleteList(deleteList);
        this.getBaseClient().sendAsync(request);
    }

    /**
     * Starts a dialog that allows to send files manual to a partner
     */
    private void sendFileManual() {
        if (this.configConnection == null) {
            return;
        }
        JDialogManualSend dialog = new JDialogManualSend(this, this.configConnection, this.runtimeConnection,
                this.getBaseClient(), this.as2StatusBar, this.rb.getResourceString("uploading.to.server"));
        dialog.setVisible(true);
    }

    /**
     * The client received a message from the server
     */
    @Override
    public boolean processMessageFromServer(ClientServerMessage message) {
        if (message instanceof RefreshClientMessageOverviewList) {
            RefreshClientMessageOverviewList refreshRequest = (RefreshClientMessageOverviewList) message;
            if (refreshRequest.getOperation() == RefreshClientMessageOverviewList.OPERATION_PROCESSING_UPDATE) {
                this.refreshThread.serverRequestsOverviewRefresh();
            } else {
                //always perform update of a delete operation - even if the refresh has been disabled
                this.refreshThread.userRequestsOverviewRefresh();
            }
            return (true);
        } else if (message instanceof RefreshTablePartnerData) {
            this.refreshThread.requestPartnerRefresh();
            return (true);
        } else if (message instanceof ServerInfo) {
            ServerInfo serverInfo = (ServerInfo) message;
            this.getLogger().log(Level.CONFIG, serverInfo.getProductname());
            return (true);
        } else if (message instanceof RefreshClientCEMDisplay) {
            //return true for this message even if it is not processed here to prevent a
            //warning that the message was not processed
            return (true);
        }
        return (false);
    }

    @Override
    public void loggedIn(User user) {
        super.loggedIn(user);
        try {
            this.configConnection = DBDriverManager.getConnectionWithoutErrorHandling(DBDriverManager.DB_CONFIG,
                    this.host);
            this.runtimeConnection = DBDriverManager.getConnectionWithoutErrorHandling(DBDriverManager.DB_RUNTIME,
                    this.host);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(AS2Gui.this,
                    this.rb.getResourceString("dbconnection.failed.message", e.getMessage()),
                    this.rb.getResourceString("dbconnection.failed.title"), JOptionPane.ERROR_MESSAGE);
            System.exit(1);
        }
        this.as2StatusBar.setConnectedHost(this.host);
        //start the table update thread
        Executors.newSingleThreadExecutor().submit(this.refreshThread);
    }

    /**
     * Makes this a RowSorterListener, workaround for the bug that the selected
     * row will change to a random one after the sort process
     */
    @Override
    public void sorterChanged(RowSorterEvent e) {
        if (e.getType().equals(RowSorterEvent.Type.SORTED)) {
            this.jTableMessageOverview.getSelectionModel().clearSelection();
            this.setButtonState();
        }
    }

    /**Exports the configuration*/
    private void performConfigurationExport() {
        //prevent this action if the user is not logged in
        if (this.configConnection == null) {
            return;
        }
        MecFileChooser chooser = new MecFileChooser(this, this.rb.getResourceString("filechooser.export"));
        String exportFilename = chooser.browseFilename();
        if (exportFilename != null) {
            InputStream inStream = null;
            OutputStream outStream = null;
            try {
                TransferClient transferClient = new TransferClient(this.getBaseClient());
                ConfigurationExportResponse response = (ConfigurationExportResponse) transferClient
                        .download(new ConfigurationExportRequest());
                if (response.getException() != null) {
                    throw response.getException();
                }
                outStream = new FileOutputStream(exportFilename);
                inStream = response.getDataStream();
                this.copyStreams(inStream, outStream);
                outStream.flush();
                this.getLogger().fine(
                        this.rb.getResourceString("export.success", new File(exportFilename).getAbsolutePath()));
            } catch (Throwable e) {
                this.getLogger().severe("ConfigurationExport: " + e.getMessage());
            } finally {
                if (inStream != null) {
                    try {
                        inStream.close();
                    } catch (Exception e) {
                    }
                }
                if (outStream != null) {
                    try {
                        outStream.close();
                    } catch (Exception e) {
                    }
                }
            }
        }
    }

    /**
     * Copies all data from one stream to another
     */
    private void copyStreams(InputStream in, OutputStream out) throws IOException {
        BufferedInputStream inStream = new BufferedInputStream(in);
        BufferedOutputStream outStream = new BufferedOutputStream(out);
        //copy the contents to an output stream
        byte[] buffer = new byte[1024];
        int read = 1024;
        //a read of 0 must be allowed, sometimes it takes time to
        //extract data from the input
        while (read != -1) {
            read = inStream.read(buffer);
            if (read > 0) {
                outStream.write(buffer, 0, read);
            }
        }
        outStream.flush();
    }

    /**Imports the configuration*/
    private void performConfigurationImport() {
        MecFileChooser chooser = new MecFileChooser(this, this.rb.getResourceString("filechooser.import"));
        String importFilename = chooser.browseFilename();
        if (importFilename != null) {
            try {
                JDialogImportConfiguration dialog = new JDialogImportConfiguration(this, importFilename,
                        this.configConnection, this.runtimeConnection, this.getBaseClient());
                dialog.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
                JOptionPane.showMessageDialog(this, e.getMessage(), "Error during import",
                        JOptionPane.ERROR_MESSAGE);
                this.getLogger().severe(e.getMessage());
            }
        }
    }

    /**Starts a dialog that allows to send files manual to a partner
      */
    private void sendFileManualFromSelectedTransaction() {
        if (this.configConnection == null) {
            return;
        }
        int requestValue = JOptionPane.showConfirmDialog(this, this.rb.getResourceString("dialog.resend.message"),
                this.rb.getResourceString("dialog.resend.title"), JOptionPane.YES_NO_OPTION);
        if (requestValue != JOptionPane.YES_OPTION) {
            return;
        }
        final String uniqueId = this.getClass().getName() + ".sendFileManualFromSelectedTransaction."
                + System.currentTimeMillis();
        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                File tempFile = null;
                try {
                    AS2Gui.this.as2StatusBar.startProgressIndeterminate(
                            AS2Gui.this.rb.getResourceString("menu.file.resend"), uniqueId);
                    int selectedRow = AS2Gui.this.jTableMessageOverview.getSelectedRow();
                    if (selectedRow >= 0) {
                        //download the payload for the selected message
                        MessageAccessDB messageAccess = new MessageAccessDB(AS2Gui.this.configConnection,
                                AS2Gui.this.runtimeConnection);
                        JDialogManualSend dialog = new JDialogManualSend(AS2Gui.this, AS2Gui.this.configConnection,
                                AS2Gui.this.runtimeConnection, AS2Gui.this.getBaseClient(),
                                AS2Gui.this.as2StatusBar, AS2Gui.this.rb.getResourceString("uploading.to.server"));
                        AS2Message message = ((TableModelMessageOverview) AS2Gui.this.jTableMessageOverview
                                .getModel()).getRow(selectedRow);
                        if (message != null) {
                            AS2MessageInfo info = (AS2MessageInfo) message.getAS2Info();
                            PartnerAccessDB partnerAccess = new PartnerAccessDB(AS2Gui.this.configConnection,
                                    AS2Gui.this.runtimeConnection);
                            Partner sender = partnerAccess.getPartner(info.getSenderId());
                            Partner receiver = partnerAccess.getPartner(info.getReceiverId());
                            List<AS2Payload> payloads = messageAccess.getPayload(info.getMessageId());
                            for (AS2Payload payload : payloads) {
                                message.addPayload(payload);
                            }
                            if (message.getPayloadCount() > 0) {
                                AS2Payload payload = message.getPayload(0);
                                //request the payload file from the server
                                TransferClientWithProgress transferClient = new TransferClientWithProgress(
                                        AS2Gui.this.getBaseClient(), AS2Gui.this.as2StatusBar.getProgressPanel());
                                DownloadRequestFile request = new DownloadRequestFile();
                                request.setFilename(payload.getPayloadFilename());
                                InputStream inStream = null;
                                OutputStream outStream = null;
                                try {
                                    DownloadResponseFile response = (DownloadResponseFile) transferClient
                                            .download(request);
                                    if (response.getException() != null) {
                                        throw response.getException();
                                    }
                                    String tempFilename = "as2.bin";
                                    if (payload.getOriginalFilename() != null) {
                                        tempFilename = payload.getOriginalFilename();
                                    }
                                    tempFile = AS2Tools.createTempFile(tempFilename, "");
                                    outStream = new FileOutputStream(tempFile);
                                    inStream = response.getDataStream();
                                    AS2Gui.this.copyStreams(inStream, outStream);
                                    outStream.flush();
                                } catch (Throwable e) {
                                    AS2Gui.this.logger.severe(e.getMessage());
                                    return;
                                } finally {
                                    if (inStream != null) {
                                        try {
                                            inStream.close();
                                        } catch (Exception e) {
                                        }
                                    }
                                    if (outStream != null) {
                                        try {
                                            outStream.close();
                                        } catch (Exception e) {
                                        }
                                    }
                                }
                                dialog.initialize(sender, receiver, tempFile.getAbsolutePath());
                            }
                            dialog.performSend();
                            info.setResendCounter(info.getResendCounter() + 1);
                            messageAccess.updateResendCounter(info);
                            Logger.getLogger(AS2Server.SERVER_LOGGER_NAME).log(Level.INFO,
                                    AS2Gui.this.rb.getResourceString("resend.performed"), info);
                        }
                        AS2Gui.this.as2StatusBar.stopProgressIfExists(uniqueId);
                    }
                } catch (Throwable e) {
                    //nop
                } finally {
                    AS2Gui.this.as2StatusBar.stopProgressIfExists(uniqueId);
                    if (tempFile != null) {
                        tempFile.delete();
                    }
                }

            }
        };
        Executors.newSingleThreadExecutor().submit(runnable);
    }

    private void displayPartnerDialog() {
        final String uniqueId = this.getClass().getName() + ".displayPartnerDialog." + System.currentTimeMillis();
        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                JDialogPartnerConfig dialog = null;
                try {
                    //display wait indicator
                    AS2Gui.this.as2StatusBar.startProgressIndeterminate(
                            AS2Gui.this.rb.getResourceString("menu.file.partner"), uniqueId);
                    dialog = new JDialogPartnerConfig(AS2Gui.this, AS2Gui.this.configConnection,
                            AS2Gui.this.runtimeConnection, AS2Gui.this, AS2Gui.this.as2StatusBar);
                    dialog.setDisplayNotificationPanel(false);
                    dialog.setDisplayHttpHeaderPanel(false);
                } finally {
                    AS2Gui.this.as2StatusBar.stopProgressIfExists(uniqueId);
                    if (dialog != null) {
                        dialog.setVisible(true);
                    }
                }
            }
        };
        Executors.newSingleThreadExecutor().submit(runnable);
    }

    private void displayHelpSystem() {
        if (this.helpHasBeenDisplayed) {
            this.help.setVisible(true);
        } else {
            final String uniqueId = this.getClass().getName() + ".displayHelpSystem." + System.currentTimeMillis();
            Runnable test = new Runnable() {

                @Override
                public void run() {
                    try {
                        //display wait indicator
                        AS2Gui.this.as2StatusBar.startProgressIndeterminate(
                                AS2Gui.this.rb.getResourceString("menu.help.helpsystem"), uniqueId);
                        AS2Gui.this.help.showTopic(AS2Gui.this.helpSet, "as2_main");
                    } finally {
                        AS2Gui.this.as2StatusBar.stopProgressIfExists(uniqueId);
                        AS2Gui.this.helpHasBeenDisplayed = true;
                    }
                }
            };
            Executors.newSingleThreadExecutor().submit(test);
        }
    }

    private void displayPreferences() {
        final String uniqueId = this.getClass().getName() + ".displayPreferences." + System.currentTimeMillis();
        Runnable test = new Runnable() {

            @Override
            public void run() {
                JDialogPreferences dialog = null;
                try {
                    List<PreferencesPanel> panelList = new ArrayList<PreferencesPanel>();
                    panelList.add(new PreferencesPanelMDN(AS2Gui.this.getBaseClient()));
                    panelList.add(new PreferencesPanelProxy(AS2Gui.this.getBaseClient()));
                    panelList.add(new PreferencesPanelSecurity(AS2Gui.this.getBaseClient()));
                    panelList.add(new PreferencesPanelDirectories(AS2Gui.this.getBaseClient()));
                    panelList.add(new PreferencesPanelSystemMaintenance(AS2Gui.this.getBaseClient()));
                    panelList.add(new PreferencesPanelNotification(AS2Gui.this.getBaseClient()));
                    //display wait indicator
                    AS2Gui.this.as2StatusBar.startProgressIndeterminate(
                            AS2Gui.this.rb.getResourceString("menu.file.preferences"), uniqueId);
                    dialog = new JDialogPreferences(AS2Gui.this, AS2Gui.this.configConnection,
                            AS2Gui.this.runtimeConnection, panelList);
                } finally {
                    AS2Gui.this.as2StatusBar.stopProgressIfExists(uniqueId);
                    if (dialog != null) {
                        dialog.setVisible(true);
                    }
                }
            }
        };
        Executors.newSingleThreadExecutor().submit(test);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        jPopupMenu = new javax.swing.JPopupMenu();
        jMenuItemPopupMessageDetails = new javax.swing.JMenuItem();
        jMenuItemPopupSendAgain = new javax.swing.JMenuItem();
        jSeparator9 = new javax.swing.JPopupMenu.Separator();
        jMenuItemPopupDeleteMessage = new javax.swing.JMenuItem();
        jTabbedPane = new javax.swing.JTabbedPane();
        jPanelLog = new javax.swing.JPanel();
        jToolBar = new javax.swing.JToolBar();
        jButtonPartner = new javax.swing.JButton();
        jButtonMessageDetails = new javax.swing.JButton();
        jButtonFilter = new javax.swing.JButton();
        jToggleButtonStopRefresh = new javax.swing.JToggleButton();
        jSeparator1 = new javax.swing.JSeparator();
        jButtonDeleteMessage = new javax.swing.JButton();
        jPanelMain = new javax.swing.JPanel();
        jSplitPane = new javax.swing.JSplitPane();
        jPanelMessageLog = new javax.swing.JPanel();
        jPanelFilterOverview = new javax.swing.JPanel();
        jCheckBoxFilterShowOk = new javax.swing.JCheckBox();
        jCheckBoxFilterShowPending = new javax.swing.JCheckBox();
        jCheckBoxFilterShowStopped = new javax.swing.JCheckBox();
        jLabelFilterShowOk = new javax.swing.JLabel();
        jLabelFilterShowPending = new javax.swing.JLabel();
        jLabelFilterShowError = new javax.swing.JLabel();
        jButtonHideFilter = new javax.swing.JButton();
        jComboBoxFilterPartner = new javax.swing.JComboBox();
        jPanelSpace = new javax.swing.JPanel();
        jLabelFilterPartner = new javax.swing.JLabel();
        jSeparator4 = new javax.swing.JSeparator();
        jScrollPaneMessageOverview = new javax.swing.JScrollPane();
        jTableMessageOverview = new de.mendelson.util.tables.JTableSortable();
        jPanelServerLog = new javax.swing.JPanel();
        jPanelRefreshWarning = new javax.swing.JPanel();
        jLabelRefreshStopWarning = new javax.swing.JLabel();
        htmlPanel = new de.mendelson.comm.as2.client.HTMLPanel();
        jPanelInfo = new javax.swing.JPanel();
        jButtonNewVersion = new javax.swing.JButton();
        browserLinkedPanel = new de.mendelson.comm.as2.client.BrowserLinkedPanel();
        as2StatusBar = new de.mendelson.comm.as2.client.AS2StatusBar();
        jMenuBar = new javax.swing.JMenuBar();
        jMenuFile = new javax.swing.JMenu();
        jMenuItemManualSend = new javax.swing.JMenuItem();
        jMenuItemKeyRefresh = new javax.swing.JMenuItem();
        jSeparator2 = new javax.swing.JSeparator();
        jMenuItemFilePreferences = new javax.swing.JMenuItem();
        jMenuItemPartner = new javax.swing.JMenuItem();
        jSeparator3 = new javax.swing.JSeparator();
        jMenuItemExportConfig = new javax.swing.JMenuItem();
        jMenuItemExportImport = new javax.swing.JMenuItem();
        jSeparator6 = new javax.swing.JSeparator();
        jMenuItemFileExit = new javax.swing.JMenuItem();
        jMenuHelp = new javax.swing.JMenu();
        jMenuItemHelpAbout = new javax.swing.JMenuItem();
        jSeparator5 = new javax.swing.JSeparator();
        jMenuItemHelpShop = new javax.swing.JMenuItem();
        jMenuItemHelpForum = new javax.swing.JMenuItem();
        jMenuItemHelpSystem = new javax.swing.JMenuItem();

        jMenuItemPopupMessageDetails.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/client/messagedetails16x16.gif"))); // NOI18N
        jMenuItemPopupMessageDetails.setText(this.rb.getResourceString("details"));
        jMenuItemPopupMessageDetails.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemPopupMessageDetailsActionPerformed(evt);
            }
        });
        jPopupMenu.add(jMenuItemPopupMessageDetails);

        jMenuItemPopupSendAgain.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/de/mendelson/comm/as2/client/send_16x16.gif"))); // NOI18N
        jMenuItemPopupSendAgain.setText(this.rb.getResourceString("menu.file.resend"));
        jMenuItemPopupSendAgain.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemPopupSendAgainActionPerformed(evt);
            }
        });
        jPopupMenu.add(jMenuItemPopupSendAgain);
        jPopupMenu.add(jSeparator9);

        jMenuItemPopupDeleteMessage.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/client/delete_16x16.gif"))); // NOI18N
        jMenuItemPopupDeleteMessage.setText(this.rb.getResourceString("delete.msg"));
        jMenuItemPopupDeleteMessage.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemPopupDeleteMessageActionPerformed(evt);
            }
        });
        jPopupMenu.add(jMenuItemPopupDeleteMessage);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setIconImage(new ImageIcon(AS2Gui.class.getResource("/de/mendelson/comm/as2/client/os_logo16x16.gif"))
                .getImage());
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });
        getContentPane().setLayout(new java.awt.GridBagLayout());

        jPanelLog.setLayout(new java.awt.BorderLayout());

        jToolBar.setFloatable(false);
        jToolBar.setRollover(true);

        jButtonPartner.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/partner/gui/singlepartner16x16.gif"))); // NOI18N
        jButtonPartner.setText(this.rb.getResourceString("menu.file.partner"));
        jButtonPartner.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonPartnerActionPerformed(evt);
            }
        });
        jToolBar.add(jButtonPartner);

        jButtonMessageDetails.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/client/messagedetails16x16.gif"))); // NOI18N
        jButtonMessageDetails.setText(this.rb.getResourceString("details"));
        jButtonMessageDetails.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonMessageDetailsActionPerformed(evt);
            }
        });
        jToolBar.add(jButtonMessageDetails);

        jButtonFilter.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/de/mendelson/comm/as2/client/filter16x16.gif"))); // NOI18N
        jButtonFilter.setText(this.rb.getResourceString("filter"));
        jButtonFilter.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonFilterActionPerformed(evt);
            }
        });
        jToolBar.add(jButtonFilter);

        jToggleButtonStopRefresh.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/de/mendelson/comm/as2/client/stop_16x16.gif"))); // NOI18N
        jToggleButtonStopRefresh.setText(this.rb.getResourceString("stoprefresh.msg"));
        jToggleButtonStopRefresh.setFocusable(false);
        jToggleButtonStopRefresh.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToggleButtonStopRefresh.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jToggleButtonStopRefreshActionPerformed(evt);
            }
        });
        jToolBar.add(jToggleButtonStopRefresh);

        jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jSeparator1.setMaximumSize(new java.awt.Dimension(5, 32767));
        jToolBar.add(jSeparator1);

        jButtonDeleteMessage.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/client/delete_16x16.gif"))); // NOI18N
        jButtonDeleteMessage.setText(this.rb.getResourceString("delete.msg"));
        jButtonDeleteMessage.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonDeleteMessageActionPerformed(evt);
            }
        });
        jToolBar.add(jButtonDeleteMessage);

        jPanelLog.add(jToolBar, java.awt.BorderLayout.NORTH);

        jPanelMain.setLayout(new java.awt.GridBagLayout());

        jSplitPane.setDividerLocation(300);
        jSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);

        jPanelMessageLog.setLayout(new java.awt.GridBagLayout());

        jPanelFilterOverview.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanelFilterOverview.setLayout(new java.awt.GridBagLayout());

        jCheckBoxFilterShowOk.setSelected(true);
        jCheckBoxFilterShowOk.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBoxFilterShowOkActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 0);
        jPanelFilterOverview.add(jCheckBoxFilterShowOk, gridBagConstraints);

        jCheckBoxFilterShowPending.setSelected(true);
        jCheckBoxFilterShowPending.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBoxFilterShowPendingActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 0);
        jPanelFilterOverview.add(jCheckBoxFilterShowPending, gridBagConstraints);

        jCheckBoxFilterShowStopped.setSelected(true);
        jCheckBoxFilterShowStopped.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBoxFilterShowStoppedActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 0);
        jPanelFilterOverview.add(jCheckBoxFilterShowStopped, gridBagConstraints);

        jLabelFilterShowOk.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/client/state_finished16x16.gif"))); // NOI18N
        jLabelFilterShowOk.setText(this.rb.getResourceString("filter.showfinished"));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
        jPanelFilterOverview.add(jLabelFilterShowOk, gridBagConstraints);

        jLabelFilterShowPending.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/client/state_pending16x16.gif"))); // NOI18N
        jLabelFilterShowPending.setText(this.rb.getResourceString("filter.showpending"));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
        jPanelFilterOverview.add(jLabelFilterShowPending, gridBagConstraints);

        jLabelFilterShowError.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/client/state_stopped16x16.gif"))); // NOI18N
        jLabelFilterShowError.setText(this.rb.getResourceString("filter.showstopped"));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
        jPanelFilterOverview.add(jLabelFilterShowError, gridBagConstraints);

        jButtonHideFilter.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/de/mendelson/comm/as2/client/hide_filter.gif"))); // NOI18N
        jButtonHideFilter.setMargin(new java.awt.Insets(0, 0, 0, 0));
        jButtonHideFilter.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonHideFilterActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 6;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
        jPanelFilterOverview.add(jButtonHideFilter, gridBagConstraints);

        jComboBoxFilterPartner.setMinimumSize(new java.awt.Dimension(100, 20));
        jComboBoxFilterPartner.setPreferredSize(new java.awt.Dimension(100, 22));
        jComboBoxFilterPartner.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboBoxFilterPartnerActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 4;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
        jPanelFilterOverview.add(jComboBoxFilterPartner, gridBagConstraints);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 5;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        jPanelFilterOverview.add(jPanelSpace, gridBagConstraints);

        jLabelFilterPartner.setText(this.rb.getResourceString("filter.partner"));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 3;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
        jPanelFilterOverview.add(jLabelFilterPartner, gridBagConstraints);

        jSeparator4.setOrientation(javax.swing.SwingConstants.VERTICAL);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 2;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridheight = 3;
        gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
        jPanelFilterOverview.add(jSeparator4, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST;
        gridBagConstraints.weightx = 1.0;
        jPanelMessageLog.add(jPanelFilterOverview, gridBagConstraints);

        jTableMessageOverview.setModel(new TableModelMessageOverview());
        jTableMessageOverview.setShowHorizontalLines(false);
        jTableMessageOverview.setShowVerticalLines(false);
        jTableMessageOverview.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jTableMessageOverviewMouseClicked(evt);
            }
        });
        jScrollPaneMessageOverview.setViewportView(jTableMessageOverview);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridheight = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        jPanelMessageLog.add(jScrollPaneMessageOverview, gridBagConstraints);

        jSplitPane.setLeftComponent(jPanelMessageLog);

        jPanelServerLog.setLayout(new java.awt.BorderLayout());
        jSplitPane.setRightComponent(jPanelServerLog);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        jPanelMain.add(jSplitPane, gridBagConstraints);

        jPanelRefreshWarning.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 0, 0)));
        jPanelRefreshWarning.setLayout(new java.awt.GridBagLayout());

        jLabelRefreshStopWarning.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabelRefreshStopWarning.setForeground(new java.awt.Color(204, 51, 0));
        jLabelRefreshStopWarning.setText(this.rb.getResourceString("warning.refreshstopped"));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10);
        jPanelRefreshWarning.add(jLabelRefreshStopWarning, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
        jPanelMain.add(jPanelRefreshWarning, gridBagConstraints);

        jPanelLog.add(jPanelMain, java.awt.BorderLayout.CENTER);

        jTabbedPane.addTab(this.rb.getResourceString("tab.transactions"), jPanelLog);
        jTabbedPane.addTab(this.rb.getResourceString("tab.welcome"), htmlPanel);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        getContentPane().add(jTabbedPane, gridBagConstraints);

        jPanelInfo.setLayout(new java.awt.GridBagLayout());

        jButtonNewVersion.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/client/newversion_16x16.gif"))); // NOI18N
        jButtonNewVersion.setToolTipText(this.rb.getResourceString("new.version"));
        jButtonNewVersion.setMargin(new java.awt.Insets(2, 5, 2, 5));
        jButtonNewVersion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonNewVersionActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
        jPanelInfo.add(jButtonNewVersion, gridBagConstraints);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        jPanelInfo.add(browserLinkedPanel, gridBagConstraints);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.weightx = 1.0;
        jPanelInfo.add(as2StatusBar, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.weightx = 1.0;
        getContentPane().add(jPanelInfo, gridBagConstraints);

        jMenuFile.setText(this.rb.getResourceString("menu.file"));

        jMenuItemManualSend.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/de/mendelson/comm/as2/client/send_16x16.gif"))); // NOI18N
        jMenuItemManualSend.setText(this.rb.getResourceString("menu.file.send"));
        jMenuItemManualSend.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemManualSendActionPerformed(evt);
            }
        });
        jMenuFile.add(jMenuItemManualSend);

        jMenuItemKeyRefresh.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/util/security/cert/gui/keyrefresh16x16.gif"))); // NOI18N
        jMenuItemKeyRefresh.setText(this.rb.getResourceString("keyrefresh"));
        jMenuItemKeyRefresh.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemKeyRefreshActionPerformed(evt);
            }
        });
        jMenuFile.add(jMenuItemKeyRefresh);
        jMenuFile.add(jSeparator2);

        jMenuItemFilePreferences.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/preferences/preferences16x16.gif"))); // NOI18N
        jMenuItemFilePreferences.setText(this.rb.getResourceString("menu.file.preferences"));
        jMenuItemFilePreferences.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemFilePreferencesActionPerformed(evt);
            }
        });
        jMenuFile.add(jMenuItemFilePreferences);

        jMenuItemPartner.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/partner/gui/singlepartner16x16.gif"))); // NOI18N
        jMenuItemPartner.setText(this.rb.getResourceString("menu.file.partner"));
        jMenuItemPartner.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemPartnerActionPerformed(evt);
            }
        });
        jMenuFile.add(jMenuItemPartner);
        jMenuFile.add(jSeparator3);

        jMenuItemExportConfig.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/importexport/export_16x16.gif"))); // NOI18N
        jMenuItemExportConfig.setText(this.rb.getResourceString("menu.file.export"));
        jMenuItemExportConfig.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemExportConfigActionPerformed(evt);
            }
        });
        jMenuFile.add(jMenuItemExportConfig);

        jMenuItemExportImport.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/importexport/import_16x16.gif"))); // NOI18N
        jMenuItemExportImport.setText(this.rb.getResourceString("menu.file.import"));
        jMenuItemExportImport.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemExportImportActionPerformed(evt);
            }
        });
        jMenuFile.add(jMenuItemExportImport);
        jMenuFile.add(jSeparator6);

        jMenuItemFileExit.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/de/mendelson/comm/as2/client/close16x16.gif"))); // NOI18N
        jMenuItemFileExit.setText(this.rb.getResourceString("menu.file.exit"));
        jMenuItemFileExit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemFileExitActionPerformed(evt);
            }
        });
        jMenuFile.add(jMenuItemFileExit);

        jMenuBar.add(jMenuFile);

        jMenuHelp.setText(this.rb.getResourceString("menu.help"));

        jMenuItemHelpAbout.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/client/os_logo16x16.gif"))); // NOI18N
        jMenuItemHelpAbout.setText(this.rb.getResourceString("menu.help.about"));
        jMenuItemHelpAbout.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemHelpAboutActionPerformed(evt);
            }
        });
        jMenuHelp.add(jMenuItemHelpAbout);
        jMenuHelp.add(jSeparator5);

        jMenuItemHelpShop.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/client/os_logo16x16.gif"))); // NOI18N
        jMenuItemHelpShop.setText(this.rb.getResourceString("menu.help.shop"));
        jMenuItemHelpShop.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemHelpShopActionPerformed(evt);
            }
        });
        jMenuHelp.add(jMenuItemHelpShop);

        jMenuItemHelpForum.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/client/os_logo16x16.gif"))); // NOI18N
        jMenuItemHelpForum.setText(this.rb.getResourceString("menu.help.forum"));
        jMenuItemHelpForum.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemHelpForumActionPerformed(evt);
            }
        });
        jMenuHelp.add(jMenuItemHelpForum);

        jMenuItemHelpSystem.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/de/mendelson/comm/as2/client/os_logo16x16.gif"))); // NOI18N
        jMenuItemHelpSystem.setText(this.rb.getResourceString("menu.help.helpsystem"));
        jMenuItemHelpSystem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemHelpSystemActionPerformed(evt);
            }
        });
        jMenuHelp.add(jMenuItemHelpSystem);

        jMenuBar.add(jMenuHelp);

        setJMenuBar(jMenuBar);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width - 749) / 2, (screenSize.height - 581) / 2, 749, 581);
    }// </editor-fold>//GEN-END:initComponents

    private void jMenuItemHelpForumActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemHelpForumActionPerformed
        try {
            URI uri = new URI("http://community.mendelson-e-c.com/forum/as2");
            Desktop.getDesktop().browse(uri);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }//GEN-LAST:event_jMenuItemHelpForumActionPerformed

    private void jMenuItemManualSendActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemManualSendActionPerformed
        this.sendFileManual();
    }//GEN-LAST:event_jMenuItemManualSendActionPerformed

    private void jButtonDeleteMessageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonDeleteMessageActionPerformed
        this.deleteSelectedMessages();
    }//GEN-LAST:event_jButtonDeleteMessageActionPerformed

    private void jButtonHideFilterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonHideFilterActionPerformed
        this.showFilterPanel = !this.showFilterPanel;
        this.jPanelFilterOverview.setVisible(this.showFilterPanel);
    }//GEN-LAST:event_jButtonHideFilterActionPerformed

    private void jCheckBoxFilterShowOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxFilterShowOkActionPerformed
        this.refreshThread.userRequestsOverviewRefresh();
        this.setButtonState();
    }//GEN-LAST:event_jCheckBoxFilterShowOkActionPerformed

    private void jCheckBoxFilterShowPendingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxFilterShowPendingActionPerformed
        this.refreshThread.userRequestsOverviewRefresh();
        this.setButtonState();
    }//GEN-LAST:event_jCheckBoxFilterShowPendingActionPerformed

    private void jCheckBoxFilterShowStoppedActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxFilterShowStoppedActionPerformed
        this.refreshThread.userRequestsOverviewRefresh();
        this.setButtonState();
    }//GEN-LAST:event_jCheckBoxFilterShowStoppedActionPerformed

    private void jButtonFilterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonFilterActionPerformed
        this.showFilterPanel = !this.showFilterPanel;
        this.jPanelFilterOverview.setVisible(this.showFilterPanel);
    }//GEN-LAST:event_jButtonFilterActionPerformed

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        this.savePreferences();
        try {
            if (this.configConnection != null) {
                this.configConnection.close();
            }
        } catch (Exception e) {
            //nop
        }
        try {
            if (this.runtimeConnection != null) {
                this.runtimeConnection.close();
            }
        } catch (Exception e) {
            //nop
        }
    }//GEN-LAST:event_formWindowClosing

    private void jButtonPartnerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonPartnerActionPerformed
        this.displayPartnerDialog();
        this.refreshThread.requestPartnerRefresh();
    }//GEN-LAST:event_jButtonPartnerActionPerformed

    private void jButtonMessageDetailsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonMessageDetailsActionPerformed
        this.showSelectedRowDetails();
    }//GEN-LAST:event_jButtonMessageDetailsActionPerformed

    private void jTableMessageOverviewMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTableMessageOverviewMouseClicked
        //double click on a row
        if (evt.getClickCount() == 2) {
            this.showSelectedRowDetails();
        }
    }//GEN-LAST:event_jTableMessageOverviewMouseClicked

    private void jMenuItemFilePreferencesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemFilePreferencesActionPerformed
        this.displayPreferences();
    }//GEN-LAST:event_jMenuItemFilePreferencesActionPerformed

    private void jMenuItemPartnerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemPartnerActionPerformed
        this.displayPartnerDialog();
        this.refreshThread.requestPartnerRefresh();
    }//GEN-LAST:event_jMenuItemPartnerActionPerformed

    private void jMenuItemHelpSystemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemHelpSystemActionPerformed
        this.displayHelpSystem();
    }//GEN-LAST:event_jMenuItemHelpSystemActionPerformed

    private void jMenuItemHelpAboutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemHelpAboutActionPerformed
        AboutDialog dialog = new AboutDialog(this);
        dialog.setVisible(true);
    }//GEN-LAST:event_jMenuItemHelpAboutActionPerformed

    private void jMenuItemFileExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemFileExitActionPerformed
        this.savePreferences();
        this.setVisible(false);
        try {
            if (this.configConnection != null) {
                this.configConnection.close();
            }
        } catch (Exception e) {
            //nop
        }
        try {
            if (this.runtimeConnection != null) {
                this.runtimeConnection.close();
            }
        } catch (Exception e) {
            //nop
        }
        this.logout();
        System.exit(0);
    }//GEN-LAST:event_jMenuItemFileExitActionPerformed

    private void jToggleButtonStopRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButtonStopRefreshActionPerformed
        this.jPanelRefreshWarning.setVisible(this.jToggleButtonStopRefresh.isSelected());
    }//GEN-LAST:event_jToggleButtonStopRefreshActionPerformed

    private void jComboBoxFilterPartnerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jComboBoxFilterPartnerActionPerformed
        this.refreshThread.userRequestsOverviewRefresh();
        this.setButtonState();
    }//GEN-LAST:event_jComboBoxFilterPartnerActionPerformed

    private void jMenuItemKeyRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemKeyRefreshActionPerformed
        //inform the server that the keystore should be reloaded, it has been changed outside
        RefreshKeystoreCertificates signal = new RefreshKeystoreCertificates();
        this.sendAsync(signal);
    }//GEN-LAST:event_jMenuItemKeyRefreshActionPerformed

    private void jButtonNewVersionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonNewVersionActionPerformed
        try {
            URI uri = new URI(new URL(this.downloadURLNewVersion).toExternalForm());
            if (Desktop.isDesktopSupported()) {
                Desktop.getDesktop().browse(uri);
            }
        } catch (Exception e) {
            this.getLogger().severe(e.getMessage());
        }
    }//GEN-LAST:event_jButtonNewVersionActionPerformed

    private void jMenuItemExportConfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemExportConfigActionPerformed
        this.performConfigurationExport();
    }//GEN-LAST:event_jMenuItemExportConfigActionPerformed

    private void jMenuItemExportImportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemExportImportActionPerformed
        this.performConfigurationImport();
    }//GEN-LAST:event_jMenuItemExportImportActionPerformed

    private void jMenuItemPopupMessageDetailsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemPopupMessageDetailsActionPerformed
        this.showSelectedRowDetails();
    }//GEN-LAST:event_jMenuItemPopupMessageDetailsActionPerformed

    private void jMenuItemPopupSendAgainActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemPopupSendAgainActionPerformed
        this.sendFileManualFromSelectedTransaction();
    }//GEN-LAST:event_jMenuItemPopupSendAgainActionPerformed

    private void jMenuItemPopupDeleteMessageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemPopupDeleteMessageActionPerformed
        this.deleteSelectedMessages();
    }//GEN-LAST:event_jMenuItemPopupDeleteMessageActionPerformed

    private void jMenuItemHelpShopActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemHelpShopActionPerformed
        try {
            URI uri = new URI("http://shop.mendelson-e-c.com");
            Desktop.getDesktop().browse(uri);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }//GEN-LAST:event_jMenuItemHelpShopActionPerformed
     // Variables declaration - do not modify//GEN-BEGIN:variables

    private de.mendelson.comm.as2.client.AS2StatusBar as2StatusBar;
    private de.mendelson.comm.as2.client.BrowserLinkedPanel browserLinkedPanel;
    private de.mendelson.comm.as2.client.HTMLPanel htmlPanel;
    private javax.swing.JButton jButtonDeleteMessage;
    private javax.swing.JButton jButtonFilter;
    private javax.swing.JButton jButtonHideFilter;
    private javax.swing.JButton jButtonMessageDetails;
    private javax.swing.JButton jButtonNewVersion;
    private javax.swing.JButton jButtonPartner;
    private javax.swing.JCheckBox jCheckBoxFilterShowOk;
    private javax.swing.JCheckBox jCheckBoxFilterShowPending;
    private javax.swing.JCheckBox jCheckBoxFilterShowStopped;
    private javax.swing.JComboBox jComboBoxFilterPartner;
    private javax.swing.JLabel jLabelFilterPartner;
    private javax.swing.JLabel jLabelFilterShowError;
    private javax.swing.JLabel jLabelFilterShowOk;
    private javax.swing.JLabel jLabelFilterShowPending;
    private javax.swing.JLabel jLabelRefreshStopWarning;
    private javax.swing.JMenuBar jMenuBar;
    private javax.swing.JMenu jMenuFile;
    private javax.swing.JMenu jMenuHelp;
    private javax.swing.JMenuItem jMenuItemExportConfig;
    private javax.swing.JMenuItem jMenuItemExportImport;
    private javax.swing.JMenuItem jMenuItemFileExit;
    private javax.swing.JMenuItem jMenuItemFilePreferences;
    private javax.swing.JMenuItem jMenuItemHelpAbout;
    private javax.swing.JMenuItem jMenuItemHelpForum;
    private javax.swing.JMenuItem jMenuItemHelpShop;
    private javax.swing.JMenuItem jMenuItemHelpSystem;
    private javax.swing.JMenuItem jMenuItemKeyRefresh;
    private javax.swing.JMenuItem jMenuItemManualSend;
    private javax.swing.JMenuItem jMenuItemPartner;
    private javax.swing.JMenuItem jMenuItemPopupDeleteMessage;
    private javax.swing.JMenuItem jMenuItemPopupMessageDetails;
    private javax.swing.JMenuItem jMenuItemPopupSendAgain;
    private javax.swing.JPanel jPanelFilterOverview;
    private javax.swing.JPanel jPanelInfo;
    private javax.swing.JPanel jPanelLog;
    private javax.swing.JPanel jPanelMain;
    private javax.swing.JPanel jPanelMessageLog;
    private javax.swing.JPanel jPanelRefreshWarning;
    private javax.swing.JPanel jPanelServerLog;
    private javax.swing.JPanel jPanelSpace;
    private javax.swing.JPopupMenu jPopupMenu;
    private javax.swing.JScrollPane jScrollPaneMessageOverview;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSeparator jSeparator2;
    private javax.swing.JSeparator jSeparator3;
    private javax.swing.JSeparator jSeparator4;
    private javax.swing.JSeparator jSeparator5;
    private javax.swing.JSeparator jSeparator6;
    private javax.swing.JPopupMenu.Separator jSeparator9;
    private javax.swing.JSplitPane jSplitPane;
    private javax.swing.JTabbedPane jTabbedPane;
    private de.mendelson.util.tables.JTableSortable jTableMessageOverview;
    private javax.swing.JToggleButton jToggleButtonStopRefresh;
    private javax.swing.JToolBar jToolBar;
    // End of variables declaration//GEN-END:variables

    @Override
    public void mouseClicked(MouseEvent evt) {
        if (evt.isPopupTrigger() || evt.isMetaDown()) {
            if (evt.getSource().equals(this.jTableMessageOverview)) {
                this.jPopupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
            }
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
    }

    @Override
    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
    }

    @Override
    public void popupMenuCanceled(PopupMenuEvent e) {
    }

    /**Checks at fixed interval if a refresh request is available. This prevents a refresh flooding
     * from the server on heavy load
     */
    private class RefreshThread implements Runnable {

        private boolean overviewRefreshRequested = true;
        private boolean partnerRefreshRequested = true;
        private LazyLoaderThread lazyLoader = null;

        @Override
        public void run() {
            boolean firstStart = true;
            while (true) {
                if (this.overviewRefreshRequested) {
                    this.overviewRefreshRequested = false;
                    this.refreshMessageOverviewList();
                }
                if (this.partnerRefreshRequested) {
                    this.partnerRefreshRequested = false;
                    this.refreshTablePartnerData();
                }
                if (firstStart) {
                    firstStart = false;
                    JTableColumnResizer.adjustColumnWidthByContent(AS2Gui.this.jTableMessageOverview);
                }
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (Exception e) {
                }
            }
        }

        public void userRequestsOverviewRefresh() {
            this.overviewRefreshRequested = true;
        }

        public void serverRequestsOverviewRefresh() {
            if (!AS2Gui.this.jToggleButtonStopRefresh.isSelected()) {
                this.overviewRefreshRequested = true;
            }
        }

        public void requestPartnerRefresh() {
            this.partnerRefreshRequested = true;
        }

        /**Reloads the partner ids with their names and passes these information
         *to the overview table. Also refreshes the partner filter.
         *
         */
        public void refreshTablePartnerData() {
            if (AS2Gui.this.configConnection == null) {
                return;
            }
            try {
                PartnerAccessDB partnerAccess = new PartnerAccessDB(AS2Gui.this.configConnection,
                        AS2Gui.this.runtimeConnection);
                Partner[] partner = partnerAccess.getPartner();
                Map<String, Partner> partnerMap = new HashMap<String, Partner>();
                for (int i = 0; i < partner.length; i++) {
                    partnerMap.put(partner[i].getAS2Identification(), partner[i]);
                }
                ((TableModelMessageOverview) AS2Gui.this.jTableMessageOverview.getModel()).passPartner(partnerMap);
                AS2Gui.this.updatePartnerFilter(partner);
            } catch (Exception e) {
                //nop
            }
        }

        /**Loads the payloads for the passed messages in the background*/
        private void lazyloadPayloads(final List<AS2Message> messageList) {
            this.lazyLoader = new LazyLoaderThread(messageList);
            Executors.newSingleThreadExecutor().submit(this.lazyLoader);
        }

        /**Refreshes the message overview list from the database.
         */
        private void refreshMessageOverviewList() {
            //the lazy load process from the last refresh is no longer needed
            if (this.lazyLoader != null) {
                this.lazyLoader.stopLazyLoad();
            }
            final String uniqueId = this.getClass().getName() + ".refreshMessageOverviewList."
                    + System.currentTimeMillis();
            //the sql connection is buld up after the client logged in to the server.
            //if a refresh signal is received during login time a Nullpointer will occur.
            if (AS2Gui.this.runtimeConnection == null) {
                //ignore request, client is not logged in
                return;
            }
            try {
                AS2Gui.this.as2StatusBar
                        .startProgressIndeterminate(AS2Gui.this.rb.getResourceString("refresh.overview"), uniqueId);
                MessageAccessDB messageAccess = new MessageAccessDB(AS2Gui.this.configConnection,
                        AS2Gui.this.runtimeConnection);
                MessageOverviewFilter filter = new MessageOverviewFilter();
                filter.setShowFinished(AS2Gui.this.jCheckBoxFilterShowOk.isSelected());
                filter.setShowPending(AS2Gui.this.jCheckBoxFilterShowPending.isSelected());
                filter.setShowStopped(AS2Gui.this.jCheckBoxFilterShowStopped.isSelected());
                if (AS2Gui.this.jComboBoxFilterPartner.getSelectedIndex() <= 0) {
                    filter.setShowPartner(null);
                } else {
                    filter.setShowPartner((Partner) AS2Gui.this.jComboBoxFilterPartner.getSelectedItem());
                }
                //                if (AS2Gui.this.jComboBoxFilterLocalStation.getSelectedIndex() <= 0) {
                //                    filter.setShowLocalStation(null);
                //                } else {
                //                    filter.setShowLocalStation((Partner) AS2Gui.this.jComboBoxFilterLocalStation.getSelectedItem());
                //                }
                //                if (AS2Gui.this.jComboBoxFilterDirection.getSelectedIndex() == 0) {
                //                    filter.setShowDirection(MessageOverviewFilter.DIRECTION_ALL);
                //                } else if (AS2Gui.this.jComboBoxFilterDirection.getSelectedIndex() == 1) {
                //                    filter.setShowDirection(MessageOverviewFilter.DIRECTION_IN);
                //                } else if (AS2Gui.this.jComboBoxFilterDirection.getSelectedIndex() == 2) {
                //                    filter.setShowDirection(MessageOverviewFilter.DIRECTION_OUT);
                //                }
                int countAll = 0;
                int countOk = 0;
                int countPending = 0;
                int countFailure = 0;
                int countSelected = 0;
                List<AS2MessageInfo> overviewList = messageAccess.getMessageOverview(filter);
                countAll = overviewList.size();
                List<AS2Message> messageList = new ArrayList<AS2Message>();
                for (AS2MessageInfo messageInfo : overviewList) {
                    AS2Message message = new AS2Message(messageInfo);
                    switch (messageInfo.getState()) {
                    case AS2Message.STATE_FINISHED:
                        countOk++;
                        break;
                    case AS2Message.STATE_PENDING:
                        countPending++;
                        break;
                    case AS2Message.STATE_STOPPED:
                        countFailure++;
                        break;
                    }
                    //add the payloads related to this message
                    messageList.add(message);
                }
                TableModelMessageOverview tableModel = (TableModelMessageOverview) AS2Gui.this.jTableMessageOverview
                        .getModel();
                tableModel.passNewData(messageList);
                this.lazyloadPayloads(messageList);
                //try to jump to latest entry
                try {
                    int rowCount = AS2Gui.this.jTableMessageOverview.getRowCount();
                    AS2Gui.this.jTableMessageOverview.getSelectionModel().setSelectionInterval(rowCount - 1,
                            rowCount - 1);
                    RefreshThread.this.makeRowVisible(AS2Gui.this.jTableMessageOverview, rowCount - 1);
                } catch (Throwable ignore) {
                    //nop
                }
                countSelected = AS2Gui.this.jTableMessageOverview.getSelectedRowCount();
                AS2Gui.this.as2StatusBar.setTransactionCount(countAll, countOk, countPending, countFailure,
                        countSelected);
            } catch (Exception e) {
                AS2Gui.this.getLogger().severe("refreshMessageOverviewList: " + e.getMessage());
            } finally {
                AS2Gui.this.as2StatusBar.stopProgressIfExists(uniqueId);
            }
        }

        /**Scrolls to an entry of the passed table
         * @param table Table to to scroll in
         * @param row Row to ensure visibility
         */
        private void makeRowVisible(final JTable table, final int row) {

            try {
                SwingUtilities.invokeAndWait(new Runnable() {

                    @Override
                    public void run() {
                        if (!table.isVisible()) {
                            return;
                        }
                        if (table.getColumnCount() == 0) {
                            return;
                        }
                        if (row < 0 || row >= table.getRowCount()) {
                            return;
                        }
                        try {
                            Rectangle visible = table.getVisibleRect();
                            Rectangle cell = table.getCellRect(row, 0, true);
                            if (cell.y < visible.y) {
                                visible.y = cell.y;
                                table.scrollRectToVisible(visible);
                            } else if (cell.y + cell.height > visible.y + visible.height) {
                                visible.y = cell.y + cell.height - visible.height;
                                table.scrollRectToVisible(visible);
                            }
                        } catch (Throwable e) {
                            //nop
                        }
                    }
                });
            } catch (Exception e) {
                //nop
            }
        }
    }

    private class LazyLoaderThread implements Runnable {

        private List<AS2Message> messageList = new ArrayList<AS2Message>();
        private boolean stopLazyLoad = false;

        public LazyLoaderThread(List<AS2Message> messageList) {
            this.messageList.addAll(messageList);
        }

        public void stopLazyLoad() {
            this.stopLazyLoad = true;
        }

        @Override
        public void run() {
            TableModelMessageOverview tableModel = (TableModelMessageOverview) AS2Gui.this.jTableMessageOverview
                    .getModel();
            MessageAccessDB messageAccess = new MessageAccessDB(AS2Gui.this.configConnection,
                    AS2Gui.this.runtimeConnection);
            for (AS2Message message : this.messageList) {
                //bail out, lazy load is no longer required because a new overview refresh occured
                if (this.stopLazyLoad) {
                    break;
                } else {
                    List<AS2Payload> payloads = messageAccess.getPayload(message.getAS2Info().getMessageId());
                    tableModel.passPayload(message, payloads);
                }
            }
        }
    }
}