/*
* 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.endpoint;
import com.eviware.soapui.config.EndpointConfig;
import com.eviware.soapui.impl.support.AbstractHttpRequest;
import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction;
import com.eviware.soapui.impl.support.http.HttpRequestTestStep;
import com.eviware.soapui.impl.wsdl.WsdlInterface;
import com.eviware.soapui.impl.wsdl.WsdlRequest;
import com.eviware.soapui.impl.wsdl.endpoint.DefaultEndpointStrategy.EndpointDefaults;
import com.eviware.soapui.impl.wsdl.support.HelpUrls;
import com.eviware.soapui.impl.wsdl.support.wss.WssContainer;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequest;
import com.eviware.soapui.model.iface.Interface;
import com.eviware.soapui.model.iface.Operation;
import com.eviware.soapui.model.testsuite.TestCase;
import com.eviware.soapui.model.testsuite.TestStep;
import com.eviware.soapui.model.testsuite.TestSuite;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.components.JXToolBar;
import com.eviware.soapui.support.components.MetricsPanel;
import com.eviware.soapui.support.swing.JTableFactory;
import com.l2fprod.common.swing.renderer.DefaultCellRenderer;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class DefaultEndpointStrategyConfigurationPanel extends JPanel implements PropertyChangeListener {
// package protected to facilitate unit testing
public JTable table;
private EndpointsTableModel tableModel;
private JButton deleteButton;
private JButton assignButton;
private Interface iface;
private final DefaultEndpointStrategy strategy;
public DefaultEndpointStrategyConfigurationPanel(Interface iface, DefaultEndpointStrategy strategy) {
super(new BorderLayout());
this.iface = iface;
this.strategy = strategy;
buildUI();
enableButtons();
}
private void buildUI() {
tableModel = iface instanceof WsdlInterface ? new WsdlEndpointsTableModel() : new RestEndpointsTableModel();
table = JTableFactory.getInstance().makeJTable(tableModel);
TableColumn passwordColumn = table.getColumnModel().getColumn(tableModel.getPasswordColumnIndex());
JPasswordField textField = new JPasswordField();
textField.setBorder(BorderFactory.createEmptyBorder());
DefaultCellEditor cellEditor = new DefaultCellEditor(textField);
passwordColumn.setCellEditor(cellEditor);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
enableButtons();
}
});
for (int c = 0; c < table.getColumnCount(); c++) {
table.getColumnModel().getColumn(c)
.setHeaderRenderer(new MetricsPanel.InternalHeaderRenderer(getBackground()));
}
table.getColumnModel().getColumn(0).setPreferredWidth(250);
InternalRowCellrenderer internalRowCellRendered = new InternalRowCellrenderer();
table.getColumnModel().getColumn(tableModel.getPasswordColumnIndex()).setCellRenderer(internalRowCellRendered);
if (iface instanceof WsdlInterface) {
JComboBox wssTypeCombo = new JComboBox(new String[]{WsdlRequest.PW_TYPE_NONE, WsdlRequest.PW_TYPE_TEXT,
WsdlRequest.PW_TYPE_DIGEST});
wssTypeCombo.setEditable(true);
table.getColumnModel().getColumn(4).setCellEditor(new DefaultCellEditor(wssTypeCombo));
table.getColumnModel().getColumn(6)
.setCellEditor(new OutgoingWssCellEditor(((WsdlInterface) iface).getProject().getWssContainer()));
table.getColumnModel().getColumn(7)
.setCellEditor(new IncomingWssCellEditor(((WsdlInterface) iface).getProject().getWssContainer()));
table.getColumnModel()
.getColumn(8)
.setCellEditor(
new DefaultCellEditor(new JComboBox(new String[]{EndpointConfig.Mode.OVERRIDE.toString(),
EndpointConfig.Mode.COMPLEMENT.toString(), EndpointConfig.Mode.COPY.toString()})));
} else {
table.getColumnModel()
.getColumn(4)
.setCellEditor(
new DefaultCellEditor(new JComboBox(new String[]{EndpointConfig.Mode.OVERRIDE.toString(),
EndpointConfig.Mode.COMPLEMENT.toString(), EndpointConfig.Mode.COPY.toString()})));
}
setBackground(Color.WHITE);
table.getTableHeader().setReorderingAllowed(false);
setBackground(Color.WHITE);
setOpaque(true);
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBorder(BorderFactory.createEmptyBorder(5, 2, 5, 2));
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setBackground(Color.WHITE);
add(scrollPane, BorderLayout.CENTER);
add(createButtons(), BorderLayout.NORTH);
iface.addPropertyChangeListener(Interface.ENDPOINT_PROPERTY, this);
}
protected void enableButtons() {
deleteButton.setEnabled(table.getSelectedRow() != -1);
assignButton.setEnabled(table.getSelectedRow() != -1);
}
private Component createButtons() {
JXToolBar toolbar = UISupport.createToolbar();
toolbar.addFixed(UISupport.createToolbarButton(new AddAction()));
deleteButton = UISupport.createToolbarButton(new DeleteAction());
toolbar.addFixed(deleteButton);
toolbar.addRelatedGap();
assignButton = new JButton(new AssignAction());
toolbar.addFixed(assignButton);
toolbar.addGlue();
ShowOnlineHelpAction showOnlineHelpAction = new ShowOnlineHelpAction(HelpUrls.ENDPOINTSEDITOR_HELP_URL);
toolbar.addFixed(UISupport.createToolbarButton(showOnlineHelpAction));
return toolbar;
}
private class AddAction extends AbstractAction {
public AddAction() {
putValue(SMALL_ICON, UISupport.createImageIcon("/add.png"));
putValue(Action.SHORT_DESCRIPTION, "Adds a new endpoint to the list");
}
public void actionPerformed(ActionEvent e) {
String endpoint = UISupport.prompt("Enter new endpoint URL", "Add Endpoint", "");
if (endpoint == null) {
return;
}
tableModel.addEndpoint(endpoint);
}
}
private class AssignAction extends AbstractAction {
private static final String ALL_REQUESTS = "- All Requests -";
private static final String ALL_TEST_REQUESTS = "- All Test Requests -";
private static final String ALL_REQUESTS_AND_TEST_REQUESTS = "- All Requests and TestRequests -";
private static final String ALL_REQUESTS_WITH_NO_ENDPOINT = "- All Requests with no endpoint -";
public AssignAction() {
super("Assign");
putValue(Action.SHORT_DESCRIPTION,
"Assigns the selected endpoint to Requests/TestRequests for this Interface");
}
public void actionPerformed(ActionEvent e) {
int selectedIndex = table.getSelectedRow();
if (selectedIndex == -1) {
Toolkit.getDefaultToolkit().beep();
return;
}
String selectedEndpoint = tableModel.getEndpointAt(selectedIndex);
EndpointDefaults defaults = tableModel.getDefaultsAt(selectedIndex);
List<String> list = new ArrayList<String>(Arrays.asList(iface.getEndpoints()));
list.add(0, ALL_REQUESTS);
list.add(1, ALL_TEST_REQUESTS);
list.add(2, ALL_REQUESTS_AND_TEST_REQUESTS);
list.add(3, ALL_REQUESTS_WITH_NO_ENDPOINT);
Object endpoint = UISupport.prompt("Assign selected endpoint and authorization to..", "Assign Endpoint",
list.toArray(), ALL_REQUESTS_WITH_NO_ENDPOINT);
if (endpoint == null) {
return;
}
if (endpoint.equals(ALL_REQUESTS) || endpoint.equals(ALL_REQUESTS_WITH_NO_ENDPOINT)
|| endpoint.equals(ALL_REQUESTS_AND_TEST_REQUESTS)) {
for (Operation operation : iface.getAllOperations()) {
for (int i = 0; i < operation.getRequestCount(); i++) {
AbstractHttpRequest<?> request = (AbstractHttpRequest<?>) operation.getRequestAt(i);
String ep = request.getEndpoint();
if (endpoint.equals(ALL_REQUESTS) || endpoint.equals(ALL_REQUESTS_AND_TEST_REQUESTS)
|| (endpoint.equals(ALL_REQUESTS_WITH_NO_ENDPOINT) && ep == null)
|| (ep.equals(endpoint))) {
request.setEndpoint(selectedEndpoint);
request.setUsername(defaults.getUsername());
request.setPassword(defaults.getPassword());
request.setDomain(defaults.getDomain());
if (request instanceof WsdlRequest) {
((WsdlRequest) request).setWssPasswordType(defaults.getWssType());
((WsdlRequest) request).setWssTimeToLive(defaults.getWssTimeToLive());
((WsdlRequest) request).setOutgoingWss(defaults.getOutgoingWss());
((WsdlRequest) request).setIncomingWss(defaults.getIncomingWss());
}
}
}
}
}
if (endpoint.equals(ALL_REQUESTS_AND_TEST_REQUESTS) || endpoint.equals(ALL_TEST_REQUESTS)) {
for (TestSuite testSuite : iface.getProject().getTestSuiteList()) {
for (TestCase testCase : testSuite.getTestCaseList()) {
for (TestStep testStep : testCase.getTestStepList()) {
if (testStep instanceof HttpRequestTestStep) {
AbstractHttpRequest<?> httpRequest = ((HttpRequestTestStep) testStep).getHttpRequest();
if (httpRequest.getOperation() != null && httpRequest.getOperation().getInterface() == iface) {
httpRequest.setEndpoint(selectedEndpoint);
httpRequest.setUsername(defaults.getUsername());
httpRequest.setPassword(defaults.getPassword());
httpRequest.setDomain(defaults.getDomain());
if (httpRequest instanceof WsdlRequest) {
WsdlTestRequest testRequest = (WsdlTestRequest) httpRequest;
testRequest.setWssPasswordType(defaults.getWssType());
testRequest.setWssTimeToLive(defaults.getWssTimeToLive());
testRequest.setOutgoingWss(defaults.getOutgoingWss());
testRequest.setIncomingWss(defaults.getIncomingWss());
}
}
}
}
}
}
}
}
}
private class DeleteAction extends AbstractAction {
public DeleteAction() {
putValue(SMALL_ICON, UISupport.createImageIcon("/delete.png"));
putValue(Action.SHORT_DESCRIPTION, "Deletes the selected endpoint from the list");
}
public void actionPerformed(ActionEvent e) {
int index = table.getSelectedRow();
if (index == -1) {
Toolkit.getDefaultToolkit().beep();
return;
}
if (UISupport.confirm("Delete selected endpoint?", "Delete Endpoint")) {
tableModel.removeEndpoint(index);
}
}
}
private abstract class EndpointsTableModel extends AbstractTableModel {
public String getEndpointAt(int selectedIndex) {
return iface.getEndpoints()[selectedIndex];
}
public EndpointDefaults getDefaultsAt(int selectedIndex) {
String endpoint = getEndpointAt(selectedIndex);
return strategy.getEndpointDefaults(endpoint);
}
public void addEndpoint(String endpoint) {
int rowCount = getRowCount();
iface.addEndpoint(endpoint);
fireTableRowsInserted(rowCount, rowCount);
}
public void removeEndpoint(int index) {
String ep = getEndpointAt(index);
iface.removeEndpoint(ep);
fireTableRowsDeleted(index, index);
}
public int getRowCount() {
return iface == null ? 0 : iface.getEndpoints().length;
}
public abstract int getPasswordColumnIndex();
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
public void refresh() {
fireTableDataChanged();
}
}
private class RestEndpointsTableModel extends EndpointsTableModel {
public int getColumnCount() {
return 5;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "Endpoint";
case 1:
return "Username";
case 2:
return "Password";
case 3:
return "Domain";
case 4:
return "Mode";
}
return null;
}
@Override
public int getPasswordColumnIndex() {
return 2;
}
public Object getValueAt(int rowIndex, int columnIndex) {
String endpoint = getEndpointAt(rowIndex);
EndpointDefaults defaults = strategy.getEndpointDefaults(endpoint);
switch (columnIndex) {
case 0:
return endpoint;
case 1:
return defaults.getUsername();
case 2:
return defaults.getPassword();
case 3:
return defaults.getDomain();
case 4:
return defaults.getMode();
}
return null;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
String endpoint = getEndpointAt(rowIndex);
EndpointDefaults defaults = strategy.getEndpointDefaults(endpoint);
if (aValue == null) {
aValue = "";
}
switch (columnIndex) {
case 0: {
// strategy.changeEndpoint( endpoint, aValue.toString() );
iface.changeEndpoint(endpoint, aValue.toString());
break;
}
case 1: {
defaults.setUsername(aValue.toString());
break;
}
case 2: {
defaults.setPassword(aValue.toString());
break;
}
case 3: {
defaults.setDomain(aValue.toString());
break;
}
case 4: {
defaults.setMode(EndpointConfig.Mode.Enum.forString(aValue.toString()));
break;
}
}
}
}
private class WsdlEndpointsTableModel extends EndpointsTableModel {
public int getColumnCount() {
return 9;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "Endpoint";
case 1:
return "Username";
case 2:
return "Password";
case 3:
return "Domain";
case 4:
return "WSS-Type";
case 5:
return "WSS-TimeToLive";
case 6:
return "Outgoing WSS";
case 7:
return "Incoming WSS";
case 8:
return "Mode";
}
return null;
}
@Override
public int getPasswordColumnIndex() {
return 2;
}
public Object getValueAt(int rowIndex, int columnIndex) {
String endpoint = getEndpointAt(rowIndex);
EndpointDefaults defaults = strategy.getEndpointDefaults(endpoint);
switch (columnIndex) {
case 0:
return endpoint;
case 1:
return defaults.getUsername();
case 2:
return defaults.getPassword();
case 3:
return defaults.getDomain();
case 4:
return defaults.getWssType();
case 5:
return defaults.getWssTimeToLive();
case 6:
return defaults.getOutgoingWss();
case 7:
return defaults.getIncomingWss();
case 8:
return defaults.getMode();
}
return null;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
String endpoint = getEndpointAt(rowIndex);
EndpointDefaults defaults = strategy.getEndpointDefaults(endpoint);
if (aValue == null) {
aValue = "";
}
switch (columnIndex) {
case 0: {
// strategy.changeEndpoint( endpoint, aValue.toString() );
iface.changeEndpoint(endpoint, aValue.toString());
break;
}
case 1: {
defaults.setUsername(aValue.toString());
break;
}
case 2: {
defaults.setPassword(aValue.toString());
break;
}
case 3: {
defaults.setDomain(aValue.toString());
break;
}
case 4: {
defaults.setWssType(aValue.toString());
break;
}
case 5: {
defaults.setWssTimeToLive(aValue.toString());
break;
}
case 6: {
defaults.setOutgoingWss(aValue.toString());
break;
}
case 7: {
defaults.setIncomingWss(aValue.toString());
break;
}
case 8: {
defaults.setMode(EndpointConfig.Mode.Enum.forString(aValue.toString()));
break;
}
}
}
}
private static class IncomingWssCellEditor extends DefaultCellEditor {
private final WssContainer wssContainer;
public IncomingWssCellEditor(WssContainer wssContainer) {
super(new JComboBox());
this.wssContainer = wssContainer;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
JComboBox comboBox = (JComboBox) super.getTableCellEditorComponent(table, value, isSelected, row, column);
DefaultComboBoxModel model = new DefaultComboBoxModel(wssContainer.getIncomingWssNames());
model.addElement("");
comboBox.setModel(model);
return comboBox;
}
}
private static class OutgoingWssCellEditor extends DefaultCellEditor {
private final WssContainer wssContainer;
public OutgoingWssCellEditor(WssContainer wssContainer) {
super(new JComboBox());
this.wssContainer = wssContainer;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
JComboBox comboBox = (JComboBox) super.getTableCellEditorComponent(table, value, isSelected, row, column);
DefaultComboBoxModel model = new DefaultComboBoxModel(wssContainer.getOutgoingWssNames());
model.addElement("");
comboBox.setModel(model);
return comboBox;
}
}
public void release() {
iface.removePropertyChangeListener(Interface.ENDPOINT_PROPERTY, this);
}
public void propertyChange(PropertyChangeEvent evt) {
tableModel.refresh();
}
public static class InternalRowCellrenderer extends DefaultCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
Component component;
if (value != null && ((String) value).length() > 0) {
component = super.getTableCellRendererComponent(table, "********", isSelected, hasFocus, row, column);
} else {
component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
return component;
}
}
}