/*
* 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.mock.dispatch;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction;
import com.eviware.soapui.impl.wsdl.mock.DispatchException;
import com.eviware.soapui.impl.wsdl.panels.teststeps.support.GroovyEditor;
import com.eviware.soapui.impl.wsdl.panels.teststeps.support.GroovyEditorModel;
import com.eviware.soapui.impl.wsdl.support.HelpUrls;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.mock.MockOperation;
import com.eviware.soapui.model.mock.MockRequest;
import com.eviware.soapui.model.mock.MockResponse;
import com.eviware.soapui.model.mock.MockResult;
import com.eviware.soapui.model.settings.Settings;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.components.JXToolBar;
import com.eviware.soapui.support.xml.XmlUtils;
import com.eviware.soapui.ui.support.ModelItemDesktopPanel;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeListener;
public class XPathMockOperationDispatcher extends AbstractMockOperationDispatcher {
private GroovyEditor xpathEditor;
public XPathMockOperationDispatcher(MockOperation mockOperation) {
super(mockOperation);
}
public MockResponse selectMockResponse(MockRequest request, MockResult result)
throws DispatchException {
XmlObject xmlObject;
try {
xmlObject = request.getRequestXmlObject();
} catch (XmlException e) {
throw new DispatchException("Error getting XmlObject for request: " + e);
}
String path = getMockOperation().getScript();
if (StringUtils.isNullOrEmpty(path)) {
throw new DispatchException("Missing dispatch XPath expression");
}
String[] values = XmlUtils.selectNodeValues(xmlObject, path);
for (String value : values) {
MockResponse mockResponse = getMockOperation().getMockResponseByName(value);
if (mockResponse != null) {
return mockResponse;
}
}
return null;
}
@Override
public JComponent getEditorComponent() {
JPanel xpathEditorPanel = new JPanel(new BorderLayout());
DispatchXPathGroovyEditorModel editorModel = new DispatchXPathGroovyEditorModel();
xpathEditor = new GroovyEditor(editorModel);
xpathEditorPanel.add(xpathEditor, BorderLayout.CENTER);
xpathEditorPanel.add(buildXPathEditorToolbar(editorModel), BorderLayout.PAGE_START);
return xpathEditorPanel;
}
public GroovyEditor getXPathEditor() {
return xpathEditor;
}
@Override
public void release() {
releaseEditorComponent();
super.release();
}
@Override
public void releaseEditorComponent() {
if (xpathEditor != null) {
xpathEditor.release();
}
super.releaseEditorComponent();
}
@Override
public boolean hasDefaultResponse() {
return true;
}
protected JXToolBar buildXPathEditorToolbar(DispatchXPathGroovyEditorModel editorModel) {
JXToolBar toolbar = UISupport.createToolbar();
toolbar.addSpace(3);
addToolbarActions(editorModel, toolbar);
toolbar.addGlue();
toolbar.addFixed(ModelItemDesktopPanel.createActionButton(new ShowOnlineHelpAction(
HelpUrls.MOCKOPERATION_XPATHDISPATCH_HELP_URL), true));
return toolbar;
}
protected void addToolbarActions(DispatchXPathGroovyEditorModel editorModel, JXToolBar toolbar) {
toolbar.addFixed(UISupport.createToolbarButton(editorModel.getRunAction()));
}
public static class Factory implements MockOperationDispatchFactory {
public MockOperationDispatcher build(MockOperation mockOperation) {
return new XPathMockOperationDispatcher(mockOperation);
}
}
public class DispatchXPathGroovyEditorModel implements GroovyEditorModel {
private RunXPathAction runXPathAction = new RunXPathAction();
public String[] getKeywords() {
return new String[]{"define", "namespace"};
}
public Action getRunAction() {
return runXPathAction;
}
public String getScript() {
return getMockOperation().getScript();
}
public Settings getSettings() {
return getMockOperation().getSettings();
}
public void setScript(String text) {
getMockOperation().setScript(text);
}
public String getScriptName() {
return null;
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
}
public ModelItem getModelItem() {
return getMockOperation();
}
}
private class RunXPathAction extends AbstractAction {
public RunXPathAction() {
putValue(Action.SMALL_ICON, UISupport.createImageIcon("/run.png"));
putValue(Action.SHORT_DESCRIPTION, "Evaluates this xpath expression against the latest request");
}
public void actionPerformed(ActionEvent e) {
MockResult lastMockResult = getMockOperation().getLastMockResult();
if (lastMockResult == null) {
UISupport.showErrorMessage("Missing last request to select from");
return;
}
try {
MockResponse retVal = selectMockResponse(lastMockResult.getMockRequest(), null);
UISupport.showInfoMessage("XPath Selection returned [" + (retVal == null ? "null" : retVal.getName())
+ "]");
} catch (Exception e1) {
SoapUI.logError(e1);
}
}
}
}