/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.cids.client.tools; /*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ import Sirius.navigator.connection.Connection; import Sirius.navigator.connection.ConnectionFactory; import Sirius.navigator.connection.ConnectionInfo; import Sirius.navigator.connection.ConnectionSession; import Sirius.navigator.connection.SessionManager; import Sirius.navigator.connection.proxy.ConnectionProxy; import org.apache.log4j.Logger; import org.jdesktop.swingx.JXErrorPane; import org.jdesktop.swingx.JXLoginPane; import org.jdesktop.swingx.JXPanel; import org.jdesktop.swingx.auth.LoginService; import org.jdesktop.swingx.error.ErrorInfo; import java.awt.Frame; import java.text.DecimalFormat; import java.util.logging.Level; import javax.swing.SwingWorker; import de.cismet.cids.navigator.utils.ClassCacheMultiple; import de.cismet.cids.server.actions.BandwidthTestAction; import de.cismet.tools.gui.StaticSwingTools; import de.cismet.tools.gui.log4jquickconfig.Log4JQuickConfig; /* * Copyright (C) 2013 cismet GmbH * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ /** * DOCUMENT ME! * * @author jruiz * @version $Revision$, $Date$ */ public class BandwithTesterDialog extends javax.swing.JDialog { //~ Static fields/initializers --------------------------------------------- private static final Logger LOG = Logger.getLogger(BandwithTesterDialog.class); //~ Instance fields -------------------------------------------------------- private long startTimeMs; private long stopTimeMs; private final String domain; private final Integer fileSizeInMb; // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnClose; private javax.swing.JButton btnStartDownload; private javax.swing.JLabel jLabel1; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JProgressBar jProgressBar1; // End of variables declaration//GEN-END:variables //~ Constructors ----------------------------------------------------------- /** * Creates a new BandwithTesterDialog object. * * @param domain DOCUMENT ME! * @param fileSizeInMb DOCUMENT ME! */ public BandwithTesterDialog(final String domain, final Integer fileSizeInMb) { super(new javax.swing.JFrame(), true); this.domain = domain; this.fileSizeInMb = fileSizeInMb; initComponents(); } //~ Methods ---------------------------------------------------------------- /** * 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. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; jPanel1 = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); btnStartDownload = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); jProgressBar1 = new javax.swing.JProgressBar(); jPanel3 = new javax.swing.JPanel(); btnClose = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); setTitle(org.openide.util.NbBundle.getMessage(BandwithTesterDialog.class, "BandwithTesterDialog.title")); // NOI18N setMinimumSize(new java.awt.Dimension(400, 240)); setResizable(false); getContentPane().setLayout(new java.awt.GridBagLayout()); jPanel1.setLayout(new java.awt.BorderLayout()); jPanel2.setLayout(new java.awt.GridBagLayout()); org.openide.awt.Mnemonics.setLocalizedText( btnStartDownload, org.openide.util.NbBundle.getMessage( BandwithTesterDialog.class, "BandwithTesterDialog.btnStartDownload.text")); // NOI18N btnStartDownload.setActionCommand(org.openide.util.NbBundle.getMessage( BandwithTesterDialog.class, "BandwithTesterDialog.btnStartDownload.actionCommand")); // NOI18N btnStartDownload.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { btnStartDownloadActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 10); jPanel2.add(btnStartDownload, gridBagConstraints); org.openide.awt.Mnemonics.setLocalizedText( jLabel1, org.openide.util.NbBundle.getMessage(BandwithTesterDialog.class, "BandwithTesterDialog.jLabel1.text")); // NOI18N jLabel1.setMinimumSize(new java.awt.Dimension(300, 70)); jLabel1.setPreferredSize(new java.awt.Dimension(300, 70)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); jPanel2.add(jLabel1, gridBagConstraints); jProgressBar1.setString(org.openide.util.NbBundle.getMessage( BandwithTesterDialog.class, "BandwithTesterDialog.jProgressBar1.string")); // NOI18N jProgressBar1.setStringPainted(true); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); jPanel2.add(jProgressBar1, gridBagConstraints); jPanel1.add(jPanel2, java.awt.BorderLayout.CENTER); jPanel3.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT)); org.openide.awt.Mnemonics.setLocalizedText( btnClose, org.openide.util.NbBundle.getMessage(BandwithTesterDialog.class, "BandwithTesterDialog.btnClose.text")); // NOI18N btnClose.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { btnCloseActionPerformed(evt); } }); jPanel3.add(btnClose); jPanel1.add(jPanel3, java.awt.BorderLayout.SOUTH); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; getContentPane().add(jPanel1, gridBagConstraints); pack(); } // </editor-fold>//GEN-END:initComponents /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void btnCloseActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnCloseActionPerformed System.exit(0); } //GEN-LAST:event_btnCloseActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void btnStartDownloadActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnStartDownloadActionPerformed downloadStarted(); new SwingWorker<byte[], Object>() { @Override protected byte[] doInBackground() throws Exception { startTimeMs = System.currentTimeMillis(); final byte[] ret = downloadTestFile(domain, fileSizeInMb); stopTimeMs = System.currentTimeMillis(); return ret; } @Override protected void done() { try { final byte[] ret = get(); final long timeNeededMs = stopTimeMs - startTimeMs; downloadFinished(((long)ret.length * 8 * 1000) / timeNeededMs); } catch (final Exception ex) { downloadAborted(ex); LOG.error("error while executing swingworker", ex); final ErrorInfo errorInfo = new ErrorInfo( org.openide.util.NbBundle.getMessage( BandwithTesterDialog.class, "BandwithTesterDialog.error.title"), org.openide.util.NbBundle.getMessage( BandwithTesterDialog.class, "BandwithTesterDialog.error.message") + ex.getCause().getMessage(), null, null, ex, Level.ALL, null); JXErrorPane.showDialog(null, errorInfo); } } }.execute(); } //GEN-LAST:event_btnStartDownloadActionPerformed /** * DOCUMENT ME! */ private void downloadStarted() { jProgressBar1.setIndeterminate(true); btnStartDownload.setEnabled(false); jProgressBar1.setString(org.openide.util.NbBundle.getMessage( BandwithTesterDialog.class, "BandwidthTesterDialog.jProgressBar1.string.running")); } /** * DOCUMENT ME! * * @param ex DOCUMENT ME! */ private void downloadAborted(final Exception ex) { btnStartDownload.setEnabled(true); jProgressBar1.setIndeterminate(false); jProgressBar1.setString(org.openide.util.NbBundle.getMessage( BandwithTesterDialog.class, "BandwidthTesterDialog.jProgressBar1.string.error") + ex.getLocalizedMessage()); } /** * DOCUMENT ME! * * @param bandwith DOCUMENT ME! */ private void downloadFinished(final long bandwith) { btnStartDownload.setEnabled(true); jProgressBar1.setIndeterminate(false); final DecimalFormat df = new DecimalFormat("#.##"); if (bandwith < 1024) { jProgressBar1.setString(Long.toString(bandwith) + " Bit/s"); } else if (bandwith < 1048576) { jProgressBar1.setString(df.format(bandwith / 1024d) + " kBit/s"); } else { jProgressBar1.setString(df.format(bandwith / 1048576d) + " MBit/s"); } } /** * DOCUMENT ME! * * @param args the command line arguments */ public static void main(final String[] args) { Log4JQuickConfig.configure4LumbermillOnLocalhost(); final String callServerURL = args[0]; final String domain = args[1]; final Integer fileSize = Integer.valueOf(args[2]); /* Create and display the dialog */ java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { try { final BandwithTesterDialog dialog = new BandwithTesterDialog(domain, fileSize); dialog.login(callServerURL, domain); dialog.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(final java.awt.event.WindowEvent e) { System.exit(0); } }); dialog.pack(); StaticSwingTools.showDialog(dialog); System.exit(0); } catch (final Exception ex) { LOG.fatal("Fehler beim Starten des Bandbreiten-Testers.", ex); final ErrorInfo errorInfo = new ErrorInfo( org.openide.util.NbBundle.getMessage( BandwithTesterDialog.class, "BandwithTesterDialog.login.error.title"), org.openide.util.NbBundle.getMessage( BandwithTesterDialog.class, "BandwithTesterDialog.login.error.message"), null, null, ex, Level.ALL, null); JXErrorPane.showDialog(null, errorInfo); System.exit(1); } } }); } /** * DOCUMENT ME! * * @param domain DOCUMENT ME! * @param fileSizeInMb DOCUMENT ME! * * @return DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ private byte[] downloadTestFile(final String domain, final int fileSizeInMb) throws Exception { final Object ret = SessionManager.getProxy().executeTask( BandwidthTestAction.TASK_NAME, domain, fileSizeInMb); if (ret instanceof Exception) { throw (Exception)ret; } final byte[] fileContent = (byte[])ret; return fileContent; } /** * DOCUMENT ME! * * @param callServerURL DOCUMENT ME! * @param domain DOCUMENT ME! */ private void login(final String callServerURL, final String domain) { final CidsAuthentification cidsAuth = new CidsAuthentification(callServerURL, domain); final JXLoginPane login = new JXLoginPane(cidsAuth); final JXLoginPane.JXLoginDialog loginDialog = new JXLoginPane.JXLoginDialog((Frame)null, login); login.setPassword("".toCharArray()); try { ((JXPanel)((JXPanel)login.getComponent(1)).getComponent(1)).getComponent(3).requestFocus(); } catch (final Exception ex) { LOG.info("could nor request focus", ex); } StaticSwingTools.showDialog(loginDialog); if (loginDialog.getStatus() != JXLoginPane.Status.SUCCEEDED) { System.exit(0); } } //~ Inner Classes ---------------------------------------------------------- /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ class CidsAuthentification extends LoginService { //~ Static fields/initializers ----------------------------------------- public static final String CONNECTION_PROXY_CLASS = "Sirius.navigator.connection.proxy.DefaultConnectionProxyHandler"; public static final String CONNECTION_CLASS = "Sirius.navigator.connection.RESTfulConnection"; //~ Instance fields ---------------------------------------------------- private final String callServerURL; private final String domain; //~ Constructors ------------------------------------------------------- /** * Creates a new CidsAuthentification object. * * @param callServerURL DOCUMENT ME! * @param domain DOCUMENT ME! */ public CidsAuthentification(final String callServerURL, final String domain) { this.callServerURL = callServerURL; this.domain = domain; } //~ Methods ------------------------------------------------------------ /** * DOCUMENT ME! * * @param name DOCUMENT ME! * @param password DOCUMENT ME! * @param server DOCUMENT ME! * * @return DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ @Override public boolean authenticate(final String name, final char[] password, final String server) throws Exception { System.setProperty("sun.rmi.transport.connectionTimeout", "15"); final String[] split = name.split("@"); final String user = (split.length > 1) ? split[0] : name; final String group = (split.length > 1) ? split[1] : null; try { final Connection connection = ConnectionFactory.getFactory() .createConnection(CONNECTION_CLASS, callServerURL); final ConnectionInfo connectionInfo = new ConnectionInfo(); connectionInfo.setCallserverURL(callServerURL); connectionInfo.setPassword(new String(password)); connectionInfo.setUserDomain(domain); connectionInfo.setUsergroup(group); connectionInfo.setUsergroupDomain(domain); connectionInfo.setUsername(user); final ConnectionSession session = ConnectionFactory.getFactory() .createSession(connection, connectionInfo, true); final ConnectionProxy proxy = ConnectionFactory.getFactory() .createProxy(CONNECTION_PROXY_CLASS, session); SessionManager.init(proxy); ClassCacheMultiple.setInstance(domain); return true; } catch (Throwable t) { LOG.error("Fehler beim Anmelden", t); return false; } } } }