]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
first version of launching executable from xml file
authorsecher <secher>
Thu, 29 May 2008 12:15:25 +0000 (12:15 +0000)
committersecher <secher>
Thu, 29 May 2008 12:15:25 +0000 (12:15 +0000)
12 files changed:
idl/SALOME_ContainerManager.idl
src/Batch/Batch_BatchManager_eClient.cxx
src/Batch/Batch_BatchManager_eLSF.cxx
src/Launcher/Launcher.cxx
src/Launcher/Launcher.hxx
src/Launcher/Makefile.am
src/Launcher/SALOME_Launcher.cxx
src/Launcher/SALOME_Launcher.hxx
src/Launcher/SALOME_Launcher_Handler.cxx [new file with mode: 0755]
src/Launcher/SALOME_Launcher_Handler.hxx [new file with mode: 0755]
src/Launcher/SALOME_Launcher_Parser.cxx [new file with mode: 0644]
src/Launcher/SALOME_Launcher_Parser.hxx [new file with mode: 0755]

index 515e939ea80e9ecd37338099df9d09b474899f02..7faca1ae66d42b41e15e73d27a51e6539c8a2b2f 100644 (file)
@@ -89,6 +89,8 @@ struct BatchParameters
 */
   interface SalomeLauncher
   {
+    long submitJob( in string xmlExecuteFile,
+                   in string clusterName ) raises (SALOME::SALOME_Exception);
     long submitSalomeJob( in string fileToExecute,
                          in FilesList filesToExport,
                          in FilesList filesToImport,
index 41ce47c2e687c2aa7b7722e1e72e8685c5cad464..d0b76fe9b4598ffc7fc60346e6e1f3b002ba0eb5 100644 (file)
@@ -89,24 +89,27 @@ namespace Batch {
 
     // Second step : copy fileToExecute into
     // batch tmp files directory
-    command = copy_command;
-    command += string(params[EXECUTABLE]);
-    command += " ";
-    if(_username != ""){
-      command += _username;
-      command += "@";
-    }
-    command += _hostname;
-    command += ":";
-    command += string(params[TMPDIR]);
-    cerr << command.c_str() << endl;
-    status = system(command.c_str());
-    if(status) {
-      std::ostringstream oss;
-      oss << status;
-      std::string ex_mess("Error of connection on remote host ! status = ");
-      ex_mess += oss.str();
-      throw EmulationException(ex_mess.c_str());
+    string executeFile = params[EXECUTABLE];
+    if( executeFile.size() > 0 ){
+      command = copy_command;
+      command += string(params[EXECUTABLE]);
+      command += " ";
+      if(_username != ""){
+       command += _username;
+       command += "@";
+      }
+      command += _hostname;
+      command += ":";
+      command += string(params[TMPDIR]);
+      cerr << command.c_str() << endl;
+      status = system(command.c_str());
+      if(status) {
+       std::ostringstream oss;
+       oss << status;
+       std::string ex_mess("Error of connection on remote host ! status = ");
+       ex_mess += oss.str();
+       throw EmulationException(ex_mess.c_str());
+      }
     }
     
     // Third step : copy filesToExportList into
index d1c44e60d66ca237ef311cd8b2d1fcfa3131b054..15eb740a33ddd6bc4343660a27e06151861de4cf 100644 (file)
@@ -53,9 +53,14 @@ namespace Batch {
     Parametre params = job.getParametre();
     const std::string dirForTmpFiles = params[TMPDIR];
     const string fileToExecute = params[EXECUTABLE];
-    string::size_type p1 = fileToExecute.find_last_of("/");
-    string::size_type p2 = fileToExecute.find_last_of(".");
-    std::string fileNameToExecute = fileToExecute.substr(p1+1,p2-p1-1);
+    std::string fileNameToExecute;
+    if( fileToExecute.size() > 0 ){
+      string::size_type p1 = fileToExecute.find_last_of("/");
+      string::size_type p2 = fileToExecute.find_last_of(".");
+      fileNameToExecute = fileToExecute.substr(p1+1,p2-p1-1);
+    }
+    else
+      fileNameToExecute = "command";
 
     // export input files on cluster
     exportInputFiles(job);
@@ -230,19 +235,28 @@ namespace Batch {
   {
     int status;
     Parametre params = job.getParametre();
+    Environnement env = job.getEnvironnement();
     const int nbproc = params[NBPROC];
     const long edt = params[MAXWALLTIME];
     const long mem = params[MAXRAMSIZE];
     const string workDir = params[WORKDIR];
     const std::string dirForTmpFiles = params[TMPDIR];
     const string fileToExecute = params[EXECUTABLE];
-    string::size_type p1 = fileToExecute.find_last_of("/");
-    string::size_type p2 = fileToExecute.find_last_of(".");
-    std::string rootNameToExecute = fileToExecute.substr(p1+1,p2-p1-1);
-    std::string fileNameToExecute = "~/" + dirForTmpFiles + "/" + string(basename(fileToExecute.c_str()));
-
-    int idx = dirForTmpFiles.find("Batch/");
-    std::string filelogtemp = dirForTmpFiles.substr(idx+6, dirForTmpFiles.length());
+    std::string rootNameToExecute;
+    std::string fileNameToExecute;
+    std::string filelogtemp;
+    if( fileToExecute.size() > 0 ){
+      string::size_type p1 = fileToExecute.find_last_of("/");
+      string::size_type p2 = fileToExecute.find_last_of(".");
+      rootNameToExecute = fileToExecute.substr(p1+1,p2-p1-1);
+      fileNameToExecute = "~/" + dirForTmpFiles + "/" + string(basename(fileToExecute.c_str()));
+
+      int idx = dirForTmpFiles.find("Batch/");
+      filelogtemp = dirForTmpFiles.substr(idx+6, dirForTmpFiles.length());
+    }
+    else{
+      rootNameToExecute = "command";
+    }
 
     std::string TmpFileName = BuildTemporaryFileName();
     ofstream tempOutputFile;
@@ -254,13 +268,26 @@ namespace Batch {
     if( mem > 0 )
       tempOutputFile << "#BSUB -M " << mem*1024 << endl ;
     tempOutputFile << "#BSUB -n " << nbproc << endl ;
-    tempOutputFile << "#BSUB -o runSalome.output.log." << filelogtemp << endl ;
-    tempOutputFile << "#BSUB -e runSalome.error.log." << filelogtemp << endl ;
+    if( fileToExecute.size() > 0 ){
+      tempOutputFile << "#BSUB -o output.log." << filelogtemp << endl ;
+      tempOutputFile << "#BSUB -e error.log." << filelogtemp << endl ;
+    }
+    else{
+      tempOutputFile << "#BSUB -o " << env["LOGFILE"] << ".output.log" << endl ;
+      tempOutputFile << "#BSUB -e " << env["LOGFILE"] << ".error.log" << endl ;
+    }
     if( workDir.size() > 0 )
       tempOutputFile << "cd " << workDir << endl ;
-    tempOutputFile << _mpiImpl->boot("",nbproc);
-    tempOutputFile << _mpiImpl->run("",nbproc,fileNameToExecute);
-    tempOutputFile << _mpiImpl->halt();
+    if( fileToExecute.size() > 0 ){
+      tempOutputFile << _mpiImpl->boot("",nbproc);
+      tempOutputFile << _mpiImpl->run("",nbproc,fileNameToExecute);
+      tempOutputFile << _mpiImpl->halt();
+    }
+    else{
+      tempOutputFile << "source " << env["SOURCEFILE"] << endl ;
+      tempOutputFile << env["COMMAND"];
+    }
+      
     tempOutputFile.flush();
     tempOutputFile.close();
     chmod(TmpFileName.c_str(), 0x1ED);
index 1bf8d163945d36c7c38b9acd46fbd26310e328d0..302541e3234aad5acefceafc798d3455aa699bfe 100644 (file)
@@ -20,6 +20,7 @@
 #include "Batch_Date.hxx"
 #include "Batch_FactBatchManager_eLSF.hxx"
 #include "Batch_FactBatchManager_ePBS.hxx"
+#include "SALOME_Launcher_Handler.hxx"
 #include "Launcher.hxx"
 #include <iostream>
 #include <sstream>
@@ -58,6 +59,106 @@ Launcher_cpp::~Launcher_cpp()
     delete it2->second;
 }
 
+//=============================================================================
+/*! CORBA Method:
+ *  Submit a batch job on a cluster and returns the JobId
+ *  \param xmlExecuteFile     : to define the execution on the batch cluster
+ *  \param clusterName        : name of the batch cluster
+ */
+//=============================================================================
+long Launcher_cpp::submitJob( const std::string xmlExecuteFile,
+                             const std::string clusterName) throw(LauncherException)
+{
+  cerr << "BEGIN OF Launcher_cpp::submitJob" << endl;
+  long jobId;
+  vector<string> aMachineList;
+
+  // verify if cluster is in resources catalog
+  machineParams params;
+  params.hostname = clusterName;
+  vector<string> aCompoList ;
+  try{
+    aMachineList = _ResManager->GetFittingResources(params, aCompoList);
+  }
+  catch(const ResourcesException &ex){
+    throw LauncherException(ex.msg.c_str());
+  }
+  if (aMachineList.size() == 0)
+    throw LauncherException("This cluster is not in resources catalog");
+
+  // Parsing xml file
+  ParseXmlFile(xmlExecuteFile);
+
+  // verify if clustername is in xml file
+  map<std::string,MachineParameters>::const_iterator it1 = _launch.MachinesList.find(clusterName);
+  if(it1 == _launch.MachinesList.end())
+    throw LauncherException("This cluster is not in xml file");
+
+  ParserResourcesType p = _ResManager->GetResourcesList(aMachineList[0]);
+  string cname(p.Alias);
+  cerr << "Choose cluster: " <<  cname << endl;
+
+  // search batch manager for that cluster in map or instanciate one
+  map < string, Batch::BatchManager_eClient * >::const_iterator it2 = _batchmap.find(cname);
+  if(it2 == _batchmap.end())
+    {
+      _batchmap[cname] = FactoryBatchManager(p);
+      // TODO: Add a test for the cluster !
+    }
+    
+  try{
+
+    // directory on cluster to put files to execute
+    string remotedir = _launch.MachinesList[clusterName].WorkDirectory;
+    // local directory to get files to execute and to put results
+    string localdir = _launch.RefDirectory;
+
+    int idx1 = xmlExecuteFile.find_last_of("/");
+    if(idx1 == string::npos) idx1 = -1;
+    int idx2 = xmlExecuteFile.find(".xml");
+    string logfile = xmlExecuteFile.substr(idx1+1,idx2-idx1-1);
+    string ologfile = logfile + ".output.log";
+    string elogfile = logfile + ".error.log";
+
+    // create and submit job on cluster
+    Batch::Parametre param;
+    param[USER] = p.UserName;
+    param[EXECUTABLE] = "";
+    for(int i=0; i<_launch.InputFile.size();i++)
+      param[INFILE] += Batch::Couple( localdir + "/" + _launch.InputFile[i], remotedir + "/" + _launch.InputFile[i] );
+    for(int i=0; i<_launch.OutputFile.size();i++)
+      param[OUTFILE] += Batch::Couple( localdir + "/" + _launch.OutputFile[i], remotedir + "/" + _launch.OutputFile[i] );
+    param[OUTFILE] += Batch::Couple( localdir + "/" + ologfile, remotedir + "/" + ologfile );
+    param[OUTFILE] += Batch::Couple( localdir + "/" + elogfile, remotedir + "/" + elogfile );
+    param[NBPROC] = _launch.NbOfProcesses;
+    param[WORKDIR] = remotedir;
+    param[TMPDIR] = remotedir;
+    param[MAXWALLTIME] = getWallTime("");
+    param[MAXRAMSIZE] = getRamSize("");
+
+    Batch::Environnement env;
+    env["COMMAND"] = _launch.Command;
+    env["SOURCEFILE"] = _launch.MachinesList[clusterName].EnvFile;
+    env["LOGFILE"] = logfile;
+
+    Batch::Job* job = new Batch::Job(param,env);
+
+    // submit job on cluster
+    Batch::JobId jid = _batchmap[cname]->submitJob(*job);
+
+    // get job id in long
+    istringstream iss(jid.getReference());
+    iss >> jobId;
+
+    _jobmap[ pair<string,long>(cname,jobId) ] = job;
+  }
+  catch(const Batch::EmulationException &ex){
+    throw LauncherException(ex.msg.c_str());
+  }
+
+  return jobId;
+}
+
 //=============================================================================
 /*! CORBA Method:
  *  Submit a batch job on a cluster and returns the JobId
@@ -579,3 +680,31 @@ long Launcher_cpp::getRamSize(std::string mem)
   else
     return 0;
 }
+
+void Launcher_cpp::ParseXmlFile(string xmlExecuteFile)
+{
+  SALOME_Launcher_Handler* handler = new SALOME_Launcher_Handler(_launch);
+
+  const char* aFilePath = xmlExecuteFile.c_str();
+  FILE* aFile = fopen(aFilePath, "r");
+  
+  if (aFile != NULL)
+    {
+      xmlDocPtr aDoc = xmlReadFile(aFilePath, NULL, 0);
+      
+      if (aDoc != NULL)
+       handler->ProcessXmlDocument(aDoc);
+      else
+       cerr << "ResourcesManager_cpp: could not parse file "<< aFilePath << endl;
+      
+      // Free the document
+      xmlFreeDoc(aDoc);
+
+      fclose(aFile);
+    }
+  else
+    cerr << "Launcher_cpp: file "<<aFilePath<<" is not readable." << endl;
+  
+  delete handler;
+
+}
index 616459b31f7dd3d4f64af429aa464d47daf399ac..66f954e5f971e297a3615e1e30b1adcd8f79a581 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "Batch_BatchManager_eClient.hxx"
 #include "ResourcesManager.hxx"
+#include "SALOME_Launcher_Parser.hxx"
 
 #include <string>
 
@@ -47,6 +48,9 @@ public:
   Launcher_cpp();
   ~Launcher_cpp();
 
+  long submitJob(const std::string xmlExecuteFile,
+                const std::string clusterName) throw(LauncherException);
+
   long submitSalomeJob(const std::string fileToExecute ,
                       const std::vector<std::string>& filesToExport ,
                       const std::vector<std::string>& filesToImport ,
@@ -73,6 +77,11 @@ protected:
   bool check(const batchParams& batch_params);
   long getWallTime(std::string edt);
   long getRamSize(std::string mem);
+  void ParseXmlFile(std::string xmlExecuteFile);
+
+  //! will contain the informations on the data type catalog(after parsing)
+  ParserLauncherType _launch;
+
 };
 
 #endif
index e6996d932fcecbdc48110ed46d7ca951861f3e76..bd61a22d8d09b86fba1771a9b69d5c7fa518b2a0 100644 (file)
@@ -36,6 +36,8 @@ include $(top_srcdir)/salome_adm/unix/make_common_starter.am
 #
 # header files  
 salomeinclude_HEADERS = \
+  SALOME_Launcher_Parser.hxx \
+  SALOME_Launcher_Handler.hxx \
   SALOME_Launcher.hxx \
   Launcher.hxx
 
@@ -106,6 +108,8 @@ libSalomeLauncher_la_LIBADD =\
        $(COMMON_LIBS) libLauncher.la
 
 libLauncher_la_SOURCES=\
+       SALOME_Launcher_Parser.cxx \
+       SALOME_Launcher_Handler.cxx  \
        Launcher.cxx
 
 libLauncher_la_CPPFLAGS =\
index f051cb32c094c3692bbeab65373d96908ebbc716..5178c9ac4a1dcc139cacc5c9f0becbac75c5e02d 100644 (file)
@@ -100,6 +100,28 @@ CORBA::Long SALOME_Launcher::getPID()
   return (CORBA::Long)getpid();
 }
 
+//=============================================================================
+/*! CORBA Method:
+ *  Submit a batch job on a cluster and returns the JobId
+ *  \param xmlExecuteFile     : .xml to parse to execute on the batch cluster
+ *  \param clusterName        : cluster name
+ */
+//=============================================================================
+CORBA::Long SALOME_Launcher::submitJob(const char * xmlExecuteFile,
+                                      const char * clusterName)
+{
+  CORBA::Long jobId;
+
+  try{
+    jobId = _l.submitJob(xmlExecuteFile,clusterName);
+  }
+  catch(const LauncherException &ex){
+    INFOS(ex.msg.c_str());
+    THROW_SALOME_CORBA_EXCEPTION(ex.msg.c_str(),SALOME::INTERNAL_ERROR);
+  }
+  return jobId;
+}
+
 //=============================================================================
 /*! CORBA Method:
  *  Submit a batch job on a cluster and returns the JobId
index 350fa03d2dd2e73051e362010e371fc4f13fbc1c..7f17b3a6fcb7be5a83308d69fbd628118032bc45 100644 (file)
@@ -52,6 +52,9 @@ public:
   SALOME_Launcher(CORBA::ORB_ptr orb, PortableServer::POA_var poa);
   ~SALOME_Launcher();
 
+  CORBA::Long submitJob(const char * xmlExecuteFile,
+                       const char * clusterName);
+
   CORBA::Long submitSalomeJob(const char * fileToExecute ,
                              const Engines::FilesList& filesToExport ,
                              const Engines::FilesList& filesToImport ,
diff --git a/src/Launcher/SALOME_Launcher_Handler.cxx b/src/Launcher/SALOME_Launcher_Handler.cxx
new file mode 100755 (executable)
index 0000000..3b21622
--- /dev/null
@@ -0,0 +1,168 @@
+//  SALOME ResourcesCatalog : implementation of catalog resources parsing (SALOME_ModuleCatalog.idl)
+//
+//  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   : SALOME_Laucher_Handler.cxx
+//  Author : Bernard Secher
+//  Module : SALOME
+//$Header$
+
+#include "SALOME_Launcher_Handler.hxx"
+#include <iostream>
+#include <map>
+
+using namespace std;
+
+#ifdef _DEBUG_
+static int MYDEBUG = 1;
+#else
+static int MYDEBUG = 0;
+#endif
+
+//=============================================================================
+/*!
+ *  Constructor
+ *  \param listOfResources: map of ParserResourcesType to fill when parsing
+ */ 
+//=============================================================================
+
+SALOME_Launcher_Handler::SALOME_Launcher_Handler(ParserLauncherType& launch):
+    _launch(launch)
+{
+  //XML tags initialisation
+  test_machine_list = "machine-list";
+  test_main = "main";
+
+  test_machine = "machine";
+  test_env_file = "env-file";
+  test_work_directory = "work-directory";
+  test_ref_directory = "ref-directory";
+  test_nb_processes = "nb-processes";
+  test_input_file = "input-file";
+  test_output_file = "output-file";
+  test_command = "command";
+
+}
+
+//=============================================================================
+/*!
+ *  Destructor
+ */ 
+//=============================================================================
+
+SALOME_Launcher_Handler::~SALOME_Launcher_Handler()
+{
+  //  cout << "SALOME_Launcher_Handler destruction") << endl;
+}
+
+//=============================================================================
+/*!
+ *  Retrieves DS after the file parse.
+ */ 
+//=============================================================================
+
+const ParserLauncherType&
+SALOME_Launcher_Handler::GetLauncherAfterParsing() const
+{
+  return _launch;
+}
+
+//=============================================================================
+/*!
+ *  Processes XML document and fills the list of resources
+ */ 
+//=============================================================================
+
+void SALOME_Launcher_Handler::ProcessXmlDocument(xmlDocPtr theDoc)
+{
+//   if (MYDEBUG) cout << "Begin parse document" << endl;
+
+  // Empty private elements
+  _launch.Clear();
+
+  // Get the document root node
+  xmlNodePtr aCurNode = xmlDocGetRootElement(theDoc);
+
+  aCurNode = aCurNode->xmlChildrenNode;
+  
+  // Processing the document nodes
+  while(aCurNode != NULL){
+    if ( !xmlStrcmp(aCurNode->name,(const xmlChar*)test_machine_list) ){
+      xmlNodePtr aCurNode2 = aCurNode->xmlChildrenNode;
+      while(aCurNode2 != NULL){
+       if ( !xmlStrcmp(aCurNode2->name,(const xmlChar*)test_machine) ){
+         _machp.Clear();
+         xmlChar* name = xmlNodeGetContent(aCurNode2);
+         string clusterName = (const char*)name;
+         xmlFree(name);
+       
+         if (xmlHasProp(aCurNode2, (const xmlChar*)test_env_file)){
+           xmlChar* envfile = xmlGetProp(aCurNode2, (const xmlChar*)test_env_file);
+           _machp.EnvFile = (const char*)envfile;
+           xmlFree(envfile);
+         }
+
+         if (xmlHasProp(aCurNode2, (const xmlChar*)test_work_directory)){
+           xmlChar* workdirectory = xmlGetProp(aCurNode2, (const xmlChar*)test_work_directory);
+           _machp.WorkDirectory = (const char*)workdirectory;
+           xmlFree(workdirectory);
+         }
+         _launch.MachinesList[clusterName]=_machp ;
+       }
+       aCurNode2 = aCurNode2->next;
+      }
+    }
+
+    if ( !xmlStrcmp(aCurNode->name,(const xmlChar*)test_ref_directory) ){
+      xmlChar* refdirectory = xmlNodeGetContent(aCurNode);
+      _launch.RefDirectory = (const char*)refdirectory;
+      xmlFree(refdirectory);
+    }
+         
+    if ( !xmlStrcmp(aCurNode->name,(const xmlChar*)test_nb_processes) ){
+      xmlChar* nbofprocesses = xmlNodeGetContent(aCurNode);
+      _launch.NbOfProcesses = atoi((const char*)nbofprocesses);
+      xmlFree(nbofprocesses);
+    }
+         
+    if ( !xmlStrcmp(aCurNode->name,(const xmlChar*)test_input_file) ){
+      xmlChar* inputfile = xmlNodeGetContent(aCurNode);
+      _launch.InputFile.push_back((const char*)inputfile);
+      xmlFree(inputfile);
+    }
+         
+    if ( !xmlStrcmp(aCurNode->name,(const xmlChar*)test_output_file) ){
+      xmlChar* outputfile = xmlNodeGetContent(aCurNode);
+      _launch.OutputFile.push_back((const char*)outputfile);
+      xmlFree(outputfile);
+    }
+         
+    if ( !xmlStrcmp(aCurNode->name,(const xmlChar*)test_command) ){
+      xmlChar* command = xmlNodeGetContent(aCurNode);
+      _launch.Command = (const char*)command;
+      xmlFree(command);
+    }
+         
+    aCurNode = aCurNode->next;
+  }
+
+}
diff --git a/src/Launcher/SALOME_Launcher_Handler.hxx b/src/Launcher/SALOME_Launcher_Handler.hxx
new file mode 100755 (executable)
index 0000000..e584958
--- /dev/null
@@ -0,0 +1,69 @@
+//  SALOME ResourcesCatalog : implementation of catalog resources parsing (SALOME_ModuleCatalog.idl)
+//
+//  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   : SALOME_Launcher_Handler.hxx
+//  Author : Bernard SECHER
+//  Module : SALOME
+//$Header$
+
+#ifndef SALOME_LAUNCHER_HANDLER
+#define SALOME_LAUNCHER_HANDLER
+
+#include "SALOME_Launcher_Parser.hxx"
+
+#include <string>
+#include <vector>
+
+#include <libxml/parser.h>
+
+class SALOME_Launcher_Handler
+{
+  
+public :
+  SALOME_Launcher_Handler(ParserLauncherType& launch);
+
+  virtual ~SALOME_Launcher_Handler();
+
+  const ParserLauncherType& GetLauncherAfterParsing() const;
+
+  void ProcessXmlDocument(xmlDocPtr theDoc);
+  
+private :
+  ParserLauncherType& _launch;
+  MachineParameters _machp;
+
+  const char *test_machine_list;
+  const char *test_main;
+
+  const char *test_machine;
+  const char *test_env_file;
+  const char *test_work_directory;
+  const char *test_ref_directory;
+  const char *test_nb_processes;
+  const char *test_input_file;
+  const char *test_output_file;
+  const char *test_command;
+
+};
+
+#endif // SALOME_LAUNCHER_HANDLER
diff --git a/src/Launcher/SALOME_Launcher_Parser.cxx b/src/Launcher/SALOME_Launcher_Parser.cxx
new file mode 100644 (file)
index 0000000..f08514c
--- /dev/null
@@ -0,0 +1,77 @@
+// 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_Parser.hxx"
+#include <iostream>
+#include <sstream>
+
+#define NULL_VALUE 0
+
+using namespace std;
+
+void MachineParameters::Clear()
+{
+  EnvFile = "";
+  WorkDirectory = "";
+}
+
+void MachineParameters::Print() const
+{
+  ostringstream oss;
+  oss << " EnvFile: " <<  EnvFile 
+      << " WorkDirectory: " <<  WorkDirectory << endl;
+
+  cout << oss.str();
+}
+
+void ParserLauncherType::Print() const
+{
+  ostringstream oss;
+  oss << endl <<
+    "RefDirectory: " << RefDirectory << endl << 
+    "NbOfProcesses: " << NbOfProcesses << endl <<
+    "InputFile: ";
+  for(int i=0; i <InputFile.size();i++)
+    oss << InputFile[i] << " ";
+  oss << endl << "OutputFile: ";
+  for(int i=0; i <OutputFile.size();i++)
+    oss << OutputFile[i] << " ";
+  oss << endl <<
+    "Command: " << Command << endl <<
+    "Machines: " << endl;
+
+  cout << oss.str();
+
+  std::map < string, MachineParameters >::const_iterator it;
+  for(it=MachinesList.begin();it!=MachinesList.end();it++){
+    cout << "  " << it->first;
+    it->second.Print();
+  }
+
+}
+
+void ParserLauncherType::Clear()
+{
+  MachinesList.clear();
+  RefDirectory = "";
+  NbOfProcesses = 1;
+  InputFile.clear();
+  OutputFile.clear();
+  Command = "";
+}
diff --git a/src/Launcher/SALOME_Launcher_Parser.hxx b/src/Launcher/SALOME_Launcher_Parser.hxx
new file mode 100755 (executable)
index 0000000..3a29818
--- /dev/null
@@ -0,0 +1,58 @@
+//  SALOME ResourcesCatalog : implementation of catalog resources parsing (SALOME_ModuleCatalog.idl)
+//
+//  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   : SALOME_Launcher_Parser.hxx
+//  Author : Bernard Secher
+//  Module : SALOME
+//$Header$
+
+#ifndef SALOME_LAUNCHER_PARSER
+#define SALOME_LAUNCHER_PARSER
+
+#include <string>
+#include <vector>
+#include <map>
+#include <iostream>
+
+struct MachineParameters
+  {
+    std::string EnvFile;
+    std::string WorkDirectory;
+    void Print() const;
+    void Clear();
+  };
+
+struct ParserLauncherType
+  {
+    std::map<std::string,MachineParameters> MachinesList;
+    std::string RefDirectory;
+    long NbOfProcesses;
+    std::vector<std::string> InputFile;
+    std::vector<std::string> OutputFile;
+    std::string Command;
+
+    void Print() const;
+    void Clear();
+  };
+
+#endif //SALOME_LAUNCHER_PARSER