Salome HOME
bos #26457 Factorization of ORB initialization
[modules/kernel.git] / src / LifeCycleCORBA / SALOME_LifeCycleCORBA.cxx
index cf181f04e194100de5915fd8a1f67dbe1a12acbc..a576b5b6f37041000a77f570da0880bea76c4366 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -37,6 +37,7 @@
 #endif
 
 #include "Basics_Utils.hxx"
+#include "OpUtil.hxx"
 #include "utilities.h"
 
 #include <ServiceUnreachable.hxx>
@@ -44,6 +45,7 @@
 #include "SALOME_LifeCycleCORBA.hxx"
 #include "SALOME_ResourcesManager.hxx"
 #include "SALOMESDS_DataServerManager.hxx"
+#include "SALOME_ExternalServerLauncher.hxx"
 
 #include CORBA_CLIENT_HEADER(SALOME_ModuleCatalog)
 #include CORBA_CLIENT_HEADER(SALOME_Session)
@@ -81,14 +83,11 @@ IncompatibleComponent::IncompatibleComponent(const IncompatibleComponent &ex):
  */
 //=============================================================================
 
-SALOME_LifeCycleCORBA::SALOME_LifeCycleCORBA(SALOME_NamingService *ns)
+SALOME_LifeCycleCORBA::SALOME_LifeCycleCORBA(SALOME_NamingService_Abstract *ns)
 {
   // be sure to have an instance of traceCollector, when used via SWIG
   // in a Python module
-  int argc = 0;
-  char *xargv = (char*)"";
-  char **argv = &xargv;
-  CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
+  CORBA::ORB_var orb = KERNEL::GetRefToORB();
   //  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
   _NSnew=0;
   if (!ns)
@@ -103,17 +102,19 @@ SALOME_LifeCycleCORBA::SALOME_LifeCycleCORBA(SALOME_NamingService *ns)
   // not enough: set a current directory in naming service is not thread safe
   // if naming service instance is shared among several threads...
   // ==> always use absolute path and don't rely on current directory!
-
-  CORBA::Object_var obj =
-    _NS->Resolve(SALOME_ContainerManager::_ContainerManagerNameInNS);
-  if (CORBA::is_nil(obj))
-    throw SALOME_Exception("Error: Cannot resolve ContainerManager in Naming Service");
-  _ContManager=Engines::ContainerManager::_narrow(obj);
-
-  obj = _NS->Resolve(SALOME_ResourcesManager::_ResourcesManagerNameInNS);
-  if (CORBA::is_nil(obj))
-    throw SALOME_Exception("Error: Cannot resolve ResourceManager in Naming Service");
-  _ResManager=Engines::ResourcesManager::_narrow(obj);
+  //if( dynamic_cast<SALOME_NamingService *>(_NS) )
+  {
+    CORBA::Object_var obj =
+      _NS->Resolve(SALOME_ContainerManager::_ContainerManagerNameInNS);
+    if (CORBA::is_nil(obj))
+      throw SALOME_Exception("Error: Cannot resolve ContainerManager in Naming Service");
+    _ContManager=Engines::ContainerManager::_narrow(obj);
+
+    obj = _NS->Resolve(SALOME_ResourcesManager::_ResourcesManagerNameInNS);
+    if (CORBA::is_nil(obj))
+      throw SALOME_Exception("Error: Cannot resolve ResourceManager in Naming Service");
+    _ResManager=Engines::ResourcesManager::_narrow(obj);
+  }
 }
 
 //=============================================================================
@@ -132,14 +133,12 @@ SALOME_LifeCycleCORBA::~SALOME_LifeCycleCORBA()
  *
  *  \param params         container parameters like type or name...
  *  \param componentName  the name of component class
