summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-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
3 files changed, 165 insertions, 129 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;