Salome HOME
7eb2900be53c7eabb44b1d7d27e70f88131fd4fc
[modules/yacs.git] / src / engine / ComponentInstance.cxx
1 // Copyright (C) 2006-2023  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "ComponentInstance.hxx"
21 #include "Container.hxx"
22
23 #include <iostream>
24 #include <sstream>
25
26 //#define _DEVDEBUG_
27 #include "YacsTrace.hxx"
28
29 using namespace YACS::ENGINE;
30 using namespace std;
31
32 /*! \class YACS::ENGINE::ComponentInstance
33  *  \brief Base class for all component instances.
34  *
35  * This is an abstract class that must be specialized in runtime.
36  * Specialized classes must provide implementation for loading of
37  * a component (load method) unloading (unload method) and an 
38  * information method (isLoaded) about the state of the component
39  *
40  * A component instance is used by one or more ServiceNode to execute
41  * services of this component instance
42  *
43  * \see ServiceNode
44  */
45
46 const char ComponentInstance::KIND[]="";
47 int ComponentInstance::_total = 0;
48
49
50 const char ComponentInstance::NULL_FILE_REPR[]="No repr specified for ComponentInstance";
51
52 bool ComponentInstance::setContainer(Container *cont)
53 {
54   if (cont == _container) return false;
55   
56   if(cont)
57     cont->checkCapabilityToDealWith(this);
58   if(_container)
59     _container->decrRef();
60   _container=cont;
61   if(_container)
62     _container->incrRef();
63   return true;
64 }
65
66 ComponentInstance::ComponentInstance(const std::string& name):_compoName(name),_isAttachedOnCloning(false),_container(0),_anonymous(true)
67 {
68   _numId = _total++;
69   stringstream instName;
70   instName << _compoName << "_" << _numId;
71   _instanceName = instName.str();
72 }
73
74 ComponentInstance::ComponentInstance(const ComponentInstance& other):_compoName(other._compoName),
75                                                                      _container(0),
76                                                                      _isAttachedOnCloning(other._isAttachedOnCloning),
77                                                                      _anonymous(true)
78 {
79   _numId = _total++;
80   stringstream instName;
81   instName << _compoName << "_" << _numId;
82   _instanceName = instName.str();
83   if(other._container)
84     _container=other._container->clone();
85 }
86
87 ComponentInstance::~ComponentInstance()
88 {
89   if(_container)
90     _container->decrRef();
91 }
92
93 /*!
94  * By calling this method the current container 'this' is not destined to be deeply copied on clone call.
95  */
96 void ComponentInstance::attachOnCloning() const
97 {
98   _isAttachedOnCloning=true;
99 }
100
101 //! For dump in file
102 std::string ComponentInstance::getFileRepr() const
103 {
104   return NULL_FILE_REPR;
105 }
106
107 /*!
108  * By calling this method the current container 'this' will be deeply copied on clone call.
109  */
110 void ComponentInstance::dettachOnCloning() const
111 {
112   _isAttachedOnCloning=false;
113 }
114
115 bool ComponentInstance::isAttachedOnCloning() const
116 {
117   return _isAttachedOnCloning;
118 }
119
120 //! Return the component kind
121 /*!
122  * A runtime can provide several implementations of a component instance.
123  * Each implementation has a different kind. A ComponentInstance can be 
124  * associated to a ServiceNode is they have the same kind.
125  */
126 string ComponentInstance::getKind() const
127 {
128   return KIND;
129 }
130
131 std::string ComponentInstance::getKindForNode() const
132 {
133   return KIND;
134 }
135
136 void ComponentInstance::shutdown(int level)
137 {
138 }