/* * 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.ui.support; import com.eviware.soapui.impl.support.AbstractMockOperation; import com.eviware.soapui.impl.wsdl.actions.mockoperation.NewMockResponseAction; import com.eviware.soapui.impl.wsdl.mock.dispatch.MockOperationDispatchRegistry; import com.eviware.soapui.impl.wsdl.mock.dispatch.MockOperationDispatcher; import com.eviware.soapui.model.ModelItem; import com.eviware.soapui.model.mock.MockOperation; import com.eviware.soapui.model.mock.MockResponse; import com.eviware.soapui.model.mock.MockServiceListener; import com.eviware.soapui.model.util.ModelItemNames; import com.eviware.soapui.support.UISupport; import com.eviware.soapui.support.action.swing.ActionList; import com.eviware.soapui.support.action.swing.DefaultActionList; import com.eviware.soapui.support.action.swing.SwingActionDelegate; import com.eviware.soapui.support.components.JComponentInspector; import com.eviware.soapui.support.components.JInspectorPanel; import com.eviware.soapui.support.components.JInspectorPanelFactory; import com.eviware.soapui.support.components.JXToolBar; import com.eviware.soapui.support.swing.ExtendedComboBoxModel; import com.eviware.soapui.support.swing.ModelItemListKeyListener; import com.eviware.soapui.support.swing.ModelItemListMouseListener; import com.jgoodies.forms.builder.ButtonBarBuilder; import javax.swing.AbstractListModel; import javax.swing.BorderFactory; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.ListCellRenderer; import javax.swing.ListModel; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; public abstract class AbstractMockOperationDesktopPanel<MockOperationType extends AbstractMockOperation> extends ModelItemDesktopPanel<MockOperationType> { private JList responseList; private JComboBox dispatchCombo; private JPanel dispatchPanel; private JComboBox defaultResponseCombo; private ResponseListModel responseListModel; private JComponentInspector<JComponent> dispatchInspector; private JInspectorPanel inspectorPanel; private JPanel defaultResponsePanel; public AbstractMockOperationDesktopPanel(MockOperationType mockOperation) { super(mockOperation); buildUI(); setPreferredSize(new Dimension(600, 440)); } private void buildUI() { add(buildToolbar(), BorderLayout.NORTH); inspectorPanel = JInspectorPanelFactory.build(buildResponseList()); inspectorPanel.setDefaultDividerLocation(0.5F); dispatchInspector = new JComponentInspector<JComponent>(buildDispatchEditor(), "Dispatch (" + getModelItem().getDispatchStyle().toString() + ")", "Configures current dispatch style", true); inspectorPanel.addInspector(dispatchInspector); inspectorPanel.activate(dispatchInspector); add(inspectorPanel.getComponent(), BorderLayout.CENTER); } private JComponent buildResponseList() { responseListModel = new ResponseListModel(); responseList = new JList(responseListModel); responseList.addKeyListener(new ModelItemListKeyListener() { @Override public ModelItem getModelItemAt(int ix) { return getModelItem().getMockResponseAt(ix); } }); responseList.addMouseListener(new ModelItemListMouseListener() { private DefaultActionList defaultActions; @Override protected ActionList getDefaultActions() { if (defaultActions == null) { defaultActions = new DefaultActionList(); defaultActions.addAction(SwingActionDelegate.createDelegate(NewMockResponseAction.SOAPUI_ACTION_ID, getModelItem(), null, getAddToMockOperationIconPath())); } return defaultActions; } }); responseList.setCellRenderer(new ResponseListCellRenderer()); JScrollPane scrollPane = new JScrollPane(responseList); JTabbedPane tabs = new JTabbedPane(); tabs.addTab("MockResponses", UISupport.buildPanelWithToolbar(buildMockResponseListToolbar(), scrollPane)); return UISupport.createTabPanel(tabs, true); } protected abstract String getAddToMockOperationIconPath(); private JComponent buildMockResponseListToolbar() { JXToolBar toolbar = UISupport.createToolbar(); toolbar.add(UISupport.createToolbarButton(SwingActionDelegate.createDelegate( NewMockResponseAction.SOAPUI_ACTION_ID, getModelItem(), null, getAddToMockOperationIconPath()))); return toolbar; } private JComponent buildDispatchEditor() { dispatchPanel = new JPanel(new BorderLayout()); dispatchPanel.setOpaque(true); ButtonBarBuilder builder = new ButtonBarBuilder(); builder.addFixed(new JLabel("Dispatch: ")); builder.addRelatedGap(); dispatchCombo = new JComboBox(getAvailableDispatchTypes()); dispatchCombo.setSelectedItem(null); dispatchCombo.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (dispatchPanel.getComponentCount() > 1) { dispatchPanel.remove(1); } String item = (String) dispatchCombo.getSelectedItem(); MockOperationDispatcher dispatcher = getModelItem().setDispatchStyle(item); dispatchPanel.add(dispatcher.getEditorComponent(), BorderLayout.CENTER); dispatchPanel.revalidate(); dispatchPanel.repaint(); if (dispatchInspector != null && item != null) { dispatchInspector.setTitle("Dispatch (" + item + ")"); } defaultResponsePanel.setVisible(getModelItem().getDispatcher().hasDefaultResponse()); } }); builder.addFixed(dispatchCombo); defaultResponsePanel = new JPanel(new BorderLayout()); defaultResponsePanel.add(new JLabel("Default Response: "), BorderLayout.WEST); ModelItemNames<MockResponse> names = new ModelItemNames<MockResponse>(getModelItem().getMockResponses()); defaultResponseCombo = new JComboBox(new ExtendedComboBoxModel(names.getNames())); defaultResponseCombo.setPreferredSize(new Dimension(150, 20)); defaultResponseCombo.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { Object selectedItem = defaultResponseCombo.getSelectedItem(); getModelItem().setDefaultResponse((String) selectedItem); } }); defaultResponsePanel.add(defaultResponseCombo, BorderLayout.CENTER); builder.addUnrelatedGap(); builder.addFixed(defaultResponsePanel); dispatchPanel.add(builder.getPanel(), BorderLayout.NORTH); // init data defaultResponseCombo.setSelectedItem(getModelItem().getDefaultResponse()); dispatchCombo.setSelectedItem(getModelItem().getDispatchStyle()); return dispatchPanel; } protected String[] getAvailableDispatchTypes() { return MockOperationDispatchRegistry.getDispatchTypes(); } protected abstract Component buildToolbar(); public boolean onClose(boolean canCancel) { responseListModel.release(); inspectorPanel.release(); if (getModelItem().getDispatcher() != null) { getModelItem().getDispatcher().releaseEditorComponent(); } return release(); } public boolean dependsOn(ModelItem modelItem) { return modelItem == getModelItem() || modelItem == getModelItem().getMockService() || modelItem == getModelItem().getMockService().getProject(); } public class ResponseListModel extends AbstractListModel implements ListModel, MockServiceListener, PropertyChangeListener { private java.util.List<MockResponse> responses = new ArrayList<MockResponse>(); public ResponseListModel() { for (int c = 0; c < getModelItem().getMockResponseCount(); c++) { MockResponse mockResponse = getModelItem().getMockResponseAt(c); mockResponse.addPropertyChangeListener(this); responses.add(mockResponse); } getModelItem().getMockService().addMockServiceListener(this); } public Object getElementAt(int arg0) { return responses.get(arg0); } public int getSize() { return responses.size(); } public void mockOperationAdded(MockOperation operation) { } public void mockOperationRemoved(MockOperation operation) { } public void mockResponseAdded(MockResponse response) { if (response.getMockOperation() != getModelItem()) { return; } responses.add(response); response.addPropertyChangeListener(this); fireIntervalAdded(this, responses.size() - 1, responses.size() - 1); defaultResponseCombo.addItem(response.getName()); } public void mockResponseRemoved(MockResponse response) { if (response.getMockOperation() != getModelItem()) { return; } int ix = responses.indexOf(response); responses.remove(ix); response.removePropertyChangeListener(this); fireIntervalRemoved(this, ix, ix); defaultResponseCombo.removeItem(response.getName()); } public void propertyChange(PropertyChangeEvent arg0) { if (arg0.getPropertyName().equals(ModelItem.NAME_PROPERTY)) { int ix = responses.indexOf(arg0.getSource()); fireContentsChanged(this, ix, ix); ExtendedComboBoxModel model = (ExtendedComboBoxModel) defaultResponseCombo.getModel(); model.setElementAt(arg0.getNewValue(), ix); if (model.getSelectedItem().equals(arg0.getOldValue())) { model.setSelectedItem(arg0.getNewValue()); } } } public void release() { for (MockResponse response : responses) { response.removePropertyChangeListener(this); } getModelItem().getMockService().removeMockServiceListener(this); } } private final static class ResponseListCellRenderer extends JLabel implements ListCellRenderer { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { MockResponse testStep = (MockResponse) value; setText(testStep.getName()); setIcon(testStep.getIcon()); if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } setEnabled(list.isEnabled()); setFont(list.getFont()); setOpaque(true); setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); return this; } } }