diff options
author | Jose <jose@zeroc.com> | 2009-10-02 02:23:52 +0200 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2009-10-02 02:23:52 +0200 |
commit | 1d9f29e281770ecdad4a245271f2b828bd64a32f (patch) | |
tree | ac083f28b06a444e484c24f8fcf1b12a36202c84 /java/demo/Ice/swing/Client.java | |
parent | Updated demo README (diff) | |
download | ice-1d9f29e281770ecdad4a245271f2b828bd64a32f.tar.bz2 ice-1d9f29e281770ecdad4a245271f2b828bd64a32f.tar.xz ice-1d9f29e281770ecdad4a245271f2b828bd64a32f.zip |
3772. Recovering from Glacier2 / Ice router session failure.
Diffstat (limited to 'java/demo/Ice/swing/Client.java')
-rw-r--r-- | java/demo/Ice/swing/Client.java | 659 |
1 files changed, 659 insertions, 0 deletions
diff --git a/java/demo/Ice/swing/Client.java b/java/demo/Ice/swing/Client.java new file mode 100644 index 00000000000..0333548d285 --- /dev/null +++ b/java/demo/Ice/swing/Client.java @@ -0,0 +1,659 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2009 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.event.*; + +public class Client extends JFrame +{ + public static void main(final String[] args) + { + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + try + { + // + // Create and set up the window. + // + new Client(args); + } + catch(Ice.LocalException e) + { + JOptionPane.showMessageDialog(null, e.toString(), "Initialization failed", + JOptionPane.ERROR_MESSAGE); + } + } + }); + } + + private void destroyCommunicator() + { + if(_communicator == null) + { + return; + } + + // + // Destroy the Ice communicator. + // + try + { + _communicator.destroy(); + } + catch(Throwable ex) + { + ex.printStackTrace(); + } + finally + { + _communicator = null; + } + } + + Client(String[] args) + { + // + // Initialize an Ice communicator. + // + try + { + Ice.InitializationData initData = new Ice.InitializationData(); + initData.properties = Ice.Util.createProperties(); + initData.properties.load("config.client"); + _communicator = Ice.Util.initialize(args, initData); + } + catch(Throwable ex) + { + handleException(ex); + } + + Container cp = this; + + JLabel l1 = new JLabel("Hostname"); + _hostname = new JTextField(); + JLabel l2 = new JLabel("Mode"); + _mode = new JComboBox(); + JLabel l3 = new JLabel("Timeout"); + _timeoutSlider = new JSlider(0, MAX_TIME); + _timeoutLabel = new JLabel("0.0"); + JLabel l4 = new JLabel("Delay"); + _delaySlider = new JSlider(0, MAX_TIME); + _delayLabel = new JLabel("0.0"); + JPanel buttonPanel = new JPanel(); + _hello = new JButton("Hello World!"); + _shutdown = new JButton("Shutdown"); + _flush = new JButton("Flush"); + _flush.setEnabled(false); + JPanel statusPanel = new JPanel(); + JSeparator statusPanelSeparator = new JSeparator(); + _status = new JLabel(); + _status.setText("Ready"); + + // + // Default to localhost. + // + _hostname.setText("127.0.0.1"); + + final String[] modes = new String[] + { + "Twoway", "Twoway Secure", "Oneway", "Oneway Batch", "Oneway Secure", "Oneway Secure Batch", "Datagram", + "Datagram Batch" + }; + _mode.setModel(new DefaultComboBoxModel(modes)); + + _hello.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + sayHello(); + } + }); + _shutdown.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + shutdown(); + } + }); + _flush.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + flush(); + } + }); + _mode.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + changeDeliveryMode(_mode.getSelectedIndex()); + } + }); + changeDeliveryMode(_mode.getSelectedIndex()); + + _timeoutSlider.addChangeListener(new SliderListener(_timeoutSlider, _timeoutLabel)); + _timeoutSlider.setValue(0); + _delaySlider.addChangeListener(new SliderListener(_delaySlider, _delayLabel)); + _delaySlider.setValue(0); + + GridBagConstraints gridBagConstraints; + + cp.setMaximumSize(null); + cp.setPreferredSize(null); + cp.setLayout(new GridBagLayout()); + + l1.setText("Hostname"); + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 0; + gridBagConstraints.anchor = GridBagConstraints.WEST; + gridBagConstraints.insets = new Insets(5, 5, 5, 5); + cp.add(l1, gridBagConstraints); + + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 1; + gridBagConstraints.gridy = 0; + gridBagConstraints.gridwidth = 2; + gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; + gridBagConstraints.insets = new Insets(5, 0, 5, 5); + cp.add(_hostname, gridBagConstraints); + + l2.setText("Mode"); + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 1; + gridBagConstraints.anchor = GridBagConstraints.WEST; + gridBagConstraints.insets = new Insets(0, 5, 5, 0); + cp.add(l2, gridBagConstraints); + + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 1; + gridBagConstraints.gridy = 1; + gridBagConstraints.gridwidth = 2; + gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; + gridBagConstraints.insets = new Insets(0, 0, 5, 5); + cp.add(_mode, gridBagConstraints); + + l3.setText("Timeout"); + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 2; + gridBagConstraints.anchor = GridBagConstraints.WEST; + gridBagConstraints.insets = new Insets(0, 5, 5, 0); + cp.add(l3, gridBagConstraints); + + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 1; + gridBagConstraints.gridy = 2; + gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; + gridBagConstraints.anchor = GridBagConstraints.WEST; + cp.add(_timeoutSlider, gridBagConstraints); + + _timeoutLabel.setMinimumSize(new Dimension(20, 17)); + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 2; + gridBagConstraints.gridy = 2; + gridBagConstraints.anchor = GridBagConstraints.WEST; + gridBagConstraints.insets = new Insets(0, 5, 5, 5); + cp.add(_timeoutLabel, gridBagConstraints); + + l4.setText("Delay"); + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 3; + gridBagConstraints.anchor = GridBagConstraints.WEST; + gridBagConstraints.insets = new Insets(0, 5, 5, 0); + cp.add(l4, gridBagConstraints); + + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 1; + gridBagConstraints.gridy = 3; + gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; + gridBagConstraints.anchor = GridBagConstraints.WEST; + cp.add(_delaySlider, gridBagConstraints); + + _delayLabel.setMinimumSize(new Dimension(20, 17)); + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 2; + gridBagConstraints.gridy = 3; + gridBagConstraints.anchor = GridBagConstraints.WEST; + gridBagConstraints.insets = new Insets(0, 5, 5, 5); + cp.add(_delayLabel, gridBagConstraints); + + _hello.setText("Hello World!"); + buttonPanel.add(_hello); + + _shutdown.setText("Shutdown"); + buttonPanel.add(_shutdown); + + _flush.setText("Flush"); + buttonPanel.add(_flush); + + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 4; + gridBagConstraints.gridwidth = 3; + gridBagConstraints.ipady = 5; + cp.add(buttonPanel, gridBagConstraints); + + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 5; + gridBagConstraints.gridwidth = 3; + gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; + gridBagConstraints.insets = new Insets(0, 5, 5, 5); + cp.add(statusPanelSeparator, gridBagConstraints); + + gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 6; + gridBagConstraints.gridwidth = 3; + gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; + gridBagConstraints.insets = new Insets(0, 5, 5, 5); + cp.add(_status, gridBagConstraints); + + setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + + _shutdownHook = new Thread("Shutdown hook") + { + public void run() + { + destroyCommunicator(); + } + }; + + try + { + Runtime.getRuntime().addShutdownHook(_shutdownHook); + } + catch(IllegalStateException e) + { + // + // Shutdown in progress, ignored + // + } + + addWindowListener(new WindowAdapter() + { + public void windowClosing(WindowEvent e) + { + destroyCommunicator(); + Runtime.getRuntime().removeShutdownHook(_shutdownHook); + dispose(); + Runtime.getRuntime().exit(0); + } + }); + + + setTitle("Ice - Hello World!"); + pack(); + locateOnScreen(this); + setVisible(true); + } + + private enum DeliveryMode + { + TWOWAY, + TWOWAY_SECURE, + ONEWAY, + ONEWAY_BATCH, + ONEWAY_SECURE, + ONEWAY_SECURE_BATCH, + DATAGRAM, + DATAGRAM_BATCH; + + Ice.ObjectPrx apply(Ice.ObjectPrx prx) + { + switch (this) + { + case TWOWAY: + { + prx = prx.ice_twoway(); + break; + } + case TWOWAY_SECURE: + { + prx = prx.ice_twoway().ice_secure(true); + break; + } + case ONEWAY: + { + prx = prx.ice_oneway(); + break; + } + case ONEWAY_BATCH: + { + prx = prx.ice_batchOneway(); + break; + } + case ONEWAY_SECURE: + { + prx = prx.ice_oneway().ice_secure(true); + break; + } + case ONEWAY_SECURE_BATCH: + { + prx = prx.ice_batchOneway().ice_secure(true); + break; + } + case DATAGRAM: + { + prx = prx.ice_datagram(); + break; + } + case DATAGRAM_BATCH: + { + prx = prx.ice_batchDatagram(); + break; + } + } + return prx; + } + + public boolean isBatch() + { + return this == ONEWAY_BATCH || this == DATAGRAM_BATCH || this == ONEWAY_SECURE_BATCH; + } + } + + private Demo.HelloPrx createProxy() + { + String host = _hostname.getText().toString().trim(); + if(host.length() == 0) + { + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + _status.setText("No hostname"); + } + }); + return null; + } + + String s = "hello:tcp -h " + host + " -p 10000:ssl -h " + host + " -p 10001:udp -h " + host + " -p 10000"; + Ice.ObjectPrx prx = _communicator.stringToProxy(s); + prx = _deliveryMode.apply(prx); + int timeout = _timeoutSlider.getValue(); + if(timeout != 0) + { + prx = prx.ice_timeout(timeout); + } + return Demo.HelloPrxHelper.uncheckedCast(prx); + } + + class SayHelloI extends Demo.AMI_Hello_sayHello implements Ice.AMISentCallback + { + synchronized public void ice_exception(final Ice.LocalException ex) + { + assert (!_response); + _response = true; + + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + handleException(ex); + } + }); + } + + synchronized public void ice_sent() + { + if(_response) + { + return; + } + + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + if(_deliveryMode == DeliveryMode.TWOWAY || _deliveryMode == DeliveryMode.TWOWAY_SECURE) + { + _status.setText("Waiting for response"); + } + else + { + _status.setText("Ready"); + } + } + }); + } + + synchronized public void ice_response() + { + assert (!_response); + _response = true; + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + _status.setText("Ready"); + } + }); + } + + private boolean _response = false; + } + + private void sayHello() + { + Demo.HelloPrx hello = createProxy(); + if(hello == null) + { + return; + } + + int delay = _delaySlider.getValue(); + try + { + if(!_deliveryMode.isBatch()) + { + if(hello.sayHello_async(new SayHelloI(), delay)) + { + if(_deliveryMode == DeliveryMode.TWOWAY || _deliveryMode == DeliveryMode.TWOWAY_SECURE) + { + _status.setText("Waiting for response"); + } + } + else + { + _status.setText("Sending request"); + } + } + else + { + _flush.setEnabled(true); + hello.sayHello(delay); + _status.setText("Queued sayHello request"); + } + } + catch(Ice.LocalException ex) + { + handleException(ex); + } + } + + private void shutdown() + { + Demo.HelloPrx hello = createProxy(); + if(hello == null) + { + return; + } + + try + { + if(!_deliveryMode.isBatch()) + { + hello.shutdown_async(new Demo.AMI_Hello_shutdown() + { + public void ice_exception(final Ice.LocalException ex) + { + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + handleException(ex); + } + }); + } + + public void ice_response() + { + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + _status.setText("Ready"); + } + }); + } + }); + if(_deliveryMode == DeliveryMode.TWOWAY || _deliveryMode == DeliveryMode.TWOWAY_SECURE) + { + _status.setText("Waiting for response"); + } + } + else + { + _flush.setEnabled(true); + hello.shutdown(); + _status.setText("Queued shutdown request"); + } + } + catch(Ice.LocalException ex) + { + handleException(ex); + } + } + + private void flush() + { + new Thread(new Runnable() + { + public void run() + { + try + { + _communicator.flushBatchRequests(); + } + catch(final Ice.LocalException ex) + { + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + handleException(ex); + } + }); + } + } + }).start(); + + _flush.setEnabled(false); + _status.setText("Flushed batch requests"); + } + + private void changeDeliveryMode(long id) + { + switch ((int)id) + { + case 0: + _deliveryMode = DeliveryMode.TWOWAY; + break; + case 1: + _deliveryMode = DeliveryMode.TWOWAY_SECURE; + break; + case 2: + _deliveryMode = DeliveryMode.ONEWAY; + break; + case 3: + _deliveryMode = DeliveryMode.ONEWAY_BATCH; + break; + case 4: + _deliveryMode = DeliveryMode.ONEWAY_SECURE; + break; + case 5: + _deliveryMode = DeliveryMode.ONEWAY_SECURE_BATCH; + break; + case 6: + _deliveryMode = DeliveryMode.DATAGRAM; + break; + case 7: + _deliveryMode = DeliveryMode.DATAGRAM_BATCH; + break; + } + } + + private void handleException(final Throwable ex) + { + // Ignore CommunicatorDestroyedException which could occur on + // shutdown. + if(ex instanceof Ice.CommunicatorDestroyedException) + { + return; + } + ex.printStackTrace(); + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + _status.setText(ex.getClass().getName()); + } + }); + } + + private static class SliderListener implements ChangeListener + { + SliderListener(JSlider slider, JLabel label) + { + _slider = slider; + _label = label; + } + + public void stateChanged(ChangeEvent ce) + { + float value = (float)(_slider.getValue() / 1000.0); + _label.setText(String.format("%.1f", value)); + } + + private JSlider _slider; + private JLabel _label; + } + + private static void locateOnScreen(Component component) + { + Dimension paneSize = component.getSize(); + Dimension screenSize = component.getToolkit().getScreenSize(); + component.setLocation((screenSize.width - paneSize.width) / 2, (screenSize.height - paneSize.height) / 2); + } + + private static final int MAX_TIME = 5000; // 5 seconds + + private JTextField _hostname; + private JComboBox _mode; + private JSlider _timeoutSlider; + private JLabel _timeoutLabel; + private JSlider _delaySlider; + private JLabel _delayLabel; + private JButton _hello; + private JButton _shutdown; + private JButton _flush; + private JLabel _status; + + private Ice.Communicator _communicator; + private DeliveryMode _deliveryMode; + private Thread _shutdownHook; +} |