/* * 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.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.support.DateUtil; import com.eviware.soapui.support.action.swing.ActionList; import com.eviware.soapui.support.action.swing.DefaultActionList; import com.eviware.soapui.support.types.StringToStringsMap; import org.mortbay.jetty.HttpFields; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.util.Date; import java.util.Enumeration; public class BaseMockResult<MockRequestType extends MockRequest, MockOperationType extends MockOperation> implements MockResult { private MockResponse mockResponse; private String responseContent; private long timeTaken; private long timestamp; private DefaultActionList actions; private StringToStringsMap responseHeaders = new StringToStringsMap(); private MockRequestType mockRequest; private byte[] rawResponseData; private MockOperationType mockOperation; private String responseContentType; public BaseMockResult(MockRequestType request) { timestamp = System.currentTimeMillis(); mockRequest = request; } public MockRequestType getMockRequest() { return mockRequest; } public ActionList getActions() { if (actions == null) { actions = new DefaultActionList("MockResult"); } return actions; } public MockResponse getMockResponse() { return mockResponse; } public String getResponseContent() { return responseContent; } public long getTimeTaken() { return timeTaken; } public long getTimestamp() { return timestamp; } public void setTimestamp(long timestamp) { this.timestamp = timestamp; } public void setTimeTaken(long timeTaken) { this.timeTaken = timeTaken; } public StringToStringsMap getResponseHeaders() { return responseHeaders; } public void setMockResponse(MockResponse mockResponse) { this.mockResponse = mockResponse; mockRequest.getRequestContext().setMockResponse(mockResponse); } public void setResponseContent(String responseContent) { this.responseContent = responseContent; } @SuppressWarnings("unchecked") public void finish() { if (mockRequest.getHttpResponse() instanceof org.mortbay.jetty.Response) { HttpFields httpFields = ((org.mortbay.jetty.Response) mockRequest.getHttpResponse()).getHttpFields(); Enumeration<String> e = httpFields.getFieldNames(); while (e.hasMoreElements()) { String nextElement = e.nextElement(); responseHeaders.add(nextElement, httpFields.getStringField(nextElement)); } } } public void addHeader(String name, String value) { HttpServletResponse httpResponse = mockRequest.getHttpResponse(); if (httpResponse != null) { httpResponse.addHeader(name, value); } responseHeaders.add(name, value); } public boolean isCommitted() { return mockRequest.getHttpResponse().isCommitted(); } public void setContentType(String contentType) { mockRequest.getHttpResponse().setContentType(contentType); responseContentType = contentType; } public OutputStream getOutputStream() throws IOException { return mockRequest.getHttpResponse().getOutputStream(); } public boolean isDiscarded() { return false; } public byte[] getRawResponseData() { return rawResponseData; } public void setRawResponseData(byte[] rawResponseData) { this.rawResponseData = rawResponseData; } public void writeRawResponseData(byte[] bs) throws IOException { getOutputStream().write(bs); setRawResponseData(bs); } public void setMockOperation(MockOperationType mockOperation) { this.mockOperation = mockOperation; } public MockOperation getMockOperation() { if (mockOperation != null) { return mockOperation; } return mockResponse == null ? null : mockResponse.getMockOperation(); } public String getResponseContentType() { return responseContentType; } public String toString() { StringBuilder msg = new StringBuilder(DateUtil.formatExtraFull(new Date(getTimestamp()))); MockResponse mockResponse = getMockResponse(); if (mockResponse == null) { msg.append(": [dispatch error; missing response]"); } else { try { msg.append(": [" + mockResponse.getMockOperation().getName()); } catch (Throwable e) { msg.append(": [removed operation?]"); } msg.append("] " + getTimeTaken() + "ms"); } return msg.toString(); } }