]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
*** empty log message ***
authorribes <ribes>
Thu, 25 Oct 2007 08:02:07 +0000 (08:02 +0000)
committerribes <ribes>
Thu, 25 Oct 2007 08:02:07 +0000 (08:02 +0000)
73 files changed:
bin/Makefile.am
bin/appliskel/killCurrentPort
bin/appliskel/runRemote.sh
bin/launchConfigureParser.py
bin/orbmodule.py
bin/runSalome.py
bin/setenv.py
bin/shutdownSalome.py [new file with mode: 0755]
bin/waitContainers.py [new file with mode: 0755]
bin/waitNS.py [new file with mode: 0755]
configure.ac
idl/SALOMEDS.idl
idl/SALOME_ContainerManager.idl
idl/SALOME_Registry.idl
resources/CatalogResources.xml.in
salome_adm/unix/config_files/Makefile.am
salome_adm/unix/config_files/check_cppunit.m4
salome_adm/unix/config_files/check_libxml.m4 [new file with mode: 0644]
salome_adm/unix/config_files/check_mpi.m4
src/Batch/BatchLight_BatchManager.cxx [new file with mode: 0644]
src/Batch/BatchLight_BatchManager.hxx [new file with mode: 0644]
src/Batch/BatchLight_BatchManager_PBS.cxx [new file with mode: 0644]
src/Batch/BatchLight_BatchManager_PBS.hxx [new file with mode: 0644]
src/Batch/BatchLight_BatchManager_SLURM.cxx [new file with mode: 0644]
src/Batch/BatchLight_BatchManager_SLURM.hxx [new file with mode: 0644]
src/Batch/BatchLight_Job.cxx [new file with mode: 0644]
src/Batch/BatchLight_Job.hxx [new file with mode: 0644]
src/Batch/Makefile.am
src/Batch/MpiImpl.cxx [new file with mode: 0644]
src/Batch/MpiImpl.hxx [new file with mode: 0644]
src/Container/Container_i.cxx
src/Container/Makefile.am
src/Container/SALOME_ContainerManager.cxx
src/Container/SALOME_ContainerManager.hxx
src/Container/SALOME_ContainerManagerServer.cxx [deleted file]
src/Container/TestContainerManager.cxx [deleted file]
src/DSC/DSC_User/Datastream/Calcium/CalciumInterface.hxx
src/Launcher/Makefile.am [new file with mode: 0644]
src/Launcher/SALOME_Launcher.cxx [new file with mode: 0644]
src/Launcher/SALOME_Launcher.hxx [new file with mode: 0644]
src/Launcher/SALOME_LauncherServer.cxx [new file with mode: 0644]
src/LifeCycleCORBA/Makefile.am
src/LifeCycleCORBA/SALOME_FileTransferCORBA.cxx
src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx
src/LifeCycleCORBA/SALOME_LifeCycleCORBA.hxx
src/LifeCycleCORBA/Test/LifeCycleCORBATest.cxx
src/LifeCycleCORBA/Test/TestLifeCycleCORBA.py
src/LifeCycleCORBA/TestContainerManager.cxx [new file with mode: 0644]
src/LifeCycleCORBA_SWIG/Test/TestLifeCycleCORBA_SWIG.py
src/Makefile.am
src/ModuleCatalog/Makefile.am
src/ModuleCatalog/SALOME_ModuleCatalog_Handler.cxx
src/ModuleCatalog/SALOME_ModuleCatalog_Handler.hxx
src/ModuleCatalog/SALOME_ModuleCatalog_Server.cxx
src/ModuleCatalog/SALOME_ModuleCatalog_impl.cxx
src/ModuleCatalog/SALOME_ModuleCatalog_impl.hxx
src/NamingService/SALOME_NamingService.cxx
src/Registry/RegistryService.cxx
src/Registry/RegistryService.hxx
src/Registry/SALOME_Registry_Server.cxx
src/ResourcesManager/Makefile.am
src/ResourcesManager/SALOME_LoadRateManager.cxx
src/ResourcesManager/SALOME_LoadRateManager.hxx
src/ResourcesManager/SALOME_ResourcesCatalog_Handler.cxx
src/ResourcesManager/SALOME_ResourcesCatalog_Handler.hxx
src/ResourcesManager/SALOME_ResourcesCatalog_Parser.cxx
src/ResourcesManager/SALOME_ResourcesCatalog_Parser.hxx
src/ResourcesManager/SALOME_ResourcesManager.cxx
src/ResourcesManager/SALOME_ResourcesManager.hxx
src/SALOMEDS/SALOMEDS_StudyManager_i.hxx
src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.cxx
src/SALOMELocalTrace/LocalTraceBufferPool.hxx
src/UnitTests/UnitTests.py

index 827b9ec381442cf8c3bcbbf7e1d12532f26a3786..89cd91071b3ec7a8c51e1ea83c97a5522f32051b 100644 (file)
@@ -61,8 +61,10 @@ dist_salomescript_SCRIPTS=\
        setenv.py \
        launchSalome.py \
        nameserver.py \
-        server.py
-
+        server.py \
+       waitNS.py \
+       waitContainers.py \
+       shutdownSalome.py
 
 EXTRA_DIST = appliskel
 
index e1eb19268841407a2ff193bcd24ab5147497697f..41b14866a4f940b78bfebfd26bb6cd023af2c175 100755 (executable)
@@ -21,7 +21,7 @@ currentPort=`${KERNEL_ROOT_DIR}/bin/salome/NSparam.py port`
 echo $currentPort
 
 # --- kill current salome session
-
+${KERNEL_ROOT_DIR}/bin/salome/shutdownSalome.py
 ${KERNEL_ROOT_DIR}/bin/salome/killSalomeWithPort.py $currentPort
 
 # --- delete config files
index 3cbfbf55c61baf0e9382588283e3d39ccf74eb06..21bc0b0c1202950e93df018c65ff5fe3c83ae752 100755 (executable)
@@ -63,4 +63,6 @@ echo "ORBInitRef $initref" > $OMNIORB_CONFIG
 
 shift 2
 
-${KERNEL_ROOT_DIR}/bin/salome/envSalome.py /bin/sh --rcfile $HOME/$APPLI/.bashrc -c "$*"
+# suppress --rcfile option because of problem on Mandriva2006 - B Secher mai 2007
+#${KERNEL_ROOT_DIR}/bin/salome/envSalome.py /bin/sh --rcfile $HOME/$APPLI/.bashrc -c "$*"
+${KERNEL_ROOT_DIR}/bin/salome/envSalome.py /bin/sh -c "$*"
index bfe414300e6938081f674a8f6d9fb597388cc2e8..51d16de1569c17caf9b26171e98f65cccfafeaf0 100755 (executable)
@@ -50,6 +50,7 @@ interp_nam     = "interp"
 except_nam     = "noexcepthandler"
 terminal_nam   = "terminal"
 pinter_nam     = "pinter"
+batch_nam      = "batch"
 
 # values in XML configuration file giving specific module parameters (<module_name> section)
 # which are stored in opts with key <module_name>_<parameter> (eg SMESH_plugins)
@@ -390,6 +391,13 @@ def CreateOptionParser (theAdditionalOptions=[]):
                           dest="gui",
                           help=help_str)
 
+    help_str = "Launch in Batch Mode. (Without GUI on batch machine)"
+    o_b = optparse.Option("-b",
+                          "--batch",
+                          action="store_true",
+                          dest="batch",
+                          help=help_str)
+
     help_str = "Launch in GUI mode [default]."
     o_g = optparse.Option("-g",
                           "--gui",
@@ -581,6 +589,7 @@ def CreateOptionParser (theAdditionalOptions=[]):
     # All options
     opt_list = [o_t,o_g, # GUI/Terminal
                 o_d,o_o, # Desktop
+                o_b,     # Batch
                 o_l,o_f, # Use logger or log-file
                 o_u,     # Execute python scripts
                 o_r,     # Configuration XML file
@@ -775,9 +784,14 @@ def get_env(theAdditionalOptions=[], appname="SalomeApp"):
 
     # GUI/Terminal, Desktop, Splash, STUDY_HDF
     args["session_gui"] = False
+    args[batch_nam] = False
     args["study_hdf"] = None
+    print 'launchConfigureParser cmd_opts',cmd_opts
     if cmd_opts.gui is not None:
         args[gui_nam] = cmd_opts.gui
+    if cmd_opts.batch is not None:
+        args[batch_nam] = True
+    print 'launchConfigureParser args[',batch_nam,']',args[batch_nam]
     if args[gui_nam]:
         args["session_gui"] = True
         if cmd_opts.desktop is not None:
index f629aa847bdea4c4316cff5db044d8eb78dec245..7de5715c1c6f6ed53982ca38626f5686b8679763 100755 (executable)
@@ -15,7 +15,7 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 # 
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-# 
+#
 import sys,os,time
 import string
 from nameserver import *
index 4cfcf15024938de1f9c17bcca70b3df84756ac59..86a25107538ae3a79f3852866b044680277fc72c 100755 (executable)
@@ -300,11 +300,11 @@ class SessionServer(Server):
       
 # ---
 
-class ContainerManagerServer(Server):
+class LauncherServer(Server):
     def __init__(self,args):
         self.args=args
         self.initArgs()
-        self.SCMD1=['SALOME_ContainerManagerServer']
+        self.SCMD1=['SALOME_LauncherServer']
         self.SCMD2=[]
         if args["gui"] :
             if 'registry' in self.args['embedded']:
@@ -467,10 +467,10 @@ def startSalome(args, modules_list, modules_root_dir):
           clt.waitNSPID("/myStudyManager",myServer.PID)
 
     #
-    # Lancement ContainerManagerServer
+    # Lancement LauncherServer
     #
     
-    myCmServer = ContainerManagerServer(args)
+    myCmServer = LauncherServer(args)
     myCmServer.setpath(modules_list,modules_root_dir)
     myCmServer.run()
 
@@ -497,7 +497,7 @@ def startSalome(args, modules_list, modules_root_dir):
     # attente de la disponibilite du Container C++ local dans le Naming Service
     #
 
-    if ('cppContainer' in args['standalone']) | (args["gui"] == 0):
+    if ('cppContainer' in args['standalone']) | (args["gui"] == 0) : 
         myServer=ContainerCPPServer(args)
         myServer.run()
         if sys.platform == "win32":
@@ -660,6 +660,7 @@ def useSalome(args, modules_list, modules_root_dir):
         i = 0
         while i < len( toimport ) :
             if toimport[ i ] == 'killall':
+                clt.showNS()
                 killAllPorts()
                 import sys
                 sys.exit(0)
@@ -809,6 +810,8 @@ def no_main():
 def main():
     """Salome launch as a main application"""
     import sys
+    print "runSalome running on ",os.getenv('HOSTNAME')
+    print os.environ.itervalues
     args, modules_list, modules_root_dir = setenv.get_config()
     kill_salome(args)
     save_config = True
index 1478c38f7808c6c06f692ade9bd42f5c8a449495..a01918144ec52e71086a3e668267c99f99b04ecd 100755 (executable)
@@ -158,6 +158,10 @@ def set_env(args, modules_list, modules_root_dir):
     
     python_version="python%d.%d" % sys.version_info[0:2]
     modules_root_dir_list = []
+    os.putenv('SALOME_BATCH','0')
+    if args["batch"] :
+        os.putenv('SALOME_BATCH','1')
+    print 'SALOME_BATCH :',os.getenv('SALOME_BATCH')
     if args["gui"] :
         modules_list = modules_list[:] + ["GUI"] 
     modules_list = modules_list[:] + ["KERNEL"] 
diff --git a/bin/shutdownSalome.py b/bin/shutdownSalome.py
new file mode 100755 (executable)
index 0000000..0c96154
--- /dev/null
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+import orbmodule
+import Engines
+import Registry
+import SALOME
+import SALOMEDS
+import SALOME_ModuleCatalog
+clt=orbmodule.client()
+obj = clt.Resolve('Kernel/Session')
+if obj != None:
+  ses = obj._narrow(SALOME.Session)
+  ses.StopSession()
+obj = clt.Resolve('SalomeLauncher')
+if obj != None:
+  cm = obj._narrow(Engines.SalomeLauncher)
+  cm.Shutdown()
+obj = clt.Resolve('Kernel/ModulCatalog')
+if obj != None:
+  mc = obj._narrow(SALOME_ModuleCatalog.ModuleCatalog)
+  mc.shutdown()
+obj = clt.Resolve('Registry')
+if obj != None:
+  reg = obj._narrow(Registry.Components)
+  reg.Shutdown()
+obj = clt.Resolve('myStudyManager')
+if obj != None:
+  sm = obj._narrow(SALOMEDS.StudyManager)
+  sm.Shutdown()
diff --git a/bin/waitContainers.py b/bin/waitContainers.py
new file mode 100755 (executable)
index 0000000..65198a3
--- /dev/null
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+import sys
+import time
+import orbmodule
+import CosNaming
+clt = orbmodule.client()
+clt.waitNS("/ContainerManager")
+obj = clt.orb.resolve_initial_references("NameService")
+rootContext = obj._narrow(CosNaming.NamingContext)
+cname = []
+cname.append(CosNaming.NameComponent('Containers', 'dir'))
+
+while(1):
+  try:
+    ccontext = rootContext.resolve(cname)
+    break
+  except CosNaming.NamingContext.NotFound, ex:
+    time.sleep(1)
+  except CosNaming.NamingContext.InvalidName, ex:
+    time.sleep(1)
+  except CosNaming.NamingContext.CannotProceed, ex:
+    time.sleep(1)
+  except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE):
+    time.sleep(1)
+
+def waitContainer(mycont):
+  while(1):
+    bl,bi=ccontext.list(0)
+    if bi is not None:
+      ok,b=bi.next_one()
+      while(ok):
+        for s in b.binding_name :
+          if s.kind == "dir":
+            obj=ccontext.resolve([s])
+            scontext = obj._narrow(CosNaming.NamingContext)
+            bll,bii=scontext.list(0)
+            if bii is not None:
+              ok,bb=bii.next_one()
+              while(ok):
+                for s in bb.binding_name :
+                   if s.id == mycont:
+                     print s.id
+                     return
+                ok,bb=bii.next_one()
+        ok,b=bi.next_one()
+    sys.stdout.write('+')
+    sys.stdout.flush()
+    time.sleep(1)
+
+for cont in sys.argv:
+  if cont != sys.argv[0]:
+    waitContainer(cont)
+
diff --git a/bin/waitNS.py b/bin/waitNS.py
new file mode 100755 (executable)
index 0000000..e439f5f
--- /dev/null
@@ -0,0 +1,4 @@
+#!/usr/bin/env python
+import orbmodule
+clt=orbmodule.client()
+clt.waitNS("/Kernel/ModulCatalog")
index 3347624821dda4f2ce9ebf877f885061df5bf9d6..af68c9a399850ffb5078c56da983a4d396f1ac38 100644 (file)
@@ -244,20 +244,20 @@ AC_SUBST_FILE(CORBA)
 
 echo
 echo ---------------------------------------------
-echo Testing QT
+echo BOOST Library
 echo ---------------------------------------------
 echo
-# Qt must be kept because kernel makes use of qxml and some other
-# non-graphical stuff.
-CHECK_QT
+
+CHECK_BOOST
 
 echo
 echo ---------------------------------------------
-echo BOOST Library
+echo Testing libxml2
 echo ---------------------------------------------
 echo
 
-CHECK_BOOST
+CHECK_LIBXML
+
 
 fi 
 # --- end test corba
@@ -434,7 +434,7 @@ summary $basic_mandatory_products
 check_fatal_error $basic_mandatory_products
 echo
 
-corba_mandatory_products="omniORB_ok qt_ok boost_ok"
+corba_mandatory_products="omniORB_ok boost_ok"
 if test x$corba_gen = xtrue; then
   echo --- CORBA mandatory products - default configuration:
   summary $corba_mandatory_products
@@ -570,6 +570,7 @@ AC_OUTPUT([ \
        ./src/GenericObj/Makefile \
        ./src/HDFPersist/Makefile \
        ./src/KERNEL_PY/Makefile \
+       ./src/Launcher/Makefile \
        ./src/LifeCycleCORBA/Makefile \
        ./src/LifeCycleCORBA/Test/Makefile \
        ./src/LifeCycleCORBA_SWIG/Makefile \
index 541740fd13c512eca6493e118a5feb996dd4fac2..f4aea4bab6b862f79d05fee98510229514a72c86 100644 (file)
@@ -714,6 +714,8 @@ Searches for a definite %SObject with a definite GUID and returns True if it fin
 */
     void ping();
 
+    void Shutdown();
+
 /*! \brief Creation of a new study
 
      Creates a new study with a definite name.
index 84ec3c79403f79e895746756cde16beb30260438..fe770071256a821440ba9b32ee75bb7b84395200 100644 (file)
@@ -27,29 +27,39 @@ module Engines
 {
 
 /*!
-    Type to describe properties of wanted resource.
+    Type to transmit list of machines.
+*/
+  typedef sequence<string> MachineList;
+  typedef sequence<string> CompoList;
+  typedef sequence<string> FilesList;
+  typedef sequence<string> ModulesList;
+
+/*!
+    Type to describe properties of resource.
 */
 struct MachineParameters
 {
   string container_name;
   string hostname;
+  string alias;
+  string protocol;
+  string username;
+  string applipath;
+  ModulesList modList;
   string OS;
   long mem_mb;
   long cpu_clock;
   long nb_proc_per_node;
   long nb_node;
   boolean isMPI;
+  string mpiImpl;
+  string batch;
 
   // PaCO specific informations
   string parallelLib;
   long nb_component_nodes;
 };
 
-/*!
-    Type to transmit list of machines.
-*/
-  typedef sequence<string> MachineList;
-
 /*!
     exception thrown if a computer is not found in the catalog
 */
@@ -58,6 +68,25 @@ struct MachineParameters
   enum policy {P_FIRST,P_CYCL,P_BEST};
   typedef policy ResPolicy;
 
+/*! \brief Interface of the %salomelauncher
+    This interface is used for interaction with the unique instance
+    of SalomeLauncher
+*/
+  interface SalomeLauncher
+  {
+    long submitSalomeJob( in string fileToExecute,
+                         in FilesList filesToExport,
+                         in FilesList filesToImport,
+                         in long NumberOfProcessors,
+                         in MachineParameters params ) raises (SALOME::SALOME_Exception);
+    string querySalomeJob( in long jobId, in MachineParameters params ) raises (SALOME::SALOME_Exception);
+    void deleteSalomeJob( in long jobId, in MachineParameters params ) raises (SALOME::SALOME_Exception);
+    void getResultSalomeJob( in string directory, in long jobId, in MachineParameters params ) raises (SALOME::SALOME_Exception);
+
+    void Shutdown();
+
+  } ;
+  
 /*! \brief Interface of the %containerManager
     This interface is used for interaction with the unique instance
     of ContainerManager
@@ -79,17 +108,30 @@ struct MachineParameters
                                            in MachineList possibleComputers);
 
     Container StartContainer( in MachineParameters params,
-                             in ResPolicy policy);
+                             in ResPolicy policy,
+                             in CompoList componentList );
 
+    Container GiveContainer( in MachineParameters params,
+                            in ResPolicy policy,
+                            in CompoList componentList );
+
+    void ShutdownContainers();
+  } ;
+  
+/*! \brief Interface of the %resourcesManager
+    This interface is used for interaction with the unique instance
+    of ResourcesManager
+*/
+  interface ResourcesManager
+  {
     string FindFirst(in MachineList possibleComputers);
 
     MachineList GetFittingResources( in MachineParameters params,
-                                    in string componentName )
+                                    in CompoList componentList )
       raises (SALOME::SALOME_Exception);
 
-    void Shutdown();
+    MachineParameters GetMachineParameters( in string hostname );
 
-    void ShutdownContainers();
   } ;
 };
   
index e33e2ccd11b6f43a23273877d00c9ce2cc5b1e91..8e44332155fb38b77937c111677e1076811ec763 100644 (file)
@@ -55,6 +55,7 @@ module Registry
                AllInfos history () ;
                oneway void end() ;
                oneway void hello( in unsigned long id ) ;
+               void Shutdown();
        } ;
 } ;
 
index c83cafac53f7e1e8dea1e99ec4c8002fe8708baf..874d32492f1d158e325475ae32baf477440f96f4 100644 (file)
@@ -1,48 +1,43 @@
 <!DOCTYPE ResourcesCatalog>
 <resources>
 
-<machine hostname="is111790" OS="LINUX" CPUFreqMHz="2992" memInMB="1024" protocol="r" mode="i" nbOfNodes="1" nbOfProcPerNode="1" preReqFilePath="/home/secher/SALOME2_INSTALL/KERNEL_INSTALL/salome.sh" >
-<modules modulePath="/home/secher/SALOME2_INSTALL/KERNEL_INSTALL" moduleName="KERNEL" />
-<modules modulePath="/export/home/LGLS/Products/MED_@VERSION@" moduleName="MED" />
-<modules modulePath="/export/home/LGLS/Products/GEOM_@VERSION@" moduleName="GEOM" />
-<modules modulePath="/export/home/LGLS/Products/SMESH_@VERSION@" moduleName="SMESH" />
-<modules modulePath="/export/home/LGLS/Products/SUPERV_@VERSION@" moduleName="SUPERV" />
-<modules modulePath="/export/home/LGLS/Products/VISU_@VERSION@" moduleName="VISU" />
-<modules modulePath="/home/secher/SALOME2_INSTALL/MYCOMPO_INSTALL" moduleName="MYCOMPO" />
-<modules modulePath="/home/secher/SALOME2_INSTALL/MYMPICOMPO_INSTALL" moduleName="MYMPICOMPO" />
+<machine hostname="is111918" OS="LINUX" CPUFreqMHz="2992" memInMB="1024" protocol="r" mode="i" nbOfNodes="1" nbOfProcPerNode="1" preReqFilePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/env_products.sh" >
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/KERNEL_3.2.6" moduleName="KERNEL" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/MED_3.2.6" moduleName="MED" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/GEOM_3.2.6" moduleName="GEOM" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/SMESH_3.2.6" moduleName="SMESH" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/SUPERV_3.2.6" moduleName="SUPERV" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/VISU_3.2.6" moduleName="VISU" />
 </machine>
 
-<machine hostname="is111915" OS="LINUX" CPUFreqMHz="2992" memInMB="1024" protocol="r" mode="i" nbOfNodes="1" nbOfProcPerNode="1" preReqFilePath="/home/secher/SALOME2_INSTALL/KERNEL_INSTALL/salome.sh" >
-<modules modulePath="/home/secher/SALOME2_INSTALL/KERNEL_INSTALL" moduleName="KERNEL" />
-<modules modulePath="/export/home/LGLS/Products/MED_@VERSION@" moduleName="MED" />
-<modules modulePath="/export/home/LGLS/Products/GEOM_@VERSION@" moduleName="GEOM" />
-<modules modulePath="/export/home/LGLS/Products/SMESH_@VERSION@" moduleName="SMESH" />
-<modules modulePath="/export/home/LGLS/Products/SUPERV_@VERSION@" moduleName="SUPERV" />
-<modules modulePath="/export/home/LGLS/Products/VISU_@VERSION@" moduleName="VISU" />
-<modules modulePath="/home/secher/SALOME2_INSTALL/MYCOMPO_INSTALL" moduleName="MYCOMPO" />
-<modules modulePath="/home/secher/SALOME2_INSTALL/MYMPICOMPO_INSTALL" moduleName="MYMPICOMPO" />
+<machine hostname="is102430" OS="LINUX" CPUFreqMHz="2992" memInMB="1024" protocol="r" mode="i" nbOfNodes="1" nbOfProcPerNode="1" preReqFilePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/env_products.sh" >
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/KERNEL_3.2.6" moduleName="KERNEL" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/MED_3.2.6" moduleName="MED" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/GEOM_3.2.6" moduleName="GEOM" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/SMESH_3.2.6" moduleName="SMESH" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/SUPERV_3.2.6" moduleName="SUPERV" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/VISU_3.2.6" moduleName="VISU" />
 </machine>
 
-<machine hostname="is111918" OS="LINUX" CPUFreqMHz="2992" memInMB="1024" protocol="r" mode="i" nbOfNodes="1" nbOfProcPerNode="1" preReqFilePath="/home/secher/SALOME2_INSTALL/KERNEL_INSTALL/salome.sh" >
-<modules modulePath="/home/secher/SALOME2_INSTALL/KERNEL_INSTALL" moduleName="KERNEL" />
-<modules modulePath="/export/home/LGLS/Products/MED_@VERSION@" moduleName="MED" />
-<modules modulePath="/export/home/LGLS/Products/GEOM_@VERSION@" moduleName="GEOM" />
-<modules modulePath="/export/home/LGLS/Products/SMESH_@VERSION@" moduleName="SMESH" />
-<modules modulePath="/export/home/LGLS/Products/SUPERV_@VERSION@" moduleName="SUPERV" />
-<modules modulePath="/export/home/LGLS/Products/VISU_@VERSION@" moduleName="VISU" />
-<modules modulePath="/home/secher/SALOME2_INSTALL/MYCOMPO_INSTALL" moduleName="MYCOMPO" />
-<modules modulePath="/home/secher/SALOME2_INSTALL/MYMPICOMPO_INSTALL" moduleName="MYMPICOMPO" />
+<machine hostname="is125604" OS="LINUX" CPUFreqMHz="2992" memInMB="1024" protocol="r" mode="i" nbOfNodes="1" nbOfProcPerNode="1" preReqFilePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/env_products.sh" >
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/KERNEL_3.2.6" moduleName="KERNEL" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/MED_3.2.6" moduleName="MED" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/GEOM_3.2.6" moduleName="GEOM" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/SMESH_3.2.6" moduleName="SMESH" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/SUPERV_3.2.6" moduleName="SUPERV" />
+<modules modulePath="/data/tmplgls/rahuel/YACS/Salome_3.2.6pre4/VISU_3.2.6" moduleName="VISU" />
 </machine>
 
-<machine hostname="is111996" OS="LINUX" CPUFreqMHz="2992" memInMB="1024" protocol="r" mode="i" nbOfNodes="1" nbOfProcPerNode="1" preReqFilePath="/home/secher/SALOME2_INSTALL/KERNEL_INSTALL/salome.sh" >
-<modules modulePath="/home/secher/SALOME2_INSTALL/KERNEL_INSTALL" moduleName="KERNEL" />
-<modules modulePath="/export/home/LGLS/Products/MED_@VERSION@" moduleName="MED" />
-<modules modulePath="/export/home/LGLS/Products/GEOM_@VERSION@" moduleName="GEOM" />
-<modules modulePath="/export/home/LGLS/Products/SMESH_@VERSION@" moduleName="SMESH" />
-<modules modulePath="/export/home/LGLS/Products/SUPERV_@VERSION@" moduleName="SUPERV" />
-<modules modulePath="/export/home/LGLS/Products/VISU_@VERSION@" moduleName="VISU" />
-<modules modulePath="/home/secher/SALOME2_INSTALL/MYCOMPO_INSTALL" moduleName="MYCOMPO" />
-<modules modulePath="/home/secher/SALOME2_INSTALL/MYMPICOMPO_INSTALL" moduleName="MYMPICOMPO" />
+<machine hostname="tantal" alias="tantale.ccc.cea.fr" OS="LINUX" CPUFreqMHz="2992" memInMB="1024" protocol="s" mode="b" nbOfNodes="236" nbOfProcPerNode="4" appliPath="/workdir/rahuel/YACS/Salome_3.2.6pre4/env_products.sh" >
+<modules modulePath="/workdir/rahuel/YACS/Salome_3.2.6pre4/KERNEL_install" moduleName="KERNEL" />
+<modules modulePath="/workdir/rahuel/YACS/Salome_3.2.6pre4/MED_3.2.6" moduleName="MED" />
+<modules modulePath="/workdir/rahuel/YACS/Salome_3.2.6pre4/GEOM_3.2.6" moduleName="GEOM" />
+<modules modulePath="/workdir/rahuel/YACS/Salome_3.2.6pre4/SMESH_3.2.6" moduleName="SMESH" />
+<modules modulePath="/workdir/rahuel/YACS/Salome_3.2.6pre4/NETGENPLUGIN_3.2.6" moduleName="NETGENPLUGIN" />
+<modules modulePath="/workdir/rahuel/YACS/Salome_3.2.6pre4/NETGENPLUGIN_3.2.6" moduleName="NETGENPLUGIN" />
+<modules modulePath="/workdir/rahuel/YACS/Salome_3.2.6pre4/YACS_install" moduleName="YACS" />
+<modules modulePath="/workdir/rahuel/YACS/Salome_3.2.6pre4/SRHEOLEFCPP_install" moduleName="SRHEOLEFCPP" />
+<modules modulePath="/workdir/rahuel/YACS/Salome_3.2.6pre4/SRHEOLEF_install" moduleName="SRHEOLEF" />
 </machine>
 
 </resources>
index 2cd5f15ce61a9bd441700335e9555a1b4b0d8b64..bd95886a530e662cf4e53b593cb022d764c32266 100644 (file)
@@ -73,14 +73,14 @@ check_mpich.m4 \
 check_omniorb.m4 \
 check_opengl.m4 \
 check_openpbs.m4 \
-check_qt.m4 \
 check_sockets.m4 \
 check_swig.m4 \
 check_withihm.m4 \
 enable_pthreads.m4 \
 production.m4 \
 pyembed.m4 \
-python.m4
+python.m4 \
+check_libxml.m4
 
 dist_salome4depr_DATA=\
 $(DEPRECATED_FILES)
index 4029ea19017ac3ca5fc891dc51e108ffd100fcce..e78b4fa24aeb167aceba721cbff9ed29c056b058 100644 (file)
@@ -69,8 +69,7 @@ else
    AC_LANG_CPLUSPLUS
    CPPFLAGS_old=$CPPFLAGS
    CPPFLAGS="$CPPFLAGS -I$CPPUNIT_INCLUDES"
-   CPPFLAGS="$CPPFLAGS $QT_INCLUDES"
-
+   
    AC_CHECK_HEADER(cppunit/extensions/HelperMacros.h,cppunit_ok=yes,cppunit_ok=no) 
 
    CPPFLAGS=$CPPFLAGS_old
