Salome HOME
Remove StandaloneLifecyle to reduce code divergence between SSL and classical. It...
[modules/kernel.git] / src / LifeCycleCORBA / SALOME_LifeCycleCORBA.cxx
index a6f1d9a5745c4b4224e4f815fae1ebe14bc4f089..d8e39f3efd4bdc1f3f01e3c56d6ddc7e6a6180b2 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2019  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,16 +83,13 @@ 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;
+  _NSnew = nullptr;
   if (!ns)
     {
       _NS = new SALOME_NamingService(orb);
@@ -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);
+  }
 }
 
 //=============================================================================
@@ -151,7 +152,7 @@ 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();
     }
@@ -191,7 +192,7 @@ 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();
     }
@@ -233,7 +234,7 @@ 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();
     }
@@ -277,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);
@@ -420,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)
@@ -448,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
     }
@@ -469,8 +470,9 @@ void SALOME_LifeCycleCORBA::shutdownServers()
       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
     }
@@ -487,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
     }
@@ -497,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));
@@ -505,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
     }
@@ -535,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;
@@ -807,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;
 }
@@ -818,5 +832,15 @@ 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();
+}
+
+#include "SALOME_Fake_NamingService.hxx"
+
+SALOME_LifeCycleCORBASSL::SALOME_LifeCycleCORBASSL():SALOME_LifeCycleCORBA(new SALOME_Fake_NamingService)
+{
+  _NSnew = _NS;//give to SALOME_LifeCycleCORBA owenership of _NS
 }