blob: b88eecc1ab13da9dd3f2f5cf24af5b85d4cc9c8d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.websvc.manager.ui;
import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dialog;
import java.awt.FocusTraversalPolicy;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.net.*;
import java.util.*;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.event.TableModelEvent;
import org.netbeans.modules.websvc.core.JaxWsUtils;
import org.netbeans.modules.websvc.jaxwsmodelapi.WSPort;
import org.netbeans.modules.websvc.jaxwsmodelapi.java.JavaMethod;
import org.netbeans.modules.websvc.jaxwsmodelapi.java.JavaParameter;
import org.netbeans.modules.websvc.jaxwsmodelapi.java.JavaType;
import org.netbeans.modules.websvc.saas.model.WsdlSaas;
import org.netbeans.modules.websvc.saas.model.WsdlSaasMethod;
import org.netbeans.modules.websvc.saas.spi.websvcmgr.WsdlData;
import org.netbeans.modules.websvc.saas.spi.websvcmgr.WsdlServiceProxyDescriptor;
import org.netbeans.modules.websvc.saas.util.TypeUtil;
import org.netbeans.swing.outline.DefaultOutlineModel;
import org.netbeans.swing.outline.Outline;
import org.netbeans.swing.outline.OutlineModel;
import org.netbeans.swing.outline.RowModel;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.ErrorManager;
import org.openide.NotifyDescriptor;
import org.openide.util.Exceptions;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
/**
* Dialog that tests JAX-WS client methods
*
* @author David Botterill
*/
public class TestWebServiceMethodDlg extends JPanel implements ActionListener, MethodTaskListener {
private Dialog dialog;
private DialogDescriptor dlg = null;
private final String okString = NbBundle.getMessage(this.getClass(), "CLOSE");
/**
* The runtimeClassLoader should be used when running the web service client. This classloader
* only includes the necessary runtime jars for JAX-RPC to run. The classloader does NOT have a
* parent to delegate to. I did this because of Xerces classloader clashes with other netbeans
* modules.
* -David Botterill 4/21/2004
*/
private URLClassLoader runtimeClassLoader;
private final DefaultMutableTreeNode parameterRootNode = new DefaultMutableTreeNode();
private DefaultMutableTreeNode resultRootNode = new DefaultMutableTreeNode();
private final WsdlSaas wsData;
private final WSPort port;
private final JavaMethod method;
private MethodTask methodTask;
/** Creates new form TestWebServiceMethodDlg */
public TestWebServiceMethodDlg(WsdlSaasMethod saasMethod) {
method = saasMethod.getJavaMethod();
wsData = saasMethod.getSaas();
port = saasMethod.getWsdlPort();
//assert wsData.getWsdlData().getJaxWsDescriptor() != null;
initComponents();
myInitComponents();
this.lblTitle.setText(NbBundle.getMessage(this.getClass(), "TEST_WEBSVC_LABEL") + " " /*+ method.getName()*/);
}
private boolean isRPCEncoded(WsdlData wsdlData) {
File wsdlFile = new File(wsdlData.getWsdlFile());
try {
wsdlFile = wsdlFile.getCanonicalFile();
return wsdlFile != null && JaxWsUtils.isRPCEncoded(wsdlFile.toURI());
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
return false;
}
/**
* This method returns the classloader of the Jar wsdlFile containing the web service for which we are testing the methods.
* This class loader should be used for the runtime environment when invoking a web service.
* TODO: determine if the tree components should get the class loader here, store the classloader in the tree nodes, or pass
* to the tree component constructors.
*@returns URLClassLoader - the class loader of the Jar wsdlFile for the web service with the methods to test.
*/
private URLClassLoader getRuntimeClassLoader() {
if (null == runtimeClassLoader) {
/**
* First add the URL to the jar wsdlFile for this web service.
*/
try {
WsdlData wsdlData = wsData.getWsdlData();
boolean isRPCEncoded = isRPCEncoded(wsdlData);
List<URL> urlList = TypeUtil.buildClasspath(null, !isRPCEncoded);
WsdlServiceProxyDescriptor descriptor;
if (isRPCEncoded) {
descriptor = wsdlData.getJaxRpcDescriptor();
} else {
descriptor = wsdlData.getJaxWsDescriptor();
}
for (WsdlServiceProxyDescriptor.JarEntry entry : descriptor.getJars()) {
if (entry.getType().equals(WsdlServiceProxyDescriptor.JarEntry.PROXY_JAR_TYPE)) {
File jarFile = new File(descriptor.getXmlDescriptorFile().getParent(), entry.getName());
File tmpJarFile = createTempCopy(jarFile);
urlList.add(tmpJarFile.toURI().toURL());
}
}
URL[] urls = urlList.toArray(new URL[0]);
/**
* Delegate to the module's classloader since core/startup/NbInstaller
* overrides the JAX-WS 2.0 jars present in JDK 6
*
* The above it no longer true but I am not sure why, yet.
*/
runtimeClassLoader = new URLClassLoader(urls); //this.getClass().getClassLoader());
} catch (IOException mfu) {
ErrorManager.getDefault().notify(mfu);
ErrorManager.getDefault().log(this.getClass().getName() + ":IOException=" + mfu);
return null;
}
}
return runtimeClassLoader;
}
private File createTempCopy(File src) {
try {
java.io.File tempFile = java.io.File.createTempFile("proxyjar", "jar");
java.nio.channels.FileChannel inChannel = new java.io.FileInputStream(src).getChannel();
java.nio.channels.FileChannel outChannel = new java.io.FileOutputStream(tempFile).getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
inChannel.close();
outChannel.close();
return tempFile;
} catch (IOException ex) {
ErrorManager.getDefault().notify(ErrorManager.WARNING, ex);
return null;
}
}
public void displayDialog() {
dlg = new DialogDescriptor(this, NbBundle.getMessage(this.getClass(), "TEST_WEB_SERVICE_METHOD"),
false, NotifyDescriptor.OK_CANCEL_OPTION, DialogDescriptor.OK_OPTION,
DialogDescriptor.DEFAULT_ALIGN, HelpCtx.DEFAULT_HELP, this);
dlg.setOptions(new Object[]{okButton});
dialog = DialogDisplayer.getDefault().createDialog(dlg);
/**
* After the window is opened, set the focus to the Get information button.
*/
final JPanel thisPanel = this;
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
SwingUtilities.invokeLater(
new Runnable() {
@Override
public void run() {
btnSubmit.requestFocus();
thisPanel.getRootPane().setDefaultButton(btnSubmit);
}
});
}
});
/**
* Fix for Bug: 6217545
* Need to know what the normal cursor is so we can reset it when
* the dialog is closed.
* - David Botterill 1/14/2005
*
*/
normalCursor = dialog.getCursor();
/**
* Fix for Bug: 6217545
* Set the MouseListener for the OK button to a special adapter that will
* make the cursor look normal ALWAYS when over the OK button.
* - David Botterill 1/14/2005
*/
BusyMouseAdapter mouseAdapter = new BusyMouseAdapter(normalCursor);
okButton.addMouseListener(mouseAdapter);
dialog.show();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jSplitPane1 = new javax.swing.JSplitPane();
pnlParameter = new javax.swing.JPanel();
pnlLabel = new javax.swing.JPanel();
lblTitle = new javax.swing.JLabel();
lblParameters = new javax.swing.JLabel();
scrollPaneParameter = new javax.swing.JScrollPane();
btnPanel = new javax.swing.JPanel();
btnSubmit = new javax.swing.JButton();
pnlResults = new javax.swing.JPanel();
lblResults = new javax.swing.JLabel();
scrollPaneResults = new javax.swing.JScrollPane();
setToolTipText(org.openide.util.NbBundle.getBundle(TestWebServiceMethodDlg.class).getString("TestWebServiceMethodDlg.main.ACC_desc")); // NOI18N
setPreferredSize(new java.awt.Dimension(600, 450));
setLayout(new java.awt.BorderLayout());
jSplitPane1.setDividerLocation(250);
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jSplitPane1.setToolTipText(org.openide.util.NbBundle.getBundle(TestWebServiceMethodDlg.class).getString("TestWebServiceMethodDlg.jsplintPane1.ACC_desc")); // NOI18N
pnlParameter.setBorder(javax.swing.BorderFactory.createEmptyBorder(12, 12, 5, 12));
pnlParameter.setLayout(new java.awt.BorderLayout());
pnlLabel.setToolTipText(org.openide.util.NbBundle.getBundle(TestWebServiceMethodDlg.class).getString("TestWebServiceMethodDlg.pnlLabel.ACC_desc")); // NOI18N
pnlLabel.setLayout(new java.awt.GridLayout(2, 0));
lblTitle.setFont(lblTitle.getFont().deriveFont(lblTitle.getFont().getStyle() | java.awt.Font.BOLD, lblTitle.getFont().getSize()-2));
lblTitle.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
org.openide.awt.Mnemonics.setLocalizedText(lblTitle, org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TEST_WEB_SERVICE_METHOD")); // NOI18N
lblTitle.setToolTipText(org.openide.util.NbBundle.getBundle(TestWebServiceMethodDlg.class).getString("TestWebServiceMethodDlg.lblTitle.ACC_desc")); // NOI18N
pnlLabel.add(lblTitle);
lblParameters.setFont(lblParameters.getFont().deriveFont(lblParameters.getFont().getSize()-4f));
lblParameters.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
org.openide.awt.Mnemonics.setLocalizedText(lblParameters, org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TEST_WEBSVC_INSTRUCTIONS")); // NOI18N
lblParameters.setToolTipText(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.jLabel1.ACC_desc")); // NOI18N
pnlLabel.add(lblParameters);
pnlParameter.add(pnlLabel, java.awt.BorderLayout.NORTH);
pnlLabel.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.pnlLabel.ACC_name")); // NOI18N
scrollPaneParameter.setToolTipText(org.openide.util.NbBundle.getBundle(TestWebServiceMethodDlg.class).getString("TestWebServiceMethodDlg.scrollPaneParameter.ACC_desc")); // NOI18N
pnlParameter.add(scrollPaneParameter, java.awt.BorderLayout.CENTER);
scrollPaneParameter.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.scrollPaneParameter.ACC_name")); // NOI18N
btnPanel.setToolTipText(org.openide.util.NbBundle.getBundle(TestWebServiceMethodDlg.class).getString("TestWebServiceMethodDlg.btnPanel.ACC_desc")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(btnSubmit, org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "BUTTON_SUBMIT")); // NOI18N
btnSubmit.setToolTipText(org.openide.util.NbBundle.getBundle(TestWebServiceMethodDlg.class).getString("TestWebServiceMethodDlg.btnSubmit.ACC_desc")); // NOI18N
btnSubmit.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnSubmitActionPerformed(evt);
}
});
btnPanel.add(btnSubmit);
pnlParameter.add(btnPanel, java.awt.BorderLayout.SOUTH);
btnPanel.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.btnPanel.ACC_name")); // NOI18N
jSplitPane1.setLeftComponent(pnlParameter);
pnlParameter.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.pnlParameter.ACC_name")); // NOI18N
pnlParameter.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.pnlParameter.ACC_desc")); // NOI18N
pnlResults.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 12, 5, 12));
pnlResults.setToolTipText(org.openide.util.NbBundle.getBundle(TestWebServiceMethodDlg.class).getString("TestWebServiceMethodDlg.pnResults.ACC_desc")); // NOI18N
pnlResults.setLayout(new java.awt.BorderLayout(0, 5));
lblResults.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
lblResults.setLabelFor(scrollPaneResults);
org.openide.awt.Mnemonics.setLocalizedText(lblResults, org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "RESULTS")); // NOI18N
lblResults.setToolTipText(org.openide.util.NbBundle.getBundle(TestWebServiceMethodDlg.class).getString("TestWebServiceMethodDlg.lblResults.ACC_desc")); // NOI18N
pnlResults.add(lblResults, java.awt.BorderLayout.NORTH);
scrollPaneResults.setToolTipText(org.openide.util.NbBundle.getBundle(TestWebServiceMethodDlg.class).getString("TestWebServiceMethodDlg.scrollPaneResults.ACC_desc")); // NOI18N
pnlResults.add(scrollPaneResults, java.awt.BorderLayout.CENTER);
scrollPaneResults.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.scrollPaneResults.ACC_name")); // NOI18N
jSplitPane1.setRightComponent(pnlResults);
pnlResults.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.pnResults.ACC_name")); // NOI18N
add(jSplitPane1, java.awt.BorderLayout.CENTER);
jSplitPane1.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.jsplintPane1.ACC_name")); // NOI18N
getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.main.ACC_name")); // NOI18N
}// </editor-fold>//GEN-END:initComponents
private void btnSubmitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSubmitActionPerformed
dialog.setCursor(new Cursor(Cursor.WAIT_CURSOR));
invokeMethod();
}//GEN-LAST:event_btnSubmitActionPerformed
private void invokeMethod() {
/**
* Steps to call the method.
* 1. Get the parameter values from the tree
* 2. Get the client wrapper class
* 3. Get the method.
* 4. call the Method with the parameter values
* 5. Display the return value.
*/
/**
* Get the parameter values from the tree. The parameters will be the children of the root node only. Any children
* of the parameter nodes are values used to derive the parameter values. This means only the first children of the root
* node will be used a parameters. The logic to "roll-up" a parameter value is left to the TypeCellEditor class.
*/
/**
* Use a LinkedList because we care about the order of the parameters.
*/
LinkedList<Object> paramList = new LinkedList<Object>();
for(int ii=0; null != this.getParamterRootNode() && ii < this.getParamterRootNode().getChildCount(); ii++) {
DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) this.getParamterRootNode().getChildAt(ii);
TypeNodeData nodeData = (TypeNodeData)childNode.getUserObject();
Object parameterValue = nodeData.getTypeValue();
paramList.add(parameterValue);
}
/**
* specify the wrapper client class name for this method.
*/
String clientClassName;
if(isRPCEncoded(wsData.getWsdlData())){
clientClassName = wsData.getWsdlModel().getJavaName() + "_Impl";
}else{
clientClassName = wsData.getWsdlModel().getJavaName();
}
/**
* Fix for Bug: 6217545
* We need to run the method in a separate thread so the user can cancel if the method call
* locks up.
* First we need to create the thread, then register for a listener so we can get notified when the method's
* finished.
* -David Botterill 1/14/2005
*/
methodTask = new MethodTask(clientClassName,paramList,this.method,this.getRuntimeClassLoader());
methodTask.registerListener(this);
Thread methodThread = new Thread(methodTask);
methodThread.start();
}
@Override
public void methodFinished(final Object inReturnedObject,final LinkedList inParamList) {
if ( SwingUtilities.isEventDispatchThread()){
doMethodFinished(inReturnedObject, inParamList);
}
else {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
doMethodFinished(inReturnedObject, inParamList);
}
});
}
}
private void doMethodFinished(Object inReturnedObject,LinkedList inParamList) {
dialog.setCursor(normalCursor);
showResults(inReturnedObject);
/**
* Fix for Bug#: 5059732
* Now we need to also set the parameter values in the tree nodes since they may have changed due
* to the support for pass by reference ("Holders").
* - David Botterill 8/12/2004
*/
for(int ii=0; null != this.getParamterRootNode() && ii < this.getParamterRootNode().getChildCount(); ii++) {
DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) this.getParamterRootNode().getChildAt(ii);
TypeNodeData nodeData = (TypeNodeData)childNode.getUserObject();
nodeData.setTypeValue(inParamList.get(ii));
/**
* We really only care about Holder types from here since they are the only type of parameter that
* can have the value changed by the endpoint service.
*/
String topNodeType = nodeData.getTypeClass();
if(ReflectionHelper.isHolder(topNodeType)) {
((ParameterTreeNode)childNode).updateChildren();
}
}
/**
* Update the table since we may have changed some tree node values.
*/
parameterOutline.tableChanged(new TableModelEvent(parameterOutline.getOutlineModel()));
}
private void showResults(Object inResultObject) {
/**
* Create a tree of the result object types.
*/
try {
resultOutline = loadResultTreeTable(this.method, inResultObject);
resultOutline.getTableHeader().setReorderingAllowed(false);
resultOutline.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.resultOutline.ACC_name"));
resultOutline.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.resultOutline.ACC_desc"));
addFocusListener(resultOutline);
lblResults.setLabelFor(resultOutline);
scrollPaneResults.setViewportView(resultOutline);
}catch (WebServiceReflectionException ex) {
Throwable cause = ex.getCause();
ErrorManager.getDefault().notify(cause);
ErrorManager.getDefault().log(this.getClass().getName() + ": WebServiceReflectionException=" + cause);
}
}
private void myInitComponents() {
okButton.setText(okString);
/**
* Now set up the Nodes for the TreeTableView
*/
if(null == this.method) {
return;
}
try {
NodeHelper.createInstance(getRuntimeClassLoader());
parameterOutline = loadParameterTreeTable(this.method);
// Turn off the reordering
/**
* Add it to the correct Panel.
*/
scrollPaneParameter.setViewportView(parameterOutline);
/**
* Set up Accessibility stuff for not UI-Editor stuff.
*
*/
okButton.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.okButton.ACC_name"));
okButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.okButton.ACC_desc"));
okButton.setMnemonic(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.okButton.ACC_mnemonic").charAt(0));
parameterOutline.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.parameterOutline.ACC_name"));
parameterOutline.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(TestWebServiceMethodDlg.class, "TestWebServiceMethodDlg.parameterOutline.ACC_desc"));
lblParameters.setLabelFor(parameterOutline);
addFocusListener(parameterOutline);
}catch (WebServiceReflectionException ex) {
Throwable cause = ex.getCause();
ErrorManager.getDefault().notify(cause);
ErrorManager.getDefault().log(this.getClass().getName() + ": WebServiceReflectionException=" + cause);
}
}
private void addFocusListener(final JTable table) {
// fixes tab cycle when the table is empty
table.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent evt) {
Container cycleRoot = table.getFocusCycleRootAncestor();
FocusTraversalPolicy policy = table.getFocusTraversalPolicy();
if (policy == null && cycleRoot != null) {
policy = cycleRoot.getFocusTraversalPolicy();
}
if (table.getRowCount() == 0 && policy != null) {
Component target = policy.getComponentAfter(cycleRoot, table);
if (target != null && target == evt.getOppositeComponent()) {
target = policy.getComponentBefore(cycleRoot, table);
}
if (target != null) {
target.requestFocusInWindow();
}
}
}
@Override
public void focusLost(FocusEvent evt) {
}
});
}
private DefaultMutableTreeNode getParamterRootNode() {
return parameterRootNode;
}
private DefaultMutableTreeNode getResultRootNode() {
return resultRootNode;
}
private void setResultRootNode(DefaultMutableTreeNode inNode) {
resultRootNode = inNode;
}
private Outline loadResultTreeTable(JavaMethod inMethod, Object inResultObject) throws WebServiceReflectionException {
if(null == inMethod) {
return null;
}
JavaType currentType = inMethod.getReturnType();
String typeName = currentType.getRealName();
TypeNodeData data = ReflectionHelper.createTypeData(typeName, inResultObject);
DefaultMutableTreeNode node = NodeHelper.getInstance().createResultNodeFromData(data);
/**
* Make sure to create a new result root each time since the user can change the parameters and submit many
* times.
*/
this.setResultRootNode(new DefaultMutableTreeNode());
/**
* Add it to the root.
*/
this.getResultRootNode().add(node);
DefaultTreeModel treeModel = new DefaultTreeModel(this.getResultRootNode());
RowModel rowModel = new ResultRowModel();
OutlineModel outlineModel = DefaultOutlineModel.createOutlineModel(treeModel,
rowModel, false,NbBundle.getMessage(this.getClass(),
"TYPE_COLUMN_NAME"));
Outline returnOutline = new Outline(outlineModel);
ResultCellEditor cellEditor = new ResultCellEditor();
returnOutline.setDefaultEditor(Object.class,cellEditor);
returnOutline.setRootVisible(false);
returnOutline.setRenderDataProvider(new TypeDataProvider());
return returnOutline;
}
private Outline loadParameterTreeTable(JavaMethod inMethod) throws WebServiceReflectionException {
if(null == inMethod) {
return null;
}
List<JavaParameter> parameters = inMethod.getParametersList();
for (JavaParameter currentParameter : parameters) {
/**
* Add all Parameter's to the root tree node.
*/
JavaType currentType = currentParameter.getType();
String typeName = currentType.getRealName();
String typeParamName = currentParameter.getName();
if (currentParameter.isHolder()) {
typeName = "javax.xml.ws.Holder<" + typeName + ">"; // NOI18N
}
TypeNodeData data = ReflectionHelper.createTypeData(typeName, typeParamName);
data.setTypeValue(NodeHelper.getInstance().getParameterDefaultValue(data));
if (currentParameter.isHolder()) {
if (currentParameter.isIN()) data.setHolderType(TypeNodeData.IN);
if (currentParameter.isOUT()) data.setHolderType(TypeNodeData.OUT);
if (currentParameter.isINOUT()) data.setHolderType(TypeNodeData.IN_OUT);
}
DefaultMutableTreeNode node = NodeHelper.getInstance().createNodeFromData(data);
/**
* Add it to the root.
*/
this.getParamterRootNode().add(node);
}
DefaultTreeModel treeModel = new DefaultTreeModel(this.getParamterRootNode());
RowModel rowModel = new TypeRowModel(this.getRuntimeClassLoader());
OutlineModel outlineModel = DefaultOutlineModel.createOutlineModel(
treeModel,rowModel, false,NbBundle.getMessage(this.getClass(),
"TYPE_COLUMN_NAME")); // NOI18N
Outline returnOutline = new Outline(outlineModel);
TypeCellEditor cellEditor = new TypeCellEditor(getRuntimeClassLoader());
returnOutline.setDefaultEditor(Object.class,cellEditor);
returnOutline.setRootVisible(false);
returnOutline.setRenderDataProvider(new TypeDataProvider());
/**
* Fix Bug 5052705. This setting will cause the cells values to take affect when
* the focus is lost. This will remove the requirement of hitting "ENTER" after
* entering a value in a cell to get the value to take affect.
*/
returnOutline.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); // NOI18N
return returnOutline;
}
@Override
public void actionPerformed(ActionEvent evt) {
String actionCommand = evt.getActionCommand();
if(actionCommand.equalsIgnoreCase(okString)) {
okButtonAction(evt);
}
}
private void okButtonAction(ActionEvent evt) {
/**
* If the MethodTask is not null, the MethodTask
* thread may still be running so we need to tell
* it we've cancelled.
*/
if(null != methodTask) {
methodTask.cancel();
}
dialog.setCursor(normalCursor);
dialog.dispose();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel btnPanel;
private javax.swing.JButton btnSubmit;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JLabel lblParameters;
private javax.swing.JLabel lblResults;
private javax.swing.JLabel lblTitle;
private javax.swing.JPanel pnlLabel;
private javax.swing.JPanel pnlParameter;
private javax.swing.JPanel pnlResults;
private javax.swing.JScrollPane scrollPaneParameter;
private javax.swing.JScrollPane scrollPaneResults;
// End of variables declaration//GEN-END:variables
private final JButton okButton = new JButton();
private Outline parameterOutline;
private Outline resultOutline;
private Cursor normalCursor;
class MethodTask implements Runnable {
private final String clientClassName;
private final LinkedList paramList;
private final JavaMethod javaMethod;
private final URLClassLoader urlClassLoader;
private final List<MethodTaskListener> listeners = new ArrayList<>();
private boolean cancelled=false;
MethodTask(String inClientClassName, LinkedList inParamList, JavaMethod inJavaMethod,
URLClassLoader inURLClassLoader) {
clientClassName = inClientClassName;
paramList = inParamList;
javaMethod = inJavaMethod;
urlClassLoader = inURLClassLoader;
}
public void registerListener(MethodTaskListener inListener) {
if(!listeners.contains(inListener)) {
listeners.add(inListener);
}
}
private void notifyListeners(Object returnedObject) {
Iterator<MethodTaskListener> listenerIterator = listeners.iterator();
while(listenerIterator.hasNext()) {
MethodTaskListener currentListener = listenerIterator.next();
currentListener.methodFinished(returnedObject, paramList);
}
}
@Override
public void run() {
/**
* Now invoke the method using the ReflectionHelper.
*/
Object returnObject;
try {
returnObject = ReflectionHelper.callMethodWithParams(clientClassName, paramList, javaMethod,urlClassLoader, wsData.getWsdlData(), port);
} catch (Exception wsre) {
if(!cancelled) {
Throwable exception = wsre;
if (wsre.getCause() instanceof java.lang.reflect.InvocationTargetException) {
exception = wsre.getCause();
}
MethodExceptionDialog errorDialog = new MethodExceptionDialog(exception);
/**
* Notify the listeners so the cursor will be reset;
*/
notifyListeners(null);
errorDialog.showDialog(btnSubmit);
}
return;
}
notifyListeners(returnObject);
}
public void cancel() {
cancelled=true;
}
}
private static class BusyMouseAdapter extends MouseAdapter {
private final Cursor normalCursor;
public BusyMouseAdapter(Cursor inNormalCursor) {
normalCursor = inNormalCursor;
}
@Override
public void mouseEntered(MouseEvent e) {
e.getComponent().setCursor(normalCursor);
}
@Override
public void mouseExited(MouseEvent e) {
}
}
}