/* * 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.rest.mock; import com.eviware.soapui.SoapUI; import com.eviware.soapui.impl.wsdl.mock.DispatchException; import com.eviware.soapui.impl.wsdl.mock.WsdlMockRunContext; import com.eviware.soapui.model.mock.MockResult; import com.eviware.soapui.model.support.AbstractMockDispatcher; import org.apache.commons.httpclient.HttpStatus; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RestMockDispatcher extends AbstractMockDispatcher { private RestMockService mockService; private WsdlMockRunContext mockContext; public RestMockDispatcher(RestMockService mockService, WsdlMockRunContext mockContext) { this.mockService = mockService; this.mockContext = mockContext; } @Override public MockResult dispatchRequest(HttpServletRequest request, HttpServletResponse response) { RestMockRequest restMockRequest = null; Object result = null; try { restMockRequest = new RestMockRequest(request, response, mockContext); result = mockService.runOnRequestScript(mockContext, restMockRequest); if (!(result instanceof MockResult)) { result = getMockResult(restMockRequest); } mockService.runAfterRequestScript(mockContext, (MockResult) result); return (MockResult) result; } catch (Exception e) { SoapUI.logError(e, "got an exception while dispatching - returning a default 500 response"); return createServerErrorMockResult(restMockRequest); } finally { mockService.fireOnMockResult(result); } } private MockResult createServerErrorMockResult(RestMockRequest restMockRequest) { restMockRequest.getHttpResponse().setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); return new RestMockResult(restMockRequest); } private MockResult getMockResult(RestMockRequest restMockRequest) throws DispatchException { String pathToFind = getPathRemainder(restMockRequest); RestMockAction mockAction = (RestMockAction) mockService.findBestMatchedOperation(pathToFind, restMockRequest.getMethod()); if (mockAction != null) { return mockAction.dispatchRequest(restMockRequest); } else { return createNotFoundResponse(restMockRequest); } } private String getPathRemainder(RestMockRequest restMockRequest) { String pathToFind = restMockRequest.getPath(); if (!mockService.getPath().equals("/")) { pathToFind = restMockRequest.getPath().substring(mockService.getPath().length()); } return pathToFind; } private RestMockResult createNotFoundResponse(RestMockRequest restMockRequest) { restMockRequest.getHttpResponse().setStatus(HttpStatus.SC_NOT_FOUND); return new RestMockResult(restMockRequest); } }