diff options
Diffstat (limited to 'java/demo/Ice/session/SessionFactoryI.java')
-rw-r--r-- | java/demo/Ice/session/SessionFactoryI.java | 136 |
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(); +} |