Salome HOME
Addition of a new type of SalomeComponent to take advantage of HPContainer.
authorAnthony Geay <anthony.geay@edf.fr>
Tue, 5 Aug 2014 12:34:46 +0000 (14:34 +0200)
committerAnthony Geay <anthony.geay@edf.fr>
Tue, 5 Aug 2014 12:34:46 +0000 (14:34 +0200)
25 files changed:
src/engine/ComponentInstance.cxx
src/engine/ComponentInstance.hxx
src/engine/Container.cxx
src/engine/Container.hxx
src/engine/HomogeneousPoolContainer.cxx
src/engine/HomogeneousPoolContainer.hxx
src/engine/ServiceNode.cxx
src/engine/Test/ComponentInstanceTest.cxx
src/engine/Test/ComponentInstanceTest.hxx
src/runtime/CMakeLists.txt
src/runtime/CORBAComponent.cxx
src/runtime/CORBAComponent.hxx
src/runtime/CppComponent.cxx
src/runtime/CppComponent.hxx
src/runtime/RuntimeSALOME.cxx
src/runtime/SalomeComponent.cxx
src/runtime/SalomeComponent.hxx
src/runtime/SalomeContainerTools.cxx
src/runtime/SalomeContainerTools.hxx
src/runtime/SalomeHPComponent.cxx [new file with mode: 0644]
src/runtime/SalomeHPComponent.hxx [new file with mode: 0644]
src/runtime/SalomeHPContainer.cxx
src/runtime/SalomeHPContainer.hxx
src/runtime/SalomeHPContainerTools.cxx
src/runtime/SalomeHPContainerTools.hxx

index c8f8457243fa5f90c1d1d6c44a19c07dea2a1b4a..4e5a7957e586ada04b18b82e491d8840a823e3bb 100644 (file)
@@ -128,6 +128,11 @@ string ComponentInstance::getKind() const
   return KIND;
 }
 
+std::string ComponentInstance::getKindForNode() const
+{
+  return KIND;
+}
+
 void ComponentInstance::shutdown(int level)
 {
 }
index 8f593af6250d5ec2de2ed4b7eb2b308231c32b71..839e4d51611beda37ea4d535130252b82fb931e9 100644 (file)
@@ -63,6 +63,7 @@ namespace YACS
       virtual ServiceNode* createNode(const std::string& name)=0;
       virtual ComponentInstance *clone() const = 0;
       virtual std::string getKind() const;
+      virtual std::string getKindForNode() const;
       static const char KIND[];
       virtual void shutdown(int level);
     protected:
index b77a262109ff6f0ada90a7a992247c4fd73d680e..2bd052dd586eef54b59d91b2c14b76a197ec704b 100644 (file)
@@ -23,6 +23,8 @@
 //#define _DEVDEBUG_
 #include "YacsTrace.hxx"
 
+#include <sstream>
+
 using namespace std;
 using namespace YACS::ENGINE;
 
@@ -34,6 +36,13 @@ Container::~Container()
 {
 }
 
+std::string Container::getDiscreminantStrOfThis() const
+{
+  const void *ptr(this);
+  std::ostringstream oss; oss << ptr;
+  return oss.str();
+}
+
 /*!
  * By calling this method the current container 'this' is not destined to be deeply copied on clone call.
  */
index 6c8b8ed173bf6c7992b5fa20a4b75e132ade6f4e..979485aeb60ba1e0f58b03770fabe1e56117c19b 100644 (file)
@@ -47,6 +47,7 @@ namespace YACS
 #endif
     public:
       //Execution only methods
+      virtual std::string getDiscreminantStrOfThis() const;
       virtual bool isAlreadyStarted(const Task *askingNode) const = 0;
       virtual void start(const Task *askingNode) throw(Exception) = 0;
       virtual std::string getPlacementId(const Task *askingNode) const = 0;
@@ -54,7 +55,7 @@ namespace YACS
       //Edition only methods
       virtual void attachOnCloning() const;
       virtual void dettachOnCloning() const;
-      bool isAttachedOnCloning() const;
+      virtual bool isAttachedOnCloning() const;
       virtual void lock() = 0;
       virtual void unLock() = 0;
       //! \b WARNING ! clone behaviour \b MUST be in coherence with what is returned by isAttachedOnCloning() method