- *  \param studyId        default = 0  : multistudy instance
  *  \return a CORBA reference of the component instance, or _nil if not found
  */
 //=============================================================================
 Engines::EngineComponent_ptr
 SALOME_LifeCycleCORBA::FindComponent(const Engines::ContainerParameters& params,
-                                     const char *componentName,
-                                     int studyId)
+                                     const char *componentName)
 {
   if (! isKnownComponentClass(componentName))
     return Engines::EngineComponent::_nil();
@@ -153,14 +152,13 @@ SALOME_LifeCycleCORBA::FindComponent(const Engines::ContainerParameters& params,
     {
       listOfResources = _ResManager->GetFittingResources(new_params.resource_params);
     }
-  catch( const SALOME::SALOME_Exception& ex )
+  catch( const SALOME::SALOME_Exception& /*ex*/ ) //!< TODO: unused variable
     {
       return Engines::EngineComponent::_nil();
     }
 
   Engines::EngineComponent_var compo = _FindComponent(new_params,
                                                 componentName,
-                                                studyId,
                                                 listOfResources);
 
   return compo._retn();
@@ -171,15 +169,13 @@ SALOME_LifeCycleCORBA::FindComponent(const Engines::ContainerParameters& params,
  *
  *  \param params         container parameters like type or name...
  *  \param componentName  the name of component class
- *  \param studyId        default = 0  : multistudy instance
  *  \return a CORBA reference of the component instance, or _nil if problem
  */
 //=============================================================================
 
 Engines::EngineComponent_ptr
 SALOME_LifeCycleCORBA::LoadComponent(const Engines::ContainerParameters& params,
-                                     const char *componentName,
-                                     int studyId)
+                                     const char *componentName)
 {
   // --- Check if Component Name is known in ModuleCatalog
 
@@ -196,15 +192,14 @@ SALOME_LifeCycleCORBA::LoadComponent(const Engines::ContainerParameters& params,
     {
       listOfResources = _ResManager->GetFittingResources(new_params.resource_params);
     }
-  catch( const SALOME::SALOME_Exception& ex )
+  catch( const SALOME::SALOME_Exception& /*ex*/ ) //!< TODO: unused variable
     {
       return Engines::EngineComponent::_nil();
     }
   new_params.resource_params.resList = listOfResources;
 
   Engines::EngineComponent_var compo = _LoadComponent(new_params,
-                                                componentName,
-                                                studyId);
+                                                      componentName);
 
   return compo._retn();
 }
@@ -215,7 +210,6 @@ SALOME_LifeCycleCORBA::LoadComponent(const Engines::ContainerParameters& params,
  *
  *  \param params         container parameters like type or name...
  *  \param componentName  the name of component class
- *  \param studyId        default = 0  : multistudy instance
  *  \return a CORBA reference of the component instance, or _nil if problem
  */
 //=============================================================================
@@ -223,8 +217,7 @@ SALOME_LifeCycleCORBA::LoadComponent(const Engines::ContainerParameters& params,
 Engines::EngineComponent_ptr
 SALOME_LifeCycleCORBA::
 FindOrLoad_Component(const Engines::ContainerParameters& params,
-                     const char *componentName,
-                     int studyId)
+                     const char *componentName)
 {
   // --- Check if Component Name is known in ModuleCatalog
 
@@ -241,22 +234,20 @@ FindOrLoad_Component(const Engines::ContainerParameters& params,
     {
       listOfResources = _ResManager->GetFittingResources(new_params.resource_params);
     }
-  catch( const SALOME::SALOME_Exception& ex )
+  catch( const SALOME::SALOME_Exception& /*ex*/ ) //!< TODO: unused variable
     {
       return Engines::EngineComponent::_nil();
     }
 
   Engines::EngineComponent_var compo = _FindComponent(new_params,
-                                                componentName,
-                                                studyId,
-                                                listOfResources);
+                                                      componentName,
+                                                      listOfResources);
 
   if(CORBA::is_nil(compo))
   {
     new_params.resource_params.resList = listOfResources;
     compo = _LoadComponent(new_params,
-                           componentName,
-                           studyId);
+                           componentName);
   }
 
   return compo._retn();
@@ -287,11 +278,11 @@ SALOME_LifeCycleCORBA::FindOrLoad_Component(const char *containerName,
   // --- Check if containerName contains machine name (if yes: rg>0)
   char *stContainer=strdup(containerName);
   std::string st2Container(stContainer);
-  int rg=st2Container.find("/");
+  size_t rg=st2Container.find("/");
 
   Engines::ContainerParameters params;
   preSet(params);
-  if (rg<0)
+  if (rg == std::string::npos)
   {
     // containerName doesn't contain "/" => Local container
     params.container_name = CORBA::string_dup(stContainer);
@@ -430,7 +421,7 @@ Engines::ResourcesManager_ptr SALOME_LifeCycleCORBA::getResourcesManager()
  */
 //=============================================================================
 
-void SALOME_LifeCycleCORBA::shutdownServers()
+void SALOME_LifeCycleCORBA::shutdownServers(bool shutdownLauncher)
 {
   // get each Container from NamingService => shutdown it
   // (the order is inverse to the order of servers initialization)
@@ -458,7 +449,7 @@ void SALOME_LifeCycleCORBA::shutdownServers()
       if ( !CORBA::is_nil(connMan) && ( pid != connMan->getPID() ) )
         connMan->ShutdownWithExit();
     }
-  catch(const CORBA::Exception& e)
+  catch(const CORBA::Exception& /*e*/) //!< TODO: unused variable
     {
        // ignore and continue
     }
@@ -475,12 +466,13 @@ void SALOME_LifeCycleCORBA::shutdownServers()
   // 2) SALOMEDS
   try
     {
-      CORBA::Object_var objSDS = _NS->Resolve("/myStudyManager");
-      SALOMEDS::StudyManager_var studyManager = SALOMEDS::StudyManager::_narrow(objSDS) ;
-      if ( !CORBA::is_nil(studyManager) && ( pid != studyManager->getPID() ) )
-        studyManager->Shutdown();
+      CORBA::Object_var objSDS = _NS->Resolve("/Study");
+      SALOMEDS::Study_var study = SALOMEDS::Study::_narrow(objSDS) ;
+      if ( !CORBA::is_nil(study) && ( pid != study->getPID() ) )
+        study->Shutdown();
+      _NS->Destroy_Name("/Study");
     }
-  catch(const CORBA::Exception& e)
+  catch(const CORBA::Exception& /*e*/) //!< TODO: unused variable
     {
        // ignore and continue
     }
@@ -497,8 +489,9 @@ void SALOME_LifeCycleCORBA::shutdownServers()
       SALOME_ModuleCatalog::ModuleCatalog_var catalog = SALOME_ModuleCatalog::ModuleCatalog::_narrow(objMC);
       if ( !CORBA::is_nil(catalog) && ( pid != catalog->getPID() ) )
         catalog->shutdown();
+      _NS->Destroy_Name("/Kernel/ModulCatalog");
     }
-  catch(const CORBA::Exception& e)
+  catch(const CORBA::Exception& /*e*/) //!< TODO: unused variable
     {
        // ignore and continue
     }
@@ -507,7 +500,7 @@ void SALOME_LifeCycleCORBA::shutdownServers()
 #ifndef WIN32
   nanosleep(&ts_req,0);
 #endif
-  // 4 ) Remote ScopeServer (the DataServer is hosted by SalomeLauncher shutdown right after)
+  // 4 ) Remote ScopeServer (the DataServer is hosted by SalomeLauncher shutdown right after on point 6)
   try
     {
       CORBA::Object_var objDSM(_NS->Resolve(SALOMESDS::DataServerManager::NAME_IN_NS));
@@ -515,20 +508,33 @@ void SALOME_LifeCycleCORBA::shutdownServers()
       if ( !CORBA::is_nil(dsm) )
         dsm->shutdownScopes();
     }
-  catch(const CORBA::Exception& e)
+  catch(const CORBA::Exception& /*e*/) //!< TODO: unused variable
     {
        // ignore and continue
     }
-
-  // 5) SalomeLauncher
+  // 5) External server launcher (the ExternalServer is hosted by SalomeLauncher shutdown right after on point 6)
+  try
+    {
+      CORBA::Object_var objDSM(_NS->Resolve(SALOME_ExternalServerLauncher::NAME_IN_NS));
+      SALOME::ExternalServerLauncher_var dsm(SALOME::ExternalServerLauncher::_narrow(objDSM));
+      if ( !CORBA::is_nil(dsm) )
+        dsm->shutdownServers();
+    }
+  catch(const CORBA::Exception& /*e*/) //!< TODO: unused variable
+    {
+       // ignore and continue
+    }
+  // 6) SalomeLauncher
   try
     {
-      CORBA::Object_var objSL = _NS->Resolve("/SalomeLauncher");
-      Engines::SalomeLauncher_var launcher = Engines::SalomeLauncher::_narrow(objSL);
-      if (!CORBA::is_nil(launcher) && (pid != launcher->getPID()))
-        launcher->Shutdown();
+      if(shutdownLauncher){
+        CORBA::Object_var objSL = _NS->Resolve("/SalomeLauncher");
+        Engines::SalomeLauncher_var launcher = Engines::SalomeLauncher::_narrow(objSL);
+        if (!CORBA::is_nil(launcher) && (pid != launcher->getPID()))
+          launcher->Shutdown();
+      }
     }
-  catch(const CORBA::Exception& e)
+  catch(const CORBA::Exception& /*e*/) //!< TODO: unused variable
     {
        // ignore and continue
     }
@@ -545,17 +551,15 @@ void SALOME_LifeCycleCORBA::shutdownServers()
       Registry::Components_var registry = Registry::Components::_narrow(objR);
       if ( !CORBA::is_nil(registry) && ( pid != registry->getPID() ) )
           registry->Shutdown();
+      _NS->Destroy_Name("/Registry");
     }
-  catch(const CORBA::Exception& e)
+  catch(const CORBA::Exception& /*e*/) //!< TODO: unused variable
     {
        // ignore and continue
     }
 
   // 7) Logger
-  int argc = 0;
-  char *xargv = (char*)"";
-  char **argv = &xargv;
-  CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
+  CORBA::ORB_var orb = KERNEL::GetRefToORB();
 
   CORBA::Object_var objLog = CORBA::Object::_nil();
   CosNaming::NamingContext_var inc;
@@ -599,7 +603,7 @@ void SALOME_LifeCycleCORBA::killOmniNames()
   std::string portNumber (::getenv ("NSPORT") );
   std::string python_exe;
 
-  python_exe = std::string("python");
+  python_exe = std::string("python3");
 
   if ( !portNumber.empty() )
   {
@@ -639,7 +643,6 @@ void SALOME_LifeCycleCORBA::killOmniNames()
  *
  *  \param params         machine parameters like type or name...
  *  \param componentName  the name of component class
- *  \param studyId        default = 0  : multistudy instance
  *  \param listOfMachines list of machine address
  *  \return a CORBA reference of the component instance, or _nil if not found
  */
@@ -649,7 +652,6 @@ Engines::EngineComponent_ptr
 SALOME_LifeCycleCORBA::
 _FindComponent(const Engines::ContainerParameters& params,
                const char *componentName,
-               int studyId,
                const Engines::ResourceList& listOfResources)
 {
   // --- build the list of machines on which the component is already running
@@ -700,7 +702,6 @@ _FindComponent(const Engines::ContainerParameters& params,
  *
  *  \param params         machine parameters like type or name...
  *  \param componentName  the name of component class
- *  \param studyId        default = 0  : multistudy instance
  *  \return a CORBA reference of the component instance, or _nil if problem
  */
 //=============================================================================
@@ -708,8 +709,7 @@ _FindComponent(const Engines::ContainerParameters& params,
 Engines::EngineComponent_ptr
 SALOME_LifeCycleCORBA::
 _LoadComponent(const Engines::ContainerParameters& params,
-              const char *componentName,
-              int studyId)
+              const char *componentName)
 {
   MESSAGE("_LoadComponent, required " << params.container_name <<
           " " << componentName << " " << NbProc(params));
@@ -730,7 +730,7 @@ _LoadComponent(const Engines::ContainerParameters& params,
   CORBA::string_free(reason);
 
   Engines::EngineComponent_var myInstance =
-    cont->create_component_instance(componentName, studyId);
+    cont->create_component_instance(componentName);
   return myInstance._retn();
 }
 
@@ -739,14 +739,12 @@ _LoadComponent(const Engines::ContainerParameters& params,
  *
  *  \param params         machine parameters like type or name...
  *  \param componentName  the name of component class
- *  \param studyId        default = 0  : multistudy instance
  *  \return a CORBA reference of the parallel component instance, or _nil if problem
  */
 //=============================================================================
 Engines::EngineComponent_ptr
 SALOME_LifeCycleCORBA::Load_ParallelComponent(const Engines::ContainerParameters& params,
-                                              const char *componentName,
-                                              int studyId)
+                                              const char *componentName)
 {
   MESSAGE("Entering LoadParallelComponent");
 
@@ -782,7 +780,7 @@ SALOME_LifeCycleCORBA::Load_ParallelComponent(const Engines::ContainerParameters
   // @PARALLEL@ permits to identify that the component requested
   // is a parallel component.
   std::string name = std::string(componentName);
-  Engines::EngineComponent_var myInstance = cont->create_component_instance(name.c_str(), studyId);
+  Engines::EngineComponent_var myInstance = cont->create_component_instance(name.c_str());
   if (CORBA::is_nil(myInstance))
     INFOS("create_component_instance returns a NULL component !");
   return myInstance._retn();
@@ -823,7 +821,7 @@ void SALOME_LifeCycleCORBA::copyFile(const char* hostSrc, const char* fileSrc, c
  *
  *  \return the naming service
  */
-SALOME_NamingService * SALOME_LifeCycleCORBA::namingService()
+SALOME_NamingService_Abstract * SALOME_LifeCycleCORBA::namingService()
 {
   return _NS;
 }
@@ -834,5 +832,8 @@ SALOME_NamingService * SALOME_LifeCycleCORBA::namingService()
  */
 CORBA::ORB_ptr SALOME_LifeCycleCORBA::orb()
 {
-  return _NS->orb();
+  SALOME_NamingService *NSC = dynamic_cast<SALOME_NamingService *>(_NS);
+  if(!_NS)
+    THROW_SALOME_EXCEPTION("SALOME_LifeCycleCORBA::orb : not a CORBA SALOME_NamingService ");
+  return NSC->orb();
 }