diff --git a/salome_adm/unix/config_files/check_libxml.m4 b/salome_adm/unix/config_files/check_libxml.m4
new file mode 100644 (file)
index 0000000..ad4841c
--- /dev/null
@@ -0,0 +1,53 @@
+AC_DEFUN([CHECK_LIBXML],[
+
+AC_CHECKING(for libxml library)
+
+AC_SUBST(LIBXML_INCLUDES)
+AC_SUBST(LIBXML_LIBS)
+
+LIBXML_INCLUDES=""
+LIBXML_LIBS=""
+
+libxml_ok=no
+
+LOCAL_INCLUDES=""
+LOCAL_LIBS=""
+
+if test "x$LIBXML_DIR" != "x"
+then
+  LOCAL_INCLUDES="-I$LIBXML_DIR/include/libxml2"
+  LOCAL_LIBS="-L$LIBXML_DIR/lib -lxml2"
+else
+  LOCAL_INCLUDES="-I/usr/include/libxml2"
+  LOCAL_LIBS="-lxml2"
+fi
+
+dnl libxml2 headers
+
+CPPFLAGS_old="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $LOCAL_INCLUDES"
+AC_CHECK_HEADER(libxml/parser.h,libxml_ok="yes",libxml_ok="no")
+CPPFLAGS="$CPPFLAGS_old"
+
+if  test "x$libxml_ok" = "xyes"
+then
+
+dnl libxml2 library
+
+  LIBS_old=$LIBS
+  LIBS="$LIBS $LOCAL_LIBS"
+  AC_CHECK_LIB(xml2,xmlInitParser,libxml_ok="yes",libxml_ok="no",)
+  LIBS=$LIBS_old
+fi
+
+if test "x$libxml_ok" = "xyes"
+then
+  LIBXML_INCLUDES="$LOCAL_INCLUDES"
+  LIBXML_LIBS="$LOCAL_LIBS"
+fi
+
+AC_MSG_RESULT(for libxml: $libxml_ok)
+
+])dnl
+dnl
+
index 69c0ed8549fa80cbecd31d51738a29768fc9d15a..6422c8b1d4d638883a89cf3f68ff184fe487a806 100644 (file)
@@ -24,6 +24,10 @@ AC_DEFUN([CHECK_MPI],[
 
 AC_REQUIRE([AC_PROG_CC])dnl
 
+AC_ARG_WITH(mpi_lib,
+   [AC_HELP_STRING([--with-mpi_lib=DIR],[directory path of MPICH lib installation])],
+   MPILIBREQUESTED="$withval")
+
 AC_ARG_WITH(mpi,
    [AC_HELP_STRING([--with-mpi=DIR],[root directory path of MPICH installation])],
    MPIREQUESTED="yes",MPIREQUESTED="no")
@@ -51,6 +55,10 @@ if test x"$MPIREQUESTED" = xyes; then
     fi
   fi
 
+  if test x"$MPILIBREQUESTED" != x; then
+    MPI_LIBS="-L$MPILIBREQUESTED"
+  fi
+
   CPPFLAGS_old="$CPPFLAGS"
   CPPFLAGS="$MPI_INCLUDES $CPPFLAGS"
   AC_CHECK_HEADER(mpi.h,WITHMPI="yes",WITHMPI="no")
@@ -69,7 +77,7 @@ if test x"$MPIREQUESTED" = xyes; then
 
   if test "$WITHMPI" = "yes";then
     mpi_ok=yes
-    MPI_LIBS="$MPI_LIBS -lmpi"
+    MPI_LIBS="$MPI_LIBS -lmpi -lmpio -lmpiCC"
   else
     mpi_ok=no
   fi
diff --git a/src/Batch/BatchLight_BatchManager.cxx b/src/Batch/BatchLight_BatchManager.cxx
new file mode 100644 (file)
index 0000000..4e0241f
--- /dev/null
@@ -0,0 +1,272 @@
+// Copyright (C) 2005  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
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+/*
+ * BatchManager.cxx : 
+ *
+ * Auteur : Bernard SECHER - CEA/DEN
+ * Date   : Juillet 2007
+ * Projet : SALOME
+ *
+ */
+
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <netdb.h>
+#include "BatchLight_Job.hxx"
+#include "BatchLight_BatchManager.hxx"
+#include "Batch_Date.hxx"
+using namespace std;
+
+namespace BatchLight {
+
+  // Constructeur
+  BatchManager::BatchManager(const batchParams& p) throw(SALOME_Exception) : _params(p)
+  {
+    SCRUTE(_params.hostname);
+    SCRUTE(_params.protocol);
+    SCRUTE(_params.username);
+    // On verifie que le hostname est correct
+    if (!gethostbyname(_params.hostname.c_str())) { // hostname unknown from network
+      string msg = "hostname \"";
+      msg += _params.hostname;
+      msg += "\" unknown from the network";
+      throw SALOME_Exception(msg.c_str());
+    }
+    _mpiImpl = NULL;
+  }
+
+  // Destructeur
+  BatchManager::~BatchManager()
+  {
+    MESSAGE("BatchManager destructor "<<_params.hostname);
+    std::map < int, const BatchLight::Job * >::const_iterator it;
+    for(it=_jobmap.begin();it!=_jobmap.end();it++)
+      delete it->second; 
+    if(_mpiImpl) delete _mpiImpl;
+  }
+
+  // Methode pour le controle des jobs : soumet un job au gestionnaire
+  const int BatchManager::submitJob(Job* job)
+  {
+    BEGIN_OF("BatchManager::submitJob");
+    int id;
+
+    // temporary directory on cluster to put input files for job
+    setDirForTmpFiles();
+    SCRUTE(_dirForTmpFiles);
+
+    // export input files on cluster
+    exportInputFiles(job->getFileToExecute(),job->getFilesToExportList());
+
+    // build salome coupling script for job
+    buildSalomeCouplingScript(job->getFileToExecute());
+
+    // build batch script for job
+    buildSalomeBatchScript(job->getNbProc());
+
+    // submit job on cluster
+    id = submit();
+
+    // register job on map
+    _jobmap[id] = job;
+    END_OF("BatchManager::submitJob");
+    return id;
+  }
+
+  void BatchManager::setDirForTmpFiles()
+  {
+    int i;
+
+    _dirForTmpFiles = string("Batch/");
+    Batch::Date date = Batch::Date(time(0)) ;
+    std::string thedate = date.str() ;
+    int lend = thedate.size() ;
+    i = 0 ;
+    while ( i < lend ) {
+      if ( thedate[i] == '/' || thedate[i] == '-' || thedate[i] == ':' ) {
+        thedate[i] = '_' ;
+      }
+      i++ ;
+    }
+    _dirForTmpFiles += thedate ;
+  }
+
+  void BatchManager::exportInputFiles(const char *fileToExecute, const Engines::FilesList filesToExportList) throw(SALOME_Exception)
+  {
+    BEGIN_OF("BatchManager::exportInFiles");
+    string command = _params.protocol;
+    int status;
+
+    command += " ";
+
+    if (_params.username != ""){
+      command += _params.username;
+      command += "@";
+    }
+
+    command += _params.hostname;
+    command += " \"mkdir -p ";
+    command += _dirForTmpFiles ;
+    command += "\"" ;
+    SCRUTE(command.c_str());
+    status = system(command.c_str());
+    if(status)
+      throw SALOME_Exception("Error of connection on remote host");    
+
+    if( _params.protocol == "rsh" )
+      command = "rcp ";
+    else if( _params.protocol == "ssh" )
+      command = "scp ";
+    else
+      throw SALOME_Exception("Unknown protocol");
+
+    command += fileToExecute;
+    command += " ";
+
+    if (_params.username != ""){
+      command += _params.username;
+      command += "@";
+    }
+
+    command += _params.hostname;
+    command += ":";
+    command += _dirForTmpFiles ;
+    SCRUTE(command.c_str());
+    status = system(command.c_str());
+    if(status)
+      throw SALOME_Exception("Error of connection on remote host");    
+    
+    int i ;
+    for ( i = 0 ; i < filesToExportList.length() ; i++ ) {
+      if( _params.protocol == "rsh" )
+       command = "rcp ";
+      else if( _params.protocol == "ssh" )
+       command = "scp ";
+      else
+       throw SALOME_Exception("Unknown protocol");
+      command += filesToExportList[i] ;
+      command += " ";
+      if (_params.username != ""){
+       command += _params.username;
+       command += "@";
+      }
+      command += _params.hostname;
+      command += ":";
+      command += _dirForTmpFiles ;
+      SCRUTE(command.c_str());
+      status = system(command.c_str());
+      if(status)
+       throw SALOME_Exception("Error of connection on remote host");    
+    }
+
+    END_OF("BatchManager::exportInFiles");
+  }
+
+  void BatchManager::importOutputFiles( const char *directory, const CORBA::Long jobId ) throw(SALOME_Exception)
+  {
+    BEGIN_OF("BatchManager::importOutputFiles");
+    string command;
+    int status;
+
+    const BatchLight::Job* myJob = _jobmap[jobId];
+    Engines::FilesList filesToImportList = myJob->getFilesToImportList();
+
+    for ( int i = 0 ; i < filesToImportList.length() ; i++ ) {
+      if( _params.protocol == "rsh" )
+       command = "rcp ";
+      else if( _params.protocol == "ssh" )
+       command = "scp ";
+      else
+       throw SALOME_Exception("Unknown protocol");
+      if (_params.username != ""){
+       command += _params.username;
+       command += "@";
+      }
+      command += _params.hostname;
+      command += ":";
+      command += filesToImportList[i] ;
+      command += " ";
+      command += directory;
+      SCRUTE(command.c_str());
+      status = system(command.c_str());
+      if(status)
+       throw SALOME_Exception("Error of connection on remote host");    
+    }
+
+    END_OF("BatchManager::importOutputFiles");
+  }
+
+  string BatchManager::BuildTemporaryFileName() const
+  {
+    //build more complex file name to support multiple salome session
+    char *temp = new char[19];
+    strcpy(temp, "/tmp/command");
+    strcat(temp, "XXXXXX");
+#ifndef WNT
+
+    mkstemp(temp);
+#else
+
+    char aPID[80];
+    itoa(getpid(), aPID, 10);
+    strcat(temp, aPID);
+#endif
+
+    string command(temp);
+    delete [] temp;
+    command += ".sh";
+    return command;
+  }
+
+  void BatchManager::RmTmpFile()
+  {
+    if (_TmpFileName != ""){
+      string command = "rm ";
+      command += _TmpFileName;
+      char *temp = strdup(command.c_str());
+      int lgthTemp = strlen(temp);
+      temp[lgthTemp - 3] = '*';
+      temp[lgthTemp - 2] = '\0';
+      system(temp);
+      free(temp);
+    }
+  }
+
+  MpiImpl *BatchManager::FactoryMpiImpl(string mpiImpl) throw(SALOME_Exception)
+  {
+    if(mpiImpl == "lam")
+      return new MpiImpl_LAM();
+    else if(mpiImpl == "mpich1")
+      return new MpiImpl_MPICH1();
+    else if(mpiImpl == "mpich2")
+      return new MpiImpl_MPICH2();
+    else if(mpiImpl == "openmpi")
+      return new MpiImpl_OPENMPI();
+    else if(mpiImpl == "indif")
+      throw SALOME_Exception("you must specify a mpi implementation in CatalogResources.xml file");
+    else{
+      ostringstream oss;
+      oss << mpiImpl << " : not yet implemented";
+      throw SALOME_Exception(oss.str().c_str());
+    }
+  }
+
+}
diff --git a/src/Batch/BatchLight_BatchManager.hxx b/src/Batch/BatchLight_BatchManager.hxx
new file mode 100644 (file)
index 0000000..a8ea006
--- /dev/null
@@ -0,0 +1,94 @@
+// Copyright (C) 2005  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
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+/*
+ * BatchManager.hxx : 
+ *
+ * Auteur : Bernard SECHER - CEA/DEN
+ * Date   : Juillet 2007
+ * Projet : SALOME
+ *
+ */
+
+#ifndef _BL_BATCHMANAGER_H_
+#define _BL_BATCHMANAGER_H_
+
+#include <vector>
+#include <map>
+#include <string>
+#include "Utils_SALOME_Exception.hxx"
+#include <SALOMEconfig.h>
+#include <stdlib.h>
+#include CORBA_CLIENT_HEADER(SALOME_ContainerManager)
+#include "MpiImpl.hxx"
+
+namespace BatchLight {
+
+  class Job;
+
+  struct batchParams{
+    std::string hostname; // serveur ou tourne le BatchManager
+    std::string protocol; // protocole d'acces au serveur: ssh ou rsh
+    std::string username; // username d'acces au serveur
+    std::string applipath; // path of apllication directory on server
+    std::vector<std::string> modulesList; // list of Salome modules installed on server
+    unsigned int nbnodes; // number of nodes on cluster
+    unsigned int nbprocpernode; // number of processors on each node
+    std::string mpiImpl; // mpi implementation
+  };
+
+  class BatchManager
+  {
+  public:
+    // Constructeur et destructeur
+    BatchManager(const batchParams& p) throw(SALOME_Exception); // connexion a la machine host
+    virtual ~BatchManager();
+
+    // Methodes pour le controle des jobs : virtuelles pures
+    const int submitJob(BatchLight::Job* job); // soumet un job au gestionnaire
+    virtual void deleteJob(const int & jobid) = 0; // retire un job du gestionnaire
+    virtual std::string queryJob(const int & jobid) = 0; // renvoie l'etat du job
+    void importOutputFiles( const char *directory, const CORBA::Long jobId ) throw(SALOME_Exception);
+
+  protected:
+    batchParams _params;
+    MpiImpl *_mpiImpl;
+
+    std::map <int,const BatchLight::Job *> _jobmap;
+    std::string _dirForTmpFiles; // repertoire temporaire sur le serveur
+    std::string _TmpFileName;
+    std::string _fileNameToExecute;
+
+    virtual int submit() throw(SALOME_Exception) = 0;
+    void setDirForTmpFiles();
+    void exportInputFiles( const char *fileToExecute, const Engines::FilesList filesToExportList ) throw(SALOME_Exception);
+    virtual void buildSalomeCouplingScript( const char *fileToExecute ) throw(SALOME_Exception) = 0;
+    virtual void buildSalomeBatchScript( const int nbproc ) throw(SALOME_Exception) = 0;
+
+    std::string BuildTemporaryFileName() const;
+    void RmTmpFile();
+    MpiImpl *FactoryMpiImpl(std::string mpiImpl) throw(SALOME_Exception);
+
+  private:
+
+  };
+
+}
+
+#endif
diff --git a/src/Batch/BatchLight_BatchManager_PBS.cxx b/src/Batch/BatchLight_BatchManager_PBS.cxx
new file mode 100644 (file)
index 0000000..d2856d8
--- /dev/null
@@ -0,0 +1,375 @@
+// Copyright (C) 2005  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
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+/*
+ * BatchManager.cxx : 
+ *
+ * Auteur : Bernard SECHER - CEA/DEN
+ * Date   : Juillet 2007
+ * Projet : SALOME
+ *
+ */
+
+#include "BatchLight_BatchManager_PBS.hxx"
+#include "utilities.h"
+#include "BatchLight_Job.hxx"
+#include <fstream>
+#include <iostream>
+#include <sstream>
+#include <sys/stat.h>
+
+using namespace std;
+
+namespace BatchLight {
+
+  // Constructeur
+  BatchManager_PBS::BatchManager_PBS(const batchParams& p) throw(SALOME_Exception) : BatchManager(p)
+  {
+    // pbs batch system needs to know mpi implementation
+    _mpiImpl = FactoryMpiImpl(_params.mpiImpl);
+  }
+
+  // Destructeur
+  BatchManager_PBS::~BatchManager_PBS()
+  {
+    MESSAGE("BatchManager_PBS destructor "<<_params.hostname);
+  }
+
+  // Methode pour le controle des jobs : retire un job du gestionnaire
+  void BatchManager_PBS::deleteJob(const int & jobid)
+  {
+    BEGIN_OF("BatchManager_PBS::deleteJob");
+    string command;
+    int status;
+    ostringstream oss;
+    oss << jobid;
+
+    // define command to submit batch
+    if( _params.protocol == "rsh" )
+      command = "rsh ";
+    else if( _params.protocol == "ssh" )
+      command = "ssh ";
+    else
+      throw SALOME_Exception("Unknown protocol");
+
+    if (_params.username != ""){
+      command += _params.username;
+      command += "@";
+    }
+
+    command += _params.hostname;
+    command += " \"qdel " ;
+    command += oss.str();
+    command += "\"";
+    SCRUTE(command.c_str());
+    status = system(command.c_str());
+    if(status)
+      throw SALOME_Exception("Error of connection on remote host");
+
+    MESSAGE("jobId = " << jobid << "killed");
+    END_OF("BatchManager_PBS::deleteJob");
+  }
+   
+  // Methode pour le controle des jobs : renvoie l'etat du job
+  string BatchManager_PBS::queryJob(const int & jobid)
+  {
+    BEGIN_OF("BatchManager_PBS::queryJob");
+    // define name of log file
+    string jstatus;
+    string logFile="/tmp/logs/";
+    logFile += getenv("USER");
+    logFile += "/batchSalome_";
+
+    srand ( time(NULL) );
+    int ir = rand();
+    ostringstream oss;
+    oss << ir;
+    logFile += oss.str();
+    logFile += ".log";
+
+    string command;
+    int status;
+
+    // define command to submit batch
+    if( _params.protocol == "rsh" )
+      command = "rsh ";
+    else if( _params.protocol == "ssh" )
+      command = "ssh ";
+    else
+      throw SALOME_Exception("Unknown protocol");
+
+    if (_params.username != ""){
+      command += _params.username;
+      command += "@";
+    }
+
+    command += _params.hostname;
+    command += " \"qstat -f " ;
+    ostringstream oss2;
+    oss2 << jobid;
+    command += oss2.str();
+    command += "\" > ";
+    command += logFile;
+    SCRUTE(command.c_str());
+    status = system(command.c_str());
+    if(status && status != 153 && status != 256*153){
+      MESSAGE("status="<<status);
+      throw SALOME_Exception("Error of connection on remote host");
+    }
+
+    if(status == 153 || status == 256*153 )
+      // If job is finished qstat command return 153 status
+      jstatus = "D";
+    else{
+      // read status of job in log file
+      char line[128];
+      ifstream fp(logFile.c_str(),ios::in);
+      
+      string sline;
+      int pos = string::npos;
+      while( (pos == string::npos) && fp.getline(line,80,'\n') ){
+       sline = string(line);
+       pos = sline.find("job_state");
+      };
+      
+      if(pos!=string::npos){
+       istringstream iss(sline);
+       iss >> jstatus;
+       iss >> jstatus;
+       iss >> jstatus;
+      }
+      else
+       jstatus = "U";
+    }
+
+    MESSAGE("jobId = " << jobid << " " << jstatus);
+    END_OF("BatchManager_PBS::queryJob");
+    return jstatus;
+  }
+
+  void BatchManager_PBS::buildSalomeCouplingScript( const char *fileToExecute ) throw(SALOME_Exception)
+  {
+    BEGIN_OF("BatchManager_PBS::buildSalomeCouplingScript");
+    int status;
+
+    string::size_type p1 = string(fileToExecute).find_last_of("/");
+    string::size_type p2 = string(fileToExecute).find_last_of(".");
+    _fileNameToExecute = string(fileToExecute).substr(p1+1,p2-p1-1);
+
+    _TmpFileName = BuildTemporaryFileName();
+    ofstream tempOutputFile;
+    tempOutputFile.open(_TmpFileName.c_str(), ofstream::out );
+    tempOutputFile << "#! /bin/sh -f" << endl ;
+    tempOutputFile << "cd " ;
+    tempOutputFile << _params.applipath << endl ;
+    tempOutputFile << "export PYTHONPATH=~/" ;
+    tempOutputFile << _dirForTmpFiles ;
+    tempOutputFile << ":$PYTHONPATH" << endl ;
+    tempOutputFile << "if test " ;
+    tempOutputFile << _mpiImpl->rank() ;
+    tempOutputFile << " = 0; then" << endl ;
+    tempOutputFile << "  ./runAppli --terminal --batch --modules=" ;
+    for ( int i = 0 ; i < _params.modulesList.size() ; i++ ) {
+      tempOutputFile << _params.modulesList[i] ;
+      if ( i != _params.modulesList.size()-1 )
+       tempOutputFile << "," ;
+    }
+    tempOutputFile << " --standalone=registry,study,moduleCatalog --killall &" << endl ;
+    tempOutputFile << "  for ((ip=1; ip < ";
+    tempOutputFile << _mpiImpl->size();
+    tempOutputFile << " ; ip++))" << endl;
+    tempOutputFile << "  do" << endl ;
+    tempOutputFile << "    arglist=\"$arglist YACS_Server_\"$ip" << endl ;
+    tempOutputFile << "  done" << endl ;
+    tempOutputFile << "  sleep 5" << endl ;
+    tempOutputFile << "  ./runSession waitContainers.py $arglist" << endl ;
+    tempOutputFile << "  ./runSession python ~/" << _dirForTmpFiles << "/" << _fileNameToExecute << ".py" << endl;
+    tempOutputFile << "  ./runSession killCurrentPort" << endl;
+    tempOutputFile << "else" << endl ;
+    tempOutputFile << "  sleep 5" << endl ;
+    tempOutputFile << "  ./runSession waitNS.py" << endl ;
+    tempOutputFile << "  ./runSession SALOME_Container 'YACS_Server_'";
+    tempOutputFile << _mpiImpl->rank() << endl ;
+    tempOutputFile << "fi" << endl ;
+    tempOutputFile.flush();
+    tempOutputFile.close();
+    chmod(_TmpFileName.c_str(), 0x1ED);
+    SCRUTE(_TmpFileName.c_str()) ;
+
+    string command;
+    if( _params.protocol == "rsh" )
+      command = "rcp ";
+    else if( _params.protocol == "ssh" )
+      command = "scp ";
+    else
+      throw SALOME_Exception("Unknown protocol");
+    
+    command += _TmpFileName;
+    command += " ";
+    if (_params.username != ""){
+      command += _params.username;
+      command += "@";
+    }
+    command += _params.hostname;
+    command += ":";
+    command += _dirForTmpFiles ;
+    command += "/runSalome_" ;
+    command += _fileNameToExecute ;
+    command += "_Batch.sh" ;
+    SCRUTE(_fileNameToExecute) ;
+    SCRUTE(command.c_str());
+    status = system(command.c_str());
+    if(status)
+      throw SALOME_Exception("Error of connection on remote host");    
+    RmTmpFile();
+    
+    END_OF("BatchManager_PBS::buildSalomeCouplingScript");
+  }
+
+  void BatchManager_PBS::buildSalomeBatchScript( const int nbproc ) throw(SALOME_Exception)
+  {
+    BEGIN_OF("BatchManager_PBS::buildSalomeBatchScript");
+    int status;
+
+    int nbmaxproc = _params.nbnodes * _params.nbprocpernode;
+    if( nbproc > nbmaxproc ){
+      MESSAGE(nbproc << " processors asked on a cluster of " << nbmaxproc << " processors");
+      throw SALOME_Exception("Too much processors asked for that cluster");
+    }
+
+    int nbnodes;
+    if( nbproc < _params.nbnodes )
+      nbnodes = nbproc;
+    else
+      nbnodes = _params.nbnodes;
+
+    _TmpFileName = BuildTemporaryFileName();
+    ofstream tempOutputFile;
+    tempOutputFile.open(_TmpFileName.c_str(), ofstream::out );
+
+    ostringstream filenameToExecute;
+    filenameToExecute << " ~/" << _dirForTmpFiles << "/runSalome_" << _fileNameToExecute << "_Batch.sh";
+
+    tempOutputFile << "#! /bin/sh -f" << endl ;
+    tempOutputFile << "#PBS -l nodes=" << nbnodes << endl ;
+    tempOutputFile << "#PBS -o ~/" << _dirForTmpFiles << "/runSalome.log${PBS_JOBID}" << endl ;
+    tempOutputFile << _mpiImpl->boot("${PBS_NODEFILE}",nbnodes);
+    tempOutputFile << _mpiImpl->run("${PBS_NODEFILE}",nbproc,filenameToExecute.str());
+    tempOutputFile << _mpiImpl->halt();
+    tempOutputFile.flush();
+    tempOutputFile.close();
+    chmod(_TmpFileName.c_str(), 0x1ED);
+    SCRUTE(_TmpFileName.c_str()) ;
+
+    string command;
+    if( _params.protocol == "rsh" )
+      command = "rcp ";
+    else if( _params.protocol == "ssh" )
+      command = "scp ";
+    else
+      throw SALOME_Exception("Unknown protocol");
+    command += _TmpFileName;
+    command += " ";
+    if (_params.username != ""){
+      command += _params.username;
+      command += "@";
+    }
+    command += _params.hostname;
+    command += ":";
+    command += _dirForTmpFiles ;
+    command += "/" ;
+    command += _fileNameToExecute ;
+    command += "_Batch.sh" ;
+    SCRUTE(command.c_str());
+    status = system(command.c_str());
+    if(status)
+      throw SALOME_Exception("Error of connection on remote host");    
+
+    RmTmpFile();
+    END_OF("BatchManager_PBS::buildSalomeBatchScript");
+    
+  }
+
+  int BatchManager_PBS::submit() throw(SALOME_Exception)
+  {
+    BEGIN_OF("BatchManager_PBS::submit");
+
+    // define name of log file
+    string logFile="/tmp/logs/";
+    logFile += getenv("USER");
+    logFile += "/batchSalome_";
+
+    srand ( time(NULL) );
+    int ir = rand();
+    ostringstream oss;
+    oss << ir;
+    logFile += oss.str();
+    logFile += ".log";
+
+    string command;
+    int status;
+
+    // define command to submit batch
+    if( _params.protocol == "rsh" )
+      command = "rsh ";
+    else if( _params.protocol == "ssh" )
+      command = "ssh ";
+    else
+      throw SALOME_Exception("Unknown protocol");
+
+    if (_params.username != ""){
+      command += _params.username;
+      command += "@";
+    }
+
+    command += _params.hostname;
+    command += " \"qsub " ;
+    command += _dirForTmpFiles ;
+    command += "/" ;
+    command += _fileNameToExecute ;
+    command += "_Batch.sh\" > ";
+    command += logFile;
+    SCRUTE(command.c_str());
+    status = system(command.c_str());
+    if(status)
+      throw SALOME_Exception("Error of connection on remote host");
+
+    // read id of submitted job in log file
+    char line[128];
+    FILE *fp = fopen(logFile.c_str(),"r");
+    fgets( line, 128, fp);
+    fclose(fp);
+    
+    string sline(line);
+    int pos = sline.find(".");
+    string strjob;
+    if(pos == string::npos)
+      strjob = sline;
+    else
+      strjob = sline.substr(0,pos);
+
+    int id;
+    istringstream iss(strjob);
+    iss >> id;
+
+    END_OF("BatchManager_PBS::submit");
+    return id;
+  }
+
+}
diff --git a/src/Batch/BatchLight_BatchManager_PBS.hxx b/src/Batch/BatchLight_BatchManager_PBS.hxx
new file mode 100644 (file)
index 0000000..e7e5789
--- /dev/null
@@ -0,0 +1,59 @@
+// Copyright (C) 2005  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
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+/*
+ * BatchManager.hxx : 
+ *
+ * Auteur : Bernard SECHER - CEA/DEN
+ * Date   : Juillet 2007
+ * Projet : SALOME
+ *
+ */
+
+#ifndef _BL_BATCHMANAGER_PBS_H_
+#define _BL_BATCHMANAGER_PBS_H_
+
+#include <string>
+#include "Utils_SALOME_Exception.hxx"
+#include "BatchLight_BatchManager.hxx"
+
+namespace BatchLight {
+
+  class Job;
+
+  class BatchManager_PBS : public BatchManager
+  {
+  public:
+    // Constructeur et destructeur
+    BatchManager_PBS(const batchParams& p) throw(SALOME_Exception); // connexion a la machine host
+    virtual ~BatchManager_PBS();
+
+    // Methodes pour le controle des jobs : virtuelles pures
+    void deleteJob(const int & jobid); // retire un job du gestionnaire
+    std::string queryJob(const int & jobid); // renvoie l'etat du job
+
+  private:
+    void buildSalomeCouplingScript( const char *fileToExecute ) throw(SALOME_Exception);
+    void buildSalomeBatchScript( const int nbproc ) throw(SALOME_Exception);
+    int submit() throw(SALOME_Exception);
+  };
+
+}
+
+#endif
diff --git a/src/Batch/BatchLight_BatchManager_SLURM.cxx b/src/Batch/BatchLight_BatchManager_SLURM.cxx
new file mode 100644 (file)
index 0000000..67c1ed6
--- /dev/null
@@ -0,0 +1,328 @@
+// Copyright (C) 2005  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
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+/*
+ * BatchManager.cxx : 
+ *
+ * Auteur : Bernard SECHER - CEA/DEN
+ * Date   : Juillet 2007
+ * Projet : SALOME
+ *
+ */
+
+#include "BatchLight_BatchManager_SLURM.hxx"
+#include "utilities.h"
+#include "BatchLight_Job.hxx"
+#include <fstream>
+#include <iostream>
+#include <sstream>
+#include <sys/stat.h>
+
+using namespace std;
+
+namespace BatchLight {
+
+  // Constructeur
+  BatchManager_SLURM::BatchManager_SLURM(const batchParams& p) throw(SALOME_Exception) : BatchManager(p)
+  {
+  }
+
+  // Destructeur
+  BatchManager_SLURM::~BatchManager_SLURM()
+  {
+    MESSAGE("BatchManager_SLURM destructor "<<_params.hostname);
+  }
+
+  // Methode pour le controle des jobs : retire un job du gestionnaire
+  void BatchManager_SLURM::deleteJob(const int & jobid)
+  {
+    BEGIN_OF("BatchManager_SLURM::deleteJob");
+    string command;
+    int status;
+    ostringstream oss;
+    oss << jobid;
+
+    // define command to submit batch
+    if( _params.protocol == "rsh" )
+      command = "rsh ";
+    else if( _params.protocol == "ssh" )
+      command = "ssh ";
+    else
+      throw SALOME_Exception("Unknown protocol");
+
+    if (_params.username != ""){
+      command += _params.username;
+      command += "@";
+    }
+
+    command += _params.hostname;
+    command += " \"bkill " ;
+    command += oss.str();
+    command += "\"";
+    SCRUTE(command.c_str());
+    status = system(command.c_str());
+    if(status)
+      throw SALOME_Exception("Error of connection on remote host");
+
+    MESSAGE("jobId = " << jobid << "killed");
+    END_OF("BatchManager_SLURM::deleteJob");
+  }
+   
+  // Methode pour le controle des jobs : renvoie l'etat du job
+  string BatchManager_SLURM::queryJob(const int & jobid)
+  {
+    BEGIN_OF("BatchManager_SLURM::queryJob");
+    // define name of log file
+    string logFile="/tmp/logs/";
+    logFile += getenv("USER");
+    logFile += "/batchSalome_";
+
+    srand ( time(NULL) );
+    int ir = rand();
+    ostringstream oss;
+    oss << ir;
+    logFile += oss.str();
+    logFile += ".log";
+
+    string command;
+    int status;
+
+    // define command to submit batch
+    if( _params.protocol == "rsh" )
+      command = "rsh ";
+    else if( _params.protocol == "ssh" )
+      command = "ssh ";
+    else
+      throw SALOME_Exception("Unknown protocol");
+
+    if (_params.username != ""){
+      command += _params.username;
+      command += "@";
+    }
+
+    command += _params.hostname;
+    command += " \"bjobs " ;
+    ostringstream oss2;
+    oss2 << jobid;
+    command += oss2.str();
+    command += "\" > ";
+    command += logFile;
+    SCRUTE(command.c_str());
+    status = system(command.c_str());
+    if(status)
+      throw SALOME_Exception("Error of connection on remote host");
+
+    // read staus of job in log file
+    char line[128];
+    ifstream fp(logFile.c_str(),ios::in);
+    fp.getline(line,80,'\n');
+    
+    string sjobid, username, jstatus;
+    fp >> sjobid;
+    fp >> username;
+    fp >> jstatus;
+
+    MESSAGE("jobId = " << jobid << " " << jstatus);
+    END_OF("BatchManager_SLURM::queryJob");
+    return jstatus;
+  }
+
+  void BatchManager_SLURM::buildSalomeCouplingScript( const char *fileToExecute ) throw(SALOME_Exception)
+  {
+    BEGIN_OF("BatchManager_SLURM::buildSalomeCouplingScript");
+    int status;
+
+    string::size_type p1 = string(fileToExecute).find_last_of("/");
+    string::size_type p2 = string(fileToExecute).find_last_of(".");
+    _fileNameToExecute = string(fileToExecute).substr(p1+1,p2-p1-1);
+
+    _TmpFileName = BuildTemporaryFileName();
+    ofstream tempOutputFile;
+    tempOutputFile.open(_TmpFileName.c_str(), ofstream::out );
+    tempOutputFile << "#! /bin/sh -f" << endl ;
+    tempOutputFile << "cd " ;
+    tempOutputFile << _params.applipath << endl ;
+    tempOutputFile << "export PYTHONPATH=~/" ;
+    tempOutputFile << _dirForTmpFiles ;
+    tempOutputFile << ":$PYTHONPATH" << endl ;
+    tempOutputFile << "if test $SLURM_PROCID = 0; then" << endl ;
+    tempOutputFile << "  ./runAppli --terminal --batch --modules=" ;
+    for ( int i = 0 ; i < _params.modulesList.size() ; i++ ) {
+      tempOutputFile << _params.modulesList[i] ;
+      if ( i != _params.modulesList.size()-1 )
+       tempOutputFile << "," ;
+    }
+    tempOutputFile << " --standalone=registry,study,moduleCatalog --killall &" << endl ;
+    tempOutputFile << "  for ((ip=1; ip < ${SLURM_NPROCS} ; ip++))" << endl;
+    tempOutputFile << "  do" << endl ;
+    tempOutputFile << "    arglist=\"$arglist YACS_Server_\"$ip" << endl ;
+    tempOutputFile << "  done" << endl ;
+    tempOutputFile << "  sleep 5" << endl ;
+    tempOutputFile << "  ./runSession waitContainers.py $arglist" << endl ;
+    tempOutputFile << "  ./runSession python ~/" << _dirForTmpFiles << "/" << _fileNameToExecute << ".py" << endl;
+    tempOutputFile << "  ./runSession killCurrentPort" << endl;
+    tempOutputFile << "else" << endl ;
+    tempOutputFile << "  sleep 5" << endl ;
+    tempOutputFile << "  ./runSession waitNS.py" << endl ;
+    tempOutputFile << "  ./runSession SALOME_Container 'YACS_Server_'${SLURM_PROCID}" << endl ;
+    tempOutputFile << "fi" << endl ;
+    tempOutputFile.flush();
+    tempOutputFile.close();
+    chmod(_TmpFileName.c_str(), 0x1ED);
+    SCRUTE(_TmpFileName.c_str()) ;
+
+    string command;
+    if( _params.protocol == "rsh" )
+      command = "rcp ";
+    else if( _params.protocol == "ssh" )
+      command = "scp ";
+    else
+      throw SALOME_Exception("Unknown protocol");
+    
+    command += _TmpFileName;
+    command += " ";
+    if (_params.username != ""){
+      command += _params.username;
+      command += "@";
+    }
+    command += _params.hostname;
+    command += ":";
+    command += _dirForTmpFiles ;
+    command += "/runSalome_" ;
+    command += _fileNameToExecute ;
+    command += "_Batch.sh" ;
+    SCRUTE(command.c_str());
+    status = system(command.c_str());
+    if(status)
+      throw SALOME_Exception("Error of connection on remote host");    
+    RmTmpFile();
+    
+    END_OF("BatchManager_SLURM::buildSalomeCouplingScript");
+  }
+
+  void BatchManager_SLURM::buildSalomeBatchScript( const int nbproc ) throw(SALOME_Exception)
+  {
+    BEGIN_OF("BatchManager_SLURM::buildSalomeBatchScript");
+    int status;
+    _TmpFileName = BuildTemporaryFileName();
+    ofstream tempOutputFile;
+    tempOutputFile.open(_TmpFileName.c_str(), ofstream::out );
+
+    tempOutputFile << "#! /bin/sh -f" << endl ;
+    tempOutputFile << "#BSUB -n " << nbproc << endl ;
+    tempOutputFile << "#BSUB -o ~/" << _dirForTmpFiles << "/runSalome.log%J" << endl ;
+    tempOutputFile << "mpirun -srun ~/" << _dirForTmpFiles << "/runSalome_" << _fileNameToExecute << "_Batch.sh" << endl ;
+    tempOutputFile.flush();
+    tempOutputFile.close();
+    chmod(_TmpFileName.c_str(), 0x1ED);
+    SCRUTE(_TmpFileName.c_str()) ;
+
+    string command;
+    if( _params.protocol == "rsh" )
+      command = "rcp ";
+    else if( _params.protocol == "ssh" )
+      command = "scp ";
+    else
+      throw SALOME_Exception("Unknown protocol");
+    command += _TmpFileName;
+    command += " ";
+    if (_params.username != ""){
+      command += _params.username;
+      command += "@";
+    }
+    command += _params.hostname;
+    command += ":";
+    command += _dirForTmpFiles ;
+    command += "/" ;
+    command += _fileNameToExecute ;
+    command += "_Batch.sh" ;
+    SCRUTE(command.c_str());
+    status = system(command.c_str());
+    if(status)
+      throw SALOME_Exception("Error of connection on remote host");    
+
+    RmTmpFile();
+    END_OF("BatchManager_SLURM::buildSalomeBatchScript");
+    
+  }
+
+  int BatchManager_SLURM::submit() throw(SALOME_Exception)
+  {
+    BEGIN_OF("BatchManager_SLURM::submit");
+
+    // define name of log file
+    string logFile="/tmp/logs/";
+    logFile += getenv("USER");
+    logFile += "/batchSalome_";
+
+    srand ( time(NULL) );
+    int ir = rand();
+    ostringstream oss;
+    oss << ir;
+    logFile += oss.str();
+    logFile += ".log";
+
+    string command;
+    int status;
+
+    // define command to submit batch
+    if( _params.protocol == "rsh" )
+      command = "rsh ";
+    else if( _params.protocol == "ssh" )
+      command = "ssh ";
+    else
+      throw SALOME_Exception("Unknown protocol");
+
+    if (_params.username != ""){
+      command += _params.username;
+      command += "@";
+    }
+
+    command += _params.hostname;
+    command += " \"bsub < " ;
+    command += _dirForTmpFiles ;
+    command += "/" ;
+    command += _fileNameToExecute ;
+    command += "_Batch.sh\" > ";
+    command += logFile;
+    SCRUTE(command.c_str());
+    status = system(command.c_str());
+    if(status)
+      throw SALOME_Exception("Error of connection on remote host");
+
+    // read id of submitted job in log file
+    char line[128];
+    FILE *fp = fopen(logFile.c_str(),"r");
+    fgets( line, 128, fp);
+    fclose(fp);
+    
+    string sline(line);
+    int p1 = sline.find("<");
+    int p2 = sline.find(">");
+    string strjob = sline.substr(p1+1,p2-p1-1);
+
+    int id;
+    istringstream iss(strjob);
+    iss >> id;
+
+    END_OF("BatchManager_SLURM::submit");
+    return id;
+  }
+
+}
diff --git a/src/Batch/BatchLight_BatchManager_SLURM.hxx b/src/Batch/BatchLight_BatchManager_SLURM.hxx
new file mode 100644 (file)
index 0000000..ed21624
--- /dev/null
@@ -0,0 +1,62 @@
+// Copyright (C) 2005  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
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+/*
+ * BatchManager.hxx : 
+ *
+ * Auteur : Bernard SECHER - CEA/DEN
+ * Date   : Juillet 2007
+ * Projet : SALOME
+ *
+ */
+
+#ifndef _BL_BATCHMANAGER_SLURM_H_
+#define _BL_BATCHMANAGER_SLURM_H_
+
+#include <string>
+#include "Utils_SALOME_Exception.hxx"
+#include "BatchLight_BatchManager.hxx"
+
+namespace BatchLight {
+
+  class Job;
+
+  class BatchManager_SLURM : public BatchManager
+  {
+  public:
+    // Constructeur et destructeur
+    BatchManager_SLURM(const batchParams& p) throw(SALOME_Exception); // connexion a la machine host
+    virtual ~BatchManager_SLURM();
+
+    // Methodes pour le controle des jobs : virtuelles pures
+    void deleteJob(const int & jobid); // retire un job du gestionnaire
+    std::string queryJob(const int & jobid); // renvoie l'etat du job
+
+  protected:
+    void buildSalomeCouplingScript( const char *fileToExecute ) throw(SALOME_Exception);
+    void buildSalomeBatchScript( const int nbproc ) throw(SALOME_Exception);
+    int submit() throw(SALOME_Exception);
+
+  private:
+
+  };
+
+}
+
+#endif
diff --git a/src/Batch/BatchLight_Job.cxx b/src/Batch/BatchLight_Job.cxx
new file mode 100644 (file)
index 0000000..9762a98
--- /dev/null
@@ -0,0 +1,45 @@
+// Copyright (C) 2005  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
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+/*
+ * Job.cxx : 
+ *
+ * Auteur : Bernard SECHER - CEA/DEN
+ * Date   : Juillet 2007
+ * Projet : SALOME
+ *
+ */
+
+#include "BatchLight_Job.hxx"
+using namespace std;
+
+namespace BatchLight {
+
+  // Constructeur
+  Job::Job(const char *fileToExecute, const Engines::FilesList& filesToExport, const Engines::FilesList& filesToImport, const int nbproc) : _fileToExecute(fileToExecute), _filesToExport(filesToExport), _filesToImport(filesToImport), _nbproc(nbproc)
+  {
+    // Nothing to do
+  }
+
+  Job::~Job()
+  {
+    MESSAGE("Job destructor");
+  }
+
+}
diff --git a/src/Batch/BatchLight_Job.hxx b/src/Batch/BatchLight_Job.hxx
new file mode 100644 (file)
index 0000000..23ac8f3
--- /dev/null
@@ -0,0 +1,62 @@
+// Copyright (C) 2005  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
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+/*
+ * Job.hxx : 
+ *
+ * Auteur : Bernard SECHER - CEA/DEN
+ * Date   : Juillet 2007
+ * Projet : SALOME
+ *
+ */
+
+#ifndef _BL_JOB_H_
+#define _BL_JOB_H_
+
+#include "utilities.h"
+#include <SALOMEconfig.h>
+#include CORBA_CLIENT_HEADER(SALOME_ContainerManager)
+
+namespace BatchLight {
+
+  class Job
+  {
+  public:
+    // Constructeurs et destructeur
+    Job(const char *fileToExecute, const Engines::FilesList& filesToExport, const Engines::FilesList& filesToImport, const int nbproc);
+    virtual ~Job();
+
+    const char *getFileToExecute() const { return _fileToExecute; }
+    const Engines::FilesList getFilesToExportList() const { return _filesToExport; }
+    const Engines::FilesList getFilesToImportList() const { return _filesToImport; }
+    const int getNbProc() const { return _nbproc; }
+    
+  protected:
+    const char* _fileToExecute;
+    const Engines::FilesList _filesToExport;
+    const Engines::FilesList _filesToImport;
+    const int _nbproc;
+
+  private:
+
+  };
+
+}
+
+#endif
index 095173c50d1a5c7cd417046b78cde64c42427c9a..425e39f5c3eb1e9eb76db524b2e2d85e4e587937 100644 (file)
@@ -59,7 +59,12 @@ LIB_INCLUDES = \
        Batch_PyVersatile.hxx \
        Batch_RunTimeException.hxx \
        Batch_StringType.hxx \
-       Batch_TypeMismatchException.hxx
+       Batch_TypeMismatchException.hxx \
+       BatchLight_BatchManager.hxx \
+       BatchLight_BatchManager_PBS.hxx \
+       BatchLight_BatchManager_SLURM.hxx \
+       BatchLight_Job.hxx \
+       MpiImpl.hxx
 
 
 LIB_SRC = \
@@ -91,7 +96,12 @@ LIB_SRC = \
        Batch_PyVersatile.cxx \
        Batch_RunTimeException.cxx \
        Batch_StringType.cxx \
-       Batch_TypeMismatchException.cxx
+       Batch_TypeMismatchException.cxx \
+       BatchLight_BatchManager.cxx \
+       BatchLight_BatchManager_SLURM.cxx \
+       BatchLight_BatchManager_PBS.cxx \
+       BatchLight_Job.cxx \
+       MpiImpl.cxx
 
 
 LIB_CPPFLAGS = \
@@ -203,8 +213,10 @@ libSalomeBatch_la_CPPFLAGS = \
        @PYTHON_INCLUDES@ \
        -I$(srcdir)/../Basics \
        -I$(srcdir)/../SALOMELocalTrace \
+       -I$(srcdir)/../Utils \
        -I$(top_builddir)/salome_adm/unix \
-       $(LIB_CPPFLAGS)
+       -I$(top_builddir)/idl \
+       @CORBA_CXXFLAGS@ @CORBA_INCLUDES@ $(LIB_CPPFLAGS)
 
 libSalomeBatch_la_LDFLAGS  = -no-undefined -version-info=0:0:0
 libSalomeBatch_la_LIBADD   = \
diff --git a/src/Batch/MpiImpl.cxx b/src/Batch/MpiImpl.cxx
new file mode 100644 (file)
index 0000000..036018b
--- /dev/null
@@ -0,0 +1,212 @@
+// Copyright (C) 2005  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
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+/*
+ * BatchManager.cxx : 
+ *
+ * Auteur : Bernard SECHER - CEA/DEN
+ * Date   : Juillet 2007
+ * Projet : SALOME
+ *
+ */
+
+#include <iostream>
+#include <sstream>
+#include <string>
+#include "utilities.h"
+#include "MpiImpl.hxx"
+
+using namespace std;
+
+// Constructor
+MpiImpl::MpiImpl()
+{
+  MESSAGE("MpiImpl constructor");
+}
+
+// Destructor
+MpiImpl::~MpiImpl()
+{
+  MESSAGE("MpiImpl destructor");
+}
+
+// lam implementation
+// Constructor
+MpiImpl_LAM::MpiImpl_LAM() : MpiImpl()
+{
+}
+
+// Destructor
+MpiImpl_LAM::~MpiImpl_LAM()
+{
+  MESSAGE("MpiImpl_LAM destructor");
+}
+
+string MpiImpl_LAM::size()
+{
+  return "${LAMWORLD}";
+}
+
+string MpiImpl_LAM::rank()
+{
+  return "${LAMRANK}";
+}
+
+string MpiImpl_LAM::boot(const string machinefile, const unsigned int nbnodes)
+{
+  ostringstream oss;
+  oss << "lamboot " << machinefile << endl;
+  return oss.str();
+}
+
+string MpiImpl_LAM::run(const string machinefile, const unsigned int nbproc, const string fileNameToExecute)
+{
+  ostringstream oss;
+  oss << "mpirun -np " << nbproc << " " << fileNameToExecute << endl;
+  return oss.str();
+}
+
+string MpiImpl_LAM::halt()
+{
+  ostringstream oss;
+  oss << "lamhalt" << endl;
+  return oss.str();
+}
+
+// mpich1 implementation
+// Constructor
+MpiImpl_MPICH1::MpiImpl_MPICH1() : MpiImpl()
+{
+}
+
+// Destructor
+MpiImpl_MPICH1::~MpiImpl_MPICH1()
+{
+  MESSAGE("MpiImpl_MPICH1 destructor");
+}
+
+string MpiImpl_MPICH1::size()
+{
+  throw SALOME_Exception("mpich1 doesn't work with this batch system to submit salome session");
+}
+
+string MpiImpl_MPICH1::rank()
+{
+  throw SALOME_Exception("mpich1 doesn't work with this batch system to submit salome session");
+}
+
+string MpiImpl_MPICH1::boot(const string machinefile, const unsigned int nbnodes)
+{
+  return "";
+}
+
+string MpiImpl_MPICH1::run(const string machinefile, const unsigned int nbproc, const string fileNameToExecute)
+{
+  ostringstream oss;
+  oss << "mpirun -machinefile " << machinefile << " -np " << nbproc << " " << fileNameToExecute << endl;
+  return oss.str();
+}
+
+string MpiImpl_MPICH1::halt()
+{
+  return "";
+}
+
+// mpich2 implementation
+// Constructor
+MpiImpl_MPICH2::MpiImpl_MPICH2() : MpiImpl()
+{
+}
+
+// Destructor
+MpiImpl_MPICH2::~MpiImpl_MPICH2()
+{
+  MESSAGE("MpiImpl_MPICH2 destructor");
+}
+
+string MpiImpl_MPICH2::size()
+{
+  return "${PMI_SIZE}";
+}
+
+string MpiImpl_MPICH2::rank()
+{
+  return "${PMI_RANK}";
+}
+
+string MpiImpl_MPICH2::boot(const string machinefile, const unsigned int nbnodes)
+{
+  ostringstream oss;
+  oss << "mpdboot -n " << nbnodes << " -f " << machinefile << endl;
+  return oss.str();
+}
+
+string MpiImpl_MPICH2::run(const string machinefile, const unsigned int nbproc, const string fileNameToExecute)
+{
+  ostringstream oss;
+  oss << "mpirun -np " << nbproc << " " << fileNameToExecute << endl;
+  return oss.str();
+}
+
+string MpiImpl_MPICH2::halt()
+{
+  ostringstream oss;
+  oss << "mpdallexit" << endl;
+  return oss.str();
+}
+
+// openmpi implementation
+// Constructor
+MpiImpl_OPENMPI::MpiImpl_OPENMPI() : MpiImpl()
+{
+}
+
+// Destructor
+MpiImpl_OPENMPI::~MpiImpl_OPENMPI()
+{
+  MESSAGE("MpiImpl_OPENMPI destructor");
+}
+
+string MpiImpl_OPENMPI::size()
+{
+  return "${OMPI_MCA_ns_nds_num_procs}";
+}
+
+string MpiImpl_OPENMPI::rank()
+{
+  return "${OMPI_MCA_ns_nds_vpid}";
+}
+
+string MpiImpl_OPENMPI::boot(const string machinefile, const unsigned int nbnodes)
+{
+  return "";
+}
+
+string MpiImpl_OPENMPI::run(const string machinefile, const unsigned int nbproc, const string fileNameToExecute)
+{
+  ostringstream oss;
+  oss << "mpirun -hostfile " << machinefile << " -np " << nbproc << " " << fileNameToExecute << endl;
+  return oss.str();
+}
+
+string MpiImpl_OPENMPI::halt()
+{
+  return "";
+}
+
diff --git a/src/Batch/MpiImpl.hxx b/src/Batch/MpiImpl.hxx
new file mode 100644 (file)
index 0000000..beeac03
--- /dev/null
@@ -0,0 +1,131 @@
+// Copyright (C) 2005  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
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+/*
+ * BatchManager.hxx : 
+ *
+ * Auteur : Bernard SECHER - CEA/DEN
+ * Date   : Juillet 2007
+ * Projet : SALOME
+ *
+ */
+
+#ifndef _BL_MPIIMPL_H_
+#define _BL_MPIIMPL_H_
+
+#include <string>
+#include "Utils_SALOME_Exception.hxx"
+#include <SALOMEconfig.h>
+
+class MpiImpl
+{
+public:
+  // Constructeur et destructeur
+  MpiImpl(); // constrcuctor
+  virtual ~MpiImpl(); //Destructor
+  
+  virtual std::string size() = 0; // get number of process of current job
+  virtual std::string rank() = 0; // get process number of current job
+  virtual std::string boot(const std::string machinefile, const unsigned int nbnodes) = 0; // get boot command
+  virtual std::string run(const std::string machinefile, const unsigned int nbproc, const std::string fileNameToExecute) = 0; // get run command
+  virtual std::string halt() = 0; // get stop command
+
+protected:
+
+private:
+
+};
+
+class MpiImpl_LAM : public MpiImpl
+{
+public:
+  // Constructeur et destructeur
+  MpiImpl_LAM(); // constructor
+  virtual ~MpiImpl_LAM(); //Destructor
+
+  std::string size(); // get number of process of current job
+  std::string rank(); // get process number of current job
+  std::string boot( const std::string machinefile, const unsigned int nbnodes); // get boot command
+  std::string run( const std::string machinefile, const unsigned int nbproc, const std::string fileNameToExecute); // get run command
+  std::string halt(); // get stop command
+
+protected:
+  
+private:
+
+};
+
+class MpiImpl_MPICH1 : public MpiImpl
+{
+public:
+  // Constructeur et destructeur
+  MpiImpl_MPICH1(); // constructor
+  virtual ~MpiImpl_MPICH1(); //Destructor
+  
+  std::string size(); // get number of process of current job
+  std::string rank(); // get process number of current job
+  std::string boot( const std::string machinefile, const unsigned int nbnodes); // get boot command
+  std::string run( const std::string machinefile, const unsigned int nbproc, const std::string fileNameToExecute); // get run command
+  std::string halt(); // get stop command
+
+protected:
+  
+private:
+
+};
+
+class MpiImpl_MPICH2 : public MpiImpl
+{
+public:
+  // Constructeur et destructeur
+  MpiImpl_MPICH2(); // constructor
+  virtual ~MpiImpl_MPICH2(); //Destructor
+
+  std::string size(); // get number of process of current job
+  std::string rank(); // get process number of current job
+  std::string boot( const std::string machinefile, const unsigned int nbnodes); // get boot command
+  std::string run( const std::string machinefile, const unsigned int nbproc, const std::string fileNameToExecute); // get run command
+  std::string halt(); // get stop command
+
+protected:
+
+private:
+
+};
+
+class MpiImpl_OPENMPI : public MpiImpl
+{
+public:
+  // Constructeur et destructeur
+  MpiImpl_OPENMPI(); // constructor
+  virtual ~MpiImpl_OPENMPI(); //Destructor
+
+  std::string size(); // get number of process of current job
+  std::string rank(); // get process number of current job
+  std::string boot( const std::string machinefile, const unsigned int nbnodes); // get boot command
+  std::string run( const std::string machinefile, const unsigned int nbproc, const std::string fileNameToExecute); // get run command
+  std::string halt(); // get stop command
+
+protected:
+
+private:
+
+};
+
+#endif
index 0c4928a9b83f429eabe04111f54359bbb2626138..61d3e2a61170cdb2b105b3f2a485773ee9efd512 100644 (file)
@@ -300,7 +300,8 @@ void Engines_Container_i::Shutdown()
       MESSAGE("Effective Shutdown of container Begins...");
       LocalTraceBufferPool* bp1 = LocalTraceBufferPool::instance();
       bp1->deleteInstance(bp1);
-      _orb->shutdown(0);
+      if(!CORBA::is_nil(_orb))
+       _orb->shutdown(0);
     }
 }
 
