summaryrefslogtreecommitdiff
path: root/java/demo
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2009-01-02 15:16:46 -0330
committerDwayne Boone <dwayne@zeroc.com>2009-01-02 15:16:46 -0330
commit51ee7620f82e4232baf587ee052001751c23e481 (patch)
tree08baaf92bddeca3f33acfe1bb38620606de7a99b /java/demo
parentThe server now accepts anonymous clients. (diff)
downloadice-51ee7620f82e4232baf587ee052001751c23e481.tar.bz2
ice-51ee7620f82e4232baf587ee052001751c23e481.tar.xz
ice-51ee7620f82e4232baf587ee052001751c23e481.zip
Merged with R3_3_branch
Diffstat (limited to 'java/demo')
-rw-r--r--java/demo/Ice/README9
-rw-r--r--java/demo/Ice/applet/Hello.ice24
-rw-r--r--java/demo/Ice/applet/HelloApplet.java597
-rw-r--r--java/demo/Ice/applet/README44
-rw-r--r--java/demo/Ice/applet/applet.pro53
-rw-r--r--java/demo/Ice/applet/build.xml94
-rw-r--r--java/demo/Ice/applet/hello.html35
-rw-r--r--java/demo/Ice/build.xml14
-rw-r--r--java/demo/RMI/README12
-rw-r--r--java/demo/RMI/build.xml24
-rwxr-xr-xjava/demo/RMI/throughput/Client.java421
-rwxr-xr-xjava/demo/RMI/throughput/README26
-rwxr-xr-xjava/demo/RMI/throughput/Server.java145
-rwxr-xr-xjava/demo/RMI/throughput/Throughput.java51
-rwxr-xr-xjava/demo/RMI/throughput/build.xml35
-rwxr-xr-xjava/demo/RMI/throughput/policy3
16 files changed, 1579 insertions, 8 deletions
diff --git a/java/demo/Ice/README b/java/demo/Ice/README
index ed7506e7146..6a9eceee376 100644
--- a/java/demo/Ice/README
+++ b/java/demo/Ice/README
@@ -1,9 +1,14 @@
Demos in this directory:
+- applet
+
+ An unsigned applet that demonstrates how to use Asynchronous Method
+ Invocation (AMI) in a graphical client.
+
- async
- This demo illustrates the use of Asynchronous Message Invocation
- (AMI) and Asynchronous Message Dispatch (AMD).
+ This demo illustrates the use of Asynchronous Method Invocation
+ (AMI) and Asynchronous Method Dispatch (AMD).
- bidir
diff --git a/java/demo/Ice/applet/Hello.ice b/java/demo/Ice/applet/Hello.ice
new file mode 100644
index 00000000000..0ab2de4f3e6
--- /dev/null
+++ b/java/demo/Ice/applet/Hello.ice
@@ -0,0 +1,24 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2008 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.
+//
+// **********************************************************************
+
+#ifndef HELLO_ICE
+#define HELLO_ICE
+
+module Demo
+{
+
+interface Hello
+{
+ ["ami"] idempotent void sayHello(int delay);
+ ["ami"] void shutdown();
+};
+
+};
+
+#endif
diff --git a/java/demo/Ice/applet/HelloApplet.java b/java/demo/Ice/applet/HelloApplet.java
new file mode 100644
index 00000000000..751ef21ea51
--- /dev/null
+++ b/java/demo/Ice/applet/HelloApplet.java
@@ -0,0 +1,597 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2008 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 HelloApplet extends JApplet
+{
+ public void init()
+ {
+ //
+ // Make sure we create the GUI from the Swing event dispatch thread.
+ //
+ try
+ {
+ SwingUtilities.invokeAndWait(new Runnable()
+ {
+ public void run()
+ {
+ initUI();
+ }
+ });
+ }
+ catch(Throwable ex)
+ {
+ ex.printStackTrace();
+ return;
+ }
+
+ //
+ // Initialize an Ice communicator.
+ //
+ try
+ {
+ Ice.InitializationData initData = new Ice.InitializationData();
+ initData.properties = Ice.Util.createProperties();
+ initData.properties.setProperty("Ice.ACM.Client", "10");
+ _communicator = Ice.Util.initialize(initData);
+ }
+ catch(Throwable ex)
+ {
+ handleException(ex);
+ }
+ }
+
+ public void start()
+ {
+ // Nothing to do.
+ }
+
+ public void stop()
+ {
+ // Nothing to do.
+ }
+
+ public void destroy()
+ {
+ //
+ // Destroy the Ice run time.
+ //
+ if(_communicator != null)
+ {
+ try
+ {
+ _communicator.destroy();
+ }
+ catch(Throwable ex)
+ {
+ ex.printStackTrace();
+ }
+ _communicator = null;
+ }
+ }
+
+ private void initUI()
+ {
+ Container cp = getContentPane();
+
+ 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 the host from which the applet was downloaded.
+ //
+ _hostname.setText(getCodeBase().getHost());
+
+ 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);
+ }
+
+ 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
+ {
+ private boolean _response = false;
+
+ 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 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)
+ {
+ 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 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;
+}
diff --git a/java/demo/Ice/applet/README b/java/demo/Ice/applet/README
new file mode 100644
index 00000000000..83e3cfc5e84
--- /dev/null
+++ b/java/demo/Ice/applet/README
@@ -0,0 +1,44 @@
+This demo presents an unsigned applet that shows how to make
+asynchronous Ice invocations in a graphical application.
+
+The demo includes a start page (hello.html) that you will need to
+publish on a web server. This page assumes that the demo applet is
+stored in a fully self-contained archive named Hello.jar. In order to
+create a fully self-contained JAR file, you must build the applet
+with ProGuard in your CLASSPATH. After a successful build, copy
+Hello.jar from this subdirectory to the same directory as hello.html
+on your web server.
+
+If you did not build the applet with ProGuard in your CLASSPATH, the
+Hello.jar archive contains only the applet classes. In this case you
+must modify the start page to add Ice.jar to the applet's ARCHIVE
+parameter. Alternatively, you can add ProGuard to your CLASSPATH and
+rebuild the applet with the following commands:
+
+ ant clean
+ ant
+
+To run the demo, you must start a "hello" server on the web server
+host. You can use the hello server from the ../hello directory or
+a hello server from any other Ice language mapping. Note that you may
+need to temporarily relax the firewall restrictions on your web server
+host to allow the applet to establish connections to the hello server.
+Next, start a web browser and open the hello.html page on your web
+server.
+
+Once the applet has started, verify that the name of your web server
+host is correct in the "Hostname" field and press the "Hello World!"
+button. You will notice that the server prints a "Hello World!"
+message to the console for each invocation. To make other types of Ice
+invocations, select a different mode from the combobox.
+
+The two sliders allow you to experiment with various timeout settings.
+The "Timeout" slider determines how long the Ice run time will wait
+for an invocation to complete, while the "Delay" slider forces the
+server to delay its response. The value of each slider is shown in
+seconds. To force a timeout, select a non-zero timeout and set the
+delay to be larger than the timeout. The server prints two "Hello
+World!" messages in this case because the Slice operation sayHello is
+marked as idempotent, meaning that Ice does not need to follow the
+at-most-once retry semantics. See the manual for more information
+about retry behavior.
diff --git a/java/demo/Ice/applet/applet.pro b/java/demo/Ice/applet/applet.pro
new file mode 100644
index 00000000000..dae1ea08906
--- /dev/null
+++ b/java/demo/Ice/applet/applet.pro
@@ -0,0 +1,53 @@
+# ProGuard configuration options
+
+-keep class HelloApplet
+
+# Preserve all annotations.
+-keepattributes *Annotation*
+
+# Preserve all native method names and the names of their classes.
+-keepclasseswithmembernames class * {
+ native <methods>;
+}
+
+# Preserve a method that is required in all enumeration classes.
+-keepclassmembers class * extends java.lang.Enum {
+ public **[] values();
+}
+
+-dontskipnonpubliclibraryclasses
+-dontusemixedcaseclassnames
+-dontwarn
+
+# We could reduce the size of the JAR file significantly if we
+# enable obfuscation but it would make things like stack traces
+# much harder to read.
+-dontobfuscate
+
+-keepclassmembers class * implements java.io.Serializable {
+ static final long serialVersionUID;
+ private void writeObject(java.io.ObjectOutputStream);
+ private void readObject(java.io.ObjectInputStream);
+ java.lang.Object writeReplace();
+ java.lang.Object readResolve();
+}
+
+# This class is loaded dynamically.
+-keep public class IceSSL.PluginFactory {
+ public *;
+}
+
+# More keeps to suppress Notes
+
+-keep interface Ice.Communicator
+-keep class IceInternal.SelectorHandler
+
+-keep public class Ice.DispatchStatus {
+ int __value;
+ Ice.DispatchStatus[] __values;
+ int value();
+}
+
+-keep public class java.net.DatagramSocketImpl {
+ java.io.FileDescriptor fd;
+}
diff --git a/java/demo/Ice/applet/build.xml b/java/demo/Ice/applet/build.xml
new file mode 100644
index 00000000000..ad9be449216
--- /dev/null
+++ b/java/demo/Ice/applet/build.xml
@@ -0,0 +1,94 @@
+<!--
+ **********************************************************************
+
+ Copyright (c) 2003-2008 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.
+
+ **********************************************************************
+-->
+
+<project name="demo_Ice_applet" default="all" basedir=".">
+
+ <!-- set global properties for this build -->
+ <property name="top.dir" value="../../.."/>
+
+ <!-- import common definitions -->
+ <import file="${top.dir}/config/common.xml"/>
+
+ <condition property="proguard-found">
+ <available classname="proguard.ant.ProGuardTask" classpath="${env.CLASSPATH}" />
+ </condition>
+
+ <target name="generate" depends="init">
+ <!-- Create the output directory for generated code -->
+ <mkdir dir="${generated.dir}"/>
+ <slice2java outputdir="${generated.dir}">
+ <meta value="${java2metadata}"/>
+ <includepath>
+ <pathelement path="${slice.dir}"/>
+ </includepath>
+ <fileset dir="." includes="Hello.ice"/>
+ </slice2java>
+ </target>
+
+ <target name="compile" depends="generate">
+ <mkdir dir="${class.dir}"/>
+ <javac srcdir="${generated.dir}" destdir="${class.dir}"
+ debug="${debug}">
+ <classpath refid="ice.classpath"/>
+ <compilerarg value="${javac.lint}"/>
+ </javac>
+ <javac srcdir="." destdir="${class.dir}"
+ excludes="generated/**" debug="${debug}">
+ <classpath refid="ice.classpath"/>
+ <compilerarg value="${javac.lint}"/>
+ </javac>
+ </target>
+
+ <target name="jar" depends="compile" unless="proguard-found">
+ <jar jarfile="Hello.jar" basedir="${class.dir}">
+ <include name="Demo/**"/>
+ <include name="HelloApplet*"/>
+ </jar>
+ </target>
+
+ <target name="proguard-jar" depends="jar" if="proguard-found">
+ <condition property="library.jarfiles" value="classes.jar,jsse.jar">
+ <os family="mac"/>
+ </condition>
+ <condition property="library.jarfiles" value="rt.jar,jsse.jar">
+ <!-- Library jar files for Sun JDK -->
+ <available file="${java.home}/lib/rt.jar"/>
+ </condition>
+ <condition property="library.jarfiles" value="vm.jar,core.jar,graphics.jar,security.jar">
+ <!-- Library jar files for IBM J9 (from Linux SuSE) -->
+ <available file="${java.home}/lib/vm.jar"/>
+ </condition>
+ <condition property="library.jarpath" value="${java.home}/../Classes" else="${java.home}/lib">
+ <os family="mac"/>
+ </condition>
+ <pathconvert property="library.jars">
+ <filelist dir="${library.jarpath}" files="${library.jarfiles}"/>
+ </pathconvert>
+
+ <taskdef resource="proguard/ant/task.properties"/>
+
+ <proguard configuration="applet.pro">
+ <injar path="${class.dir}"/>
+ <injar refid="ice.classpath" filter="!META-INF/**"/>
+ <outjar path="Hello.jar"/>
+ <libraryjar path="${library.jars}"/>
+ </proguard>
+ </target>
+
+ <target name="all" depends="proguard-jar"/>
+
+ <target name="clean">
+ <delete file="Hello.jar"/>
+ <delete dir="${generated.dir}"/>
+ <delete dir="${class.dir}"/>
+ </target>
+
+</project>
diff --git a/java/demo/Ice/applet/hello.html b/java/demo/Ice/applet/hello.html
new file mode 100644
index 00000000000..c0a48d8f38f
--- /dev/null
+++ b/java/demo/Ice/applet/hello.html
@@ -0,0 +1,35 @@
+<html>
+<head>
+<title>Ice Hello Applet</title>
+</head>
+
+<body>
+<object
+ classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
+ codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=1,5,0,0"
+ WIDTH = 300 HEIGHT = 175 >
+ <PARAM NAME = CODE VALUE = "HelloApplet" >
+ <param name = "type" value = "application/x-java-applet;version=1.5">
+ <param name = "scriptable" value = "false">
+ <param name = "archive" value = "Hello.jar">
+
+ <comment>
+ <embed
+ type = "application/x-java-applet;version=1.5" \
+ CODE = "HelloApplet" \
+ ARCHIVE = "Hello.jar" \
+ WIDTH = 300 \
+ HEIGHT = 175
+ scriptable = false
+ pluginspage = "http://java.sun.com/products/plugin/index.html#download">
+ <noembed>
+ alt="Your browser understands the &lt;APPLET&gt; tag but isn't running the applet, for some reason."
+ Your browser is completely ignoring the &lt;APPLET&gt; tag!
+ </noembed>
+ </embed>
+
+ </comment>
+</object>
+
+</body>
+</html>
diff --git a/java/demo/Ice/build.xml b/java/demo/Ice/build.xml
index f3f00642dbd..36f4d8d9547 100644
--- a/java/demo/Ice/build.xml
+++ b/java/demo/Ice/build.xml
@@ -12,33 +12,35 @@
<project name="demo_Ice" default="all" basedir=".">
<target name="all">
+ <ant dir="applet"/>
+ <ant dir="async"/>
<ant dir="bidir"/>
<ant dir="callback"/>
<ant dir="hello"/>
<ant dir="invoke"/>
<ant dir="latency"/>
<ant dir="minimal"/>
+ <ant dir="multicast"/>
<ant dir="nested"/>
+ <ant dir="session"/>
<ant dir="throughput"/>
<ant dir="value"/>
- <ant dir="session"/>
- <ant dir="async"/>
- <ant dir="multicast"/>
</target>
<target name="clean">
+ <ant dir="applet" target="clean"/>
+ <ant dir="async" target="clean"/>
<ant dir="bidir" target="clean"/>
<ant dir="callback" target="clean"/>
<ant dir="hello" target="clean"/>
<ant dir="invoke" target="clean"/>
<ant dir="latency" target="clean"/>
<ant dir="minimal" target="clean"/>
+ <ant dir="multicast" target="clean"/>
<ant dir="nested" target="clean"/>
+ <ant dir="session" target="clean"/>
<ant dir="throughput" target="clean"/>
<ant dir="value" target="clean"/>
- <ant dir="session" target="clean"/>
- <ant dir="async" target="clean"/>
- <ant dir="multicast" target="clean"/>
</target>
</project>
diff --git a/java/demo/RMI/README b/java/demo/RMI/README
new file mode 100644
index 00000000000..50bf06f8b2f
--- /dev/null
+++ b/java/demo/RMI/README
@@ -0,0 +1,12 @@
+Demos in this directory:
+
+- latency
+
+ A simple latency test that measures the basic call dispatch delay of RMI.
+
+- throughput
+
+ A simple RMI throughput demo that allows you to send sequences of
+ various types between client and server and to measure the maximum
+ bandwidth that can be achieved using serialized synchronous
+ requests.
diff --git a/java/demo/RMI/build.xml b/java/demo/RMI/build.xml
new file mode 100644
index 00000000000..3892e2818c7
--- /dev/null
+++ b/java/demo/RMI/build.xml
@@ -0,0 +1,24 @@
+<!--
+ **********************************************************************
+
+ Copyright (c) 2003-2008 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.
+
+ **********************************************************************
+-->
+
+<project name="demo" default="all" basedir=".">
+
+ <target name="all">
+ <ant dir="latency"/>
+ <ant dir="throughput"/>
+ </target>
+
+ <target name="clean">
+ <ant dir="latency" target="clean"/>
+ <ant dir="throughput" target="clean"/>
+ </target>
+
+</project>
diff --git a/java/demo/RMI/throughput/Client.java b/java/demo/RMI/throughput/Client.java
new file mode 100755
index 00000000000..a815d6c64dc
--- /dev/null
+++ b/java/demo/RMI/throughput/Client.java
@@ -0,0 +1,421 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2008 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.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+
+public class Client
+{
+ private static void
+ menu()
+ {
+ System.out.println(
+ "usage:\n" +
+ "\n" +
+ "toggle type of data to send:\n" +
+ "1: sequence of bytes (default)\n" +
+ "2: sequence of strings (\"hello\")\n" +
+ "3: sequence of structs with a string (\"hello\") and a double\n" +
+ "4: sequence of structs with two ints and a double\n" +
+ "\n" +
+ "select test to run:\n" +
+ "t: Send sequence\n" +
+ "r: Receive sequence\n" +
+ "e: Echo (send and receive) sequence\n" +
+ "\n" +
+ "other commands:\n" +
+ "s: shutdown server\n" +
+ "x: exit\n" +
+ "?: help\n");
+ }
+
+ public int
+ run(String args[]) throws java.lang.Exception
+ {
+ String registryHost;
+ if(args.length == 0)
+ {
+ registryHost = "127.0.0.1";
+ }
+ else if(args.length == 1)
+ {
+ registryHost = args[0];
+ }
+ else
+ {
+ System.err.println("usage: java Client [registryHost]");
+ return 1;
+ }
+
+
+ if(System.getSecurityManager() == null)
+ {
+ System.setSecurityManager(new SecurityManager());
+ }
+ Registry registry = LocateRegistry.getRegistry(registryHost);
+ Throughput throughput = (Throughput)registry.lookup("throughput");
+
+ byte[] byteSeq = new byte[Throughput.ByteSeqSize];
+
+ String[] stringSeq = new String[Throughput.StringSeqSize];
+ for(int i = 0; i < Throughput.StringSeqSize; ++i)
+ {
+ stringSeq[i] = new String("hello");
+ }
+
+ Throughput.StringDouble[] structSeq = new Throughput.StringDouble[Throughput.StringDoubleSeqSize];
+ for(int i = 0; i < Throughput.StringDoubleSeqSize; ++i)
+ {
+ structSeq[i] = new Throughput.StringDouble();
+ structSeq[i].s = new String("Hello");
+ structSeq[i].d = 3.14;
+ }
+
+ Throughput.Fixed[] fixedSeq = new Throughput.Fixed[Throughput.FixedSeqSize];
+ for(int i = 0; i < Throughput.FixedSeqSize; ++i)
+ {
+ fixedSeq[i] = new Throughput.Fixed();
+ fixedSeq[i].i = 0;
+ fixedSeq[i].j = 0;
+ fixedSeq[i].d = 0;
+ }
+
+ {
+ byte[] emptyBytes= new byte[1];
+ String[] emptyStrings = new String[1];
+ Throughput.StringDouble[] emptyStructs = new Throughput.StringDouble[1];
+ emptyStructs[0] = new Throughput.StringDouble();
+ Throughput.Fixed[] emptyFixed = new Throughput.Fixed[1];
+ emptyFixed[0] = new Throughput.Fixed();
+
+ System.out.print("warming up...");
+ System.out.flush();
+ for(int i = 0; i < 100; i++)
+ {
+ throughput.sendByteSeq(emptyBytes);
+ throughput.recvByteSeq();
+ throughput.echoByteSeq(emptyBytes);
+
+ throughput.sendStringSeq(emptyStrings);
+ throughput.recvStringSeq();
+ throughput.echoFixedSeq(emptyFixed);
+
+ throughput.sendStructSeq(emptyStructs);
+ throughput.recvStructSeq();
+ throughput.echoStructSeq(emptyStructs);
+
+ throughput.sendFixedSeq(emptyFixed);
+ throughput.recvFixedSeq();
+ throughput.echoStringSeq(emptyStrings);
+ }
+ System.out.println();
+ }
+
+ menu();
+
+ java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
+
+ char currentType = '1';
+ int seqSize = Throughput.ByteSeqSize;
+
+ String line = null;
+ do
+ {
+ try
+ {
+ System.out.print("==> ");
+ System.out.flush();
+ line = in.readLine();
+ if(line == null)
+ {
+ break;
+ }
+
+ long tmsec = System.currentTimeMillis();
+ final int repetitions = 100;
+
+ if(line.equals("1") || line.equals("2") || line.equals("3") || line.equals("4"))
+ {
+ currentType = line.charAt(0);
+
+ switch(currentType)
+ {
+ case '1':
+ {
+ System.out.println("using byte sequences");
+ seqSize = Throughput.ByteSeqSize;
+ break;
+ }
+
+ case '2':
+ {
+ System.out.println("using string sequences");
+ seqSize = Throughput.StringSeqSize;
+ break;
+ }
+
+ case '3':
+ {
+ System.out.println("using variable-length struct sequences");
+ seqSize = Throughput.StringDoubleSeqSize;
+ break;
+ }
+
+ case '4':
+ {
+ System.out.println("using fixed-length struct sequences");
+ seqSize = Throughput.FixedSeqSize;
+ break;
+ }
+ }
+ }
+ else if(line.equals("t") || line.equals("o") || line.equals("r") || line.equals("e"))
+ {
+ char c = line.charAt(0);
+
+ switch(c)
+ {
+ case 't':
+ {
+ System.out.print("sending");
+ break;
+ }
+
+ case 'r':
+ {
+ System.out.print("receiving");
+ break;
+ }
+
+ case 'e':
+ {
+ System.out.print("sending and receiving");
+ break;
+ }
+ }
+
+ System.out.print(" " + repetitions);
+ switch(currentType)
+ {
+ case '1':
+ {
+ System.out.print(" byte");
+ break;
+ }
+
+ case '2':
+ {
+ System.out.print(" string");
+ break;
+ }
+
+ case '3':
+ {
+ System.out.print(" variable-length struct");
+ break;
+ }
+
+ case '4':
+ {
+ System.out.print(" fixed-length struct");
+ break;
+ }
+ }
+
+ System.out.print(" sequences of size " + seqSize + "...");
+
+
+ for(int i = 0; i < repetitions; ++i)
+ {
+ switch(currentType)
+ {
+ case '1':
+ {
+ switch(c)
+ {
+ case 't':
+ {
+ throughput.sendByteSeq(byteSeq);
+ break;
+ }
+
+ case 'r':
+ {
+ throughput.recvByteSeq();
+ break;
+ }
+
+ case 'e':
+ {
+ throughput.echoByteSeq(byteSeq);
+ break;
+ }
+ }
+ break;
+ }
+
+ case '2':
+ {
+ switch(c)
+ {
+ case 't':
+ {
+ throughput.sendStringSeq(stringSeq);
+ break;
+ }
+
+ case 'r':
+ {
+ throughput.recvStringSeq();
+ break;
+ }
+
+ case 'e':
+ {
+ throughput.echoStringSeq(stringSeq);
+ break;
+ }
+ }
+ break;
+ }
+
+ case '3':
+ {
+ switch(c)
+ {
+ case 't':
+ {
+ throughput.sendStructSeq(structSeq);
+ break;
+ }
+
+ case 'r':
+ {
+ throughput.recvStructSeq();
+ break;
+ }
+
+ case 'e':
+ {
+ throughput.echoStructSeq(structSeq);
+ break;
+ }
+ }
+ break;
+ }
+
+ case '4':
+ {
+ switch(c)
+ {
+ case 't':
+ {
+ throughput.sendFixedSeq(fixedSeq);
+ break;
+ }
+
+ case 'r':
+ {
+ throughput.recvFixedSeq();
+ break;
+ }
+
+ case 'e':
+ {
+ throughput.echoFixedSeq(fixedSeq);
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ double dmsec = System.currentTimeMillis() - tmsec;
+ System.out.println("time for " + repetitions + " sequences: " + dmsec + "ms");
+ System.out.println("time per sequence: " + dmsec / repetitions + "ms");
+ int size = 0;
+ switch(currentType)
+ {
+ case '1':
+ {
+ size = 1;
+ break;
+ }
+
+ case '2':
+ {
+ size = stringSeq[0].length();
+ break;
+ }
+
+ case '3':
+ {
+ size = structSeq[0].s.length() + 8;
+ break;
+ }
+
+ case '4':
+ {
+ size = 16; // Two ints and a double.
+ break;
+ }
+ }
+ double mbit = repetitions * seqSize * size * 8.0 / dmsec / 1000.0;
+ if(c == 'e')
+ {
+ mbit *= 2;
+ }
+ System.out.println("throughput: " + new java.text.DecimalFormat("#.##").format(mbit) + "Mbps");
+ }
+ else if(line.equals("s"))
+ {
+ throughput.shutdown();
+ }
+ else if(line.equals("x"))
+ {
+ // Nothing to do
+ }
+ else if(line.equals("?"))
+ {
+ menu();
+ }
+ else
+ {
+ System.out.println("unknown command `" + line + "'");
+ menu();
+ }
+ }
+ catch(Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+ while(!line.equals("x"));
+
+ return 0;
+ }
+
+ public static void
+ main(String[] args)
+ {
+ Client app = new Client();
+ int status;
+ try
+ {
+ status = app.run(args);
+ }
+ catch(Exception e)
+ {
+ System.err.println(e);
+ status = 1;
+ }
+ System.exit(status);
+ }
+}
diff --git a/java/demo/RMI/throughput/README b/java/demo/RMI/throughput/README
new file mode 100755
index 00000000000..82fa2178612
--- /dev/null
+++ b/java/demo/RMI/throughput/README
@@ -0,0 +1,26 @@
+A simple RMI throughput demo that allows you to send sequences of various
+types between client and server and to measure the maximum bandwidth
+that can be achieved using serialized synchronous requests.
+
+To run the demo, start the RMI registry:
+
+$ rmiregistry
+
+In a separate window, start the server:
+
+$ java -Djava.rmi.server.hostname=127.0.0.1 -Djava.rmi.server.codebase=file:/c:/path/to/ice/java/demo/RMI/throughput/classes/ -Djava.security.policy=policy Server
+
+You need to edit the path on the command line to specify this directory.
+Under Vista, you must run the server as administrator.
+
+In a separate window, start the client:
+
+$ client.exe --Djava.security.policy=policy Client
+
+If you want to run client and server on different machines, you
+can specify the hsot on which you started the registry on
+the client's command line, for example:
+
+$ client.exe --Djava.security.policy=policy Client 192.168.4.2
+
+This directs the client to connect to the registry at the specified IP address.
diff --git a/java/demo/RMI/throughput/Server.java b/java/demo/RMI/throughput/Server.java
new file mode 100755
index 00000000000..b1a2cff19de
--- /dev/null
+++ b/java/demo/RMI/throughput/Server.java
@@ -0,0 +1,145 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2008 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.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+import java.rmi.server.UnicastRemoteObject;
+
+public class Server implements Throughput
+{
+
+ public
+ Server()
+ {
+ _byteSeq = new byte[ByteSeqSize];
+
+ _stringSeq = new String[StringSeqSize];
+ for(int i = 0; i < StringSeqSize; ++i)
+ {
+ _stringSeq[i] = new String("hello");
+ }
+
+ _structSeq = new StringDouble[StringDoubleSeqSize];
+ for(int i = 0; i < StringDoubleSeqSize; ++i)
+ {
+ _structSeq[i] = new StringDouble();
+ _structSeq[i].s = new String("hello");
+ _structSeq[i].d = 3.14;
+ }
+
+ _fixedSeq = new Fixed[FixedSeqSize];
+ for(int i = 0; i < FixedSeqSize; ++i)
+ {
+ _fixedSeq[i] = new Fixed();
+ _fixedSeq[i].i = 0;
+ _fixedSeq[i].j = 0;
+ _fixedSeq[i].d = 0;
+ }
+ }
+
+ public void
+ sendByteSeq(byte[] seq)
+ {
+ }
+
+ public byte[]
+ recvByteSeq()
+ {
+ return _byteSeq;
+ }
+
+ public byte[]
+ echoByteSeq(byte[] seq)
+ {
+ return seq;
+ }
+
+ public void
+ sendStringSeq(String[] seq)
+ {
+ }
+
+ public String[]
+ recvStringSeq()
+ {
+ return _stringSeq;
+ }
+
+ public String[]
+ echoStringSeq(String[] seq)
+ {
+ return seq;
+ }
+
+ public void
+ sendStructSeq(StringDouble[] seq)
+ {
+ }
+
+ public StringDouble[]
+ recvStructSeq()
+ {
+ return _structSeq;
+ }
+
+ public StringDouble[]
+ echoStructSeq(StringDouble[] seq)
+ {
+ return seq;
+ }
+
+ public void
+ sendFixedSeq(Fixed[] seq)
+ {
+ }
+
+ public Fixed[]
+ recvFixedSeq()
+ {
+ return _fixedSeq;
+ }
+
+ public Fixed[]
+ echoFixedSeq(Fixed[] seq)
+ {
+ return seq;
+ }
+
+ public void
+ shutdown()
+ {
+ System.exit(0);
+ }
+
+ private byte[] _byteSeq;
+ private String[] _stringSeq;
+ private StringDouble[] _structSeq;
+ private Fixed[] _fixedSeq;
+
+ public static void main(String[] args)
+ {
+ if(System.getSecurityManager() == null)
+ {
+ System.setSecurityManager(new SecurityManager());
+ }
+ try
+ {
+ Throughput servant = new Server();
+ Throughput stub = (Throughput)UnicastRemoteObject.exportObject(servant, 0);
+ Registry registry = LocateRegistry.getRegistry();
+ registry.rebind("throughput", stub);
+ System.out.println("ready");
+ }
+ catch(Exception e)
+ {
+ System.err.println(e);
+ }
+ }
+}
diff --git a/java/demo/RMI/throughput/Throughput.java b/java/demo/RMI/throughput/Throughput.java
new file mode 100755
index 00000000000..7afac1564d1
--- /dev/null
+++ b/java/demo/RMI/throughput/Throughput.java
@@ -0,0 +1,51 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2008 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.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface Throughput extends Remote
+{
+ int ByteSeqSize = 500000;
+
+ int StringSeqSize = 50000;
+
+ class StringDouble implements java.io.Serializable
+ {
+ public String s;
+ public double d;
+ };
+ int StringDoubleSeqSize = 50000;
+
+ class Fixed implements java.io.Serializable
+ {
+ int i;
+ int j;
+ double d;
+ };
+ int FixedSeqSize = 50000;
+
+ void sendByteSeq(byte[] seq) throws RemoteException;
+ byte[] recvByteSeq() throws RemoteException;
+ byte[] echoByteSeq(byte[] seq) throws RemoteException;
+
+ void sendStringSeq(String[] seq) throws RemoteException;
+ String[] recvStringSeq() throws RemoteException;
+ String[] echoStringSeq(String[] seq) throws RemoteException;
+
+ void sendStructSeq(StringDouble[] seq) throws RemoteException;
+ StringDouble[] recvStructSeq() throws RemoteException;
+ StringDouble[] echoStructSeq(StringDouble[] seq) throws RemoteException;
+
+ void sendFixedSeq(Fixed[] seq) throws RemoteException;
+ Fixed[] recvFixedSeq() throws RemoteException;
+ Fixed[] echoFixedSeq(Fixed[] seq) throws RemoteException;
+
+ void shutdown() throws RemoteException;
+}
diff --git a/java/demo/RMI/throughput/build.xml b/java/demo/RMI/throughput/build.xml
new file mode 100755
index 00000000000..cc5b90d8e88
--- /dev/null
+++ b/java/demo/RMI/throughput/build.xml
@@ -0,0 +1,35 @@
+<!--
+ **********************************************************************
+
+ Copyright (c) 2003-2008 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.
+
+ **********************************************************************
+-->
+
+<project name="rmi_throughput" default="all" basedir=".">
+
+ <!-- set global properties for this build -->
+ <property name="top.dir" value="../../.."/>
+
+ <!-- import common definitions -->
+ <import file="${top.dir}/config/common.xml"/>
+
+ <target name="compile">
+ <mkdir dir="${class.dir}"/>
+ <javac srcdir="." destdir="${class.dir}"
+ debug="${debug}">
+ <compilerarg value="${javac.lint}"/>
+ </javac>
+ </target>
+
+ <target name="all" depends="compile"/>
+
+ <target name="clean">
+ <delete dir="${generated.dir}"/>
+ <delete dir="${class.dir}"/>
+ </target>
+
+</project>
diff --git a/java/demo/RMI/throughput/policy b/java/demo/RMI/throughput/policy
new file mode 100755
index 00000000000..1b73fb10b9c
--- /dev/null
+++ b/java/demo/RMI/throughput/policy
@@ -0,0 +1,3 @@
+grant {
+ permission java.net.SocketPermission "*:*", "connect,accept,resolve,listen";
+};