//$Header: /cvsroot-fuse/mec-as2/39/mendelson/comm/as2/partner/gui/JDialogPartnerConfig.java,v 1.1 2012/04/18 14:10:32 heller Exp $
package de.mendelson.comm.as2.partner.gui;
import de.mendelson.comm.as2.client.AS2StatusBar;
import de.mendelson.util.security.cert.CertificateManager;
import de.mendelson.comm.as2.clientserver.message.PartnerConfigurationChanged;
import de.mendelson.comm.as2.partner.Partner;
import de.mendelson.comm.as2.partner.PartnerAccessDB;
import de.mendelson.comm.as2.preferences.PreferencesAS2;
import de.mendelson.util.ImageUtil;
import de.mendelson.util.LockingGlassPane;
import de.mendelson.util.MecResourceBundle;
import de.mendelson.util.clientserver.GUIClient;
import de.mendelson.util.clientserver.clients.fileoperation.FileOperationClient;
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.sql.Connection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
/*
* 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 configure the partner of the rosettanet server
* @author S.Heller
* @version $Revision: 1.1 $
*/
public class JDialogPartnerConfig extends JDialog {
/**Resource to locaize the GUI*/
private MecResourceBundle rb = null;
/**List of all available partner*/
private List<Partner> partnerList = new ArrayList<Partner>();
private JPanelPartner panelEditPartner = null;
private JTreePartner jTreePartner = null;
private PreferencesAS2 clientPreferences = new PreferencesAS2();
private CertificateManager certificateManager = null;
private GUIClient guiClient;
//DB connection
private Connection configConnection;
private Connection runtimeConnection;
private Logger logger = Logger.getLogger("de.mendelson.as2.client");
private AS2StatusBar status;
/** Creates new form JDialogMessageMapping */
public JDialogPartnerConfig(JFrame parent,
Connection configConnection, Connection runtimeConnection, GUIClient guiClient,
AS2StatusBar status) {
super(parent, true);
this.status = status;
this.configConnection = configConnection;
this.runtimeConnection = runtimeConnection;
this.guiClient = guiClient;
//load resource bundle
try {
this.rb = (MecResourceBundle) ResourceBundle.getBundle(
ResourceBundlePartnerConfig.class.getName());
} catch (MissingResourceException e) {
throw new RuntimeException("Oops..resource bundle " + e.getClassName() + " not found.");
}
this.certificateManager = new CertificateManager(this.logger);
try {
//ask the server for the keystore password
PreferencesClient client = new PreferencesClient(guiClient.getBaseClient());
char[] keystorePass = client.get(PreferencesAS2.KEYSTORE_PASS).toCharArray();
String keystoreName = client.get(PreferencesAS2.KEYSTORE);
KeystoreStorage storage = new KeystoreStorageImplClientServer(
guiClient.getBaseClient(), keystoreName, keystorePass, BCCryptoHelper.KEYSTORE_PKCS12);
this.certificateManager.loadKeystoreCertificates(storage);
} catch (Exception e) {
this.logger.severe(e.getMessage());
}
this.jTreePartner = new JTreePartner(this.configConnection, this.runtimeConnection);
this.initComponents();
this.jScrollPaneTree.setViewportView(this.jTreePartner);
this.panelEditPartner
= new JPanelPartner(this.guiClient.getBaseClient(), this.jTreePartner,
this.configConnection, this.runtimeConnection,
this.certificateManager, this.jButtonOk);
this.jPanelPartner.add(this.panelEditPartner);
this.getRootPane().setDefaultButton(this.jButtonOk);
try {
Partner[] partner = this.jTreePartner.buildTree();
this.partnerList.addAll(Arrays.asList(partner));
} catch (Exception e) {
JOptionPane.showMessageDialog(parent, e.getMessage());
return;
}
//mix up the add/edit/delete icons
ImageUtil imageUtil = new ImageUtil();
ImageIcon iconBase = new ImageIcon(this.getClass().
getResource("/de/mendelson/comm/as2/partner/gui/singlepartner16x16.gif"));
ImageIcon iconAdd = new ImageIcon(this.getClass().
getResource("/de/mendelson/comm/as2/partner/gui/mini_add.gif"));
ImageIcon iconDelete = new ImageIcon(this.getClass().
getResource("/de/mendelson/comm/as2/partner/gui/mini_delete.gif"));
ImageIcon iconMixedAdd = imageUtil.mixImages(iconBase, iconAdd);
ImageIcon iconMixedDelete = imageUtil.mixImages(iconBase, iconDelete);
this.jButtonNewPartner.setIcon(iconMixedAdd);
this.jButtonDeletePartner.setIcon(iconMixedDelete);
this.jTreePartner.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent evt) {
displayPartnerValues();
}
});
this.displayPartnerValues();
}
public void setDisplayNotificationPanel(boolean display) {
this.panelEditPartner.setDisplayNotificationPanel(display);
}
public void setDisplayHttpHeaderPanel(boolean display) {
this.panelEditPartner.setDisplayHttpHeaderPanel(display);
}
private void displayPartnerValues() {
DefaultMutableTreeNode selectedNode = this.jTreePartner.getSelectedNode();
if (selectedNode == null) {
return;
}
Partner selectedPartner = (Partner) selectedNode.getUserObject();
this.panelEditPartner.setPartner(selectedPartner, selectedNode);
}
private void deleteSelectedPartner() {
Partner partner = this.jTreePartner.getSelectedPartner();
if (partner != null) {
//ask the user if the partner should be really deleted, all data is lost
int requestValue = JOptionPane.showConfirmDialog(
this, this.rb.getResourceString("dialog.partner.delete.message", partner.getName()),
this.rb.getResourceString("dialog.partner.delete.title"),
JOptionPane.YES_NO_OPTION);
if (requestValue != JOptionPane.YES_OPTION) {
return;
}
partner = this.jTreePartner.deleteSelectedPartner();
if (partner != null) {
this.partnerList.remove(partner);
}
}
}
private boolean checkAllLocalStationsHavePrivateKeys() {
Partner[] localStations = this.jTreePartner.getLocalStations();
//no local station? should not happen
if (localStations == null || localStations.length == 0) {
return (false);
}
for (Partner localStation : localStations) {
String signSerial = localStation.getSignFingerprintSHA1();
String cryptSerial = localStation.getCryptFingerprintSHA1();
try {
this.certificateManager.getPrivateKeyByFingerprintSHA1(signSerial);
this.certificateManager.getPrivateKeyByFingerprintSHA1(cryptSerial);
} catch (Exception e) {
e.printStackTrace();
return (false);
}
}
return (true);
}
/**A partner name has been changed: Ask if the underlaying directory should be changed, too*/
private void handlePartnerNameChange(Partner existingPartner, Partner newPartner) {
//get the message path from the server
PreferencesClient preferences = new PreferencesClient(this.guiClient.getBaseClient());
String messageDir = preferences.get(PreferencesAS2.DIR_MSG);
int requestValue = JOptionPane.showConfirmDialog(
this, this.rb.getResourceString("dialog.partner.renamedir.message",
new Object[]{existingPartner.getName(), newPartner.getName(),
existingPartner.getMessagePath(messageDir)}),
this.rb.getResourceString("dialog.partner.renamedir.title"),
JOptionPane.YES_NO_OPTION);
if (requestValue != JOptionPane.YES_OPTION) {
return;
}
FileOperationClient fileClient = new FileOperationClient(this.guiClient.getBaseClient());
boolean success = fileClient.rename(existingPartner.getMessagePath(messageDir),
newPartner.getMessagePath(messageDir));
if (success) {
this.logger.log(Level.FINE, this.rb.getResourceString("directory.rename.success",
new Object[]{existingPartner.getMessagePath(messageDir),
newPartner.getMessagePath(messageDir)}));
} else {
this.logger.log(Level.SEVERE, this.rb.getResourceString("directory.rename.failure",
new Object[]{existingPartner.getMessagePath(messageDir),
newPartner.getMessagePath(messageDir)}));
}
}
private void handlePartnerDelete(Partner existingPartner) {
//get the message path from the server
PreferencesClient preferences = new PreferencesClient(this.guiClient.getBaseClient());
String messageDir = preferences.get(PreferencesAS2.DIR_MSG);
int requestValue = JOptionPane.showConfirmDialog(
this, this.rb.getResourceString("dialog.partner.deletedir.message",
new Object[]{existingPartner.getName(),
existingPartner.getMessagePath(messageDir)}),
this.rb.getResourceString("dialog.partner.deletedir.title"),
JOptionPane.YES_NO_OPTION);
if (requestValue != JOptionPane.YES_OPTION) {
return;
}
FileOperationClient fileClient = new FileOperationClient(this.guiClient.getBaseClient());
boolean success = fileClient.delete(existingPartner.getMessagePath(messageDir));
if (success) {
this.logger.log(Level.FINE, this.rb.getResourceString("directory.delete.success",
new Object[]{existingPartner.getMessagePath(messageDir)}));
} else {
this.logger.log(Level.SEVERE, this.rb.getResourceString("directory.delete.failure",
new Object[]{existingPartner.getMessagePath(messageDir)}));
}
}
/**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);
}
private void okPressed() {
//check if a local station is set
if (!JDialogPartnerConfig.this.jTreePartner.localStationIsSet()) {
JOptionPane.showMessageDialog(JDialogPartnerConfig.this,
JDialogPartnerConfig.this.rb.getResourceString("nolocalstation.message"),
JDialogPartnerConfig.this.rb.getResourceString("nolocalstation.title"),
JOptionPane.ERROR_MESSAGE);
return;
}
//check if the localstation contains a private key in security settings
if (!JDialogPartnerConfig.this.checkAllLocalStationsHavePrivateKeys()) {
JOptionPane.showMessageDialog(JDialogPartnerConfig.this,
JDialogPartnerConfig.this.rb.getResourceString("localstation.noprivatekey.message"),
JDialogPartnerConfig.this.rb.getResourceString("localstation.noprivatekey.title"),
JOptionPane.ERROR_MESSAGE);
return;
}
final String uniqueId = this.getClass().getName() + ".okPressed." + System.currentTimeMillis();
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
PartnerAccessDB access
= new PartnerAccessDB(JDialogPartnerConfig.this.configConnection, JDialogPartnerConfig.this.runtimeConnection);
//detect if a partner name has been changed
for (Partner newPartner : JDialogPartnerConfig.this.partnerList) {
if (newPartner.getDBId() != -1) {
Partner existingPartner = access.getPartner(newPartner.getDBId());
if (existingPartner != null && !newPartner.getName().equals(existingPartner.getName())) {
JDialogPartnerConfig.this.handlePartnerNameChange(existingPartner, newPartner);
}
}
}
//detect if a partner has been deleted
Partner[] existingPartnerArray = access.getPartner();
for (Partner existingPartner : existingPartnerArray) {
boolean doesStillExist = false;
for (Partner newPartner : JDialogPartnerConfig.this.partnerList) {
if (newPartner.getDBId() == existingPartner.getDBId()) {
doesStillExist = true;
break;
}
}
if (!doesStillExist) {
JDialogPartnerConfig.this.handlePartnerDelete(existingPartner);
}
}
JDialogPartnerConfig.this.lock();
//display wait indicator
JDialogPartnerConfig.this.status.startProgressIndeterminate(
JDialogPartnerConfig.this.rb.getResourceString("saving"), uniqueId);
Partner[] newPartnerArray = new Partner[JDialogPartnerConfig.this.partnerList.size()];
JDialogPartnerConfig.this.partnerList.toArray(newPartnerArray);
access.updatePartner(newPartnerArray);
//inform the server that the configuration has been changed
PartnerConfigurationChanged signal = new PartnerConfigurationChanged();
JDialogPartnerConfig.this.guiClient.sendAsync(signal);
} catch (Exception e) {
JDialogPartnerConfig.this.unlock();
JDialogPartnerConfig.this.status.stopProgressIfExists(uniqueId);
JFrame parent = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, JDialogPartnerConfig.this);
JOptionPane.showMessageDialog(parent, e.getMessage());
} finally {
JDialogPartnerConfig.this.unlock();
JDialogPartnerConfig.this.status.stopProgressIfExists(uniqueId);
JDialogPartnerConfig.this.setVisible(false);
JDialogPartnerConfig.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;
jToolBar = new javax.swing.JToolBar();
jButtonNewPartner = new javax.swing.JButton();
jButtonDeletePartner = new javax.swing.JButton();
jPanelMain = new javax.swing.JPanel();
jPanelPartnerMain = new javax.swing.JPanel();
jSplitPane = new javax.swing.JSplitPane();
jScrollPaneTree = new javax.swing.JScrollPane();
jPanelPartner = new javax.swing.JPanel();
jPanelButton = new javax.swing.JPanel();
jButtonOk = new javax.swing.JButton();
jButtonCancel = new javax.swing.JButton();
setTitle(this.rb.getResourceString( "title" ));
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
closeDialog(evt);
}
});
jToolBar.setFloatable(false);
jToolBar.setRollover(true);
jButtonNewPartner.setIcon(new javax.swing.ImageIcon(getClass().getResource("/de/mendelson/comm/as2/partner/gui/singlepartner16x16.gif"))); // NOI18N
jButtonNewPartner.setText(this.rb.getResourceString( "button.new"));
jButtonNewPartner.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButtonNewPartnerActionPerformed(evt);
}
});
jToolBar.add(jButtonNewPartner);
jButtonDeletePartner.setIcon(new javax.swing.ImageIcon(getClass().getResource("/de/mendelson/comm/as2/partner/gui/singlepartner16x16.gif"))); // NOI18N
jButtonDeletePartner.setText(this.rb.getResourceString( "button.delete"));
jButtonDeletePartner.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButtonDeletePartnerActionPerformed(evt);
}
});
jToolBar.add(jButtonDeletePartner);
getContentPane().add(jToolBar, java.awt.BorderLayout.NORTH);
jPanelMain.setLayout(new java.awt.GridBagLayout());
jPanelPartnerMain.setLayout(new java.awt.GridBagLayout());
jSplitPane.setDividerLocation(150);
jSplitPane.setLeftComponent(jScrollPaneTree);
jPanelPartner.setLayout(new java.awt.BorderLayout());
jSplitPane.setRightComponent(jPanelPartner);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
jPanelPartnerMain.add(jSplitPane, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
jPanelMain.add(jPanelPartnerMain, gridBagConstraints);
jPanelButton.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.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
jPanelButton.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.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
jPanelButton.add(jButtonCancel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
jPanelMain.add(jPanelButton, gridBagConstraints);
getContentPane().add(jPanelMain, java.awt.BorderLayout.CENTER);
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-841)/2, (screenSize.height-586)/2, 841, 586);
}// </editor-fold>//GEN-END:initComponents
private void jButtonDeletePartnerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonDeletePartnerActionPerformed
this.deleteSelectedPartner();
}//GEN-LAST:event_jButtonDeletePartnerActionPerformed
private void jButtonNewPartnerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonNewPartnerActionPerformed
Partner partner = this.jTreePartner.createNewPartner(this.certificateManager);
this.partnerList.add(partner);
}//GEN-LAST:event_jButtonNewPartnerActionPerformed
private void jTreePartnerValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_jTreePartnerValueChanged
}//GEN-LAST:event_jTreePartnerValueChanged
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.okPressed();
}//GEN-LAST:event_jButtonOkActionPerformed
/** Closes the dialog */
private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_closeDialog
setVisible(false);
this.dispose();
}//GEN-LAST:event_closeDialog
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButtonCancel;
private javax.swing.JButton jButtonDeletePartner;
private javax.swing.JButton jButtonNewPartner;
private javax.swing.JButton jButtonOk;
private javax.swing.JPanel jPanelButton;
private javax.swing.JPanel jPanelMain;
private javax.swing.JPanel jPanelPartner;
private javax.swing.JPanel jPanelPartnerMain;
private javax.swing.JScrollPane jScrollPaneTree;
private javax.swing.JSplitPane jSplitPane;
private javax.swing.JToolBar jToolBar;
// End of variables declaration//GEN-END:variables
}