index 4c8b65729af36bc58433ca07d956804714f8139d..409e9e0bbff81c60e05987c7bea4643f07f94525 100644 (file)
@@ -64,7 +64,8 @@ dist_salomescript_SCRIPTS=\
 COMMON_CPPFLAGS=\
        @PYTHON_INCLUDES@ \
        @MPI_INCLUDES@ \
-       @QT_MT_INCLUDES@ \
+       @HDF5_INCLUDES@ \
+       -I$(srcdir)/../Batch \
        -I$(srcdir)/../Basics \
        -I$(srcdir)/../SALOMELocalTrace \
        -I$(srcdir)/../NamingService \
@@ -75,7 +76,7 @@ COMMON_CPPFLAGS=\
        -I$(srcdir)/../HDFPersist \
        -I$(top_builddir)/salome_adm/unix \
        -I$(top_builddir)/idl \
-       @CORBA_CXXFLAGS@ @CORBA_INCLUDES@ 
+       @CORBA_CXXFLAGS@ @CORBA_INCLUDES@ @LIBXML_INCLUDES@
 
 # This local variable defines the list of dependant libraries common to all target in this package.
 COMMON_LIBS =\
@@ -87,6 +88,7 @@ COMMON_LIBS =\
        ../SALOMELocalTrace/libSALOMELocalTrace.la \
        ../Basics/libSALOMEBasics.la \
        ../HDFPersist/libSalomeHDFPersist.la \
+       ../Batch/libSalomeBatch.la \
        $(top_builddir)/idl/libSalomeIDLKernel.la\
        @MPI_LIBS@ \
        @CORBA_LIBS@
@@ -129,7 +131,7 @@ endif
 # Executables targets
 # ===============================================================
 #
-bin_PROGRAMS = SALOME_Container SALOME_ContainerManagerServer
+bin_PROGRAMS = SALOME_Container
 noinst_PROGRAMS = TestSalome_file
 
 SALOME_Container_SOURCES =\
@@ -142,22 +144,12 @@ SALOME_Container_CPPFLAGS =\
 SALOME_Container_LDADD =\
        libSalomeContainer.la \
        $(COMMON_LIBS) \
-       ../Basics/libSALOMEBasics.la
+       ../Basics/libSALOMEBasics.la \
+       ../Batch/libSalomeBatch.la
 
 SALOME_Container_LDFLAGS  =\
 -Xlinker -export-dynamic
 
-SALOME_ContainerManagerServer_SOURCES =\
-       SALOME_ContainerManagerServer.cxx 
-
-SALOME_ContainerManagerServer_CPPFLAGS=\
-       $(COMMON_CPPFLAGS)
-
-SALOME_ContainerManagerServer_LDADD =\
-       libSalomeContainer.la \
-       $(COMMON_LIBS) \
-       ../Basics/libSALOMEBasics.la
-
 TestSalome_file_SOURCES =\
        TestSalome_file.cxx
 
index 296e3e0d23d0256f343e6b50f41473cf415d0bce..0fc39bd912008bbc000ac732b94cb1abce3bd93a 100644 (file)
@@ -26,6 +26,7 @@
 #endif
 #include <vector>
 #include "Utils_CorbaException.hxx"
+#include "Batch_Date.hxx"
 
 #ifdef WITH_PACO_PARALLEL
 #include "PaCO++.h"
 
 using namespace std;
 
+vector<Engines::Container_ptr> SALOME_ContainerManager::_batchLaunchedContainers;
+
+vector<Engines::Container_ptr>::iterator SALOME_ContainerManager::_batchLaunchedContainersIter;
+
 const char *SALOME_ContainerManager::_ContainerManagerNameInNS = 
   "/ContainerManager";
 
@@ -47,27 +52,25 @@ const char *SALOME_ContainerManager::_ContainerManagerNameInNS =
  */
 //=============================================================================
 
