summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2014-09-24 10:33:04 -0230
committerDwayne Boone <dwayne@zeroc.com>2014-09-24 10:33:04 -0230
commit577ede251a38fe84fbfa4621e732962bff43bb75 (patch)
treed78377e164f364264753cffbd4ef4e2580f0f31a
parentFixed ICE-5535, WSS hang and other minor issues (diff)
downloadice-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.h20
-rw-r--r--cpp/src/Glacier2Lib/SessionHelper.cpp220
-rw-r--r--cpp/test/Glacier2/sessionHelper/Client.cpp54
-rw-r--r--cs/src/Glacier2/SessionFactoryHelper.cs27
-rw-r--r--cs/src/Glacier2/SessionHelper.cs43
-rw-r--r--cs/test/Glacier2/sessionHelper/Client.cs7
-rw-r--r--java/src/Glacier2/SessionFactoryHelper.java32
-rw-r--r--java/src/Glacier2/SessionHelper.java60
-rw-r--r--java/test/Glacier2/sessionHelper/Client.java7
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)