/*
* 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.request.views.json;
import com.eviware.soapui.impl.support.panels.AbstractHttpXmlRequestDesktopPanel.HttpResponseDocument;
import com.eviware.soapui.impl.wsdl.support.MessageExchangeModelItem;
import com.eviware.soapui.model.iface.MessageExchange;
import com.eviware.soapui.support.JsonUtil;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.components.JXToolBar;
import com.eviware.soapui.support.editor.views.AbstractXmlEditorView;
import com.eviware.soapui.support.editor.xml.XmlEditor;
import com.eviware.soapui.support.xml.SyntaxEditorUtil;
import net.sf.json.JSON;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rtextarea.RTextScrollPane;
import javax.swing.JComponent;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
@SuppressWarnings("unchecked")
public class JsonResponseMessageExchangeView extends AbstractXmlEditorView<HttpResponseDocument> implements
PropertyChangeListener {
private final MessageExchangeModelItem messageExchangeModelItem;
private JPanel contentPanel;
private RSyntaxTextArea contentEditor;
private boolean updatingRequest;
private JPanel panel;
public JsonResponseMessageExchangeView(XmlEditor editor, MessageExchangeModelItem messageExchangeModelItem) {
super("JSON", editor, JsonResponseViewFactory.VIEW_ID);
this.messageExchangeModelItem = messageExchangeModelItem;
messageExchangeModelItem.addPropertyChangeListener(this);
}
public JComponent getComponent() {
if (panel == null) {
panel = new JPanel(new BorderLayout());
panel.add(buildToolbar(), BorderLayout.NORTH);
panel.add(buildContent(), BorderLayout.CENTER);
panel.add(buildStatus(), BorderLayout.SOUTH);
}
return panel;
}
@Override
public void release() {
super.release();
messageExchangeModelItem.removePropertyChangeListener(this);
}
private Component buildStatus() {
return new JPanel();
}
private Component buildContent() {
contentPanel = new JPanel(new BorderLayout());
contentEditor = SyntaxEditorUtil.createDefaultJsonSyntaxTextArea();
MessageExchange me = messageExchangeModelItem.getMessageExchange();
if (me != null) {
setEditorContent(me);
}
RTextScrollPane scrollPane = new RTextScrollPane(contentEditor);
scrollPane.setLineNumbersEnabled(true);
scrollPane.setFoldIndicatorEnabled(true);
contentPanel.add(scrollPane);
contentEditor.setEditable(false);
return contentPanel;
}
protected void setEditorContent(MessageExchange me) {
if (me == null) {
contentEditor.setText("");
} else {
String content = "<Not JSON content>";
if (JsonUtil.seemsToBeJsonContentType(me.getResponseHeaders().get("Content-Type", ""))) {
try {
JSON json = new JsonUtil().parseTrimmedText(me.getResponseContent());
if (json.isEmpty()) {
content = "<Empty JSON content>";
} else {
content = json.toString(3);
}
} catch (Throwable e) {
if (!"Invalid JSON String".equals(e.getMessage())) {
e.printStackTrace();
} else {
content = me.getResponseContent();
}
}
contentEditor.setText(content);
} else {
contentEditor.setText("<Not JSON content>");
}
}
}
private Component buildToolbar() {
JXToolBar toolbar = UISupport.createToolbar();
return toolbar;
}
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("messageExchange") && !updatingRequest) {
setEditorContent(((MessageExchange) evt.getNewValue()));
}
}
public boolean saveDocument(boolean validate) {
return false;
}
public void setEditable(boolean enabled) {
}
}