00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "orbsvcs/Naming/Hash_Naming_Context.h"
00017 #include "orbsvcs/Naming/nsconf.h"
00018 #include "ace/Auto_Ptr.h"
00019
00020 ACE_RCSID (Naming,
00021 Hash_Naming_Context,
00022 "Hash_Naming_Context.cpp,v 1.31 2006/03/14 06:14:33 jtc Exp")
00023
00024
00025 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00026
00027
00028
00029 TAO_Bindings_Map::~TAO_Bindings_Map (void)
00030 {
00031 }
00032
00033
00034
00035 TAO_Hash_Naming_Context::TAO_Hash_Naming_Context (PortableServer::POA_ptr poa,
00036 const char *poa_id)
00037 : context_ (0),
00038 interface_ (0),
00039 destroyed_ (0),
00040 poa_ (PortableServer::POA::_duplicate (poa)),
00041 poa_id_ (poa_id)
00042 {
00043 }
00044
00045 void
00046 TAO_Hash_Naming_Context::interface (TAO_Naming_Context *i)
00047 {
00048 this->interface_ = i;
00049 }
00050
00051 TAO_Hash_Naming_Context::~TAO_Hash_Naming_Context (void)
00052 {
00053 delete context_;
00054 }
00055
00056 PortableServer::POA_ptr
00057 TAO_Hash_Naming_Context::_default_POA (void)
00058 {
00059 return PortableServer::POA::_duplicate (this->poa_.in ());
00060 }
00061
00062 CosNaming::NamingContext_ptr
00063 TAO_Hash_Naming_Context::get_context (const CosNaming::Name &name
00064 ACE_ENV_ARG_DECL)
00065 {
00066
00067 CosNaming::NamingContext_var result =
00068 CosNaming::NamingContext::_nil ();
00069
00070
00071
00072
00073 CORBA::ULong name_len = name.length ();
00074 CosNaming::Name comp_name (name.maximum (),
00075 name_len - 1,
00076 const_cast<CosNaming::NameComponent*> (name.get_buffer ()));
00077 ACE_TRY
00078 {
00079
00080 CORBA::Object_var context = resolve (comp_name
00081 ACE_ENV_ARG_PARAMETER);
00082 ACE_TRY_CHECK;
00083
00084
00085 result = CosNaming::NamingContext::_narrow (context.in ()
00086 ACE_ENV_ARG_PARAMETER);
00087 ACE_TRY_CHECK;
00088 }
00089 ACE_CATCH (CosNaming::NamingContext::NotFound, ex)
00090 {
00091
00092
00093 CORBA::ULong rest_len = ex.rest_of_name.length () + 1;
00094 ex.rest_of_name.length (rest_len);
00095 ex.rest_of_name[rest_len - 1] = name[name_len - 1];
00096
00097 ACE_RE_THROW;
00098 }
00099 ACE_ENDTRY;
00100 ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
00101
00102 if (CORBA::is_nil (result.in ()))
00103 {
00104 CosNaming::Name rest;
00105 rest.length (2);
00106 rest[0] = name[name_len - 2];
00107 rest[1] = name[name_len - 1];
00108 ACE_THROW_RETURN (CosNaming::NamingContext::NotFound
00109 (CosNaming::NamingContext::not_context,
00110 rest),
00111 CosNaming::NamingContext::_nil ());
00112 }
00113
00114
00115 return result._retn ();
00116 }
00117
00118 void
00119 TAO_Hash_Naming_Context::bind (const CosNaming::Name& n,
00120 CORBA::Object_ptr obj
00121 ACE_ENV_ARG_DECL)
00122 {
00123 ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX,
00124 ace_mon, this->lock_,
00125 CORBA::INTERNAL ());
00126 ACE_CHECK;
00127
00128
00129
00130 if (this->destroyed_)
00131 ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
00132
00133
00134 CORBA::ULong name_len = n.length ();
00135
00136
00137 if (name_len == 0)
00138 ACE_THROW (CosNaming::NamingContext::InvalidName());
00139
00140
00141
00142
00143 if (name_len > 1)
00144 {
00145 CosNaming::NamingContext_var context =
00146 this->get_context (n ACE_ENV_ARG_PARAMETER);
00147 ACE_CHECK;
00148
00149 CosNaming::Name simple_name;
00150 simple_name.length (1);
00151 simple_name[0] = n[name_len - 1];
00152 ACE_TRY
00153 {
00154 context->bind (simple_name, obj ACE_ENV_ARG_PARAMETER);
00155 ACE_TRY_CHECK;
00156 }
00157 ACE_CATCH (CORBA::TIMEOUT, timeoutEx)
00158 {
00159 ACE_TRY_THROW (CosNaming::NamingContext::CannotProceed
00160 (context.in (), simple_name));
00161 }
00162 ACE_ENDTRY;
00163 }
00164
00165 else
00166 {
00167
00168 int result = this->context_->bind (n[0].id,
00169 n[0].kind,
00170 obj,
00171 CosNaming::nobject);
00172 if (result == 1)
00173 ACE_THROW (CosNaming::NamingContext::AlreadyBound());
00174
00175
00176 else if (result == -1)
00177 ACE_THROW (CORBA::INTERNAL ());
00178 }
00179 }
00180
00181 void
00182 TAO_Hash_Naming_Context::rebind (const CosNaming::Name& n,
00183 CORBA::Object_ptr obj
00184 ACE_ENV_ARG_DECL)
00185 {
00186 ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX, ace_mon,
00187 this->lock_,
00188 CORBA::INTERNAL ());
00189 ACE_CHECK;
00190
00191
00192
00193 if (this->destroyed_)
00194 ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
00195
00196
00197 CORBA::ULong name_len = n.length ();
00198
00199
00200 if (name_len == 0)
00201 ACE_THROW (CosNaming::NamingContext::InvalidName());
00202
00203
00204
00205
00206 if (name_len > 1)
00207 {
00208 CosNaming::NamingContext_var context =
00209 get_context (n ACE_ENV_ARG_PARAMETER);
00210 ACE_CHECK;
00211
00212 CosNaming::Name simple_name;
00213 simple_name.length (1);
00214 simple_name[0] = n[name_len - 1];
00215 ACE_TRY
00216 {
00217 context->rebind (simple_name, obj ACE_ENV_ARG_PARAMETER);
00218 ACE_TRY_CHECK;
00219 }
00220 ACE_CATCH (CORBA::TIMEOUT, timeoutEx)
00221 {
00222 ACE_TRY_THROW (CosNaming::NamingContext::CannotProceed
00223 (context.in (), simple_name));
00224 }
00225 ACE_ENDTRY;
00226 }
00227 else
00228
00229
00230 {
00231 int result = this->context_->rebind (n[0].id,
00232 n[0].kind,
00233 obj,
00234 CosNaming::nobject);
00235
00236 if (result == -1)
00237 ACE_THROW (CORBA::INTERNAL ());
00238
00239 else if (result == -2)
00240 ACE_THROW (CosNaming::NamingContext::NotFound
00241 (CosNaming::NamingContext::not_object,
00242 n));
00243 }
00244 }
00245
00246 void
00247 TAO_Hash_Naming_Context::bind_context (const CosNaming::Name &n,
00248 CosNaming::NamingContext_ptr nc
00249 ACE_ENV_ARG_DECL)
00250 {
00251 ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX, ace_mon,
00252 this->lock_,
00253 CORBA::INTERNAL ());
00254 ACE_CHECK;
00255
00256
00257
00258 if (this->destroyed_)
00259 ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
00260
00261
00262 if (CORBA::is_nil (nc))
00263 ACE_THROW (CORBA::BAD_PARAM ());
00264
00265
00266 CORBA::ULong name_len = n.length ();
00267
00268
00269 if (name_len == 0)
00270 ACE_THROW (CosNaming::NamingContext::InvalidName());
00271
00272
00273
00274
00275 if (name_len > 1)
00276 {
00277 CosNaming::NamingContext_var context =
00278 get_context (n ACE_ENV_ARG_PARAMETER);
00279 ACE_CHECK;
00280
00281 CosNaming::Name simple_name;
00282 simple_name.length (1);
00283 simple_name[0] = n[name_len - 1];
00284 ACE_TRY
00285 {
00286 context->bind_context (simple_name, nc ACE_ENV_ARG_PARAMETER);
00287 ACE_TRY_CHECK;
00288 }
00289 ACE_CATCH (CORBA::TIMEOUT, timeoutEx)
00290 {
00291 ACE_TRY_THROW (CosNaming::NamingContext::CannotProceed
00292 (context.in (), simple_name));
00293 }
00294 ACE_ENDTRY;
00295 }
00296
00297 else
00298 {
00299
00300 int result = this->context_->bind (n[0].id,
00301 n[0].kind,
00302 nc,
00303 CosNaming::ncontext);
00304 if (result == 1)
00305 ACE_THROW (CosNaming::NamingContext::AlreadyBound());
00306
00307
00308 else if (result == -1)
00309 ACE_THROW (CORBA::INTERNAL ());
00310 }
00311 }
00312
00313 void
00314 TAO_Hash_Naming_Context::rebind_context (const CosNaming::Name &n,
00315 CosNaming::NamingContext_ptr nc
00316 ACE_ENV_ARG_DECL)
00317 {
00318 ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX, ace_mon,
00319 this->lock_,
00320 CORBA::INTERNAL ());
00321 ACE_CHECK;
00322
00323
00324
00325 if (this->destroyed_)
00326 ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
00327
00328
00329 CORBA::ULong name_len = n.length ();
00330
00331
00332 if (name_len == 0)
00333 ACE_THROW (CosNaming::NamingContext::InvalidName());
00334
00335
00336
00337
00338 if (name_len > 1)
00339 {
00340 CosNaming::NamingContext_var context =
00341 get_context (n ACE_ENV_ARG_PARAMETER);
00342 ACE_CHECK;
00343
00344 CosNaming::Name simple_name;
00345 simple_name.length (1);
00346 simple_name[0] = n[name_len - 1];
00347 ACE_TRY
00348 {
00349 context->rebind_context (simple_name, nc ACE_ENV_ARG_PARAMETER);
00350 ACE_TRY_CHECK;
00351 }
00352 ACE_CATCH (CORBA::TIMEOUT, timeoutEx)
00353 {
00354 ACE_TRY_THROW (CosNaming::NamingContext::CannotProceed
00355 (context.in (), simple_name));
00356 }
00357 ACE_ENDTRY;
00358 }
00359 else
00360
00361
00362 {
00363 int result = this->context_->rebind (n[0].id,
00364 n[0].kind,
00365 nc,
00366 CosNaming::ncontext);
00367
00368 if (result == -1)
00369 ACE_THROW (CORBA::INTERNAL ());
00370
00371 else if (result == -2)
00372 ACE_THROW (CosNaming::NamingContext::NotFound
00373 (CosNaming::NamingContext::not_context,
00374 n));
00375 }
00376 }
00377
00378 CORBA::Object_ptr
00379 TAO_Hash_Naming_Context::resolve (const CosNaming::Name& n
00380 ACE_ENV_ARG_DECL)
00381 {
00382 ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX, ace_mon, this->lock_,
00383 CORBA::INTERNAL ());
00384 ACE_CHECK_RETURN (CORBA::Object::_nil ());
00385
00386
00387
00388 if (this->destroyed_)
00389 ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
00390 CORBA::Object::_nil ());
00391
00392
00393 CORBA::ULong name_len = n.length ();
00394
00395
00396 if (name_len == 0)
00397 ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(),
00398 CORBA::Object::_nil ());
00399
00400
00401
00402
00403 CosNaming::BindingType type;
00404
00405
00406 CORBA::Object_var result;
00407
00408 if (this->context_->find (n[0].id,
00409 n[0].kind,
00410 result.out (),
00411 type) == -1)
00412 ACE_THROW_RETURN (CosNaming::NamingContext::NotFound
00413 (CosNaming::NamingContext::missing_node,
00414 n),
00415 CORBA::Object::_nil ());
00416
00417
00418
00419 if (name_len > 1)
00420 {
00421 CosNaming::NamingContext_var context =
00422 CosNaming::NamingContext::_nil ();
00423
00424 if (type == CosNaming::ncontext)
00425 {
00426
00427 context = CosNaming::NamingContext::_narrow (result.in ()
00428 ACE_ENV_ARG_PARAMETER);
00429 ACE_CHECK_RETURN (CORBA::Object::_nil ());
00430 }
00431 else
00432
00433 ACE_THROW_RETURN (CosNaming::NamingContext::NotFound
00434 (CosNaming::NamingContext::not_context,
00435 n),
00436 CORBA::Object::_nil ());
00437
00438
00439 if (CORBA::is_nil (context.in ()))
00440 ACE_THROW_RETURN (CosNaming::NamingContext::NotFound
00441 (CosNaming::NamingContext::not_context,
00442 n),
00443 CORBA::Object::_nil ());
00444 else
00445 {
00446
00447
00448
00449
00450
00451
00452
00453 CosNaming::Name rest_of_name
00454 (n.maximum () - 1,
00455 n.length () - 1,
00456 const_cast<CosNaming::NameComponent*> (n.get_buffer ())
00457 + 1);
00458
00459
00460 ACE_TRY
00461 {
00462 CORBA::Object_ptr resolved_ref;
00463 resolved_ref = context->resolve (rest_of_name
00464 ACE_ENV_ARG_PARAMETER);
00465 ACE_TRY_CHECK;
00466 return resolved_ref;
00467 }
00468 ACE_CATCH (CORBA::TIMEOUT, timeoutEx)
00469 {
00470 ACE_TRY_THROW (CosNaming::NamingContext::CannotProceed
00471 (context.in (), rest_of_name));
00472 }
00473 ACE_ENDTRY;
00474 }
00475 }
00476
00477
00478 return result._retn ();
00479 }
00480
00481 void
00482 TAO_Hash_Naming_Context::unbind (const CosNaming::Name& n
00483 ACE_ENV_ARG_DECL)
00484 {
00485 ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX, ace_mon,
00486 this->lock_,
00487 CORBA::INTERNAL ());
00488 ACE_CHECK;
00489
00490
00491
00492 if (this->destroyed_)
00493 ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
00494
00495
00496 CORBA::ULong name_len = n.length ();
00497
00498
00499 if (name_len == 0)
00500 ACE_THROW (CosNaming::NamingContext::InvalidName());
00501
00502
00503
00504
00505 if (name_len > 1)
00506 {
00507 CosNaming::NamingContext_var context =
00508 get_context (n ACE_ENV_ARG_PARAMETER);
00509 ACE_CHECK;
00510
00511 CosNaming::Name simple_name;
00512 simple_name.length (1);
00513 simple_name[0] = n[name_len - 1];
00514 ACE_TRY
00515 {
00516 context->unbind (simple_name ACE_ENV_ARG_PARAMETER);
00517 ACE_TRY_CHECK;
00518 }
00519 ACE_CATCH (CORBA::TIMEOUT, timeoutEx)
00520 {
00521 ACE_TRY_THROW (CosNaming::NamingContext::CannotProceed
00522 (context.in (), simple_name));
00523 }
00524 ACE_ENDTRY;
00525 }
00526
00527
00528 else
00529 if (this->context_->unbind (n[0].id,
00530 n[0].kind) == -1)
00531 ACE_THROW (CosNaming::NamingContext::NotFound
00532 (CosNaming::NamingContext::missing_node,
00533 n));
00534 }
00535
00536 CosNaming::NamingContext_ptr
00537 TAO_Hash_Naming_Context::bind_new_context (const CosNaming::Name& n
00538 ACE_ENV_ARG_DECL)
00539 {
00540 ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX,
00541 ace_mon,
00542 this->lock_,
00543 CORBA::INTERNAL ());
00544 ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
00545
00546
00547
00548 if (this->destroyed_)
00549 ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
00550 CosNaming::NamingContext::_nil ());
00551
00552
00553 CORBA::ULong name_len = n.length ();
00554
00555
00556 if (name_len == 0)
00557 ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(),
00558 CosNaming::NamingContext::_nil ());
00559
00560
00561
00562
00563 if (name_len > 1)
00564 {
00565 CosNaming::NamingContext_var context =
00566 get_context (n ACE_ENV_ARG_PARAMETER);
00567 ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
00568
00569 CosNaming::Name simple_name;
00570 simple_name.length (1);
00571 simple_name[0] = n[name_len - 1];
00572 return context->bind_new_context (simple_name ACE_ENV_ARG_PARAMETER);
00573 }
00574
00575
00576
00577
00578 CosNaming::NamingContext_var result =
00579 CosNaming::NamingContext::_nil ();
00580
00581
00582 result = new_context (ACE_ENV_SINGLE_ARG_PARAMETER);
00583 ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
00584
00585
00586 ACE_TRY
00587 {
00588 bind_context (n,
00589 result.in ()
00590 ACE_ENV_ARG_PARAMETER);
00591 ACE_TRY_CHECK;
00592 }
00593 ACE_CATCHANY
00594 {
00595
00596
00597
00598 {
00599 ACE_DECLARE_NEW_CORBA_ENV;
00600 ACE_TRY_EX(DESTROY)
00601 {
00602 result->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
00603 ACE_TRY_CHECK_EX(DESTROY);
00604 }
00605 ACE_CATCHANY
00606 {
00607 }
00608 ACE_ENDTRY;
00609 }
00610
00611 ACE_RE_THROW;
00612 }
00613 ACE_ENDTRY;
00614 ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
00615 return result._retn ();
00616 }
00617
00618 void
00619 TAO_Hash_Naming_Context::destroy (ACE_ENV_SINGLE_ARG_DECL)
00620 {
00621 ACE_GUARD_THROW_EX (TAO_SYNCH_RECURSIVE_MUTEX,
00622 ace_mon,
00623 this->lock_,
00624 CORBA::INTERNAL ());
00625 ACE_CHECK;
00626
00627
00628
00629 if (this->destroyed_)
00630 ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
00631
00632 if (this->context_->current_size () != 0)
00633 ACE_THROW (CosNaming::NamingContext::NotEmpty());
00634
00635
00636 if (root ())
00637 return;
00638
00639 else
00640 {
00641 this->destroyed_ = 2;
00642
00643
00644
00645
00646
00647 PortableServer::POA_var poa =
00648 this->_default_POA ();
00649
00650 PortableServer::ObjectId_var id =
00651 PortableServer::string_to_ObjectId (poa_id_.fast_rep ());
00652
00653 ACE_CHECK;
00654
00655 poa->deactivate_object (id.in ()
00656 ACE_ENV_ARG_PARAMETER);
00657 ACE_CHECK;
00658 }
00659 }
00660
00661 int
00662 TAO_Hash_Naming_Context::root (void)
00663 {
00664 return (ACE_OS::strcmp (this->poa_id_.fast_rep (),
00665 TAO_ROOT_NAMING_CONTEXT) == 0);
00666 }
00667
00668 int
00669 TAO_Hash_Naming_Context::destroyed (void)
00670 {
00671 return this->destroyed_;
00672 }
00673
00674 TAO_Naming_Context *
00675 TAO_Hash_Naming_Context::interface (void)
00676 {
00677 return this->interface_;
00678 }
00679
00680 TAO_END_VERSIONED_NAMESPACE_DECL