-// SALOME NamingService : wrapping NamingService services
+// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
+// SALOME NamingService : wrapping NamingService services
// File : SALOME_NamingService.cxx
// Author : Estelle Deville
// Module : SALOME
// $Header$
-
+//
#include "SALOME_NamingService.hxx"
#include "ServiceUnreachable.hxx"
#include <iostream>
#include <cstring>
#include <string>
+#include <cstdio>
using namespace std;
+/*! \class SALOME_NamingService
+ \brief A class to manage the SALOME naming service
+
+*/
+
// ============================================================================
/*! \brief Default Constructor without ORB reference.
*
SALOME_NamingService::SALOME_NamingService(CORBA::ORB_ptr orb)
{
MESSAGE("SALOME_NamingService creation");
- _orb = orb ;
+ _orb = CORBA::ORB::_duplicate(orb);
_initialize_root_context();
}
*
* Initializes ORB reference and naming service root context.
* For use after default constructor.
+ * If param orb is null, the orb is initialized
* \param orb CORBA::ORB_ptr arguments
*/
// ============================================================================
MESSAGE("SALOME_NamingService initialisation");
Utils_Locker lock (&_myMutex);
- _orb = orb;
+ if(orb)
+ _orb = CORBA::ORB::_duplicate(orb);
+ else
+ {
+ int argc=0;
+ _orb = CORBA::ORB_init(argc, 0); // Here we make the assumption that the orb has already been initialized
+ }
_initialize_root_context();
}
// --- _current_context is replaced to the _root_context
// if the Path begins whith '/'
- if (Path[0] == '/')
- {
- _current_context = _root_context;
- }
+ if (Path[0] == '/'){
+ _current_context = _root_context;
+ }
// --- the resolution of the directory path has to be done
// to place the current_context to the correct node
CORBA::Boolean not_exist = false;
- if (dimension_resultat > 0)
- {
- // A directory is treated (not only an object name)
- // test if the directory where ObjRef should be recorded already exists
- // If not, create the new context
-
- try
- {
- CORBA::Object_var obj = _current_context->resolve(context_name);
- _current_context = CosNaming::NamingContext::_narrow(obj);
- }
-
- catch (CosNaming::NamingContext::NotFound &)
- {
- // --- failed to resolve, therefore assume cold start
- not_exist = true;
- }
-
- catch (CosNaming::NamingContext::InvalidName &)
- {
- INFOS("Register() : CosNaming::NamingContext::InvalidName");
- }
-
- catch (CosNaming::NamingContext::CannotProceed &)
- {
- INFOS("Register() : CosNaming::NamingContext::CannotProceed");
- }
-
- catch (CORBA::SystemException&)
- {
- INFOS("Register() : CORBA::SystemException: "
- << "unable to contact the naming service");
- throw ServiceUnreachable();
- }
-
- if (not_exist)
- {
- try
- {
- context_name.length(1);
- for (int i = 0 ; i < dimension_resultat ;i++)
- {
- context_name[0].id =
- CORBA::string_dup(splitPath[i].c_str());
- context_name[0].kind = CORBA::string_dup("dir");
- // SCRUTE(_context_name[0].id);
- // --- check if the path is created
- try
- {
- // --- if the context is already created, nothing to do
- CORBA::Object_var obj =
- _current_context->resolve(context_name);
- _current_context =
- CosNaming::NamingContext::_narrow(obj);
- }
-
- catch (CosNaming::NamingContext::NotFound &)
- {
- // --- the context must be created
- CosNaming::NamingContext_var temp_context =
- _current_context->bind_new_context(context_name);
- _current_context = temp_context;
- }
- }
- }
-
- catch (CosNaming::NamingContext::AlreadyBound&)
- {
- INFOS("Register() : CosNaming::NamingContext::AlreadyBound");
- }
-
- catch (CosNaming::NamingContext::NotFound& ex)
- {
- CosNaming::Name n = ex.rest_of_name;
-
- if (ex.why == CosNaming::NamingContext::missing_node)
- INFOS("Register() : " << (char *) n[0].id
- << " (" << (char *) n[0].kind << ") not found");
+ if (dimension_resultat > 0){
+ // A directory is treated (not only an object name)
+ // test if the directory where ObjRef should be recorded already exists
+ // If not, create the new context
+
+ try{
+ CORBA::Object_var obj = _current_context->resolve(context_name);
+ _current_context = CosNaming::NamingContext::_narrow(obj);
+ }
- if (ex.why == CosNaming::NamingContext::not_context)
- INFOS("Register() : " << (char *) n[0].id
- << " (" << (char *) n[0].kind
- << ") is not a context");
+ catch (CosNaming::NamingContext::NotFound &){
+ // --- failed to resolve, therefore assume cold start
+ not_exist = true;
+ }
- if (ex.why == CosNaming::NamingContext::not_object)
- INFOS("Register() : " << (char *) n[0].id
- << " (" << (char *) n[0].kind
- << ") is not an object");
- }
+ catch (CosNaming::NamingContext::InvalidName &){
+ INFOS("Register() : CosNaming::NamingContext::InvalidName");
+ }
- catch (CosNaming::NamingContext::CannotProceed&)
- {
- INFOS("Register(): CosNaming::NamingContext::CannotProceed");
- }
+ catch (CosNaming::NamingContext::CannotProceed &){
+ INFOS("Register() : CosNaming::NamingContext::CannotProceed");
+ }
- catch (CosNaming::NamingContext::InvalidName&)
- {
- INFOS("Register(): CosNaming::NamingContext::InvalidName");
- }
+ catch (CORBA::SystemException&){
+ INFOS("Register() : CORBA::SystemException: "
+ << "unable to contact the naming service");
+ throw ServiceUnreachable();
+ }
- catch (CORBA::SystemException&)
- {
- INFOS("Register():CORBA::SystemException: "
- << "unable to contact the naming service");
- throw ServiceUnreachable();
- }
- }
+ if (not_exist){
+ try{
+ context_name.length(1);
+ for (int i = 0 ; i < dimension_resultat ;i++){
+ context_name[0].id = CORBA::string_dup(splitPath[i].c_str());
+ context_name[0].kind = CORBA::string_dup("dir");
+ // SCRUTE(_context_name[0].id);
+ // --- check if the path is created
+ try{
+ // --- if the context is already created, nothing to do
+ CORBA::Object_var obj = _current_context->resolve(context_name);
+ _current_context = CosNaming::NamingContext::_narrow(obj);
+ }
+
+ catch (CosNaming::NamingContext::NotFound &){
+ try{
+ // --- the context must be created
+ CosNaming::NamingContext_var temp_context =
+ _current_context->bind_new_context(context_name);
+ _current_context = temp_context;
+ }
+ catch (CosNaming::NamingContext::AlreadyBound&){
+ CORBA::Object_var obj = _current_context->resolve(context_name);
+ _current_context = CosNaming::NamingContext::_narrow(obj);
+ }
+ }
+ }
+ }
+
+ catch (CosNaming::NamingContext::AlreadyBound&){
+ INFOS("Register() : CosNaming::NamingContext::AlreadyBound");
+ }
+
+ catch (CosNaming::NamingContext::NotFound& ex){
+ CosNaming::Name n = ex.rest_of_name;
+
+ if (ex.why == CosNaming::NamingContext::missing_node)
+ INFOS("Register() : " << (char *) n[0].id
+ << " (" << (char *) n[0].kind << ") not found");
+
+ if (ex.why == CosNaming::NamingContext::not_context)
+ INFOS("Register() : " << (char *) n[0].id
+ << " (" << (char *) n[0].kind
+ << ") is not a context");
+
+ if (ex.why == CosNaming::NamingContext::not_object)
+ INFOS("Register() : " << (char *) n[0].id
+ << " (" << (char *) n[0].kind
+ << ") is not an object");
+ }
+
+ catch (CosNaming::NamingContext::CannotProceed&){
+ INFOS("Register(): CosNaming::NamingContext::CannotProceed");
+ }
+
+ catch (CosNaming::NamingContext::InvalidName&){
+ INFOS("Register(): CosNaming::NamingContext::InvalidName");
+ }
+
+ catch (CORBA::SystemException&){
+ INFOS("Register():CORBA::SystemException: "
+ << "unable to contact the naming service");
+ throw ServiceUnreachable();
+ }
}
+ }
// --- The current directory is now the directory where the object should
// be recorded
int sizePath = splitPath.size();
- if (sizePath > dimension_resultat)
- {
- ASSERT(sizePath == dimension_resultat+1);
- context_name.length(1);
+ if (sizePath > dimension_resultat){
+ ASSERT(sizePath == dimension_resultat+1);
+ context_name.length(1);
- try
- {
- // --- the last element is an object and not a directory
+ try{
+ // --- the last element is an object and not a directory
- context_name[0].id =
- CORBA::string_dup(splitPath[dimension_resultat].c_str());
- context_name[0].kind = CORBA::string_dup("object");
- //SCRUTE(context_name[0].id);
+ context_name[0].id = CORBA::string_dup(splitPath[dimension_resultat].c_str());
+ context_name[0].kind = CORBA::string_dup("object");
+ //SCRUTE(context_name[0].id);
- _current_context->bind(context_name, ObjRef);
- }
+ _current_context->bind(context_name, ObjRef);
+ }
- catch (CosNaming::NamingContext::NotFound& ex)
- {
- CosNaming::Name n = ex.rest_of_name;
+ catch (CosNaming::NamingContext::NotFound& ex){
+ CosNaming::Name n = ex.rest_of_name;
- if (ex.why == CosNaming::NamingContext::missing_node)
- INFOS("Register() : " << (char *) n[0].id
- << " (" << (char *) n[0].kind << ") not found");
+ if (ex.why == CosNaming::NamingContext::missing_node)
+ INFOS("Register() : " << (char *) n[0].id
+ << " (" << (char *) n[0].kind << ") not found");
- if (ex.why == CosNaming::NamingContext::not_context)
- INFOS("Register() : " << (char *) n[0].id
- << " (" << (char *) n[0].kind
- << ") is not a context");
+ if (ex.why == CosNaming::NamingContext::not_context)
+ INFOS("Register() : " << (char *) n[0].id
+ << " (" << (char *) n[0].kind
+ << ") is not a context");
- if (ex.why == CosNaming::NamingContext::not_object)
- INFOS("Register() : " << (char *) n[0].id
- << " (" << (char *) n[0].kind
- << ") is not an object");
- }
+ if (ex.why == CosNaming::NamingContext::not_object)
+ INFOS("Register() : " << (char *) n[0].id
+ << " (" << (char *) n[0].kind
+ << ") is not an object");
+ }
- catch (CosNaming::NamingContext::CannotProceed&)
- {
- INFOS("Register(): CosNaming::NamingContext::CannotProceed");
- }
+ catch (CosNaming::NamingContext::CannotProceed&){
+ INFOS("Register(): CosNaming::NamingContext::CannotProceed");
+ }
- catch (CosNaming::NamingContext::InvalidName&)
- {
- INFOS("Register(): CosNaming::NamingContext::InvalidName");
- }
+ catch (CosNaming::NamingContext::InvalidName&){
+ INFOS("Register(): CosNaming::NamingContext::InvalidName");
+ }
- catch (CosNaming::NamingContext::AlreadyBound&)
- {
- INFOS("Register(): CosNaming::NamingContext::AlreadyBound, "
- << "object will be rebind");
- _current_context->rebind(context_name, ObjRef);
- }
+ catch (CosNaming::NamingContext::AlreadyBound&){
+ INFOS("Register(): CosNaming::NamingContext::AlreadyBound, "
+ << "object will be rebind");
+ _current_context->rebind(context_name, ObjRef);
+ }
- catch (CORBA::SystemException&)
- {
- INFOS("!!!Register(): CORBA::SystemException: "
- << "unable to contact the naming service");
- throw ServiceUnreachable();
- }
+ catch (CORBA::SystemException&){
+ INFOS("!!!Register(): CORBA::SystemException: "
+ << "unable to contact the naming service");
+ throw ServiceUnreachable();
}
+ }
}
// ============================================================================
CORBA::Object_ptr SALOME_NamingService::Resolve(const char* Path)
throw(ServiceUnreachable)
{
- MESSAGE("BEGIN OF Resolve: " << Path);
+// MESSAGE("BEGIN OF Resolve: " << Path);
Utils_Locker lock (&_myMutex);
CosNaming::Name context_name;
vector<string> splitPath;
- int dimension_resultat = _createContextNameDir(Path,
+ _createContextNameDir(Path,
context_name,
splitPath,
false);
ASSERT(!CORBA::is_nil(_current_context));
- CORBA::Object_ptr obj = CORBA::Object::_nil();
+ CORBA::Object_var obj = CORBA::Object::_nil();
try
{
CosNaming::Name n = ex.rest_of_name;
if (ex.why == CosNaming::NamingContext::missing_node)
- INFOS("Resolve() : " << (char *) n[0].id
+ MESSAGE("Resolve() : " << (char *) n[0].id
<< " (" << (char *) n[0].kind << ") not found");
if (ex.why == CosNaming::NamingContext::not_context)
throw ServiceUnreachable();
}
- return obj;
+ return obj._retn();
}
// ============================================================================
CORBA::Object_ptr SALOME_NamingService::ResolveFirst(const char* Path)
throw(ServiceUnreachable)
{
- MESSAGE("ResolveFirst");
+// MESSAGE("ResolveFirst");
Utils_Locker lock (&_myMutex);
- SCRUTE(Path);
+// SCRUTE(Path);
string thePath = Path;
string basePath = "";
{
basePath = thePath.substr(0, idx);
name = thePath.substr(idx + 1);
- SCRUTE(basePath);
+// SCRUTE(basePath);
}
- SCRUTE(name);
- CORBA::Object_ptr obj = CORBA::Object::_nil();
+// SCRUTE(name);
+ CORBA::Object_var obj = CORBA::Object::_nil();
bool isOk = false;
if (basePath.empty())
}
}
- return obj;
+ return obj._retn();
}
// ============================================================================
* number of processors.
* If the NamingService is out, the exception ServiceUnreachable is thrown.
* \param hostname name of the machine on which the component is searched.
- * \param containername name of the container in which the component is
+ * \param containerName name of the container in which the component is
instanciated.
- * \param componentname name of the component we are looking for an existing
+ * \param componentName name of the component we are looking for an existing
instance.
* \param nbproc in case of multi processor machine, container name is
* suffixed with _nbproc.
const int nbproc)
throw(ServiceUnreachable)
{
- MESSAGE("ResolveComponent");
+// MESSAGE("ResolveComponent");
Utils_Locker lock (&_myMutex);
else
{
SCRUTE(name);
- if (Change_Directory(name.c_str()))
+ string basename = name;
+ if (Change_Directory(basename.c_str()))
{
vector<string> contList = list_subdirs();
if ( !CORBA::is_nil(obj) )
return obj;
+ else
+ Change_Directory(basename.c_str());
}
}
return ret;
}
+string
+SALOME_NamingService::ContainerName(const Engines::ContainerParameters& params)
+{
+ int nbproc;
+
+ if ( !params.isMPI )
+ nbproc = 0;
+ else if ( (params.resource_params.nb_node <= 0) && (params.resource_params.nb_proc_per_node <= 0) )
+ nbproc = 1;
+ else if ( params.resource_params.nb_node == 0 )
+ nbproc = params.resource_params.nb_proc_per_node;
+ else if ( params.resource_params.nb_proc_per_node == 0 )
+ nbproc = params.resource_params.nb_node;
+ else
+ nbproc = params.resource_params.nb_node * params.resource_params.nb_proc_per_node;
+
+ string ret = ContainerName(params.container_name);
+
+ if ( nbproc >= 1 )
+ {
+ char *suffix = new char[8];
+ sprintf(suffix, "_%d", nbproc);
+ ret += suffix;
+ }
+
+ return ret;
+}
+
// ============================================================================
/*! \brief build a string representing a container in Naming Service.
*
* Build a string representing the absolute pathname of a container in
* SALOME_NamingService. This form gives a suffixed containerName in case of
* multi processor machine.
- * \param params struct from which we get container name (may be
- * empty), number of nodes and number of processor
- * per node.
- * /param hostname name of the host of the container, without domain names.
- * /return the path under the form /Containers/hostname/containerName
- * /sa ContainerName(const Engines::MachineParameters& params)
+ * \param containerName name of the container in which the component is
+ instanciated.
+ * \param hostname name of the host of the container, without domain names.
+ * \return the path under the form /Containers/hostname/containerName
+ * \sa ContainerName(const Engines::MachineParameters& params)
*/
// ============================================================================
*
* Build a string representing the absolute pathname of a container in
* SALOME_NamingService.
- * /param params used as it is, or replaced by FactoryServer if empty.
- * /param hostname name of the host of the container, without domain names.
- * /return the path under the form /Containers/hostname/containerName
- * /sa ContainerName(const char *containerName)
+ * \param params used as it is, or replaced by FactoryServer if empty.
+ * \param hostname name of the host of the container, without domain names.
+ * \return the path under the form /Containers/hostname/containerName
+ * \sa ContainerName(const char *containerName)
*/
// ============================================================================
return ret;
}
+string
+SALOME_NamingService::
+BuildContainerNameForNS(const Engines::ContainerParameters& params,
+ const char *hostname)
+{
+ string ret = "/Containers/";
+ ret += hostname;
+ ret += "/";
+ ret += ContainerName(params);
+
+ return ret;
+}
+
// ============================================================================
/*! \brief search a name in current directory.
*
bool SALOME_NamingService::Change_Directory(const char* Path)
throw(ServiceUnreachable)
{
- MESSAGE("BEGIN OF Change_Directory " << Path);
+// MESSAGE("BEGIN OF Change_Directory " << Path);
Utils_Locker lock (&_myMutex);
string path(Path);
if (path == "/")
{
- MESSAGE("Change_Directory is called to go to the root_context");
+// MESSAGE("Change_Directory is called to go to the root_context");
_current_context = _root_context;
return true;
}
ASSERT(!CORBA::is_nil(current_context));
if (path[path.length()-1] != '/') path += '/';
- SCRUTE(path);
+// SCRUTE(path);
CosNaming::Name context_name;
vector<string> splitPath;
- int dimension_resultat = _createContextNameDir(path.c_str(),
+ _createContextNameDir(path.c_str(),
context_name,
splitPath,
true);
CosNaming::Name n = ex.rest_of_name;
if (ex.why == CosNaming::NamingContext::missing_node)
- INFOS( "Change_Directory() : " << (char *) n[0].id
+ MESSAGE( "Change_Directory() : " << (char *) n[0].id
<< " (" << (char *) n[0].kind << ") not found");
if (ex.why == CosNaming::NamingContext::not_context)
INFOS("Change_Directory() : " << (char *) n[0].id
vector<string> SALOME_NamingService::list_directory()
throw(ServiceUnreachable)
{
- MESSAGE("list_directory");
+// MESSAGE("list_directory");
vector<string> dirList ;
dirList.resize(0);
if (binding->binding_type == CosNaming::nobject)
{
- dirList.push_back(CORBA::string_dup(bindingName[0].id));
+ // remove memory leak
+ // dirList.push_back(CORBA::string_dup(bindingName[0].id));
+ dirList.push_back(string(bindingName[0].id));
}
}
- for (unsigned int ind = 0; ind < dirList.size(); ind++)
- MESSAGE("list_directory : Object : " << dirList[ind]);
+// for (unsigned int ind = 0; ind < dirList.size(); ind++)
+// MESSAGE("list_directory : Object : " << dirList[ind]);
binding_iterator->destroy();
if (binding->binding_type == CosNaming::ncontext)
{
- dirList.push_back(CORBA::string_dup(bindingName[0].id));
+ dirList.push_back(bindingName[0].id.in());
}
}
vector<string> dirList ;
- string currentDir = Current_Directory();
+ char* currentDir = Current_Directory();
_list_directory_recurs(dirList, "", currentDir);
+ free(currentDir);
+
return dirList;
}
context_name.length(dim);
for (int i=0; i<dim; i++)
{
- SCRUTE(splitPath[i]);
+// SCRUTE(splitPath[i]);
context_name[i].id = CORBA::string_dup(splitPath[i].c_str());
if (!endWithDelim && (i == dim-1)) // here, the last string is an object
{
context_name[i].kind = CORBA::string_dup("object");
- MESSAGE("--- " <<splitPath[i] <<".object");
+// MESSAGE("--- " <<splitPath[i] <<".object");
}
else
{
context_name[i].kind = CORBA::string_dup("dir");
- MESSAGE("--- " <<splitPath[i] <<".dir");
+// MESSAGE("--- " <<splitPath[i] <<".dir");
}
}
return dim;
* \param splitPath
* \param lengthResult
* \param contextToFind
- * \param _notFound
+ * \param notFound
*/
// ============================================================================
{
// --- directory, search in it
- splitPath.push_back(CORBA::string_dup(bindingName[0].id));
+ const char* bindingNameid=bindingName[0].id;
+ splitPath.push_back(bindingNameid);
lengthResult++;
CORBA::Object_var obj = _current_context->resolve(bindingName);
* get a list of all the objects in the current directory, with recursion
* on the subdirectories. Only the objects are listed, not the directories.
* If the NamingService is out, the exception ServiceUnreachable is thrown.
- * \param myList the list of objects
- * \
-Function :_list_directory_recurs.
- * Purpose : method to list recursively all the objects contained in the tree of absCurDirectory/relativeSubDir.
- * \param myList The list that will be filled.
- * \param relativeSubDir The directory from absCurDirectory in which the objects are found.
- * \param absCurDirectory The directory in ABSOLUTE form.
* _current_context must refer to absCurDirectory.
+ *
+ * \param myList The list that will be filled.
+ * \param relativeSubDir The directory relative to absCurDirectory in which
+ * the objects are found.
+ * \param absCurDirectory The current directory, absolute path
*/
// ============================================================================
return _orb->object_to_string(_root_context);
}
+/*! \brief get the orb used by the naming service
+ *
+ * \return the orb
+ */
+CORBA::ORB_ptr SALOME_NamingService::orb()
+{
+ return _orb;
+}
+