/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.impl.wsdl.panels.project;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.WorkspaceImpl;
import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.impl.wsdl.support.HelpUrls;
import com.eviware.soapui.impl.wsdl.support.wss.IncomingWss;
import com.eviware.soapui.impl.wsdl.support.wss.OutgoingWss;
import com.eviware.soapui.impl.wsdl.support.wss.WssContainer;
import com.eviware.soapui.impl.wsdl.support.wss.WssCrypto;
import com.eviware.soapui.impl.wsdl.support.wss.WssEntry;
import com.eviware.soapui.impl.wsdl.support.wss.WssEntryRegistry;
import com.eviware.soapui.impl.wsdl.support.wss.crypto.CryptoType;
import com.eviware.soapui.impl.wsdl.support.wss.crypto.KeyMaterialWssCrypto;
import com.eviware.soapui.impl.wsdl.support.wss.entries.WssContainerListenerAdapter;
import com.eviware.soapui.impl.wsdl.support.wss.support.KeystoresComboBoxModel;
import com.eviware.soapui.model.support.ModelSupport;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.components.JXToolBar;
import com.eviware.soapui.support.swing.JTableFactory;
import javax.annotation.Nonnull;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
// FIXME Consider splitting this up into smaller entities for each main inner component and put all actions into separate files
public class WSSTabPanel extends JPanel {
private static final String ILLEGAL_CRYPTO_TYPE_MESSAGE = "Illegal crypto type";
private static final int ENTRIES_LIST_COMPONENT_WIDTH = 150;
private static final int MOVE_UP = -1;
private static final int MOVE_DOWN = 1;
@Nonnull
private JTable keystoreTable;
@Nonnull
private JTable truststoreTable;
@Nonnull
private RemoveCryptoAction removeKeystoreAction;
@Nonnull
private RemoveCryptoAction removeTruststoreAction;
private RemoveIncomingWssAction removeIncomingWssAction;
private JTable incomingWssTable;
private JComboBox incomingWssDecryptionCryptoComboBox;
private JComboBox incomingWssSignatureCryptoComboBox;
private JTable outgoingWssTable;
private RemoveOutgoingWssAction removeOutgoingWssAction;
private WssEntry selectedEntry;
private OutgoingWss selectedOutgoing;
private final WssContainer wssContainer;
private InternalWssContainerListener wssContainerListener;
private JButton addOutgoingEntryButton;
private JButton removeOutgoingEntryButton;
private JButton moveOutgoingEntryUpButton;
private JButton moveOutgoingEntryDownButton;
private JSplitPane entriesSplitPane;
private JScrollPane entriesListContainer;
private JList entriesList;
private DefaultListModel entriesListModel;
public WSSTabPanel(WssContainer wssContainer) {
super(new BorderLayout());
this.wssContainer = wssContainer;
wssContainerListener = new InternalWssContainerListener();
wssContainer.addWssContainerListener(wssContainerListener);
buildUI();
}
public void release() {
wssContainer.removeWssContainerListener(wssContainerListener);
((IncomingWssTableModel) incomingWssTable.getModel()).release();
((OutgoingWssTableModel) outgoingWssTable.getModel()).release();
((CryptoTableModel) keystoreTable.getModel()).release();
((CryptoTableModel) truststoreTable.getModel()).release();
((KeystoresComboBoxModel) incomingWssDecryptionCryptoComboBox.getModel()).release();
((KeystoresComboBoxModel) incomingWssSignatureCryptoComboBox.getModel()).release();
entriesListModel.removeAllElements();
}
private void buildUI() {
add(buildMainToolbar(), BorderLayout.NORTH);
add(buildContent(), BorderLayout.CENTER);
}
private Component buildMainToolbar() {
JXToolBar toolbar = UISupport.createSmallToolbar();
toolbar.addGlue();
toolbar.addFixed(UISupport.createToolbarButton(new ShowOnlineHelpAction(HelpUrls.WSS_HELP_URL)));
return toolbar;
}
private JComponent buildContent() {
JTabbedPane tabs = new JTabbedPane();
tabs.addTab("Outgoing WS-Security Configurations", buildOutgoingConfigurationsTab());
tabs.addTab("Incoming WS-Security Configurations", buildIncomingConfigurationsTab());
tabs.addTab("Keystores", buildCryptoTable(CryptoType.KEYSTORE));
tabs.addTab("Truststores", buildCryptoTable(CryptoType.TRUSTSTORE));
tabs.setMinimumSize(new Dimension(10, 10));
return UISupport.createTabPanel(tabs, true);
}
private JPanel buildOutgoingConfigurationsTab() {
outgoingWssTable = JTableFactory.getInstance().makeJTable(new OutgoingWssTableModel());
outgoingWssTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
int selectedRow = outgoingWssTable.getSelectedRow();
selectedOutgoing = selectedRow == -1 ? null : wssContainer.getOutgoingWssAt(selectedRow);
removeOutgoingWssAction.setEnabled(selectedRow != -1);
addOutgoingEntryButton.setEnabled(selectedRow != -1);
if (selectedOutgoing != null) {
entriesListModel.removeAllElements();
for (WssEntry entry : selectedOutgoing.getEntries()) {
entriesListModel.addElement(entry);
}
entriesListContainer.getViewport().add(entriesList);
entriesSplitPane.setRightComponent(new JPanel());
}
entriesSplitPane.setDividerLocation(ENTRIES_LIST_COMPONENT_WIDTH);
}
});
outgoingWssTable.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(new JPasswordField()));
outgoingWssTable.getColumnModel().getColumn(2).setCellRenderer(new PasswordTableCellRenderer());
JPanel outgoingConfigurationSplitPane = new JPanel(new BorderLayout());
JSplitPane split = UISupport.createVerticalSplit(new JScrollPane(outgoingWssTable), buildOutgoingWssDetails());
split.setDividerLocation(140);
outgoingConfigurationSplitPane.add(buildOutgoingWssToolbar(), BorderLayout.NORTH);
outgoingConfigurationSplitPane.add(split, BorderLayout.CENTER);
JPanel outgoingConfigurationsPanel = new JPanel(new BorderLayout());
outgoingConfigurationsPanel.add(outgoingConfigurationSplitPane, BorderLayout.CENTER);
return outgoingConfigurationsPanel;
}
private Component buildOutgoingWssToolbar() {
JXToolBar toolbar = UISupport.createSmallToolbar();
toolbar.addFixed(UISupport.createToolbarButton(new AddOutgoingWssAction()));
removeOutgoingWssAction = new RemoveOutgoingWssAction();
toolbar.addFixed(UISupport.createToolbarButton(removeOutgoingWssAction));
toolbar.addGlue();
toolbar.addFixed(UISupport.createToolbarButton(new ShowOnlineHelpAction(HelpUrls.OUTGOINGWSS_HELP_URL)));
return toolbar;
}
private Component buildOutgoingWssDetails() {
JPanel panel = new JPanel(new BorderLayout());
panel.add(buildOutgoingEntriesToolbar(), BorderLayout.NORTH);
panel.add(buildOutgoingEntryList(), BorderLayout.CENTER);
return panel;
}
private Component buildOutgoingEntriesToolbar() {
JXToolBar toolbar = UISupport.createSmallToolbar();
addOutgoingEntryButton = UISupport.createToolbarButton(new AddOutgoingEntryAction(), false);
toolbar.addFixed(addOutgoingEntryButton);
removeOutgoingEntryButton = UISupport.createToolbarButton(new RemoveOutgoingEntryAction(), false);
toolbar.addFixed(removeOutgoingEntryButton);
moveOutgoingEntryUpButton = UISupport.createToolbarButton(new MoveOutgoingEntryUpAction(), false);
toolbar.addFixed(moveOutgoingEntryUpButton);
moveOutgoingEntryDownButton = UISupport.createToolbarButton(new MoveOutgoingEntryDownAction(), false);
toolbar.addFixed(moveOutgoingEntryDownButton);
return toolbar;
}
private Component buildOutgoingEntryList() {
entriesSplitPane = UISupport.createHorizontalSplit();
entriesListContainer = new JScrollPane();
entriesListContainer.setMinimumSize(new Dimension(ENTRIES_LIST_COMPONENT_WIDTH, ENTRIES_LIST_COMPONENT_WIDTH));
entriesSplitPane.setLeftComponent(entriesListContainer);
entriesSplitPane.setDividerLocation(ENTRIES_LIST_COMPONENT_WIDTH);
setEntriesSplitPaneToEmpty();
entriesList = new JList();
entriesListModel = new DefaultListModel();
entriesList.setModel(entriesListModel);
entriesList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
int selectedIndex = entriesList.getSelectedIndex();
selectedEntry = (entriesList.getSelectedIndex() == -1 ? null : (WssEntry) entriesListModel
.get(selectedIndex));
removeOutgoingEntryButton.setEnabled(selectedEntry != null);
moveOutgoingEntryUpButton.setEnabled(selectedIndex > 0);
moveOutgoingEntryDownButton.setEnabled(selectedIndex > -1
&& selectedIndex < (entriesListModel.getSize() - 1));
if (selectedEntry != null) {
entriesSplitPane.setRightComponent(selectedEntry.getConfigurationPanel());
}
entriesSplitPane.setDividerLocation(ENTRIES_LIST_COMPONENT_WIDTH);
}
});
return entriesSplitPane;
}
private JPanel buildIncomingConfigurationsTab() {
incomingWssTable = JTableFactory.getInstance().makeJTable(new IncomingWssTableModel());
incomingWssTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
removeIncomingWssAction.setEnabled(incomingWssTable.getSelectedRow() != -1);
}
});
JPanel panel = new JPanel(new BorderLayout());
JPanel p = new JPanel(new BorderLayout());
p.add(buildIncomingWssToolbar(), BorderLayout.NORTH);
incomingWssDecryptionCryptoComboBox = new JComboBox(new KeystoresComboBoxModel(wssContainer, null, false));
incomingWssTable.getColumnModel().getColumn(1)
.setCellEditor(new DefaultCellEditor(incomingWssDecryptionCryptoComboBox));
incomingWssSignatureCryptoComboBox = new JComboBox(new KeystoresComboBoxModel(wssContainer, null, false));
incomingWssTable.getColumnModel().getColumn(2)
.setCellEditor(new DefaultCellEditor(incomingWssSignatureCryptoComboBox));
incomingWssTable.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(new JPasswordField()));
incomingWssTable.getColumnModel().getColumn(3).setCellRenderer(new PasswordTableCellRenderer());
p.add(new JScrollPane(incomingWssTable), BorderLayout.CENTER);
panel.add(p, BorderLayout.CENTER);
return panel;
}
private Component buildIncomingWssToolbar() {
JXToolBar toolbar = UISupport.createSmallToolbar();
toolbar.addFixed(UISupport.createToolbarButton(new AddIncomingWssAction()));
removeIncomingWssAction = new RemoveIncomingWssAction();
toolbar.addFixed(UISupport.createToolbarButton(removeIncomingWssAction));
toolbar.addGlue();
toolbar.addFixed(UISupport.createToolbarButton(new ShowOnlineHelpAction(HelpUrls.INCOMINGWSS_HELP_URL)));
return toolbar;
}
private JPanel buildCryptoTable(final CryptoType cryptoType) {
final JTable cryptoTable = JTableFactory.getInstance().makeJTable(new CryptoTableModel(cryptoType));
switch (cryptoType) {
case KEYSTORE:
keystoreTable = cryptoTable;
break;
case TRUSTSTORE:
truststoreTable = cryptoTable;
break;
default:
throw new IllegalArgumentException(ILLEGAL_CRYPTO_TYPE_MESSAGE);
}
JPanel panel = new JPanel(new BorderLayout());
JPanel p = new JPanel(new BorderLayout());
p.add(buildCryptoToolbar(cryptoType), BorderLayout.NORTH);
cryptoTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
switch (cryptoType) {
case KEYSTORE:
removeKeystoreAction.setEnabled(cryptoTable.getSelectedRow() != -1);
break;
case TRUSTSTORE:
removeTruststoreAction.setEnabled(cryptoTable.getSelectedRow() != -1);
break;
default:
throw new IllegalArgumentException(ILLEGAL_CRYPTO_TYPE_MESSAGE);
}
}
});
cryptoTable.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(new JPasswordField()));
cryptoTable.getColumnModel().getColumn(2).setCellRenderer(new PasswordTableCellRenderer());
cryptoTable.getColumnModel().getColumn(4).setCellEditor(new DefaultCellEditor(new JPasswordField()));
cryptoTable.getColumnModel().getColumn(4).setCellRenderer(new PasswordTableCellRenderer());
p.add(new JScrollPane(cryptoTable), BorderLayout.CENTER);
panel.add(p, BorderLayout.CENTER);
return panel;
}
private Component buildCryptoToolbar(CryptoType cryptoType) {
JXToolBar toolbar = UISupport.createSmallToolbar();
toolbar.addFixed(UISupport.createToolbarButton(new AddCryptoAction(cryptoType)));
RemoveCryptoAction removeCryptoAction = new RemoveCryptoAction(cryptoType);
switch (cryptoType) {
case KEYSTORE:
removeKeystoreAction = removeCryptoAction;
break;
case TRUSTSTORE:
removeTruststoreAction = removeCryptoAction;
break;
default:
throw new IllegalArgumentException(ILLEGAL_CRYPTO_TYPE_MESSAGE);
}
toolbar.addFixed(UISupport.createToolbarButton(removeCryptoAction));
toolbar.addGlue();
toolbar.addFixed(UISupport.createToolbarButton(new ShowOnlineHelpAction(HelpUrls.CRYPTOSWSS_HELP_URL)));
return toolbar;
}
private void setEntriesSplitPaneToEmpty() {
entriesListContainer.getViewport().add(new JList());
entriesSplitPane.setRightComponent(new JPanel());
}
private JTable getCryptoTable(CryptoType cryptoType) {
switch (cryptoType) {
case KEYSTORE:
return keystoreTable;
case TRUSTSTORE:
return truststoreTable;
default:
throw new IllegalArgumentException(ILLEGAL_CRYPTO_TYPE_MESSAGE);
}
}
// :: Table models ::
public class OutgoingWssTableModel extends AbstractTableModel {
private List<OutgoingWss> outgoingWss;
public OutgoingWssTableModel() {
outgoingWss = wssContainer.getOutgoingWssList();
}
public void release() {
outgoingWss = null;
}
public int getColumnCount() {
return 5;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "Name";
case 1:
return "Default Username/Alias";
case 2:
return "Default Password";
case 3:
return "Actor";
case 4:
return "Must Understand";
}
return null;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return columnIndex == 4 ? Boolean.class : String.class;
}
public int getRowCount() {
return outgoingWss == null ? 0 : outgoingWss.size();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex > 0;
}
public Object getValueAt(int rowIndex, int columnIndex) {
OutgoingWss outgoing = outgoingWss.get(rowIndex);
switch (columnIndex) {
case 0:
return outgoing.getName();
case 1:
return outgoing.getUsername();
case 2:
return outgoing.getPassword();
case 3:
return outgoing.getActor();
case 4:
return outgoing.getMustUnderstand();
}
return null;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
OutgoingWss outgoing = outgoingWss.get(rowIndex);
switch (columnIndex) {
case 1:
outgoing.setUsername(aValue == null ? null : aValue.toString());
break;
case 2:
outgoing.setPassword(aValue == null ? null : aValue.toString());
break;
case 3:
outgoing.setActor(aValue == null ? null : aValue.toString());
break;
case 4:
outgoing.setMustUnderstand(aValue == null ? false : (Boolean) aValue);
break;
}
}
public void outgoingWssAdded(OutgoingWss outgoing) {
outgoingWss.add(outgoing);
fireTableRowsInserted(outgoingWss.size() - 1, outgoingWss.size() - 1);
}
public void outgoingWssRemoved(OutgoingWss outgoing) {
int ix = outgoingWss.indexOf(outgoing);
if (ix != -1) {
outgoingWss.remove(ix);
fireTableRowsDeleted(ix, ix);
}
}
}
public class IncomingWssTableModel extends AbstractTableModel {
private List<IncomingWss> incomingWss;
public IncomingWssTableModel() {
incomingWss = wssContainer.getIncomingWssList();
}
public void release() {
incomingWss = null;
}
public int getColumnCount() {
return 4;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "Name";
case 1:
return "Decrypt Keystore";
case 2:
return "Signature Keystore";
case 3:
return "Password";
}
return null;
}
public int getRowCount() {
return incomingWss == null ? 0 : incomingWss.size();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex > 0;
}
public Object getValueAt(int rowIndex, int columnIndex) {
IncomingWss incoming = incomingWss.get(rowIndex);
switch (columnIndex) {
case 0:
return incoming.getName();
case 1:
return wssContainer.getCryptoByName(incoming.getDecryptCrypto());
case 2:
return wssContainer.getCryptoByName(incoming.getSignatureCrypto());
case 3:
return incoming.getDecryptPassword();
}
return null;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
IncomingWss incoming = incomingWss.get(rowIndex);
switch (columnIndex) {
case 1:
incoming.setDecryptCrypto(aValue == null ? null : aValue.toString());
break;
case 2:
incoming.setSignatureCrypto(aValue == null ? null : aValue.toString());
break;
case 3:
incoming.setDecryptPassword(aValue == null ? null : aValue.toString());
break;
}
}
public void incomingWssAdded(IncomingWss incoming) {
incomingWss.add(incoming);
fireTableRowsInserted(incomingWss.size() - 1, incomingWss.size() - 1);
}
public void incomingWssRemoved(IncomingWss incoming) {
int ix = incomingWss.indexOf(incoming);
if (ix != -1) {
incomingWss.remove(ix);
fireTableRowsDeleted(ix, ix);
}
}
}
public class CryptoTableModel extends AbstractTableModel {
private static final String DEFAULT_OPTION = "<Default>";
private List<WssCrypto> cryptos;
public CryptoTableModel(CryptoType cryptoType) {
cryptos = new ArrayList<WssCrypto>();
for (WssCrypto crypto : wssContainer.getCryptoList()) {
if (crypto.getType() == cryptoType) {
cryptos.add(crypto);
}
}
}
public void release() {
cryptos = null;
}
public int getColumnCount() {
// FIXME: Why not remove??
// hide last column since this is autodetected in commons-ssl-0.3.10
return 5;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "Source";
case 1:
return "Status";
case 2:
return "Password";
case 3:
return "Default Alias";
case 4:
return "Alias Password";
case 5:
return "Security Provider";
}
return null;
}
public int getRowCount() {
return cryptos == null ? 0 : cryptos.size();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex > 1;
}
public Object getValueAt(int rowIndex, int columnIndex) {
KeyMaterialWssCrypto crypto = (KeyMaterialWssCrypto) cryptos.get(rowIndex);
switch (columnIndex) {
case 0:
return crypto.getSource();
case 1:
return crypto.getStatus();
case 2:
return crypto.getPassword();
case 3:
return crypto.getDefaultAlias();
case 4:
return crypto.getAliasPassword();
case 5:
return StringUtils.hasContent(crypto.getCryptoProvider()) ? crypto.getCryptoProvider() : DEFAULT_OPTION;
}
return null;
}
public WssCrypto getCryptoAt(int row) {
return cryptos.get(row);
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
KeyMaterialWssCrypto crypto = (KeyMaterialWssCrypto) cryptos.get(rowIndex);
if (aValue == null || aValue.equals(DEFAULT_OPTION)) {
aValue = "";
}
switch (columnIndex) {
case 2:
crypto.setPassword(aValue.toString());
break;
case 3:
crypto.setDefaultAlias(aValue.toString());
break;
case 4:
crypto.setAliasPassword(aValue.toString());
break;
case 5:
crypto.setCryptoProvider(aValue.toString());
break;
}
}
public void cryptoAdded(WssCrypto crypto) {
cryptos.add(crypto);
fireTableRowsInserted(cryptos.size() - 1, cryptos.size() - 1);
}
public void cryptoRemoved(WssCrypto crypto) {
int ix = cryptos.indexOf(crypto);
if (ix != -1) {
cryptos.remove(ix);
fireTableRowsDeleted(ix, ix);
}
}
}
// :: Actions ::
private class AddOutgoingWssAction extends AbstractAction {
public AddOutgoingWssAction() {
putValue(SMALL_ICON, UISupport.createImageIcon("/add.png"));
putValue(SHORT_DESCRIPTION, "Adds a new Outgoing WSS Configuration");
}
public void actionPerformed(ActionEvent e) {
String name = UISupport.prompt("Specify unique name for configuration", "New Outgoing WSS Configuration", "");
if (StringUtils.hasContent(name) && wssContainer.getOutgoingWssByName(name) == null) {
wssContainer.addOutgoingWss(name);
outgoingWssTable.setRowSelectionInterval(outgoingWssTable.getRowCount() - 1,
outgoingWssTable.getRowCount() - 1);
}
}
}
private class RemoveOutgoingWssAction extends AbstractAction {
public RemoveOutgoingWssAction() {
putValue(SMALL_ICON, UISupport.createImageIcon("/delete.png"));
putValue(SHORT_DESCRIPTION, "Removes the selected Outgoing WSS Configuration");
setEnabled(false);
}
public void actionPerformed(ActionEvent e) {
int row = outgoingWssTable.getSelectedRow();
if (row == -1) {
return;
}
if (UISupport.confirm("Removes selected configuration?", "Remove Configuration")) {
wssContainer.removeOutgoingWssAt(row);
setEntriesSplitPaneToEmpty();
}
}
}
public class AddOutgoingEntryAction extends AbstractAction {
public AddOutgoingEntryAction() {
putValue(SHORT_DESCRIPTION, "Adds a new WSS Entry");
putValue(SMALL_ICON, UISupport.createImageIcon("/add.png"));
setEnabled(false);
}
public void actionPerformed(ActionEvent e) {
if (selectedOutgoing == null) {
return;
}
String type = UISupport.prompt("Select type of entry to add", "Add WSS Entry", WssEntryRegistry.get()
.getTypes());
if (type != null) {
selectedOutgoing.addEntry(type);
entriesList.setSelectedIndex(entriesListModel.getSize() - 1);
}
}
}
public class RemoveOutgoingEntryAction extends AbstractAction {
public RemoveOutgoingEntryAction() {
putValue(SHORT_DESCRIPTION, "Removes the selected WSS-Entry");
putValue(SMALL_ICON, UISupport.createImageIcon("/delete.png"));
}
public void actionPerformed(ActionEvent e) {
if (selectedEntry == null) {
return;
}
if (UISupport.confirm("Remove entry [" + selectedEntry.getLabel() + "]", "Remove WSS Entry")) {
selectedOutgoing.removeEntry(selectedEntry);
entriesSplitPane.setRightComponent(new JPanel());
}
}
}
private class MoveOutgoingEntryUpAction extends AbstractAction {
public MoveOutgoingEntryUpAction() {
super("Move entry Up");
putValue(Action.SHORT_DESCRIPTION, "Moves selected entry up one row");
putValue(Action.SMALL_ICON, UISupport.createImageIcon("/up_arrow.gif"));
}
public void actionPerformed(ActionEvent e) {
selectedOutgoing.moveEntry(selectedEntry, MOVE_UP);
}
}
private class MoveOutgoingEntryDownAction extends AbstractAction {
public MoveOutgoingEntryDownAction() {
super("Move entry Down");
putValue(Action.SHORT_DESCRIPTION, "Moves selected entry down one row");
putValue(Action.SMALL_ICON, UISupport.createImageIcon("/down_arrow.gif"));
}
public void actionPerformed(ActionEvent e) {
selectedOutgoing.moveEntry(selectedEntry, MOVE_DOWN);
}
}
private class AddIncomingWssAction extends AbstractAction {
public AddIncomingWssAction() {
putValue(SMALL_ICON, UISupport.createImageIcon("/add.png"));
putValue(SHORT_DESCRIPTION, "Adds a new Incoming WSS Configuration");
}
public void actionPerformed(ActionEvent e) {
String name = UISupport.prompt("Specify unique name for configuration", "New Incoming WSS Configuration", "");
if (StringUtils.hasContent(name) && wssContainer.getIncomingWssByName(name) == null) {
wssContainer.addIncomingWss(name);
incomingWssTable.setRowSelectionInterval(incomingWssTable.getRowCount() - 1,
incomingWssTable.getRowCount() - 1);
}
}
}
private class RemoveIncomingWssAction extends AbstractAction {
public RemoveIncomingWssAction() {
putValue(SMALL_ICON, UISupport.createImageIcon("/delete.png"));
putValue(SHORT_DESCRIPTION, "Removes the selected Incoming WSS Configuration");
setEnabled(false);
}
public void actionPerformed(ActionEvent e) {
int row = incomingWssTable.getSelectedRow();
if (row == -1) {
return;
}
if (UISupport.confirm("Removes selected configuration?", "Remove Configuration")) {
wssContainer.removeIncomingWssAt(row);
}
}
}
public class ImportWssSettingsAction extends AbstractAction {
public ImportWssSettingsAction() {
putValue(SHORT_DESCRIPTION, "Imports an existing WS-Security configuration from another project");
putValue(SMALL_ICON, UISupport.createImageIcon("/load_properties.gif"));
}
public void actionPerformed(ActionEvent e) {
String[] names = ModelSupport.getNames(((WorkspaceImpl) SoapUI.getWorkspace()).getOpenProjectList());
String projectName = UISupport.prompt("Select project to import from", "Import WSS Settings", names);
if (projectName != null) {
WsdlProject prj = (WsdlProject) SoapUI.getWorkspace().getProjectByName(projectName);
wssContainer.importConfig(prj.getWssContainer());
}
}
}
private class AddCryptoAction extends AbstractAction {
private final CryptoType cryptoType;
public AddCryptoAction(CryptoType cryptoType) {
this.cryptoType = cryptoType;
putValue(SMALL_ICON, UISupport.createImageIcon("/add.png"));
putValue(SHORT_DESCRIPTION, "Adds a new " + cryptoType.toString() + " to this configuration");
}
public void actionPerformed(ActionEvent e) {
JTable cryptoTable = getCryptoTable(cryptoType);
File file = UISupport.getFileDialogs().open(this, "Select Key Material", null, null, null);
if (file != null) {
String password = new String(UISupport.promptPassword("Specify password for [" + file.getName() + "]",
"Add Key Material"));
wssContainer.addCrypto(file.getAbsolutePath(), password, cryptoType);
cryptoTable.setRowSelectionInterval(cryptoTable.getRowCount() - 1, cryptoTable.getRowCount() - 1);
}
}
}
private class RemoveCryptoAction extends AbstractAction {
private final CryptoType cryptoType;
public RemoveCryptoAction(CryptoType cryptoType) {
this.cryptoType = cryptoType;
putValue(SMALL_ICON, UISupport.createImageIcon("/delete.png"));
putValue(SHORT_DESCRIPTION, "Removes the selected " + cryptoType + " from this configuration");
setEnabled(false);
}
public void actionPerformed(ActionEvent e) {
JTable cryptoTable = getCryptoTable(cryptoType);
int row = cryptoTable.getSelectedRow();
if (row == -1) {
return;
}
CryptoTableModel tableModel = (CryptoTableModel) cryptoTable.getModel();
WssCrypto crypto = tableModel.getCryptoAt(row);
if (UISupport.confirm("Removes selected " + cryptoType + "?", "Remove " + cryptoType)) {
wssContainer.removeCrypto(crypto);
}
}
}
// :: Listeners ::
private class InternalWssContainerListener extends WssContainerListenerAdapter {
@Override
public void outgoingWssAdded(OutgoingWss outgoingWss) {
((OutgoingWssTableModel) outgoingWssTable.getModel()).outgoingWssAdded(outgoingWss);
}
@Override
public void outgoingWssRemoved(OutgoingWss outgoingWss) {
((OutgoingWssTableModel) outgoingWssTable.getModel()).outgoingWssRemoved(outgoingWss);
}
@Override
public void outgoingWssEntryAdded(WssEntry entry) {
if (entry.getOutgoingWss() == selectedOutgoing) {
entriesListModel.addElement(entry);
}
}
@Override
public void outgoingWssEntryRemoved(WssEntry entry) {
if (entry.getOutgoingWss() == selectedOutgoing) {
entriesListModel.removeElement(entry);
}
}
@Override
public void outgoingWssEntryMoved(WssEntry entry, int offset) {
if (entry.getOutgoingWss() == selectedOutgoing) {
int indexBeforeMove = entriesListModel.indexOf(entry);
if ((offset == MOVE_UP && indexBeforeMove > 0)
|| (offset == MOVE_DOWN && indexBeforeMove < entriesListModel.size() - 1)) {
WssEntry adjacentEntry = (WssEntry) entriesListModel.get(indexBeforeMove + offset);
entriesListModel.set(indexBeforeMove + offset, entry);
entriesListModel.set(indexBeforeMove, adjacentEntry);
entriesList.setSelectedIndex(indexBeforeMove + offset);
}
}
}
@Override
public void incomingWssAdded(IncomingWss incomingWss) {
((IncomingWssTableModel) incomingWssTable.getModel()).incomingWssAdded(incomingWss);
}
@Override
public void incomingWssRemoved(IncomingWss incomingWss) {
((IncomingWssTableModel) incomingWssTable.getModel()).incomingWssRemoved(incomingWss);
}
@Override
public void cryptoAdded(WssCrypto crypto) {
JTable cryptoTable = getCryptoTable(crypto.getType());
((CryptoTableModel) cryptoTable.getModel()).cryptoAdded(crypto);
}
@Override
public void cryptoRemoved(WssCrypto crypto) {
JTable cryptoTable = getCryptoTable(crypto.getType());
((CryptoTableModel) cryptoTable.getModel()).cryptoRemoved(crypto);
}
}
// :: Table cell renderer::
public static class PasswordTableCellRenderer extends JPasswordField implements TableCellRenderer {
public PasswordTableCellRenderer() {
setEditable(false);
setBorder(null);
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
setBackground(table.getBackground());
setText(value == null ? "" : value.toString());
return this;
}
}
}