/*
* 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.panels.mock;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.rest.mock.RestMockResponse;
import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction;
import com.eviware.soapui.impl.wsdl.panels.mockoperation.MockResponseXmlDocument;
import com.eviware.soapui.impl.wsdl.support.HelpUrls;
import com.eviware.soapui.model.mock.MockResponse;
import com.eviware.soapui.support.MediaTypeComboBox;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.editor.inspectors.httpheaders.HttpHeadersInspector;
import com.eviware.soapui.support.editor.inspectors.httpheaders.MockResponseHeadersModel;
import com.eviware.soapui.support.xml.SyntaxEditorUtil;
import com.eviware.soapui.ui.support.AbstractMockResponseDesktopPanel;
import org.apache.commons.httpclient.HttpStatus;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.lang.reflect.Field;
import java.util.Vector;
public class RestMockResponseDesktopPanel extends
AbstractMockResponseDesktopPanel<RestMockResponse, MockResponse> {
public RestMockResponseDesktopPanel(MockResponse mockResponse) {
super((RestMockResponse) mockResponse);
init(mockResponse);
}
public JComponent addTopEditorPanel() {
JPanel topEditorPanel = new JPanel(new BorderLayout());
topEditorPanel.add(createHttpStatusPanel(), BorderLayout.NORTH);
topEditorPanel.add(createHeaderInspector(), BorderLayout.CENTER);
return topEditorPanel;
}
protected Component addBottomEditorPanel(MockResponseMessageEditor responseEditor) {
JPanel bottomEditorPanel = new JPanel(new BorderLayout());
bottomEditorPanel.add(createMediaTypeCombo(), BorderLayout.NORTH);
bottomEditorPanel.add(responseEditor, BorderLayout.CENTER);
return bottomEditorPanel;
}
public boolean hasTopEditorPanel() {
return true;
}
private JComponent createHttpStatusPanel() {
return createPanelWithLabel("Http Status Code: ", createStatusCodeCombo());
}
protected MockResponseMessageEditor buildResponseEditor() {
MockResponseXmlDocument documentContent = new MockResponseXmlDocument(getMockResponse());
MockResponseMessageEditor mockResponseMessageEditor = new MockResponseMessageEditor(documentContent);
SyntaxEditorUtil.setMediaType(mockResponseMessageEditor.getInputArea(), getModelItem().getMediaType());
return mockResponseMessageEditor;
}
private JComponent createMediaTypeCombo() {
MediaTypeComboBox mediaTypeComboBox = new MediaTypeComboBox(this.getModelItem());
mediaTypeComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
SyntaxEditorUtil.setMediaType(getResponseEditor().getInputArea(), e.getItem().toString());
}
});
JComponent innerPanel = createPanelWithLabel("Content | Media type: ", mediaTypeComboBox);
JPanel outerPanel = new JPanel();
outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.X_AXIS));
outerPanel.add(innerPanel);
outerPanel.add(Box.createHorizontalGlue());
outerPanel.add(UISupport.createFormButton(new ShowOnlineHelpAction(HelpUrls.REST_MOCK_RESPONSE_EDITOR_BODY)));
return outerPanel;
}
private JComponent createPanelWithLabel(String labelText, Component rightSideComponent) {
JPanel innerPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
innerPanel.add(new JLabel(labelText));
innerPanel.add(rightSideComponent);
return innerPanel;
}
private JComboBox createStatusCodeCombo() {
ComboBoxModel httpStatusCodeComboBoxModel = new HttpStatusCodeComboBoxModel();
final JComboBox statusCodeCombo = new JComboBox(httpStatusCodeComboBoxModel);
statusCodeCombo.setSelectedItem(CompleteHttpStatus.from(getModelItem().getResponseHttpStatus()));
statusCodeCombo.setToolTipText("Set desired HTTP status code");
statusCodeCombo.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
getModelItem().setResponseHttpStatus(((CompleteHttpStatus) statusCodeCombo.getSelectedItem()).getStatusCode());
}
});
return statusCodeCombo;
}
private JComponent createHeaderInspector() {
MockResponseHeadersModel model = new MockResponseHeadersModel(getModelItem());
HttpHeadersInspector inspector = new HttpHeadersInspector(model);
JComponent component = inspector.getComponent();
return component;
}
public boolean hasRequestEditor() {
return false;
}
@Override
public String getHelpUrl() {
return HelpUrls.REST_MOCK_RESPONSE_EDITOR;
}
}
class CompleteHttpStatus {
private int statusCode;
private String description;
private CompleteHttpStatus(int statusCode) {
this.statusCode = statusCode;
this.description = HttpStatus.getStatusText(statusCode);
}
public static CompleteHttpStatus from(int statusCode) {
return new CompleteHttpStatus(statusCode);
}
public int getStatusCode() {
return statusCode;
}
@Override
public String toString() {
return "" + statusCode + " - " + description;
}
@Override
public boolean equals(Object object) {
return ((CompleteHttpStatus) object).statusCode == statusCode;
}
}
class HttpStatusCodeComboBoxModel extends DefaultComboBoxModel {
private static Vector<CompleteHttpStatus> LIST_OF_CODES = new Vector<CompleteHttpStatus>();
static {
final String statusCodePrefix = "SC_";
for (Field statusCodeField : HttpStatus.class.getDeclaredFields()) {
try {
if (statusCodeField.getName().startsWith(statusCodePrefix)) {
LIST_OF_CODES.add(CompleteHttpStatus.from(statusCodeField.getInt(null)));
}
} catch (IllegalAccessException e) {
SoapUI.logError(e);
}
}
}
public HttpStatusCodeComboBoxModel() {
super(LIST_OF_CODES);
}
}