diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2014-09-24 10:33:04 -0230 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2014-09-24 10:33:04 -0230 |
commit | 577ede251a38fe84fbfa4621e732962bff43bb75 (patch) | |
tree | d78377e164f364264753cffbd4ef4e2580f0f31a | |
parent | Fixed ICE-5535, WSS hang and other minor issues (diff) | |
download | ice-577ede251a38fe84fbfa4621e732962bff43bb75.tar.bz2 ice-577ede251a38fe84fbfa4621e732962bff43bb75.tar.xz ice-577ede251a38fe84fbfa4621e732962bff43bb75.zip |
ICE-5611 Add support for Ice/RouterFinder to Glacier2 helpers
-rw-r--r-- | cpp/include/Glacier2/SessionHelper.h | 20 | ||||
-rw-r--r-- | cpp/src/Glacier2Lib/SessionHelper.cpp | 220 | ||||
-rw-r--r-- | cpp/test/Glacier2/sessionHelper/Client.cpp | 54 | ||||
-rw-r--r-- | cs/src/Glacier2/SessionFactoryHelper.cs | 27 | ||||
-rw-r--r-- | cs/src/Glacier2/SessionHelper.cs | 43 | ||||
-rw-r--r-- | cs/test/Glacier2/sessionHelper/Client.cs | 7 | ||||
-rw-r--r-- | java/src/Glacier2/SessionFactoryHelper.java | 32 | ||||
-rw-r--r-- | java/src/Glacier2/SessionHelper.java | 60 | ||||
-rw-r--r-- | java/test/Glacier2/sessionHelper/Client.java | 7 |
9 files changed, 312 insertions, 158 deletions
diff --git a/cpp/include/Glacier2/SessionHelper.h b/cpp/include/Glacier2/SessionHelper.h index b5223478e7d..8ecbaffba10 100644 --- a/cpp/include/Glacier2/SessionHelper.h +++ b/cpp/include/Glacier2/SessionHelper.h @@ -35,9 +35,9 @@ const int GLACIER2_TCP_PORT = 4063; class GLACIER2_API SessionHelper : public IceUtil::Shared { - + public: - + virtual void destroy() = 0; virtual Ice::CommunicatorPtr communicator() const = 0; virtual std::string categoryForClient() const = 0; @@ -45,7 +45,7 @@ public: virtual Glacier2::SessionPrx session() const = 0; virtual bool isConnected() const = 0; virtual Ice::ObjectAdapterPtr objectAdapter() = 0; - + bool operator==(const Glacier2::SessionHelper&) const; bool operator!=(const Glacier2::SessionHelper&) const; }; @@ -67,26 +67,26 @@ class GLACIER2_API SessionFactoryHelper : public IceUtil::Shared { public: - + SessionFactoryHelper(const SessionCallbackPtr& callback); SessionFactoryHelper(const Ice::InitializationData&, const SessionCallbackPtr&); SessionFactoryHelper(const Ice::PropertiesPtr&, const SessionCallbackPtr&); void setRouterIdentity(const Ice::Identity&); Ice::Identity getRouterIdentity() const; - + void setRouterHost(const std::string&); std::string getRouterHost() const; - + void setSecure(bool); bool getSecure() const; - + void setTimeout(int); int getTimeout() const; - + void setPort(int port); int getPort() const; - + Ice::InitializationData getInitializationData() const; void setConnectContext(std::map<std::string, std::string> context); @@ -95,7 +95,7 @@ public: SessionHelperPtr connect(const std::string&, const std::string&); private: - + Ice::InitializationData createInitData(); void setDefaultProperties(); diff --git a/cpp/src/Glacier2Lib/SessionHelper.cpp b/cpp/src/Glacier2Lib/SessionHelper.cpp index ec7d29c932c..e5ed66dc296 100644 --- a/cpp/src/Glacier2Lib/SessionHelper.cpp +++ b/cpp/src/Glacier2Lib/SessionHelper.cpp @@ -20,12 +20,12 @@ using namespace std; namespace { -class ConnectStrategy : public IceUtil::Shared +class ConnectStrategy : public Ice::LocalObject { public: - - virtual Glacier2::SessionPrx connect(const Glacier2::RouterPrx& router) = 0; + + virtual Glacier2::SessionPrx connect(const Glacier2::RouterPrx& router) = 0; }; typedef IceUtil::Handle< ConnectStrategy> ConnectStrategyPtr; @@ -33,21 +33,21 @@ class Disconnected : public Ice::DispatcherCall { public: - + Disconnected(const Glacier2::SessionHelperPtr& session, const Glacier2::SessionCallbackPtr& callback) : _session(session), _callback(callback) { } - - + + virtual void run() { _callback->disconnected(_session); } - + private: const Glacier2::SessionHelperPtr _session; @@ -56,9 +56,9 @@ private: class SessionHelperI : public Glacier2::SessionHelper { - + public: - + SessionHelperI(const Glacier2::SessionCallbackPtr&, const Ice::InitializationData&); void destroy(); Ice::CommunicatorPtr communicator() const; @@ -67,28 +67,30 @@ public: Glacier2::SessionPrx session() const; bool isConnected() const; Ice::ObjectAdapterPtr objectAdapter(); - + friend class DestroyInternal; friend class ConnectThread; friend class DispatchCallThread; friend class Glacier2::SessionFactoryHelper; private: - + void destroy(const IceUtil::ThreadPtr&); Ice::ObjectAdapterPtr internalObjectAdapter(); void connected(const Glacier2::RouterPrx&, const Glacier2::SessionPrx&); void destroyInternal(const Ice::DispatcherCallPtr&); void connectFailed(); - + void connect(const std::map<std::string, std::string>&); void connect(const std::string&, const std::string&, const std::map<std::string, std::string>&); - + void connectImpl(const ConnectStrategyPtr&); void dispatchCallback(const Ice::DispatcherCallPtr&, const Ice::ConnectionPtr&); void dispatchCallbackAndWait(const Ice::DispatcherCallPtr&, const Ice::ConnectionPtr&); + void finderCompleted(const Ice::AsyncResultPtr& result); + IceUtil::Mutex _mutex; Ice::CommunicatorPtr _communicator; Ice::ObjectAdapterPtr _adapter; @@ -145,27 +147,27 @@ class DestroyInternal : public IceUtil::Thread { public: - + DestroyInternal(const SessionHelperIPtr& session, const Glacier2::SessionCallbackPtr& callback) : _session(session), _disconnected(new Disconnected(session, callback)) { } - + virtual void run() { _session->destroyInternal(_disconnected); } - + private: - + const SessionHelperIPtr _session; const Ice::DispatcherCallPtr _disconnected; }; } -SessionHelperI::SessionHelperI(const Glacier2::SessionCallbackPtr& callback, +SessionHelperI::SessionHelperI(const Glacier2::SessionCallbackPtr& callback, const Ice::InitializationData& initData) : _connected(false), _destroy(false), @@ -269,13 +271,13 @@ SessionHelperI::objectAdapter() bool Glacier2::SessionHelper::operator==(const Glacier2::SessionHelper& other) const -{ +{ return this == &other; } bool Glacier2::SessionHelper::operator!=(const Glacier2::SessionHelper& other) const -{ +{ return this != &other; } @@ -301,20 +303,20 @@ class ConnectStrategySecureConnection : public ConnectStrategy { public: - + ConnectStrategySecureConnection(const map<string, string>& context) : _context(context) { } - + virtual Glacier2::SessionPrx connect(const Glacier2::RouterPrx& router) { return router->createSessionFromSecureConnection(_context); } - + private: - + const map<string, string> _context; }; @@ -322,22 +324,22 @@ class ConnectStrategyUserPassword : public ConnectStrategy { public: - + ConnectStrategyUserPassword(const string& user, const string& password, const map<string, string>& context) : _user(user), _password(password), _context(context) { } - + virtual Glacier2::SessionPrx connect(const Glacier2::RouterPrx& router) { return router->createSession(_user, _password, _context); } - + private: - + const string _user; const string _password; const map<string, string> _context; @@ -373,7 +375,7 @@ SessionHelperI::destroyInternal(const Ice::DispatcherCallPtr& disconnected) communicator = _communicator; } - + if(router) { try @@ -404,7 +406,7 @@ SessionHelperI::destroyInternal(const Ice::DispatcherCallPtr& disconnected) } } } - + if(communicator) { try @@ -427,7 +429,7 @@ SessionHelperI::connectFailed() IceUtil::Mutex::Lock sync(_mutex); communicator = _communicator; } - + if(communicator) { try @@ -442,12 +444,12 @@ SessionHelperI::connectFailed() namespace { - + class ConnectFailed : public Ice::DispatcherCall { public: - + ConnectFailed(const Glacier2::SessionCallbackPtr& callback, const Glacier2::SessionHelperPtr& session, const Ice::Exception& ex) : _callback(callback), @@ -455,16 +457,16 @@ public: { _ex.reset(ex.ice_clone()); } - + virtual void run() { const Ice::Exception* ex(_ex.get()); _callback->connectFailed(_session, *ex); } - + private: - + const Glacier2::SessionCallbackPtr _callback; const Glacier2::SessionHelperPtr _session; IceUtil::UniquePtr<Ice::Exception> _ex; @@ -472,15 +474,15 @@ private: class CreatedCommunicator : public Ice::DispatcherCall { - + public: - + CreatedCommunicator(const Glacier2::SessionCallbackPtr& callback, const Glacier2::SessionHelperPtr& session) : _callback(callback), _session(session) { } - + virtual void run() { @@ -488,7 +490,7 @@ public: } private: - + const Glacier2::SessionCallbackPtr _callback; const Glacier2::SessionHelperPtr _session; }; @@ -497,7 +499,7 @@ class ConnectThread : public IceUtil::Thread { public: - + ConnectThread(const Glacier2::SessionCallbackPtr& callback, const SessionHelperIPtr& session, const ConnectStrategyPtr& factory, const Ice::CommunicatorPtr& communicator) : _callback(callback), @@ -506,33 +508,33 @@ public: _communicator(communicator) { } - + virtual void run() { + try + { + _session->dispatchCallbackAndWait(new CreatedCommunicator(_callback, _session), 0); + Glacier2::RouterPrx routerPrx = Glacier2::RouterPrx::uncheckedCast(_communicator->getDefaultRouter()); + Glacier2::SessionPrx session = _factory->connect(routerPrx); + _session->connected(routerPrx, session); + } + catch(const Ice::Exception& ex) + { try { - _session->dispatchCallbackAndWait(new CreatedCommunicator(_callback, _session), 0); - Glacier2::RouterPrx routerPrx = Glacier2::RouterPrx::uncheckedCast(_communicator->getDefaultRouter()); - Glacier2::SessionPrx session = _factory->connect(routerPrx); - _session->connected(routerPrx, session); + _session->connectFailed(); } - catch(const Ice::Exception& ex) + catch(...) { - try - { - _session->connectFailed(); - } - catch(...) - { - } - - _session->dispatchCallback(new ConnectFailed(_callback, _session, ex), 0); } + + _session->dispatchCallback(new ConnectFailed(_callback, _session, ex), 0); + } } - + private: - + const Glacier2::SessionCallbackPtr _callback; const SessionHelperIPtr _session; const ConnectStrategyPtr _factory; @@ -544,7 +546,7 @@ class DispatchCallThread : public IceUtil::Thread { public: - + DispatchCallThread(const SessionHelperIPtr& session, const Ice::DispatcherCallPtr& call, const Ice::ConnectionPtr& conn) : _session(session), @@ -552,14 +554,14 @@ public: _conn(conn) { } - + virtual void run() { _session->dispatchCallback(_call, _conn); } - + private: - + const SessionHelperIPtr _session; const Ice::DispatcherCallPtr _call; const Ice::ConnectionPtr _conn; @@ -584,24 +586,53 @@ SessionHelperI::connectImpl(const ConnectStrategyPtr& factory) return; } + if(_communicator->getDefaultRouter()) + { + IceUtil::ThreadPtr connectThread = new ConnectThread(_callback, this, factory, _communicator); + connectThread->start().detach(); + } + else + { + Ice::RouterFinderPrx finder = Ice::RouterFinderPrx::uncheckedCast( + _communicator->stringToProxy(_communicator->getProperties()->getProperty("SessionHelper.RouterFinder"))); + finder->begin_getRouter(Ice::newCallback(this, &SessionHelperI::finderCompleted), factory); + } +} + +void +SessionHelperI::finderCompleted(const Ice::AsyncResultPtr& result) +{ + try + { + Ice::RouterPrx router = Ice::RouterFinderPrx::uncheckedCast(result->getProxy())->end_getRouter(result); + _communicator->setDefaultRouter(router); + } + catch(const Ice::Exception& ex) + { + connectFailed(); + dispatchCallback(new ConnectFailed(_callback, this, ex), 0); + return; + } + + ConnectStrategyPtr factory = ConnectStrategyPtr::dynamicCast(result->getCookie()); IceUtil::ThreadPtr connectThread = new ConnectThread(_callback, this, factory, _communicator); connectThread->start().detach(); } namespace { - + class Connected : public Ice::DispatcherCall { public: - + Connected(const Glacier2::SessionCallbackPtr& callback, const Glacier2::SessionHelperPtr& session) : _callback(callback), _session(session) { } - + virtual void run() { @@ -616,7 +647,7 @@ public: } private: - + const Glacier2::SessionCallbackPtr _callback; const Glacier2::SessionHelperPtr _session; }; @@ -634,12 +665,12 @@ public: { } - virtual void + virtual void closed(const Ice::ConnectionPtr&) { _sessionHelper->destroy(); } - + private: SessionHelperIPtr _sessionHelper; @@ -724,32 +755,32 @@ SessionHelperI::dispatchCallback(const Ice::DispatcherCallPtr& call, const Ice:: { call->run(); } - + } namespace { - + class DispatcherCallWait : public Ice::DispatcherCall { public: - + DispatcherCallWait(IceUtilInternal::CountDownLatch& cdl, const Ice::DispatcherCallPtr& call) : _cdl(cdl), _call(call) { } - + virtual void run() { _call->run(); _cdl.countDown(); } - + private: - + IceUtilInternal::CountDownLatch& _cdl; const Ice::DispatcherCallPtr _call; }; @@ -779,14 +810,12 @@ Glacier2::SessionFactoryHelper::SessionFactoryHelper(const SessionCallbackPtr& c _timeout(10000), _callback(callback) { - _identity.name = "router"; - _identity.category = "Glacier2"; _initData.properties = Ice::createProperties(); setDefaultProperties(); } Glacier2::SessionFactoryHelper::SessionFactoryHelper(const Ice::InitializationData& initData, - const SessionCallbackPtr& callback) : + const SessionCallbackPtr& callback) : _routerHost("localhost"), _secure(true), _port(0), @@ -794,8 +823,6 @@ Glacier2::SessionFactoryHelper::SessionFactoryHelper(const Ice::InitializationDa _initData(initData), _callback(callback) { - _identity.name = "router"; - _identity.category = "Glacier2"; if(!initData.properties) { _initData.properties = Ice::createProperties(); @@ -803,7 +830,8 @@ Glacier2::SessionFactoryHelper::SessionFactoryHelper(const Ice::InitializationDa setDefaultProperties(); } -Glacier2::SessionFactoryHelper::SessionFactoryHelper(const Ice::PropertiesPtr& properties, const SessionCallbackPtr& callback) : +Glacier2::SessionFactoryHelper::SessionFactoryHelper(const Ice::PropertiesPtr& properties, + const SessionCallbackPtr& callback) : _routerHost("localhost"), _secure(true), _port(0), @@ -815,8 +843,6 @@ Glacier2::SessionFactoryHelper::SessionFactoryHelper(const Ice::PropertiesPtr& p throw Ice::InitializationException( __FILE__, __LINE__, "Attempt to create a SessionFactoryHelper with a null Properties argument"); } - _identity.name = "router"; - _identity.category = "Glacier2"; _initData.properties = properties; setDefaultProperties(); } @@ -936,18 +962,26 @@ Glacier2::SessionFactoryHelper::createInitData() { ostringstream os; os << "\""; - + // // TODO replace with identityToString, we cannot use the Communicator::identityToString // current implementation because we need to do that before the communicator has been // initialized. // - if(!_identity.category.empty()) + bool useFinder = _identity.category.empty() && _identity.name.empty(); + if(useFinder) { - os << _identity.category << "/"; + os << "Ice/RouterFinder"; } - os << _identity.name; - + else + { + if(!_identity.category.empty()) + { + os << _identity.category << "/"; + } + os << _identity.name; + } + os << "\""; os << ":"; if(_secure) @@ -958,7 +992,7 @@ Glacier2::SessionFactoryHelper::createInitData() { os << "tcp -p "; } - + if(_port != 0) { os << _port; @@ -982,7 +1016,15 @@ Glacier2::SessionFactoryHelper::createInitData() os << " -t "; os << _timeout; } - initData.properties->setProperty("Ice.Default.Router", os.str()); + + if(useFinder) + { + initData.properties->setProperty("SessionHelper.RouterFinder", os.str()); + } + else + { + initData.properties->setProperty("Ice.Default.Router", os.str()); + } #ifndef ICE_OS_WINRT // // If using a secure connection setup the IceSSL plug-in, if IceSSL diff --git a/cpp/test/Glacier2/sessionHelper/Client.cpp b/cpp/test/Glacier2/sessionHelper/Client.cpp index 6f9296f9cef..67b1295e49f 100644 --- a/cpp/test/Glacier2/sessionHelper/Client.cpp +++ b/cpp/test/Glacier2/sessionHelper/Client.cpp @@ -24,11 +24,11 @@ using namespace Test; namespace { - + class Notify { public: - + virtual void notify() = 0; }; @@ -38,13 +38,13 @@ class Dispatcher : public Ice::Dispatcher, public IceUtil::Thread { public: - + Dispatcher(): _destroyed(false) { } - - virtual void + + virtual void dispatch(const Ice::DispatcherCallPtr& call, const Ice::ConnectionPtr&) { @@ -55,7 +55,7 @@ public: } _queue.push_back(call); } - + virtual void destroy() { @@ -63,7 +63,7 @@ public: _destroyed = true; _monitor.notify(); } - + virtual void run() { @@ -77,9 +77,9 @@ public: item->run(); } } - + private: - + Ice::DispatcherCallPtr nextItem() { @@ -108,7 +108,7 @@ class SuccessSessionCallback : public Glacier2::SessionCallback { public: - + virtual void connected(const Glacier2::SessionHelperPtr&) { @@ -140,7 +140,7 @@ class AfterShutdownSessionCallback : public Glacier2::SessionCallback { public: - + virtual void connected(const Glacier2::SessionHelperPtr&) { @@ -182,8 +182,8 @@ class FailSessionCallback : public Glacier2::SessionCallback { public: - - virtual void + + virtual void connected(const Glacier2::SessionHelperPtr&) { test(false); @@ -217,7 +217,7 @@ public: createdCommunicator(const Glacier2::SessionHelperPtr& session) { test(session->communicator()); - } + } }; class SessionHelperClient : public Ice::Application, public Notify @@ -229,11 +229,11 @@ public: instance = this; _initData.properties = Ice::createProperties(argc, argv, communicator()->getProperties()); _initData.properties->setProperty("Ice.Default.Router", "Glacier2/router:default -p 12347"); - + DispatcherPtr dispatcher = new Dispatcher(); dispatcher->start(); _initData.dispatcher = dispatcher; - + _factory = new Glacier2::SessionFactoryHelper(_initData, new FailSessionCallback()); // @@ -245,19 +245,15 @@ public: cout << "testing SessionHelper connect with wrong userid/password... " << flush; - _factory->setRouterHost("localhost"); - _factory->setPort(12347); - - _factory->setRouterIdentity(communicator()->stringToIdentity("Glacier2/router")); - _factory->setSecure(false); _session = _factory->connect("userid", "xxx"); - + // // Wait for connectFailed callback // _monitor.wait(); } - + + _initData.properties->setProperty("Ice.Default.Router", ""); _factory = new Glacier2::SessionFactoryHelper(_initData, new SuccessSessionCallback()); { @@ -265,10 +261,9 @@ public: cout << "testing SessionHelper connect... " << flush; _factory->setRouterHost("localhost"); _factory->setPort(12347); - _factory->setRouterIdentity(communicator()->stringToIdentity("Glacier2/router")); _factory->setSecure(false); _session = _factory->connect("userid", "abc123"); - + // // Wait for connect callback // @@ -350,7 +345,7 @@ public: // cout << "ok" << endl; // } // catch(const std::exception& ex) -// { +// { // cout << ex.what() << endl; // } // catch(const std::string& msg) @@ -407,13 +402,12 @@ public: // IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(100)); - + { IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor); cout << "testing SessionHelper connect after router shutdown... " << flush; _factory->setRouterHost("localhost"); _factory->setPort(12347); - _factory->setRouterIdentity(communicator()->stringToIdentity("Glacier2/router")); _factory->setSecure(false); _session = _factory->connect("userid", "abc123"); @@ -434,7 +428,7 @@ public: _session->destroy(); cout << "ok" << endl; } - + if(dispatcher) { dispatcher->destroy(); @@ -452,7 +446,7 @@ public: } private: - + Glacier2::SessionHelperPtr _session; Glacier2::SessionFactoryHelperPtr _factory; Ice::InitializationData _initData; diff --git a/cs/src/Glacier2/SessionFactoryHelper.cs b/cs/src/Glacier2/SessionFactoryHelper.cs index 2ad9e4e9c5b..ff5afacfc44 100644 --- a/cs/src/Glacier2/SessionFactoryHelper.cs +++ b/cs/src/Glacier2/SessionFactoryHelper.cs @@ -236,9 +236,9 @@ public class SessionFactoryHelper /// <summary> /// Connects to the Glacier2 router using the associated SSL credentials. - /// + /// /// Once the connection is established, SesssionCallback.connected is called on - /// the callback object; upon failure, SessionCallback.connectFailed is called + /// the callback object; upon failure, SessionCallback.connectFailed is called /// with the exception. /// </summary> /// <returns>The connected session.</returns> @@ -258,7 +258,7 @@ public class SessionFactoryHelper /// /// Once the connection is established, SessionCallback.connected is called on /// the callback object; upon failure, SessionCallback.connectFailed is called - /// with the exception. + /// with the exception. /// </summary> /// <param name="username">The user name.</param> /// <param name="password">The password.</param> @@ -285,9 +285,17 @@ public class SessionFactoryHelper if(initData.properties.getProperty("Ice.Default.Router").Length == 0) { + bool useFinder = _identity == null; StringBuilder sb = new StringBuilder(); sb.Append("\""); - sb.Append(Ice.Util.identityToString(_identity)); + if(useFinder) + { + sb.Append("Ice/RouterFinder"); + } + else + { + sb.Append(Ice.Util.identityToString(_identity)); + } sb.Append("\""); sb.Append(":"); if(_secure) @@ -321,7 +329,14 @@ public class SessionFactoryHelper sb.Append(" -t "); sb.Append(_timeout); } - initData.properties.setProperty("Ice.Default.Router", sb.ToString()); + if(useFinder) + { + initData.properties.setProperty("SessionHelper.RouterFinder", sb.ToString()); + } + else + { + initData.properties.setProperty("Ice.Default.Router", sb.ToString()); + } // // If using a secure connection setup the IceSSL plug-in, if IceSSL // plug-in has already been setup we don't want to override the @@ -344,7 +359,7 @@ public class SessionFactoryHelper private SessionCallback _callback; private string _routerHost = "localhost"; private Ice.InitializationData _initData; - private Ice.Identity _identity = new Ice.Identity("router", "Glacier2"); + private Ice.Identity _identity = null; private bool _secure = true; private int _port = 0; private int _timeout = 10000; diff --git a/cs/src/Glacier2/SessionHelper.cs b/cs/src/Glacier2/SessionHelper.cs index 24609bca1c8..226389f75d2 100644 --- a/cs/src/Glacier2/SessionHelper.cs +++ b/cs/src/Glacier2/SessionHelper.cs @@ -34,7 +34,7 @@ public class SessionHelper try { _router.begin_refreshSession().whenCompleted( - (Ice.Exception ex) => + (Ice.Exception ex) => { _session.destroy(); }); @@ -60,7 +60,7 @@ public class SessionHelper public void heartbeat(Ice.Connection con) { - + } public void closed(Ice.Connection con) @@ -431,12 +431,49 @@ public class SessionHelper dispatchCallback(() => { _callback.connectFailed(this, ex); - }, + }, null); })).Start(); return; } + if(_communicator.getDefaultRouter() != null) + { + completeConnect(factory); + } + else + { + Ice.RouterFinderPrx finder = Ice.RouterFinderPrxHelper.uncheckedCast( + _communicator.stringToProxy(_communicator.getProperties().getProperty("SessionHelper.RouterFinder"))); + finder.begin_getRouter().whenCompleted( + (Ice.RouterPrx router) => + { + _communicator.setDefaultRouter(router); + completeConnect(factory); + }, + (Ice.Exception ex) => + { + new Thread(new ThreadStart(() => + { + try + { + _communicator.destroy(); + } + catch(Exception) + { + } + dispatchCallback(() => + { + _callback.connectFailed(this, ex); + }, null); + })).Start(); + }); + } + } + + private void + completeConnect(ConnectStrategy factory) + { new Thread(new ThreadStart(() => { try diff --git a/cs/test/Glacier2/sessionHelper/Client.cs b/cs/test/Glacier2/sessionHelper/Client.cs index 70d1c395400..867cc87151c 100644 --- a/cs/test/Glacier2/sessionHelper/Client.cs +++ b/cs/test/Glacier2/sessionHelper/Client.cs @@ -179,10 +179,6 @@ public class Client Console.Out.Write("testing SessionHelper connect with wrong userid/password... "); Console.Out.Flush(); - _factory.setRouterHost("127.0.0.1"); - _factory.setPort(12347); - _factory.setRouterIdentity(Ice.Util.stringToIdentity("Glacier2/router")); - _factory.setSecure(false); _session = _factory.connect("userid", "xxx"); while(true) { @@ -202,6 +198,7 @@ public class Client } } + _initData.properties.setProperty("Ice.Default.Router", ""); _factory = new Glacier2.SessionFactoryHelper(_initData, new SessionCalback2()); lock(this) { @@ -209,7 +206,6 @@ public class Client Console.Out.Flush(); _factory.setRouterHost("127.0.0.1"); _factory.setPort(12347); - _factory.setRouterIdentity(Ice.Util.stringToIdentity("Glacier2/router")); _factory.setSecure(false); _session = _factory.connect("userid", "abc123"); while(true) @@ -373,7 +369,6 @@ public class Client _factory.setRouterHost("127.0.0.1"); _factory.setPort(12347); - _factory.setRouterIdentity(Ice.Util.stringToIdentity("Glacier2/router")); _factory.setSecure(false); _session = _factory.connect("userid", "abc123"); while(true) diff --git a/java/src/Glacier2/SessionFactoryHelper.java b/java/src/Glacier2/SessionFactoryHelper.java index 120b55a59bf..474acf3dca7 100644 --- a/java/src/Glacier2/SessionFactoryHelper.java +++ b/java/src/Glacier2/SessionFactoryHelper.java @@ -11,7 +11,7 @@ package Glacier2; /** * A helper class for using Glacier2 with GUI applications. - * + * * Applications should create a session factory for each Glacier2 router to which the application will * connect. To connect with the Glacier2 router, call {@link SessionFactory#connect}. The callback object is * notified of the various life cycle events. Once the session is torn down for whatever reason, the application @@ -21,7 +21,7 @@ public class SessionFactoryHelper { /** * Creates a SessionFactory object. - * + * * @param callback The callback object for notifications. * @throws {@link Ice.InitializationException} */ @@ -34,7 +34,7 @@ public class SessionFactoryHelper /** * Creates a SessionFactory object. - * + * * @param initData The initialization data to use when creating the communicator. * @param callback The callback object for notifications. * @throws {@link Ice.InitializationException} @@ -246,8 +246,8 @@ public class SessionFactoryHelper * Connect the Glacier2 session using user name and password credentials. * * Once the connection is established, {@link SessionCallback#connected} is called on the callback object; - * upon failure, {@link SessionCallback#connectFailed) is called with the exception. - * + * upon failure, {@link SessionCallback#connectFailed) is called with the exception. + * * @param username The user name. * @param password The password. * @return The connected session. @@ -271,9 +271,18 @@ public class SessionFactoryHelper if(initData.properties.getProperty("Ice.Default.Router").length() == 0) { + boolean useFinder = _identity == null; + StringBuffer sb = new StringBuffer(); sb.append("\""); - sb.append(Ice.Util.identityToString(_identity)); + if(useFinder) + { + sb.append("Ice/RouterFinder"); + } + else + { + sb.append(Ice.Util.identityToString(_identity)); + } sb.append("\""); sb.append(":"); @@ -310,7 +319,14 @@ public class SessionFactoryHelper sb.append(_timeout); } - initData.properties.setProperty("Ice.Default.Router", sb.toString()); + if(useFinder) + { + initData.properties.setProperty("SessionHelper.RouterFinder", sb.toString()); + } + else + { + initData.properties.setProperty("Ice.Default.Router", sb.toString()); + } // // If using a secure connection setup the IceSSL plug-in, if IceSSL // plug-in has already been setup we don't want to override the @@ -327,7 +343,7 @@ public class SessionFactoryHelper private SessionCallback _callback; private String _routerHost = "localhost"; private Ice.InitializationData _initData; - private Ice.Identity _identity = new Ice.Identity("router", "Glacier2"); + private Ice.Identity _identity = null; private boolean _secure = true; private int _port = 0; private int _timeout = 10000; diff --git a/java/src/Glacier2/SessionHelper.java b/java/src/Glacier2/SessionHelper.java index 2ea89487044..49709b47a8d 100644 --- a/java/src/Glacier2/SessionHelper.java +++ b/java/src/Glacier2/SessionHelper.java @@ -501,6 +501,66 @@ public class SessionHelper return; } + if(_communicator.getDefaultRouter() != null) + { + completeConnect(factory); + } + else + { + Ice.RouterFinderPrx finder = Ice.RouterFinderPrxHelper.uncheckedCast( + _communicator.stringToProxy(_communicator.getProperties().getProperty("SessionHelper.RouterFinder"))); + finder.begin_getRouter(new Ice.Callback() + { + @Override + public void completed(Ice.AsyncResult result) + { + try + { + Ice.RouterPrx router = + Ice.RouterFinderPrxHelper.uncheckedCast( + result.getProxy()).end_getRouter(result); + _communicator.setDefaultRouter(router); + } + catch(final Ice.Exception ex) + { + Ice.Communicator communicator = null; + synchronized(SessionHelper.this) + { + communicator = _communicator; + _communicator = null; + } + + if(communicator != null) + { + try + { + communicator.destroy(); + } + catch(Throwable ex1) + { + } + } + + dispatchCallback(new Runnable() + { + @Override + public void run() + { + _callback.connectFailed(SessionHelper.this, ex); + } + }, null); + return; + } + + completeConnect(factory); + } + }); + } + } + + private void + completeConnect(final ConnectStrategy factory) + { new Thread(new Runnable() { @Override diff --git a/java/test/Glacier2/sessionHelper/Client.java b/java/test/Glacier2/sessionHelper/Client.java index faaf05536a3..f61f84d0051 100644 --- a/java/test/Glacier2/sessionHelper/Client.java +++ b/java/test/Glacier2/sessionHelper/Client.java @@ -108,10 +108,6 @@ public class Client extends test.Util.Application out.print("testing SessionHelper connect with wrong userid/password... "); out.flush(); - _factory.setRouterHost("127.0.0.1"); - _factory.setPort(12347); - _factory.setRouterIdentity(Ice.Util.stringToIdentity("Glacier2/router")); - _factory.setSecure(false); _session = _factory.connect("userid", "xxx"); while(true) { @@ -126,6 +122,7 @@ public class Client extends test.Util.Application } } + _initData.properties.setProperty("Ice.Default.Router", ""); _factory = new Glacier2.SessionFactoryHelper(_initData, new Glacier2.SessionCallback() { @Override @@ -172,7 +169,6 @@ public class Client extends test.Util.Application out.flush(); _factory.setRouterHost("127.0.0.1"); _factory.setPort(12347); - _factory.setRouterIdentity(Ice.Util.stringToIdentity("Glacier2/router")); _factory.setSecure(false); _session = _factory.connect("userid", "abc123"); while(true) @@ -387,7 +383,6 @@ public class Client extends test.Util.Application _factory.setRouterHost("127.0.0.1"); _factory.setPort(12347); - _factory.setRouterIdentity(Ice.Util.stringToIdentity("Glacier2/router")); _factory.setSecure(false); _session = _factory.connect("userid", "abc123"); while(true) |