|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
/* |
|
* This source code is provided to illustrate the usage of a given feature |
|
* or technique and has been deliberately simplified. Additional steps |
|
* required for a production-quality application, such as security checks, |
|
* input validation and proper error handling, might not be present in |
|
* this sample code. |
|
*/ |
|
|
|
|
|
package com.sun.tools.example.debug.gui; |
|
|
|
import java.util.List; |
|
import java.util.ArrayList; |
|
import java.util.Map; |
|
import java.util.HashMap; |
|
import java.awt.BorderLayout; |
|
import java.awt.Container; |
|
import java.awt.event.ActionEvent; |
|
import java.awt.event.ActionListener; |
|
import javax.swing.*; |
|
import javax.swing.border.Border; |
|
import javax.swing.border.TitledBorder; |
|
|
|
import com.sun.jdi.*; |
|
import com.sun.jdi.connect.*; |
|
|
|
import com.sun.tools.example.debug.bdi.*; |
|
|
|
class LaunchTool { |
|
|
|
private final ExecutionManager runtime; |
|
|
|
private abstract class ArgRep { |
|
final Connector.Argument arg; |
|
final JPanel panel; |
|
|
|
ArgRep(Connector.Argument arg) { |
|
this.arg = arg; |
|
panel = new JPanel(); |
|
Border etched = BorderFactory.createEtchedBorder(); |
|
Border titled = BorderFactory.createTitledBorder(etched, |
|
arg.description(), |
|
TitledBorder.LEFT, TitledBorder.TOP); |
|
panel.setBorder(titled); |
|
} |
|
|
|
abstract String getText(); |
|
|
|
boolean isValid() { |
|
return arg.isValid(getText()); |
|
} |
|
|
|
boolean isSpecified() { |
|
String value = getText(); |
|
return (value != null && value.length() > 0) || |
|
!arg.mustSpecify(); |
|
} |
|
|
|
void install() { |
|
arg.setValue(getText()); |
|
} |
|
} |
|
|
|
private class StringArgRep extends ArgRep { |
|
final JTextField textField; |
|
|
|
StringArgRep(Connector.Argument arg, JPanel comp) { |
|
super(arg); |
|
textField = new JTextField(arg.value(), 50 ); |
|
textField.setBorder(BorderFactory.createLoweredBevelBorder()); |
|
|
|
panel.add(new JLabel(arg.label(), SwingConstants.RIGHT)); |
|
panel.add(textField); |
|
comp.add(panel); |
|
} |
|
|
|
@Override |
|
String getText() { |
|
return textField.getText(); |
|
} |
|
} |
|
|
|
private class BooleanArgRep extends ArgRep { |
|
final JCheckBox check; |
|
|
|
BooleanArgRep(Connector.BooleanArgument barg, JPanel comp) { |
|
super(barg); |
|
check = new JCheckBox(barg.label()); |
|
check.setSelected(barg.booleanValue()); |
|
panel.add(check); |
|
comp.add(panel); |
|
} |
|
|
|
@Override |
|
String getText() { |
|
return ((Connector.BooleanArgument)arg) |
|
.stringValueOf(check.getModel().isSelected()); |
|
} |
|
} |
|
|
|
|
|
private LaunchTool(ExecutionManager runtime) { |
|
this.runtime = runtime; |
|
} |
|
|
|
private Connector selectConnector() { |
|
final JDialog dialog = new JDialog(); |
|
Container content = dialog.getContentPane(); |
|
final JPanel radioPanel = new JPanel(); |
|
final ButtonGroup radioGroup = new ButtonGroup(); |
|
VirtualMachineManager manager = Bootstrap.virtualMachineManager(); |
|
List<Connector> all = manager.allConnectors(); |
|
Map<ButtonModel, Connector> modelToConnector = new HashMap<ButtonModel, Connector>(all.size(), 0.5f); |
|
|
|
dialog.setModal(true); |
|
dialog.setTitle("Select Connector Type"); |
|
radioPanel.setLayout(new BoxLayout(radioPanel, BoxLayout.Y_AXIS)); |
|
for (Connector connector : all) { |
|
JRadioButton radio = new JRadioButton(connector.description()); |
|
modelToConnector.put(radio.getModel(), connector); |
|
radioPanel.add(radio); |
|
radioGroup.add(radio); |
|
} |
|
content.add(radioPanel); |
|
|
|
final boolean[] oked = {false}; |
|
JPanel buttonPanel = okCancel( dialog, new ActionListener() { |
|
@Override |
|
public void actionPerformed(ActionEvent event) { |
|
if (radioGroup.getSelection() == null) { |
|
JOptionPane.showMessageDialog(dialog, |
|
"Please select a connector type", |
|
"No Selection", |
|
JOptionPane.ERROR_MESSAGE); |
|
} else { |
|
oked[0] = true; |
|
dialog.setVisible(false); |
|
dialog.dispose(); |
|
} |
|
} |
|
} ); |
|
content.add(BorderLayout.SOUTH, buttonPanel); |
|
dialog.pack(); |
|
dialog.setVisible(true); |
|
|
|
return oked[0] ? |
|
modelToConnector.get(radioGroup.getSelection()) : |
|
null; |
|
} |
|
|
|
private void configureAndConnect(final Connector connector) { |
|
final JDialog dialog = new JDialog(); |
|
final Map<String, Connector.Argument> args = connector.defaultArguments(); |
|
|
|
dialog.setModal(true); |
|
dialog.setTitle("Connector Arguments"); |
|
Container content = dialog.getContentPane(); |
|
JPanel guts = new JPanel(); |
|
Border etched = BorderFactory.createEtchedBorder(); |
|
BorderFactory.createTitledBorder(etched, |
|
connector.description(), |
|
TitledBorder.LEFT, TitledBorder.TOP); |
|
guts.setBorder(etched); |
|
guts.setLayout(new BoxLayout(guts, BoxLayout.Y_AXIS)); |
|
|
|
// guts.add(new JLabel(connector.description())); |
|
|
|
final List<ArgRep> argReps = new ArrayList<ArgRep>(args.size()); |
|
for (Connector.Argument arg : args.values()) { |
|
ArgRep ar; |
|
if (arg instanceof Connector.BooleanArgument) { |
|
ar = new BooleanArgRep((Connector.BooleanArgument)arg, guts); |
|
} else { |
|
ar = new StringArgRep(arg, guts); |
|
} |
|
argReps.add(ar); |
|
} |
|
content.add(guts); |
|
|
|
JPanel buttonPanel = okCancel( dialog, new ActionListener() { |
|
@Override |
|
public void actionPerformed(ActionEvent event) { |
|
for (ArgRep ar : argReps) { |
|
if (!ar.isSpecified()) { |
|
JOptionPane.showMessageDialog(dialog, |
|
ar.arg.label() + |
|
": Argument must be specified", |
|
"No argument", JOptionPane.ERROR_MESSAGE); |
|
return; |
|
} |
|
if (!ar.isValid()) { |
|
JOptionPane.showMessageDialog(dialog, |
|
ar.arg.label() + |
|
": Bad argument value: " + |
|
ar.getText(), |
|
"Bad argument", JOptionPane.ERROR_MESSAGE); |
|
return; |
|
} |
|
ar.install(); |
|
} |
|
try { |
|
if (runtime.explictStart(connector, args)) { |
|
dialog.setVisible(false); |
|
dialog.dispose(); |
|
} else { |
|
JOptionPane.showMessageDialog(dialog, |
|
"Bad arguments values: See diagnostics window.", |
|
"Bad arguments", JOptionPane.ERROR_MESSAGE); |
|
} |
|
} catch (VMLaunchFailureException exc) { |
|
JOptionPane.showMessageDialog(dialog, |
|
"Launch Failure: " + exc, |
|
"Launch Failed",JOptionPane.ERROR_MESSAGE); |
|
} |
|
} |
|
} ); |
|
content.add(BorderLayout.SOUTH, buttonPanel); |
|
dialog.pack(); |
|
dialog.setVisible(true); |
|
} |
|
|
|
private JPanel okCancel(final JDialog dialog, ActionListener okListener) { |
|
JPanel buttonPanel = new JPanel(); |
|
JButton ok = new JButton("OK"); |
|
JButton cancel = new JButton("Cancel"); |
|
buttonPanel.add(ok); |
|
buttonPanel.add(cancel); |
|
ok.addActionListener(okListener); |
|
cancel.addActionListener( new ActionListener() { |
|
@Override |
|
public void actionPerformed(ActionEvent event) { |
|
dialog.setVisible(false); |
|
dialog.dispose(); |
|
} |
|
} ); |
|
return buttonPanel; |
|
} |
|
|
|
static void queryAndLaunchVM(ExecutionManager runtime) |
|
throws VMLaunchFailureException { |
|
LaunchTool lt = new LaunchTool(runtime); |
|
Connector connector = lt.selectConnector(); |
|
if (connector != null) { |
|
lt.configureAndConnect(connector); |
|
} |
|
} |
|
} |