blob: a1b399a92a77121a50d8b5763417a1d91dd62a8f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
// **********************************************************************
//
// Copyright (c) 2003-2013 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
#include <Ice/Ice.h>
#include <IceGrid/SessionManager.h>
using namespace std;
using namespace IceGrid;
SessionManager::SessionManager(const Ice::CommunicatorPtr& communicator) : _communicator(communicator)
{
if(communicator->getDefaultLocator())
{
Ice::ObjectPrx prx = communicator->getDefaultLocator();
//
// Derive the query objects from the locator proxy endpoints.
//
Ice::EndpointSeq endpoints = prx->ice_getEndpoints();
Ice::Identity id = prx->ice_getIdentity();
id.name = "Query";
QueryPrx query = QueryPrx::uncheckedCast(prx->ice_identity(id));
for(Ice::EndpointSeq::const_iterator p = endpoints.begin(); p != endpoints.end(); ++p)
{
Ice::EndpointSeq singleEndpoint;
singleEndpoint.push_back(*p);
_queryObjects.push_back(QueryPrx::uncheckedCast(query->ice_endpoints(singleEndpoint)));
}
id.name = "InternalRegistry-Master";
_master = InternalRegistryPrx::uncheckedCast(prx->ice_identity(id)->ice_endpoints(Ice::EndpointSeq()));
}
}
SessionManager::~SessionManager()
{
}
vector<QueryPrx>
SessionManager::findAllQueryObjects()
{
vector<QueryPrx> queryObjects = _queryObjects;
for(vector<QueryPrx>::const_iterator q = _queryObjects.begin(); q != _queryObjects.end(); ++q)
{
Ice::ConnectionPtr connection = (*q)->ice_getCachedConnection();
if(connection)
{
try
{
connection->close(false);
}
catch(const Ice::LocalException&)
{
}
}
}
map<Ice::Identity, QueryPrx> proxies;
vector<Ice::AsyncResultPtr> results;
size_t previousSize = 0;
do
{
for(vector<QueryPrx>::const_iterator q = queryObjects.begin(); q != queryObjects.end(); ++q)
{
results.push_back((*q)->begin_findAllObjectsByType(Registry::ice_staticId()));
}
map<Ice::Identity, QueryPrx> proxies;
for(vector<Ice::AsyncResultPtr>::const_iterator p = results.begin(); p != results.end(); ++p)
{
QueryPrx query = QueryPrx::uncheckedCast((*p)->getProxy());
if(isDestroyed())
{
break;
}
try
{
Ice::ObjectProxySeq prxs = query->end_findAllObjectsByType(*p);
for(Ice::ObjectProxySeq::iterator q = prxs.begin(); q != prxs.end(); ++q)
{
Ice::Identity id = (*q)->ice_getIdentity();
id.name = "Query";
proxies[(*q)->ice_getIdentity()] = QueryPrx::uncheckedCast((*q)->ice_identity(id));
}
}
catch(const Ice::Exception&)
{
// Ignore.
}
}
queryObjects.clear();
for(map<Ice::Identity, QueryPrx>::const_iterator p = proxies.begin(); p != proxies.end(); ++p)
{
queryObjects.push_back(p->second);
}
}
while(proxies.size() != previousSize);
return queryObjects;
}
|