/*
* 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.support;
import com.eviware.soapui.config.BaseMockOperationConfig;
import com.eviware.soapui.config.MockOperationDispatchStyleConfig;
import com.eviware.soapui.impl.wsdl.AbstractWsdlModelItem;
import com.eviware.soapui.impl.wsdl.mock.dispatch.MockOperationDispatchRegistry;
import com.eviware.soapui.impl.wsdl.mock.dispatch.MockOperationDispatcher;
import com.eviware.soapui.model.iface.Operation;
import com.eviware.soapui.model.mock.MockOperation;
import com.eviware.soapui.model.mock.MockResponse;
import com.eviware.soapui.model.mock.MockResult;
import com.eviware.soapui.model.mock.MockService;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
public abstract class AbstractMockOperation
<BaseMockOperationConfigType extends BaseMockOperationConfig, MockResponseType extends MockResponse>
extends AbstractWsdlModelItem<BaseMockOperationConfigType>
implements MockOperation, PropertyChangeListener {
public final static String DISPATCH_PATH_PROPERTY = MockOperation.class.getName() + "@dispatchpath";
public final static String DISPATCH_STYLE_PROPERTY = MockOperation.class.getName() + "@dispatchstyle";
private MockOperationDispatcher dispatcher;
private List<MockResponseType> responses = new ArrayList<MockResponseType>();
protected AbstractMockOperation(BaseMockOperationConfigType config, MockService parent, String icon) {
super(config, parent, icon);
}
protected void setupConfig(BaseMockOperationConfigType config) {
Operation operation = getOperation();
if (!config.isSetName()) {
config.setName(operation == null ? "<missing operation>" : operation.getName());
}
if (!config.isSetDefaultResponse() && getMockResponseCount() > 0) {
setDefaultResponse(getMockResponseAt(0).getName());
}
if (!config.isSetDispatchStyle()) {
config.setDispatchStyle(MockOperationDispatchStyleConfig.SEQUENCE);
setExampleScript();
}
dispatcher = MockOperationDispatchRegistry.buildDispatcher(getConfig().getDispatchStyle().toString(), this);
}
public void addMockResponse(MockResponseType response) {
responses.add(response);
}
public List<MockResponse> getMockResponses() {
return new ArrayList<MockResponse>(responses);
}
public MockResponseType getMockResponseAt(int index) {
return responses.get(index);
}
public int getMockResponseCount() {
return responses.size();
}
public MockResponseType getMockResponseByName(String name) {
return (MockResponseType) getWsdlModelItemByName(getMockResponses(), name);
}
public MockResult getLastMockResult() {
MockResult result = null;
for (MockResponse response : getMockResponses()) {
MockResult mockResult = response.getMockResult();
if (mockResult != null) {
if (result == null || result.getTimestamp() > mockResult.getTimestamp()) {
result = mockResult;
}
}
}
return result;
}
public void removeMockResponse(MockResponse mockResponse) {
int ix = responses.indexOf(mockResponse);
responses.remove(ix);
mockResponse.removePropertyChangeListener(this);
try {
(getMockService()).fireMockResponseRemoved(mockResponse);
} finally {
mockResponse.release();
removeResponseFromConfig(ix);
}
}
public abstract void removeResponseFromConfig(int index);
public String getDefaultResponse() {
return getConfig().getDefaultResponse();
}
public void setDefaultResponse(String defaultResponse) {
String old = getDefaultResponse();
getConfig().setDefaultResponse(defaultResponse);
// noone is listening? notifyPropertyChanged( WsdlMockOperation.DEFAULT_RESPONSE_PROPERTY, old, defaultResponse );
}
@Override
public String getScript() {
return getConfig().getDispatchPath();
}
@Override
public void setScript(String dispatchPath) {
String old = getScript();
getConfig().setDispatchPath(dispatchPath);
notifyPropertyChanged(DISPATCH_PATH_PROPERTY, old, dispatchPath);
}
// Hook for subclasses
public void setExampleScript() {
}
public MockOperationDispatcher getDispatcher() {
return dispatcher;
}
public void setDispatcher(MockOperationDispatcher dispatcher) {
this.dispatcher = dispatcher;
}
public String getDispatchStyle() {
return String.valueOf(getConfig().isSetDispatchStyle() ? getConfig().getDispatchStyle()
: MockOperationDispatchStyleConfig.SEQUENCE);
}
public MockOperationDispatcher setDispatchStyle(String dispatchStyle) {
String old = getDispatchStyle();
MockOperationDispatcher dispatcher = getDispatcher();
if (dispatcher != null && dispatchStyle.equals(old)) {
return dispatcher;
}
getConfig().setDispatchStyle(MockOperationDispatchStyleConfig.Enum.forString(dispatchStyle));
if (dispatcher != null) {
dispatcher.release();
}
setDispatcher(MockOperationDispatchRegistry.buildDispatcher(dispatchStyle, this));
notifyPropertyChanged(DISPATCH_STYLE_PROPERTY, old, dispatchStyle);
return dispatcher;
}
}