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
|
#include "orbsvcs/Log_Macros.h"
#include "orbsvcs/Naming/FaultTolerant/FT_Persistent_Naming_Context.h"
#include "orbsvcs/Naming/FaultTolerant/FT_Naming_Manager.h"
#include "orbsvcs/FT_NamingManagerC.h"
#include "orbsvcs/PortableGroup/PG_Utils.h"
#include "orbsvcs/PortableGroup/PG_Property_Utils.h"
#include "orbsvcs/Naming/Persistent_Context_Index.h"
#include "ace/OS_NS_stdio.h"
#include "ace/Auto_Ptr.h"
TAO_BEGIN_VERSIONED_NAMESPACE_DECL
// Initialize the static naming manager
TAO_FT_Naming_Manager *TAO_FT_Persistent_Naming_Context::naming_manager_impl_ = 0;
TAO_FT_Persistent_Naming_Context::TAO_FT_Persistent_Naming_Context (
PortableServer::POA_ptr poa,
const char *poa_id,
TAO_Persistent_Context_Index *context_index,
HASH_MAP *map,
ACE_UINT32 *counter)
: TAO_Persistent_Naming_Context (poa,
poa_id,
context_index,
map,
counter)
{
}
TAO_FT_Persistent_Naming_Context::~TAO_FT_Persistent_Naming_Context (void)
{
// Perform appropriate cleanup based on the destruction level specified.
}
CORBA::Boolean
TAO_FT_Persistent_Naming_Context::is_object_group (CORBA::Object_ptr obj) const
{
// If there is a tagged component with tag = IOP::TAG_FT_GROUP in
// the object reference then it is an object group
PortableGroup::TagGroupTaggedComponent tagged_component;
return TAO::PG_Utils::get_tagged_component (obj, tagged_component);
}
CORBA::Object_ptr
TAO_FT_Persistent_Naming_Context::resolve (const CosNaming::Name& n)
{
// Invoke the base class resolve operation to acquire the object at the
// specified compound name.
// Any exceptions should flow back to client.
CORBA::Object_var resolved_ref = TAO_Persistent_Naming_Context::resolve(n);
// Get the locations of the object group members and we will use them to
// do the load balancing
try {
// Make sure object is an object group.
// We will return the object reference all the way back out to the client
// if not
if (!this->is_object_group (resolved_ref.in ()))
return resolved_ref._retn ();
// If there is no naming manager, we will fail and report an error.
if ( this->naming_manager_impl_ == 0)
{
ORBSVCS_ERROR ((LM_ERROR,
ACE_TEXT ("TAO_FT_Persistent_Naming_Context::resolve ")
ACE_TEXT ("- No NamingManager defined.\n")));
throw CORBA::INTERNAL ();
}
// The Naming Manager will apply the appropriate strategy to get the
// next object reference from the object group.
resolved_ref = this->naming_manager_impl_->next_member (resolved_ref.in ());
}
catch (const PortableGroup::ObjectGroupNotFound&)
{
// This is apparently not an object group, so we should return the
// object reference itself
// No action required
}
catch (const CORBA::Exception& ex)
{
ex._tao_print_exception (
ACE_TEXT ("TAO_FT_Persistent_Naming_Context::resolve ")
ACE_TEXT ("- Some unhandled error occurred\n"));
return CORBA::Object::_nil ();
}
return resolved_ref._retn ();
}
void
TAO_FT_Persistent_Naming_Context::set_naming_manager_impl (
TAO_FT_Naming_Manager *mgr_impl)
{
naming_manager_impl_ = (mgr_impl);
}
TAO_END_VERSIONED_NAMESPACE_DECL
|