-SALOME_ContainerManager::SALOME_ContainerManager(CORBA::ORB_ptr orb)
+SALOME_ContainerManager::SALOME_ContainerManager(CORBA::ORB_ptr orb, PortableServer::POA_var poa, SALOME_ResourcesManager *rm, SALOME_NamingService *ns)
 {
   MESSAGE("constructor");
-  _NS = new SALOME_NamingService(orb);
-  _ResManager = new SALOME_ResourcesManager(orb);
+  _NS = ns;
+  _ResManager = rm;
   _id=0;
-  PortableServer::POA_var root_poa = PortableServer::POA::_the_root_poa();
-  PortableServer::POAManager_var pman = root_poa->the_POAManager();
-  PortableServer::POA_var my_poa;
 
+  PortableServer::POAManager_var pman = poa->the_POAManager();
+  _orb = CORBA::ORB::_duplicate(orb) ;
   CORBA::PolicyList policies;
   policies.length(1);
   PortableServer::ThreadPolicy_var threadPol = 
-    root_poa->create_thread_policy(PortableServer::SINGLE_THREAD_MODEL);
+    poa->create_thread_policy(PortableServer::SINGLE_THREAD_MODEL);
   policies[0] = PortableServer::ThreadPolicy::_duplicate(threadPol);
 
-  my_poa = 
-    root_poa->create_POA("SThreadPOA",pman,policies);
+  _poa = poa->create_POA("SThreadPOA",pman,policies);
   threadPol->destroy();
-  PortableServer::ObjectId_var id = my_poa->activate_object(this);
-  CORBA::Object_var obj = my_poa->id_to_reference(id);
+  PortableServer::ObjectId_var id = _poa->activate_object(this);
+  CORBA::Object_var obj = _poa->id_to_reference(id);
   Engines::ContainerManager_var refContMan =
     Engines::ContainerManager::_narrow(obj);
 
@@ -84,8 +87,6 @@ SALOME_ContainerManager::SALOME_ContainerManager(CORBA::ORB_ptr orb)
 SALOME_ContainerManager::~SALOME_ContainerManager()
 {
   MESSAGE("destructor");
-  delete _NS;
-  delete _ResManager;
 }
 
 //=============================================================================
@@ -98,10 +99,10 @@ void SALOME_ContainerManager::Shutdown()
 {
   MESSAGE("Shutdown");
   ShutdownContainers();
-  PortableServer::ObjectId_var oid = _default_POA()->servant_to_id(this);
-  _default_POA()->deactivate_object(oid);
+  _NS->Destroy_Name(_ContainerManagerNameInNS);
+  PortableServer::ObjectId_var oid = _poa->servant_to_id(this);
+  _poa->deactivate_object(oid);
   _remove_ref();
-  
 }
 
 //=============================================================================
@@ -113,36 +114,34 @@ void SALOME_ContainerManager::Shutdown()
 void SALOME_ContainerManager::ShutdownContainers()
 {
   MESSAGE("ShutdownContainers");
-  _NS->Change_Directory("/Containers");
-  vector<string> vec = _NS->list_directory_recurs();
-  list<string> lstCont;
-  for(vector<string>::iterator iter = vec.begin();iter!=vec.end();iter++)
-    {
+  bool isOK;
+  isOK = _NS->Change_Directory("/Containers");
+  if( isOK ){
+    vector<string> vec = _NS->list_directory_recurs();
+    list<string> lstCont;
+    for(vector<string>::iterator iter = vec.begin();iter!=vec.end();iter++){
       SCRUTE((*iter));
       CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
       Engines::Container_var cont=Engines::Container::_narrow(obj);
-      if(!CORBA::is_nil(cont))
-       {
-         lstCont.push_back((*iter));
-       }
+      if(!CORBA::is_nil(cont)){
+       lstCont.push_back((*iter));
+      }
     }
-  MESSAGE("Container list: ");
-  for(list<string>::iterator iter=lstCont.begin();iter!=lstCont.end();iter++)
-    {
+    MESSAGE("Container list: ");
+    for(list<string>::iterator iter=lstCont.begin();iter!=lstCont.end();iter++){
       SCRUTE((*iter));
     }
-  for(list<string>::iterator iter=lstCont.begin();iter!=lstCont.end();iter++)
-    {
+    for(list<string>::iterator iter=lstCont.begin();iter!=lstCont.end();iter++){
       SCRUTE((*iter));
       CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
       Engines::Container_var cont=Engines::Container::_narrow(obj);
-      if(!CORBA::is_nil(cont))
-       {
-         MESSAGE("ShutdownContainers: " << (*iter));
-         cont->Shutdown();
-       }
+      if(!CORBA::is_nil(cont)){
+       MESSAGE("ShutdownContainers: " << (*iter));
+       cont->Shutdown();
+      }
       else MESSAGE("ShutdownContainers: no container ref for " << (*iter));
     }
+  }
 }
 
 //=============================================================================
@@ -158,10 +157,6 @@ SALOME_ContainerManager::
 FindOrStartContainer(const Engines::MachineParameters& params,
                     const Engines::MachineList& possibleComputers)
 {
-  long id;
-  string containerNameInNS;
-  char idc[3*sizeof(long)];
-
   Engines::Container_ptr ret = FindContainer(params,possibleComputers);
   if(!CORBA::is_nil(ret))
     return ret;
@@ -295,9 +290,10 @@ StartContainer(const Engines::MachineParameters& params,
 Engines::Container_ptr
 SALOME_ContainerManager::
 StartContainer(const Engines::MachineParameters& params,
-              Engines::ResPolicy policy)
+              Engines::ResPolicy policy,
+              const Engines::CompoList& componentList)
 {
-  Engines::MachineList_var possibleComputers = GetFittingResources(params,"");
+  Engines::MachineList_var possibleComputers = _ResManager->GetFittingResources(params,componentList);
   return StartContainer(params,possibleComputers,policy);
 }
 
@@ -440,51 +436,28 @@ FindOrStartParallelContainer(const Engines::MachineParameters& params,
 #endif
 
 //=============================================================================
-/*! 
- * 
- */
-//=============================================================================
-
-Engines::MachineList *
-SALOME_ContainerManager::
-GetFittingResources(const Engines::MachineParameters& params,
-                   const char *componentName)
-{
-  MESSAGE("SALOME_ContainerManager::GetFittingResources");
-  Engines::MachineList *ret=new Engines::MachineList;
-  vector<string> vec;
-  try
-    {
-      vec = _ResManager->GetFittingResources(params,componentName);
-    }
-  catch(const SALOME_Exception &ex)
-    {
-      INFOS("Caught exception.");
-      THROW_SALOME_CORBA_EXCEPTION(ex.what(),SALOME::BAD_PARAM);
-      //return ret;
-    }
-
-  //  MESSAGE("Machine list length "<<vec.size());
-  ret->length(vec.size());
-  for(unsigned int i=0;i<vec.size();i++)
-    {
-      (*ret)[i]=(vec[i]).c_str();
-    }
-  return ret;
-}
-
-//=============================================================================
-/*! 
- * 
+/*! CORBA Method:
+ *  Give a suitable Container in a list of machines
+ *  \param params            Machine Parameters required for the container
+ *  \param possibleComputers list of machines usable for start
  */
 //=============================================================================
 
-char*
+Engines::Container_ptr
 SALOME_ContainerManager::
-FindFirst(const Engines::MachineList& possibleComputers)
+GiveContainer(const Engines::MachineParameters& params,
+              Engines::ResPolicy policy,
+              const Engines::CompoList& componentList)
 {
-  string theMachine=_ResManager->FindFirst(possibleComputers);
-  return CORBA::string_dup(theMachine.c_str());
+  char *valenv=getenv("SALOME_BATCH");
+  if(valenv)
+    if (strcmp(valenv,"1")==0)
+      {
+        if(_batchLaunchedContainers.empty())
+          fillBatchLaunchedContainers();
+        return *(_batchLaunchedContainersIter++);
+      }
+  return StartContainer(params,policy,componentList);
 }
 
 //=============================================================================
@@ -637,3 +610,17 @@ long SALOME_ContainerManager::GetIdForContainer(void)
   return _id;
 }
 
+void SALOME_ContainerManager::fillBatchLaunchedContainers()
+{
+  _batchLaunchedContainers.clear();
+  _NS->Change_Directory("/Containers");
+  vector<string> vec = _NS->list_directory_recurs();
+  for(vector<string>::iterator iter = vec.begin();iter!=vec.end();iter++){
+    CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
+    Engines::Container_ptr cont=Engines::Container::_narrow(obj);
+    if(!CORBA::is_nil(cont)){
+      _batchLaunchedContainers.push_back(cont);
+    }
+  }
+  _batchLaunchedContainersIter=_batchLaunchedContainers.begin();
+}
index aa7ab18c2b50877a6f85b051487984c3a018e69e..34888f98c7216ec9dc44cde6acf2684f796c5f3a 100644 (file)
@@ -37,7 +37,7 @@ class CONTAINER_EXPORT SALOME_ContainerManager:
 {
 
 public:
-  SALOME_ContainerManager(CORBA::ORB_ptr orb);
+  SALOME_ContainerManager(CORBA::ORB_ptr orb, PortableServer::POA_var poa, SALOME_ResourcesManager *rm, SALOME_NamingService *ns);
   ~SALOME_ContainerManager();
 
   Engines::Container_ptr
@@ -51,13 +51,13 @@ public:
 
   Engines::Container_ptr
   StartContainer(const Engines::MachineParameters& params,
-                Engines::ResPolicy policy);
-
-  Engines::MachineList *
-  GetFittingResources(const Engines::MachineParameters& params,
-                     const char *componentName);
+               Engines::ResPolicy policy,
+               const Engines::CompoList& componentList);
 
-  char* FindFirst(const Engines::MachineList& possibleComputers);
+  Engines::Container_ptr
+  GiveContainer(const Engines::MachineParameters& params,
+               Engines::ResPolicy policy,
+               const Engines::CompoList& componentList);
 
   void Shutdown();
   void ShutdownContainers();
@@ -83,11 +83,17 @@ protected:
                          const Engines::MachineParameters& params,
                          const std::string& name);
 
+  void fillBatchLaunchedContainers();
+
   long GetIdForContainer(void);
   long _id;
+  CORBA::ORB_var _orb;
+  PortableServer::POA_var _poa;
 
   SALOME_ResourcesManager *_ResManager;
   SALOME_NamingService *_NS;
+  static std::vector<Engines::Container_ptr> _batchLaunchedContainers;
+  static std::vector<Engines::Container_ptr>::iterator _batchLaunchedContainersIter;
 };
 
 #endif
diff --git a/src/Container/SALOME_ContainerManagerServer.cxx b/src/Container/SALOME_ContainerManagerServer.cxx
deleted file mode 100644 (file)
index d4a4399..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) 2005  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
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either 
-// version 2.1 of the License.
-// 
-// This library is distributed in the hope that it will be useful 
-// but WITHOUT ANY WARRANTY; without even the implied warranty of 
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public  
-// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-#include "SALOME_ContainerManager.hxx"
-#include "utilities.h"
-
-int main(int argc, char* argv[])
-{
-  PortableServer::POA_var root_poa;
-  PortableServer::POAManager_var pman;
-  CORBA::Object_var obj;
-
-  CORBA::ORB_ptr orb = CORBA::ORB_init( argc , argv ) ;
-  //  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
-  INFOS_COMPILATION;
-  BEGIN_OF(argv[0]);
-  try{ 
-       obj = orb->resolve_initial_references("RootPOA");
-       if(!CORBA::is_nil(obj))
-         root_poa = PortableServer::POA::_narrow(obj);
-       if(!CORBA::is_nil(root_poa))
-         pman = root_poa->the_POAManager();
-      }
-  catch(CORBA::COMM_FAILURE&){
-    MESSAGE( "Container: CORBA::COMM_FAILURE: Unable to contact the Naming Service" );
-  }
-  try{
-    SALOME_ContainerManager *cmServ=new SALOME_ContainerManager(orb);
-    pman->activate();
-    orb->run();
-  }catch(CORBA::SystemException&){
-    MESSAGE("Caught CORBA::SystemException.");
-  }catch(PortableServer::POA::WrongPolicy&){
-    MESSAGE("Caught CORBA::WrongPolicyException.");
-  }catch(PortableServer::POA::ServantAlreadyActive&){
-    MESSAGE("Caught CORBA::ServantAlreadyActiveException");
-  }catch(CORBA::Exception&){
-    MESSAGE("Caught CORBA::Exception.");
-  }catch(std::exception& exc){
-    MESSAGE("Caught std::exception - "<<exc.what()); 
-  }catch(...){
-    MESSAGE("Caught unknown exception.");
-  }
-  END_OF(argv[0]);
-  //  delete myThreadTrace;
-}
-
diff --git a/src/Container/TestContainerManager.cxx b/src/Container/TestContainerManager.cxx
deleted file mode 100644 (file)
index 3d991bb..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-//  SALOME TestContainer : test of container creation and its life cycle
-//
-//  Copyright (C) 2003  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 
-//  modify it under the terms of the GNU Lesser General Public 
-//  License as published by the Free Software Foundation; either 
-//  version 2.1 of the License. 
-// 
-//  This library is distributed in the hope that it will be useful, 
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
-//  Lesser General Public License for more details. 
-// 
-//  You should have received a copy of the GNU Lesser General Public 
-//  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.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-//
-//
-//  File   : TestContainer.cxx
-//  Author : Paul RASCLE, EDF - MARC TAJCHMAN, CEA
-//  Module : SALOME
-//  $Header$
-
-#include "utilities.h"
-#include <iostream>
-#include <unistd.h>
-#include <SALOMEconfig.h>
-#include "SALOME_NamingService.hxx"
-#include "SALOME_ContainerManager.hxx"
-#include "SALOME_LifeCycleCORBA.hxx"
-#include "NamingService_WaitForServerReadiness.hxx"
-#include "OpUtil.hxx"
-#include "Utils_ORB_INIT.hxx"
-#include "Utils_SINGLETON.hxx"
-#include "Utils_SALOME_Exception.hxx"
-#include "Utils_CommException.hxx"
-using namespace std;
-
-int main (int argc, char * argv[])
-{
-  map<string, int> cycle;
-  map<string, int> first;
-  Engines::Container_ptr cont;
-  Engines::Component_ptr compo;
-  bool error = false;
-  bool bestImplemented;
-
-  // Initializing omniORB
-  ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
-  CORBA::ORB_ptr orb = init( argc , argv ) ;
-
-  SALOME_NamingService *_NS=new SALOME_NamingService(orb);
-
-  CORBA::Object_var obj = _NS->Resolve(SALOME_ContainerManager::_ContainerManagerNameInNS);
-  ASSERT( !CORBA::is_nil(obj));
-  Engines::ContainerManager_var _ContManager=Engines::ContainerManager::_narrow(obj);
-
-  Engines::MachineParameters p;
-
-  p.hostname = "";
-  p.OS = "LINUX";
-  p.mem_mb = 1000;
-  p.cpu_clock = 1000;
-  p.nb_proc_per_node = 1;
-  p.nb_node = 1;
-  p.isMPI = false;
-
-  char st[10];
-  for(int i=0;i<10;i++){
-    sprintf(st,"cycl_%d",i);
-    p.container_name = CORBA::string_dup(st);
-    cont = _ContManager->StartContainer(p,Engines::P_CYCL);
-    if(CORBA::is_nil(cont)) error = true;
-  }
-
-  for(int i=0;i<10;i++){
-    sprintf(st,"first_%d",i);
-    p.container_name = CORBA::string_dup(st);
-    cont = _ContManager->StartContainer(p,Engines::P_FIRST);
-    if(CORBA::is_nil(cont)) error = true;
-  }
-
-  p.container_name = CORBA::string_dup("best");
-  cont = _ContManager->StartContainer(p,Engines::P_BEST);
-  if(CORBA::is_nil(cont)) bestImplemented = false;
-  else bestImplemented = true;
-
-  SALOME_LifeCycleCORBA LCC(_NS);
-  compo = LCC.FindOrLoad_Component("FactoryServer","GEOM");
-  if(CORBA::is_nil(compo)) error = true;
-  compo = LCC.FindOrLoad_Component("FactoryServer","GEOM");
-  if(CORBA::is_nil(compo)) error = true;
-
-  _NS->Change_Directory("/Containers");
-
-  vector<string> vec = _NS->list_directory_recurs();
-  list<string> lstCont;
-  for(vector<string>::iterator iter = vec.begin();iter!=vec.end();iter++){
-    CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
-    Engines::Container_var cont=Engines::Container::_narrow(obj);
-    if(!CORBA::is_nil(cont)){
-      cycle[cont->getHostName()]=0;
-      first[cont->getHostName()]=0;
-      lstCont.push_back((*iter));
-    }
-  }
-  for(list<string>::iterator iter=lstCont.begin();iter!=lstCont.end();iter++){
-    CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
-    Engines::Container_var cont=Engines::Container::_narrow(obj);
-    if(!CORBA::is_nil(cont)){
-      if(strncmp(basename(cont->name()),"cycl",4)==0)
-       cycle[cont->getHostName()]++;
-      if(strncmp(basename(cont->name()),"first",5)==0)
-       first[cont->getHostName()]++;
-    }
-  }
-  _ContManager->ShutdownContainers();
-
-  int cmin=10;
-  int cmax=0;
-  int fmin=10;
-  int fmax=0;
-  for(map<string,int>::iterator iter=cycle.begin();iter!=cycle.end();iter++){
-    if(strcmp((*iter).first.c_str(),"localhost")!=0){
-      if(cycle[(*iter).first]<cmin) cmin=cycle[(*iter).first];
-      if(cycle[(*iter).first]>cmax) cmax=cycle[(*iter).first];
-      if(first[(*iter).first]<fmin) fmin=first[(*iter).first];
-      if(first[(*iter).first]>fmax) fmax=first[(*iter).first];
-    }
-  }
-  if( ((cmax-cmin) <= 1) && (fmax == 10) && !error ){
-    string msg;
-    if(bestImplemented)
-      msg = "TEST OK";
-    else
-      msg = "TEST OK but FindBest not implemented!";
-    MESSAGE(msg);
-    return 0;
-  }
-  else{
-    MESSAGE("TEST KO");
-    return 1;
-  }
-}
index 0238fc12606204d38df8c454a17a1467fa06097b..51f13c273848afc4a3098a417a35ed124003c69f 100644 (file)
@@ -59,8 +59,9 @@ struct IsSameType<T1,T1> {
 
 
 
-class CalciumInterface {
-public :
+//class CalciumInterface {
+namespace CalciumInterface {
+//public :
 
 
   static void
@@ -121,23 +122,21 @@ public :
 
   // Uniquement appelé par l'utilisateur s'il a passé un pointeur de données NULL
   // à l'appel de ecp_lecture (demande de 0 copie)
-  template <typename T1 > static void
-  ecp_free ( T1 * dataPtr )
-  { 
-    ecp_free<T1,T1> ( dataPtr );
-  }
-  
-  template <typename T1,typename T2 > static void
+  template <typename T1, typename T2> static void
   ecp_free ( T1 * dataPtr )
-  { 
-
-    typedef typename ProvidesPortTraits<T2>::PortType      PortType;
+  {
+    typedef typename ProvidesPortTraits<T2>::PortType     PortType;
     typedef typename PortType::DataManipulator            DataManipulator;
     typedef typename DataManipulator::Type                DataType; // Attention != T
     typedef typename DataManipulator::InnerType           InnerType;
 
     DeleteTraits<IsSameType<T1,InnerType>::value >::apply(dataPtr);
+  }
 
+  template <typename T1> static void
+  ecp_free ( T1 * dataPtr )
+  {
+    ecp_free<T1,T1> ( dataPtr );
   }
 
   template <typename T1 > static void
diff --git a/src/Launcher/Makefile.am b/src/Launcher/Makefile.am
new file mode 100644 (file)
index 0000000..4104db4
--- /dev/null
@@ -0,0 +1,130 @@
+#  SALOME Container : implementation of container and engine for Kernel
+#
+#  Copyright (C) 2003  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 
+#  modify it under the terms of the GNU Lesser General Public 
+#  License as published by the Free Software Foundation; either 
+#  version 2.1 of the License. 
+# 
+#  This library is distributed in the hope that it will be useful, 
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+#  Lesser General Public License for more details. 
+# 
+#  You should have received a copy of the GNU Lesser General Public 
+#  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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+#
+#
+#  File   : Makefile.am
+#  Author : Guillaume Boulant (CSSI)
+#  Module : KERNEL
+#  $Header$
+
+
+include $(top_srcdir)/salome_adm/unix/make_common_starter.am
+
+#
+# ===============================================================
+# Header to be installed
+# ===============================================================
+#
+# header files  
+salomeinclude_HEADERS = \
+       SALOME_Launcher.hxx
+
+# Scripts to be installed
+dist_salomescript_DATA =
+
+# These files are executable scripts
+dist_salomescript_SCRIPTS=
+
+#
+# ===============================================================
+# Local definitions
+# ===============================================================
+#
+
+# This local variable defines the list of CPPFLAGS common to all target in this package.
+COMMON_CPPFLAGS=\
+       @PYTHON_INCLUDES@ \
+       @MPI_INCLUDES@ \
+       @CAS_CPPFLAGS@ @CAS_CXXFLAGS@ \
+       @LIBXML_INCLUDES@ \
+       -I$(srcdir)/../Batch \
+       -I$(srcdir)/../Basics \
+       -I$(srcdir)/../SALOMELocalTrace \
+       -I$(srcdir)/../NamingService \
+       -I$(srcdir)/../Utils \
+       -I$(srcdir)/../Registry \
+       -I$(srcdir)/../Notification \
+       -I$(srcdir)/../ResourcesManager \
+       -I$(srcdir)/../Container \
+       -I$(top_builddir)/salome_adm/unix \
+       -I$(top_builddir)/idl \
+       @CORBA_CXXFLAGS@ @CORBA_INCLUDES@
+
+# This local variable defines the list of dependant libraries common to all target in this package.
+COMMON_LIBS =\
+       ../Registry/libRegistry.la \
+       ../Notification/libSalomeNotification.la \
+       ../Container/libSalomeContainer.la \
+       ../ResourcesManager/libSalomeResourcesManager.la \
+       ../NamingService/libSalomeNS.la \
+       ../Utils/libOpUtil.la \
+       ../SALOMELocalTrace/libSALOMELocalTrace.la \
+       ../Basics/libSALOMEBasics.la \
+       ../Batch/libSalomeBatch.la \
+       $(top_builddir)/idl/libSalomeIDLKernel.la\
+       @MPI_LIBS@ \
+       @CORBA_LIBS@
+       @LIBXML_LIBS@
+
+#      @PYTHON_LIBS@
+
+#
+# ===============================================================
+# Libraries targets
+# ===============================================================
+#
+lib_LTLIBRARIES = libSalomeLauncher.la
+libSalomeLauncher_la_SOURCES=\
+       SALOME_Launcher.cxx
+
+libSalomeLauncher_la_CPPFLAGS =\
+       $(COMMON_CPPFLAGS)
+
+libSalomeLauncher_la_LDFLAGS  =\
+       -no-undefined -version-info=0:0:0 \
+       @LDEXPDYNFLAGS@
+
+libSalomeLauncher_la_LIBADD =\
+       $(PYTHON_LIBS) \
+       $(COMMON_LIBS)
+
+
+#
+# ===============================================================
+# Executables targets
+# ===============================================================
+#
+bin_PROGRAMS = SALOME_LauncherServer
+
+SALOME_LauncherServer_SOURCES =\
+       SALOME_LauncherServer.cxx
+
+SALOME_LauncherServer_CPPFLAGS=\
+       $(COMMON_CPPFLAGS)
+
+SALOME_LauncherServer_LDADD =\
+       libSalomeLauncher.la \
+       $(COMMON_LIBS) \
+       ../Basics/libSALOMEBasics.la \
+       ../Batch/libSalomeBatch.la
+
+
diff --git a/src/Launcher/SALOME_Launcher.cxx b/src/Launcher/SALOME_Launcher.cxx
new file mode 100644 (file)
index 0000000..564e361
--- /dev/null
@@ -0,0 +1,265 @@
+// Copyright (C) 2005  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
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#include "BatchLight_BatchManager_PBS.hxx"
+#include "BatchLight_BatchManager_SLURM.hxx"
+#include "BatchLight_Job.hxx"
+#include "SALOME_Launcher.hxx"
+#include "OpUtil.hxx"
+#include <sys/types.h>
+#ifndef WNT
+#include <unistd.h>
+#endif
+#include <vector>
+#include "Utils_CorbaException.hxx"
+#include "Batch_Date.hxx"
+
+#define TIME_OUT_TO_LAUNCH_CONT 21
+
+using namespace std;
+
+const char *SALOME_Launcher::_LauncherNameInNS = "/SalomeLauncher";
+
+//=============================================================================
+/*! 
+ *  Constructor
+ *  \param orb
+ *  Define a CORBA single thread policy for the server, which avoid to deal
+ *  with non thread-safe usage like Change_Directory in SALOME naming service
+ */
+//=============================================================================
+
+SALOME_Launcher::SALOME_Launcher(CORBA::ORB_ptr orb, PortableServer::POA_var poa)
+{
+  MESSAGE("constructor");
+  _NS = new SALOME_NamingService(orb);
+  _ResManager = new SALOME_ResourcesManager(orb,poa,_NS);
+  _ContManager = new SALOME_ContainerManager(orb,poa,_ResManager,_NS);
+
+  _orb = CORBA::ORB::_duplicate(orb) ;
+  _poa = PortableServer::POA::_duplicate(poa) ;
+  PortableServer::ObjectId_var id = _poa->activate_object(this);
+  CORBA::Object_var obj = _poa->id_to_reference(id);
+  Engines::SalomeLauncher_var refContMan = Engines::SalomeLauncher::_narrow(obj);
+
+  _NS->Register(refContMan,_LauncherNameInNS);
+  MESSAGE("constructor end");
+}
+
+//=============================================================================
+/*! 
+ * destructor
+ */
+//=============================================================================
+
+SALOME_Launcher::~SALOME_Launcher()
+{
+  MESSAGE("destructor");
+  delete _NS;
+  delete _ResManager;
+  delete _ContManager;
+  std::map < string, BatchLight::BatchManager * >::const_iterator it;
+  for(it=_batchmap.begin();it!=_batchmap.end();it++)
+    delete it->second;
+}
+
+//=============================================================================
+/*! CORBA method:
+ *  shutdown all the containers, then the ContainerManager servant
+ */
+//=============================================================================
+
+void SALOME_Launcher::Shutdown()
+{
+  MESSAGE("Shutdown");
+  _NS->Destroy_Name(_LauncherNameInNS);
+  _ContManager->Shutdown();
+  _ResManager->Shutdown();
+  PortableServer::ObjectId_var oid = _poa->servant_to_id(this);
+  _poa->deactivate_object(oid);
+  _remove_ref();
+  if(!CORBA::is_nil(_orb))
+    _orb->shutdown(0);
+}
+
+//=============================================================================
+/*! CORBA Method:
+ *  Submit a batch job on a cluster and returns the JobId
+ *  \param fileToExecute      : .py/.exe/.sh/... to execute on the batch cluster
+ *  \param filesToExport      : to export on the batch cluster
+ *  \param NumberOfProcessors : Number of processors needed on the batch cluster
+ *  \param params             : Constraints for the choice of the batch cluster
+ */
+//=============================================================================
+CORBA::Long SALOME_Launcher::submitSalomeJob( const char * fileToExecute ,
+                                             const Engines::FilesList& filesToExport ,
+                                             const Engines::FilesList& filesToImport ,
+                                             const CORBA::Long NumberOfProcessors ,
+                                             const Engines::MachineParameters& params)
+{
+  MESSAGE("BEGIN OF SALOME_Launcher::submitSalomeJob");
+  CORBA::Long jobId;
+  try{
+    // find a cluster matching the structure params
+    Engines::CompoList aCompoList ;
+    Engines::MachineList *aMachineList = _ResManager->GetFittingResources( params , aCompoList ) ;
+    const Engines::MachineParameters* p = _ResManager->GetMachineParameters((*aMachineList)[0]);
+    string clustername(p->alias);
+    
+    // search batch manager for that cluster in map or instanciate one
+    std::map < string, BatchLight::BatchManager * >::const_iterator it = _batchmap.find(clustername);
+    SCRUTE(clustername);
+    if(it == _batchmap.end())
+      _batchmap[clustername] = FactoryBatchManager( p );
+    
+    // submit job on cluster
+    BatchLight::Job* job = new BatchLight::Job( fileToExecute, filesToExport, filesToImport, NumberOfProcessors );
+    jobId = _batchmap[clustername]->submitJob(job);
+  }
+  catch(const SALOME_Exception &ex){
+    MESSAGE(ex.what());
+    THROW_SALOME_CORBA_EXCEPTION(ex.what(),SALOME::INTERNAL_ERROR);
+  }
+  return jobId;
+}
+
+//=============================================================================
+/*! CORBA Method:
+ *  Query a batch job on a cluster and returns the status of job
+ *  \param jobId              : identification of Salome job
+ *  \param params             : Constraints for the choice of the batch cluster
+ */
+//=============================================================================
+char* SALOME_Launcher::querySalomeJob( const CORBA::Long jobId, 
+                                      const Engines::MachineParameters& params)
+{
+  string status;
+  try{
+    // find a cluster matching params structure
+    Engines::CompoList aCompoList ;
+    Engines::MachineList * aMachineList = _ResManager->GetFittingResources( params , aCompoList ) ;
+    const Engines::MachineParameters* p = _ResManager->GetMachineParameters((*aMachineList)[0]);
+    string clustername(p->alias);
+    
+    // search batch manager for that cluster in map
+    std::map < string, BatchLight::BatchManager * >::const_iterator it = _batchmap.find(clustername);
+    if(it == _batchmap.end())
+      throw SALOME_Exception("no batchmanager for that cluster");
+    
+    status = _batchmap[clustername]->queryJob(jobId);
+  }
+  catch(const SALOME_Exception &ex){
+    INFOS("Caught exception.");
+    THROW_SALOME_CORBA_EXCEPTION(ex.what(),SALOME::BAD_PARAM);
+  }
+  return CORBA::string_dup(status.c_str());
+}
+
+//=============================================================================
+/*! CORBA Method:
+ *  Delete a batch job on a cluster 
+ *  \param jobId              : identification of Salome job
+ *  \param params             : Constraints for the choice of the batch cluster
+ */
+//=============================================================================
+void SALOME_Launcher::deleteSalomeJob( const CORBA::Long jobId, 
+                                      const Engines::MachineParameters& params)
+{
+  try{
+    // find a cluster matching params structure
+    Engines::CompoList aCompoList ;
+    Engines::MachineList *aMachineList = _ResManager->GetFittingResources( params , aCompoList ) ;
+    const Engines::MachineParameters* p = _ResManager->GetMachineParameters((*aMachineList)[0]);
+    string clustername(p->alias);
+    
+    // search batch manager for that cluster in map
+    std::map < string, BatchLight::BatchManager * >::const_iterator it = _batchmap.find(clustername);
+    if(it == _batchmap.end())
+      throw SALOME_Exception("no batchmanager for that cluster");
+    
+    _batchmap[clustername]->deleteJob(jobId);
+  }
+  catch(const SALOME_Exception &ex){
+    INFOS("Caught exception.");
+    THROW_SALOME_CORBA_EXCEPTION(ex.what(),SALOME::BAD_PARAM);
+  }
+}
+
+//=============================================================================
+/*! CORBA Method:
+ *  Get result files of job on a cluster
+ *  \param jobId              : identification of Salome job
+ *  \param params             : Constraints for the choice of the batch cluster
+ */
+//=============================================================================
+void SALOME_Launcher::getResultSalomeJob( const char *directory,
+                                         const CORBA::Long jobId, 
+                                         const Engines::MachineParameters& params)
+{
+  try{
+    // find a cluster matching params structure
+    Engines::CompoList aCompoList ;
+    Engines::MachineList *aMachineList = _ResManager->GetFittingResources( params , aCompoList ) ;
+    const Engines::MachineParameters* p = _ResManager->GetMachineParameters((*aMachineList)[0]);
+    string clustername(p->alias);
+    
+    // search batch manager for that cluster in map
+    std::map < string, BatchLight::BatchManager * >::const_iterator it = _batchmap.find(clustername);
+    if(it == _batchmap.end())
+      throw SALOME_Exception("no batchmanager for that cluster");
+    
+    _batchmap[clustername]->importOutputFiles( directory, jobId );
+  }
+  catch(const SALOME_Exception &ex){
+    INFOS("Caught exception.");
+    THROW_SALOME_CORBA_EXCEPTION(ex.what(),SALOME::BAD_PARAM);
+  }
+}
+
+//=============================================================================
+/*!
+ *  Factory to instanciate the good batch manager for choosen cluster.
+ */ 
+//=============================================================================
+
+BatchLight::BatchManager *SALOME_Launcher::FactoryBatchManager( const Engines::MachineParameters* params ) throw(SALOME_Exception)
+{
+  // Fill structure for batch manager
+  BatchLight::batchParams p;
+  p.hostname = params->alias;
+  p.protocol = params->protocol;
+  p.username = params->username;
+  p.applipath = params->applipath;
+  for(int i=0;i<params->modList.length();i++)
+    p.modulesList.push_back((const char*)params->modList[i]);
+  p.nbnodes = params->nb_node;
+  p.nbprocpernode = params->nb_proc_per_node;
+  p.mpiImpl = params->mpiImpl;
+
+  string sb = (const char*)params->batch;
+  if(sb == "pbs")
+    return new BatchLight::BatchManager_PBS(p);
+  else if(sb == "slurm")
+    return new BatchLight::BatchManager_SLURM(p);
+  else{
+    MESSAGE("BATCH = " << params->batch);
+    throw SALOME_Exception("no batchmanager for that cluster");
+  }
+}
+
diff --git a/src/Launcher/SALOME_Launcher.hxx b/src/Launcher/SALOME_Launcher.hxx
new file mode 100644 (file)
index 0000000..5c83afb
--- /dev/null
@@ -0,0 +1,80 @@
+// Copyright (C) 2005  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
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#ifndef __SALOME_LAUNCHER_HXX__
+#define __SALOME_LAUNCHER_HXX__
+
+#include <SALOMEconfig.h>
+#include CORBA_CLIENT_HEADER(SALOME_ContainerManager)
+#include "SALOME_ContainerManager.hxx"
+#include "BatchLight_BatchManager.hxx"
+
+#include <string>
+
+class SALOME_NamingService;
+
+#if defined LAUNCHER_EXPORTS
+#if defined WIN32
+#define LAUNCHER_EXPORT __declspec( dllexport )
+#else
+#define LAUNCHER_EXPORT
+#endif
+#else
+#if defined WNT
+#define LAUNCHER_EXPORT __declspec( dllimport )
+#else
+#define LAUNCHER_EXPORT
+#endif
+#endif
+
+class LAUNCHER_EXPORT SALOME_Launcher:
+  public POA_Engines::SalomeLauncher,
+  public PortableServer::RefCountServantBase
+{
+
+public:
+  SALOME_Launcher(CORBA::ORB_ptr orb, PortableServer::POA_var poa);
+  ~SALOME_Launcher();
+
+  CORBA::Long submitSalomeJob(const char * fileToExecute ,
+                             const Engines::FilesList& filesToExport ,
+                             const Engines::FilesList& filesToImport ,
+                             const CORBA::Long NumberOfProcessors ,
+                             const Engines::MachineParameters& params);
+
+  char* querySalomeJob( const CORBA::Long jobId, const Engines::MachineParameters& params);
+  void deleteSalomeJob( const CORBA::Long jobId, const Engines::MachineParameters& params);
+  void getResultSalomeJob( const char * directory, const CORBA::Long jobId, const Engines::MachineParameters& params );
+
+  void Shutdown();
+
+  static const char *_LauncherNameInNS;
+
+protected:
+  BatchLight::BatchManager *FactoryBatchManager( const Engines::MachineParameters* params ) throw(SALOME_Exception);
+
+  std::map <std::string,BatchLight::BatchManager*> _batchmap;
+  CORBA::ORB_var _orb;
+  PortableServer::POA_var _poa;
+  SALOME_ContainerManager *_ContManager;
+  SALOME_ResourcesManager *_ResManager;
+  SALOME_NamingService *_NS;
+};
+
+#endif
diff --git a/src/Launcher/SALOME_LauncherServer.cxx b/src/Launcher/SALOME_LauncherServer.cxx
new file mode 100644 (file)
index 0000000..a08fecc
--- /dev/null
@@ -0,0 +1,98 @@
+// Copyright (C) 2005  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
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#include "SALOME_Launcher.hxx"
+#include "utilities.h"
+#include <sstream>
+#include <iostream>
+#include <stdexcept>
+using namespace std;
+
+void AttachDebugger()
+{
+  if(getenv ("DEBUGGER"))
+    {
+      std::stringstream exec;
+      exec << "$DEBUGGER SALOME_LauncherServer " << getpid() << "&";
+      std::cerr << exec.str() << std::endl;
+      system(exec.str().c_str());
+      while(1);
+    }
+}
+
+void terminateHandler(void)
+{
+  std::cerr << "Terminate: not managed exception !"  << std::endl;
+  AttachDebugger();
+}
+
+void unexpectedHandler(void)
+{
+  std::cerr << "Unexpected: unexpected exception !"  << std::endl;
+  AttachDebugger();
+}
+
+
+int main(int argc, char* argv[])
+{
+  if(getenv ("DEBUGGER"))
+    {
+//       setsig(SIGSEGV,&Handler);
+      set_terminate(&terminateHandler);
+      set_unexpected(&unexpectedHandler);
+    }
+  PortableServer::POA_var root_poa;
+  PortableServer::POAManager_var pman;
+  CORBA::Object_var obj;
+
+  CORBA::ORB_ptr orb = CORBA::ORB_init( argc , argv ) ;
+  //  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
+  INFOS_COMPILATION;
+  BEGIN_OF(argv[0]);
+  try{ 
+    obj = orb->resolve_initial_references("RootPOA");
+    if(!CORBA::is_nil(obj))
+      root_poa = PortableServer::POA::_narrow(obj);
+    if(!CORBA::is_nil(root_poa))
+      pman = root_poa->the_POAManager();
+  }
+  catch(CORBA::COMM_FAILURE&){
+    MESSAGE( "Container: CORBA::COMM_FAILURE: Unable to contact the Naming Service" );
+  }
+  try{
+    SALOME_Launcher *lServ=new SALOME_Launcher(orb,root_poa);
+    pman->activate();
+    orb->run();
+  }catch(CORBA::SystemException&){
+    MESSAGE("Caught CORBA::SystemException.");
+  }catch(PortableServer::POA::WrongPolicy&){
+    MESSAGE("Caught CORBA::WrongPolicyException.");
+  }catch(PortableServer::POA::ServantAlreadyActive&){
+    MESSAGE("Caught CORBA::ServantAlreadyActiveException");
+  }catch(CORBA::Exception&){
+    MESSAGE("Caught CORBA::Exception.");
+  }catch(std::exception& exc){
+    MESSAGE("Caught std::exception - "<<exc.what()); 
+  }catch(...){
+    MESSAGE("Caught unknown exception.");
+  }
+  END_OF(argv[0]);
+  //  delete myThreadTrace;
+}
+
index 6bee2cf3c56c4420a2c2d31c6412866c2a3de316..df3eabdc7caffa8fba53190e0021394cfe921561 100644 (file)
@@ -55,10 +55,11 @@ COMMON_CPPFLAGS=\
        -I$(srcdir)/../SALOMETraceCollector \
        -I$(srcdir)/../NamingService \
        -I$(srcdir)/../Utils \
+       -I$(srcdir)/../Container \
        -I$(srcdir)/../ResourcesManager \
        -I$(top_builddir)/salome_adm/unix \
        -I$(top_builddir)/idl \
-       @CORBA_CXXFLAGS@ @CORBA_INCLUDES@
+       @CORBA_CXXFLAGS@ @CORBA_INCLUDES@ @LIBXML_INCLUDES@
 
 # This local variable defines the list of dependant libraries common to all target in this package.
 COMMON_LIBS =\
@@ -82,7 +83,7 @@ libSalomeLifeCycleCORBA_la_SOURCES  = \
 libSalomeLifeCycleCORBA_la_CPPFLAGS = \
        $(COMMON_CPPFLAGS) \
        @PYTHON_INCLUDES@ \
-       @QT_MT_INCLUDES@ \
+       -I$(srcdir)/../Batch \
        -I$(srcdir)/../Container \
        -I$(srcdir)/../Notification
 
@@ -97,7 +98,7 @@ libSalomeLifeCycleCORBA_la_LIBADD   = $(COMMON_LIBS)
 # Executables targets
 # ===============================================================
 #
-bin_PROGRAMS = Test_LifeCycleCORBA
+bin_PROGRAMS = Test_LifeCycleCORBA TestContainerManager
 Test_LifeCycleCORBA_SOURCES  = Test_LifeCycleCORBA.cxx
 Test_LifeCycleCORBA_CPPFLAGS =\
        -I$(srcdir)/../Registry \
@@ -112,8 +113,18 @@ Test_LifeCycleCORBA_LDADD    = \
        $(COMMON_LIBS) \
        @CORBA_LIBS@
 
-#CPPFLAGS += $(PYTHON_INCLUDES) $(QT_MT_INCLUDES)
+TestContainerManager_SOURCES  = TestContainerManager.cxx
+TestContainerManager_CPPFLAGS =\
+       -I$(srcdir)/../Batch \
+       -I$(srcdir)/../Registry \
+       -I$(srcdir)/../Notification \
+       $(COMMON_CPPFLAGS)
+
+TestContainerManager_LDADD    = \
+       libSalomeLifeCycleCORBA.la \
+       ../Registry/libRegistry.la \
+       ../Notification/libSalomeNotification.la \
+       ../Container/libSalomeContainer.la \
+       $(COMMON_LIBS) \
+       @CORBA_LIBS@
 
-#LDFLAGS += -lSalomeNS -lOpUtil -lSALOMELocalTrace -lSalomeContainer -lSalomeResourcesManager
-#LDFLAGSFORBIN= $(LDFLAGS) -lRegistry -lSalomeNotification -lSALOMEBasics
-#LIBS += $(PYTHON_LIBS)
index ef4ff83dcc603d15a3b36f8ab188c2b639b956a4..bb72d3f207ad92f63f4796ff22ec13e6dcbb2695 100644 (file)
@@ -116,14 +116,16 @@ string SALOME_FileTransferCORBA::getLocalFile(string localFile)
 
       SALOME_LifeCycleCORBA LCC;
       Engines::ContainerManager_var contManager = LCC.getContainerManager();
+      Engines::ResourcesManager_var resManager = LCC.getResourcesManager();
 
       Engines::MachineParameters params;
       LCC.preSet(params);
       params.container_name = _containerName.c_str();
       params.hostname = _refMachine.c_str();
 
+      Engines::CompoList clist;
       Engines::MachineList_var listOfMachines =
-       contManager->GetFittingResources(params, "");
+       resManager->GetFittingResources(params, clist);
 
       container = contManager->FindOrStartContainer(params,
                                                    listOfMachines);
index d4541abacdd231b126f6cb0dd3a7cb9010227ee2..9877b1bda2b578798f2158111a531387b0c74fd7 100644 (file)
@@ -94,6 +94,10 @@ SALOME_LifeCycleCORBA::SALOME_LifeCycleCORBA(SALOME_NamingService *ns)
     _NS->Resolve(SALOME_ContainerManager::_ContainerManagerNameInNS);
   ASSERT( !CORBA::is_nil(obj));
   _ContManager=Engines::ContainerManager::_narrow(obj);
+
+  obj = _NS->Resolve(SALOME_ResourcesManager::_ResourcesManagerNameInNS);
+  ASSERT( !CORBA::is_nil(obj));
+  _ResManager=Engines::ResourcesManager::_narrow(obj);
 }
 
 //=============================================================================
@@ -124,8 +128,11 @@ SALOME_LifeCycleCORBA::FindComponent(const Engines::MachineParameters& params,
   if (! isKnownComponentClass(componentName))
     return Engines::Component::_nil();
 
+  Engines::CompoList clist;
+  clist.length(1);
+  clist[0] = componentName;
   Engines::MachineList_var listOfMachines =
-    _ContManager->GetFittingResources(params, componentName);
+    _ResManager->GetFittingResources(params, clist);
 
   Engines::Component_var compo = _FindComponent(params,
                                                componentName,
@@ -155,8 +162,11 @@ SALOME_LifeCycleCORBA::LoadComponent(const Engines::MachineParameters& params,
   if (! isKnownComponentClass(componentName))
     return Engines::Component::_nil();
 
+  Engines::CompoList clist;
+  clist.length(1);
+  clist[0] = componentName;
   Engines::MachineList_var listOfMachines =
-    _ContManager->GetFittingResources(params, componentName);
+    _ResManager->GetFittingResources(params, clist);
 
   Engines::Component_var compo = _LoadComponent(params,
                                                componentName,
@@ -188,8 +198,11 @@ FindOrLoad_Component(const Engines::MachineParameters& params,
   if (! isKnownComponentClass(componentName))
     return Engines::Component::_nil();
 
+  Engines::CompoList clist;
+  clist.length(1);
+  clist[0] = componentName;
   Engines::MachineList_var listOfMachines =
-    _ContManager->GetFittingResources(params,componentName);
+    _ResManager->GetFittingResources(params,clist);
 
   Engines::Component_var compo = _FindComponent(params,
                                                componentName,
@@ -221,6 +234,23 @@ Engines::Component_ptr
 SALOME_LifeCycleCORBA::FindOrLoad_Component(const char *containerName,
                                            const char *componentName)
 {
+  char *valenv=getenv("SALOME_BATCH");
+  if(valenv)
+    if (strcmp(valenv,"1")==0)
+      {
+        MESSAGE("SALOME_LifeCycleCORBA::FindOrLoad_Component BATCH " << containerName << " " << componentName ) ;
+        _NS->Change_Directory("/Containers");
+        CORBA::Object_ptr obj=_NS->Resolve(containerName);
+        Engines::Container_var cont=Engines::Container::_narrow(obj);
+        bool isLoadable = cont->load_component_Library(componentName);
+        if (!isLoadable) return Engines::Component::_nil();
+        
+        Engines::Component_ptr myInstance =
+          cont->create_component_instance(componentName, 0);
+        return myInstance;
+      }
+  MESSAGE("SALOME_LifeCycleCORBA::FindOrLoad_Component INTERACTIF " << containerName << " " << componentName ) ;
+  //#if 0
   // --- Check if Component Name is known in ModuleCatalog
 
   if (! isKnownComponentClass(componentName))
@@ -257,7 +287,7 @@ SALOME_LifeCycleCORBA::FindOrLoad_Component(const char *containerName,
 //   SCRUTE(params->isMPI);
   free(stContainer);
   return FindOrLoad_Component(params,componentName);
-  
+  //#endif  
 }
 
 //=============================================================================
@@ -378,6 +408,19 @@ Engines::ContainerManager_ptr SALOME_LifeCycleCORBA::getContainerManager()
  return contManager._retn();
 }
 
+//=============================================================================
+/*! Public -
+ *  \return the container Manager
+ */
+//=============================================================================
+
+Engines::ResourcesManager_ptr SALOME_LifeCycleCORBA::getResourcesManager()
+{
+ Engines::ResourcesManager_var resManager =
+   Engines::ResourcesManager::_duplicate(_ResManager);
+ return resManager._retn();
+}
+
 
 //=============================================================================
 /*! Protected -
@@ -428,7 +471,7 @@ _FindComponent(const Engines::MachineParameters& params,
   if(lghtOfmachinesOK != 0)
     {
       machinesOK->length(lghtOfmachinesOK);
-      CORBA::String_var bestMachine = _ContManager->FindFirst(machinesOK);
+      CORBA::String_var bestMachine = _ResManager->FindFirst(machinesOK);
       CORBA::Object_var obj = _NS->ResolveComponent(bestMachine,
                                                    containerName,
                                                    componentName,
@@ -491,8 +534,11 @@ SALOME_LifeCycleCORBA::Load_ParallelComponent(const Engines::MachineParameters&
   MESSAGE("Number of component nodes : " << params.nb_component_nodes);
   MESSAGE("Component Name : " << componentName);*/
 
+  Engines::CompoList clist;
+  clist.length(1);
+  clist[0] = componentName;
   MESSAGE("Building a list of machines");
-  Engines::MachineList_var listOfMachines = _ContManager->GetFittingResources(params, componentName);
+  Engines::MachineList_var listOfMachines = _ResManager->GetFittingResources(params, clist);
   if (listOfMachines->length() == 0)
   {
     INFOS("No matching machines founded !");
index a8e0d5a883bc80078cca1c3097e695c57dcc302c..ced93eb1e82d0d949ace6ea78a9b52535044b922 100644 (file)
@@ -102,6 +102,7 @@ public:
   void preSet(Engines::MachineParameters& params);
 
   Engines::ContainerManager_ptr getContainerManager();
+  Engines::ResourcesManager_ptr getResourcesManager();
 
 protected:
 
@@ -124,6 +125,7 @@ protected:
   
   SALOME_NamingService *_NS;
   Engines::ContainerManager_var _ContManager;
+  Engines::ResourcesManager_var _ResManager;
   
 } ;
 
index a1a5827706ce0c4e71b3a0ae59611f0f3acac60d..2c724e369cfbba30f4e650747045547a6c83156c 100644 (file)
@@ -672,17 +672,20 @@ string LifeCycleCORBATest::GetRemoteHost()
 {
   SALOME_LifeCycleCORBA _LCC(&_NS);
 
-  CORBA::Object_var obj = _NS.Resolve("/ContainerManager");
+  CORBA::Object_var obj = _NS.Resolve("/ResourcesManager");
   CPPUNIT_ASSERT(!CORBA::is_nil(obj));
-  Engines::ContainerManager_var containerManager =
-    Engines::ContainerManager::_narrow(obj);
-  CPPUNIT_ASSERT(!CORBA::is_nil(containerManager));
+  Engines::ResourcesManager_var resourcesManager =
+    Engines::ResourcesManager::_narrow(obj);
+  CPPUNIT_ASSERT(!CORBA::is_nil(resourcesManager));
 
   Engines::MachineParameters params;
   _LCC.preSet(params);               // empty params to get all the machines
 
+  Engines::CompoList clist;
+  clist.length(1);
+  clist[0] = "SalomeTestComponent";
   Engines::MachineList_var hostList =
-    containerManager->GetFittingResources(params,"SalomeTestComponent");
+    resourcesManager->GetFittingResources(params,clist);
   CPPUNIT_ASSERT(hostList->length() > 1);
 
   string localHost = GetHostname();
index 9bfb82f7136e0d0d38238ed764abd3cba403a6f8..d6d857b6284936203c2124fb73135e973633ebd0 100644 (file)
@@ -64,12 +64,12 @@ cataServer.setpath(modules_list,modules_root_dir)
 cataServer.run()
 clt.waitNS("/Kernel/ModulCatalog")
 
-# launch container manager server
+# launch launcher server
 
-myCmServer = runSalome.ContainerManagerServer(args)
+myCmServer = runSalome.LauncherServer(args)
 myCmServer.setpath(modules_list,modules_root_dir)
 myCmServer.run()
-clt.waitNS("/ContainerManager")
+clt.waitNS("/SalomeLauncher")
 
 # execute Unit Test
 
@@ -79,8 +79,8 @@ ret = os.spawnvp(os.P_WAIT, command[0], command)
 # kill containers created by the Container Manager
 
 import Engines
-containerManager = clt.waitNS("/ContainerManager",Engines.ContainerManager)
-containerManager.Shutdown()
+launcher = clt.waitNS("/SalomeLauncher",Engines.SalomeLauncher)
+launcher.Shutdown()
 
 # kill Test process
 
diff --git a/src/LifeCycleCORBA/TestContainerManager.cxx b/src/LifeCycleCORBA/TestContainerManager.cxx
new file mode 100644 (file)
index 0000000..9313aac
--- /dev/null
@@ -0,0 +1,163 @@
+//  SALOME TestContainer : test of container creation and its life cycle
+//
+//  Copyright (C) 2003  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 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//
+//
+//  File   : TestContainer.cxx
+//  Author : Paul RASCLE, EDF - MARC TAJCHMAN, CEA
+//  Module : SALOME
+//  $Header$
+
+#include "utilities.h"
+#include <iostream>
+#include <unistd.h>
+#include <SALOMEconfig.h>
+#include "SALOME_NamingService.hxx"
+#include "SALOME_ContainerManager.hxx"
+#include "SALOME_LifeCycleCORBA.hxx"
+#include "NamingService_WaitForServerReadiness.hxx"
+#include "OpUtil.hxx"
+#include "Utils_ORB_INIT.hxx"
+#include "Utils_SINGLETON.hxx"
+#include "Utils_SALOME_Exception.hxx"
+#include "Utils_CommException.hxx"
+using namespace std;
+
+int main (int argc, char * argv[])
+{
+  map<string, int> cycle;
+  map<string, int> first;
+  Engines::Container_ptr cont;
+  Engines::Component_ptr compo;
+  bool error = false;
+  bool bestImplemented;
+
+  // Initializing omniORB
+  ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
+  CORBA::ORB_ptr orb = init( argc , argv ) ;
+
+  SALOME_NamingService *_NS=new SALOME_NamingService(orb);
+
+  CORBA::Object_var obj = _NS->Resolve(SALOME_ContainerManager::_ContainerManagerNameInNS);
+  ASSERT( !CORBA::is_nil(obj));
+  Engines::ContainerManager_var _ContManager=Engines::ContainerManager::_narrow(obj);
+  obj = _NS->Resolve(SALOME_ResourcesManager::_ResourcesManagerNameInNS);
+  ASSERT( !CORBA::is_nil(obj));
+  Engines::ResourcesManager_var _ResManager=Engines::ResourcesManager::_narrow(obj);
+
+  Engines::MachineParameters p;
+  Engines::CompoList clist;
+  clist.length(2);
+  clist[0] = "MED";
+  clist[1] = "GEOM";
+
+  p.hostname = "";
+  p.OS = "LINUX";
+  p.mem_mb = 1000;
+  p.cpu_clock = 1000;
+  p.nb_proc_per_node = 1;
+  p.nb_node = 1;
+  p.isMPI = false;
+
+  char st[10];
+  for(int i=0;i<10;i++){
+    sprintf(st,"cycl_%d",i);
+    p.container_name = CORBA::string_dup(st);
+    cont = _ContManager->GiveContainer(p,Engines::P_CYCL,clist);
+    if(CORBA::is_nil(cont)) error = true;
+  }
+
+  for(int i=0;i<10;i++){
+    sprintf(st,"first_%d",i);
+    p.container_name = CORBA::string_dup(st);
+    cont = _ContManager->GiveContainer(p,Engines::P_FIRST,clist);
+    if(CORBA::is_nil(cont)) error = true;
+  }
+
+  p.container_name = CORBA::string_dup("best");
+  cont = _ContManager->GiveContainer(p,Engines::P_BEST,clist);
+  if(CORBA::is_nil(cont)) bestImplemented = false;
+  else bestImplemented = true;
+
+  SALOME_LifeCycleCORBA LCC(_NS);
+  p.container_name = CORBA::string_dup("FactoryServer");
+  compo = LCC.FindOrLoad_Component(p,"SMESH");
+  if(CORBA::is_nil(compo)) error = true;
+  compo = LCC.FindOrLoad_Component(p,"SMESH");
+  if(CORBA::is_nil(compo)) error = true;
+
+  _NS->Change_Directory("/Containers");
+
+  vector<string> vec = _NS->list_directory_recurs();
+  list<string> lstCont;
+  for(vector<string>::iterator iter = vec.begin();iter!=vec.end();iter++){
+    CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
+    Engines::Container_var cont=Engines::Container::_narrow(obj);
+    if(!CORBA::is_nil(cont)){
+      cycle[cont->getHostName()]=0;
+      first[cont->getHostName()]=0;
+      lstCont.push_back((*iter));
+    }
+  }
+  for(list<string>::iterator iter=lstCont.begin();iter!=lstCont.end();iter++){
+    CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
+    Engines::Container_var cont=Engines::Container::_narrow(obj);
+    if(!CORBA::is_nil(cont)){
+      if(strncmp(basename(cont->name()),"cycl",4)==0)
+       cycle[cont->getHostName()]++;
+      if(strncmp(basename(cont->name()),"first",5)==0)
+       first[cont->getHostName()]++;
+    }
+  }
+  _ContManager->ShutdownContainers();
+
+  int cmin=10;
+  int cmax=0;
+  int fmin=10;
+  int fmax=0;
+  int nbpmax;
+  for(map<string,int>::iterator iter=cycle.begin();iter!=cycle.end();iter++){
+    if(strcmp((*iter).first.c_str(),"localhost")!=0){
+      Engines::MachineParameters *p = _ResManager->GetMachineParameters((*iter).first.c_str());
+      int nbproc = p->nb_node * p->nb_proc_per_node;
+      if(cycle[(*iter).first]/nbproc<cmin) cmin=cycle[(*iter).first]/nbproc;
+      if(cycle[(*iter).first]/nbproc>cmax) cmax=cycle[(*iter).first]/nbproc;
+      if(first[(*iter).first]/nbproc<fmin) fmin=first[(*iter).first]/nbproc;
+      if(first[(*iter).first]/nbproc>fmax){
+       fmax=first[(*iter).first]/nbproc;
+       nbpmax = nbproc;
+      }
+    }
+  }
+  if( ((cmax-cmin) <= 1) && (fmax == 10/nbpmax) && !error ){
+    string msg;
+    if(bestImplemented)
+      msg = "TEST OK";
+    else
+      msg = "TEST OK but FindBest not implemented!";
+    MESSAGE(msg);
+    return 0;
+  }
+  else{
+    MESSAGE("TEST KO");
+    return 1;
+  }
+}
index 8a4d7856e21a0c2c9312f0a06908ee699e6634a4..8ffe63ee6b9b7af598e4ebcf7b7abb4a2fdfe8c3 100644 (file)
@@ -75,10 +75,10 @@ clt.waitNS("/Kernel/ModulCatalog")
 
 # launch container manager server
 
-myCmServer = runSalome.ContainerManagerServer(args)
+myCmServer = runSalome.LauncherServer(args)
 myCmServer.setpath(modules_list,modules_root_dir)
 myCmServer.run()
-clt.waitNS("/ContainerManager")
+clt.waitNS("/SalomeLauncher")
 
 # execute Unit Test
 
@@ -92,8 +92,8 @@ unittest.TextTestRunner(verbosity=2).run(LifeCycleCORBA_SWIGTest.suite())
 # kill containers created by the Container Manager
 
 import Engines
-containerManager = clt.waitNS("/ContainerManager",Engines.ContainerManager)
-containerManager.Shutdown()
+launcher = clt.waitNS("/SalomeLauncher",Engines.SalomeLauncher)
+launcher.Shutdown()
 
 # kill Test process
 
index 55eff87da64bf7f5b5dfd274cc3d25c7bf3a1d8c..dc3f9b7aaec22036c577096fc32a44f499a0b469 100644 (file)
@@ -43,6 +43,7 @@ SUBDIR_CORBA = \
   NOTIFICATION_SWIG \
   Container \
   TestContainer \
+  Launcher \
   LifeCycleCORBA \
   LifeCycleCORBA_SWIG \
   SALOMEDSClient \
@@ -101,6 +102,10 @@ DIST_SUBDIRS = \
 
 SUBDIRS = $(SUBDIR_BASE)
 
+if WITH_BATCH
+  SUBDIRS += $(SUBDIR_BATCH)
+endif
+
 if CORBA_GEN
   SUBDIRS += $(SUBDIR_CORBA)
 endif
@@ -109,10 +114,6 @@ endif
 #  SUBDIRS += $(SUBDIR_MPI)
 #endif
 
-if WITH_BATCH
-  SUBDIRS += $(SUBDIR_BATCH)
-endif
-
 if CPPUNIT_IS_OK
 if CORBA_GEN
   SUBDIRS += \
index a29139fd2d5715fe642a36f0821439527e14b415..83f138d3dbb425f2fc535f1c8ae3259da0e5f18e 100644 (file)
@@ -62,8 +62,8 @@ COMMON_CPPFLAGS=\
        -I$(srcdir)/../Utils \
        -I$(top_builddir)/salome_adm/unix \
        -I$(top_builddir)/idl \
-       @CORBA_CXXFLAGS@ @CORBA_INCLUDES@ \
-       @QT_MT_INCLUDES@
+       @LIBXML_INCLUDES@ \
+       @CORBA_CXXFLAGS@ @CORBA_INCLUDES@
 
 # This local variable defines the list of dependant libraries common to all target in this package.
 COMMON_LIBS =\
@@ -71,7 +71,8 @@ COMMON_LIBS =\
        ../Utils/libOpUtil.la \
        ../SALOMELocalTrace/libSALOMELocalTrace.la \
        ../Basics/libSALOMEBasics.la \
-       $(top_builddir)/idl/libSalomeIDLKernel.la
+       $(top_builddir)/idl/libSalomeIDLKernel.la \
+       @LIBXML_LIBS@
 
 libSalomeCatalog_la_SOURCES =\
        SALOME_ModuleCatalog_Handler.cxx  \
@@ -85,8 +86,7 @@ libSalomeCatalog_la_CPPFLAGS =\
 libSalomeCatalog_la_LDFLAGS = -no-undefined -version-info=0:0:0
 
 libSalomeCatalog_la_LIBADD  =\
-       $(COMMON_LIBS) \
-       @QT_MT_LIBS@
+       $(COMMON_LIBS)
 
 
 #
index 82f1710b81e4f3892d811108114a90eb34d85da0..c4104d9bdd6f06477c75abb2ff062f4c60b35881 100644 (file)
@@ -17,7 +17,7 @@
 //  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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 //
 //
@@ -53,7 +53,9 @@ SALOME_ModuleCatalog_Handler::SALOME_ModuleCatalog_Handler()
   // Used in the function endElement
   test_path_prefix_name     = "path-prefix-name";
   test_computer_name        = "computer-name" ;
+  test_computer_list        = "computer-list" ;
   test_path_prefix          = "path-prefix" ;
+  test_path_prefix_list     = "path-prefix-list" ;
 
   test_component_name       = "component-name";
   test_component_username   = "component-username";
@@ -99,6 +101,7 @@ SALOME_ModuleCatalog_Handler::SALOME_ModuleCatalog_Handler()
 
   test_constraint = "constraint";
 
+  test_component_list = "component-list";
   test_component="component";
 
   if(MYDEBUG) END_OF("SALOME_ModuleCatalog_Handler");
@@ -114,11 +117,14 @@ SALOME_ModuleCatalog_Handler::~SALOME_ModuleCatalog_Handler()
   if(MYDEBUG) END_OF("~SALOME_ModuleCatalog_Handler()")
 }
 
-//----------------------------------------------------------------------
-// Function : startDocument
-// Purpose  : overload handler function
-//----------------------------------------------------------------------
-bool SALOME_ModuleCatalog_Handler::startDocument()
+
+//=============================================================================
+/*!
+ *  Processes XML document and fills the list of modules
+ */ 
+//=============================================================================
+
+void SALOME_ModuleCatalog_Handler::ProcessXmlDocument(xmlDocPtr theDoc)
 {
   if(MYDEBUG) MESSAGE("Begin parse document");
   // Empty the private elements
@@ -131,465 +137,452 @@ bool SALOME_ModuleCatalog_Handler::startDocument()
   _outDataStreamParamList.resize(0);
   _inParamList.resize(0);
   _outParamList.resize(0);
-  return true;
-}
-
-//----------------------------------------------------------------------
-// Function : startElement
-// Purpose  : overload handler function
-//----------------------------------------------------------------------
-bool SALOME_ModuleCatalog_Handler::startElement(const QString&, 
-                                               const QString &,
-                                               const QString& qName, 
-                                               const QXmlAttributes& atts)
-{
-  _xml_pile.push(qName);
 
-  return true;
-} 
-
-//----------------------------------------------------------------------
-// Function : endElement
-// Purpose  : overload handler function
-//----------------------------------------------------------------------
-bool SALOME_ModuleCatalog_Handler::endElement(const QString&, 
-                                             const QString &,
-                                             const QString& qName)
-{
-  QString parent, grandparent;
-  _xml_pile.pop();
-  if (!_xml_pile.empty()) {
-    parent = _xml_pile.top();
-    _xml_pile.pop();
-    if (!_xml_pile.empty()) grandparent = _xml_pile.top();
-    _xml_pile.push(parent);
-  }
-
-  // Path prefix
-
-  // tag test_path_prefix_name
-  if((qName.compare(test_path_prefix_name)==0)) {
-    _pathPrefix.path = content;
-    return true;
-  }
-
-  // tag test_computer_name
-  if((qName.compare(test_computer_name)==0)) {
-    _pathPrefix.listOfComputer.push_back(content);
-    return true;
-  }
-   
-  // tag test_path_prefix
-  if((qName.compare(test_path_prefix)==0)) {
-    _pathList.push_back(_pathPrefix);
-    _pathPrefix.listOfComputer.resize(0);
-    return true;
-  }
-
-  // Component identification
-
-  // tag test_component_name
-  if((qName.compare(test_component_name)==0)) {
-    _aModule.name = content ;
-    return true;
-  }
-
-  // tag test_component_username
-  if((qName.compare(test_component_username)==0)) {
-    _aModule.username = content ;
-    return true;
-  }
-
-  // tag test_component_type
-   if((qName.compare(test_component_type)==0)) 
-     {
-       if ((content.compare("MESH") == 0) ||
-          (content.compare("Mesh") == 0) ||
-          (content.compare("mesh") == 0))
-        _aModule.type = MESH ;
-       else if((content.compare("MED") == 0) ||
-              (content.compare("Med") == 0) ||
-              (content.compare("med") == 0))
-        _aModule.type = Med ;
-       else if((content.compare("GEOM") == 0) ||
-              (content.compare("Geom") == 0) ||
-              (content.compare("geom") == 0))
-        _aModule.type = GEOM ;
-       else if((content.compare("SOLVER") == 0) ||
-              (content.compare("Solver") == 0) ||
-              (content.compare("solver") == 0))
-        _aModule.type = SOLVER ;
-       else if((content.compare("SUPERV") == 0) ||
-              (content.compare("Superv") == 0) ||
-              (content.compare("Supervision") == 0) ||
-              (content.compare("superv") == 0))
-        _aModule.type = SUPERV ;
-       else if((content.compare("DATA") == 0) ||
-              (content.compare("Data") == 0) ||
-              (content.compare("data") == 0))
-        _aModule.type = DATA ; 
-       else if((content.compare("VISU") == 0) ||
-              (content.compare("Visu") == 0) ||
-              (content.compare("visu") == 0))
-        _aModule.type = VISU ; 
-       else if((content.compare("OTHER") == 0) ||
-              (content.compare("Other") == 0) ||
-              (content.compare("other") == 0))                
-        _aModule.type = OTHER ;
-       else
-        // If it'not in all theses cases, the type is affected to OTHER
-        _aModule.type = OTHER ;
-       return true;
-     }
-
-   // tag test_component_multistudy
-   if((qName.compare(test_component_multistudy)==0)) {
-    _aModule.multistudy = atoi(content.c_str()) ;
-    return true;
-   }
-
-   // tag test_component_impltype
-  if((qName.compare(QString(test_component_impltype))==0)) 
-    _aModule.implementationType = atoi(content.c_str()) ;
-
-  // tag test_component_icon
-   if((qName.compare(test_component_icon)==0)) {
-     _aModule.icon = content ;
-     return true;
-   }
-
-  // tag test_component_version
-   if((qName.compare(test_component_version)==0)) {
-     _aModule.version = content ;
-     return true;
-   }
-
-  // tag test_component_comment
-   if((qName.compare(test_component_comment)==0)) {
-     _aModule.comment = content ;
-     return true;
-   }
-
-   // interface identification
-
-   // tag test_interface_name
-   if ((qName.compare(test_interface_name)==0)) {
-       _aInterface.name = content ;
-       return true;
-   }
-
-   // Service identification
-
-   // tag test_service_name
-   if ((qName.compare(test_service_name)==0)) {
-     _aService.name = content ;
-     return true;
-   }
-
-   //tag test_defaultservice
-   if ((qName.compare(test_defaultservice)==0)) {
-     _aService.byDefault = atoi(content.c_str()) ;
-     return true;
-   }
-
-   //tag test_typeofnode
-   if((qName.compare(QString(test_typeofnode))==0))
-     _aService.typeOfNode = atoi(content.c_str()) ;
-
-   // Parameter in
-
-   // tag test_inDataStreamParameter_type
-   if ((qName.compare(test_inDataStreamParameter_type)==0)) {
-     if (grandparent.compare(test_inDataStreamParameter_list) == 0)
-       _inDataStreamParam.type = content ;
-     else 
-        _inParam.type = content ;
-     return true;
-   }
-        
-   // tag test_inParameter_type
-   if ((qName.compare(test_inParameter_type)==0)) {
-     if (grandparent.compare(test_inDataStreamParameter_list) == 0)
-       _inDataStreamParam.type = content ;
-     else 
-        _inParam.type = content ;
-     return true;
-   }
-        
-   //tag test_inDataStreamParameter_name
-   if ((qName.compare(test_inDataStreamParameter_name)==0)) {
-     if (grandparent.compare(test_inDataStreamParameter_list) == 0)
-       _inDataStreamParam.name = content ;
-     else 
-        _inParam.name = content ;
-     return true;
-   }
-
-   //tag test_inParameter_name
-   if ((qName.compare(test_inParameter_name)==0)) {
-     if(MYDEBUG) SCRUTE(parent);
-     if(MYDEBUG) SCRUTE(grandparent);
-     if (grandparent.compare(test_inDataStreamParameter_list) == 0)
-       _inDataStreamParam.name = content ;
-     else 
-       _inParam.name = content ;
-     return true;
-   }
-
-   //tag test_inDataStreamParameter_dependency
-   if ((qName.compare(test_inDataStreamParameter_dependency)==0)) {
-       _inDataStreamParam.dependency = content ;
-     return true;
-   }
-
-   //tag test_inParameter
-  if ((qName.compare(test_inParameter)==0))
-    {
-      if (parent.compare(test_inParameter_list)==0) {
-       
-       if(MYDEBUG) MESSAGE("add inParameter : " << _inParam.name);
-       _inParamList.push_back(_inParam) ; 
-       
-       // Empty temporary structures
-       _inParam.type = "";
-       _inParam.name = "";
-      }
-      else if ((qName.compare(test_inDataStreamParameter)==0)) {
-       
-       if(MYDEBUG) MESSAGE("add inDataStreamParameter : " << _inDataStreamParam.name);
-       _inDataStreamParamList.push_back(_inDataStreamParam) ; 
-       
-       // Empty temporary structures
-       _inDataStreamParam.type = "";
-       _inDataStreamParam.name = "";
-       _inDataStreamParam.dependency = "";
-      }
-      return true;
-    }
-  
-   //tag test_inParameter_list
-   if((qName.compare(test_inParameter_list)==0))
-     {
-       if(MYDEBUG) SCRUTE(_inParamList.size());
-       _aService.inParameters = _inParamList;
-       _inParamList.resize(0);
-       return true;
-     }
+  // Get the document root node
+  xmlNodePtr aCurNode = xmlDocGetRootElement(theDoc);
+  aCurNode = aCurNode->xmlChildrenNode;
   
-   //tag test_inDataStreamParameter_list
-   if((qName.compare(test_inDataStreamParameter_list)==0))
-     {
-       if(MYDEBUG) SCRUTE(_inDataStreamParamList.size());
-       _aService.inDataStreamParameters = _inDataStreamParamList;
-       _inDataStreamParamList.resize(0);
-     }
-   //tag test_outDataStreamParameter_list
-   if((qName.compare(test_outDataStreamParameter_list)==0))
-     {
-       if(MYDEBUG) SCRUTE(_outDataStreamParamList.size());
-       _aService.outDataStreamParameters = _outDataStreamParamList;
-       _outDataStreamParamList.resize(0);
-       return true;
-     }
-
-
-
-   // Parameter out
-   if(MYDEBUG) SCRUTE(qName);
-
-   // tag test_outParameter_type
-   if ((qName.compare(test_outParameter_type)==0)) {
-     if (grandparent.compare(test_outDataStreamParameter_list) == 0)
-       _outDataStreamParam.type = content ;
-     else 
-        _outParam.type = content ;
-     return true;
-   }
-        
-   // tag test_outDataStreamParameter_type
-   if ((qName.compare(test_outDataStreamParameter_type)==0)) {
-     if (grandparent.compare(test_outDataStreamParameter_list) == 0)
-       _outDataStreamParam.type = content ;
-     else 
-        _outParam.type = content ;
-     return true;
-   }
-        
-   //tag test_outParameter_name
-   if ((qName.compare(test_outParameter_name)==0)) {
-     if (grandparent.compare(test_outDataStreamParameter_list) == 0)
-       _outDataStreamParam.name = content ;
-     else 
-        _outParam.name = content ;
-     return true;
-   }
-        
-   //tag test_outDataStreamParameter_name
-   if ((qName.compare(test_outDataStreamParameter_name)==0)) {
-     if(MYDEBUG) SCRUTE(grandparent);
-     if(MYDEBUG) SCRUTE(test_outDataStreamParameter_list);
-     if (grandparent.compare(test_outDataStreamParameter_list) == 0)
-       _outDataStreamParam.name = content ;
-     else 
-        _outParam.name = content ;
-     return true;
-   }
-        
-   //tag test_outParameter_dependency
-   if ((qName.compare(test_outDataStreamParameter_dependency)==0)) {
-     _outDataStreamParam.dependency = content ;
-     return true;
-   }
-
-   //tag test_outParameter
-  if ((qName.compare(test_outParameter)==0))
+  // Processing the document nodes
+  while(aCurNode != NULL)
+  {
+    // Process path prefix list (tag test_path_prefix_list)
+    if ( !xmlStrcmp(aCurNode->name,(const xmlChar*)test_path_prefix_list) )
     {
-      if (parent.compare(test_outParameter_list)==0) {
-       
-       if(MYDEBUG) MESSAGE("add outParameter : " << _outParam.name);
-       _outParamList.push_back(_outParam) ; 
-       
-       // Empty temporary structures
-       _outParam.type = "";
-       _outParam.name = "";
+      xmlNodePtr aCurSubNode = aCurNode->xmlChildrenNode;
+      while(aCurSubNode != NULL)
+      {
+        // Forming a PathPrefix structure (tag test_path_prefix)
+        if ( xmlStrcmp(aCurSubNode->name, (const xmlChar*)test_path_prefix) ) {
+          aCurSubNode = aCurSubNode->next;
+          continue;
+        }
+
+        xmlNodePtr aCurSubSubNode = aCurSubNode->xmlChildrenNode;
+        while(aCurSubSubNode != NULL)
+        {
+          // Tag test_path_prefix_name
+          if ( !xmlStrcmp(aCurSubSubNode->name, (const xmlChar*)test_path_prefix_name) ) {
+            xmlChar* aPath = xmlNodeGetContent(aCurSubSubNode);
+            if (aPath != NULL) {
+              _pathPrefix.path = (const char*)aPath;
+              xmlFree(aPath);
+            }
+          }
+
+          // Tag test_computer_list
+          if ( !xmlStrcmp(aCurSubSubNode->name, (const xmlChar*)test_computer_list) ) {
+            xmlNodePtr aComputerNode = aCurSubSubNode->xmlChildrenNode;
+            while (aComputerNode != NULL) {
+              // Tag test_computer_name
+              if ( !xmlStrcmp(aComputerNode->name, (const xmlChar*) test_computer_name) ) {
+                xmlChar* aCompName = xmlNodeGetContent(aComputerNode);
+                if (aCompName != NULL) {
+                  _pathPrefix.listOfComputer.push_back((const char*)aCompName);
+                  xmlFree(aCompName);
+                }
+              }
+
+              aComputerNode = aComputerNode->next;
+            }
+          }
+
+          aCurSubSubNode = aCurSubSubNode->next;
+        }
+
+        _pathList.push_back(_pathPrefix);
+        _pathPrefix.listOfComputer.resize(0);
+
+        aCurSubNode = aCurSubNode->next;
       }
-      else if ((qName.compare(test_outDataStreamParameter)==0)) {
-       
-       if(MYDEBUG) MESSAGE("add outDataStreamParameter : " << _outDataStreamParam.name);
-       _outDataStreamParamList.push_back(_outDataStreamParam) ; 
-       
-       // Empty temporary structures
-       _outDataStreamParam.type = "";
-       _outDataStreamParam.name = "";
-       _outDataStreamParam.dependency = "";
-      }
-      return true;
     }
-  
-   //tag test_outParameter_list
-   if((qName.compare(test_outParameter_list)==0))
-     {
-       if(MYDEBUG) SCRUTE(_outParamList.size());
-       _aService.outParameters = _outParamList;
-       _outParamList.resize(0);
-       return true;
-     }
-  
-   // tag   test_service
-   if((qName.compare(test_service)==0))
-     {
-       _serviceList.push_back(_aService);
-
-       // Empty temporary structures
-       _aService.name = "";
-       _aService.typeOfNode = 1;
-       _aService.inParameters.resize(0);
-       _aService.outParameters.resize(0);
-       _aService.inDataStreamParameters.resize(0);
-       _aService.outDataStreamParameters.resize(0);
-     }
-
-   // tag   test_service_list
-   if((qName.compare(test_service_list)==0))
-     {
-       _aInterface.services = _serviceList ;
-
-       // Empty temporary structures
-       _serviceList.resize(0); 
-       _interfaceList.push_back(_aInterface);  
-       _aInterface.name ="";    
-       _aInterface.services.resize(0);
-
-     }
-
-   //tag test_interface_list
-   if((qName.compare(test_interface_list)==0))
-     {
-       _aModule.interfaces = _interfaceList ;
-       _interfaceList.resize(0);
-     }
-
-   //tag test_constraint
-   if((qName.compare(test_constraint)==0))
-     _aModule.constraint = content ;
-
-   // tag test_component
-   if((qName.compare(test_component)==0))
-     {
-       _moduleList.push_back(_aModule) ;
-       
-       // Empty temporary structures
-       _aModule.name = "";
-       _aModule.constraint = "";
-       _aModule.icon="";       
-       _aModule.interfaces.resize(0);
-     }
-    
-  return true;
-}
-  
-//----------------------------------------------------------------------
-// Function : characters
-// Purpose  : overload handler function
-//----------------------------------------------------------------------
-bool SALOME_ModuleCatalog_Handler::characters(const QString& chars)
-{
-  content = (const char*)chars ;
-  return true;
-}
 
-//----------------------------------------------------------------------
-// Function : endDocument
-// Purpose  : overload handler function
-//            Print all informations find in the catalog 
-//            (only in DEBUG mode!!)
-//----------------------------------------------------------------------  
-#include <fstream>
-bool SALOME_ModuleCatalog_Handler::endDocument()
-{
-//  ofstream f("/tmp/logs/xxx.log", std::ofstream::app);
-//  f << "---------------------------------------------------------" << std::endl;
-  if(MYDEBUG) BEGIN_OF("endDocument");
-  //_pathlist
-  for (unsigned int ind = 0; ind < _pathList.size(); ind++)
+    //@ Process list of components (tag test_component_list)
+    if ( !xmlStrcmp(aCurNode->name,(const xmlChar*)test_component_list) )
     {
-      if(MYDEBUG) MESSAGE("Path :"<<_pathList[ind].path);
-      for (unsigned int i = 0; i < _pathList[ind].listOfComputer.size(); i++)
-       if(MYDEBUG) MESSAGE("Computer name :" << _pathList[ind].listOfComputer[i]);
+      xmlNodePtr aComponentNode = aCurNode->xmlChildrenNode;
+      while (aComponentNode != NULL)
+      {
+        // Do not process tags differ from test_component here
+        if ( xmlStrcmp(aComponentNode->name, (const xmlChar*)test_component) ) {
+          aComponentNode = aComponentNode->next;
+          continue;
+        }
+
+        // Component identification
+
+        // Empty temporary structures
+        _aModule.name = "";
+        _aModule.constraint = "";
+        _aModule.icon="";       
+        _aModule.interfaces.resize(0);
+
+        xmlNodePtr aComponentSubNode = aComponentNode->xmlChildrenNode;
+        while(aComponentSubNode != NULL)
+        {
+          xmlChar* aNodeContent = xmlNodeGetContent(aComponentSubNode);
+
+          if (aNodeContent == NULL) {
+            aComponentSubNode = aComponentSubNode->next;
+            continue;
+          }
+
+          std::string aContent = (const char*)aNodeContent;
+
+          // Tag test_component_name
+          if ( !xmlStrcmp(aComponentSubNode->name, (const xmlChar*)test_component_name) )
+            _aModule.name = aContent;
+
+          // Tag test_component_username
+          if ( !xmlStrcmp(aComponentSubNode->name, (const xmlChar*)test_component_username) )
+            _aModule.username = aContent;
+
+          // Tag test_component_type
+          if ( !xmlStrcmp(aComponentSubNode->name, (const xmlChar*)test_component_type) ) {
+            std::string aType = aContent;
+
+            if ((aType.compare("MESH") == 0) ||
+                (aType.compare("Mesh") == 0) ||
+                (aType.compare("mesh") == 0))
+              _aModule.type = MESH ;
+            else if((aType.compare("MED") == 0) ||
+                    (aType.compare("Med") == 0) ||
+                    (aType.compare("med") == 0))
+              _aModule.type = Med ;
+            else if((aType.compare("GEOM") == 0) ||
+                    (aType.compare("Geom") == 0) ||
+                    (aType.compare("geom") == 0))
+              _aModule.type = GEOM ;
+            else if((aType.compare("SOLVER") == 0) ||
+                    (aType.compare("Solver") == 0) ||
+                    (aType.compare("solver") == 0))
+              _aModule.type = SOLVER ;
+            else if((aType.compare("SUPERV") == 0) ||
+                    (aType.compare("Superv") == 0) ||
+                    (aType.compare("Supervision") == 0) ||
+                    (aType.compare("superv") == 0))
+              _aModule.type = SUPERV ;
+            else if((aType.compare("DATA") == 0) ||
+                    (aType.compare("Data") == 0) ||
+                    (aType.compare("data") == 0))
+              _aModule.type = DATA ; 
+            else if((aType.compare("VISU") == 0) ||
+                    (aType.compare("Visu") == 0) ||
+                    (aType.compare("visu") == 0))
+              _aModule.type = VISU ; 
+            else if((aType.compare("OTHER") == 0) ||
+                    (aType.compare("Other") == 0) ||
+                    (aType.compare("other") == 0))                
+              _aModule.type = OTHER ;
+            else
+              // If it'not in all theses cases, the type is affected to OTHER
+              _aModule.type = OTHER ;
+          }
+
+          // Tag test_component_multistudy
+          if ( !xmlStrcmp(aComponentSubNode->name, (const xmlChar*)test_component_multistudy) )
+            _aModule.multistudy = atoi( aContent.c_str() );
+
+          // Tag test_component_impltype
+          if ( !xmlStrcmp(aComponentSubNode->name, (const xmlChar*)test_component_impltype) )
+            _aModule.implementationType = atoi(aContent.c_str());
+
+          // Tag test_component_icon
+          if ( !xmlStrcmp(aComponentSubNode->name, (const xmlChar*)test_component_icon) )
+            _aModule.icon = aContent;
+
+          // Tag test_component_version
+          if ( !xmlStrcmp(aComponentSubNode->name, (const xmlChar*)test_component_version) )
+            _aModule.version = aContent;
+
+          // Tag test_component_comment
+          if ( !xmlStrcmp(aComponentSubNode->name, (const xmlChar*)test_component_comment) )
+            _aModule.comment = aContent;
+
+          // Tag test_constraint
+          if ( !xmlStrcmp(aComponentSubNode->name, (const xmlChar*)test_constraint) )
+            _aModule.constraint = aContent;
+
+          xmlFree(aNodeContent);
+
+          // Process tag test_interface_list:
+          if ( !xmlStrcmp(aComponentSubNode->name, (const xmlChar*)test_interface_list) ) {
+
+            // Form an interface list for the component
+            xmlNodePtr aSubNode = aComponentSubNode->xmlChildrenNode;
+            while(aSubNode != NULL) {
+              // Tag test_interface_name
+              if ( !xmlStrcmp(aSubNode->name, (const xmlChar*)test_interface_name) ) {
+                xmlChar* anInterfaceName = xmlNodeGetContent(aSubNode);
+                if (anInterfaceName != NULL) {
+                  _aInterface.name = (const char*)anInterfaceName;
+                  xmlFree(anInterfaceName);
+                }
+              }
+
+              // Tag test_service_list
+              if ( !xmlStrcmp(aSubNode->name, (const xmlChar*)test_service_list) ) {
+                // Form a service list for the interface
+                xmlNodePtr aCompServiceNode = aSubNode->xmlChildrenNode;
+                while(aCompServiceNode != NULL) {
+                  // Tag test_service
+                  if ( !xmlStrcmp(aCompServiceNode->name, (const xmlChar*)test_interface_name) ) {
+                    xmlNodePtr aCompServiceSubNode = aCompServiceNode->xmlChildrenNode;
+                    while(aCompServiceSubNode != NULL)
+                    {
+                      xmlChar* aCompServiceData = xmlNodeGetContent(aCompServiceSubNode);
+
+                      if ( aCompServiceData != NULL)
+                      {
+                        // Tag test_service_name
+                        if ( !xmlStrcmp(aCompServiceSubNode->name, (const xmlChar*)test_service_name) )
+                          _aService.name = (const char*)aCompServiceData;
+
+                        // Tag test_defaultservice
+                        if ( !xmlStrcmp(aCompServiceSubNode->name, (const xmlChar*)test_defaultservice) )
+                          _aService.byDefault = (const char*)aCompServiceData;
+
+                        // Tag test_typeofnode
+                        if ( !xmlStrcmp(aCompServiceSubNode->name, (const xmlChar*)test_typeofnode) )
+                          _aService.typeOfNode = (const char*)aCompServiceData;
+
+                        xmlFree(aCompServiceData);
+                      }
+
+                      // Tag test_inParameter_list
+                      if ( !xmlStrcmp(aCompServiceSubNode->name, (const xmlChar*)test_inParameter_list) ) {
+                        xmlNodePtr aParamNode = aCompServiceSubNode->xmlChildrenNode;
+                        while (aParamNode != NULL)
+                        {
+                          // Tag test_inParameter
+                          if (xmlStrcmp(aParamNode->name, (const xmlChar*)test_inParameter)) {
+                            aParamNode = aParamNode->next;
+                            continue;
+                          }
+
+                          xmlNodePtr aParamItemNode = aParamNode->xmlChildrenNode;
+                          while (aParamItemNode != NULL)
+                          {
+                            xmlChar* aParamData = xmlNodeGetContent(aParamItemNode);
+
+                            if (aParamData != NULL)
+                            {
+                              // Tag test_inParameter_name
+                              if ( !xmlStrcmp(aParamItemNode->name, (const xmlChar*)test_inParameter_name) )
+                                _inParam.name = (const char*)aParamData;
+
+                              // Tag test_inParameter_type
+                              if ( !xmlStrcmp(aParamItemNode->name, (const xmlChar*)test_inParameter_type) )
+                                _inParam.type = (const char*)aParamData;
+
+                              xmlFree(aParamData);
+                            }
+
+                            aParamItemNode = aParamItemNode->next;
+                          }
+
+                          _inParamList.push_back(_inParam) ; 
+
+                          // Empty temporary structures
+                          _inParam.type = "";
+                          _inParam.name = "";
+
+                          aParamNode = aParamNode->next;
+                        }
+
+                        _aService.inParameters = _inParamList;
+                        _inParamList.resize(0);
+                      }
+
+                      // Tag test_outParameter_list
+                      if ( !xmlStrcmp(aCompServiceSubNode->name, (const xmlChar*)test_outParameter_list) ) {
+                        xmlNodePtr aParamNode = aCompServiceSubNode->xmlChildrenNode;
+                        while (aParamNode != NULL)
+                        {
+                          // Tag test_outParameter
+                          if (xmlStrcmp(aParamNode->name, (const xmlChar*)test_outParameter)) {
+                            aParamNode = aParamNode->next;
+                            continue;
+                          }
+
+                          xmlNodePtr aParamItemNode = aParamNode->xmlChildrenNode;
+                          while (aParamItemNode != NULL)
+                          {
+                            xmlChar* anOutParamData = xmlNodeGetContent(aParamItemNode);
+
+                            if (anOutParamData != NULL)
+                            {
+                              // Tag test_outParameter_name
+                              if ( !xmlStrcmp(aParamItemNode->name, (const xmlChar*)test_outParameter_name) )
+                                _outParam.name = (const char*)anOutParamData;
+
+                              // Tag test_outParameter_type
+                              if ( !xmlStrcmp(aParamItemNode->name, (const xmlChar*)test_outParameter_type) )
+                                _outParam.type = (const char*)anOutParamData;
+
+                              xmlFree(anOutParamData);
+                            }
+
+                            aParamItemNode = aParamItemNode->next;
+                          }
+
+                          _outParamList.push_back(_outParam) ; 
+
+                          // Empty temporary structures
+                          _outParam.type = "";
+                          _outParam.name = "";
+
+                          aParamNode = aParamNode->next;
+                        }
+
+                        _aService.outParameters = _outParamList;
+                        _outParamList.resize(0);
+                      }
+
+                      //@ Tag test_inDataStreamParameter_list
+                      if ( !xmlStrcmp(aCompServiceSubNode->name, (const xmlChar*)test_inDataStreamParameter_list) )
+                      {
+                        xmlNodePtr aParamNode = aCompServiceSubNode->xmlChildrenNode;
+                        while (aParamNode != NULL)
+                        {
+                          // Tag test_inDataStreamParameter
+                          if (xmlStrcmp(aParamNode->name, (const xmlChar*)test_inDataStreamParameter)) {
+                            aParamNode = aParamNode->next;
+                            continue;
+                          }
+
+                          xmlNodePtr aParamItemNode = aParamNode->xmlChildrenNode;
+                          while (aParamItemNode != NULL)
+                          {
+                            xmlChar* inDataStreamParamData = xmlNodeGetContent(aParamItemNode);
+
+                            if (inDataStreamParamData != NULL)
+                            {
+                              // Tag test_inDataStreamParameter_name
+                              if ( !xmlStrcmp(aParamItemNode->name, (const xmlChar*)test_inDataStreamParameter_name) )
+                                _inDataStreamParam.name = (const char*)inDataStreamParamData;
+
+                              // Tag test_inDataStreamParameter_type
+                              if ( !xmlStrcmp(aParamItemNode->name, (const xmlChar*)test_inDataStreamParameter_type) )
+                                _inDataStreamParam.type = (const char*)inDataStreamParamData;
+
+                              // Tag test_inDataStreamParameter_dependency
+                              if ( !xmlStrcmp(aParamItemNode->name, (const xmlChar*)test_inDataStreamParameter_dependency) )
+                                _inDataStreamParam.dependency = (const char*)inDataStreamParamData;
+
+                              xmlFree(inDataStreamParamData);
+                            }
+
+                            aParamItemNode = aParamItemNode->next;
+                          }
+
+                          _inDataStreamParamList.push_back(_inDataStreamParam) ; 
+
+                          // Empty temporary structures
+                          _inDataStreamParam.type = "";
+                          _inDataStreamParam.name = "";
+                          _inDataStreamParam.dependency = "";
+
+                          aParamNode = aParamNode->next;
+                        }
+
+                        _aService.inDataStreamParameters = _inDataStreamParamList;
+                        _inDataStreamParamList.resize(0);
+                      }
+
+                      // Tag test_outDataStreamParameter_list
+                      if ( !xmlStrcmp(aCompServiceSubNode->name, (const xmlChar*)test_outDataStreamParameter_list) )
+                      {
+                        xmlNodePtr aParamNode = aCompServiceSubNode->xmlChildrenNode;
+                        while (aParamNode != NULL)
+                        {
+                          // Tag test_outDataStreamParameter
+                          if (xmlStrcmp(aParamNode->name, (const xmlChar*)test_outDataStreamParameter)) {
+                            aParamNode = aParamNode->next;
+                            continue;
+                          }
+
+                          xmlNodePtr aParamItemNode = aParamNode->xmlChildrenNode;
+                          while (aParamItemNode != NULL)
+                          {
+                            xmlChar* outDataStreamParamData = xmlNodeGetContent(aParamItemNode);
+
+                            if (outDataStreamParamData != NULL)
+                            {
+                              // Tag test_outDataStreamParameter_name
+                              if ( !xmlStrcmp(aParamItemNode->name, (const xmlChar*)test_outDataStreamParameter_name) )
+                                _outDataStreamParam.name = (const char*)outDataStreamParamData;
+                              
+                              // Tag test_outDataStreamParameter_type
+                              if ( !xmlStrcmp(aParamItemNode->name, (const xmlChar*)test_outDataStreamParameter_type) )
+                                _outDataStreamParam.type = (const char*)outDataStreamParamData;
+                              
+                              // Tag test_outDataStreamParameter_dependency
+                              if ( !xmlStrcmp(aParamItemNode->name, (const xmlChar*)test_outDataStreamParameter_dependency) )
+                                _outDataStreamParam.dependency = (const char*)outDataStreamParamData;
+                              
+                              xmlFree(outDataStreamParamData);
+                            }
+
+                            aParamItemNode = aParamItemNode->next;
+                          }
+                          
+                          _outDataStreamParamList.push_back(_outDataStreamParam) ; 
+                          
+                          // Empty temporary structures
+                          _outDataStreamParam.type = "";
+                          _outDataStreamParam.name = "";
+                          _outDataStreamParam.dependency = "";
+
+                          aParamNode = aParamNode->next;
+                        }
+                        
+                        _aService.outDataStreamParameters = _outDataStreamParamList;
+                        _outDataStreamParamList.resize(0);
+                      }
+                      
+                      aCompServiceSubNode = aCompServiceSubNode->next;
+                    }
+
+                    // Put formed service into the list
+                    _serviceList.push_back(_aService);
+
+                    // Empty temporary structures
+                    _aService.name = "";
+                    _aService.typeOfNode = 1;
+                    _aService.inParameters.resize(0);
+                    _aService.outParameters.resize(0);
+                    _aService.inDataStreamParameters.resize(0);
+                    _aService.outDataStreamParameters.resize(0);
+                  }
+                  
+                  aCompServiceNode = aCompServiceNode->next;
+                }
+                
+                _aInterface.services = _serviceList ;
+                
+                // Empty temporary structures
+                _serviceList.resize(0);
+                _interfaceList.push_back(_aInterface);  
+                _aInterface.name ="";    
+                _aInterface.services.resize(0);
+              }
+              
+              aSubNode = aSubNode->next;
+            }
+            
+            _aModule.interfaces = _interfaceList ;
+            _interfaceList.resize(0);
+          }
+
+          aComponentSubNode = aComponentSubNode->next;
+        }
+
+        _moduleList.push_back(_aModule);
+
+        aComponentNode = aComponentNode->next;
+      }
     }
 
-   // _moduleList
-//  if(MYDEBUG) SCRUTE(_moduleList.size());
-//  for (unsigned int ind = 0; ind < _moduleList.size(); ind++)
-//    {
-//      f << _moduleList[ind] << std::endl;
-//    }
-
-  if(MYDEBUG) MESSAGE("Document parsed");
-  if(MYDEBUG) END_OF("endDocument");
-  return true;
-}
-//----------------------------------------------------------------------
-// Function : errorProtocol
-// Purpose  : overload handler function
-//----------------------------------------------------------------------  
-QString SALOME_ModuleCatalog_Handler::errorProtocol()
-{
-  return errorProt ;
-}
-
-
-//----------------------------------------------------------------------
-// Function : fatalError
-// Purpose  : overload handler function
-//----------------------------------------------------------------------  
-bool SALOME_ModuleCatalog_Handler::fatalError(const QXmlParseException& exception)
-{
-    errorProt += QString( "fatal parsing error: %1 in line %2, column %3\n" )
-    .arg( exception.message() )
-    .arg( exception.lineNumber() )
-    .arg( exception.columnNumber() );
-
-  return QXmlDefaultHandler::fatalError( exception );
+    aCurNode = aCurNode->next;
+  }
 }
index 01870cf85eac03ccf9cee9480424b2f89b5c016e..d8c27c5a8380f040dd70835ed62bcd566a11021a 100644 (file)
 #include <SALOME_ModuleCatalog.hxx>
 
 #include "SALOME_ModuleCatalog_Parser.hxx"
-#include <qxml.h>
+
 #include <string>
 #include <stack>
 #include <map>
 
-class MODULECATALOG_EXPORT SALOME_ModuleCatalog_Handler : public QXmlDefaultHandler 
+#include <libxml/parser.h>
+
+class MODULECATALOG_EXPORT SALOME_ModuleCatalog_Handler
 {
 public:
   //! standard constructor
@@ -46,140 +48,84 @@ public:
   //! standard destructor
   virtual ~SALOME_ModuleCatalog_Handler();
 
-
-  //! method to overload handler function startDocument
-  /*! Is called before a xml file is parsed
-   \return true if no error was detected
-  */ 
-  virtual bool startDocument();
-
-
-  //! method to overload handler function startElement
-  /*! 
-   \param QString argument by value
-   \param QString argument by value
-   \param QString argument by value
-   \param QXmlAttributes argument by value
-   \return true if no error was detected
-  */
-  virtual bool startElement(const QString&, const QString &,
-                           const QString& qName, const QXmlAttributes& atts); 
-
-  //! method to overload handler function endElement
-  /*!
-   \param QString argument by value
-   \param QString argument by value
-   \param QString argument by value
-   \return true if no error was detected
-   \sa _Find
-  */   
-  virtual bool endElement(const QString&, const QString &,
-                         const QString& qName);
-  
-
-  //! method to overload handler function characters
-  /*!
-   \param QString argument by value
-   \return true if no error was detected
-  */
-  virtual bool characters(const QString& chars);
-  
-  //! method to overload handler function endDocument
-  /*! Is called at the end of the parsing
-   \return true if no error was detected
-  */
-  virtual bool endDocument();
-
-  //! method to overload handler function errorProtocol
- /*!
-   \return the error message
-  */
-  virtual QString errorProtocol();
-
-  //! method to overload handler function fatalError
-  /*!
-    \param QXmlParseExecption argument by value
-    \return true if no error was detected
-  */
-  virtual bool fatalError(const QXmlParseException& exception);
+  void ProcessXmlDocument(xmlDocPtr theDoc);
  
 private:
-  QString errorProt ;
-
-  std::string content;
 
-  QString test_path_prefix_name ;
-  QString test_computer_name ;
-  QString test_path_prefix ;
-
-  QString test_component_name;
-  QString test_component_username;
-  QString test_component_type ;
-  QString test_component_multistudy ;
-  QString test_component_icon ;
-  QString test_component_impltype;
-  QString test_component_version;
-  QString test_component_comment;
-
-  QString test_interface_name;
-
-  QString test_service_name;
-  QString test_defaultservice;
-  QString test_typeofnode;
-
-  QString test_inParameter_type;
-  QString test_inParameter_name;
-  QString test_inParameter;
-  QString test_inParameter_list;
-
-  QString test_outParameter_type;
-  QString test_outParameter_name;
-  QString test_outParameter;
-  QString test_outParameter_list;
-
-  QString test_inDataStreamParameter_type;
-  QString test_inDataStreamParameter_name;
-  QString test_inDataStreamParameter_dependency;
-  QString test_inDataStreamParameter;
-  QString test_inDataStreamParameter_list;
-
-  QString test_outDataStreamParameter_type;
-  QString test_outDataStreamParameter_name;
-  QString test_outDataStreamParameter_dependency;
-  QString test_outDataStreamParameter;
-  QString test_outDataStreamParameter_list;
-
-  QString test_service;
-  QString test_service_list;
-  QString test_interface_list;
-  QString test_constraint;
+  const char *test_path_prefix_name ;
+  const char *test_computer_name ;
+  const char *test_computer_list ;
+  const char *test_path_prefix ;
+  const char *test_path_prefix_list;
+
+  const char *test_component_name;
+  const char *test_component_username;
+  const char *test_component_type ;
+  const char *test_component_multistudy ;
+  const char *test_component_icon ;
+  const char *test_component_impltype;
+  const char *test_component_version;
+  const char *test_component_comment;
+  
+  const char *test_interface_name;
+  
+  const char *test_service_name;
+  const char *test_defaultservice;
+  const char *test_typeofnode;
+  
+  const char *test_inParameter_type;
+  const char *test_inParameter_name;
+  const char *test_inParameter;
+  const char *test_inParameter_list;
+  
+  const char *test_outParameter_type;
+  const char *test_outParameter_name;
+  const char *test_outParameter;
+  const char *test_outParameter_list;
+  
+  const char *test_inDataStreamParameter_type;
+  const char *test_inDataStreamParameter_name;
+  const char *test_inDataStreamParameter_dependency;
+  const char *test_inDataStreamParameter;
+  const char *test_inDataStreamParameter_list;
+  
+  const char *test_outDataStreamParameter_type;
+  const char *test_outDataStreamParameter_name;
+  const char *test_outDataStreamParameter_dependency;
+  const char *test_outDataStreamParameter;
+  const char *test_outDataStreamParameter_list;
+  
+  const char *test_service;
+  const char *test_service_list;
+  const char *test_interface_list;
+  const char *test_constraint;
+  
+  const char *test_component_list;
+  const char *test_component;
   
-  QString test_component;
-
   ParserPathPrefix _pathPrefix;
-
+  
   ParserComponent _aModule;
-
-
+  
+  
   ParserInterfaces _interfaceList;
   ParserInterface  _aInterface;
-
+  
   ParserServices   _serviceList;
   ParserService    _aService;
 
   ParserParameters _inParamList;
   ParserParameter  _inParam;
-
+  
   ParserParameters _outParamList;
   ParserParameter  _outParam;
-
+  
   ParserDataStreamParameters _inDataStreamParamList;
   ParserDataStreamParameter  _inDataStreamParam;
-
+  
   ParserDataStreamParameters _outDataStreamParamList;
   ParserDataStreamParameter  _outDataStreamParam;
 
-  std::stack<QString> _xml_pile;
 };
 
 #endif // SALOME_CATALOG_HANDLER_H
index de5110a03e595010ece4dff01fe0c982b2c0bcdd..735ff5b13264ec8edaf57070e03758b6d19d66b7 100644 (file)
@@ -162,8 +162,8 @@ int main(int argc,char **argv)
 #endif
       orb->run();
  
-      mgr->deactivate(true,true);
-      poa->destroy(1,1);
+//       mgr->deactivate(true,true);
+//       poa->destroy(1,1);
 
     }
   catch(CORBA::SystemException&) {
@@ -173,6 +173,7 @@ int main(int argc,char **argv)
     INFOS("Caught CORBA::Exception.")
       }
 
+  END_OF( argv[0] );
   //  delete myThreadTrace;
   return 0;
 }
index 55dd3cede27404ae93484710edf10e50600db357..819e342b7bc54d93adb85b96bc82b9444619b46f 100644 (file)
@@ -31,8 +31,6 @@
 #include <fstream>
 #include <map>
 
-#include <qstringlist.h>
-#include <qfileinfo.h>
 using namespace std;
 
 #include "utilities.h"
@@ -46,6 +44,25 @@ static int MYDEBUG = 1;
 static const char* SEPARATOR     = "::";
 static const char* OLD_SEPARATOR = ":";
 
+
+list<string> splitStringToList(const string& theString, const string& theSeparator)
+{
+  list<string> aList;
+
+  int sepLen = theSeparator.length();
+  int startPos = 0, sepPos = theString.find(theSeparator, startPos);
+
+  for ( ; (startPos < theString.length()) && (sepPos != string::npos); sepPos = theString.find(theSeparator, startPos))
+    {
+      string anItem = theString.substr(startPos, sepPos - startPos);
+      if (anItem.length() > 0)
+       aList.push_back(anItem);
+      startPos = sepPos + sepLen;
+    }
+
+  return aList;
+}
+
 //----------------------------------------------------------------------
 // Function : SALOME_ModuleCatalogImpl
 // Purpose  : Constructor 
@@ -111,32 +128,31 @@ SALOME_ModuleCatalogImpl::SALOME_ModuleCatalogImpl(int argc, char** argv, CORBA:
     // Affect the _general_module_list and _general_path_list members
     // with the common catalog
     
-    QStringList dirList;
+    list<string> dirList;
+
 #ifdef WNT
-    dirList = QStringList::split( SEPARATOR, _general_path, 
-                                 false ); // skip empty entries
+    dirList = splitStringToList(_general_path, SEPARATOR);
 #else
     //check for new format
-    int isNew = QString( _general_path ).contains(SEPARATOR);
-    if ( isNew > 0 ) {
+    bool isNew = (std::string( _general_path ).find(SEPARATOR) != string::npos);
+    if ( isNew ) {
       //using new format
-      dirList = QStringList::split( SEPARATOR, _general_path, 
-                                   false ); // skip empty entries
+      dirList = splitStringToList(_general_path, SEPARATOR);
     } else {
       //support old format
-      dirList = QStringList::split( OLD_SEPARATOR, _general_path, 
-                                   false ); // skip empty entries
+      dirList =splitStringToList(_general_path, OLD_SEPARATOR);
     }   
 #endif
     
-    for ( int i = 0; i < dirList.count(); i++ ) {
-      //QFileInfo fileInfo( dirList[ i ] );
-      QFileInfo fileInfo( dirList[ i ].replace( '\"', "" ) ); //remove inverted commas from filename
-      if ( fileInfo.isFile() && fileInfo.exists() ) {
-       _parse_xml_file(fileInfo.filePath(), 
-                       _general_module_list, 
-                       _general_path_list);
-      }
+    for(list<string>::iterator iter=dirList.begin();iter!=dirList.end();iter++){
+      string aPath = (*iter);
+      //remove inverted commas from filename
+      while(aPath.find('\"') != string::npos)
+       aPath.erase(aPath.find('\"'), 1);
+
+      _parse_xml_file(aPath.c_str(), 
+                     _general_module_list, 
+                     _general_path_list);
     }
     
     // Verification of _general_path_list content
@@ -484,7 +500,7 @@ SALOME_ModuleCatalogImpl::GetComponent(const char* name)
 
   std::string s(name);
   ParserComponent *C_parser = NULL;
-  ParserPathPrefixes *pp = NULL;
+  //ParserPathPrefixes *pp = NULL;
 
   SALOME_ModuleCatalog::Acomponent_ptr compo
     = SALOME_ModuleCatalog::Acomponent::_nil();
@@ -575,16 +591,27 @@ SALOME_ModuleCatalogImpl::_parse_xml_file(const char* file,
   if(MYDEBUG) SCRUTE(file);
 
   SALOME_ModuleCatalog_Handler* handler = new SALOME_ModuleCatalog_Handler();
-  QFile xmlFile(file);
-
-  QXmlInputSource source(xmlFile);
 
-  QXmlSimpleReader reader;
-  reader.setContentHandler( handler );
-  reader.setErrorHandler( handler );
-  reader.parse( source );
-  xmlFile.close();
+  FILE* aFile = fopen(file, "r");
 
+  if (aFile != NULL)
+    {
+      xmlDocPtr aDoc = xmlReadFile(file, NULL, 0);
+      
+      if (aDoc != NULL) 
+       handler->ProcessXmlDocument(aDoc);
+      else
+       INFOS("ModuleCatalog: could not parse file "<<file);
+
+      xmlFreeDoc(aDoc);
+      xmlCleanupParser();
+      fclose(aFile);
+    }
+  else
+    INFOS("ModuleCatalog: file "<<file<<" is not readable.");
+  
+  delete handler;
+  
   unsigned int i, j;
 
   for ( i = 0; i < _moduleList.size(); i++) {
@@ -895,5 +922,3 @@ SALOME_ModuleCatalogImpl::_parseArguments(int argc, char **argv,
     }
   return _return_value;
 }
-
-
index 5dad3bacf8040313d3d2ed2875366384e9d5bd88..0768c5de776881a377c115885e9717ade830b5aa 100644 (file)
@@ -105,7 +105,7 @@ public:
 
   void ping(){};
 
-  void shutdown() { if (_orb) _orb->shutdown(1); };
+  void shutdown() { if(!CORBA::is_nil(_orb)) _orb->shutdown(0); };
 
 private:
   //! method to parse one module catalog
index 22fbc3c7d5d27d87bc7a58554aa476df6fc55582..13aa8a802d62a2fb4605668b55b2af1e8a87640e 100644 (file)
@@ -132,10 +132,9 @@ void SALOME_NamingService::Register(CORBA::Object_ptr ObjRef,
   // --- _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
@@ -149,179 +148,158 @@ void SALOME_NamingService::Register(CORBA::Object_ptr ObjRef,
 
   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();
     }
+  }
 }
 
 // ============================================================================
index 9b305d6a5cca95e9df4a935d49d387fc8fc7204b..16c0b736c119961522a91fde178016047d2a7c4f 100644 (file)
@@ -49,7 +49,7 @@ using namespace std;
 RegistryService::RegistryService( void ) : _SessionName(0), _Compteur(0)
 {
        MESSAGE("Passage dans RegistryService::RegistryService()") ;
-
+       _orb = CORBA::ORB::_nil();
 }
 
 
index 21b31b6f55f0a2edc492b3bc3554793429f61420..4315f9321bb79c8ca2a1224b960fa743db5bdaa7 100644 (file)
@@ -88,9 +88,13 @@ public :
 
        void SessionName( const char *sessionName ) ;
 
+        void SetOrb( CORBA::ORB_ptr orb ) { _orb = orb; return; }
+
+        void Shutdown() { if(!CORBA::is_nil(_orb)) _orb->shutdown(0); }
 
 protected :
 
+        CORBA::ORB_var _orb;
        const char              *_SessionName ;
        int                      _Compteur ;
        std::map<int,client_infos *>     _reg ;
index 7dc1b6817b319a9fd59c64d53d2acca251723e52..470cde40192af49a37a9cce5d8805aa65bde1f18 100644 (file)
@@ -168,6 +168,7 @@ int main( int argc , char **argv )
       naming.init_orb( orb ) ;
       RegistryService *ptrRegistry = SINGLETON_<RegistryService>::Instance() ;
       ptrRegistry->SessionName( ptrSessionName ) ;
+      ptrRegistry->SetOrb(orb);
       varComponents = ptrRegistry->_this() ;
       // The RegistryService must not already exist.
            
index eaa49f92aa9dbee23936d53124c44633fdfb8dbe..dbb5bb380262e2f54c1a41a15f4b4c93958824aa 100755 (executable)
@@ -48,19 +48,22 @@ salomeinclude_HEADERS = \
 
 # This local variable defines the list of CPPFLAGS common to all target in this package.
 COMMON_CPPFLAGS=\
+       -I$(srcdir)/../Batch \
        -I$(srcdir)/../Basics \
        -I$(srcdir)/../SALOMELocalTrace \
        -I$(srcdir)/../NamingService \
        -I$(srcdir)/../Utils \
        -I$(top_builddir)/salome_adm/unix \
        -I$(top_builddir)/idl \
+       @LIBXML_INCLUDES@ \
        @CORBA_CXXFLAGS@ @CORBA_INCLUDES@
 
 # This local variable defines the list of dependant libraries common to all target in this package.
 COMMON_LIBS =\
        ../NamingService/libSalomeNS.la \
        ../Utils/libOpUtil.la \
-       $(top_builddir)/idl/libSalomeIDLKernel.la
+       $(top_builddir)/idl/libSalomeIDLKernel.la \
+       @LIBXML_LIBS@
 
 #
 # ===============================================================
@@ -75,10 +78,9 @@ libSalomeResourcesManager_la_SOURCES =\
        SALOME_ResourcesManager.cxx
 
 libSalomeResourcesManager_la_CPPFLAGS =\
-       $(COMMON_CPPFLAGS) \
-       @QT_MT_INCLUDES@
+       $(COMMON_CPPFLAGS)
+
 
 libSalomeResourcesManager_la_LDFLAGS = -no-undefined -version-info=0:0:0
 libSalomeResourcesManager_la_LIBADD  =\
-       $(COMMON_LIBS) \
-       @QT_MT_LIBS@
+       $(COMMON_LIBS)
index 527cade0a0f4568a04dea147a56127f6377d5638..42f08df99f9e8dd16fe820ce561404c22053c22e 100644 (file)
@@ -34,7 +34,7 @@ string SALOME_LoadRateManager::FindFirst(const Engines::MachineList& hosts)
   return string(hosts[0]);
 }
 
-string SALOME_LoadRateManager::FindNext(const Engines::MachineList& hosts,SALOME_NamingService *ns)
+string SALOME_LoadRateManager::FindNext(const Engines::MachineList& hosts,MapOfParserResourcesType& resList,SALOME_NamingService *ns)
 {
   MESSAGE("SALOME_LoadRateManager::FindNext " << hosts.length());
   map<string, int> machines;
@@ -47,15 +47,7 @@ string SALOME_LoadRateManager::FindNext(const Engines::MachineList& hosts,SALOME
 
   ns->Change_Directory("/Containers");
   vector<string> vec = ns->list_directory_recurs();
-  list<string> lstCont;
   for(vector<string>::iterator iter = vec.begin();iter!=vec.end();iter++){
-    CORBA::Object_var obj=ns->Resolve((*iter).c_str());
-    Engines::Container_var cont=Engines::Container::_narrow(obj);
-    if(!CORBA::is_nil(cont)){
-      lstCont.push_back((*iter));
-    }
-  }
-  for(list<string>::iterator iter=lstCont.begin();iter!=lstCont.end();iter++){
     CORBA::Object_var obj=ns->Resolve((*iter).c_str());
     Engines::Container_var cont=Engines::Container::_narrow(obj);
     if(!CORBA::is_nil(cont)){
@@ -65,11 +57,15 @@ string SALOME_LoadRateManager::FindNext(const Engines::MachineList& hosts,SALOME
   }
 
   int imin = 0;
-  int min = machines[string(hosts[0])];
+  ParserResourcesType resource = resList[string(hosts[0])];
+  int nbproc = resource.DataForSort._nbOfProcPerNode * resource.DataForSort._nbOfNodes;
+  int min = machines[string(hosts[0])]/nbproc;
   for(int i=1;i<hosts.length();i++){
-    if( machines[string(hosts[i])] < min ){
+    resource = resList[string(hosts[i])];
+    nbproc = resource.DataForSort._nbOfProcPerNode * resource.DataForSort._nbOfNodes;
+    if( machines[string(hosts[i])]/nbproc < min ){
       imin = i;
-      min = machines[string(hosts[i])];
+      min = machines[string(hosts[i])]/nbproc;
     }
   }
 
index b03b96a1888230df414f744d8a6fb52b9280f7f9..061b925ae5f6f0384169242b222da60f2066d9e5 100644 (file)
@@ -23,6 +23,7 @@
 #include <SALOMEconfig.h>
 #include CORBA_CLIENT_HEADER(SALOME_ContainerManager)
 #include <string>
+#include "SALOME_ResourcesCatalog_Parser.hxx"
 #include "SALOME_NamingService.hxx"
 
 #if defined RESOURCESMANAGER_EXPORTS
@@ -44,7 +45,7 @@ class RESOURCESMANAGER_EXPORT SALOME_LoadRateManager
 
   public:
     std::string FindFirst(const Engines::MachineList& hosts);
-    std::string FindNext(const Engines::MachineList& hosts,SALOME_NamingService *ns);
+    std::string FindNext(const Engines::MachineList& hosts,MapOfParserResourcesType& resList,SALOME_NamingService *ns);
     std::string FindBest(const Engines::MachineList& hosts) throw (SALOME_Exception);
   };
 
index 53162f87c22eac4529f5514222d9e8aae0c1d102..a0fc63552bd38926414e713dd86a5fe23f669d21 100755 (executable)
 #include "SALOME_ResourcesCatalog_Handler.hxx"
 #include <iostream>
 #include <map>
-#include <qdom.h>
 #include "utilities.h"
 
 using namespace std;
 
+#ifdef _DEBUG_
+static int MYDEBUG = 1;
+#else
+static int MYDEBUG = 0;
+#endif
+
 //=============================================================================
 /*!
  *  Constructor
@@ -54,12 +59,12 @@ SALOME_ResourcesCatalog_Handler(MapOfParserResourcesType& listOfResources):
   test_alias = "alias";
   test_protocol = "protocol";
   test_mode = "mode";
+  test_batch = "batch";
+  test_mpi = "mpi";
   test_user_name = "userName";
   test_appli_path = "appliPath";
   test_modules = "modules";
   test_module_name = "moduleName";
-  test_module_path = "modulePath";
-  test_pre_req_file_path = "preReqFilePath";
   test_os = "OS";
   test_mem_in_mb = "memInMB";
   test_cpu_freq_mhz = "CPUFreqMHz";
@@ -86,331 +91,274 @@ SALOME_ResourcesCatalog_Handler::~SALOME_ResourcesCatalog_Handler()
 
 const MapOfParserResourcesType&
 SALOME_ResourcesCatalog_Handler::GetResourcesAfterParsing() const
-  {
-    return _resources_list;
-  }
-
-//=============================================================================
-/*!
- *  Overload handler function startDocument.
- *  Called before an xml file is parsed.
- *  Clears the list of resources.
- *  \return true (if no error detected...)
- */ 
-//=============================================================================
-
-bool SALOME_ResourcesCatalog_Handler::startDocument()
 {
-  //  MESSAGE("Begin parse document");
-
-  // --- Empty private elements
-
-  _resources_list.clear();
-  return true;
+  return _resources_list;
 }
 
 //=============================================================================
 /*!
- *  Overload handler function startElement.
- *    \param QString argument by reference (not used here ?)
- *    \param QString argument by reference (not used here ?)
- *    \param name                          (not used here ?)
- *    \param atts
- *    \return true if no error was detected
+ *  Processes XML document and fills the list of resources
  */ 
 //=============================================================================
 
-bool
-SALOME_ResourcesCatalog_Handler::
-startElement( const QString&,
-              const QString&,
-              const QString& name,
-              const QXmlAttributes& attrs )
+void SALOME_ResourcesCatalog_Handler::ProcessXmlDocument(xmlDocPtr theDoc)
 {
-  for (int i = 0;i < attrs.count();i++)
-    {
-      QString qName(attrs.localName(i));
-      std::string content(attrs.value(i).latin1());
-
-      if ((qName.compare(QString(test_hostname)) == 0))
-        _resource.DataForSort._hostName = content;
-
-      if ((qName.compare(QString(test_alias)) == 0))
-        _resource.Alias = content;
+  if (MYDEBUG) MESSAGE("Begin parse document");
 
-      if ((qName.compare(QString(test_protocol)) == 0))
-        {
-          switch (content[0])
-            {
-
-            case 'r':
-              _resource.Protocol = rsh;
-              break;
+  // Empty private elements
+  _resources_list.clear();
 
-            case 's':
-              _resource.Protocol = ssh;
-              break;
+  // Get the document root node
+  xmlNodePtr aCurNode = xmlDocGetRootElement(theDoc);
 
-            default:
-              // If it'not in all theses cases, the protocol is affected to rsh
-              _resource.Protocol = rsh;
-              break;
-            }
-        }
-
-      if ((qName.compare(QString(test_mode)) == 0))
-        {
-          switch (content[0])
+  aCurNode = aCurNode->xmlChildrenNode;
+  
+  // Processing the document nodes
+  while(aCurNode != NULL)
+    {
+      if ( !xmlStrcmp(aCurNode->name,(const xmlChar*)test_machine) )
+       {
+          _resource.Clear();
+         if (xmlHasProp(aCurNode, (const xmlChar*)test_hostname))
+           _resource.DataForSort._hostName = (const char*)xmlGetProp(aCurNode, (const xmlChar*)test_hostname);
+         else
+           break;
+
+         if (xmlHasProp(aCurNode, (const xmlChar*)test_alias))
+           _resource.Alias = (const char*)xmlGetProp(aCurNode, (const xmlChar*)test_alias);
+         else
+           _resource.Alias = "";
+
+         switch ( ((const char*)xmlGetProp(aCurNode, (const xmlChar*)test_protocol))[0] )
+           {
+           case 'r':
+             _resource.Protocol = rsh;
+             break;
+           case 's':
+             _resource.Protocol = ssh;
+             break;
+           default:
+             // If it'not in all theses cases, the protocol is affected to rsh
+             _resource.Protocol = rsh;
+             break;
+           }
+         
+         switch ( ((const char*)xmlGetProp(aCurNode, (const xmlChar*)test_mode))[0] )
             {
-
             case 'i':
               _resource.Mode = interactive;
               break;
-
-            case 'b':
+           case 'b':
               _resource.Mode = batch;
               break;
-
             default:
               // If it'not in all theses cases, the mode is affected to interactive
               _resource.Mode = interactive;
               break;
             }
-        }
-
-      if ((qName.compare(QString(test_user_name)) == 0))
-        _resource.UserName = content;
-
-      if ((qName.compare(QString(test_appli_path)) == 0))
-        _resource.AppliPath = content;
 
-      if ((qName.compare(QString(test_module_name)) == 0))
-        previous_module_name = content;
-
-      if ((qName.compare(QString(test_module_path)) == 0))
-        previous_module_path = content;
-
-      if ((qName.compare(QString(test_pre_req_file_path)) == 0))
-        _resource.PreReqFilePath = content;
-
-      if ((qName.compare(QString(test_os)) == 0))
-        _resource.OS = content;
-
-      if ((qName.compare(QString(test_mem_in_mb)) == 0))
-        _resource.DataForSort._memInMB = atoi(content.c_str());
-
-      if ((qName.compare(QString(test_cpu_freq_mhz)) == 0))
-        _resource.DataForSort._CPUFreqMHz = atoi(content.c_str());
+         if (xmlHasProp(aCurNode, (const xmlChar*)test_batch))
+            {
+              std::string aBatch = (const char*)xmlGetProp(aCurNode, (const xmlChar*)test_batch);
+              if (aBatch == "pbs")
+                _resource.Batch = pbs;
+              else if  (aBatch == "lsf")
+                _resource.Batch = lsf;
+              else if  (aBatch == "slurm")
+                _resource.Batch = slurm;
+              else
+                _resource.Batch = none;
+            }
 
-      if ((qName.compare(QString(test_nb_of_nodes)) == 0))
-        _resource.DataForSort._nbOfNodes = atoi(content.c_str());
+         if (xmlHasProp(aCurNode, (const xmlChar*)test_mpi))
+            {
+              std::string anMpi = (const char*)xmlGetProp(aCurNode, (const xmlChar*)test_mpi);
+              if (anMpi == "lam")
+                _resource.mpi = lam;
+              else if (anMpi == "mpich1")
+                _resource.mpi = mpich1;
+              else if (anMpi == "mpich2")
+                _resource.mpi = mpich2;
+              else if (anMpi == "openmpi")
+                _resource.mpi = openmpi;
+              else
+                _resource.mpi = indif;
+            }
 
-      if ((qName.compare(QString(test_nb_of_proc_per_node)) == 0))
-        _resource.DataForSort._nbOfProcPerNode = atoi(content.c_str());
+         if (xmlHasProp(aCurNode, (const xmlChar*)test_user_name))
+           _resource.UserName = (const char*)xmlGetProp(aCurNode, (const xmlChar*)test_user_name);
+         
+         if (xmlHasProp(aCurNode, (const xmlChar*)test_appli_path))
+           _resource.AppliPath = (const char*)xmlGetProp(aCurNode, (const xmlChar*)test_appli_path);
+         
+         if (xmlHasProp(aCurNode, (const xmlChar*)test_os))
+           _resource.OS = (const char*)xmlGetProp(aCurNode, (const xmlChar*)test_os);
+         
+         if (xmlHasProp(aCurNode, (const xmlChar*)test_mem_in_mb))
+           _resource.DataForSort._memInMB = atoi((const char*)xmlGetProp(aCurNode, (const xmlChar*)test_mem_in_mb));
+         
+         if (xmlHasProp(aCurNode, (const xmlChar*)test_cpu_freq_mhz))
+           _resource.DataForSort._CPUFreqMHz = atoi((const char*)xmlGetProp(aCurNode, (const xmlChar*)test_cpu_freq_mhz));
+         
+         if (xmlHasProp(aCurNode, (const xmlChar*)test_nb_of_nodes))
+           _resource.DataForSort._nbOfNodes = atoi((const char*)xmlGetProp(aCurNode, (const xmlChar*)test_nb_of_nodes));
+         
+         if (xmlHasProp(aCurNode, (const xmlChar*)test_nb_of_proc_per_node))
+           _resource.DataForSort._nbOfProcPerNode = atoi((const char*)xmlGetProp(aCurNode, (const xmlChar*)test_nb_of_proc_per_node));
+         
+         // Process modules
+         xmlNodePtr aCurSubNode = aCurNode->xmlChildrenNode;
+         while(aCurSubNode != NULL)
+           {
+             if ( !xmlStrcmp(aCurSubNode->name, (const xmlChar*)test_modules) )
+               {
+                 if (xmlHasProp(aCurSubNode, (const xmlChar*)test_module_name)) 
+                   {
+                     std::string aModuleName = (const char*)xmlGetProp(aCurSubNode, (const xmlChar*)test_module_name);
+                      _resource.ModulesList.push_back(aModuleName);
+                   }
+               }
+             aCurSubNode = aCurSubNode->next;
+           }
+         
+         int aNbNodes = _resource.DataForSort._nbOfNodes;
+         if( aNbNodes > 1 ){
+           string clusterNode = _resource.DataForSort._hostName ;
+           for( int i=0; i < aNbNodes; i++ ){
+             char inode[64];
+             inode[0] = '\0' ;
+             sprintf(inode,"%s%d",clusterNode.c_str(),i+1);
+             std::string nodeName(inode);
+             _resource.DataForSort._hostName = nodeName ;
+             _resources_list[nodeName] = _resource;
+           }
+         }
+         else
+           _resources_list[_resource.DataForSort._hostName] = _resource;
+       }
+      
+      aCurNode = aCurNode->next;
     }
 
-  return true;
-}
-
-//=============================================================================
-/*!
- *  Overload handler function endElement.
- *     \param QString argument by reference  (not used here ?)
- *     \param QString argument by reference  (not used here ?)
- *     \param qName 
- *     \return true (if no error detected ...)
- */ 
-//=============================================================================
-
-bool SALOME_ResourcesCatalog_Handler::
-endElement(const QString&,
-           const QString&,
-           const QString& qName)
-{
-  if ((qName.compare(QString(test_modules)) == 0))
-    _resource.ModulesPath[previous_module_name] = previous_module_path;
-
-  if ((qName.compare(QString(test_machine)) == 0)){
-    int nbnodes = _resource.DataForSort._nbOfNodes;
-    if( nbnodes > 1 ){
-      string clusterNode = _resource.DataForSort._hostName ;
-      for(int i=0;i<nbnodes;i++){
-        char inode[64];
-        inode[0] = '\0' ;
-        sprintf(inode,"%s%d",clusterNode.c_str(),i+1);
-        std::string nodeName(inode);
-//        _resource.DataForSort._nbOfNodes = 1;
-        _resource.DataForSort._hostName = nodeName ;
-        _resources_list[nodeName] = _resource;
-        //cout << "SALOME_ResourcesCatalog_Handler::endElement _resources_list["
-        //     << nodeName << "] = _resource " << _resource.DataForSort._hostName.c_str()
-        //     << endl ;
-      }
+  // For debug only
+  if (MYDEBUG)
+    {
+      for (map<string, ParserResourcesType>::const_iterator iter =
+            _resources_list.begin();
+          iter != _resources_list.end();
+          iter++)
+       {
+         SCRUTE((*iter).second.Alias);
+         SCRUTE((*iter).second.UserName);
+         SCRUTE((*iter).second.AppliPath);
+         SCRUTE((*iter).second.PreReqFilePath);
+         SCRUTE((*iter).second.OS);
+         SCRUTE((*iter).second.Protocol);
+         SCRUTE((*iter).second.Mode);
+       }
+      
+      MESSAGE("This is the end of document");
     }
-    else
-      _resources_list[_resource.DataForSort._hostName] = _resource;
-  }
-
-  return true;
 }
 
-//=============================================================================
-/*!
- *  Overload handler function characters.
- *  fills the private attribute string 'content'.
- *     \param chars  
- *     \return true (if no error detected ...)
- */ 
-//=============================================================================
-
-bool SALOME_ResourcesCatalog_Handler::characters(const QString& chars)
-{
-  content = (const char *)chars ;
-  return true;
-}
-
-//=============================================================================
-/*!
- *  Overload handler function endDocument.
- *  Called after the document has been parsed.
- *     \return true (if no error detected ...)
- */ 
-//=============================================================================
-
-bool SALOME_ResourcesCatalog_Handler::endDocument()
-{
-//   for (map<string, ParserResourcesType>::const_iterator iter =
-//          _resources_list.begin();
-//        iter != _resources_list.end();
-//        iter++)
-//     {
-//       SCRUTE((*iter).second.Alias);
-//       SCRUTE((*iter).second.UserName);
-//       SCRUTE((*iter).second.AppliPath);
-//       SCRUTE((*iter).second.PreReqFilePath);
-//       SCRUTE((*iter).second.OS);
-//       SCRUTE((*iter).second.Protocol);
-//       SCRUTE((*iter).second.Mode);
-//    }
-  
-//  MESSAGE("This is the end of document");
-  return true;
-}
-
-//=============================================================================
-/*!
- *  Overload handler function errorProtocol.
- *  \return the error message.
- */ 
-//=============================================================================
-
-QString SALOME_ResourcesCatalog_Handler::errorProtocol()
-{
-  INFOS(" ------------- error protocol !");
-  return errorProt;
-}
-
-//=============================================================================
-/*!
- *  Overload handler function fatalError.
- *  Fills the private string errorProt with details on error.
- *     \param exception from parser
- *     \return boolean (meaning ?)
- */
-//=============================================================================
-
-bool
-SALOME_ResourcesCatalog_Handler::fatalError
-(const QXmlParseException& exception)
-{
-  INFOS(" ------------- fatal error !");
-  errorProt += QString( "fatal parsing error: %1 in line %2, column %3\n" )
-               .arg( exception.message() )
-               .arg( exception.lineNumber() )
-               .arg( exception.columnNumber() );
-  INFOS("parser error: " << errorProt.latin1());
-
-  return QXmlDefaultHandler::fatalError( exception );
-}
 
 //=============================================================================
 /*!
  *  Fill the document tree in xml file, used to write in an xml file.
- *  \param doc document to fill.
+ *  \param theDoc document to fill.
  */ 
 //=============================================================================
 
-void SALOME_ResourcesCatalog_Handler::PrepareDocToXmlFile(QDomDocument& doc)
+void SALOME_ResourcesCatalog_Handler::PrepareDocToXmlFile(xmlDocPtr theDoc)
 {
-  QDomElement root = doc.createElement("resources");
-  doc.appendChild(root);
+  // Node pointers
+  xmlNodePtr root_node = NULL, node = NULL, node1 = NULL;
+  char string_buf[80];
 
+  root_node = xmlNewNode(NULL, BAD_CAST "resources");
+  xmlDocSetRootElement(theDoc, root_node);
+    
   for (map<string, ParserResourcesType>::iterator iter =
          _resources_list.begin();
        iter != _resources_list.end();
        iter++)
     {
-      QDomElement eltRoot = doc.createElement(test_machine);
-      root.appendChild( eltRoot );
-      eltRoot.setAttribute((char *)test_hostname, (*iter).first.c_str());
-      eltRoot.setAttribute((char *)test_alias, (*iter).second.Alias.c_str());
-
+      node = xmlNewChild(root_node, NULL, BAD_CAST test_machine, NULL);
+      xmlNewProp(node, BAD_CAST test_hostname, BAD_CAST (*iter).first.c_str());
+      xmlNewProp(node, BAD_CAST test_alias, BAD_CAST (*iter).second.Alias.c_str());
+      
       switch ((*iter).second.Protocol)
         {
-
         case rsh:
-          eltRoot.setAttribute((char *)test_protocol, "rsh");
+         xmlNewProp(node, BAD_CAST test_protocol, BAD_CAST "rsh");
           break;
-
         case ssh:
-          eltRoot.setAttribute((char *)test_protocol, "ssh");
-          break;
-
+         xmlNewProp(node, BAD_CAST test_protocol, BAD_CAST "ssh");
+         break;
         default:
-          eltRoot.setAttribute((char *)test_protocol, "rsh");
-        }
+         xmlNewProp(node, BAD_CAST test_protocol, BAD_CAST "rsh");
+       }
 
       switch ((*iter).second.Mode)
         {
-
-        case interactive:
-          eltRoot.setAttribute((char *)test_mode, "interactive");
+       case interactive:
+         xmlNewProp(node, BAD_CAST test_mode, BAD_CAST "interactive");
           break;
-
         case batch:
-          eltRoot.setAttribute((char *)test_mode, "batch");
+         xmlNewProp(node, BAD_CAST test_mode, BAD_CAST "batch");
           break;
+        default:
+         xmlNewProp(node, BAD_CAST test_mode, BAD_CAST "interactive");
+        }
 
+      switch ((*iter).second.Batch)
+        {
+       case pbs:
+         xmlNewProp(node, BAD_CAST test_batch, BAD_CAST "pbs");
+          break;
+       case lsf:
+         xmlNewProp(node, BAD_CAST test_batch, BAD_CAST "lsf");
+          break;
+       case slurm:
+         xmlNewProp(node, BAD_CAST test_batch, BAD_CAST "slurm");
+          break;
+        default:
+         xmlNewProp(node, BAD_CAST test_batch, BAD_CAST "");
+        }
+
+      switch ((*iter).second.mpi)
+        {
+       case lam:
+         xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST "lam");
+          break;
+       case mpich1:
+         xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST "mpich1");
+          break;
+       case mpich2:
+         xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST "mpich2");
+          break;
+       case openmpi:
+         xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST "openmpi");
+          break;
         default:
-          eltRoot.setAttribute((char *)test_mode, "interactive");
+         xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST "");
         }
 
-      eltRoot.setAttribute((char *)test_user_name,
-                           (*iter).second.UserName.c_str());
+      xmlNewProp(node, BAD_CAST test_user_name, BAD_CAST (*iter).second.UserName.c_str());
 
-      for (map<string, string>::const_iterator iter2 =
-             (*iter).second.ModulesPath.begin();
-           iter2 != (*iter).second.ModulesPath.end();
+     for (vector<string>::const_iterator iter2 =
+             (*iter).second.ModulesList.begin();
+           iter2 != (*iter).second.ModulesList.end();
            iter2++)
         {
-          QDomElement rootForModulesPaths = doc.createElement(test_modules);
-          rootForModulesPaths.setAttribute(test_module_name,
-                                           (*iter2).first.c_str());
-          rootForModulesPaths.setAttribute(test_module_path,
-                                           (*iter2).second.c_str());
-          eltRoot.appendChild(rootForModulesPaths);
+         node1 = xmlNewChild(node, NULL, BAD_CAST test_modules, NULL);
+         xmlNewProp(node1, BAD_CAST test_module_name, BAD_CAST (*iter2).c_str());
         }
 
-      eltRoot.setAttribute(test_pre_req_file_path,
-                           (*iter).second.PreReqFilePath.c_str());
-      eltRoot.setAttribute(test_os, (*iter).second.OS.c_str());
-      eltRoot.setAttribute(test_mem_in_mb,
-                           (*iter).second.DataForSort._memInMB);
-      eltRoot.setAttribute(test_cpu_freq_mhz,
-                           (*iter).second.DataForSort._CPUFreqMHz);
-      eltRoot.setAttribute(test_nb_of_nodes,
-                           (*iter).second.DataForSort._nbOfNodes);
-      eltRoot.setAttribute(test_nb_of_proc_per_node,
-                           (*iter).second.DataForSort._nbOfProcPerNode);
+      xmlNewProp(node, BAD_CAST test_os, BAD_CAST (*iter).second.OS.c_str());
+      xmlNewProp(node, BAD_CAST test_mem_in_mb, BAD_CAST sprintf(string_buf, "%u", (*iter).second.DataForSort._memInMB));
+      xmlNewProp(node, BAD_CAST test_cpu_freq_mhz, BAD_CAST sprintf(string_buf, "%u", (*iter).second.DataForSort._CPUFreqMHz));
+      xmlNewProp(node, BAD_CAST test_nb_of_nodes, BAD_CAST sprintf(string_buf, "%u", (*iter).second.DataForSort._nbOfNodes));
+      xmlNewProp(node, BAD_CAST test_nb_of_proc_per_node, BAD_CAST sprintf(string_buf, "%u", (*iter).second.DataForSort._nbOfProcPerNode));
     }
 }
index 497f0dddf8beada9608a5b576818f3535f946edb..d636ff22fec2e78f95c0bea96fb5c5b1e983b270 100755 (executable)
 
 #include "SALOME_ResourcesCatalog_Parser.hxx"
 
-#include <qxml.h>
 #include <string>
 #include <vector>
 
-class QDomElement;
-
-class QDomDocument;
-
-class SALOME_ResourcesCatalog_Handler : public QXmlDefaultHandler
-  {
+#include <libxml/parser.h>
 
+class SALOME_ResourcesCatalog_Handler
+{
+  
   public :
     SALOME_ResourcesCatalog_Handler(MapOfParserResourcesType& listOfResources);
 
@@ -49,29 +46,12 @@ class SALOME_ResourcesCatalog_Handler : public QXmlDefaultHandler
 
     virtual ~SALOME_ResourcesCatalog_Handler();
 
-    virtual bool startDocument();
-
-    virtual bool startElement(const QString& , const QString& ,
-                              const QString& name, 
-                             const QXmlAttributes& attrs);
-
-    virtual bool endElement(const QString&, const QString&,
-                            const QString& qName);
-
-    virtual bool characters(const QString& chars);
-
-    virtual bool endDocument();
-
-   virtual QString errorProtocol();
-    virtual bool fatalError(const QXmlParseException& exception);
-
-    void PrepareDocToXmlFile(QDomDocument& doc);
+    void ProcessXmlDocument(xmlDocPtr theDoc);
+  
+    void PrepareDocToXmlFile(xmlDocPtr theDoc);
 
   private :
-    QString errorProt;
-    std::string content;
     std::string previous_module_name;
-    std::string previous_module_path;
 
     ParserResourcesType _resource;
     MapOfParserResourcesType& _resources_list;
@@ -83,12 +63,12 @@ class SALOME_ResourcesCatalog_Handler : public QXmlDefaultHandler
     const char *test_alias;
     const char *test_protocol;
     const char *test_mode;
+    const char *test_batch;
+    const char *test_mpi;
     const char *test_user_name;
     const char *test_appli_path;
     const char *test_modules;
     const char *test_module_name;
-    const char *test_module_path;
-    const char *test_pre_req_file_path;
     const char *test_os;
     const char *test_mem_in_mb;
     const char *test_cpu_freq_mhz;
index 49e594e420588f76654001805548e3c1d799758a..e20dbfc6ae8b05de06f37f66d174aa8b0a2b142d 100644 (file)
@@ -112,26 +112,46 @@ void ResourceDataToSort::Print() const
     SCRUTE(_memInMB);
   }
 
-void ParserResourcesType::Print()
+void ParserResourcesType::Print() const
 {
-  MESSAGE("##############*****");
-  MESSAGE("HostName : " << DataForSort._hostName);
-  MESSAGE("Alias : " << Alias);
-  MESSAGE("Protocol : " << Protocol);
-  MESSAGE("Mode : " << Mode);
-  MESSAGE("UserName : " << UserName);
-  MESSAGE("Modules : ");
-  int i = 1;
-
-  for (std::map<std::string, std::string>::iterator iter = ModulesPath.begin();
-       iter != ModulesPath.end();
-       iter++)
-    {
-      MESSAGE("Module " << i++ << " called : " << (*iter).first
-              << " with path : " << (*iter).second);
-    }
-
-  MESSAGE("PreReqFilePath : " << PreReqFilePath);
-  MESSAGE("OS : " << OS);
-  DataForSort.Print();
+  ostringstream oss;
+  oss << endl <<
+    "HostName : " << DataForSort._hostName << endl << 
+    "Alias : " << Alias << endl <<
+    "NbOfNodes : " << DataForSort._nbOfNodes << endl <<
+    "NbOfProcPerNode : " << DataForSort._nbOfProcPerNode << endl <<
+    "CPUFreqMHz : " << DataForSort._CPUFreqMHz << endl <<
+    "MemInMB : " << DataForSort._memInMB << endl <<
+    "Protocol : " << Protocol << endl <<
+    "Mode : " << Mode << endl <<
+    "Batch : " << Batch << endl <<
+    "mpi : " << mpi << endl <<
+    "UserName : " << UserName << endl <<
+    "AppliPath : " << AppliPath << endl <<
+    "OS : " << OS << endl <<
+    "Modules : " << endl;
+
+  for(int i=0;i<ModulesList.size();i++)
+    oss << "Module " << i+1 << " called : " << ModulesList[i] << endl;
+
+  MESSAGE(oss.str());
+
+}
+
+void ParserResourcesType::Clear()
+{
+  DataForSort._hostName = "";
+  DataForSort._nbOfNodes = 1;
+  DataForSort._nbOfProcPerNode = 1;
+  DataForSort._CPUFreqMHz = 0;
+  DataForSort._memInMB = 0;
+  Alias = "";
+  Protocol = rsh;
+  Mode = interactive;
+  Batch = none;
+  mpi = indif;
+  UserName = "";
+  AppliPath = "";
+  ModulesList.clear();
+  OS = "";
 }
index 16e5e82af712bfd44066a4f8bd6c41ea6d64c433..f8af1dbcdecf0635b0cf4d32f530a9498f7cc4b5 100755 (executable)
 #include <map>
 #include <iostream>
 
-typedef std::map<std::string, std::string> MapOfModulesPath;
-
 enum AccessProtocolType {rsh, ssh};
 
 enum AccessModeType {interactive, batch};
 
+enum BatchType {none, pbs, lsf, slurm};
+
+enum MpiImplType {indif, lam, mpich1, mpich2, openmpi};
+
 class ResourceDataToSort
   {
 
@@ -74,13 +76,15 @@ struct ParserResourcesType
     std::string Alias;
     AccessProtocolType Protocol;
     AccessModeType Mode;
+    BatchType Batch;
+    MpiImplType mpi;
     std::string UserName;
     std::string AppliPath;
-    MapOfModulesPath ModulesPath;
-    std::string PreReqFilePath;
+    std::vector<std::string> ModulesList;
     std::string OS;
 
-    void Print();
+    void Print() const;
+    void Clear();
   };
 
 typedef std::map<std::string, ParserResourcesType> MapOfParserResourcesType;
index 01bf2756b3e7471c1f7dc729dcec0150d440843d..7c31fa87e42d0c63913aef99893e57b5aa9d1670 100644 (file)
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 #include "SALOME_ResourcesManager.hxx" 
-//#include "SALOME_Container_i.hxx"
 #include "Utils_ExceptHandlers.hxx"
+#include "Utils_CorbaException.hxx"
 #include "OpUtil.hxx"
 
-#include <qdom.h>
-
 #include <stdlib.h>
 #ifndef WNT
 #include <unistd.h>
@@ -46,6 +44,8 @@
 
 using namespace std;
 
+const char *SALOME_ResourcesManager::_ResourcesManagerNameInNS = "/ResourcesManager";
+
 //=============================================================================
 /*!
  * just for test
@@ -53,12 +53,24 @@ using namespace std;
 //=============================================================================
 
 SALOME_ResourcesManager::
-SALOME_ResourcesManager(CORBA::ORB_ptr orb,
+SALOME_ResourcesManager(CORBA::ORB_ptr orb, 
+                       PortableServer::POA_var poa, 
+                       SALOME_NamingService *ns,
                         const char *xmlFilePath) :
     _path_resources(xmlFilePath)
 {
-  _NS = new SALOME_NamingService(orb);
+  MESSAGE("constructor");
+  _NS = ns;
+  _orb = CORBA::ORB::_duplicate(orb) ;
+  _poa = PortableServer::POA::_duplicate(poa) ;
+  PortableServer::ObjectId_var id = _poa->activate_object(this);
+  CORBA::Object_var obj = _poa->id_to_reference(id);
+  Engines::SalomeLauncher_var refContMan =
+    Engines::SalomeLauncher::_narrow(obj);
+
+  _NS->Register(refContMan,_ResourcesManagerNameInNS);
   _MpiStarted = false;
+  MESSAGE("constructor end");
 }
 
 //=============================================================================
@@ -72,9 +84,19 @@ SALOME_ResourcesManager(CORBA::ORB_ptr orb,
  */ 
 //=============================================================================
 
-SALOME_ResourcesManager::SALOME_ResourcesManager(CORBA::ORB_ptr orb)
+SALOME_ResourcesManager::SALOME_ResourcesManager(CORBA::ORB_ptr orb, 
+                                                PortableServer::POA_var poa, 
+                                                SALOME_NamingService *ns)
 {
-  _NS = new SALOME_NamingService(orb);
+  MESSAGE("constructor");
+  _NS = ns;
+  _orb = CORBA::ORB::_duplicate(orb) ;
+  _poa = PortableServer::POA::_duplicate(poa) ;
+  PortableServer::ObjectId_var id = _poa->activate_object(this);
+  CORBA::Object_var obj = _poa->id_to_reference(id);
+  Engines::ResourcesManager_var refContMan = Engines::ResourcesManager::_narrow(obj);
+  _NS->Register(refContMan,_ResourcesManagerNameInNS);
+
   _isAppliSalomeDefined = (getenv("APPLI") != 0);
   _MpiStarted = false;
 
@@ -93,6 +115,7 @@ SALOME_ResourcesManager::SALOME_ResourcesManager(CORBA::ORB_ptr orb)
     }
 
   ParseXmlFile();
+  MESSAGE("constructor end");
 }
 
 //=============================================================================
@@ -103,7 +126,23 @@ SALOME_ResourcesManager::SALOME_ResourcesManager(CORBA::ORB_ptr orb)
 
 SALOME_ResourcesManager::~SALOME_ResourcesManager()
 {
-  delete _NS;
+  MESSAGE("destructor");
+}
+
+
+//=============================================================================
+/*! CORBA method:
+ *  shutdown all the containers, then the ContainerManager servant
+ */
+//=============================================================================
+
+void SALOME_ResourcesManager::Shutdown()
+{
+  MESSAGE("Shutdown");
+  _NS->Destroy_Name(_ResourcesManagerNameInNS);
+  PortableServer::ObjectId_var oid = _poa->servant_to_id(this);
+  _poa->deactivate_object(oid);
+  _remove_ref();
 }
 
 //=============================================================================
@@ -120,101 +159,113 @@ SALOME_ResourcesManager::~SALOME_ResourcesManager()
  */ 
 //=============================================================================
 
-vector<string>
-SALOME_ResourcesManager::
-GetFittingResources(const Engines::MachineParameters& params,
-                    const char *moduleName)
-throw(SALOME_Exception)
+Engines::MachineList *
+SALOME_ResourcesManager::GetFittingResources(const Engines::MachineParameters& params,
+                                            const Engines::CompoList& componentList)
+//throw(SALOME_Exception)
 {
 //   MESSAGE("ResourcesManager::GetFittingResources");
-  vector <std::string> ret;
+  vector <std::string> vec;
+  Engines::MachineList *ret=new Engines::MachineList;
 
+  try{
+    // --- To be sure that we search in a correct list.
+    ParseXmlFile();
 
-  // --- To be sure that we search in a correct list.
-  ParseXmlFile();
+    const char *hostname = (const char *)params.hostname;
+    MESSAGE("GetFittingResources " << hostname << " " << GetHostname().c_str());
 
-  const char *hostname = (const char *)params.hostname;
-  MESSAGE("GetFittingResources " << hostname << " " << GetHostname().c_str());
-
-  if (hostname[0] != '\0')
-    {
+    if (hostname[0] != '\0')
+      {
 //       MESSAGE("ResourcesManager::GetFittingResources : hostname specified" );
 
-      if ( strcmp(hostname, "localhost") == 0 ||
-           strcmp(hostname, GetHostname().c_str()) == 0 )
-        {
-//           MESSAGE("ResourcesManager::GetFittingResources : localhost" );
-          ret.push_back(GetHostname().c_str());
-//       MESSAGE("ResourcesManager::GetFittingResources : " << ret.size());
-        }
-
-      else if (_resourcesList.find(hostname) != _resourcesList.end())
-        {
-          // --- params.hostname is in the list of resources so return it.
-          ret.push_back(hostname);
-        }
-
-      else
-        {
-// Cas d'un cluster: nombre de noeuds > 1
-          int cpt=0;
-          for (map<string, ParserResourcesType>::const_iterator iter = _resourcesList.begin(); iter != _resourcesList.end(); iter++){
-           if( (*iter).second.DataForSort._nbOfNodes > 1 ){
-             if( strncmp(hostname,(*iter).first.c_str(),strlen(hostname)) == 0 ){
-                ret.push_back((*iter).first.c_str());
-                //cout << "SALOME_ResourcesManager::GetFittingResources vector["
-                //     << cpt << "] = " << (*iter).first.c_str() << endl ;
-                cpt++;
-              }
-            }
-          }
-          if(cpt==0){
-          // --- user specified an unknown hostame so notify him.
-            MESSAGE("ResourcesManager::GetFittingResources : SALOME_Exception");
-            throw SALOME_Exception("unknown host");
-          }
-        }
-    }
+       if ( strcmp(hostname, "localhost") == 0 ||
+            strcmp(hostname, GetHostname().c_str()) == 0 )
+         {
+           //           MESSAGE("ResourcesManager::GetFittingResources : localhost" );
+           vec.push_back(GetHostname().c_str());
+           //    MESSAGE("ResourcesManager::GetFittingResources : " << vec.size());
+         }
+       
+       else if (_resourcesList.find(hostname) != _resourcesList.end())
+         {
+           // --- params.hostname is in the list of resources so return it.
+           vec.push_back(hostname);
+         }
+       
+       else
+         {
+           // Cas d'un cluster: nombre de noeuds > 1
+           int cpt=0;
+           for (map<string, ParserResourcesType>::const_iterator iter = _resourcesList.begin(); iter != _resourcesList.end(); iter++){
+             if( (*iter).second.DataForSort._nbOfNodes > 1 ){
+               if( strncmp(hostname,(*iter).first.c_str(),strlen(hostname)) == 0 ){
+                 vec.push_back((*iter).first.c_str());
+                 //cout << "SALOME_ResourcesManager::GetFittingResources vector["
+                 //     << cpt << "] = " << (*iter).first.c_str() << endl ;
+                 cpt++;
+               }
+             }
+           }
+           if(cpt==0){
+             // --- user specified an unknown hostame so notify him.
+             MESSAGE("ResourcesManager::GetFittingResources : SALOME_Exception");
+             throw SALOME_Exception("unknown host");
+           }
+         }
+      }
+    
+    else
+      // --- Search for available resources sorted by priority
+      {
+       SelectOnlyResourcesWithOS(vec, params.OS);
+       
+       KeepOnlyResourcesWithModule(vec, componentList);
+       
+       if (vec.size() == 0)
+         SelectOnlyResourcesWithOS(vec, params.OS);
+       
+       // --- set wanted parameters
+       ResourceDataToSort::_nbOfNodesWanted = params.nb_node;
+       
+       ResourceDataToSort::_nbOfProcPerNodeWanted = params.nb_proc_per_node;
+       
+       ResourceDataToSort::_CPUFreqMHzWanted = params.cpu_clock;
+       
+       ResourceDataToSort::_memInMBWanted = params.mem_mb;
+       
+       // --- end of set
+       
+       list<ResourceDataToSort> li;
+       
+       for (vector<string>::iterator iter = vec.begin();
+           iter != vec.end();
+            iter++)
+         li.push_back(_resourcesList[(*iter)].DataForSort);
+       
+       li.sort();
+       
+       unsigned int i = 0;
+       
+       for (list<ResourceDataToSort>::iterator iter2 = li.begin();
+            iter2 != li.end();
+            iter2++)
+         vec[i++] = (*iter2)._hostName;
+      }
+    
+    //  MESSAGE("ResourcesManager::GetFittingResources : return" << ret.size());
+    ret->length(vec.size());
+    for(unsigned int i=0;i<vec.size();i++)
+      (*ret)[i]=(vec[i]).c_str();
 
-  else
-    // --- Search for available resources sorted by priority
+  }
+  catch(const SALOME_Exception &ex)
     {
-      SelectOnlyResourcesWithOS(ret, params.OS);
-
-      KeepOnlyResourcesWithModule(ret, moduleName);
-
-      if (ret.size() == 0)
-        SelectOnlyResourcesWithOS(ret, params.OS);
-
-      // --- set wanted parameters
-      ResourceDataToSort::_nbOfNodesWanted = params.nb_node;
-
-      ResourceDataToSort::_nbOfProcPerNodeWanted = params.nb_proc_per_node;
-
-      ResourceDataToSort::_CPUFreqMHzWanted = params.cpu_clock;
-
-      ResourceDataToSort::_memInMBWanted = params.mem_mb;
-
-      // --- end of set
-
-      list<ResourceDataToSort> li;
+      INFOS("Caught exception.");
+      THROW_SALOME_CORBA_EXCEPTION(ex.what(),SALOME::BAD_PARAM);
+      //return ret;
+    }  
 
-      for (vector<string>::iterator iter = ret.begin();
-           iter != ret.end();
-           iter++)
-        li.push_back(_resourcesList[(*iter)].DataForSort);
-
-      li.sort();
-
-      unsigned int i = 0;
-
-      for (list<ResourceDataToSort>::iterator iter2 = li.begin();
-           iter2 != li.end();
-           iter2++)
-        ret[i++] = (*iter2)._hostName;
-    }
-
-  //  MESSAGE("ResourcesManager::GetFittingResources : return" << ret.size());
   return ret;
 }
 
@@ -228,16 +279,16 @@ throw(SALOME_Exception)
 int
 SALOME_ResourcesManager::
 AddResourceInCatalog(const Engines::MachineParameters& paramsOfNewResources,
-                     const map<string, string>& modulesOnNewResources,
-                     const char *environPathOfPrerequired,
+                     const vector<string>& modulesOnNewResources,
                      const char *alias,
                      const char *userName,
                      AccessModeType mode,
                      AccessProtocolType prot)
 throw(SALOME_Exception)
 {
-  map<string, string>::const_iterator iter =
-    modulesOnNewResources.find("KERNEL");
+  vector<string>::const_iterator iter = find(modulesOnNewResources.begin(),
+                                            modulesOnNewResources.end(),
+                                            "KERNEL");
 
   if (iter != modulesOnNewResources.end())
     {
@@ -247,8 +298,7 @@ throw(SALOME_Exception)
       newElt.Protocol = prot;
       newElt.Mode = mode;
       newElt.UserName = userName;
-      newElt.ModulesPath = modulesOnNewResources;
-      newElt.PreReqFilePath = environPathOfPrerequired;
+      newElt.ModulesList = modulesOnNewResources;
       newElt.OS = paramsOfNewResources.OS;
       newElt.DataForSort._memInMB = paramsOfNewResources.mem_mb;
       newElt.DataForSort._CPUFreqMHz = paramsOfNewResources.cpu_clock;
@@ -282,23 +332,37 @@ void SALOME_ResourcesManager::DeleteResourceInCatalog(const char *hostname)
 
 void SALOME_ResourcesManager::WriteInXmlFile()
 {
-  QDomDocument doc("ResourcesCatalog");
+  const char* aFilePath = _path_resources.c_str();
+  
+  FILE* aFile = fopen(aFilePath, "w");
+
+  if (aFile == NULL)
+    {
+      INFOS("Error opening file !");
+      return;
+    }
+  
+  xmlDocPtr aDoc = xmlNewDoc(BAD_CAST "1.0");
+  xmlNewDocComment(aDoc, BAD_CAST "ResourcesCatalog");
+
   SALOME_ResourcesCatalog_Handler* handler =
     new SALOME_ResourcesCatalog_Handler(_resourcesList);
-  handler->PrepareDocToXmlFile(doc);
+  handler->PrepareDocToXmlFile(aDoc);
   delete handler;
 
-  QFile file( _path_resources );
-
-  if ( !file.open( IO_WriteOnly ) )
-    INFOS("WRITING ERROR !");
-
-  QTextStream ts( &file );
-
-  ts << doc.toString();
-
-  file.close();
-
+  int isOk = xmlSaveFile(aFilePath, aDoc);
+  
+  if (!isOk)
+    INFOS("Error while XML file saving.");
+  
+  // Free the document
+  xmlFreeDoc(aDoc);
+
+  // Free the global variables that may have been allocated by the parser
+  xmlCleanupParser();
+  
+  fclose(aFile);
+  
   MESSAGE("WRITING DONE!");
 }
 
@@ -312,16 +376,31 @@ const MapOfParserResourcesType& SALOME_ResourcesManager::ParseXmlFile()
 {
   SALOME_ResourcesCatalog_Handler* handler =
     new SALOME_ResourcesCatalog_Handler(_resourcesList);
-  QFile xmlFile(_path_resources);
 
-  QXmlInputSource source(xmlFile);
-
-  QXmlSimpleReader reader;
-  reader.setContentHandler( handler );
-  reader.setErrorHandler( handler );
-  reader.parse( source );
-  xmlFile.close();
+  const char* aFilePath = _path_resources.c_str();
+  FILE* aFile = fopen(aFilePath, "r");
+  
+  if (aFile != NULL)
+    {
+      xmlDocPtr aDoc = xmlReadFile(aFilePath, NULL, 0);
+      
+      if (aDoc != NULL)
+       handler->ProcessXmlDocument(aDoc);
+      else
+       INFOS("ResourcesManager: could not parse file "<<aFilePath);
+      
+      // Free the document
+      xmlFreeDoc(aDoc);
+
+      // Free the global variables that may have been allocated by the parser
+      xmlCleanupParser();
+      fclose(aFile);
+    }
+  else
+    INFOS("ResourcesManager: file "<<aFilePath<<" is not readable.");
+  
   delete handler;
+
   return _resourcesList;
 }
 
@@ -343,10 +422,10 @@ const MapOfParserResourcesType& SALOME_ResourcesManager::GetList() const
  */ 
 //=============================================================================
 
-string
+char *
 SALOME_ResourcesManager::FindFirst(const Engines::MachineList& listOfMachines)
 {
-  return _dynamicResourcesSelecter.FindFirst(listOfMachines);
+  return CORBA::string_dup(_dynamicResourcesSelecter.FindFirst(listOfMachines).c_str());
 }
 
 //=============================================================================
@@ -358,7 +437,7 @@ SALOME_ResourcesManager::FindFirst(const Engines::MachineList& listOfMachines)
 string
 SALOME_ResourcesManager::FindNext(const Engines::MachineList& listOfMachines)
 {
-  return _dynamicResourcesSelecter.FindNext(listOfMachines,_NS);
+  return _dynamicResourcesSelecter.FindNext(listOfMachines,_resourcesList,_NS);
 }
 //=============================================================================
 /*!
@@ -372,8 +451,6 @@ SALOME_ResourcesManager::FindBest(const Engines::MachineList& listOfMachines)
   return _dynamicResourcesSelecter.FindBest(listOfMachines);
 }
 
-
-
 //=============================================================================
 /*!
  *  This is no longer valid (C++ container are also python containers)
@@ -512,7 +589,6 @@ SALOME_ResourcesManager::BuildCommandToLaunchRemoteContainer
   return command;
 }
 
-
 //=============================================================================
 /*!
  *  builds the command to be launched.
@@ -634,7 +710,7 @@ SALOME_ResourcesManager::BuildCommand
 
   command += machine;
   command += " ";
-  string path = (*(resInfo.ModulesPath.find("KERNEL"))).second;
+  string path = getenv("KERNEL_ROOT_DIR");
   command += path;
   command += "/bin/salome/";
 
@@ -695,17 +771,29 @@ throw(SALOME_Exception)
 void
 SALOME_ResourcesManager::KeepOnlyResourcesWithModule
 ( vector<string>& hosts,
-  const char *moduleName) const
+  const Engines::CompoList& componentList) const
 throw(SALOME_Exception)
 {
   for (vector<string>::iterator iter = hosts.begin(); iter != hosts.end();)
     {
       MapOfParserResourcesType::const_iterator it = _resourcesList.find(*iter);
-      const map<string, string>& mapOfModulesOfCurrentHost =
-        (((*it).second).ModulesPath);
-
-      if (mapOfModulesOfCurrentHost.find(moduleName) ==
-          mapOfModulesOfCurrentHost.end())
+      const vector<string>& mapOfModulesOfCurrentHost = (((*it).second).ModulesList);
+
+      bool erasedHost = false;
+      if( mapOfModulesOfCurrentHost.size() > 0 ){
+       for(int i=0;i<componentList.length();i++){
+          const char* compoi = componentList[i];
+         vector<string>::const_iterator itt = find(mapOfModulesOfCurrentHost.begin(),
+                                             mapOfModulesOfCurrentHost.end(),
+                                             compoi);
+//                                           componentList[i]);
+         if (itt == mapOfModulesOfCurrentHost.end()){
+           erasedHost = true;
+           break;
+         }
+       }
+      }
+      if(erasedHost)
         hosts.erase(iter);
       else
         iter++;
@@ -801,8 +889,10 @@ string SALOME_ResourcesManager::BuildTemporaryFileName() const
 string
 SALOME_ResourcesManager::BuildTempFileToLaunchRemoteContainer
 (const string& machine,
- const Engines::MachineParameters& params)
+ const Engines::MachineParameters& params) throw(SALOME_Exception)
 {
+  int status;
+
   _TmpFileName = BuildTemporaryFileName();
   ofstream tempOutputFile;
   tempOutputFile.open(_TmpFileName.c_str(), ofstream::out );
@@ -811,27 +901,6 @@ SALOME_ResourcesManager::BuildTempFileToLaunchRemoteContainer
 
   // --- set env vars
 
-  tempOutputFile << "source " << resInfo.PreReqFilePath << endl;
-
-  for (map<string, string>::const_iterator iter = resInfo.ModulesPath.begin();
-       iter != resInfo.ModulesPath.end();
-       iter++)
-    {
-      string curModulePath((*iter).second);
-      tempOutputFile << (*iter).first << "_ROOT_DIR=" << curModulePath << endl;
-      tempOutputFile << "export " << (*iter).first << "_ROOT_DIR" << endl;
-      tempOutputFile << "LD_LIBRARY_PATH=" << curModulePath
-                    << "/lib/salome" << ":${LD_LIBRARY_PATH}" << endl;
-      tempOutputFile << "PYTHONPATH=" << curModulePath << "/bin/salome:"
-                    << curModulePath << "/lib/salome:" << curModulePath
-                    << "/lib/python${PYTHON_VERSION}/site-packages/salome:";
-      tempOutputFile << curModulePath
-      << "/lib/python${PYTHON_VERSION}/site-packages/salome/shared_modules:${PYTHONPATH}"
-      << endl;
-    }
-
-  tempOutputFile << "export LD_LIBRARY_PATH" << endl;
-  tempOutputFile << "export PYTHONPATH" << endl;
   tempOutputFile << "export SALOME_trace=local" << endl; // mkr : 27.11.2006 : PAL13967 - Distributed supervision graphs - Problem with "SALOME_trace"
   //tempOutputFile << "source " << resInfo.PreReqFilePath << endl;
 
@@ -859,8 +928,7 @@ SALOME_ResourcesManager::BuildTempFileToLaunchRemoteContainer
 #endif
     }
 
-  tempOutputFile << (*(resInfo.ModulesPath.find("KERNEL"))).second
-                << "/bin/salome/";
+  tempOutputFile << getenv("KERNEL_ROOT_DIR") << "/bin/salome/";
 
   if (params.isMPI)
     {
@@ -898,7 +966,7 @@ SALOME_ResourcesManager::BuildTempFileToLaunchRemoteContainer
       commandRcp += machine;
       commandRcp += ":";
       commandRcp += _TmpFileName;
-      system(commandRcp.c_str());
+      status = system(commandRcp.c_str());
     }
 
   else if (resInfo.Protocol == ssh)
@@ -910,11 +978,14 @@ SALOME_ResourcesManager::BuildTempFileToLaunchRemoteContainer
       commandRcp += machine;
       commandRcp += ":";
       commandRcp += _TmpFileName;
-      system(commandRcp.c_str());
+      status = system(commandRcp.c_str());
     }
   else
     throw SALOME_Exception("Unknown protocol");
 
+  if(status)
+    throw SALOME_Exception("Error of connection on remote host");    
+
   command += machine;
   _CommandForRemAccess = command;
   command += " ";
@@ -1074,4 +1145,42 @@ void SALOME_ResourcesManager::startMPI()
   }
 }
 
-
+Engines::MachineParameters* SALOME_ResourcesManager::GetMachineParameters(const char *hostname)
+{
+  ParserResourcesType resource = _resourcesList[string(hostname)];
+  Engines::MachineParameters *p_ptr = new Engines::MachineParameters;
+  p_ptr->container_name = CORBA::string_dup("");
+  p_ptr->hostname = CORBA::string_dup("hostname");
+  p_ptr->alias = CORBA::string_dup(resource.Alias.c_str());
+  if( resource.Protocol == rsh )
+    p_ptr->protocol = "rsh";
+  else if( resource.Protocol == ssh )
+    p_ptr->protocol = "ssh";
+  p_ptr->username = CORBA::string_dup(resource.UserName.c_str());
+  p_ptr->applipath = CORBA::string_dup(resource.AppliPath.c_str());
+  p_ptr->modList.length(resource.ModulesList.size());
+  for(int i=0;i<resource.ModulesList.size();i++)
+    p_ptr->modList[i] = CORBA::string_dup(resource.ModulesList[i].c_str());
+  p_ptr->OS = CORBA::string_dup(resource.OS.c_str());
+  p_ptr->mem_mb = resource.DataForSort._memInMB;
+  p_ptr->cpu_clock = resource.DataForSort._CPUFreqMHz;
+  p_ptr->nb_proc_per_node = resource.DataForSort._nbOfProcPerNode;
+  p_ptr->nb_node = resource.DataForSort._nbOfNodes;
+  if( resource.mpi == indif )
+    p_ptr->mpiImpl = "indif";
+  else if( resource.mpi == lam )
+    p_ptr->mpiImpl = "lam";
+  else if( resource.mpi == mpich1 )
+    p_ptr->mpiImpl = "mpich1";
+  else if( resource.mpi == mpich2 )
+    p_ptr->mpiImpl = "mpich2";
+  else if( resource.mpi == openmpi )
+    p_ptr->mpiImpl = "openmpi";
+  if( resource.Batch == pbs )
+    p_ptr->batch = "pbs";
+  else if( resource.Batch == lsf )
+    p_ptr->batch = "lsf";
+  else if( resource.Batch == slurm )
+    p_ptr->batch = "slurm";
+  return p_ptr;
+}
index 42cc984cd86ea30d4c67a0d852bff0c399467d76..23c7bd647cc3f696080d24a166a168f6fde0b955 100644 (file)
 #include <fstream>
 #include <vector>
 
+#if defined RESOURCESMANAGER_EXPORTS
+#if defined WIN32
+#define RESOURCESMANAGER_EXPORT __declspec( dllexport )
+#else
+#define RESOURCESMANAGER_EXPORT
+#endif
+#else
+#if defined WNT
+#define RESOURCESMANAGER_EXPORT __declspec( dllimport )
+#else
+#define RESOURCESMANAGER_EXPORT
+#endif
+#endif
+
 // --- WARNING ---
 // The call of BuildTempFileToLaunchRemoteContainer and RmTmpFile must be done
 // in a critical section to be sure to be clean.
 // Only one thread should use the SALOME_ResourcesManager class in a SALOME
 // session.
 
-class RESOURCESMANAGER_EXPORT SALOME_ResourcesManager
+class RESOURCESMANAGER_EXPORT SALOME_ResourcesManager:
+  public POA_Engines::ResourcesManager,
+  public PortableServer::RefCountServantBase
   {
 
   public:
 
-    SALOME_ResourcesManager(CORBA::ORB_ptr orb, const char *xmlFilePath);
-    SALOME_ResourcesManager(CORBA::ORB_ptr orb);
+    SALOME_ResourcesManager(CORBA::ORB_ptr orb, PortableServer::POA_var poa, SALOME_NamingService *ns, const char *xmlFilePath);
+    SALOME_ResourcesManager(CORBA::ORB_ptr orb, PortableServer::POA_var poa, SALOME_NamingService *ns);
 
     ~SALOME_ResourcesManager();
 
-    std::vector<std::string>
+    Engines::MachineList *
     GetFittingResources(const Engines::MachineParameters& params,
-                        const char *moduleName)
-    throw(SALOME_Exception);
+                        const Engines::CompoList& componentList);
+//     throw(SALOME_Exception);
 
-    std::string FindFirst(const Engines::MachineList& listOfMachines);
+    char* FindFirst(const Engines::MachineList& listOfMachines);
     std::string FindNext(const Engines::MachineList& listOfMachines);
     std::string FindBest(const Engines::MachineList& listOfMachines);
 
@@ -70,8 +86,7 @@ class RESOURCESMANAGER_EXPORT SALOME_ResourcesManager
 
     int AddResourceInCatalog
     (const Engines::MachineParameters& paramsOfNewResources,
-     const std::map<std::string, std::string>& modulesOnNewResources,
-     const char *environPathOfPrerequired,
+     const std::vector<std::string>& modulesOnNewResources,
      const char *alias,
      const char *userName,
      AccessModeType mode,
@@ -90,6 +105,12 @@ class RESOURCESMANAGER_EXPORT SALOME_ResourcesManager
     std::string BuildCommandToLaunchLocalParallelContainer(const std::string& exe_name, 
                                                           const Engines::MachineParameters& params, 
                                                           const std::string& log = "default");
+    Engines::MachineParameters* GetMachineParameters(const char *hostname);
+
+    void Shutdown();
+
+    static const char *_ResourcesManagerNameInNS;
+
   protected:
     
     // Parallel extension
@@ -97,17 +118,19 @@ class RESOURCESMANAGER_EXPORT SALOME_ResourcesManager
     bool _MpiStarted;
 
     SALOME_NamingService *_NS;
+    CORBA::ORB_var _orb;
+    PortableServer::POA_var _poa;
 
     std::string BuildTempFileToLaunchRemoteContainer
     (const std::string& machine,
-     const Engines::MachineParameters& params);
+     const Engines::MachineParameters& params) throw(SALOME_Exception);
 
     void SelectOnlyResourcesWithOS(std::vector<std::string>& hosts,
                                   const char *OS) const
       throw(SALOME_Exception);
 
     void KeepOnlyResourcesWithModule(std::vector<std::string>& hosts,
-                                    const char *moduleName) const
+                                    const Engines::CompoList& componentList) const
       throw(SALOME_Exception);
 
     void AddOmninamesParams(std::string& command) const;
@@ -116,9 +139,8 @@ class RESOURCESMANAGER_EXPORT SALOME_ResourcesManager
 
     std::string BuildTemporaryFileName() const;
 
-
     //! will contain the path to the ressources catalog
-    QString _path_resources;
+    std::string _path_resources;
 
     //! attribute that contains current tmp files generated
     std::string _TmpFileName;
index 9ef1801bb5dfbb31d21bffd4e3b7fbabf83d08d2..c66c12adcff6b5e6e544bac2906f73ff64c84ba2 100644 (file)
@@ -145,6 +145,8 @@ public:
   virtual CORBA::LongLong GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal);
 
   static PortableServer::POA_ptr GetPOA(const SALOMEDS::Study_ptr theStudy);
+
+  void Shutdown() { if(!CORBA::is_nil(_orb)) _orb->shutdown(0); }
 };
 
 #endif 
index e1059aeabf5f93f138abf238d69c9d52923a79cd..20a0d49abc7e91ec75e915c2559abd7f5bfe1204 100644 (file)
@@ -590,7 +590,7 @@ bool SALOMEDSImpl_StudyManager::Impl_SaveAs(const TCollection_AsciiString& aUrl,
                                              length,
                                              theMultiFile);
                  HDFdataset *hdf_dataset;
-                 hdf_size aHDFSize[1];
+                 hdf_size aHDFSize[1]; 
                  if(length > 0) {  //The component saved some auxiliary files, then put them into HDF file
 
                    aHDFSize[0] = length;
index b439cc54afcc4861994e36c1e52e86c4ebef03b3..bd55a1dc293f58e2c4dc69cd8ea89b674fdae060 100644 (file)
@@ -28,7 +28,7 @@
 
 #define TRACE_BUFFER_SIZE 256  // number of entries in circular buffer
                                // must be power of 2
-#define MAX_TRACE_LENGTH 256   // messages are truncated at this size
+#define MAX_TRACE_LENGTH 1024   // messages are truncated at this size
 
 #include <pthread.h>
 #include <semaphore.h>
index 04fc42f443c76dd3f14e51f12a6e487c8c14d0bc..9e232c8226635e430b6f7ce6142bb22c8ce7b86d 100644 (file)
@@ -65,10 +65,10 @@ clt.waitNS("/Kernel/ModulCatalog")
 
 # launch container manager server
 
-myCmServer = runSalome.ContainerManagerServer(args)
+myCmServer = runSalome.LauncherServer(args)
 myCmServer.setpath(modules_list,modules_root_dir)
 myCmServer.run()
-clt.waitNS("/ContainerManager")
+clt.waitNS("/SalomeLauncher")
 
 # execute Unit Test
 
@@ -78,8 +78,8 @@ ret = os.spawnvp(os.P_WAIT, command[0], command)
 # kill containers created by the Container Manager
 
 import Engines
-containerManager = clt.waitNS("/ContainerManager",Engines.ContainerManager)
-containerManager.Shutdown()
+launcher = clt.waitNS("/SalomeLauncher",Engines.SalomeLauncher)
+launcher.Shutdown()
 
 # kill Test process