]> SALOME platform Git repositories - modules/yacs.git/blob - src/runtime/SalomeContainer.cxx
Salome HOME
copy tag mergefrom_BR_V0_1_CC_Salome_04oct07
[modules/yacs.git] / src / runtime / SalomeContainer.cxx
1 //#define REFCNT
2 #ifdef REFCNT
3 #define private public
4 #define protected public
5 #include <omniORB4/CORBA.h>
6 #include <omniORB4/internal/typecode.h>
7 #endif
8
9 #include "RuntimeSALOME.hxx"
10 #include "SalomeContainer.hxx"
11 #include "SalomeComponent.hxx"
12
13 #include "SALOME_NamingService.hxx"
14 #include "SALOME_LifeCycleCORBA.hxx"
15 #include "SALOME_ContainerManager.hxx"
16
17 #include <sstream>
18 #include <iostream>
19
20 //#define _DEVDEBUG_
21 #include "YacsTrace.hxx"
22
23 using namespace YACS::ENGINE;
24 using namespace std;
25
26 SalomeContainer::SalomeContainer():_trueCont(Engines::Container::_nil())
27 {
28 }
29
30 SalomeContainer::SalomeContainer(const SalomeContainer& other):Container(other),_trueCont(Engines::Container::_nil())
31 {
32 }
33
34 SalomeContainer::~SalomeContainer()
35 {
36 }
37
38 void SalomeContainer::lock()
39 {
40   _mutex.lock();
41 }
42
43 void SalomeContainer::unLock()
44 {
45   _mutex.unlock();
46 }
47
48 bool SalomeContainer::isAlreadyStarted() const
49 {
50   if(CORBA::is_nil(_trueCont))
51     return false;
52   else
53     return true;
54 }
55
56 void SalomeContainer::start() throw (Exception)
57 {
58   CORBA::ORB_ptr orb=getSALOMERuntime()->getOrb();
59   SALOME_NamingService ns(orb);
60   CORBA::Object_var obj=ns.Resolve(SALOME_ContainerManager::_ContainerManagerNameInNS);
61   Engines::ContainerManager_var contManager=Engines::ContainerManager::_narrow(obj);
62   SALOME_LifeCycleCORBA LCC(&ns);
63   Engines::MachineParameters params;
64   LCC.preSet(params);
65   params.hostname=CORBA::string_dup("");
66   std::ostringstream stream;
67   stream << (void *)(this);
68   params.container_name=CORBA::string_dup(stream.str().c_str());
69   try
70     { 
71       std::string policy=getProperty("policy");
72       if(policy=="best")
73         _trueCont=contManager->StartContainer(params,Engines::P_BEST);
74       else if(policy=="first")
75         _trueCont=contManager->StartContainer(params,Engines::P_FIRST);
76       else
77         _trueCont=contManager->StartContainer(params,Engines::P_CYCL);
78     }
79   catch(CORBA::COMM_FAILURE&)
80     {
81       throw Exception("SalomeContainer::start : Unable to launch container in Salome : CORBA Comm failure detected");
82     }
83   catch(CORBA::Exception&)
84     {
85       throw Exception("SalomeContainer::start : Unable to launch container in Salome : Unexpected CORBA failure detected");
86     }
87   if(CORBA::is_nil(_trueCont))
88     throw Exception("SalomeContainer::start : Unable to launch container in Salome");
89 #ifdef REFCNT
90     DEBTRACE(_trueCont->_PR_getobj()->pd_refCount );
91 #endif
92 }
93
94 Container *SalomeContainer::clone() const
95 {
96   if(_isAttachedOnCloning)
97     {
98       incrRef();
99       return (Container*) (this);
100     }
101   else
102     return new SalomeContainer(*this);
103 }
104
105 std::string SalomeContainer::getPlacementId() const
106 {
107   if(isAlreadyStarted())
108     {
109       const char *what="/";
110       char *corbaStr=_trueCont->name();
111       string ret(corbaStr);
112       CORBA::string_free(corbaStr);
113       //Salome FOREVER ...
114       std::string::size_type i=ret.find_first_of(what,0);
115       i=ret.find_first_of(what, i==std::string::npos ? i:i+1);
116       if(i!=std::string::npos)
117         return ret.substr(i+1);
118       return ret;
119     }
120   else
121     return "Not placed yet !!!";
122 }
123
124 void SalomeContainer::checkCapabilityToDealWith(const ComponentInstance *inst) const throw (Exception)
125 {
126   if(inst->getKind()!=SalomeComponent::KIND)
127     throw Exception("SalomeContainer::checkCapabilityToDealWith : SalomeContainer is not able to deal with this type of ComponentInstance.");
128 }
129