index 814a2f358029cb0f43cc488b9e75145e61e494f0..39c3a45c7b433ac665a29f782fb653ee355cf011 100644 (file)
 //
 
 #include "HomogeneousPoolContainer.hxx"
+#include "Exception.hxx"
 
 using namespace YACS::ENGINE;
 
+void HomogeneousPoolContainer::attachOnCloning() const
+{
+  _isAttachedOnCloning=true;
+}
+
+void HomogeneousPoolContainer::dettachOnCloning() const
+{
+  _isAttachedOnCloning=true;
+  throw Exception("An HomogeneousPoolContainer cannot be detached on cloning !");
+}
+
+/*!
+ * By definition an HomogeneousPoolContainer instance is attached on cloning.
+ */
+bool HomogeneousPoolContainer::isAttachedOnCloning() const
+{
+  return true;
+}
+
 HomogeneousPoolContainer::HomogeneousPoolContainer()
 {
+  _isAttachedOnCloning=true;
 }
 
 HomogeneousPoolContainer::~HomogeneousPoolContainer()
index 6ef5ce8974eb5d86297323566eeeb645ec5c5a70..c7869300891a39c60b59cf25459484f911b4a071 100644 (file)
@@ -37,6 +37,10 @@ namespace YACS
     class YACSLIBENGINE_EXPORT HomogeneousPoolContainer : public Container
     {
     public:
+      void attachOnCloning() const;
+      void dettachOnCloning() const;
+      bool isAttachedOnCloning() const;
+      //
       virtual void setSizeOfPool(int sz) = 0;
       virtual std::size_t getNumberOfFreePlace() const = 0;
       virtual void allocateFor(const std::vector<const Task *>& nodes) = 0;
index 89e23e872bb306e4e4684c73b77cb3c791717dc4..6d4b167cdb9928436a30ff6595053cbf0783ac09 100644 (file)
@@ -138,7 +138,7 @@ void ServiceNode::setComponent(ComponentInstance* compo) throw(YACS::Exception)
   if(compo)
     {
       DEBTRACE(compo->getInstanceName());
-      if(compo->getKind() != this->getKind())
+      if(compo->getKindForNode() != this->getKind())
         {
           //Not allowed
           std::string what("ServiceNode::setComponent : component instance kind not allowed ");
index c18e738e321068caaae503177cafbfd54617c32b..6d1330d5efea59e51fd2ccacb0208721418b83fc 100644 (file)
@@ -51,6 +51,11 @@ std::string ComponentInstanceTest1::getKind() const
   return ToyNode1S::KIND;
 }
 
+std::string ComponentInstanceTest1::getKindForNode() const
+{
+  return ToyNode1S::KIND;
+}
+
 ServiceNode* ComponentInstanceTest1::createNode(const std::string& name)
 {
   ToyNode1S* node=new ToyNode1S(name);
@@ -97,6 +102,11 @@ std::string ComponentInstanceTest2::getKind() const
   return ToyNode2S::KIND;
 }
 
+std::string ComponentInstanceTest2::getKindForNode() const
+{
+  return ToyNode2S::KIND;
+}
+
 ServiceNode* ComponentInstanceTest2::createNode(const std::string& name)
 {
   ToyNode2S* node=new ToyNode2S(name);
index 71fef605ba921b42383385ef743a1e5fc93604fe..0432263568aa868dbffd8ed907955970e6ad7638 100644 (file)
@@ -35,6 +35,7 @@ namespace YACS
       void unload(Task *askingNode);
       bool isLoaded(Task *askingNode) const;
       std::string getKind() const;
+      std::string getKindForNode() const;
       ServiceNode* createNode(const std::string& name);
       ComponentInstance *clone() const;
     protected:
@@ -50,6 +51,7 @@ namespace YACS
       void unload(Task *askingNode);
       bool isLoaded(Task *askingNode) const;
       std::string getKind() const;
+      std::string getKindForNode() const;
       ServiceNode* createNode(const std::string& name);
       ComponentInstance *clone() const;
     protected:
index 42f0956f7ffc3b29d9871746352f80cb7689e07a..42ae3fbd8db522bc4372aaf5aaf62cf1dfbe4c51 100644 (file)
@@ -116,6 +116,7 @@ SET(YACSRuntimeSALOME_HEADERS
   PythonXMLConv.hxx 
   RuntimeSALOME.hxx
   SalomeComponent.hxx
+  SalomeHPComponent.hxx
   SalomeContainer.hxx
   SalomeContainerTools.hxx
   SalomeContainerHelper.hxx
@@ -183,7 +184,8 @@ SET(YACSRuntimeSALOME_SOURCES
   SalomeProc.cxx                 
   CalStreamPort.cxx              
   CORBAComponent.cxx             
-  SalomeComponent.cxx            
+  SalomeComponent.cxx   
+  SalomeHPComponent.cxx         
   CppComponent.cxx               
   CppContainer.cxx               
   CppCORBAConv.cxx               
index 09132ebe994dc0c0786474130da120f2e8de7bea..bdfe047de0680acf09f8e57853a891635cc3f502 100644 (file)
@@ -68,6 +68,11 @@ std::string CORBAComponent::getKind() const
   return KIND;
 }
 
+std::string CORBAComponent::getKindForNode() const
+{
+  return KIND;
+}
+
 //! Unload the component 
 void CORBAComponent::unload(Task *askingNode)
 {
index c6b4222ba62542a2f47f68ca7201dbd71b3441d5..e536a723b410fba42b1c1434f78d10ddb541840b 100644 (file)
@@ -49,6 +49,7 @@ namespace YACS
     public:
       static const char KIND[];
       virtual std::string getKind() const;
+      virtual std::string getKindForNode() const;
     protected:
       CORBA::Object_var _objComponent;
     };
index fb3b1b8c82531117106fe8115f209c0328167f31..bb769a3ba6631f1b5c766f9e458c8d6a8b80cff5 100644 (file)
@@ -74,7 +74,12 @@ static std::ostream & operator<<(std::ostream & f, const Any & A)
 
 std::string CppComponent::getKind() const
 {
-   return CppComponent::KIND;
+  return CppComponent::KIND;
+}
+
+std::string CppComponent::getKindForNode() const
+{
+  return CppComponent::KIND;
 }
 
 //! CppComponent constructor
index 50d32d5c52ebf341d30233c6c4fa4085dddb8baa..e5e7ebc0511c62f2f8f96533b07262ef1a2cd37d 100644 (file)
@@ -56,6 +56,7 @@ namespace YACS
 
         static const char KIND[];
         virtual std::string getKind() const;
+        virtual std::string getKindForNode() const;
         virtual void load(Task *askingNode);
         virtual void unload(Task *askingNode);
         virtual bool isLoaded(Task *askingNode) const;
index 7134266dc2d6ab2d44e3a6b3fb3e3e63d756bb48..f3f43e2cbfeb69292868db0b2d06adc90afc7c50 100644 (file)
@@ -50,6 +50,7 @@
 //Components
 #include "CORBAComponent.hxx"
 #include "SalomeComponent.hxx"
+#include "SalomeHPComponent.hxx"
 #include "SalomePythonComponent.hxx"
 #include "CppComponent.hxx"
 
@@ -588,6 +589,8 @@ ComponentInstance* RuntimeSALOME::createComponentInstance(const std::string& nam
     return new SalomePythonComponent(name);
   else if (kind == CppComponent::KIND)
     return new CppComponent(name);
+  else if (kind == SalomeHPComponent::KIND)
+    return new SalomeHPComponent(name);
   std::string msg="Component Instance kind ("+kind+") unknown";
   throw Exception(msg);
 }
index ea1fbf053b773635d807effdfc511f58006ad338..0e9007837844bb3d9135df6fa68b3365c9d3f89d 100644 (file)
@@ -62,6 +62,11 @@ std::string SalomeComponent::getKind() const
   return KIND;
 }
 
+std::string SalomeComponent::getKindForNode() const
+{
+  return KIND;
+}
+
 //! Unload the component 
 void SalomeComponent::unload(Task *askingNode)
 {
@@ -90,20 +95,7 @@ void SalomeComponent::load(Task *askingNode)
           _objComponent=salomeContainer->loadComponent(askingNode);
           return ;
         }
-      SalomeHPContainer *salomeContainer2(dynamic_cast<SalomeHPContainer *>(_container));
-      if(salomeContainer2)
-        {
-          SalomeContainerHelper *lmt(0);
-          {
-            YACS::BASES::AutoLocker<Container> altck(salomeContainer2);
-            lmt=salomeContainer2->getHelperOfTask(askingNode);
-          }
-          SalomeContainer tmpCont(*salomeContainer2,salomeContainer2->getContainerInfo(),lmt,
-                                  salomeContainer2->getComponentNames(),salomeContainer2->getShutdownLev());
-          _objComponent=tmpCont.loadComponent(askingNode);
-          return ;
-        }
-      throw Exception("Unrecognized type of Container ! Only Salome and HPSalome container are supported by the Salome components !");
+      throw Exception("Unrecognized type of Container ! Only Salome are supported by the Salome components !");
     }
   //throw Exception("SalomeComponent::load : no container specified !!! To be implemented in executor to allocate default a Container in case of presenceOfDefaultContainer.");
   //This component has no specified container : use default container policy
@@ -155,6 +147,8 @@ std::string SalomeComponent::getFileRepr() const
 
 bool SalomeComponent::setContainer(Container *cont)
 {
+  if(!dynamic_cast<SalomeContainer *>(cont))
+    throw Exception("SalomeComponent::setContainer : a Salome component must be attached to a Salome container !");
   if(ComponentInstance::setContainer(cont))
     {
       if(_container)
index 267cd07be32cd6b89c2e1540cf68faaacc954581..e2ae3d9bbcd9ad266fae1b38c06ba7e86dc7b5fc 100644 (file)
@@ -50,6 +50,7 @@ namespace YACS
     public:
       static const char KIND[];
       virtual std::string getKind() const;
+      virtual std::string getKindForNode() const;
     protected:
       CORBA::Object_var _objComponent;
     };
index 2dec1aa0e20e7fd18843e3a81d952e1f4837f8c8..5c20ba5f0173b6d0ab69e0f0c9cce6ecf1843ffe 100644 (file)
@@ -23,6 +23,7 @@
 #include "SALOME_ResourcesManager.hxx"
 #include "SALOME_ContainerManager.hxx"
 #include "Container.hxx"
+#include "AutoLocker.hxx"
 
 #include "YacsTrace.hxx"
 #include "Proc.hxx"
@@ -246,7 +247,7 @@ std::string SalomeContainerTools::getNotNullContainerName(const Container *contP
       stream << "_";
       stream << contPtr->getName();
       stream << "_";
-      stream << (const void *)contPtr;
+      stream << contPtr->getDiscreminantStrOfThis();
       return stream.str();
     }
 }
@@ -419,66 +420,65 @@ void SalomeContainerTools::Start(const std::vector<std::string>& compoNames, Sal
 CORBA::Object_ptr SalomeContainerTools::LoadComponent(SalomeContainerHelper *launchModeType, Container *cont, Task *askingNode)
 {
   DEBTRACE("SalomeContainer::loadComponent ");
-  cont->lock();//To be sure
   const ComponentInstance *inst(askingNode?askingNode->getComponent():0);
-  if(!cont->isAlreadyStarted(askingNode))
-    {
-      try
-        {
-          cont->start(askingNode);
-        }
-      catch(Exception& e)
-        {
-          cont->unLock();
-          throw e;
-        }
-    }
-  cont->unLock();
-  cont->lock();//To be sure
+  {
+    YACS::BASES::AutoLocker<Container> alck(cont);//To be sure
+    if(!cont->isAlreadyStarted(askingNode))
+      cont->start(askingNode);
+  }
+  if(!inst)
+    throw Exception("SalomeContainerTools::LoadComponent : no instance of component in the task requesting for a load of its component !");
   CORBA::Object_ptr objComponent=CORBA::Object::_nil();
-  std::string compoName(inst->getCompoName());
-  const char* componentName=compoName.c_str();
-  Engines::Container_var container(launchModeType->getContainer(askingNode));
-
-  char* reason;
+  {
+    YACS::BASES::AutoLocker<Container> alck(cont);//To be sure
+    std::string compoName(inst->getCompoName());
+    Engines::Container_var container(launchModeType->getContainer(askingNode));
+
+    char *reason;
+    bool isLoadable(container->load_component_Library(compoName.c_str(), reason));
+    if(isLoadable)
+      objComponent=CreateComponentInstance(cont,container,inst);
+  }
+  return objComponent;
+}
 
-  bool isLoadable = container->load_component_Library(componentName, reason);
-  if (isLoadable)
+CORBA::Object_ptr SalomeContainerTools::CreateComponentInstance(Container *cont, Engines::Container_ptr contPtr, const ComponentInstance *inst)
+{
+  if(!inst)
+    throw Exception("SalomeContainerTools::CreateComponentInstance : no instance of component in the task requesting for a load of its component !");
+  char *reason(0);
+  std::string compoName(inst->getCompoName());
+  CORBA::Object_ptr objComponent=CORBA::Object::_nil();
+  int studyid(1);
+  Proc* p(cont->getProc());
+  if(p)
     {
-      CORBA::string_free(reason);
-      int studyid=1;
-      Proc* p(cont->getProc());
-      if(p)
-        {
-          std::string value(p->getProperty("DefaultStudyID"));
-          if(!value.empty())
-            studyid= atoi(value.c_str());
-        }
-      // prepare component instance properties
-      Engines::FieldsDict_var env = new Engines::FieldsDict;
-      std::map<std::string, std::string> properties = inst->getProperties();
-      if(p)
-        {
-          std::map<std::string,std::string> procMap=p->getProperties();
-          properties.insert(procMap.begin(),procMap.end());
-        }
-
-      std::map<std::string, std::string>::const_iterator itm;
-      env->length(properties.size());
-      int item=0;
-      for(itm = properties.begin(); itm != properties.end(); ++itm, item++)
-        {
-          DEBTRACE("envname="<<itm->first<<" envvalue="<< itm->second);
-          env[item].key= CORBA::string_dup(itm->first.c_str());
-          env[item].value <<= itm->second.c_str();
-        }
+      std::string value(p->getProperty("DefaultStudyID"));
+      if(!value.empty())
+        studyid= atoi(value.c_str());
+    }
+  // prepare component instance properties
+  Engines::FieldsDict_var env(new Engines::FieldsDict);
+  std::map<std::string, std::string> properties(inst->getProperties());
+  if(p)
+    {
+      std::map<std::string,std::string> procMap=p->getProperties();
+      properties.insert(procMap.begin(),procMap.end());
+    }
 
-      objComponent=container->create_component_instance_env(componentName, studyid, env, reason);
+  std::map<std::string, std::string>::const_iterator itm;
+  env->length(properties.size());
+  int item=0;
+  for(itm = properties.begin(); itm != properties.end(); ++itm, item++)
+    {
+      DEBTRACE("envname="<<itm->first<<" envvalue="<< itm->second);
+      env[item].key= CORBA::string_dup(itm->first.c_str());
+      env[item].value <<= itm->second.c_str();
     }
 
+  objComponent=contPtr->create_component_instance_env(compoName.c_str(), studyid, env, reason);
   if(CORBA::is_nil(objComponent))
     {
-      cont->unLock();
       std::string text="Error while trying to create a new component: component '"+ compoName;
       text=text+"' is not installed or it's a wrong name";
       text += '\n';
@@ -486,7 +486,6 @@ CORBA::Object_ptr SalomeContainerTools::LoadComponent(SalomeContainerHelper *lau
       CORBA::string_free(reason);
       throw Exception(text);
     }
-  cont->unLock();
   return objComponent;
 }
 
index 4d5d2b88d2e7e854d31e35e33917a973a47e69d9..00b24ed85e64437b57e0953525897464d42e8a38 100644 (file)
@@ -59,6 +59,7 @@ namespace YACS
     public:
       static void Start(const std::vector<std::string>& compoNames, SalomeContainerHelper *schelp, SalomeContainerTools& sct, int& shutdownLevel, const Container *cont, const Task *askingNode);
       static CORBA::Object_ptr LoadComponent(SalomeContainerHelper *launchModeType, Container *cont, Task *askingNode);
+      static CORBA::Object_ptr CreateComponentInstance(Container *cont, Engines::Container_ptr contPtr, const ComponentInstance *inst);
       static std::string GetPlacementId(const SalomeContainerHelper *launchModeType, const Container *cont, const Task *askingNode);
       static std::string GetFullPlacementId(const SalomeContainerHelper *launchModeType, const Container *cont, const Task *askingNode);
     protected:
diff --git a/src/runtime/SalomeHPComponent.cxx b/src/runtime/SalomeHPComponent.cxx
new file mode 100644 (file)
index 0000000..1976a88
--- /dev/null
@@ -0,0 +1,213 @@
+// Copyright (C) 2006-2014  CEA/DEN, EDF R&D
+//
+// 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, or (at your option) any later version.
+//
+// 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 "SalomeHPComponent.hxx"
+#include "RuntimeSALOME.hxx"
+#include "SalomeContainer.hxx"
+#include "SalomeHPContainer.hxx"
+#include "SalomeComponent.hxx" // for KIND
+#include "CORBANode.hxx"
+#include "AutoLocker.hxx"
+
+#ifdef SALOME_KERNEL
+#include "SALOME_NamingService.hxx"
+#include "SALOME_LifeCycleCORBA.hxx"
+#endif
+
+#include <omniORB4/CORBA.h>
+#include <iostream>
+#include <sstream>
+
+//#define _DEVDEBUG_
+#include "YacsTrace.hxx"
+
+
+namespace YACS
+{
+  namespace ENGINE
+  {
+    class SalomeContainerTmpForHP : public SalomeContainer
+    {
+    public:
+      SalomeContainerTmpForHP(const Container& other, const SalomeContainerTools& sct, SalomeContainerHelper *lmt,
+                              const std::vector<std::string>& componentNames, int shutdownLev,
+                              const SalomeHPContainer *zeOriginCont, std::size_t pos):SalomeContainer(other,sct,lmt,componentNames,shutdownLev),_zeOriginCont(zeOriginCont),_pos(pos) { }
+      std::string getDiscreminantStrOfThis() const { std::ostringstream oss; oss << _zeOriginCont << "_" << _pos; return oss.str(); }
+      CORBA::Object_ptr loadComponent(Task *inst);
+    private:
+      const SalomeHPContainer *_zeOriginCont;
+      std::size_t _pos;
+    };
+  }
+}
+
+using namespace YACS::ENGINE;
+using namespace std;
+
+const char SalomeHPComponent::KIND[]="HPSalome";
+
+CORBA::Object_ptr SalomeContainerTmpForHP::loadComponent(Task *askingNode)
+{
+  const ComponentInstance *inst(askingNode?askingNode->getComponent():0);
+  if(!inst)
+    throw Exception("SalomeContainerTmpForHP::loadComponent : asking to load a component on the given task whereas this task has no component !");
+  std::string compoName(inst->getCompoName());
+  {
+    YACS::BASES::AutoLocker<Container> alck(this);//To be sure
+    if(!this->isAlreadyStarted(askingNode))
+      this->start(askingNode);
+  }
+  CORBA::Object_ptr objComponent=CORBA::Object::_nil();
+  {
+    YACS::BASES::AutoLocker<Container> alck(this);//To be sure
+    std::string compoName(inst->getCompoName());
+    Engines::Container_var container(_launchModeType->getContainer(askingNode));
+    objComponent=container->find_component_instance(compoName.c_str(),0);
+    if(CORBA::is_nil(objComponent))
+      {
+        char *reason;
+        bool isLoadable(container->load_component_Library(compoName.c_str(), reason));
+        if(isLoadable)
+          objComponent=SalomeContainerTools::CreateComponentInstance(this,container,inst);
+      }
+  }
+  return objComponent;
+}
+
+SalomeHPComponent::SalomeHPComponent(const std::string& name): ComponentInstance(name)
+{
+  _objComponent=CORBA::Object::_nil();
+}
+
+SalomeHPComponent::SalomeHPComponent(const SalomeHPComponent& other):ComponentInstance(other)
+{
+  _objComponent=CORBA::Object::_nil();
+}
+
+SalomeHPComponent::~SalomeHPComponent()
+{
+}
+
+std::string SalomeHPComponent::getKind() const
+{
+  return KIND;
+}
+
+std::string SalomeHPComponent::getKindForNode() const
+{
+  return SalomeComponent::KIND;
+}
+
+//! Unload the component 
+void SalomeHPComponent::unload(Task *askingNode)
+{
+  //Not implemented
+  std::cerr << "SalomeHPComponent::unload : not implemented " << std::endl;
+}
+
+//! Is the component instance already loaded ?
+bool SalomeHPComponent::isLoaded(Task *askingNode) const
+{
+  return false;
+}
+
+//#ifdef SALOME_KERNEL
+//! Load the component 
+void SalomeHPComponent::load(Task *askingNode)
+{
+  if(_container)
+    {
+      SalomeHPContainer *salomeContainer(dynamic_cast<SalomeHPContainer *>(_container));
+      if(salomeContainer)
+        {
+          SalomeContainerHelper *lmt(0);
+          std::size_t posIn(0);
+          {
+            YACS::BASES::AutoLocker<Container> altck(salomeContainer);
+            lmt=salomeContainer->getHelperOfTask(askingNode);
+            posIn=salomeContainer->locateTask(askingNode);
+          }
+          SalomeContainerTmpForHP tmpCont(*salomeContainer,salomeContainer->getContainerInfo(),lmt,
+                                          salomeContainer->getComponentNames(),salomeContainer->getShutdownLev(),salomeContainer,posIn);
+          _objComponent=tmpCont.loadComponent(askingNode);
+          return ;
+        }
+      throw Exception("Unrecognized type of Container ! Only Salome and HPSalome container are supported by the Salome components !");
+    }
+  else
+    throw Exception("No container on HP component ! Impossible to load !");
+}
+/*#else
+void SalomeComponent::load(Task *askingNode)
+{
+  throw Exception("YACS has been built without SALOME support");
+}
+#endif*/
+
+//! Create a ServiceNode with this component instance and no input or output port
+/*!
+ *   \param name : node name
+ *   \return       a new SalomeNode node
+ */
+ServiceNode* SalomeHPComponent::createNode(const std::string& name)
+{
+  SalomeNode* node(new SalomeNode(name));
+   node->setComponent(this);
+   return node;
+}
+
+//! Clone the component instance
+ComponentInstance* SalomeHPComponent::clone() const
+{
+  if(_isAttachedOnCloning)
+    {
+      incrRef();
+      return (ComponentInstance*) (this);
+    }
+  else
+    return new SalomeHPComponent(*this);
+}
+
+std::string SalomeHPComponent::getFileRepr() const
+{
+  ostringstream stream;
+  stream << "<component>" << getCompoName() << "</component>";
+  return stream.str();
+}
+
+bool SalomeHPComponent::setContainer(Container *cont)
+{
+  if(!dynamic_cast<SalomeHPContainer *>(cont))
+    throw Exception("SalomeHPComponent::setContainer : a Salome HP component must be attached to a Salome HP container !");
+  if(ComponentInstance::setContainer(cont))
+    {
+      if(_container)
+        _container->addComponentName(_compoName);
+      return true;
+    }
+  else
+    return false;
+}
+
+void SalomeHPComponent::shutdown(int level)
+{
+  DEBTRACE("SalomeHPComponent::shutdown " << level);
+  if(_container)
+    _container->shutdown(level);
+}
diff --git a/src/runtime/SalomeHPComponent.hxx b/src/runtime/SalomeHPComponent.hxx
new file mode 100644 (file)
index 0000000..3ca7a1c
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright (C) 2006-2014  CEA/DEN, EDF R&D
+//
+// 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, or (at your option) any later version.
+//
+// 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 _SALOMEHPCOMPONENT_HXX_
+#define _SALOMEHPCOMPONENT_HXX_
+
+#include "YACSRuntimeSALOMEExport.hxx"
+#include "ComponentInstance.hxx"
+#include <omniORB4/CORBA.h>
+
+namespace YACS
+{
+  namespace ENGINE
+  {
+    class YACSRUNTIMESALOME_EXPORT SalomeHPComponent : public ComponentInstance
+    {
+    public:
+      SalomeHPComponent(const std::string& name);
+      SalomeHPComponent(const SalomeHPComponent& other);
+      virtual ~SalomeHPComponent();
+      virtual void load(Task *askingNode);
+      virtual void unload(Task *askingNode);
+      virtual bool isLoaded(Task *askingNode) const;
+      virtual bool setContainer(Container *cont);
+      virtual ServiceNode* createNode(const std::string& name);
+      virtual ComponentInstance* clone() const;
+      virtual std::string getFileRepr() const;
+      virtual CORBA::Object_ptr getCompoPtr(){return CORBA::Object::_duplicate(_objComponent);}
+      virtual void shutdown(int level);
+    public:
+      static const char KIND[];
+      virtual std::string getKind() const;
+      virtual std::string getKindForNode() const;
+    protected:
+      CORBA::Object_var _objComponent;
+    };
+  }
+}
+
+#endif
index 79a482adea870636369812aa520768850e78edda..82c3d5dcc903c8ee57338666567abaf3d359ca62 100644 (file)
@@ -18,7 +18,7 @@
 //
 
 #include "SalomeHPContainer.hxx"
-#include "SalomeComponent.hxx"
+#include "SalomeHPComponent.hxx"
 
 #include <algorithm>
 
@@ -150,6 +150,6 @@ std::map<std::string,std::string> SalomeHPContainer::getResourceProperties(const
 
 void SalomeHPContainer::checkCapabilityToDealWith(const ComponentInstance *inst) const throw(YACS::Exception)
 {
-  if(inst->getKind()!=SalomeComponent::KIND)
+  if(inst->getKind()!=SalomeHPComponent::KIND)
     throw Exception("SalomeHPContainer::checkCapabilityToDealWith : SalomeContainer is not able to deal with this type of ComponentInstance.");
 }
index e3e536e262ea5cb5f7be0e41122e950132f33ff8..0e0ab738c183c26538d3fc0bce1837b92185198e 100644 (file)
@@ -71,6 +71,7 @@ namespace YACS
       void checkCapabilityToDealWith(const ComponentInstance *inst) const throw(YACS::Exception);
       //
 #ifndef SWIG
+      std::size_t locateTask(const Task *askingNode) const { return _launchModeType.locateTask(askingNode); }
       const SalomeContainerTools &getContainerInfo() const { return _sct; }
       std::vector<std::string> getComponentNames() const { return _componentNames; }
       int getShutdownLev() const { return _shutdownLevel; }
index 92d83d59abab7888da9b07cbbb38f58190ef45e3..57a7afdec5e1e2a0a2254169a47e4f3175a58ae8 100644 (file)
@@ -69,16 +69,6 @@ void SalomeHPContainerVectOfHelper::release(const Task *node)
   _currentlyWorking.erase(it);
 }
 
-const SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTask(const Task *node) const
-{
-  return _launchModeType[locateTask(node)];
-}
-
-SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTask(const Task *node)
-{
-  return _launchModeType[locateTask(node)];
-}
-
 std::size_t SalomeHPContainerVectOfHelper::locateTask(const Task *node) const
 {
   std::map< const Task *,std::size_t >::const_iterator it(_currentlyWorking.find(node));
@@ -89,6 +79,16 @@ std::size_t SalomeHPContainerVectOfHelper::locateTask(const Task *node) const
   return ret;
 }
 
+const SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTask(const Task *node) const
+{
+  return _launchModeType[locateTask(node)];
+}
+
+SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTask(const Task *node)
+{
+  return _launchModeType[locateTask(node)];
+}
+
 void SalomeHPContainerVectOfHelper::checkNoCurrentWork() const
 {
   for(std::map<const Task *,std::size_t >::const_iterator it=_currentlyWorking.begin();it!=_currentlyWorking.end();it++)
index d3beec092a7dcb26fb414b0f4eb545b3589b0010..c02b4267f9796fe873eaabd42b01afe0e579ec0d 100644 (file)
@@ -43,12 +43,12 @@ namespace YACS
       std::size_t getNumberOfFreePlace() const;
       void allocateFor(const std::vector<const Task *>& nodes);
       void release(const Task *node);
+      std::size_t locateTask(const Task *node) const;
       const SalomeContainerMonoHelper *at(std::size_t pos) const { checkPosInVec(pos); return _launchModeType[pos]; }
       SalomeContainerMonoHelper *at(std::size_t pos) { checkPosInVec(pos); return _launchModeType[pos]; }
       const SalomeContainerMonoHelper *getHelperOfTask(const Task *node) const;
       SalomeContainerMonoHelper *getHelperOfTask(const Task *node);
     private:
-      std::size_t locateTask(const Task *node) const;
       void checkNoCurrentWork() const;
       void checkPosInVec(std::size_t pos) const;
     private: