diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/IceGrid/AdminSessionI.cpp | 94 | ||||
-rw-r--r-- | cpp/src/IceGrid/AdminSessionI.h | 41 | ||||
-rw-r--r-- | cpp/src/IceGrid/DescriptorHelper.cpp | 76 | ||||
-rw-r--r-- | cpp/src/IceGrid/DescriptorHelper.h | 1 | ||||
-rw-r--r-- | cpp/src/IceGrid/RegistryI.cpp | 27 | ||||
-rw-r--r-- | cpp/src/IceGrid/RegistryI.h | 12 | ||||
-rw-r--r-- | cpp/src/IceGrid/ServerCache.cpp | 43 | ||||
-rw-r--r-- | cpp/src/IceGrid/ServerCache.h | 3 | ||||
-rw-r--r-- | cpp/src/IceGrid/SessionI.cpp | 93 | ||||
-rw-r--r-- | cpp/src/IceGrid/SessionI.h | 34 |
10 files changed, 217 insertions, 207 deletions
diff --git a/cpp/src/IceGrid/AdminSessionI.cpp b/cpp/src/IceGrid/AdminSessionI.cpp index bdbbb9c08e0..564e6d7f2a0 100644 --- a/cpp/src/IceGrid/AdminSessionI.cpp +++ b/cpp/src/IceGrid/AdminSessionI.cpp @@ -191,11 +191,13 @@ AdminSessionI::destroy(const Ice::Current& current) } } -AdminSessionManagerI::AdminSessionManagerI(const DatabasePtr& database, - int sessionTimeout, - const RegistryObserverTopicPtr& regTopic, - const NodeObserverTopicPtr& nodeTopic, - const RegistryIPtr& registry) : +AdminSessionFactory::AdminSessionFactory(const Ice::ObjectAdapterPtr& adapter, + const DatabasePtr& database, + int sessionTimeout, + const RegistryObserverTopicPtr& regTopic, + const NodeObserverTopicPtr& nodeTopic, + const RegistryIPtr& registry) : + _adapter(adapter), _database(database), _timeout(sessionTimeout), _registryObserverTopic(regTopic), @@ -205,44 +207,70 @@ AdminSessionManagerI::AdminSessionManagerI(const DatabasePtr& database, } Glacier2::SessionPrx -AdminSessionManagerI::create(const string& userId, const Glacier2::SessionControlPrx&, const Ice::Current& current) +AdminSessionFactory::createGlacier2Session(const string& sessionId, const Glacier2::SessionControlPrx& ctl) { - // - // TODO: XXX: Modify filtering? - // + Ice::IdentitySeq ids; // Identities of the object the session is allowed to access. - AdminSessionIPtr session = create(userId); Ice::Identity id; + id.category = _database->getInstanceName(); + + // The per-session admin object. id.name = IceUtil::generateUUID(); - id.category = current.id.category; - AdminPrx admin = AdminPrx::uncheckedCast(current.adapter->add(new AdminI(_database, _registry, session), id)); + AdminSessionIPtr session = createSessionServant(sessionId); + AdminPrx admin = AdminPrx::uncheckedCast(_adapter->add(new AdminI(_database, _registry, session), id)); session->setAdmin(admin); + ids.push_back(id); + + // The session admin object. id.name = IceUtil::generateUUID(); - return Glacier2::SessionPrx::uncheckedCast(current.adapter->add(session, id)); + Glacier2::SessionPrx s = Glacier2::SessionPrx::uncheckedCast(_adapter->add(session, id)); + ids.push_back(id); + + if(ctl) + { + try + { + ctl->identities()->add(ids); + } + catch(const Ice::LocalException&) + { + s->destroy(); + return 0; + } + } + + return s; } AdminSessionIPtr -AdminSessionManagerI::create(const string& id) +AdminSessionFactory::createSessionServant(const string& id) { return new AdminSessionI(id, _database, _timeout, _registryObserverTopic, _nodeObserverTopic); } -AdminSSLSessionManagerI::AdminSSLSessionManagerI(const DatabasePtr& database, - int sessionTimeout, - const RegistryObserverTopicPtr& regTopic, - const NodeObserverTopicPtr& nodeTopic, - const RegistryIPtr& registry) : - _database(database), - _timeout(sessionTimeout), - _registryObserverTopic(regTopic), - _nodeObserverTopic(nodeTopic), - _registry(registry) +const TraceLevelsPtr& +AdminSessionFactory::getTraceLevels() const +{ + return _database->getTraceLevels(); +} + +AdminSessionManagerI::AdminSessionManagerI(const AdminSessionFactoryPtr& factory) : _factory(factory) +{ +} + +Glacier2::SessionPrx +AdminSessionManagerI::create(const string& userId, const Glacier2::SessionControlPrx& ctl, const Ice::Current& current) +{ + return _factory->createGlacier2Session(userId, ctl); +} + +AdminSSLSessionManagerI::AdminSSLSessionManagerI(const AdminSessionFactoryPtr& factory) : _factory(factory) { } Glacier2::SessionPrx AdminSSLSessionManagerI::create(const Glacier2::SSLInfo& info, - const Glacier2::SessionControlPrx&, + const Glacier2::SessionControlPrx& ctl, const Ice::Current& current) { string userDN; @@ -256,23 +284,11 @@ AdminSSLSessionManagerI::create(const Glacier2::SSLInfo& info, catch(const Ice::Exception& ex) { // This shouldn't happen, the SSLInfo is supposed to be encoded by Glacier2. - Ice::Error out(_database->getTraceLevels()->logger); + Ice::Error out(_factory->getTraceLevels()->logger); out << "SSL session manager couldn't decode SSL certificates:\n" << ex; return 0; } } - // - // TODO: XXX: Modify filtering? - // - - AdminSessionIPtr session; - session = new AdminSessionI(userDN, _database, _timeout, _registryObserverTopic, _nodeObserverTopic); - Ice::Identity id; - id.name = IceUtil::generateUUID(); - id.category = current.id.category; - AdminPrx admin = AdminPrx::uncheckedCast(current.adapter->add(new AdminI(_database, _registry, session), id)); - session->setAdmin(admin); - id.name = IceUtil::generateUUID(); - return Glacier2::SessionPrx::uncheckedCast(current.adapter->add(session, id)); + return _factory->createGlacier2Session(userDN, ctl); } diff --git a/cpp/src/IceGrid/AdminSessionI.h b/cpp/src/IceGrid/AdminSessionI.h index 0187d5caee3..37b8766b00e 100644 --- a/cpp/src/IceGrid/AdminSessionI.h +++ b/cpp/src/IceGrid/AdminSessionI.h @@ -53,44 +53,55 @@ private: }; typedef IceUtil::Handle<AdminSessionI> AdminSessionIPtr; -class AdminSessionManagerI : virtual public Glacier2::SessionManager +class AdminSessionFactory : virtual public IceUtil::Shared { public: - AdminSessionManagerI(const DatabasePtr&, int, const RegistryObserverTopicPtr& , const NodeObserverTopicPtr&, - const RegistryIPtr&); + AdminSessionFactory(const Ice::ObjectAdapterPtr&, const DatabasePtr&, int, const RegistryObserverTopicPtr&, + const NodeObserverTopicPtr&, const RegistryIPtr&); - virtual Glacier2::SessionPrx create(const std::string&, const Glacier2::SessionControlPrx&, const Ice::Current&); - AdminSessionIPtr create(const std::string&); + Glacier2::SessionPrx createGlacier2Session(const std::string&, const Glacier2::SessionControlPrx&); + AdminSessionIPtr createSessionServant(const std::string&); + + const TraceLevelsPtr& getTraceLevels() const; private: - + + const Ice::ObjectAdapterPtr _adapter; const DatabasePtr _database; const int _timeout; + const WaitQueuePtr _waitQueue; const RegistryObserverTopicPtr _registryObserverTopic; const NodeObserverTopicPtr _nodeObserverTopic; const RegistryIPtr _registry; }; -typedef IceUtil::Handle<AdminSessionManagerI> AdminSessionManagerIPtr; +typedef IceUtil::Handle<AdminSessionFactory> AdminSessionFactoryPtr; + +class AdminSessionManagerI : virtual public Glacier2::SessionManager +{ +public: + + AdminSessionManagerI(const AdminSessionFactoryPtr&); + + virtual Glacier2::SessionPrx create(const std::string&, const Glacier2::SessionControlPrx&, const Ice::Current&); + +private: + + const AdminSessionFactoryPtr _factory; +}; class AdminSSLSessionManagerI : virtual public Glacier2::SSLSessionManager { public: - AdminSSLSessionManagerI(const DatabasePtr&, int, const RegistryObserverTopicPtr& , const NodeObserverTopicPtr&, - const RegistryIPtr&); + AdminSSLSessionManagerI(const AdminSessionFactoryPtr&); virtual Glacier2::SessionPrx create(const Glacier2::SSLInfo&, const Glacier2::SessionControlPrx&, const Ice::Current&); private: - const DatabasePtr _database; - const int _timeout; - const RegistryObserverTopicPtr _registryObserverTopic; - const NodeObserverTopicPtr _nodeObserverTopic; - const RegistryIPtr _registry; + const AdminSessionFactoryPtr _factory; }; -typedef IceUtil::Handle<AdminSSLSessionManagerI> AdminSSLSessionManagerIPtr; }; diff --git a/cpp/src/IceGrid/DescriptorHelper.cpp b/cpp/src/IceGrid/DescriptorHelper.cpp index a290c29f2b9..c10ab5cde1b 100644 --- a/cpp/src/IceGrid/DescriptorHelper.cpp +++ b/cpp/src/IceGrid/DescriptorHelper.cpp @@ -1615,15 +1615,7 @@ ServerInstanceHelper::init(const ServerDescriptorPtr& definition, const Resolver // // Set the server definition. // - IceBoxDescriptorPtr iceBox = IceBoxDescriptorPtr::dynamicCast(def); - if(iceBox) - { - _serverDefinition = new IceBoxHelper(svrResolve.getCommunicator(), iceBox); - } - else - { - _serverDefinition = new ServerHelper(resolve.getCommunicator(), def); - } + _serverDefinition = createHelper(svrResolve.getCommunicator(), def); if(!instantiate) { @@ -1654,14 +1646,7 @@ ServerInstanceHelper::init(const ServerDescriptorPtr& definition, const Resolver // Instantiate the server definition. // ServerDescriptorPtr inst = _serverDefinition->instantiate(svrResolve, _instance.propertySet.properties); - if(iceBox) - { - _serverInstance = new IceBoxHelper(svrResolve.getCommunicator(), IceBoxDescriptorPtr::dynamicCast(inst)); - } - else - { - _serverInstance = new ServerHelper(svrResolve.getCommunicator(), inst); - } + _serverInstance = createHelper(svrResolve.getCommunicator(), inst); } bool @@ -1778,15 +1763,6 @@ NodeHelper::NodeHelper(const string& name, const NodeDescriptor& descriptor, con } _instance.servers.push_back(helper.getServerInstance()); } - - // - // Validate each property set references. - // - PropertySetDescriptorDict::const_iterator ps; - for(ps = _def.propertySets.begin(); ps != _def.propertySets.end(); ++ps) - { - resolve.getProperties(ps->second.references); - } } bool @@ -1901,25 +1877,24 @@ NodeHelper::update(const NodeUpdateDescriptor& update, const Resolver& appResolv // * then we add the servers from the node which were not updated or removed. // - ServerInstanceHelperDict serverInstances; - ServerInstanceHelperDict servers; ServerInstanceHelperDict::const_iterator r; - ServerInstanceDescriptorSeq::const_iterator q; - set<string> removedServers(update.removeServers.begin(), update.removeServers.end()); + set<string> added; + set<string> removed(update.removeServers.begin(), update.removeServers.end()); + ServerInstanceDescriptorSeq::const_iterator q; for(q = update.serverInstances.begin(); q != update.serverInstances.end(); ++q) { ServerInstanceHelper helper(*q, resolve, false); - if(!serverInstances.insert(make_pair(helper.getId(), helper)).second) + if(!added.insert(helper.getId()).second) { resolve.exception("duplicate server `" + helper.getId() + "' in node `" + _name + "'"); } + def.serverInstances.push_back(helper.getDefinition()); } for(r = _serverInstances.begin(); r != _serverInstances.end(); ++r) { - if(removedServers.find(r->first) != removedServers.end() || - serverInstances.find(r->first) != serverInstances.end()) + if(removed.find(r->first) != removed.end() || added.find(r->first) != added.end()) { continue; } @@ -1935,21 +1910,22 @@ NodeHelper::update(const NodeUpdateDescriptor& update, const Resolver& appResolv resolve.exception("invalid update in node `" + _name + "':\n" + "server instance id `" + r->first + "' changed to `" + helper.getId() + "'"); } - serverInstances.insert(make_pair(helper.getId(), helper)); + def.serverInstances.push_back(helper.getDefinition()); } + added.clear(); for(ServerDescriptorSeq::const_iterator s = update.servers.begin(); s != update.servers.end(); ++s) { ServerInstanceHelper helper(*s, resolve, false); - if(!servers.insert(make_pair(helper.getId(), helper)).second) + if(!added.insert(helper.getId()).second) { resolve.exception("duplicate server `" + helper.getId() + "' in node `" + _name + "'"); } + def.servers.push_back(helper.getServerDefinition()); } for(r = _servers.begin(); r != _servers.end(); ++r) { - if(removedServers.find(r->first) != removedServers.end() || - serverInstances.find(r->first) != serverInstances.end()) + if(removed.find(r->first) != removed.end() || added.find(r->first) != added.end()) { continue; } @@ -1965,18 +1941,8 @@ NodeHelper::update(const NodeUpdateDescriptor& update, const Resolver& appResolv resolve.exception("invalid update in node `" + _name + "':\nserver instance id `" + r->first + "' changed to `" + helper.getId() + "'"); } - servers.insert(make_pair(helper.getId(), helper)); - } - - for(r = serverInstances.begin(); r != serverInstances.end(); ++r) - { - def.serverInstances.push_back(r->second.getDefinition()); + def.servers.push_back(helper.getServerDefinition()); } - for(r = servers.begin(); r != servers.end(); ++r) - { - def.servers.push_back(r->second.getServerDefinition()); - } - return def; } @@ -2863,3 +2829,17 @@ IceGrid::descriptorEqual(const Ice::CommunicatorPtr& com, return false; } } + +ServerHelperPtr +IceGrid::createHelper(const Ice::CommunicatorPtr& communicator, const ServerDescriptorPtr& desc) +{ + IceBoxDescriptorPtr iceBox = IceBoxDescriptorPtr::dynamicCast(desc); + if(iceBox) + { + return new IceBoxHelper(communicator, iceBox); + } + else + { + return new ServerHelper(communicator, desc); + } +} diff --git a/cpp/src/IceGrid/DescriptorHelper.h b/cpp/src/IceGrid/DescriptorHelper.h index 00c98979bfd..b68c996c4d9 100644 --- a/cpp/src/IceGrid/DescriptorHelper.h +++ b/cpp/src/IceGrid/DescriptorHelper.h @@ -314,6 +314,7 @@ private: }; bool descriptorEqual(const Ice::CommunicatorPtr&, const ServerDescriptorPtr&, const ServerDescriptorPtr&); +ServerHelperPtr createHelper(const Ice::CommunicatorPtr&, const ServerDescriptorPtr&); } diff --git a/cpp/src/IceGrid/RegistryI.cpp b/cpp/src/IceGrid/RegistryI.cpp index ac01df8ef3c..c6ac9494c01 100644 --- a/cpp/src/IceGrid/RegistryI.cpp +++ b/cpp/src/IceGrid/RegistryI.cpp @@ -365,20 +365,21 @@ RegistryI::start(bool nowarn) ObjectPtr admin = new AdminI(_database, this, 0); adminAdapter->add(admin, adminId); - Identity clientSessionMgrId = _communicator->stringToIdentity(instanceName + "/SessionManager"); - _clientSessionManager = new ClientSessionManagerI(_database, sessionTimeout, _waitQueue); - adminAdapter->add(_clientSessionManager, clientSessionMgrId); + _clientSessionFactory = new ClientSessionFactory(adminAdapter, _database, sessionTimeout, _waitQueue); - Identity adminSessionMgrId = _communicator->stringToIdentity(instanceName + "/AdminSessionManager"); - _adminSessionManager = new AdminSessionManagerI(_database, sessionTimeout, regTopic, nodeTopic, this); - adminAdapter->add(_adminSessionManager, adminSessionMgrId); + Identity clientSessionMgrId = _communicator->stringToIdentity(instanceName + "/SessionManager"); + adminAdapter->add(new ClientSessionManagerI(_clientSessionFactory), clientSessionMgrId); Identity sslClientSessionMgrId = _communicator->stringToIdentity(instanceName + "/SSLSessionManager"); - adminAdapter->add(new ClientSSLSessionManagerI(_database, sessionTimeout, _waitQueue), sslClientSessionMgrId); + adminAdapter->add(new ClientSSLSessionManagerI(_clientSessionFactory), sslClientSessionMgrId); + + _adminSessionFactory = new AdminSessionFactory(adminAdapter, _database, sessionTimeout, regTopic, nodeTopic, this); + + Identity adminSessionMgrId = _communicator->stringToIdentity(instanceName + "/AdminSessionManager"); + adminAdapter->add(new AdminSessionManagerI(_adminSessionFactory), adminSessionMgrId); Identity sslAdmSessionMgrId = _communicator->stringToIdentity(instanceName + "/AdminSSLSessionManager"); - AdminSSLSessionManagerIPtr ai = new AdminSSLSessionManagerI(_database, sessionTimeout, regTopic, nodeTopic, this); - adminAdapter->add(ai, sslAdmSessionMgrId); + adminAdapter->add(new AdminSSLSessionManagerI(_adminSessionFactory), sslAdmSessionMgrId); // // Setup null permissions verifier object, client and admin permissions verifiers. @@ -509,7 +510,7 @@ RegistryI::createSession(const string& user, const string& password, const Curre throw exc; } - SessionIPtr session = _clientSessionManager->create(user, 0); + SessionIPtr session = _clientSessionFactory->createSessionServant(user, 0); session->setServantLocator(_sessionServantLocator); SessionPrx proxy = SessionPrx::uncheckedCast(_sessionServantLocator->add(session, current.con)); _clientReaper->add(new SessionReapable(current.adapter, session, proxy->ice_getIdentity())); @@ -542,7 +543,7 @@ RegistryI::createAdminSession(const string& user, const string& password, const throw exc; } - AdminSessionIPtr session = _adminSessionManager->create(user); + AdminSessionIPtr session = _adminSessionFactory->createSessionServant(user); ObjectPrx admin = _sessionServantLocator->add(new AdminI(_database, this, session), current.con); session->setAdmin(AdminPrx::uncheckedCast(admin)); session->setServantLocator(_sessionServantLocator); @@ -586,7 +587,7 @@ RegistryI::createSessionFromSecureConnection(const Current& current) throw exc; } - SessionIPtr session = _clientSessionManager->create(userDN, 0); + SessionIPtr session = _clientSessionFactory->createSessionServant(userDN, 0); session->setServantLocator(_sessionServantLocator); SessionPrx proxy = SessionPrx::uncheckedCast(_sessionServantLocator->add(session, current.con)); _clientReaper->add(new SessionReapable(current.adapter, session, proxy->ice_getIdentity())); @@ -631,7 +632,7 @@ RegistryI::createAdminSessionFromSecureConnection(const Current& current) // // We let the connection access the administrative interface. // - AdminSessionIPtr session = _adminSessionManager->create(userDN); + AdminSessionIPtr session = _adminSessionFactory->createSessionServant(userDN); ObjectPrx admin = _sessionServantLocator->add(new AdminI(_database, this, session), current.con); session->setAdmin(AdminPrx::uncheckedCast(admin)); session->setServantLocator(_sessionServantLocator); diff --git a/cpp/src/IceGrid/RegistryI.h b/cpp/src/IceGrid/RegistryI.h index 0a82bcdf39c..b11b4060af7 100644 --- a/cpp/src/IceGrid/RegistryI.h +++ b/cpp/src/IceGrid/RegistryI.h @@ -33,11 +33,11 @@ typedef IceUtil::Handle<WaitQueue> WaitQueuePtr; class SessionServantLocatorI; typedef IceUtil::Handle<SessionServantLocatorI> SessionServantLocatorIPtr; -class ClientSessionManagerI; -typedef IceUtil::Handle<ClientSessionManagerI> ClientSessionManagerIPtr; +class ClientSessionFactory; +typedef IceUtil::Handle<ClientSessionFactory> ClientSessionFactoryPtr; -class AdminSessionManagerI; -typedef IceUtil::Handle<AdminSessionManagerI> AdminSessionManagerIPtr; +class AdminSessionFactory; +typedef IceUtil::Handle<AdminSessionFactory> AdminSessionFactoryPtr; class RegistryI : public Registry { @@ -75,11 +75,11 @@ private: WaitQueuePtr _waitQueue; SessionServantLocatorIPtr _sessionServantLocator; - ClientSessionManagerIPtr _clientSessionManager; + ClientSessionFactoryPtr _clientSessionFactory; Glacier2::PermissionsVerifierPrx _clientVerifier; Glacier2::SSLPermissionsVerifierPrx _sslClientVerifier; - AdminSessionManagerIPtr _adminSessionManager; + AdminSessionFactoryPtr _adminSessionFactory; Glacier2::PermissionsVerifierPrx _adminVerifier; Glacier2::SSLPermissionsVerifierPrx _sslAdminVerifier; diff --git a/cpp/src/IceGrid/ServerCache.cpp b/cpp/src/IceGrid/ServerCache.cpp index 9a4aa545d95..6e469c52e38 100644 --- a/cpp/src/IceGrid/ServerCache.cpp +++ b/cpp/src/IceGrid/ServerCache.cpp @@ -15,6 +15,7 @@ #include <IceGrid/AdapterCache.h> #include <IceGrid/ObjectCache.h> #include <IceGrid/SessionI.h> +#include <IceGrid/DescriptorHelper.h> using namespace std; using namespace IceGrid; @@ -147,12 +148,6 @@ ServerCache::clear(const string& id) CacheByString<ServerEntry>::removeImpl(id); } -NodeCache& -ServerCache::getNodeCache() const -{ - return _nodeCache; -} - void ServerCache::addCommunicator(const CommunicatorDescriptorPtr& comm, const ServerEntryPtr& server) { @@ -785,14 +780,16 @@ ServerEntry::allocated(const SessionIPtr& session) out << "server `" << _id << "' allocated by `" << session->getId() << "' (" << _count << ")"; } + assert(_loaded.get() || _load.get()); + ServerDescriptorPtr desc = _loaded.get() ? _loaded->descriptor : _load->descriptor; + // // If the server has the session activation mode, we re-load the // server on the node as its deployment might have changed (it's // possible to use ${session.*} variable with server with the // session activation mode. // - if(_loaded.get() && _loaded->descriptor->activation == "session" || - _load.get() && _load->descriptor->activation == "session") + if(desc->activation == "session") { _updated = true; if(!_load.get()) @@ -807,14 +804,14 @@ ServerEntry::allocated(const SessionIPtr& session) Glacier2::SessionControlPrx ctl = session->getSessionControl(); if(ctl) { + ServerHelperPtr helper = createHelper(_cache.getCommunicator(), desc); + multiset<string> adapterIds; + multiset<Ice::Identity> identities; + helper->getIds(adapterIds, identities); try { - Ice::StringSeq seq(_adapters.size()); - for(AdapterPrxDict::const_iterator p = _adapters.begin(); p != _adapters.end(); ++p) - { - seq.push_back(p->first); - } - ctl->adapterIds()->add(seq); + ctl->adapterIds()->add(Ice::StringSeq(adapterIds.begin(), adapterIds.end())); + ctl->identities()->add(Ice::IdentitySeq(identities.begin(), identities.end())); } catch(const Ice::ObjectNotExistException&) { @@ -825,6 +822,9 @@ ServerEntry::allocated(const SessionIPtr& session) void ServerEntry::released(const SessionIPtr& session) { + assert(_loaded.get() || _load.get()); + ServerDescriptorPtr desc = _loaded.get() ? _loaded->descriptor : _load->descriptor; + // // If the server has the session activation mode, we re-load the // server on the node as its deployment might have changed (it's @@ -832,8 +832,7 @@ ServerEntry::released(const SessionIPtr& session) // session activation mode. Synchronizing the server will also // shutdown the server on the node. // - if(_loaded.get() && _loaded->descriptor->activation == "session" || - _load.get() && _load->descriptor->activation == "session") + if(desc->activation == "session") { _updated = true; if(!_load.get()) @@ -848,14 +847,14 @@ ServerEntry::released(const SessionIPtr& session) Glacier2::SessionControlPrx ctl = session->getSessionControl(); if(ctl) { + ServerHelperPtr helper = createHelper(_cache.getCommunicator(), desc); + multiset<string> adapterIds; + multiset<Ice::Identity> identities; + helper->getIds(adapterIds, identities); try { - Ice::StringSeq seq(_adapters.size()); - for(AdapterPrxDict::const_iterator p = _adapters.begin(); p != _adapters.end(); ++p) - { - seq.push_back(p->first); - } - ctl->adapterIds()->remove(seq); + ctl->adapterIds()->remove(Ice::StringSeq(adapterIds.begin(), adapterIds.end())); + ctl->identities()->remove(Ice::IdentitySeq(identities.begin(), identities.end())); } catch(const Ice::ObjectNotExistException&) { diff --git a/cpp/src/IceGrid/ServerCache.h b/cpp/src/IceGrid/ServerCache.h index e4ed456dd21..47837584468 100644 --- a/cpp/src/IceGrid/ServerCache.h +++ b/cpp/src/IceGrid/ServerCache.h @@ -95,7 +95,8 @@ public: void clear(const std::string&); - NodeCache& getNodeCache() const; + NodeCache& getNodeCache() const { return _nodeCache; } + Ice::CommunicatorPtr getCommunicator() const { return _communicator; } private: diff --git a/cpp/src/IceGrid/SessionI.cpp b/cpp/src/IceGrid/SessionI.cpp index 068ec868515..c339d7b9499 100644 --- a/cpp/src/IceGrid/SessionI.cpp +++ b/cpp/src/IceGrid/SessionI.cpp @@ -289,7 +289,11 @@ SessionI::removeAllocation(const AllocatablePtr& allocatable) _allocations.erase(allocatable); } -ClientSessionManagerI::ClientSessionManagerI(const DatabasePtr& database, int timeout, const WaitQueuePtr& waitQueue) : +ClientSessionFactory::ClientSessionFactory(const Ice::ObjectAdapterPtr& adapter, + const DatabasePtr& database, + int timeout, + const WaitQueuePtr& waitQueue) : + _adapter(adapter), _database(database), _timeout(timeout), _waitQueue(waitQueue) @@ -297,28 +301,27 @@ ClientSessionManagerI::ClientSessionManagerI(const DatabasePtr& database, int ti } Glacier2::SessionPrx -ClientSessionManagerI::create(const string& user, const Glacier2::SessionControlPrx& ctl, const Ice::Current& current) +ClientSessionFactory::createGlacier2Session(const string& sessionId, const Glacier2::SessionControlPrx& ctl) { + Ice::IdentitySeq ids; // Identities of the object the session is allowed to access. + Ice::Identity id; + id.category = _database->getInstanceName(); + + // The session object id.name = IceUtil::generateUUID(); - id.category = current.id.category; - Glacier2::SessionPrx s = Glacier2::SessionPrx::uncheckedCast(current.adapter->add(create(user, ctl), id)); + ids.push_back(id); + SessionIPtr session = createSessionServant(sessionId, ctl); + Glacier2::SessionPrx s = Glacier2::SessionPrx::uncheckedCast(_adapter->add(session, id)); + + // The IceGrid::Query object + id.name = "Query"; + ids.push_back(id); + if(ctl) { try { - // - // Restrict the objects the session is allowed to access to the session object itself, - // the query and registry objects. - // - Ice::IdentitySeq ids; - Ice::Identity id; - id.category = "IceGrid"; - id.name = "Query"; - ids.push_back(id); - id.name = "Registry"; - ids.push_back(id); - ids.push_back(s->ice_getIdentity()); ctl->identities()->add(ids); } catch(const Ice::LocalException&) @@ -327,19 +330,33 @@ ClientSessionManagerI::create(const string& user, const Glacier2::SessionControl return 0; } } + return s; } SessionIPtr -ClientSessionManagerI::create(const string& userId, const Glacier2::SessionControlPrx& ctl) +ClientSessionFactory::createSessionServant(const string& userId, const Glacier2::SessionControlPrx& ctl) { return new SessionI(userId, _database, _timeout, _waitQueue, ctl); } -ClientSSLSessionManagerI::ClientSSLSessionManagerI(const DatabasePtr& db, int timeout, const WaitQueuePtr& waitQueue) : - _database(db), - _timeout(timeout), - _waitQueue(waitQueue) +const TraceLevelsPtr& +ClientSessionFactory::getTraceLevels() const +{ + return _database->getTraceLevels(); +} + +ClientSessionManagerI::ClientSessionManagerI(const ClientSessionFactoryPtr& factory) : _factory(factory) +{ +} + +Glacier2::SessionPrx +ClientSessionManagerI::create(const string& user, const Glacier2::SessionControlPrx& ctl, const Ice::Current& current) +{ + return _factory->createGlacier2Session(user, ctl); +} + +ClientSSLSessionManagerI::ClientSSLSessionManagerI(const ClientSessionFactoryPtr& factory) : _factory(factory) { } @@ -358,40 +375,12 @@ ClientSSLSessionManagerI::create(const Glacier2::SSLInfo& info, const Glacier2:: catch(const Ice::Exception& ex) { // This shouldn't happen, the SSLInfo is supposed to be encoded by Glacier2. - Ice::Error out(_database->getTraceLevels()->logger); + Ice::Error out(_factory->getTraceLevels()->logger); out << "SSL session manager couldn't decode SSL certificates:\n" << ex; return 0; } } - SessionIPtr session = new SessionI(userDN, _database, _timeout, _waitQueue, ctl); - Ice::Identity id; - id.name = IceUtil::generateUUID(); - id.category = current.id.category; - Glacier2::SessionPrx s = Glacier2::SessionPrx::uncheckedCast(current.adapter->add(session, id)); - if(ctl) - { - try - { - // - // Restrict the objects the session is allowed to access to the session object itself, - // the query and registry objects. - // - Ice::IdentitySeq ids; - Ice::Identity id; - id.category = "IceGrid"; - id.name = "Query"; - ids.push_back(id); - id.name = "Registry"; - ids.push_back(id); - ids.push_back(s->ice_getIdentity()); - ctl->identities()->add(ids); - } - catch(const Ice::LocalException&) - { - s->destroy(); - return 0; - } - } - return s; + return _factory->createGlacier2Session(userDN, ctl); } + diff --git a/cpp/src/IceGrid/SessionI.h b/cpp/src/IceGrid/SessionI.h index 21f0bad52e6..9285ab02b1b 100644 --- a/cpp/src/IceGrid/SessionI.h +++ b/cpp/src/IceGrid/SessionI.h @@ -105,40 +105,52 @@ protected: std::set<AllocatablePtr> _allocations; }; -class ClientSessionManagerI : virtual public Glacier2::SessionManager +class ClientSessionFactory : virtual public IceUtil::Shared { public: - ClientSessionManagerI(const DatabasePtr&, int, const WaitQueuePtr&); - - virtual Glacier2::SessionPrx create(const std::string&, const Glacier2::SessionControlPrx&, const Ice::Current&); + ClientSessionFactory(const Ice::ObjectAdapterPtr&, const DatabasePtr&, int, const WaitQueuePtr&); - SessionIPtr create(const std::string&, const Glacier2::SessionControlPrx&); + Glacier2::SessionPrx createGlacier2Session(const std::string&, const Glacier2::SessionControlPrx&); + SessionIPtr createSessionServant(const std::string&, const Glacier2::SessionControlPrx&); + + const TraceLevelsPtr& getTraceLevels() const; private: + const Ice::ObjectAdapterPtr _adapter; const DatabasePtr _database; const int _timeout; const WaitQueuePtr _waitQueue; }; -typedef IceUtil::Handle<ClientSessionManagerI> ClientSessionManagerIPtr; +typedef IceUtil::Handle<ClientSessionFactory> ClientSessionFactoryPtr; + +class ClientSessionManagerI : virtual public Glacier2::SessionManager +{ +public: + + ClientSessionManagerI(const ClientSessionFactoryPtr&); + + virtual Glacier2::SessionPrx create(const std::string&, const Glacier2::SessionControlPrx&, const Ice::Current&); + +private: + + const ClientSessionFactoryPtr _factory; +}; class ClientSSLSessionManagerI : virtual public Glacier2::SSLSessionManager { public: - ClientSSLSessionManagerI(const DatabasePtr&, int, const WaitQueuePtr&); + ClientSSLSessionManagerI(const ClientSessionFactoryPtr&); virtual Glacier2::SessionPrx create(const Glacier2::SSLInfo&, const Glacier2::SessionControlPrx&, const Ice::Current&); private: - const DatabasePtr _database; - const int _timeout; - const WaitQueuePtr _waitQueue; + const ClientSessionFactoryPtr _factory; }; -typedef IceUtil::Handle<ClientSSLSessionManagerI> ClientSSLSessionManagerIPtr; }; |