//$Header: /cvsroot-fuse/mec-as2/39/mendelson/comm/as2/client/manualsend/JDialogManualSend.java,v 1.1 2012/04/18 14:10:24 heller Exp $ package de.mendelson.comm.as2.client.manualsend; import de.mendelson.comm.as2.client.AS2StatusBar; import de.mendelson.util.security.cert.CertificateManager; import de.mendelson.comm.as2.partner.Partner; import de.mendelson.comm.as2.partner.PartnerAccessDB; import de.mendelson.comm.as2.partner.gui.ListCellRendererPartner; import de.mendelson.comm.as2.preferences.PreferencesAS2; import de.mendelson.util.LockingGlassPane; import de.mendelson.util.MecFileChooser; import de.mendelson.util.MecResourceBundle; import de.mendelson.util.clientserver.BaseClient; import de.mendelson.util.clientserver.clients.datatransfer.TransferClientWithProgress; import de.mendelson.util.clientserver.clients.preferences.PreferencesClient; import de.mendelson.util.security.BCCryptoHelper; import de.mendelson.util.security.cert.KeystoreStorage; import de.mendelson.util.security.cert.clientserver.KeystoreStorageImplClientServer; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.concurrent.Executors; import java.util.logging.Logger; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; /* * 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. */ /** * Dialog to send a file to a single partner * @author S.Heller * @version $Revision: 1.1 $ */ public class JDialogManualSend extends JDialog { /**ResourceBundle to localize the GUI*/ private MecResourceBundle rb = null; private Logger logger = Logger.getLogger("de.mendelson.as2.client"); private Partner[] localStations = null; private CertificateManager certificateManager = null; //DB connection for the partner access private Connection configConnection; private Connection runtimeConnection; private BaseClient baseClient; private AS2StatusBar statusbar; /**String that is displayed while the client uploads data to the server to send*/ private String uploadDisplay; /** Creates new form JDialogPartnerConfig * @param uploadDisplay String that is displayed while the client uploads data to the server to send */ public JDialogManualSend(JFrame parent, Connection configConnection, Connection runtimeConnection,BaseClient baseClient, AS2StatusBar statusbar, String uploadDisplay) { super(parent, true); this.configConnection = configConnection; this.runtimeConnection = runtimeConnection; this.statusbar = statusbar; this.uploadDisplay = uploadDisplay; //load resource bundle try { this.rb = (MecResourceBundle) ResourceBundle.getBundle( ResourceBundleManualSend.class.getName()); } catch (MissingResourceException e) { throw new RuntimeException("Oops..resource bundle " + e.getClassName() + " not found."); } this.baseClient = baseClient; this.setTitle(this.rb.getResourceString("title")); initComponents(); this.getRootPane().setDefaultButton(this.jButtonOk); //fill in data try { PartnerAccessDB partnerAccess = new PartnerAccessDB(this.configConnection, this.runtimeConnection); Partner[] partner = partnerAccess.getPartner(); for (int i = 0; i < partner.length; i++) { if (!partner[i].isLocalStation()) { this.jComboBoxPartner.addItem(partner[i]); } } this.localStations = partnerAccess.getLocalStations(); this.certificateManager = new CertificateManager(this.logger); //ask the server for the password PreferencesClient client = new PreferencesClient(baseClient); char[] keystorePass = client.get(PreferencesAS2.KEYSTORE_PASS).toCharArray(); String keystoreName = client.get(PreferencesAS2.KEYSTORE); KeystoreStorage storage = new KeystoreStorageImplClientServer( baseClient, keystoreName, keystorePass, BCCryptoHelper.KEYSTORE_PKCS12); this.certificateManager.loadKeystoreCertificates(storage); } catch (Exception e) { this.logger.severe("JDialogManualSend: " + e.getMessage()); } //single local stattion? No need to select the sender if (this.localStations.length == 1) { this.jLabelSender.setVisible(false); this.jComboBoxSender.setVisible(false); } else { this.jComboBoxSender.removeAllItems(); for (Partner localStation : this.localStations) { this.jComboBoxSender.addItem(localStation); } this.jComboBoxSender.setSelectedItem(0); } this.jComboBoxPartner.setRenderer(new ListCellRendererPartner()); this.jComboBoxSender.setRenderer(new ListCellRendererPartner()); this.setButtonState(); } /**Lock the component: Add a glasspane that prevents any action on the UI*/ private void lock() { //init glasspane for first use if (!(this.getGlassPane() instanceof LockingGlassPane)) { this.setGlassPane(new LockingGlassPane()); } this.getGlassPane().setVisible(true); this.getGlassPane().requestFocusInWindow(); } /**Unlock the component: remove the glasspane that prevents any action on the UI*/ private void unlock() { getGlassPane().setVisible(false); } /**Fills in some preselections for the file send dialog*/ public void initialize(Partner sender, Partner receiver, String filename) { this.jComboBoxPartner.setSelectedItem(receiver); this.jComboBoxSender.setSelectedItem(sender); this.jTextFieldFilename.setText(filename); this.setButtonState(); } /**Sets the ok and cancel buttons of this GUI*/ private void setButtonState() { this.jButtonOk.setEnabled( this.jTextFieldFilename.getText().length() > 0); } /**Will be executed on click to OK*/ public void performSend() throws Throwable { InputStream inStream = null; try { Partner receiver = (Partner) this.jComboBoxPartner.getSelectedItem(); File sendFile = new File(this.jTextFieldFilename.getText()); Partner sender = null; if (this.localStations.length == 1) { sender = this.localStations[0]; } else { sender = (Partner) this.jComboBoxSender.getSelectedItem(); } TransferClientWithProgress transferClient = new TransferClientWithProgress( this.baseClient, this.statusbar.getProgressPanel()); inStream = new FileInputStream(sendFile); //perform the upload to the server, chunked String uploadHash = transferClient.uploadChunkedWithProgress(inStream, this.uploadDisplay, (int) sendFile.length()); ManualSendRequest request = new ManualSendRequest(); request.setUploadHash(uploadHash); request.setFilename(sendFile.getName()); request.setReceiver(receiver); request.setSender(sender); ManualSendResponse response = (ManualSendResponse) transferClient.upload(request); if (response.getException() != null) { throw (response.getException()); } } finally { if (inStream != null) { inStream.close(); } } } private void okButtonPressed() { this.jButtonOk.setEnabled( false ); this.jButtonCancel.setEnabled( false ); Runnable runnable = new Runnable() { @Override public void run() { JDialogManualSend.this.lock(); try { //perform send has an own progress bar, no need to set one here JDialogManualSend.this.performSend(); //display success dialog JFrame parent = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, JDialogManualSend.this); JDialogManualSend.this.unlock(); JDialogManualSend.this.setVisible(false); JOptionPane.showMessageDialog(parent, JDialogManualSend.this.rb.getResourceString("send.success")); } catch (Throwable e) { JDialogManualSend.this.logger.warning("Manual send: " + e.getMessage()); } finally { JDialogManualSend.this.unlock(); JDialogManualSend.this.setVisible(false); JDialogManualSend.this.dispose(); } } }; Executors.newSingleThreadExecutor().submit(runnable); } /** 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; jPanelEdit = new javax.swing.JPanel(); jLabelIcon = new javax.swing.JLabel(); jLabelFilename = new javax.swing.JLabel(); jTextFieldFilename = new javax.swing.JTextField(); jPanel3 = new javax.swing.JPanel(); jLabelPartner = new javax.swing.JLabel(); jComboBoxPartner = new javax.swing.JComboBox(); jButtonBrowse = new javax.swing.JButton(); jComboBoxSender = new javax.swing.JComboBox(); jLabelSender = new javax.swing.JLabel(); jPanelButtons = new javax.swing.JPanel(); jButtonOk = new javax.swing.JButton(); jButtonCancel = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); getContentPane().setLayout(new java.awt.GridBagLayout()); jPanelEdit.setBorder(javax.swing.BorderFactory.createTitledBorder("")); jPanelEdit.setLayout(new java.awt.GridBagLayout()); jLabelIcon.setIcon(new javax.swing.ImageIcon(getClass().getResource("/de/mendelson/comm/as2/client/manualsend/send_32x32.gif"))); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); jPanelEdit.add(jLabelIcon, gridBagConstraints); jLabelFilename.setText(this.rb.getResourceString( "label.filename")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); jPanelEdit.add(jLabelFilename, gridBagConstraints); jTextFieldFilename.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(java.awt.event.KeyEvent evt) { jTextFieldFilenameKeyReleased(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); jPanelEdit.add(jTextFieldFilename, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.weighty = 1.0; jPanelEdit.add(jPanel3, gridBagConstraints); jLabelPartner.setText(this.rb.getResourceString( "label.partner")); 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, 5); jPanelEdit.add(jLabelPartner, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); jPanelEdit.add(jComboBoxPartner, gridBagConstraints); jButtonBrowse.setIcon(new javax.swing.ImageIcon(getClass().getResource("/de/mendelson/comm/as2/client/manualsend/folder.gif"))); // NOI18N jButtonBrowse.setToolTipText(this.rb.getResourceString( "button.browse")); jButtonBrowse.setMargin(new java.awt.Insets(2, 5, 2, 5)); jButtonBrowse.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButtonBrowseActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 3; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 10); jPanelEdit.add(jButtonBrowse, gridBagConstraints); jComboBoxSender.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); jPanelEdit.add(jComboBoxSender, gridBagConstraints); jLabelSender.setText(this.rb.getResourceString( "label.localstation")); 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, 5); jPanelEdit.add(jLabelSender, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); getContentPane().add(jPanelEdit, gridBagConstraints); jPanelButtons.setLayout(new java.awt.GridBagLayout()); jButtonOk.setText(this.rb.getResourceString( "button.ok" )); jButtonOk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButtonOkActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); jPanelButtons.add(jButtonOk, gridBagConstraints); jButtonCancel.setText(this.rb.getResourceString( "button.cancel" )); jButtonCancel.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButtonCancelActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); jPanelButtons.add(jButtonCancel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; getContentPane().add(jPanelButtons, gridBagConstraints); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-425)/2, (screenSize.height-245)/2, 425, 245); }// </editor-fold>//GEN-END:initComponents private void jButtonBrowseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonBrowseActionPerformed JFrame parent = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, this); MecFileChooser chooser = new MecFileChooser(parent, this.rb.getResourceString("label.selectfile")); chooser.browseFilename(this.jTextFieldFilename); this.setButtonState(); }//GEN-LAST:event_jButtonBrowseActionPerformed private void jTextFieldFilenameKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextFieldFilenameKeyReleased this.setButtonState(); }//GEN-LAST:event_jTextFieldFilenameKeyReleased private void jButtonCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonCancelActionPerformed this.setVisible(false); this.dispose(); }//GEN-LAST:event_jButtonCancelActionPerformed private void jButtonOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonOkActionPerformed this.okButtonPressed(); }//GEN-LAST:event_jButtonOkActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton jButtonBrowse; private javax.swing.JButton jButtonCancel; private javax.swing.JButton jButtonOk; private javax.swing.JComboBox jComboBoxPartner; private javax.swing.JComboBox jComboBoxSender; private javax.swing.JLabel jLabelFilename; private javax.swing.JLabel jLabelIcon; private javax.swing.JLabel jLabelPartner; private javax.swing.JLabel jLabelSender; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanelButtons; private javax.swing.JPanel jPanelEdit; private javax.swing.JTextField jTextFieldFilename; // End of variables declaration//GEN-END:variables }