/*
* 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.actions;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.xml.SyntaxEditorUtil;
import com.eviware.soapui.support.xml.XmlUtils;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.lang.reflect.InvocationTargetException;
/**
* Action for starting XQuery/XPath tester - not used for now..
*
* @author Ole.Matzura
*/
public class XQueryXPathTesterAction extends AbstractAction {
private JDialog dialog;
private JSplitPane mainSplit;
private RSyntaxTextArea resultArea;
private JSplitPane querySplit;
private RSyntaxTextArea inputArea;
private JTextArea xqueryArea;
private JTextArea xpathArea;
private JTabbedPane queryTabs;
private JLabel statusLabel;
public XQueryXPathTesterAction() {
super("XQuery/XPath Tester");
}
public void actionPerformed(ActionEvent e) {
if (dialog == null) {
buildDialog();
}
dialog.setVisible(true);
}
private void buildDialog() {
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
mainSplit = UISupport.createHorizontalSplit(createQueryPanel(), createResultPanel());
mainSplit.setResizeWeight(0.4);
panel.add(mainSplit, BorderLayout.CENTER);
panel.add(createStatusBar(), BorderLayout.SOUTH);
dialog = new JDialog(UISupport.getMainFrame(), "XQuery / XPath Tester", false);
dialog.getContentPane().add(panel, BorderLayout.CENTER);
dialog.setPreferredSize(new Dimension(600, 400));
dialog.pack();
mainSplit.setDividerLocation(0.5);
querySplit.setDividerLocation(0.3);
}
private JPanel createToolbar() {
ButtonBarBuilder builder = new ButtonBarBuilder();
JButton runButton = UISupport.createToolbarButton(new RunAction());
builder.addFixed(runButton);
builder.addRelatedGap();
JButton declareNsButton = UISupport.createToolbarButton(new DeclareNSAction());
builder.addFixed(declareNsButton);
builder.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
return builder.getPanel();
}
private JComponent createStatusBar() {
JPanel panel = new JPanel(new BorderLayout());
statusLabel = new JLabel();
panel.add(statusLabel, BorderLayout.WEST);
return panel;
}
private JPanel createQueryPanel() {
JPanel panel = new JPanel(new BorderLayout());
querySplit = UISupport.createVerticalSplit(buildQueryTabs(), buildInputArea());
querySplit.setBorder(null);
querySplit.setResizeWeight(0.2);
panel.add(querySplit, BorderLayout.CENTER);
return panel;
}
private JComponent buildQueryTabs() {
JPanel panel = new JPanel(new BorderLayout());
panel.add(createToolbar(), BorderLayout.NORTH);
queryTabs = new JTabbedPane();
queryTabs.addTab("XQuery query", buildXQueryArea());
queryTabs.addTab("XPath query", buildXPathArea());
queryTabs.setTabPlacement(JTabbedPane.BOTTOM);
panel.setBackground(Color.LIGHT_GRAY);
panel.add(queryTabs, BorderLayout.CENTER);
return panel;
}
private JComponent buildXQueryArea() {
xqueryArea = new JTextArea();
return new JScrollPane(xqueryArea);
}
private JComponent buildXPathArea() {
xpathArea = new JTextArea();
return new JScrollPane(xpathArea);
}
private JComponent buildInputArea() {
inputArea = SyntaxEditorUtil.createDefaultXmlSyntaxTextArea();
return inputArea;
}
private JPanel createResultPanel() {
JPanel panel = new JPanel(new BorderLayout());
resultArea = SyntaxEditorUtil.createDefaultXmlSyntaxTextArea();
panel.add(resultArea, BorderLayout.CENTER);
return panel;
}
private class RunAction extends AbstractAction {
public RunAction() {
putValue(Action.SMALL_ICON, UISupport.createImageIcon("/submit_request.gif"));
putValue(Action.SHORT_DESCRIPTION, "Execute current query");
putValue(Action.ACCELERATOR_KEY, UISupport.getKeyStroke("alt ENTER"));
}
public void actionPerformed(ActionEvent e) {
try {
// XmlObject xmlObject = XmlObject.Factory.parse(
// inputArea.getText() );
XmlObject xmlObject = XmlUtils.createXmlObject(inputArea.getText());
XmlObject[] objects;
// xquery?
if (queryTabs.getSelectedIndex() == 0) {
objects = xmlObject.execQuery(xqueryArea.getText());
} else {
objects = xmlObject.selectPath(xpathArea.getText());
}
StringBuffer result = new StringBuffer();
XmlOptions options = new XmlOptions();
options.setSaveOuter();
for (int c = 0; c < objects.length; c++) {
result.append(objects[c].xmlText(options));
result.append("\n");
}
resultArea.setText(result.toString());
statusLabel.setText("Expression returned " + objects.length + " hits");
} catch (Throwable e1) {
if (e1 instanceof RuntimeException) {
e1 = ((RuntimeException) e1).getCause();
if (e1 instanceof InvocationTargetException) {
e1 = ((InvocationTargetException) e1).getTargetException();
}
}
statusLabel.setText(e1.getMessage());
}
}
}
private class DeclareNSAction extends AbstractAction {
public DeclareNSAction() {
putValue(Action.SMALL_ICON, UISupport.createImageIcon("/declareNs.gif"));
putValue(Action.SHORT_DESCRIPTION, "Declares namespaces in current input in xpath expression");
}
public void actionPerformed(ActionEvent e) {
try {
String namespaceDeclarations = XmlUtils.declareXPathNamespaces(inputArea.getText());
xpathArea.setText(namespaceDeclarations + xpathArea.getText());
xqueryArea.setText(namespaceDeclarations + xqueryArea.getText());
} catch (XmlException e1) {
SoapUI.logError(e1);
}
}
}
}