/* * 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.support.editor.views.xml.source; import com.eviware.soapui.impl.rest.RestRequest; import com.eviware.soapui.impl.rest.RestRequestInterface; import com.eviware.soapui.impl.rest.mock.RestMockResponse; import com.eviware.soapui.impl.support.http.HttpRequestInterface; import com.eviware.soapui.impl.wadl.support.WadlValidator; import com.eviware.soapui.impl.wsdl.WsdlOperation; import com.eviware.soapui.impl.wsdl.WsdlProject; import com.eviware.soapui.impl.wsdl.WsdlRequest; import com.eviware.soapui.impl.wsdl.actions.mockresponse.AddWsaHeadersToMockResponseAction; import com.eviware.soapui.impl.wsdl.actions.mockresponse.ApplyOutgoingWSSToMockResponseAction; import com.eviware.soapui.impl.wsdl.actions.mockresponse.RemoveAllOutgoingWSSFromMockResponseAction; import com.eviware.soapui.impl.wsdl.actions.mockresponse.RemoveWsaHeadersFromMockResponseAction; import com.eviware.soapui.impl.wsdl.actions.request.AddWSSUsernameTokenAction; import com.eviware.soapui.impl.wsdl.actions.request.AddWSTimestampAction; import com.eviware.soapui.impl.wsdl.actions.request.AddWsaHeadersToRequestAction; import com.eviware.soapui.impl.wsdl.actions.request.ApplyOutgoingWSSToRequestAction; import com.eviware.soapui.impl.wsdl.actions.request.RemoveAllOutgoingWSSFromRequestAction; import com.eviware.soapui.impl.wsdl.actions.request.RemoveWsaHeadersFromRequestAction; import com.eviware.soapui.impl.wsdl.mock.WsdlMockResponse; import com.eviware.soapui.impl.wsdl.mock.WsdlMockResult; import com.eviware.soapui.impl.wsdl.panels.mockoperation.WsdlMockResponseMessageExchange; import com.eviware.soapui.impl.wsdl.panels.mockoperation.WsdlMockResultMessageExchange; import com.eviware.soapui.impl.wsdl.support.MessageExchangeModelItem; import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlValidator; import com.eviware.soapui.impl.wsdl.support.wss.DefaultWssContainer; import com.eviware.soapui.impl.wsdl.support.wss.OutgoingWss; import com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext; import com.eviware.soapui.impl.wsdl.teststeps.AMFRequestTestStep; import com.eviware.soapui.impl.wsdl.teststeps.JdbcRequestTestStep; import com.eviware.soapui.impl.wsdl.teststeps.RestResponseMessageExchange; import com.eviware.soapui.impl.wsdl.teststeps.WsdlResponseMessageExchange; import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequest; import com.eviware.soapui.model.ModelItem; import com.eviware.soapui.model.testsuite.AssertionError; import com.eviware.soapui.support.editor.Editor; import com.eviware.soapui.support.editor.EditorView; import com.eviware.soapui.support.editor.registry.RequestEditorViewFactory; import com.eviware.soapui.support.editor.registry.ResponseEditorViewFactory; import com.eviware.soapui.support.editor.xml.XmlDocument; import com.eviware.soapui.support.editor.xml.XmlEditor; import com.eviware.soapui.support.editor.xml.XmlEditorView; import com.eviware.soapui.support.editor.xml.support.ValidationError; import com.eviware.soapui.support.propertyexpansion.PropertyExpansionPopupListener; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import javax.swing.JMenu; import javax.swing.JPopupMenu; import javax.swing.JSeparator; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; import java.util.List; /** * Factory for default "XML" source editor view in SoapUI * * @author ole.matzura */ public class XmlSourceEditorViewFactory implements ResponseEditorViewFactory, RequestEditorViewFactory { public static final String VIEW_ID = "Source"; @SuppressWarnings("unchecked") public XmlEditorView createEditorView(XmlEditor editor) { return new XmlSourceEditorView<ModelItem>(editor, null, false); } public String getViewId() { return VIEW_ID; } @SuppressWarnings("unchecked") public EditorView<?> createRequestEditorView(Editor<?> editor, ModelItem modelItem) { if (modelItem instanceof WsdlRequest) { return new WsdlRequestXmlSourceEditor((XmlEditor) editor, (WsdlRequest) modelItem); } else if (modelItem instanceof WsdlMockResponse) { return new WsdlMockRequestXmlSourceEditor((XmlEditor) editor, (WsdlMockResponse) modelItem); } else if (modelItem instanceof MessageExchangeModelItem) { return new XmlSourceEditorView<MessageExchangeModelItem>((XmlEditor) editor, (MessageExchangeModelItem) modelItem, false); } else if (modelItem instanceof RestMockResponse) { boolean readOnly = false; return new XmlSourceEditorView((XmlEditor) editor, modelItem, readOnly); } return null; } @SuppressWarnings("unchecked") public EditorView<?> createResponseEditorView(Editor<?> editor, ModelItem modelItem) { if (modelItem instanceof WsdlRequest) { return new WsdlResponseXmlSourceEditor((XmlEditor) editor, (WsdlRequest) modelItem); } else if (modelItem instanceof WsdlMockResponse) { return new WsdlMockResponseXmlSourceEditor((XmlEditor) editor, (WsdlMockResponse) modelItem); } else if (modelItem instanceof HttpRequestInterface<?>) { return new RestResponseXmlSourceEditor((XmlEditor) editor, (HttpRequestInterface<?>) modelItem); } else if (modelItem instanceof MessageExchangeModelItem) { return new XmlSourceEditorView<MessageExchangeModelItem>((XmlEditor) editor, (MessageExchangeModelItem) modelItem, true); } else if (modelItem instanceof JdbcRequestTestStep) { return new XmlSourceEditorView<JdbcRequestTestStep>((XmlEditor) editor, (JdbcRequestTestStep) modelItem, true); } else if (modelItem instanceof AMFRequestTestStep) { return new XmlSourceEditorView<AMFRequestTestStep>((XmlEditor) editor, (AMFRequestTestStep) modelItem, true); } else if (modelItem instanceof RestMockResponse) { boolean readOnly = false; return new XmlSourceEditorView((XmlEditor) editor, modelItem, readOnly, "Editor"); } return null; } /** * XmlSource editor for a WsdlRequest * * @author ole.matzura */ public static class WsdlRequestXmlSourceEditor extends XmlSourceEditorView<WsdlRequest> { private JMenu applyMenu; private JMenu wsaApplyMenu; @SuppressWarnings("unchecked") public WsdlRequestXmlSourceEditor(XmlEditor xmlEditor, WsdlRequest request) { super(xmlEditor, request, false); } protected ValidationError[] validateXml(String xml) { WsdlOperation operation = getModelItem().getOperation(); WsdlValidator validator = new WsdlValidator((operation.getInterface()).getWsdlContext()); WsdlResponseMessageExchange wsdlResponseMessageExchange = new WsdlResponseMessageExchange(getModelItem()); wsdlResponseMessageExchange.setRequestContent(xml); return validator.assertRequest(wsdlResponseMessageExchange, false); } @Override protected void buildUI() { super.buildUI(); PropertyExpansionPopupListener.enable(getInputArea(), getModelItem(), getInputArea().getPopupMenu()); } protected void buildPopup(JPopupMenu inputPopup, RSyntaxTextArea editArea) { super.buildPopup(inputPopup, editArea); inputPopup.insert(new JSeparator(), 2); inputPopup.insert(new AddWSSUsernameTokenAction(getModelItem()), 3); inputPopup.insert(new AddWSTimestampAction(getModelItem()), 4); inputPopup.insert(applyMenu = new JMenu("Outgoing WSS"), 5); inputPopup.insert(wsaApplyMenu = new JMenu("WS-A headers"), 6); inputPopup.insert(new JSeparator(), 7); inputPopup.addPopupMenuListener(new PopupMenuListener() { public void popupMenuCanceled(PopupMenuEvent e) { } public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { } public void popupMenuWillBecomeVisible(PopupMenuEvent e) { applyMenu.removeAll(); DefaultWssContainer wss = getModelItem().getOperation().getInterface().getProject().getWssContainer(); List<OutgoingWss> outgoingWssList = wss.getOutgoingWssList(); applyMenu.setEnabled(!outgoingWssList.isEmpty()); for (OutgoingWss outgoing : outgoingWssList) { applyMenu.add(new ApplyOutgoingWSSToRequestAction(getModelItem(), outgoing)); } applyMenu.add(new RemoveAllOutgoingWSSFromRequestAction(getModelItem())); wsaApplyMenu.removeAll(); wsaApplyMenu.add(new AddWsaHeadersToRequestAction(getModelItem())); wsaApplyMenu.add(new RemoveWsaHeadersFromRequestAction(getModelItem())); wsaApplyMenu.setEnabled(getModelItem().getWsaConfig().isWsaEnabled()); } }); } public WsdlRequest getRequest() { return getModelItem(); } } /** * XmlSource editor for a WsdlMockRequest * * @author ole.matzura */ public static class WsdlMockRequestXmlSourceEditor extends XmlSourceEditorView<WsdlMockResponse> { @SuppressWarnings("unchecked") public WsdlMockRequestXmlSourceEditor(XmlEditor xmlEditor, WsdlMockResponse mockResponse) { super(xmlEditor, mockResponse, false); } protected ValidationError[] validateXml(String xml) { WsdlOperation operation = getModelItem().getMockOperation().getOperation(); if (operation == null) { return new ValidationError[]{new AssertionError("Missing operation for MockResponse")}; } WsdlValidator validator = new WsdlValidator((operation.getInterface()).getWsdlContext()); WsdlMockResultMessageExchange messageExchange = new WsdlMockResultMessageExchange((WsdlMockResult) getModelItem().getMockResult(), getModelItem()); return validator.assertRequest(messageExchange, false); } protected void buildPopup(JPopupMenu inputPopup, RSyntaxTextArea editArea) { super.buildPopup(inputPopup, editArea); // inputPopup.insert( new JSeparator(), 2 ); } } /** * XmlSource editor for a WsdlResponse * * @author ole.matzura */ public static class WsdlResponseXmlSourceEditor extends XmlSourceEditorView<WsdlRequest> { @SuppressWarnings("unchecked") public WsdlResponseXmlSourceEditor(XmlEditor xmlEditor, WsdlRequest request) { super(xmlEditor, request, true); } protected ValidationError[] validateXml(String xml) { if (getModelItem() instanceof WsdlTestRequest) { WsdlTestRequest testRequest = (WsdlTestRequest) getModelItem(); testRequest.assertResponse(new WsdlTestRunContext(testRequest.getTestStep())); } WsdlOperation operation = getModelItem().getOperation(); WsdlValidator validator = new WsdlValidator((operation.getInterface()).getWsdlContext()); return validator.assertResponse(new WsdlResponseMessageExchange(getModelItem()), false); } } /** * XmlSource editor for a WsdlMockResponse * * @author ole.matzura */ public static class WsdlMockResponseXmlSourceEditor extends XmlSourceEditorView<WsdlMockResponse> { private JMenu applyMenu; private JMenu wsaApplyMenu; @SuppressWarnings("unchecked") public WsdlMockResponseXmlSourceEditor(XmlEditor xmlEditor, WsdlMockResponse mockResponse) { super(xmlEditor, mockResponse, false); } @Override protected void buildUI() { super.buildUI(); getValidateXmlAction().setEnabled(getModelItem().getMockOperation().getOperation().isBidirectional()); } protected ValidationError[] validateXml(String xml) { WsdlOperation operation = getModelItem().getMockOperation().getOperation(); if (operation == null) { return new ValidationError[]{new AssertionError("Missing operation for MockResponse")}; } WsdlValidator validator = new WsdlValidator((operation.getInterface()).getWsdlContext()); return validator.assertResponse(new WsdlMockResponseMessageExchange(getModelItem()), false); } public WsdlMockResponse getMockResponse() { return getModelItem(); } protected void buildPopup(JPopupMenu inputPopup, RSyntaxTextArea editArea) { super.buildPopup(inputPopup, editArea); inputPopup.insert(applyMenu = new JMenu("Outgoing WSS"), 2); inputPopup.insert(wsaApplyMenu = new JMenu("WS-A headers"), 3); inputPopup.addPopupMenuListener(new PopupMenuListener() { public void popupMenuCanceled(PopupMenuEvent e) { } public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { } public void popupMenuWillBecomeVisible(PopupMenuEvent e) { applyMenu.removeAll(); WsdlProject project = getModelItem().getMockOperation().getMockService().getProject(); DefaultWssContainer wss = project.getWssContainer(); List<OutgoingWss> outgoingWssList = wss.getOutgoingWssList(); applyMenu.setEnabled(!outgoingWssList.isEmpty()); for (OutgoingWss outgoing : outgoingWssList) { applyMenu.add(new ApplyOutgoingWSSToMockResponseAction(getModelItem(), outgoing)); } applyMenu.add(new RemoveAllOutgoingWSSFromMockResponseAction(getModelItem())); wsaApplyMenu.removeAll(); wsaApplyMenu.add(new AddWsaHeadersToMockResponseAction(getModelItem())); wsaApplyMenu.add(new RemoveWsaHeadersFromMockResponseAction(getModelItem())); wsaApplyMenu.setEnabled(getModelItem().getWsaConfig().isWsaEnabled()); } }); } } private class RestResponseXmlSourceEditor extends XmlSourceEditorView<HttpRequestInterface<?>> { public RestResponseXmlSourceEditor(XmlEditor<XmlDocument> xmlEditor, HttpRequestInterface<?> restRequest) { super(xmlEditor, restRequest, true); } @SuppressWarnings("unchecked") protected ValidationError[] validateXml(String xml) { if (getModelItem() instanceof HttpRequestInterface || ((RestRequestInterface) getModelItem()).getResource() == null) { return new ValidationError[0]; } WadlValidator validator = new WadlValidator(((RestRequestInterface) getModelItem()).getResource() .getService().getWadlContext()); return validator.assertResponse(new RestResponseMessageExchange((RestRequest) getModelItem())); } } }