/******************************************************************************* * Copyright (c) 2011 - 2014 Red Hat, Inc. and others. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.ws.ui.views; import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Stack; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.wsdl.Binding; import javax.wsdl.BindingOperation; import javax.wsdl.Definition; import javax.wsdl.Port; import javax.wsdl.PortType; import javax.wsdl.Service; import javax.wsdl.WSDLException; import javax.wsdl.extensions.ExtensibilityElement; import javax.wsdl.extensions.soap.SOAPOperation; import javax.wsdl.extensions.soap12.SOAP12Operation; import javax.xml.namespace.QName; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPMessage; import org.apache.axis.soap.MessageFactoryImpl; import org.apache.axis.utils.XMLUtils; import org.eclipse.core.resources.IStorage; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.IJobChangeListener; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.CoolBar; import org.eclipse.swt.widgets.CoolItem; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IStorageEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.events.ExpansionAdapter; import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.ScrolledPageBook; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.part.ViewPart; import org.jboss.tools.ws.ui.JBossWSUIPlugin; import org.jboss.tools.ws.ui.dialogs.WSTesterURLInputsDialog; import org.jboss.tools.ws.ui.messages.JBossWSUIMessages; import org.jboss.tools.ws.ui.utils.JAXRSTester; import org.jboss.tools.ws.ui.utils.JAXWSTester2; import org.jboss.tools.ws.ui.utils.ResultsXMLStorage; import org.jboss.tools.ws.ui.utils.ResultsXMLStorageInput; import org.jboss.tools.ws.ui.utils.SOAPDOMParser; import org.jboss.tools.ws.ui.utils.SchemaUtils; import org.jboss.tools.ws.ui.utils.TesterWSDLUtils; import org.jboss.tools.ws.ui.utils.TreeParent; import org.jboss.tools.ws.ui.utils.WSTestUtils; import org.jboss.wise.ui.internal.util.WiseUtil; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * View for testing web services (JAX-WS & JAX-RS) * @author bfitzpat * */ public class JAXRSWSTestView2 extends ViewPart { private static final String PAGE1_KEY = "page1"; //$NON-NLS-1$ private static final String PAGE2_KEY = "page2"; //$NON-NLS-1$ private static final String DEFAULT_TEXT_EDITOR_ID = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$ private static final String XML_EDITOR_ID = "org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart"; //$NON-NLS-1$ private static final String DELETE = "DELETE";//$NON-NLS-1$ private static final String PUT = "PUT";//$NON-NLS-1$ private static final String POST = "POST";//$NON-NLS-1$ private static final String GET = "GET";//$NON-NLS-1$ private static final String OPTIONS = "OPTIONS";//$NON-NLS-1$ private static final String JAX_WS = "JAX-WS"; //$NON-NLS-1$ private static final String JAX_RS = "JAX-RS"; //$NON-NLS-1$ private static final String EMPTY_STRING = ""; //$NON-NLS-1$ private static final String RESULT_HEADER_DELIMITER = "%";//$NON-NLS-1$ private static final String HTTPS_STRING = "https";//$NON-NLS-1$ private static final String[] TREE_COLUMNS = new String[] { "name", "value" }; //$NON-NLS-1$ //$NON-NLS-2$ /** * The ID of the view as specified by the extension. */ public static final String ID = "org.jboss.tools.ws.ui.tester.views.TestWSView";//$NON-NLS-1$ /* UI controls */ private Text resultsText; private Browser resultsBrowser; private Combo urlCombo; private DelimitedStringList dlsList; private Combo methodCombo; private Text bodyText; private List resultHeadersList; private TreeViewer treeRequestBody; private ScrolledPageBook requestPageBook; private ShowInTreeAction treeAction; private ShowRawRequestAction rawRequestAction; private DelimitedStringList parmsList; private SOAPEnvelope envelope; private SOAPBody soapbody; private MenuItem openInXMLEditorAction; private MenuItem openResponseTagInXMLEditor; private Menu resultsTextMenu; private MenuItem copyMenuAction; private Menu resultsHeaderMenu; private MenuItem copyResultHeaderMenuAction; private String[] serviceNSMessage = null; // private String actionText = null; private FormToolkit toolkit; private ScrolledForm form; private ImageRegistry mImageRegistry; private static final String IMG_DESC_WSDL = "icons/obj16/wsdl.gif"; //$NON-NLS-1$ private static final String IMG_DESC_START = "icons/obj16/run.gif"; //$NON-NLS-1$ private static final String IMG_DESC_SHOWRAW = "icons/obj16/binary.gif"; //$NON-NLS-1$ private static final String IMG_DESC_SHOWTREE = "icons/obj16/hierarchicalLayout.gif"; //$NON-NLS-1$ private static final String IMG_DESC_SHOWWEB = "icons/obj16/web.gif"; //$NON-NLS-1$ private static final String IMG_DESC_SHOWEDITOR = "icons/obj16/properties.gif"; //$NON-NLS-1$ private static final String IMG_DESC_SAVE = "icons/obj16/save_edit.gif"; //$NON-NLS-1$ private ToolItem openWSDLToolItem; private ToolItem startToolItem; private ScrolledPageBook pageBook; private ShowRawAction rawAction; private ShowInBrowserAction browserAction; private TestHistory history = new TestHistory(); private TestHistoryEntry currentHistoryEntry = null; private Button useBasicAuthCB; private boolean restoringFromHistoryEntry = false; /** * The constructor. */ public JAXRSWSTestView2() { } public void setWSDLURL( String url ) { this.urlCombo.setText(url); this.methodCombo.setText(JAX_WS); setControlsForWSType(JAX_WS); setControlsForMethodType(methodCombo.getText()); setControlsForSelectedURL(); } public void setJAXRS ( String url, String method ) { this.urlCombo.setText(url); this.bodyText.setText(EMPTY_STRING); this.treeRequestBody.setInput(null); this.resultsText.setText(EMPTY_STRING); this.resultsBrowser.setText(EMPTY_STRING); // getCurrentHistoryEntry().setUrl(url); String uCaseMethod = method.toUpperCase(); if (uCaseMethod.equalsIgnoreCase(GET)) this.methodCombo.setText(GET); else if (uCaseMethod.equalsIgnoreCase(POST)) this.methodCombo.setText(POST); else if (uCaseMethod.equalsIgnoreCase(PUT)) this.methodCombo.setText(PUT); else if (uCaseMethod.equalsIgnoreCase(DELETE)) this.methodCombo.setText(DELETE); else if (uCaseMethod.equalsIgnoreCase(OPTIONS)) this.methodCombo.setText(OPTIONS); getCurrentHistoryEntry().setMethod(methodCombo.getText()); setControlsForWSType(JAX_RS); setControlsForMethodType(methodCombo.getText()); setControlsForSelectedURL(); } private void getImages() { mImageRegistry = new ImageRegistry(); mImageRegistry.put(IMG_DESC_WSDL, ImageDescriptor .createFromURL(JBossWSUIPlugin.getDefault().getBundle() .getEntry(IMG_DESC_WSDL))); mImageRegistry.put(IMG_DESC_START, ImageDescriptor .createFromURL(JBossWSUIPlugin.getDefault().getBundle() .getEntry(IMG_DESC_START))); mImageRegistry.put(IMG_DESC_SHOWRAW, ImageDescriptor .createFromURL(JBossWSUIPlugin.getDefault().getBundle() .getEntry(IMG_DESC_SHOWRAW))); mImageRegistry.put(IMG_DESC_SHOWWEB, ImageDescriptor .createFromURL(JBossWSUIPlugin.getDefault().getBundle() .getEntry(IMG_DESC_SHOWWEB))); mImageRegistry.put(IMG_DESC_SHOWEDITOR, ImageDescriptor .createFromURL(JBossWSUIPlugin.getDefault().getBundle() .getEntry(IMG_DESC_SHOWEDITOR))); mImageRegistry.put(IMG_DESC_SAVE, ImageDescriptor .createFromURL(JBossWSUIPlugin.getDefault().getBundle() .getEntry(IMG_DESC_SAVE))); mImageRegistry.put(IMG_DESC_SHOWTREE, ImageDescriptor .createFromURL(JBossWSUIPlugin.getDefault().getBundle() .getEntry(IMG_DESC_SHOWTREE))); } private void createRequestToolbar ( ExpandableComposite parent ) { // create a couple of actions for toggling views rawRequestAction = new ShowRawRequestAction(); rawRequestAction.setChecked(true); treeAction = new ShowInTreeAction(); ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); ToolBar toolbar = toolBarManager.createControl(parent); toolBarManager.add(rawRequestAction); toolBarManager.add(treeAction); toolBarManager.update(true); parent.setTextClient(toolbar); } private void createResponseToolbar ( ExpandableComposite parent ) { // create a couple of actions for toggling views rawAction = new ShowRawAction(); rawAction.setChecked(true); browserAction = new ShowInBrowserAction(); ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); ToolBar toolbar = toolBarManager.createControl(parent); toolBarManager.add(new FileSaveAction()); toolBarManager.add(new OpenInXMLEditorAction()); toolBarManager.add(rawAction); toolBarManager.add(browserAction); toolBarManager.update(true); parent.setTextClient(toolbar); } class FormExpansionAdapter extends ExpansionAdapter { public void expansionStateChanged(ExpansionEvent e) { form.setRedraw(false); form.reflow(true); form.layout(true, true); form.setRedraw(true); } } class OpenInXMLEditorAction extends Action { @Override public void run() { openXMLEditor(resultsText.getText()); } @Override public String getToolTipText() { return JBossWSUIMessages.JAXRSWSTestView2_OpenInEditor_Action; } @Override public ImageDescriptor getImageDescriptor() { return mImageRegistry.getDescriptor(IMG_DESC_SHOWEDITOR); } } class FileSaveAction extends Action { @Override public void run() { IStatus status = WSTestUtils.saveTextToFile(resultsText.getText()); if (status.getCode() == IStatus.ERROR) { MessageDialog.openError(new Shell(Display.getCurrent()), JBossWSUIMessages.JAXRSWSTestView2_SaveResponseText_Error, status.getMessage()); } } @Override public String getToolTipText() { return JBossWSUIMessages.JAXRSWSTestView2_SaveResponseText_tooltip; } @Override public ImageDescriptor getImageDescriptor() { return mImageRegistry.getDescriptor(IMG_DESC_SAVE); } } class ToggleAction extends Action { public ToggleAction ( ) { super(null, IAction.AS_CHECK_BOX); } } class ShowInBrowserAction extends ToggleAction { public void run() { if (rawAction.isChecked()) rawAction.setChecked(false); if (JAXRSWSTestView2.this.resultsText.getText().length() > 0 ) { JAXRSWSTestView2.this.resultsBrowser.setText (JAXRSWSTestView2.this.resultsText.getText()); } JAXRSWSTestView2.this.pageBook.showPage(PAGE2_KEY); } @Override public String getToolTipText() { return JBossWSUIMessages.JAXRSWSTestView2_ShowInBrowser_Tooltip; } @Override public ImageDescriptor getImageDescriptor() { return mImageRegistry.getDescriptor(IMG_DESC_SHOWWEB); } } class ShowRawAction extends ToggleAction { public void run() { if (browserAction.isChecked()) browserAction.setChecked(false); JAXRSWSTestView2.this.pageBook.showPage(PAGE1_KEY); } @Override public String getToolTipText() { return JBossWSUIMessages.JAXRSWSTestView2_ShowRaw_Tooltip; } @Override public ImageDescriptor getImageDescriptor() { return mImageRegistry.getDescriptor(IMG_DESC_SHOWRAW); } } class ShowRawRequestAction extends ToggleAction { public void run() { if (treeAction.isChecked()) treeAction.setChecked(false); JAXRSWSTestView2.this.requestPageBook.showPage(PAGE1_KEY); } @Override public String getToolTipText() { return JBossWSUIMessages.JAXRSWSTestView2_ShowRequestXML_toolbar_btn; } @Override public ImageDescriptor getImageDescriptor() { return mImageRegistry.getDescriptor(IMG_DESC_SHOWRAW); } } class ShowInTreeAction extends ToggleAction { public void run() { if (rawRequestAction.isChecked()) rawRequestAction.setChecked(false); String rawRequestBody = JAXRSWSTestView2.this.bodyText.getText(); if (rawRequestBody.trim().length() > 0 ) { JAXRSWSTestView2.this.treeRequestBody.setInput(rawRequestBody); } else { JAXRSWSTestView2.this.treeRequestBody.setInput(null); } JAXRSWSTestView2.this.requestPageBook.showPage(PAGE2_KEY); } @Override public String getToolTipText() { return JBossWSUIMessages.JAXRSWSTestView2_ShowRequestTree_toolbar_btn; } @Override public ImageDescriptor getImageDescriptor() { return mImageRegistry.getDescriptor(IMG_DESC_SHOWTREE); } } private String getCurrentTestType() { if (methodCombo.getText().equalsIgnoreCase(JAX_WS)) return JAX_WS; return JAX_RS; } private boolean getWSDLSpecifics( String opName ) { if (opName != null) { String opNameInBody = getOpNameFromRequestBody(); if (opNameInBody != null) { boolean isRequestSOAP12 = TesterWSDLUtils.isRequestBodySOAP12(getCurrentHistoryEntry().getBody()); String urlText = urlCombo.getText(); if (urlText != null) { try { URL tempURL = new URL(urlText); Definition wsdlDef = TesterWSDLUtils.readWSDLURL(tempURL); Map<?, ?> bindings = wsdlDef.getAllBindings(); Iterator<?> iter = bindings.entrySet().iterator(); while (iter.hasNext()) { Entry<?, ?> mapEntry = (Entry<?, ?>) iter.next(); Binding binding = (Binding) mapEntry.getValue(); Iterator<?> iter2 = binding.getBindingOperations().iterator(); while (iter2.hasNext()) { BindingOperation bindOp = (BindingOperation) iter2.next(); String tempOpName = opNameInBody; if (tempOpName.indexOf(':') > -1) { tempOpName = tempOpName.substring(tempOpName.indexOf(':') + 1); } if (bindOp.getName().contentEquals(opNameInBody) || bindOp.getName().contentEquals(tempOpName)) { Iterator<?> iter3 = bindOp.getExtensibilityElements().iterator(); while (iter3.hasNext()) { ExtensibilityElement extEl = (ExtensibilityElement) iter3.next(); if (extEl.getElementType().getLocalPart().contentEquals("operation")) { //$NON-NLS-1$ String actionURL = null; String[] nsArray = null; if (!isRequestSOAP12 && extEl instanceof SOAPOperation) { SOAPOperation soapOp = (SOAPOperation) extEl; actionURL = soapOp.getSoapActionURI(); } else if (isRequestSOAP12 && extEl instanceof SOAP12Operation) { SOAP12Operation soapOp = (SOAP12Operation) extEl; actionURL = soapOp.getSoapActionURI(); } if (actionURL != null) { PortType portType = binding.getPortType(); String ns = portType.getQName().getNamespaceURI(); QName bindingQName = binding.getQName(); Map<?,?> services = wsdlDef.getAllServices(); Iterator<?> iter4 = services.entrySet().iterator(); while (iter4.hasNext()) { Entry<?, ?> serviceEntry = (Entry<?, ?>) iter4.next(); Service service = (Service) serviceEntry.getValue(); Iterator<?> iter5 = service.getPorts().entrySet().iterator(); while (iter5.hasNext()) { Entry<?, ?> portEntry = (Entry<?, ?>) iter5.next(); Port port = (Port) portEntry.getValue(); if (port.getBinding().getQName().equals(bindingQName)) { String serviceName = service.getQName().getLocalPart(); String portName = port.getName(); nsArray = new String[] {ns, serviceName, portName}; if (actionURL != null) { getCurrentHistoryEntry().setAction(actionURL); } if (nsArray != null) { getCurrentHistoryEntry().setServiceNSMessage(nsArray); return true; } } } } } } } } } } } catch (MalformedURLException e) { e.printStackTrace(); } catch (WSDLException e) { e.printStackTrace(); } } } } WSDLBrowseDialog wbDialog = new WSDLBrowseDialog(getSite().getShell()); if (urlCombo.getText().length() > 0) { wbDialog.setURLText(urlCombo.getText()); } if (opName != null) { wbDialog.setInitialOperationTextValue(opName); } int rtnCode = wbDialog.open(); if (rtnCode == Window.OK){ getCurrentHistoryEntry().setServiceNSMessage(null); getCurrentHistoryEntry().setAction(""); //$NON-NLS-1$ getCurrentHistoryEntry().setWsdlDef(null); getCurrentHistoryEntry().setServiceName(null); getCurrentHistoryEntry().setPortName(null); getCurrentHistoryEntry().setBindingName(null); getCurrentHistoryEntry().setOperationName(null); serviceNSMessage = null; Definition wsdlDef = wbDialog.getWSDLDefinition(); getCurrentHistoryEntry().setWsdlDef(wsdlDef); getCurrentHistoryEntry().setServiceName(wbDialog.getServiceTextValue()); getCurrentHistoryEntry().setPortName(wbDialog.getPortTextValue()); getCurrentHistoryEntry().setBindingName(wbDialog.getBindingValue()); getCurrentHistoryEntry().setOperationName(wbDialog.getOperationTextValue()); getCurrentHistoryEntry().setUrl(wbDialog.getWSDLText()); urlCombo.setText(wbDialog.getWSDLText()); String output = WiseUtil.getSampleSOAPInputMessageFromWISE(wsdlDef, wbDialog.getServiceTextValue(), wbDialog.getPortTextValue(), wbDialog.getBindingValue(), wbDialog.getOperationTextValue()); String endpointURL = TesterWSDLUtils.getEndpointURL(wsdlDef, wbDialog.getServiceTextValue(), wbDialog.getPortTextValue(), wbDialog.getBindingValue(), wbDialog.getOperationTextValue()); getCurrentHistoryEntry().setUrl(endpointURL); String actionURL = TesterWSDLUtils.getActionURL(wsdlDef, wbDialog.getServiceTextValue(), wbDialog.getPortTextValue(), wbDialog.getBindingValue(), wbDialog.getOperationTextValue()); getCurrentHistoryEntry().setAction(actionURL); serviceNSMessage = TesterWSDLUtils.getNSServiceNameAndMessageNameArray(wsdlDef, wbDialog.getServiceTextValue(), wbDialog.getPortTextValue(), wbDialog.getBindingValue(), wbDialog.getOperationTextValue()); getCurrentHistoryEntry().setServiceNSMessage(serviceNSMessage); boolean isSOAP12 = TesterWSDLUtils.isSOAP12(wsdlDef, wbDialog.getServiceTextValue(), wbDialog.getPortTextValue()); getCurrentHistoryEntry().setSOAP12(isSOAP12); String headerText = SchemaUtils.getSampleSOAPMessageHeader(wsdlDef, wbDialog.getServiceTextValue(), wbDialog.getPortTextValue(), wbDialog.getBindingValue(), wbDialog.getOperationTextValue()); String soapIn = generateSampleSOAP(headerText, output, isSOAP12); if (opName != null) { if (bodyText.getText().length() > 0) { String opNameInBody = getOpNameFromRequestBody(); if (opNameInBody == null) { bodyText.setText(soapIn); treeRequestBody.setInput(soapIn); getCurrentHistoryEntry().setBody(soapIn); getCurrentHistoryEntry().setAction(actionURL); } else if (!opNameInBody.contentEquals(getCurrentHistoryEntry().getOperationName())){ if (MessageDialog.openQuestion(getSite().getShell(), JBossWSUIMessages.JAXRSWSTestView2_Title_Msg_May_Be_Out_of_Date, JBossWSUIMessages.JAXRSWSTestView2_Text_Msg_May_Be_Out_of_Date)) { bodyText.setText(soapIn); treeRequestBody.setInput(soapIn); getCurrentHistoryEntry().setBody(soapIn); getCurrentHistoryEntry().setAction(actionURL); } } } } else if (bodyText.getText().length() > 0) { String opNameInBody = getOpNameFromRequestBody(); boolean isRequestSOAP12 = TesterWSDLUtils.isRequestBodySOAP12(getCurrentHistoryEntry().getBody()); if (opNameInBody == null || isSOAP12 != isRequestSOAP12 ) { bodyText.setText(soapIn); treeRequestBody.setInput(soapIn); getCurrentHistoryEntry().setBody(soapIn); getCurrentHistoryEntry().setAction(actionURL); } else if (!opNameInBody.contentEquals(getCurrentHistoryEntry().getOperationName())) { if (MessageDialog.openQuestion(getSite().getShell(), JBossWSUIMessages.JAXRSWSTestView2_Title_Msg_May_Be_Out_of_Date, JBossWSUIMessages.JAXRSWSTestView2_Text_Msg_May_Be_Out_of_Date)) { bodyText.setText(soapIn); treeRequestBody.setInput(soapIn); getCurrentHistoryEntry().setBody(soapIn); getCurrentHistoryEntry().setAction(actionURL); } } } setControlsForWSType(getCurrentTestType()); setControlsForMethodType(methodCombo.getText()); setControlsForSelectedURL(); return true; } return false; } private void createURLAndToolbar( ) { urlCombo = new Combo(form.getBody(), SWT.BORDER | SWT.DROP_DOWN); GridData gdURL = new GridData(SWT.FILL, SWT.NONE, true, false); urlCombo.setLayoutData(gdURL); toolkit.adapt(urlCombo); urlCombo.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (e.getSource().equals(urlCombo)) { String newURL = urlCombo.getText(); String oldURL = null; if (getCurrentHistoryEntry() != null && getCurrentHistoryEntry().getUrl() != null && getCurrentHistoryEntry().getUrl().trim().length() > 0) { oldURL = getCurrentHistoryEntry().getUrl(); } if (newURL != null && oldURL == null) { setControlsForSelectedURL(); getCurrentHistoryEntry().setUrl(newURL); getCurrentHistoryEntry().setAction(null); } } } }); urlCombo.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { setControlsForSelectedURL(); getCurrentHistoryEntry().setUrl(urlCombo.getText()); getCurrentHistoryEntry().setAction(null); if (e.keyCode == SWT.CR) { handleTest(getCurrentTestType()); } } }); urlCombo.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } public void widgetSelected(SelectionEvent e) { String testURL = urlCombo.getText(); TestHistoryEntry entry = history.findEntryByURL(testURL); // System.out.println(new Timestamp(System.currentTimeMillis())); // System.out.println(history.toString()); if (entry != null) { try { currentHistoryEntry = (TestHistoryEntry) entry.clone(); // currentHistoryEntry = entry; // getCurrentHistoryEntry().setAction(null); setControlsForSelectedEntry(entry); } catch (CloneNotSupportedException e1) { e1.printStackTrace(); } } else { getCurrentHistoryEntry().setUrl(urlCombo.getText()); getCurrentHistoryEntry().setAction(null); setControlsForSelectedURL(); } } }); Composite comp1 = toolkit.createComposite(form.getBody()); comp1.setLayoutData(new GridData(SWT.END, SWT.NONE, false, false)); comp1.setLayout(new FillLayout()); CoolBar coolBar = new CoolBar(comp1, SWT.FLAT); coolBar.setLocked(true); coolBar.setBackground(form.getBody().getBackground()); CoolItem wsMethodCoolItem = new CoolItem(coolBar, SWT.PUSH | SWT.FLAT); methodCombo = new Combo(coolBar, SWT.BORDER | SWT.READ_ONLY); methodCombo.setBackground(form.getBody().getBackground()); String[] methods = {JAX_WS, GET, POST, PUT, DELETE, OPTIONS}; methodCombo.setItems(methods); methodCombo.pack(); Point size = methodCombo.computeSize (SWT.DEFAULT, SWT.DEFAULT); wsMethodCoolItem.setPreferredSize (wsMethodCoolItem.computeSize (size.x, size.y)); wsMethodCoolItem.setControl(methodCombo); methodCombo.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } public void widgetSelected(SelectionEvent e) { getCurrentHistoryEntry().setMethod(methodCombo.getText()); setControlsForWSType(getCurrentTestType()); setControlsForMethodType(methodCombo.getText()); setControlsForSelectedURL(); } }); toolkit.adapt(methodCombo); CoolItem topCoolItem = new CoolItem(coolBar, SWT.FLAT); ToolBar topToolBar = new ToolBar(coolBar,SWT.HORIZONTAL| SWT.FLAT); topToolBar.setBackground(form.getBody().getBackground()); openWSDLToolItem = new ToolItem(topToolBar, SWT.PUSH); openWSDLToolItem.setImage(mImageRegistry.get(IMG_DESC_WSDL)); openWSDLToolItem.setToolTipText(JBossWSUIMessages.JAXRSWSTestView2_GetFromWSDL_Tooltip); openWSDLToolItem.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { getWSDLSpecifics(null); } public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } }); startToolItem = new ToolItem(topToolBar, SWT.PUSH| SWT.FLAT); startToolItem.setImage(mImageRegistry.get(IMG_DESC_START)); startToolItem.setToolTipText(JBossWSUIMessages.JAXRSWSTestView2_Go_Tooltip); startToolItem.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { handleTest(getCurrentTestType()); } public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } }); topToolBar.pack(); size = topToolBar.getSize(); topCoolItem.setControl(topToolBar); topCoolItem.setSize(topCoolItem.computeSize(size.x, size.y)); toolkit.adapt(coolBar); } private void createRequestSide( SashForm sashForm ) { Section section = toolkit.createSection(sashForm, Section.TITLE_BAR| Section.TWISTIE|Section.EXPANDED); section.setText(JBossWSUIMessages.JAXRSWSTestView2_RequestDetails_Section); Composite sectionClient = toolkit.createComposite(section); sectionClient.setLayout(new GridLayout()); sectionClient.setLayoutData(new GridData()); useBasicAuthCB = toolkit.createButton(sectionClient, JBossWSUIMessages.JAXRSWSTestView2_Checkbox_Basic_Authentication, SWT.CHECK); GridData gd10 = new GridData(SWT.FILL, SWT.NONE, true, false); gd10.horizontalIndent = 3; useBasicAuthCB.setLayoutData(gd10); ExpandableComposite ec = toolkit.createExpandableComposite(sectionClient, ExpandableComposite.TREE_NODE| ExpandableComposite.TITLE_BAR | ExpandableComposite.CLIENT_INDENT); ec.setText(JBossWSUIMessages.JAXRSWSTestView2_Headers_Section); dlsList = new DelimitedStringList(ec, SWT.None, false, false); dlsList.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e) { getCurrentHistoryEntry().setHeaders(dlsList.getSelection()); getCurrentHistoryEntry().setAction(null); } }); ec.setClient(dlsList); toolkit.adapt(dlsList); GridData gd2 = new GridData(SWT.FILL, SWT.FILL, true, false); ec.setLayoutData(gd2); ec.addExpansionListener(new FormExpansionAdapter()); ExpandableComposite ec3 = toolkit.createExpandableComposite(sectionClient, ExpandableComposite.TREE_NODE| ExpandableComposite.TITLE_BAR | ExpandableComposite.CLIENT_INDENT); ec3.setText(JBossWSUIMessages.JAXRSWSTestView2_Parameters_Section); parmsList = new DelimitedStringList(ec3, SWT.None, false, false); parmsList.setShowUpDown(false); parmsList.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e) { getCurrentHistoryEntry().setParms(parmsList.getSelection()); getCurrentHistoryEntry().setAction(null); } }); ec3.setClient(parmsList); toolkit.adapt(parmsList); GridData gd4 = new GridData(SWT.FILL, SWT.FILL, true, false); ec3.setLayoutData(gd4); ec3.addExpansionListener(new FormExpansionAdapter()); ExpandableComposite ec5 = toolkit.createExpandableComposite(sectionClient, ExpandableComposite.TWISTIE| ExpandableComposite.CLIENT_INDENT | ExpandableComposite.EXPANDED); ec5.setText(JBossWSUIMessages.JAXRSWSTestView2_BodyText_Section); requestPageBook = toolkit.createPageBook(ec5, SWT.NONE); createRequestToolbar(ec5); Composite page1 = requestPageBook.createPage(PAGE1_KEY); page1.setLayout(new GridLayout()); bodyText = toolkit.createText(page1, EMPTY_STRING, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL); GridData gd7 = new GridData(SWT.FILL, SWT.FILL, true, true); // gd7.minimumHeight = 100; gd7.heightHint = 1; bodyText.setLayoutData(gd7); requestPageBook.showPage(PAGE1_KEY); Composite page2 = requestPageBook.createPage(PAGE2_KEY); page2.setLayout(new GridLayout()); treeRequestBody = new TreeViewer(page2, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.FULL_SELECTION ); JAXRSWSTestView2.this.treeRequestBody.setAutoExpandLevel(TreeViewer.ALL_LEVELS); GridData gd11 = new GridData(SWT.FILL, SWT.FILL, true, true); gd11.heightHint = 1; // gd10.minimumHeight = 100; toolkit.adapt(treeRequestBody.getTree()); treeRequestBody.getTree().setLayoutData(gd11); treeRequestBody.getTree().setHeaderVisible(true); TreeColumn nameColumn = new TreeColumn(treeRequestBody.getTree(), SWT.LEFT); nameColumn.setText(JBossWSUIMessages.JAXRSWSTestView2_Name_column); nameColumn.setWidth(200); TreeColumn valueColumn = new TreeColumn(treeRequestBody.getTree(), SWT.LEFT); valueColumn.setText(JBossWSUIMessages.JAXRSWSTestView2_Value_column); valueColumn.setWidth(200); treeRequestBody.setColumnProperties(TREE_COLUMNS); treeRequestBody.setLabelProvider(new ITableLabelProvider() { @Override public void addListener(ILabelProviderListener listener) { } @Override public void dispose() { } @Override public boolean isLabelProperty(Object element, String property) { if (element instanceof TreeParent && property.equalsIgnoreCase("name")) { //$NON-NLS-1$ return true; } else if (element instanceof TreeParent && property.equalsIgnoreCase("value")) { //$NON-NLS-1$ return true; } return false; } @Override public void removeListener(ILabelProviderListener listener) { } @Override public Image getColumnImage(Object element, int columnIndex) { return null; } @Override public String getColumnText(Object element, int columnIndex) { if (element instanceof TreeParent && columnIndex == 0) { return ((TreeParent)element).getName(); } else if (element instanceof TreeParent && columnIndex == 1) { TreeParent tp = (TreeParent) element; if (tp.getData() != null && tp.getData() instanceof Element) { Element tpelement = (Element) tp.getData(); if (tpelement.getChildNodes() != null && tpelement.getChildNodes().getLength() > 0) { Node node = tpelement.getChildNodes().item(0); if (node.getNodeType() == Node.TEXT_NODE) { return node.getTextContent(); } } } } return null; } }); treeRequestBody.setContentProvider(new ITreeContentProvider(){ String text; TreeParent tree; @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { if (newInput instanceof String) { text = (String) newInput; SOAPDOMParser parser = new SOAPDOMParser(); parser.parseXmlFile(text); if (parser.getRoot().getChildren().length > 0) tree = (TreeParent) parser.getRoot().getChildren()[0]; else tree = null; } } @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof String && tree != null) { return new Object[] {this.tree}; } else if (inputElement instanceof TreeParent) { return ((TreeParent)inputElement).getChildren(); } return null; } @Override public Object[] getChildren(Object parentElement) { if (parentElement == null && tree != null) { return new Object[] {this.tree}; } else if (parentElement instanceof TreeParent && ((TreeParent)parentElement).hasChildren()) { return ((TreeParent)parentElement).getChildren(); } return null; } @Override public Object getParent(Object element) { if (element instanceof TreeParent) { return ((TreeParent)element).getParent(); } return null; } @Override public boolean hasChildren(Object element) { if (element instanceof TreeParent) { return ((TreeParent)element).hasChildren(); } return false; } }); treeRequestBody.setCellModifier(new ICellModifier() { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String) */ public boolean canModify(Object element, String property) { if (element instanceof TreeParent && property.equalsIgnoreCase("value")) {//$NON-NLS-1$ TreeParent tp = (TreeParent) element; if (tp.getData() != null && tp.getData() instanceof Element) { Element tpelement = (Element) tp.getData(); if (tpelement.getChildNodes() != null && tpelement.getChildNodes().getLength() > 0) { Node node = tpelement.getChildNodes().item(0); if (node.getNodeType() == Node.TEXT_NODE && node.getNodeValue().trim().length() > 0) { return true; } } } } return false; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String) */ public Object getValue(Object element, String property) { TreeParent tp = (TreeParent) element; if (tp.getData() != null && tp.getData() instanceof Element) { Element tpelement = (Element) tp.getData(); if (tpelement.getChildNodes() != null && tpelement.getChildNodes().getLength() > 0) { Node node = tpelement.getChildNodes().item(0); return node.getTextContent(); } } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object) */ public void modify(Object element, String property, Object value) { TreeItem ti = (TreeItem) element; TreeParent tp = (TreeParent) ti.getData(); if (tp.getData() != null && tp.getData() instanceof Element) { Element tpelement = (Element) tp.getData(); if (tpelement.getChildNodes() != null && tpelement.getChildNodes().getLength() > 0) { Node node = tpelement.getChildNodes().item(0); if (node.getNodeType() == Node.TEXT_NODE) { node.setTextContent((String)value); treeRequestBody.update(tp, null); SOAPDOMParser parser = new SOAPDOMParser(); String updatedOut = parser.updateValue((String) treeRequestBody.getInput(), tp, (String)value); if (updatedOut != null && updatedOut.trim().length() > 0) { Stack<String> pathStack = new Stack<String>(); pathStack.push(ti.getText()); TreeItem tiPath = ti; while (tiPath.getParentItem() != null ) { tiPath = tiPath.getParentItem(); pathStack.push(tiPath.getText()); } bodyText.setText(updatedOut); getCurrentHistoryEntry().setBody(bodyText.getText()); treeRequestBody.setInput(updatedOut); treeRequestBody.setAutoExpandLevel(TreeViewer.ALL_LEVELS); while (!pathStack.isEmpty()) { TreeItem[] items = treeRequestBody.getTree().getItems(); String find = pathStack.pop(); /*boolean found =*/ findTreeItem(find, items); } } } } } } }); treeRequestBody.setCellEditors(new CellEditor[] { null, new TextCellEditor(treeRequestBody.getTree()) }); requestPageBook.showPage(PAGE1_KEY); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); //GridData.FILL_HORIZONTAL); gd.heightHint = 1; gd.minimumHeight = 100; requestPageBook.setLayoutData(gd); requestPageBook.showPage(PAGE1_KEY); bodyText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (!restoringFromHistoryEntry) getCurrentHistoryEntry().setBody(bodyText.getText()); // getCurrentHistoryEntry().setAction(null); } }); bodyText.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { getCurrentHistoryEntry().setBody(bodyText.getText()); if (e.keyCode == SWT.CR && e.stateMask == SWT.CTRL) { handleTest(getCurrentTestType()); } } }); ec5.setClient(requestPageBook); GridData gd9 = new GridData(SWT.FILL, SWT.FILL, true, true); gd9.minimumHeight = 200; ec5.setLayoutData(gd9); ec5.addExpansionListener(new FormExpansionAdapter()); section.addExpansionListener(new FormExpansionAdapter()); section.setClient(sectionClient); } // private boolean findString(String searchString, TreeItem[] treeItems) { // for (TreeItem treeItem : treeItems) { // for (int i = 0; i < tree.getColumnCount(); i++) { // String text = treeItem.getText(i); // if ((text.toUpperCase().contains(searchString.toUpperCase()))) { // tree.setSelection(treeItem); // return true; // } // } // } // // return false; // } private boolean findTreeItem ( String name, TreeItem[] treeItems ) { for (TreeItem treeItem : treeItems) { for (int i = 0; i < treeRequestBody.getTree().getColumnCount(); i++) { String text = treeItem.getText(i); if ((text.toUpperCase().contains(name.toUpperCase()))) { treeRequestBody.getTree().setSelection(treeItem); return true; } if (treeItem.getItemCount() > 0) { return findTreeItem (name, treeItem.getItems()); } } } return false; } private TestHistoryEntry getCurrentHistoryEntry() { if (this.currentHistoryEntry == null) { this.currentHistoryEntry = new TestHistoryEntry(); } return this.currentHistoryEntry; } private void createResponseSide ( SashForm sashForm ) { Section section2 = toolkit.createSection(sashForm, Section.TITLE_BAR| Section.TWISTIE|Section.EXPANDED); section2.setText(JBossWSUIMessages.JAXRSWSTestView2_ResponseDetails_Section); Composite sectionClient2 = toolkit.createComposite(section2); sectionClient2.setLayout(new GridLayout()); sectionClient2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); ExpandableComposite ec2 = toolkit.createExpandableComposite(sectionClient2, ExpandableComposite.TREE_NODE| ExpandableComposite.TITLE_BAR | ExpandableComposite.CLIENT_INDENT ); ec2.setText(JBossWSUIMessages.JAXRSWSTestView2_ResponseHeaders_Section); ec2.setLayout(new GridLayout()); resultHeadersList = new List(ec2, SWT.V_SCROLL | SWT.BORDER ); resultHeadersList.add(EMPTY_STRING); resultHeadersList.add(EMPTY_STRING); resultHeadersList.add(EMPTY_STRING); resultHeadersList.add(EMPTY_STRING); ec2.setClient(resultHeadersList); resultsHeaderMenu = new Menu(resultHeadersList.getShell(), SWT.POP_UP); copyResultHeaderMenuAction = new MenuItem(resultsHeaderMenu, SWT.PUSH); copyResultHeaderMenuAction.setText(JBossWSUIMessages.JAXRSWSTestView_CopyResultMenu_Text); copyResultHeaderMenuAction.setAccelerator(SWT.CTRL + 'C'); copyResultHeaderMenuAction.addSelectionListener(new SelectionListener(){ public void widgetDefaultSelected(SelectionEvent arg0) { if (resultHeadersList.getSelectionCount() == 0) resultHeadersList.selectAll(); Display display = Display.getDefault(); final Clipboard cb = new Clipboard(display); TextTransfer textTransfer = TextTransfer.getInstance(); cb.setContents(resultHeadersList.getSelection() , new Transfer[] { textTransfer }); } public void widgetSelected(SelectionEvent arg0) { widgetDefaultSelected(arg0); } }); resultHeadersList.setMenu(resultsHeaderMenu); resultHeadersList.addMouseListener(new MouseListener() { public void mouseDoubleClick(MouseEvent arg0) { } public void mouseDown(MouseEvent arg0) { setMenusForCurrentState(); } public void mouseUp(MouseEvent arg0) { } }); GridData gd6 = new GridData(SWT.FILL, SWT.FILL, true, false); gd6.heightHint = 1; gd6.minimumHeight = 50; ec2.setLayoutData(gd6); ec2.addExpansionListener(new FormExpansionAdapter()); ExpandableComposite ec4 = toolkit.createExpandableComposite(sectionClient2, ExpandableComposite.TWISTIE| ExpandableComposite.TITLE_BAR | ExpandableComposite.CLIENT_INDENT | ExpandableComposite.EXPANDED); ec4.setText(JBossWSUIMessages.JAXRSWSTestView2_ResponseBody_Section); createResponseToolbar(ec4); pageBook = toolkit.createPageBook(ec4, SWT.NONE); Composite page1 = pageBook.createPage(PAGE1_KEY); page1.setLayout(new GridLayout()); resultsText = toolkit.createText(page1, EMPTY_STRING, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL); GridData gd7 = new GridData(SWT.FILL, SWT.FILL, true, true); // gd7.minimumHeight = 100; gd7.heightHint = 1; resultsText.setLayoutData(gd7); pageBook.showPage(PAGE1_KEY); Composite page2 = pageBook.createPage(PAGE2_KEY); page2.setLayout(new GridLayout()); resultsBrowser = new Browser(page2, SWT.BORDER | SWT.WRAP );// | SWT.V_SCROLL); GridData gd10 = new GridData(SWT.FILL, SWT.FILL, true, true); gd10.heightHint = 1; toolkit.adapt(resultsBrowser); resultsBrowser.setLayoutData(gd10); pageBook.showPage(PAGE2_KEY); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); //GridData.FILL_HORIZONTAL); gd.heightHint = 1; gd.minimumHeight = 100; pageBook.setLayoutData(gd); pageBook.showPage(PAGE1_KEY); resultsTextMenu = new Menu(resultsText.getShell(), SWT.POP_UP); copyMenuAction = new MenuItem(resultsTextMenu, SWT.PUSH); copyMenuAction.setText(JBossWSUIMessages.JAXRSWSTestView_CopyResultsMenu); copyMenuAction.setAccelerator(SWT.CTRL + 'C'); copyMenuAction.addSelectionListener(new SelectionListener(){ public void widgetDefaultSelected(SelectionEvent arg0) { if (resultsText.getSelectionCount() == 0) resultsText.selectAll(); resultsText.copy(); } public void widgetSelected(SelectionEvent arg0) { widgetDefaultSelected(arg0); } }); new MenuItem(resultsTextMenu, SWT.SEPARATOR); openInXMLEditorAction = new MenuItem(resultsTextMenu, SWT.PUSH); openInXMLEditorAction.setText(JBossWSUIMessages.JAXRSWSTestView_Open_Result_in_XML_Editor); openInXMLEditorAction.setAccelerator(SWT.CTRL + 'O'); openInXMLEditorAction.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent arg0) { String string = resultsText.getText(); openXMLEditor(string); } public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } }); openResponseTagInXMLEditor = new MenuItem(resultsTextMenu, SWT.PUSH); openResponseTagInXMLEditor.setText(JBossWSUIMessages.JAXRSWSTestView_Open_Response_Tag_Contents_in_XML_Editor); openResponseTagInXMLEditor.setAccelerator(SWT.CTRL + 'R'); openResponseTagInXMLEditor.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent arg0) { String string = null; try { SOAPBody body = null; if (envelope != null){ body = envelope.getBody(); } else if (soapbody != null) { body = soapbody; } NodeList list = body.getChildNodes(); for (int i = 0; i< list.getLength(); i++){ Node node = list.item(i); if (node.getNodeName().contains("Response")){ //$NON-NLS-1$ NodeList list2 = node.getChildNodes(); for (int j = 0; j<list2.getLength(); j++){ Node node2 = list2.item(j); if (node2.getNodeName().contains("Result")){ //$NON-NLS-1$ Node node3 = node2.getChildNodes().item(0); if (node3.getNodeType() == Node.TEXT_NODE) { string = node3.getNodeValue(); break; } else if (node3.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node3; string = XMLUtils.ElementToString(element); break; } } } if (string != null) break; } } if (string != null){ openXMLEditor(string); } } catch (SOAPException e) { JBossWSUIPlugin.log(e); } } public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } }); resultsText.setMenu(resultsTextMenu); resultsText.addFocusListener(new FocusListener() { public void focusLost(FocusEvent arg0) { } public void focusGained(FocusEvent arg0) { setMenusForCurrentState(); } }); ec4.setClient(pageBook); GridData gd8 = new GridData(SWT.FILL, SWT.FILL, true, true); gd8.heightHint = 1; ec4.setLayoutData(gd8); ec4.addExpansionListener(new FormExpansionAdapter()); section2.addExpansionListener(new FormExpansionAdapter()); section2.setClient(sectionClient2); } /** * This is a callback that will allow us * to create the viewer and initialize it. */ public void createPartControl(Composite parent) { getImages(); toolkit = new FormToolkit(parent.getDisplay()); form = toolkit.createScrolledForm(parent); form.addListener(SWT.Resize, new Listener() { public void handleEvent(Event e) { form.setRedraw(false); form.reflow(true); form.layout(true, true); form.setRedraw(true); } }); GridLayout layout = new GridLayout(2, false); layout.verticalSpacing = 1; form.getBody().setLayout(layout); createURLAndToolbar(); SashForm sashForm = new SashForm(form.getBody(), SWT.NONE); sashForm.setOrientation(SWT.HORIZONTAL); toolkit.adapt(sashForm); GridLayout sashLayout = new GridLayout(2, false); sashForm.setLayout(sashLayout); GridData gd3 = new GridData(SWT.FILL, SWT.FILL, true, true); gd3.horizontalSpan = 2; gd3.widthHint = 1; sashForm.setLayoutData(gd3); createRequestSide(sashForm); createResponseSide(sashForm); toolkit.paintBordersFor(form); form.reflow(true); methodCombo.setText(GET); // changed from JAX-WS to GET via JBIDE-14861 setControlsForWSType(getCurrentTestType()); setControlsForMethodType(methodCombo.getText()); setControlsForSelectedURL(); setMenusForCurrentState(); } @Override public void dispose() { toolkit.dispose(); mImageRegistry.dispose(); super.dispose(); } private String generateSampleSOAP ( String headerText, String innerText, boolean isSOAP12 ) { if (innerText != null && !innerText.trim().isEmpty()) { if (innerText.trim().startsWith("<?xml version=\"1.0\"")) { //$NON-NLS-1$ return innerText; } } String prefix = TesterWSDLUtils.SOAP_PREFIX; String soapURI = TesterWSDLUtils.SOAP_NS_URI; if (isSOAP12) { prefix = TesterWSDLUtils.SOAP12_PREFIX; soapURI = TesterWSDLUtils.SOAP12_ENVELOPE_NS_URI; } StringBuffer buffer = new StringBuffer(); buffer.append("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\n");//$NON-NLS-1$ buffer.append("<" + prefix + ":Envelope xmlns:" + prefix + "=\"" + soapURI + "\" ");//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ buffer.append("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " );//$NON-NLS-1$ buffer.append("xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" >\n");//$NON-NLS-1$ buffer.append("<" + prefix + ":Header>\n");//$NON-NLS-1$ //$NON-NLS-2$ if (headerText != null) buffer.append(headerText); buffer.append("</" + prefix + ":Header>\n");;//$NON-NLS-1$ //$NON-NLS-2$ buffer.append("<" + prefix + ":Body>\n");//$NON-NLS-1$ //$NON-NLS-2$ if (innerText != null) buffer.append(innerText); buffer.append("</" + prefix + ":Body>\n");;//$NON-NLS-1$ //$NON-NLS-2$ buffer.append("</" + prefix + ":Envelope>");//$NON-NLS-1$ //$NON-NLS-2$ // String soapIn = "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\n" + //$NON-NLS-1$ // "<" + prefix + ":Envelope xmlns:" + prefix + "=\"" + soapURI + "\" " + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ // "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " + //$NON-NLS-1$ // "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " + //$NON-NLS-1$ // ">\n" + //$NON-NLS-1$ // "<" + prefix + ":Body>\n";//$NON-NLS-1$ //$NON-NLS-2$ // if (innerText != null) // soapIn = soapIn + innerText; // soapIn = soapIn + // "</" + prefix + ":Body>\n" + //$NON-NLS-1$ //$NON-NLS-2$ // "</" + prefix + ":Envelope>"; //$NON-NLS-1$ //$NON-NLS-2$ return buffer.toString(); } private void setMenusForCurrentState() { if (resultsText!= null && !resultsText.isDisposed()){ boolean enabled = resultsText.getText().trim().length() > 0; copyMenuAction.setEnabled(enabled); openInXMLEditorAction.setEnabled(enabled); if (getCurrentTestType().equalsIgnoreCase(JAX_WS)) { openResponseTagInXMLEditor.setEnabled(enabled); } else if (getCurrentTestType().equalsIgnoreCase(JAX_RS) ){ openResponseTagInXMLEditor.setEnabled(false); } } if (resultHeadersList != null && !resultHeadersList.isDisposed()) { boolean enabled = resultHeadersList.getItemCount() > 0; copyResultHeaderMenuAction.setEnabled(enabled); } } private void openXMLEditor (String text){ IWorkbenchWindow window = getSite().getWorkbenchWindow(); IStorage storage = new ResultsXMLStorage(text); IStorageEditorInput input = new ResultsXMLStorageInput(storage); IWorkbenchPage page = window.getActivePage(); if (page != null) { try { if (WSTestUtils.isTextXML(text)) { if (window.getWorkbench().getEditorRegistry().findEditor(XML_EDITOR_ID) != null) { page.openEditor(input, XML_EDITOR_ID); } else { page.openEditor(input, DEFAULT_TEXT_EDITOR_ID); } } else { page.openEditor(input, DEFAULT_TEXT_EDITOR_ID); } } catch (PartInitException e) { JBossWSUIPlugin.log(e); } } } private void setControlsForSelectedEntry ( TestHistoryEntry entry ) { if (entry != null) { restoringFromHistoryEntry = true; if (entry.getWsTech() != null) { setControlsForWSType(entry.getWsTech()); if (entry.getWsTech().equalsIgnoreCase(JAX_WS)) methodCombo.setText(JAX_WS); } if (entry.getMethod() != null && entry.getWsTech().equalsIgnoreCase(JAX_RS)) { methodCombo.setText(entry.getMethod()); setControlsForMethodType(entry.getMethod()); } if (bodyText.isEnabled()) { bodyText.setText(entry.getBody()); } if (!treeRequestBody.getTree().isDisposed()) { if (entry.getBody().trim().length() > 0) { if (SOAPDOMParser.isXMLLike(entry.getBody())) treeRequestBody.setInput(entry.getBody()); else treeRequestBody.setInput(null); } else { treeRequestBody.setInput(null); } } if (dlsList.isEnabled()) { dlsList.setSelection(entry.getHeaders()); } if (parmsList.isEnabled()) { parmsList.setSelection(entry.getParms()); } if (resultHeadersList.isEnabled()) { resultHeadersList.removeAll(); String[] headers = entry.getResultHeadersList(); if (headers != null && headers.length > 0) { for (int i = 0; i < headers.length; i++) { resultHeadersList.add(headers[i]); } } } if (resultsText.isEnabled() && resultsBrowser.isEnabled()) { resultsText.setText(entry.getResultText()); resultsBrowser.setText(entry.getResultText()); } if (entry.getUrl().trim().length() > 0) { String urlText = entry.getUrl(); try { new URL(urlText); startToolItem.setEnabled(true); } catch (MalformedURLException mue) { startToolItem.setEnabled(false); return; } } else { startToolItem.setEnabled(false); } restoringFromHistoryEntry = false; } } private void setControlsForSelectedURL() { if (urlCombo.getText().trim().length() > 0) { String urlText = urlCombo.getText(); try { new URL(urlText); startToolItem.setEnabled(true); // per JBIDE-6919, if we encounter an "https" url make sure // basic authorization checkbox is checked // per JBIDE-12981, only set this when the user updates // the url, not every time they run the test if (urlText.trim().startsWith(HTTPS_STRING)) { useBasicAuthCB.setSelection(true); } } catch (MalformedURLException mue) { startToolItem.setEnabled(false); return; } } else { startToolItem.setEnabled(false); } } /* * Enable/disable controls based on the WS technology type * and the method. * * @param methodType */ private void setControlsForMethodType ( String methodType ) { if (getCurrentTestType().equalsIgnoreCase(JAX_RS) && (methodType.equalsIgnoreCase(GET) || methodType.equalsIgnoreCase(OPTIONS))) { bodyText.setEnabled(false); treeRequestBody.getTree().setEnabled(false); } else { bodyText.setEnabled(true); treeRequestBody.getTree().setEnabled(true); } } /* * Enable/disable controls based on the WS technology type * @param wsType */ private void setControlsForWSType ( String wsType ) { if (wsType.equalsIgnoreCase(JAX_WS)) { bodyText.setEnabled(true); treeRequestBody.getTree().setEnabled(true); parmsList.setEnabled(false); parmsList.removeAll(); dlsList.setEnabled(false); String emptySOAP = generateSampleSOAP(null, null, false); emptySOAP = WSTestUtils.addNLsToXML(emptySOAP); if (bodyText.getText().trim().length() == 0) { bodyText.setText(emptySOAP); treeRequestBody.setInput(emptySOAP); } openWSDLToolItem.setEnabled(true); } else if (wsType.equalsIgnoreCase(JAX_RS)) { bodyText.setEnabled(true); treeRequestBody.getTree().setEnabled(true); parmsList.setEnabled(true); dlsList.setEnabled(true); openWSDLToolItem.setEnabled(false); if (bodyText.getText().trim().length() > 0) { bodyText.setText(EMPTY_STRING); treeRequestBody.setInput(null); // getCurrentHistoryEntry().setBody(EMPTY_STRING); } } setMenusForCurrentState(); } private String getOpNameFromRequestBody () { MessageFactory factory = new MessageFactoryImpl(); String lookForOpName = null; try { SOAPMessage message = factory.createMessage(null, new ByteArrayInputStream(getCurrentHistoryEntry().getBody().trim().getBytes())); SOAPBody body = message.getSOAPBody(); Iterator<?> elements = body.getChildElements(); if (elements.hasNext()) { Element element = (Element) elements.next(); lookForOpName = element.getNodeName(); } } catch (IOException e) { e.printStackTrace(); } catch (SOAPException e) { e.printStackTrace(); } return lookForOpName; } /* * Actually perform the test based on which type of activity it is */ private void handleTest(final String wsTech) { String urlText = urlCombo.getText(); // if we need to configure incoming parameters in the URL (i.e. from JAX-RS tooling) if (urlText.endsWith("}")) { //$NON-NLS-1$ WSTesterURLInputsDialog dialog = new WSTesterURLInputsDialog(this.getSite().getShell(), urlText); int rtn_code = dialog.open(); if (rtn_code == Window.OK) { urlText = dialog.getURL(); urlCombo.setText(urlText); } else { return; } } try { new URL(urlText); } catch (MalformedURLException mue) { // do nothing, but return since we don't have a working URL return; } String lookForOpName = null; if (wsTech.contentEquals(JAX_WS)) { lookForOpName = getOpNameFromRequestBody(); if (getCurrentHistoryEntry().getAction() == null ) { boolean result = getWSDLSpecifics(lookForOpName); if (!result) return; } } if (urlCombo.getItemCount() > 0) { java.util.List<String> aList = Arrays.asList(urlCombo.getItems()); if (!aList.contains(urlCombo.getText())) { urlCombo.add(urlCombo.getText()); } } else { urlCombo.add(urlCombo.getText()); } getCurrentHistoryEntry().setWsTech(wsTech); if (!getCurrentHistoryEntry().getUrl().contentEquals(urlText)) { getCurrentHistoryEntry().setUrl(urlText); } final String url = getCurrentHistoryEntry().getUrl(); final String action = getCurrentHistoryEntry().getAction(); String tempBody = getCurrentHistoryEntry().getBody(); // if it's XML, clean up the empty space and crlf between tags if (SOAPDOMParser.isXMLLike(tempBody)) { tempBody = tempBody.replaceAll(">\\s+<", "><"); //$NON-NLS-1$//$NON-NLS-2$ } final String body = tempBody; final String method = getCurrentHistoryEntry().getMethod(); final String headers = getCurrentHistoryEntry().getHeaders(); final String parms = getCurrentHistoryEntry().getParms(); String tempUID = null; String tempPwd = null; // per JBIDE-6919, if we encounter an "https" url make sure // basic authorization checkbox is checked // per JBIDE-12981, moved this check and set to setControlsForSelectedURL() // if (url.trim().startsWith(HTTPS_STRING)) { // useBasicAuthCB.setSelection(true); // } // If basic authorization checkbox is checked, use the uid/pwd if (useBasicAuthCB.getSelection()) { UidPwdDialog authDialog = new UidPwdDialog(getSite().getShell()); int rtnCode = authDialog.open(); if (rtnCode == Window.OK) { tempUID = authDialog.getUID(); tempPwd = authDialog.getPwd(); } else { return; } } final String uid = tempUID; final String pwd = tempPwd; Job aJob = new Job(JBossWSUIMessages.JAXRSWSTestView_Invoking_WS_Status) { protected IStatus run(IProgressMonitor monitor) { IStatus status = Status.OK_STATUS; // execute the task ... if (wsTech.equalsIgnoreCase(JAX_RS)) { status = handleRSTest(monitor, url, method, body, parms, headers, uid, pwd); } else if (wsTech.equalsIgnoreCase(JAX_WS)) { status = handleWSTest(monitor, url, action, body, uid, pwd); } monitor.done(); return status; } }; // true to indicate that this job was initiated by a UI end user aJob.setUser(true); aJob.addJobChangeListener(new IJobChangeListener() { public void sleeping(IJobChangeEvent event) {}; public void scheduled(IJobChangeEvent event) {}; public void running(IJobChangeEvent event) {}; public void done(final IJobChangeEvent event) { if (event.getResult() instanceof WSTestStatus) { final WSTestStatus status = (WSTestStatus) event.getResult(); PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { public void run() { if (status.getResultsText() != null) { String results = status.getResultsText(); if (SOAPDOMParser.isValidXML(results)) { results = SOAPDOMParser.prettyPrint(results); } else { results = SOAPDOMParser.prettyPrintJSON(results); } getCurrentHistoryEntry().setResultText(results); getCurrentHistoryEntry().setUrl(urlCombo.getText()); JAXRSWSTestView2.this.resultsText.setText(results); JAXRSWSTestView2.this.resultsBrowser.setText(results); JAXRSWSTestView2.this.form.reflow(true); } else if (status.getMessage() != null) { getCurrentHistoryEntry().setResultText(status.getMessage()); getCurrentHistoryEntry().setUrl(urlCombo.getText()); JAXRSWSTestView2.this.resultsText.setText(status.getMessage()); JAXRSWSTestView2.this.resultsBrowser.setText(status.getMessage()); JAXRSWSTestView2.this.form.reflow(true); } resultHeadersList.removeAll(); String[] headers = DelimitedStringList.parseString(status.getHeadersList(), RESULT_HEADER_DELIMITER); if (headers != null && headers.length > 0) { for (int i = 0; i < headers.length; i++) { resultHeadersList.add(headers[i]); } } getCurrentHistoryEntry().setResultHeadersList(headers); if (JAXRSWSTestView2.this.resultsText.getText().trim().length() == 0) { if (headers != null && headers.length > 0) { getCurrentHistoryEntry().setResultText( JBossWSUIMessages.JAXRSWSTestView2_Msg_No_Results_Check_Headers); JAXRSWSTestView2.this.resultsText.setText( JBossWSUIMessages.JAXRSWSTestView2_Msg_No_Results_Check_Headers); JAXRSWSTestView2.this.form.reflow(true); } } TestHistoryEntry oldEntry = history.findEntryByURL(getCurrentHistoryEntry().getUrl()); if (oldEntry != null) { history.replaceEntry(oldEntry, getCurrentHistoryEntry()); } else { try { history.addEntry((TestHistoryEntry) getCurrentHistoryEntry().clone()); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } // System.out.println("Replaced or added entry\n" + history.toString()); } }); } } public void awake(IJobChangeEvent event) {}; public void aboutToRun(IJobChangeEvent event) {}; }); aJob.schedule(); setMenusForCurrentState(); } /* * Actually call the WS and displays the result */ private IStatus handleWSTest(final IProgressMonitor monitor, String url, String action, String body, String uid, String pwd) { try { // count the request submission events JBossWSUIPlugin.getDefault().countRequestSubmitted("JAX-WS"); //$NON-NLS-1$ envelope = null; soapbody = null; monitor.worked(10); JAXWSTester2 tester = new JAXWSTester2(); boolean itRan = false; serviceNSMessage = getCurrentHistoryEntry().getServiceNSMessage(); while (!monitor.isCanceled()) { try { if (!itRan && serviceNSMessage != null && serviceNSMessage.length == 3) { itRan = true; // call the service tester.doTest(monitor, url, action, serviceNSMessage[0], serviceNSMessage[1], serviceNSMessage[2], body, uid, pwd); } else { break; } } catch (InterruptedException ie) { monitor.setCanceled(true); } } if (monitor.isCanceled()) { WSTestStatus status = new WSTestStatus(IStatus.OK, JBossWSUIPlugin.PLUGIN_ID, JBossWSUIMessages.JAXRSWSTestView_Message_Service_Invocation_Cancelled); return status; } if (!itRan) { WSTestStatus status = new WSTestStatus(IStatus.OK, JBossWSUIPlugin.PLUGIN_ID, JBossWSUIMessages.JAXRSWSTestView_Message_Unsuccessful_Test); return status; } monitor.worked(70); String result = tester.getResultBody(); envelope = tester.getResultSOAP(); soapbody = tester.getResultSOAPBody(); String cleanedUp = WSTestUtils.addNLsToXML(result); WSTestStatus status = new WSTestStatus(IStatus.OK, JBossWSUIPlugin.PLUGIN_ID, JBossWSUIMessages.JAXRSWSTestView_JAXWS_Success_Status); status.setResultsText(cleanedUp); monitor.worked(10); String listText = EMPTY_STRING; if (tester.getResultHeaders() != null) { Iterator<?> iter = tester.getResultHeaders().entrySet().iterator(); while (iter.hasNext()) { String text = EMPTY_STRING; Entry<?, ?> entry = (Entry<?, ?>) iter.next(); if (entry.getKey() == null) text = entry.getValue().toString(); else text = text + entry.toString(); listText = listText + text; if (iter.hasNext()) { listText = listText + RESULT_HEADER_DELIMITER; } } } status.setHeadersList(listText); monitor.worked(10); return status; } catch (Exception e) { // try and drill down to find the root cause Throwable innerE = e.getCause(); // if we can't find it, just go with th exception if (innerE == null) { WSTestStatus status = new WSTestStatus(IStatus.OK, JBossWSUIPlugin.PLUGIN_ID, JBossWSUIMessages.JAXRSWSTestView_Exception_Status + e.getLocalizedMessage()); status.setResultsText(e.toString()); // this fix is to address JBIDE-11294 and the fact that we shouldn't actually log this exception from deep // within the WS API. if ((!e.getLocalizedMessage().contains("Unsupported endpoint address: REPLACE_WITH_ACTUAL_URL"))) { //$NON-NLS-1$ JBossWSUIPlugin.log(e); } return status; } // continue to drill down until we find the innermost one while (innerE.getCause() != null) { innerE = innerE.getCause(); } // Now report that WSTestStatus status = new WSTestStatus(IStatus.OK, JBossWSUIPlugin.PLUGIN_ID, JBossWSUIMessages.JAXRSWSTestView_Exception_Status + innerE.getLocalizedMessage()); status.setResultsText(innerE.toString()); // this fix is to address JBIDE-11294 and the fact that we shouldn't actually log this exception from deep // within the WS API. if ((!innerE.getLocalizedMessage().contains("Unsupported endpoint address: REPLACE_WITH_ACTUAL_URL"))) { //$NON-NLS-1$ JBossWSUIPlugin.log(e); } return status; } } /* * Actually call the RESTful WS to test it */ private IStatus handleRSTest(final IProgressMonitor monitor, String address, String method, String body, String parms, String headersStr, String uid, String pwd) { if (method.equalsIgnoreCase(GET)) body = EMPTY_STRING; // if no actual text in the request body, set to null if (body != null && body.trim().length() == 0) body = null; monitor.worked(10); // Process parameters for web service call HashMap<String, String> parameters = new HashMap<String, String>(); if (parms != null && parms.length() > 0) { String[] parsedList = DelimitedStringList.parseString(parms , ","); //$NON-NLS-1$ if (parsedList != null && parsedList.length > 0) { for (int i = 0; i < parsedList.length; i++) { String nameValuePair = parsedList[i]; String[] nameAndValue = DelimitedStringList.parseString(nameValuePair, "="); //$NON-NLS-1$ if (nameAndValue != null && nameAndValue.length == 2) { parameters.put(nameAndValue[0], nameAndValue[1]); } } } } monitor.worked(10); // Process headers for web service call HashMap<String, String> headers = new HashMap<String, String>(); if (headersStr != null && headersStr.length() > 0) { String[] parsedList = DelimitedStringList.parseString(headersStr , ","); //$NON-NLS-1$ if (parsedList != null && parsedList.length > 0) { for (int i = 0; i < parsedList.length; i++) { String nameValuePair = parsedList[i]; String[] nameAndValue = DelimitedStringList.parseString(nameValuePair, "="); //$NON-NLS-1$ if (nameAndValue != null && nameAndValue.length == 2) { headers.put(nameAndValue[0], nameAndValue[1]); } } } } JAXRSTester tester = new JAXRSTester(); // now actually call it try { // count the request submission events JBossWSUIPlugin.getDefault().countRequestSubmitted(method); // call the service tester.doTest(address, parameters, headers, method, body, null, -1, uid, pwd); String result = tester.getResultBody(); // put the results in the result text field String cleanedUp = WSTestUtils.addNLsToXML(result); WSTestStatus status = new WSTestStatus(IStatus.OK, JBossWSUIPlugin.PLUGIN_ID, JBossWSUIMessages.JAXRSWSTestView_JAXRS_Success_Status); status.setResultsText(cleanedUp); String listText = EMPTY_STRING; if (tester.getResultHeaders() != null) { Iterator<?> iter = tester.getResultHeaders().entrySet().iterator(); while (iter.hasNext()) { String text = EMPTY_STRING; Entry<?, ?> entry = (Entry<?, ?>) iter.next(); if (entry.getKey() == null) text = entry.getValue().toString(); else text = text + entry.toString(); listText = listText + text; if (iter.hasNext()) { listText = listText + RESULT_HEADER_DELIMITER; } } } status.setHeadersList(listText); monitor.worked(10); return status; } catch (Exception e) { String result = tester.getResultBody(); if (result.isEmpty()) result = e.getLocalizedMessage(); // put the results in the result text field String cleanedUp = WSTestUtils.addNLsToXML(result); WSTestStatus status = new WSTestStatus(IStatus.OK, JBossWSUIPlugin.PLUGIN_ID, JBossWSUIMessages.JAXRSWSTestView_JAXRS_Success_Status); status.setResultsText(cleanedUp); String listText = EMPTY_STRING; if (tester.getResultHeaders() != null) { Iterator<?> iter = tester.getResultHeaders().entrySet().iterator(); while (iter.hasNext()) { String text = EMPTY_STRING; Entry<?, ?> entry = (Entry<?, ?>) iter.next(); if (entry.getKey() == null) text = entry.getValue().toString(); else text = text + entry.toString(); listText = listText + text; if (iter.hasNext()) { listText = listText + RESULT_HEADER_DELIMITER; } } } status.setHeadersList(listText); monitor.worked(10); return status; } } /** * Passing the focus request to the control. */ public void setFocus() { // set initial focus to the URL text combo urlCombo.setFocus(); } }