]> SALOME platform Git repositories - modules/yacs.git/blob - src/runtime/SalomeComponent.cxx
Salome HOME
copy tag mergefrom_BR_V0_1_CC_Salome_04oct07
[modules/yacs.git] / src / runtime / SalomeComponent.cxx
1 #include "RuntimeSALOME.hxx"
2 #include "SalomeComponent.hxx"
3 #include "SalomeContainer.hxx"
4 #include "CORBANode.hxx"
5
6 #ifdef SALOME_KERNEL
7 #include "SALOME_NamingService.hxx"
8 #include "SALOME_LifeCycleCORBA.hxx"
9 #endif
10
11 #include <omniORB4/CORBA.h>
12 #include <iostream>
13 #include <sstream>
14
15 using namespace YACS::ENGINE;
16 using namespace std;
17
18 const char SalomeComponent::KIND[]="Salome";
19
20 //! SalomeComponent constructor
21 SalomeComponent::SalomeComponent(const std::string& name): ComponentInstance(name)
22 {
23   _objComponent=CORBA::Object::_nil();
24 }
25
26 //! SalomeComponent copy constructor
27 SalomeComponent::SalomeComponent(const SalomeComponent& other):ComponentInstance(other)
28 {
29   _objComponent=CORBA::Object::_nil();
30 }
31
32 SalomeComponent::~SalomeComponent()
33 {
34 }
35
36 std::string SalomeComponent::getKind() const
37 {
38   return KIND;
39 }
40
41 //! Unload the component 
42 void SalomeComponent::unload()
43 {
44   //Not implemented
45   std::cerr << "SalomeComponent::unload : not implemented " << std::endl;
46 }
47
48 //! Is the component instance already loaded ?
49 bool SalomeComponent::isLoaded()
50 {
51   if(CORBA::is_nil(_objComponent))
52     return false;
53   else
54     return true;
55 }
56
57 #ifdef SALOME_KERNEL
58 //! Load the component 
59 void SalomeComponent::load()
60 {
61   if(_container)
62     {
63       SalomeContainer *containerC=(SalomeContainer *)_container;
64       containerC->lock();//To be sure
65       if(!_container->isAlreadyStarted())
66         {
67           try
68             {
69               _container->start();
70             }
71           catch(Exception& e)
72             {
73               containerC->unLock();
74               throw e;
75             }
76         }
77       containerC->unLock();
78       containerC->lock();//To be sure
79       const char* componentName=_name.c_str();
80       //char *val2=CORBA::string_dup("");
81       // does not work with python components
82       // does not make a strict load but a find or load component
83       //   _objComponent=containerC->_trueCont->load_impl(componentName,val2);
84       bool isLoadable = containerC->_trueCont->load_component_Library(componentName);
85       if (isLoadable) 
86         _objComponent=containerC->_trueCont->create_component_instance(componentName, 0);
87
88       if(CORBA::is_nil(_objComponent))
89         {
90           containerC->unLock();
91           throw Exception("SalomeComponent::load : Error while trying to create a new component.");
92         }
93       containerC->unLock();
94       return;
95     }
96   //throw Exception("SalomeComponent::load : no container specified !!! To be implemented in executor to allocate default a Container in case of presenceOfDefaultContainer.");
97   //This component has no specified container : use default container policy
98   SALOME_NamingService ns(getSALOMERuntime()->getOrb());
99   SALOME_LifeCycleCORBA LCC(&ns);
100   Engines::MachineParameters params;
101   LCC.preSet(params);
102   params.hostname="localhost";
103   params.container_name ="FactoryServer";
104   _objComponent=LCC.LoadComponent(params,_name.c_str());
105 }
106 #else
107 void SalomeComponent::load()
108 {
109   throw Exception("YACS has been built without SALOME support");
110 }
111 #endif
112
113 //! Create a ServiceNode with this component instance and no input or output port
114 /*!
115  *   \param name : node name
116  *   \return       a new SalomeNode node
117  */
118 ServiceNode* SalomeComponent::createNode(const std::string& name)
119 {
120    SalomeNode* node=new SalomeNode(name);
121    node->setComponent(this);
122    return node;
123 }
124
125 //! Clone the component instance
126 ComponentInstance* SalomeComponent::clone() const
127 {
128   if(_isAttachedOnCloning)
129     {
130       incrRef();
131       return (ComponentInstance*) (this);
132     }
133   else
134     return new SalomeComponent(*this);
135 }
136
137 std::string SalomeComponent::getFileRepr() const
138 {
139   ostringstream stream;
140   stream << "<component>" << getName() << "</component>";
141   return stream.str();
142 }