summaryrefslogtreecommitdiff
path: root/java/demo/Ice/session/SessionFactoryI.java
diff options
context:
space:
mode:
authorMatthew Newhook <matthew@zeroc.com>2005-04-18 02:53:08 +0000
committerMatthew Newhook <matthew@zeroc.com>2005-04-18 02:53:08 +0000
commitac740ec5a2fec620a937875a7bbbae74d47ea014 (patch)
tree2380338dd5c81b65f6da3b001735370af13034ce /java/demo/Ice/session/SessionFactoryI.java
parentadding RouterF.ice and SessionF.ice (diff)
downloadice-ac740ec5a2fec620a937875a7bbbae74d47ea014.tar.bz2
ice-ac740ec5a2fec620a937875a7bbbae74d47ea014.tar.xz
ice-ac740ec5a2fec620a937875a7bbbae74d47ea014.zip
added session demo.
Diffstat (limited to 'java/demo/Ice/session/SessionFactoryI.java')
-rw-r--r--java/demo/Ice/session/SessionFactoryI.java136
1 files changed, 136 insertions, 0 deletions
diff --git a/java/demo/Ice/session/SessionFactoryI.java b/java/demo/Ice/session/SessionFactoryI.java
new file mode 100644
index 00000000000..5b0a76eb47c
--- /dev/null
+++ b/java/demo/Ice/session/SessionFactoryI.java
@@ -0,0 +1,136 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 Demo.*;
+
+class SessionFactoryI extends _SessionFactoryDisp
+{
+ private static class ReapThread extends Thread
+ {
+ ReapThread(SessionFactoryI factory, long timeout)
+ {
+ _timeout = timeout;
+ _factory = factory;
+ }
+
+ public synchronized void
+ run()
+ {
+ while(!_terminated)
+ {
+ try
+ {
+ wait(_timeout);
+ }
+ catch(InterruptedException e)
+ {
+ }
+ if(!_terminated)
+ {
+ assert _factory != null;
+ _factory.reap();
+ }
+ }
+ }
+
+ synchronized void
+ terminate()
+ {
+ _terminated = true;
+ notify();
+ }
+
+ private boolean _terminated = false;
+ final private long _timeout;
+ final private SessionFactoryI _factory;
+ };
+
+ public
+ SessionFactoryI(Ice.ObjectAdapter adapter)
+ {
+ _adapter = adapter;
+ _reapThread = new ReapThread(this, _timeout);
+ _reapThread = new ReapThread(this, _timeout);
+ _reapThread.start();
+ }
+
+ public synchronized SessionPrx
+ create(Ice.Current c)
+ {
+ SessionI session = new SessionI(_adapter, _timeout);
+ SessionPrx proxy = SessionPrxHelper.uncheckedCast(_adapter.addWithUUID(session));
+ _sessions.add(new SessionId(session, proxy.ice_getIdentity()));
+ return proxy;
+ }
+
+ public void
+ shutdown(Ice.Current c)
+ {
+ System.out.println("Shutting down...");
+ c.adapter.getCommunicator().shutdown();
+ }
+
+ synchronized public void
+ destroy()
+ {
+ _reapThread.terminate();
+ try
+ {
+ _reapThread.join();
+ }
+ catch(InterruptedException e)
+ {
+ }
+
+ java.util.Iterator p = _sessions.iterator();
+ while(p.hasNext())
+ {
+ SessionId s = (SessionId)p.next();
+ s.session.destroyCallback();
+
+ // When the session factory is destroyed the OA is
+ // deactivated and all servants have been removed so
+ // calling remove on the OA is not necessary.
+ }
+ _sessions.clear();
+ }
+
+ synchronized private void
+ reap()
+ {
+ java.util.Iterator p = _sessions.iterator();
+ while(p.hasNext())
+ {
+ SessionId s = (SessionId)p.next();
+ if(s.session.destroyed())
+ {
+ s.session.destroyCallback();
+ _adapter.remove(s.id);
+ p.remove();
+ }
+ }
+ }
+
+
+ final private long _timeout = 10 * 1000; // 10 seconds.
+ final private Ice.ObjectAdapter _adapter;
+ private ReapThread _reapThread;
+
+ private static class SessionId
+ {
+ SessionId(SessionI s, Ice.Identity i)
+ {
+ session = s;
+ id = i;
+ }
+ final SessionI session;
+ final Ice.Identity id;
+ };
+ private java.util.List _sessions = new java.util.LinkedList();
+}