1 // SUPERV GraphBase : contains fondamental classes for Services, Input Ports, Output Ports Links and Nodes.
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : DataFlowBase_Graph.cxx
25 // Author : Jean Rahuel, CEA
30 #include "DataFlowBase_StreamGraph.hxx"
32 #include "SALOME_LifeCycleCORBA.hxx"
34 GraphBase::Graph::Graph() :
36 cdebug << "GraphBase::Graph::Graph" << endl ;
40 GraphBase::Graph::Graph( CORBA::ORB_ptr ORB ,
41 SALOME_NamingService* ptrNamingService ,
42 const char *DataFlowName ,
43 const SUPERV::KindOfNode DataFlowkind ,
44 int * Graph_prof_debug ,
45 ofstream * Graph_fdebug ) :
46 // const char * DebugFileName ) :
47 DataNode( ORB ,ptrNamingService , DataFlowName , DataFlowkind , Graph_prof_debug , Graph_fdebug ) {
48 _Orb = CORBA::ORB::_duplicate( ORB ) ;
49 Set_prof_debug( Graph_prof_debug , Graph_fdebug ) ;
50 cdebug << "GraphBase::Graph::Graph( " << DataFlowName << ") GraphNodesSize() " << GraphNodesSize() << endl ;
54 GraphBase::Graph::Graph( CORBA::ORB_ptr ORB ,
55 SALOME_NamingService* ptrNamingService ,
56 const SALOME_ModuleCatalog::Service& DataFlowService ,
57 const char *DataFlowComponentName ,
58 const char *DataFlowInterfaceName ,
59 const char *DataFlowName ,
60 const SUPERV::KindOfNode DataFlowkind ,
61 const SUPERV::SDate DataFlowFirstCreation ,
62 const SUPERV::SDate DataFlowLastModification ,
63 const char * DataFlowEditorRelease ,
64 const char * DataFlowAuthor ,
65 const char * DataFlowComputer ,
66 const char * DataFlowComment ,
67 int * Graph_prof_debug ,
68 ofstream * Graph_fdebug ) :
69 // const char * DebugFileName ) :
70 DataNode( ORB , ptrNamingService , DataFlowService ,
71 DataFlowName , DataFlowkind ,
72 DataFlowFirstCreation , DataFlowLastModification ,
73 DataFlowEditorRelease , DataFlowAuthor , DataFlowComment ) {
74 _Orb = CORBA::ORB::_duplicate( ORB ) ;
76 Set_prof_debug( Graph_prof_debug , Graph_fdebug ) ;
77 cdebug_in << "GraphBase::Graph::Graph" << endl ;
78 DataService( ORB , DataFlowService , Graph_prof_debug , Graph_fdebug ) ;
79 cdebug_out << "GraphBase::Graph::Graph" << endl ;
82 GraphBase::Graph::~Graph() {
83 cdebug << "GraphBase::Graph::~Graph" << endl ;
86 void GraphBase::Graph::Set_prof_debug( int * Graph_prof_debug ,
87 ofstream * Graph_fdebug ) {
88 SetDebug( _Orb , Graph_prof_debug , Graph_fdebug ) ;
89 _Graph_prof_debug = Graph_prof_debug ;
90 _Graph_fdebug = Graph_fdebug ;
93 GraphBase::SNode * GraphBase::Graph::GetInfo() const {
94 GraphBase::SNode * Info = new GraphBase::SNode ;
95 Info->theComponentName = "" ;
96 Info->theInterfaceName = "" ;
97 Info->theName = Name() ;
98 Info->theKind = Kind() ;
99 if ( IsDataStreamNode() ) {
101 SUPERV::KindOfDataStreamTrace DataStreamTrace ;
103 ((GraphBase::StreamGraph * ) this)->StreamParams( Timeout , DataStreamTrace , DeltaTime ) ;
104 Info->theTimeout = Timeout ;
105 Info->theDataStreamTrace = DataStreamTrace ;
106 Info->theDeltaTime = DeltaTime ;
108 Info->theService = *GetService() ;
109 Info->theFirstCreation = FirstCreation() ;
110 Info->theLastModification = LastModification() ;
111 Info->theEditorRelease = EditorRelease() ;
112 Info->theAuthor = Author() ;
113 Info->theContainer = "" ;
114 Info->theComment = Comment() ;
115 Info->theCoords.theX = GraphBase::ComputingNode::XCoordinate() ;
116 Info->theCoords.theY = GraphBase::ComputingNode::YCoordinate() ;
120 //----------------------------------------------------------------------
121 // Function : GetNodes
122 // Purpose : get a nodes list
123 //----------------------------------------------------------------------
124 GraphBase::ListOfSNodes * GraphBase::Graph::GetNodes() const {
125 GraphBase::ListOfSNodes * _list_nodes = new GraphBase::ListOfSNodes;
127 cdebug_in << "GraphBase::Graph::GetNodes" << endl ;
128 // All the nodes from _InNodes are taken
129 // vector< InNode *> Nodes = InNodes() ;
131 _list_nodes->resize( GraphNodesSize() );
135 GraphBase::ComputingNode * aCNode = NULL ;
136 for ( igoto = 0 ; igoto < 2 ; igoto++ ) {
137 for ( ind = 0 ; ind < GraphNodesSize() ; ind++ ) {
138 aCNode = GraphNodes( ind ) ;
139 if ( ( igoto == 0 && !aCNode->IsGOTONode() ) ||
140 ( igoto == 1 && aCNode->IsGOTONode() ) ) {
141 if ( aCNode->IsFactoryNode() ) {
142 GraphBase::FactoryNode * aFNode = (GraphBase::FactoryNode * ) aCNode ;
143 (*_list_nodes)[ind].theComponentName = CORBA::string_dup( aFNode->ComponentName());
144 (*_list_nodes)[ind].theInterfaceName = CORBA::string_dup( aFNode->InterfaceName());
147 (*_list_nodes)[ind].theComponentName = CORBA::string_dup( "" );
148 (*_list_nodes)[ind].theInterfaceName = CORBA::string_dup( "" );
150 (*_list_nodes)[ind].theName = CORBA::string_dup( aCNode->Name() );
151 (*_list_nodes)[ind].theKind = aCNode->Kind();
152 if ( aCNode->IsInLineNode() || aCNode->IsMacroNode() ) {
153 GraphBase::InLineNode * aINode = (GraphBase::InLineNode * ) aCNode ;
154 (*_list_nodes)[ind].theListOfFuncName.resize( 1 ) ;
155 (*_list_nodes)[ind].theListOfFuncName[0] = CORBA::string_dup( aINode->PyFuncName() ) ;
156 (*_list_nodes)[ind].theListOfPythonFunctions.resize( 1 ) ;
157 (*_list_nodes)[ind].theListOfPythonFunctions[0] = aINode->PythonFunction() ;
159 if ( aCNode->IsGOTONode() ) {
160 GraphBase::GOTONode * aGNode = (GraphBase::GOTONode * ) aCNode ;
161 (*_list_nodes)[ind].theListOfFuncName.resize( 1 ) ;
162 (*_list_nodes)[ind].theListOfFuncName[0] = CORBA::string_dup( aGNode->PyFuncName() ) ;
163 (*_list_nodes)[ind].theListOfPythonFunctions.resize( 1 ) ;
164 (*_list_nodes)[ind].theListOfPythonFunctions[0] = aGNode->PythonFunction() ;
166 if ( aCNode->IsLoopNode() ) {
167 GraphBase::LoopNode * aLNode = (GraphBase::LoopNode * ) aCNode ;
168 (*_list_nodes)[ind].theCoupledNode = CORBA::string_dup( aLNode->CoupledNode()->Name() ) ;
169 (*_list_nodes)[ind].theListOfFuncName.resize( 3 ) ;
170 (*_list_nodes)[ind].theListOfFuncName[0] = CORBA::string_dup( aLNode->PyFuncName() ) ;
171 (*_list_nodes)[ind].theListOfFuncName[1] = CORBA::string_dup( aLNode->PyMoreName() ) ;
172 (*_list_nodes)[ind].theListOfFuncName[2] = CORBA::string_dup( aLNode->PyNextName() ) ;
173 (*_list_nodes)[ind].theListOfPythonFunctions.resize( 3 ) ;
174 (*_list_nodes)[ind].theListOfPythonFunctions[0] = aLNode->PythonFunction() ;
175 (*_list_nodes)[ind].theListOfPythonFunctions[1] = aLNode->MorePythonFunction() ;
176 (*_list_nodes)[ind].theListOfPythonFunctions[2] = aLNode->NextPythonFunction() ;
178 else if ( aCNode->IsSwitchNode() ) {
179 GraphBase::SwitchNode * aSNode = (GraphBase::SwitchNode * ) aCNode ;
180 (*_list_nodes)[ind].theCoupledNode = CORBA::string_dup( aSNode->CoupledNode()->Name() ) ;
181 (*_list_nodes)[ind].theListOfFuncName.resize( 1 ) ;
182 (*_list_nodes)[ind].theListOfFuncName[0] = CORBA::string_dup( aSNode->PyFuncName() ) ;
183 (*_list_nodes)[ind].theListOfPythonFunctions.resize( 1 ) ;
184 (*_list_nodes)[ind].theListOfPythonFunctions[0] = aSNode->PythonFunction() ;
186 else if ( aCNode->IsEndLoopNode() ) {
187 GraphBase::EndOfLoopNode * aELNode = (GraphBase::EndOfLoopNode * ) aCNode ;
188 (*_list_nodes)[ind].theCoupledNode = CORBA::string_dup( aELNode->CoupledNode()->Name() ) ;
189 (*_list_nodes)[ind].theListOfFuncName.resize( 1 ) ;
190 (*_list_nodes)[ind].theListOfFuncName[0] = CORBA::string_dup( aELNode->PyFuncName() ) ;
191 (*_list_nodes)[ind].theListOfPythonFunctions.resize( 1 ) ;
192 (*_list_nodes)[ind].theListOfPythonFunctions[0] = aELNode->PythonFunction() ;
194 else if ( aCNode->IsEndSwitchNode() ) {
195 GraphBase::EndOfSwitchNode * aESNode = (GraphBase::EndOfSwitchNode * ) aCNode ;
196 (*_list_nodes)[ind].theCoupledNode = CORBA::string_dup( aESNode->CoupledNode()->Name() ) ;
197 (*_list_nodes)[ind].theListOfFuncName.resize( 1 ) ;
198 (*_list_nodes)[ind].theListOfFuncName[0] = CORBA::string_dup( aESNode->PyFuncName() ) ;
199 (*_list_nodes)[ind].theListOfPythonFunctions.resize( 1 ) ;
200 (*_list_nodes)[ind].theListOfPythonFunctions[0] = aESNode->PythonFunction() ;
202 else if ( aCNode->IsMacroNode() ) {
203 GraphBase::Graph * aGraph = (GraphBase::Graph * ) aCNode ;
204 (*_list_nodes)[ind].theCoupledNode = CORBA::string_dup( aGraph->CoupledNode()->Name() ) ;
205 (*_list_nodes)[ind].theListOfFuncName.resize( 1 ) ;
206 (*_list_nodes)[ind].theListOfFuncName[0] = CORBA::string_dup( aGraph->PyFuncName() ) ;
207 (*_list_nodes)[ind].theListOfPythonFunctions.resize( 1 ) ;
208 (*_list_nodes)[ind].theListOfPythonFunctions[0] = aGraph->PythonFunction() ;
211 (*_list_nodes)[ind].theCoupledNode = CORBA::string_dup( "" ) ;
213 // (*_list_nodes)[ind].theDataStreamInArgsNumber = aCNode->DataStreamInPortsNumber() ;
214 // (*_list_nodes)[ind].theDataStreamOutArgsNumber = aCNode->DataStreamOutPortsNumber() ;
216 (*_list_nodes)[ind].theListOfInDataStreams.resize( aCNode->DataStreamInPortsNumber() ) ;
217 cdebug << "GraphBase::Graph::GetNodes " << aCNode->Name() << " " << aCNode->DataStreamInPortsNumber() << " DataStreamInPortsNumber" << endl ;
220 for ( iostream = 0 ; iostream < aCNode->GetNodeInPortsSize() ; iostream++ ) {
221 const GraphBase::InPort * anInPort ;
222 anInPort = aCNode->GetNodeInPort( iostream ) ;
223 if ( anInPort->IsDataStream() ) {
224 cdebug << "GraphBase::Graph::GetNodes In" << iostream << " " << aCNode->Name() << " " << anInPort->NodeName() << " " << anInPort->PortName()
226 (*_list_nodes)[ind].theListOfInDataStreams[streamind].theDataStreamParameter.Parametertype = StringToDataStreamType( anInPort->PortType() ) ;
227 (*_list_nodes)[ind].theListOfInDataStreams[streamind].theDataStreamParameter.Parametername = CORBA::string_dup( anInPort->PortName() ) ;
228 (*_list_nodes)[ind].theListOfInDataStreams[streamind].theDataStreamParameter.Parameterdependency = anInPort->Dependency() ;
229 SUPERV::KindOfSchema aKindOfSchema ;
230 SUPERV::KindOfInterpolation aKindOfInterpolation ;
231 SUPERV::KindOfExtrapolation aKindOfExtrapolation ;
232 ((GraphBase::InDataStreamPort * ) anInPort)->Params( aKindOfSchema , aKindOfInterpolation , aKindOfExtrapolation ) ;
233 (*_list_nodes)[ind].theListOfInDataStreams[streamind].theKindOfSchema = aKindOfSchema ;
234 (*_list_nodes)[ind].theListOfInDataStreams[streamind].theKindOfInterpolation = aKindOfInterpolation ;
235 (*_list_nodes)[ind].theListOfInDataStreams[streamind].theKindOfExtrapolation = aKindOfExtrapolation ;
236 cdebug << "GraphBase::Graph::GetNodes " << aCNode->Name() << " " << anInPort->NodeName() << " " << anInPort->PortName() << " "
237 << anInPort->Dependency() << " " << aKindOfSchema << " " << aKindOfInterpolation << " " << aKindOfExtrapolation << " list_nodes "
238 << (*_list_nodes)[ind].theListOfInDataStreams[streamind].theDataStreamParameter.Parametername << " "
239 << (*_list_nodes)[ind].theListOfInDataStreams[streamind].theDataStreamParameter.Parametertype << " "
240 << (*_list_nodes)[ind].theListOfInDataStreams[streamind].theDataStreamParameter.Parameterdependency << " "
241 << (*_list_nodes)[ind].theListOfInDataStreams[streamind].theKindOfSchema << " "
242 << (*_list_nodes)[ind].theListOfInDataStreams[streamind].theKindOfInterpolation << " "
243 << (*_list_nodes)[ind].theListOfInDataStreams[streamind].theKindOfExtrapolation << " " << endl ;
247 cdebug << "GraphBase::Graph::GetNodes " << aCNode->Name() << " " << anInPort->NodeName() << " " << anInPort->PortName() << " "
248 << anInPort->Kind() << " IsDataStream " << anInPort->IsDataStream() << endl ;
252 (*_list_nodes)[ind].theListOfOutDataStreams.resize( aCNode->DataStreamOutPortsNumber() ) ;
253 cdebug << "GraphBase::Graph::GetNodes " << aCNode->Name() << " " << aCNode->DataStreamOutPortsNumber() << " DataStreamOutPortsNumber" << endl ;
255 for ( iostream = 0 ; iostream < aCNode->GetNodeOutPortsSize() ; iostream++ ) {
256 const GraphBase::OutPort * anOutPort ;
257 anOutPort = aCNode->GetNodeOutPort( iostream ) ;
258 if ( anOutPort->IsDataStream() ) {
259 cdebug << "GraphBase::Graph::GetNodes Out" << iostream << " " << aCNode->Name() << " " << anOutPort->NodeName() << " " << anOutPort->PortName() << " "
261 (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theDataStreamParameter.Parametertype = StringToDataStreamType( anOutPort->PortType() ) ;
262 (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theDataStreamParameter.Parametername = CORBA::string_dup( anOutPort->PortName() ) ;
263 (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theDataStreamParameter.Parameterdependency = anOutPort->Dependency() ;
264 long aNumberOfValues = ((GraphBase::OutDataStreamPort * ) anOutPort)->NumberOfValues() ;
265 (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theNumberOfValues = aNumberOfValues ;
266 cdebug << "GraphBase::Graph::GetNodes " << aCNode->Name() << " " << anOutPort->NodeName() << " " << anOutPort->PortName() << " "
267 << anOutPort->Dependency() << " " << aNumberOfValues << " list_nodes "
268 << (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theDataStreamParameter.Parametername << " "
269 << (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theDataStreamParameter.Parametertype << " "
270 << (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theDataStreamParameter.Parameterdependency << " "
271 << (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theNumberOfValues << endl ;
275 cdebug << "GraphBase::Graph::GetNodes " << aCNode->Name() << " " << anOutPort->NodeName() << " " << anOutPort->PortName() << " "
276 << anOutPort->Kind() << " IsDataStream " << anOutPort->IsDataStream() << endl ;
280 (*_list_nodes)[ind].theService = *aCNode->GetService();
281 cdebug << "GraphBase::Graph::GetNodes theService " << &(*_list_nodes)[ind].theService.ServiceName << endl ;
283 for ( i = 0 ; i < (*_list_nodes)[ind].theService.ServiceinParameter.length() ; i++ ) {
284 cdebug << " In" << i << " " << &(*_list_nodes)[ind].theService.ServiceinParameter[i].Parametername
285 << " " << (*_list_nodes)[ind].theService.ServiceinParameter[i].Parametername
286 << " " << &(*_list_nodes)[ind].theService.ServiceinParameter[i].Parametertype
287 << " " << (*_list_nodes)[ind].theService.ServiceinParameter[i].Parametertype << endl ;
289 for ( i = 0 ; i < (*_list_nodes)[ind].theService.ServiceoutParameter.length() ; i++ ) {
290 cdebug << " Out" << i << " " << &(*_list_nodes)[ind].theService.ServiceoutParameter[i].Parametername
291 << " " << (*_list_nodes)[ind].theService.ServiceoutParameter[i].Parametername
292 << " " << &(*_list_nodes)[ind].theService.ServiceoutParameter[i].Parametertype
293 << " " << (*_list_nodes)[ind].theService.ServiceoutParameter[i].Parametertype << endl ;
295 for ( i = 0 ; i < (*_list_nodes)[ind].theService.ServiceinDataStreamParameter.length() ; i++ ) {
296 cdebug << " InDataStream" << i << " " << &(*_list_nodes)[ind].theService.ServiceinDataStreamParameter[i].Parametername
297 << " " << (*_list_nodes)[ind].theService.ServiceinDataStreamParameter[i].Parametername
298 << " " << &(*_list_nodes)[ind].theService.ServiceinDataStreamParameter[i].Parametertype
299 << " " << (*_list_nodes)[ind].theService.ServiceinDataStreamParameter[i].Parametertype << endl ;
301 for ( i = 0 ; i < (*_list_nodes)[ind].theService.ServiceoutDataStreamParameter.length() ; i++ ) {
302 cdebug << " OutDataStream" << i << " " << &(*_list_nodes)[ind].theService.ServiceoutDataStreamParameter[i].Parametername
303 << " " << (*_list_nodes)[ind].theService.ServiceoutDataStreamParameter[i].Parametername
304 << " " << &(*_list_nodes)[ind].theService.ServiceoutDataStreamParameter[i].Parametertype
305 << " " << (*_list_nodes)[ind].theService.ServiceoutDataStreamParameter[i].Parametertype << endl ;
307 if ( aCNode->IsOneOfInLineNodes() ) {
308 GraphBase::InLineNode * aINode = (GraphBase::InLineNode * ) aCNode ;
309 GraphBase::LoopNode * aLNode = NULL ;
310 if ( aCNode->IsLoopNode() ) {
311 aLNode = (GraphBase::LoopNode * ) aCNode ;
312 (*_list_nodes)[ind].theListOfPythonFunctions.resize( 3 ) ;
313 (*_list_nodes)[ind].theListOfPythonFunctions[ 0 ] = aINode->PythonFunction() ;
314 (*_list_nodes)[ind].theListOfPythonFunctions[ 1 ] = aLNode->MorePythonFunction() ;
315 (*_list_nodes)[ind].theListOfPythonFunctions[ 2 ] = aLNode->NextPythonFunction() ;
317 else if ( aCNode->IsInLineNode() || aCNode->IsGOTONode() ||
318 aCNode->IsSwitchNode() || aCNode->IsEndSwitchNode() ) {
319 (*_list_nodes)[ind].theListOfPythonFunctions.resize( 1 ) ;
320 (*_list_nodes)[ind].theListOfPythonFunctions[ 0 ] = aINode->PythonFunction() ;
323 (*_list_nodes)[ind].theFirstCreation = aCNode->FirstCreation();
324 (*_list_nodes)[ind].theLastModification = aCNode->LastModification();
325 (*_list_nodes)[ind].theEditorRelease = CORBA::string_dup( aCNode->EditorRelease());
326 (*_list_nodes)[ind].theAuthor = CORBA::string_dup( aCNode->Author());
327 if ( aCNode->IsFactoryNode() ) {
328 GraphBase::FactoryNode * aFNode = (GraphBase::FactoryNode * ) aCNode ;
329 (*_list_nodes)[ind].theContainer = CORBA::string_dup( aFNode->Computer());
332 (*_list_nodes)[ind].theContainer = CORBA::string_dup( "" );
334 (*_list_nodes)[ind].theComment = CORBA::string_dup( aCNode->Comment());
335 (*_list_nodes)[ind].theCoords.theX = aCNode->XCoordinate();
336 (*_list_nodes)[ind].theCoords.theY = aCNode->YCoordinate();
340 for ( i = 0 ; i < aCNode->GetNodeInPortsSize() ; i++ ) {
341 const GraphBase::InPort * anInPort = aCNode->GetNodeInPort( i ) ;
342 if ( anInPort->IsBus() ) {
344 (*_list_nodes)[ind].theListOfParameters.resize( nports ) ;
345 (*_list_nodes)[ind].theListOfParameters[ nports-1 ].theInParameter.Parametertype = CORBA::string_dup( anInPort->PortType() ) ;
346 (*_list_nodes)[ind].theListOfParameters[ nports-1 ].theInParameter.Parametername = CORBA::string_dup( anInPort->PortName() ) ;
347 (*_list_nodes)[ind].theListOfParameters[ nports-1 ].theOutParameter.Parametertype = CORBA::string_dup( aCNode->GetNodeOutPort( anInPort->PortIndex() )->PortType() ) ;
348 (*_list_nodes)[ind].theListOfParameters[ nports-1 ].theOutParameter.Parametername = CORBA::string_dup( aCNode->GetNodeOutPort( anInPort->PortIndex() )->PortName() ) ;
355 cdebug_out << "GraphBase::Graph::GetNodes" << endl ;
360 //----------------------------------------------------------------------
361 // Function : GetLinks
362 // Purpose : get a links list
363 //----------------------------------------------------------------------
364 GraphBase::ListOfSLinks * GraphBase::Graph::GetLinks(bool AllLinks ) const {
365 GraphBase::ListOfSLinks * _list_links = new GraphBase::ListOfSLinks;
367 // All the links from _LinksList are taken
368 // vector< InNode *> Nodes = InNodes() ;
372 for ( k = 0 ; k < GraphNodesSize() ; k++ ) {
373 GraphBase::ComputingNode * fromNode = GraphNodes( k ) ;
375 for ( i = 0 ; i < fromNode->GetNodeOutPortsSize() ; i++ ) {
376 const GraphBase::OutPort* fromPort = fromNode->GetNodeOutPort( i ) ;
378 for ( j = 0 ; j < fromPort->InPortsSize() ; j++ ) {
379 const GraphBase::InPort* toPort = fromPort->InPorts( j ) ;
380 if ( toPort->IsPortConnected() ) {
381 // Desole pour ce cast mais avec les maps difficile de faire const ...
382 const GraphBase::ComputingNode * toNode = ((GraphBase::Graph * ) this)->GetGraphNode( toPort->NodeName() ) ;
383 if ( !(fromPort->IsLoop() && toPort->IsLoop() ) || AllLinks ) {
384 cdebug << "GraphBase::Graph::GetLinks " << fromNode->Name() << " ("
385 << fromPort->PortName() << " ) IsPortConnected" << fromPort->IsPortConnected()
386 << " --> " << toNode->Name() << "( " << toPort->PortName() << " ) "
387 << " " << fromPort->InPortsSize() << " ports" << endl ;
388 _list_links->resize( ind+1 );
389 (*_list_links)[ind].FromNodeName = CORBA::string_dup( fromNode->Name() );
390 (*_list_links)[ind].FromServiceParameterName = fromPort->GetServicesParameter().Parametername;
391 (*_list_links)[ind].ToNodeName = CORBA::string_dup( toPort->NodeName() );
392 (*_list_links)[ind].ToServiceParameterName = toPort->GetServicesParameter().Parametername;
393 (*_list_links)[ind].aLinkValue = *fromPort->Value() ;
394 if ( toPort->IsEndSwitch() ) {
395 (*_list_links)[ind++].aListOfCoords = *(fromPort->Coords()) ;
398 (*_list_links)[ind++].aListOfCoords = *(toPort->Coords()) ;
403 cdebug << "GraphBase::Graph::GetLinks " << fromNode->Name() << " "
404 << fromPort->PortName() << " ) " << fromPort->PortStatus()
405 << " --> " << toPort->NodeName() << "( " << toPort->PortName() << " ) "
406 << " " << toPort->PortStatus() << " " << fromPort->InPortsSize() << " ports ignored" << endl ;
415 GraphBase::ListOfSGraphs * GraphBase::Graph::GetGraphs() const {
416 GraphBase::ListOfSGraphs * _list_graphs = new GraphBase::ListOfSGraphs;
421 GraphBase::SLink * GraphBase::Graph::GetLink( GraphBase::ComputingNode * aNode ,
422 GraphBase::InPort* toPort ) {
423 GraphBase::SLink * _link = new GraphBase::SLink ;
424 GraphBase::OutPort* fromPort = toPort->GetOutPort() ;
425 _link->FromNodeName = CORBA::string_dup( fromPort->NodeName() );
426 _link->FromServiceParameterName = fromPort->GetServicesParameter().Parametername;
427 _link->ToNodeName = CORBA::string_dup( toPort->NodeName() );
428 _link->ToServiceParameterName = toPort->GetServicesParameter().Parametername;
429 CORBA::Any aSPValue = *fromPort->Value() ;
430 _link->aLinkValue = aSPValue;
431 _link->aListOfCoords = *(toPort->Coords()) ;
434 //----------------------------------------------------------------------
435 // Function : GetDatas
436 // Purpose : get the datas list
437 //----------------------------------------------------------------------
438 GraphBase::ListOfSLinks * GraphBase::Graph::GetDatas() const {
439 GraphBase::ListOfSLinks * _list_datalinks = new GraphBase::ListOfSLinks;
442 const GraphBase::DataNode * aDataNode = this ;
444 for ( i = 0 ; i < aDataNode->GetNodeInDataNodePortsSize() ; i++ ) {
445 const GraphBase::OutPort* fromDataPort = aDataNode->GetNodeInDataNodePort( i ) ;
446 if ( GraphMacroLevel() == 0 ) {
447 if ( fromDataPort->IsDataConnected() ) {
449 //We may have SharedData as input of a DataFlow : same input for one or several
450 // input ports. Input(s) of a DataFlow match one or several output-virtual-dataport
451 for ( j = 0 ; j < fromDataPort->InPortsSize() ; j++ ) {
452 _list_datalinks->resize( ind+1 );
453 (*_list_datalinks)[ind].FromNodeName = CORBA::string_dup( aDataNode->Name() );
454 (*_list_datalinks)[ind].FromServiceParameterName = fromDataPort->GetServicesParameter().Parametername;
455 const GraphBase::InPort* toPort = fromDataPort->InPorts( j ) ;
456 (*_list_datalinks)[ind].ToNodeName = CORBA::string_dup( toPort->NodeName() );
457 (*_list_datalinks)[ind].ToServiceParameterName = toPort->GetServicesParameter().Parametername;
458 CORBA::Any aSPValue = *fromDataPort->Value() ;
459 (*_list_datalinks)[ind].aLinkValue = aSPValue;
460 (*_list_datalinks)[ind++].aListOfCoords = *(toPort->Coords()) ;
467 // Output(s) of a DataFlow match only one input-virtual-dataport
468 for ( i = 0 ; i < aDataNode->GetNodeOutDataNodePortsSize() ; i++ ) {
469 GraphBase::InPort* toDataPort = aDataNode->GetChangeNodeOutDataNodePort( i ) ;
470 const GraphBase::OutPort* fromPort = toDataPort->GetLink() ;
471 if ( fromPort->IsDataConnected() ) {
472 _list_datalinks->length( ind+1 );
473 _list_datalinks[ind].FromNodeName = CORBA::string_dup( fromPort->NodeName() );
474 _list_datalinks[ind].FromServiceParameterName = fromPort->GetServicesParameter().Parametername;
475 _list_datalinks[ind].ToNodeName = CORBA::string_dup( aDataNode->Name() );
476 _list_datalinks[ind].ToServiceParameterName = toDataPort->GetServicesParameter().Parametername;
477 // SALOME_SuperVisionBase::ServicesParameterValue aSPValue;
478 CORBA::Any aSPValue = *fromPort->Value() ;
479 // aSPValue.Value = CORBA::string_dup( fromPort->Value() );
480 // aSPValue.Kind = fromPort->Kind();
481 _list_datalinks[ind].aLinkValue = aSPValue;
482 _list_datalinks[ind++].aListOfCoords = toDataPort->Coords() ;
487 return _list_datalinks ;
490 bool GraphBase::Graph::AddNode( GraphBase::ComputingNode * aNode ) {
491 cdebug_in << "GraphBase::Graph::AddNode " << (void *) aNode << " " << aNode->Name() << " " << aNode->ServiceName() << endl;
492 bool RetVal = false ;
493 int index = GetGraphNodeIndex( aNode->Name() ) ;
495 cdebug << "GraphBase::Graph::AddNode " << _GraphNodesSize << " nodes + 1" << endl ;
496 _GraphNodes.resize( _GraphNodesSize+1 ) ;
497 _GraphNodes[ _GraphNodesSize ] = aNode ;
498 SetGraphNodeIndex( aNode->Name() , _GraphNodesSize ) ;
499 _GraphNodesSize += 1 ;
500 if ( SetServiceOfMap( (GraphBase::Service * ) aNode ) ) {
501 cdebug << "Graph::AddNode SetServiceOfMap " << aNode->ServiceName() << " in MapOfServices" << endl ;
504 cdebug << "Graph::AddNode SetServiceOfMap " << aNode->ServiceName()
505 << " was already in MapOfServices" << endl ;
510 cdebug << "GraphBase::Graph::AddNode " << _GraphNodesSize << " Known nodes :" << endl ;
511 for ( i = 0 ; i < _GraphNodesSize ; i++ ) {
512 const GraphBase::ComputingNode * aKnownNode = GetGraphNode( i ) ;
514 cdebug << i << ". " << aKnownNode->Name() << " " << _MapOfGraphNodes[ GetGraphNode( i )->Name() ] - 1 << endl ;
517 cdebug << i << ". ERROR" << endl ;
520 aNode->GraphOfNode( this ) ;
522 cdebug_out << "GraphBase::Graph::AddNode " << _GraphNodesSize << " Nodes. "
523 << aNode->ServiceName() << endl;
527 bool GraphBase::Graph::ReNameNode( const char* OldNodeName ,
528 const char* NewNodeName ) {
529 cdebug_in << "GraphBase::Graph::ReNameNode (" << OldNodeName << " , " << NewNodeName << ") "
532 bool RetVal = false ;
534 GraphBase::ComputingNode * anOldNode = GetChangeGraphNode( OldNodeName ) ;
535 for ( i = 0 ; i < anOldNode->LinkedNodesSize() ; i++ ) {
536 cdebug << "LinkedNode " << i << " " << anOldNode->LinkedNodes( i )->Name() << endl ;
539 if ( !strcmp( OldNodeName , NewNodeName ) ) {
542 else if ( strcmp( Name() , OldNodeName ) ) {
543 int index = GetGraphNodeIndex( OldNodeName ) ;
544 int newindex = GetGraphNodeIndex( NewNodeName ) ;
545 if ( index >= 0 && index < _GraphNodesSize &&
546 ( newindex < 0 || newindex > _GraphNodesSize ) ) {
547 _GraphNodes[ index ]->Name( NewNodeName ) ;
548 _MapOfGraphNodes.erase( OldNodeName ) ;
549 SetGraphNodeIndex( NewNodeName , index ) ;
551 GraphBase::ComputingNode * aNode = GetChangeGraphNode( index ) ;
552 // Update 'ToNode's Map from 'aNode'
553 cdebug << "Graph::ReNameNode " << aNode->Name() << " LinkedNodesSize "
554 << aNode->LinkedNodesSize() << endl ;
555 for ( i = 0 ; i < aNode->LinkedNodesSize() ; i++ ) {
556 GraphBase::StreamNode * ToNode = aNode->LinkedNodes( i ) ;
557 ToNode->ReNameLinkedFromNode( OldNodeName , NewNodeName ) ;
559 // Update 'FomNode's Map to 'aNode'
560 // Inports 'anInPort' of 'aNode'
561 for ( i = aNode->GetNodeInPortsSize()-1 ; i >= 0 ; i-- ) {
562 GraphBase::InPort * anInPort = aNode->GetChangeNodeInPort( i ) ;
563 // OutPort 'anOutPort' linked to 'anInPort'
564 GraphBase::OutPort * anOutPort = anInPort->GetOutPort() ;
565 cdebug << i << ". " << aNode->Name() << " " << "GraphBase::Graph::ReNameNode of LinkedNode : from " ;
567 cdebug << anOutPort->NodeName() ;
570 cdebug << "without link" ;
572 cdebug << " to " << i << ". " << anInPort->PortName() << " of " << NewNodeName ;
573 if ( !anInPort->IsNotConnected() ) {
574 if ( anOutPort->IsDataConnected() ) {
575 cdebug << " fromDataConnected " << anOutPort->NodeName() << endl ;
578 // Node 'FromNode' of 'anOutPort'
579 GraphBase::ComputingNode * FromNode ;
580 if ( strcmp( anOutPort->NodeName() , Name() ) ) {
581 FromNode = GetChangeGraphNode( anOutPort->NodeName() ) ;
586 // Rename in _MapOfLinkedFromNodes of 'FromNode'
587 cdebug << " fromConnected " << anOutPort->NodeName() << endl ;
588 if ( anInPort->IsDataStream() ) {
589 FromNode->ReNameStreamLinkedNode( OldNodeName , NewNodeName ) ;
592 FromNode->ReNameLinkedNode( OldNodeName , NewNodeName ) ;
595 char* OldNodePortName = new char[ strlen( OldNodeName ) +
596 strlen( aNode->GetChangeNodeInPort( i )->PortName() ) + 3 ] ;
597 char* NewNodePortName = new char[ strlen( NewNodeName ) +
598 strlen( aNode->GetChangeNodeInPort( i )->PortName() ) + 3 ] ;
599 strcpy( OldNodePortName , OldNodeName ) ;
600 // strcat( OldNodePortName , "\\" ) ;
601 strcat( OldNodePortName , "__" ) ;
602 strcat( OldNodePortName , aNode->GetChangeNodeInPort( i )->PortName() ) ;
603 strcpy( NewNodePortName , NewNodeName ) ;
604 // strcat( NewNodePortName , "\\" ) ;
605 strcat( NewNodePortName , "__" ) ;
606 strcat( NewNodePortName , aNode->GetChangeNodeInPort( i )->PortName() ) ;
607 RetVal = anOutPort->ReNameInPort( OldNodePortName , NewNodePortName ) ;
608 delete [] OldNodePortName ;
609 delete [] NewNodePortName ;
614 cdebug << " not connected" << endl ;
621 cdebug << "ERROR Node not found" << endl ;
625 RetVal = Name( NewNodeName ) ;
628 cdebug_out << "GraphBase::Graph::ReNameNode RetVal " << RetVal << endl;
632 bool GraphBase::Graph::RemoveNode( const char* aNodeName ) {
633 cdebug_in << "Graph::RemoveNode (" << aNodeName << ") " << endl;
635 bool RetVal = false ;
636 int index = GetGraphNodeIndex( aNodeName ) ;
637 GraphBase::ComputingNode * aNode = GetChangeGraphNode( index ) ;
639 cdebug << "Graph::RemoveNode " << aNode->Name() << " : " << aNode->GetNodeInPortsSize()
640 << " InPorts " << aNode->GetNodeOutPortsSize() << " OutPorts "
641 << aNode->LinkedNodesSize() << " LinkedNodes " << aNode->LinkedFromNodesSize()
642 << " LinkedFromNodes IsEndSwitchNode " << aNode->IsEndSwitchNode() << endl ;
643 for ( i = 0 ; i < aNode->LinkedNodesSize() ; i++ ) {
644 cdebug << " LinkedNode" << i << ". " << aNode->LinkedNodes( i ) << " "
645 << aNode->LinkedNodes( i )->Name() << endl ;
647 if ( !aNode->IsEndLoopNode() ) { // The LoopNode is already deleted
648 for ( i = 0 ; i < aNode->LinkedFromNodesSize() ; i++ ) {
649 cdebug << " LinkedFromNode" << i << ". " << aNode->LinkedFromNodes( i ) << " "
650 << aNode->LinkedFromNodes( i )->Name() << endl ;
653 if ( !aNode->IsEndSwitchNode() ) {
654 if ( aNode->GetNodeInPortsSize() ) {
655 for ( i = aNode->GetNodeInPortsSize()-1 ; i >= 0 ; i-- ) {
656 GraphBase::InPort * anInPort = aNode->GetChangeNodeInPort( i ) ;
657 cdebug << "InPort" << i << ". " << aNodeName << "( " << anInPort->PortName() << ") "
658 << anInPort->PortStatus() << " <-- " ;
659 GraphBase::OutPort * anOutPort = anInPort->GetOutPort() ;
660 if ( anOutPort && !( aNode->IsEndLoopNode() && anInPort->IsLoop() ) ) {
661 cdebug << anOutPort->NodeName() << "( " << anOutPort->PortName() << ") " << anOutPort->PortStatus() ;
664 if ( !anInPort->IsNotConnected() ) {
666 if ( anOutPort->IsDataConnected() || anOutPort->IsExternConnected() ) {
667 cdebug << " Data/Extern" << endl ;
670 GraphBase::ComputingNode * FromNode = GetChangeGraphNode( anOutPort->NodeName() ) ;
671 cdebug << "FromNode " << FromNode->Name() << " LinkedNodesSize "
672 << FromNode->LinkedNodesSize() << " and " << aNode->Name()
673 << " LinkedFromNodesSize " << aNode->LinkedFromNodesSize() << endl ;
674 // asv : 04.11.04 : IsGOTO -> IsOneOfGOTO, I believe that it fixes the bug 7120.
675 // JR 05.01.05 : IsOneOfGOTO is not ok : I shall check the bug 7120 with IsGOTONode
676 // if ( !FromNode->IsOneOfGOTONodes() ) {
677 // if ( !FromNode->IsGOTONode() ) {
678 if ( !FromNode->IsGOTONode() &&
679 !( FromNode->IsEndLoopNode() && anInPort->IsLoop() ) ) {
680 if ( anInPort->IsDataStream() ) {
681 RetVal = FromNode->RemoveStreamLinkedNode( aNode ) ;
684 RetVal = FromNode->RemoveLinkedNode( aNode ) ;
687 cdebug << "anOutPort->RemoveLinkedNode Error RetVal " << RetVal << endl ;
692 RetVal = anOutPort->RemoveInPort( anInPort ) ;
694 cdebug << "anOutPort->RemoveInPort( anInPort ) Error RetVal " << RetVal << endl ;
708 // Special case of EndSwitchNodes : each Input port must be multi-connected.
709 // There is one link for each branch of the switch
710 // But in GraphBase::InPort there is only one field GraphBase::OutPort *
711 // At execution time there is no problem because only one branch of the switch
712 // may be executed and the Executor set the right OutPort in the field
713 // GraphBase::OutPort * of each InPort of the EndSwitchNode
714 // But here we must remove that node EndSwitch from the LinkedNodes field of
715 // terminal nodes of all branches.
716 // And also in the OutPorts of that terminal nodes of branches we must remove
717 // references to InPorts of the EndSwitchNode.
719 // Explore LinkedFromnodes of the EndSwitchNode :
720 for ( i = aNode->LinkedFromNodesSize() - 1 ; i >= 0 ; i-- ) {
721 GraphBase::ComputingNode * aLinkedFromNode = (GraphBase::ComputingNode * ) aNode->LinkedFromNodes( i ) ;
722 cdebug << aLinkedFromNode->Name() << " linked to " << aNode->Name() << endl ;
724 for ( j = aLinkedFromNode->GetNodeOutPortsSize() - 1 ; j >= 0 ; j-- ) {
725 GraphBase::OutPort * anOutPort = aLinkedFromNode->GetChangeNodeOutPort( j ) ;
726 cdebug << "OutPort" << j << ". Remove " << anOutPort->InPortsSize()
727 << " InPortsof OutPort : " << anOutPort->NodeName() << "( "
728 << anOutPort->PortName() << ") "
729 << anOutPort->PortStatus() << " :" << endl ;
731 for ( k = anOutPort->InPortsSize() - 1 ; k >= 0 ; k-- ) {
732 GraphBase::InPort * anInPort = anOutPort->ChangeInPorts( k ) ;
733 if ( strcmp( anInPort->NodeName() , aNode->Name() ) == NULL ) {
734 // InPort of the EndSwitchNode
735 cdebug << " to InPort" << j << ". " << anInPort->NodeName() << "( "
736 << anInPort->PortName() << ") "
737 << anInPort->PortStatus() << endl ;
738 anInPort->RemoveOutPort() ;
739 if ( anOutPort->IsDataStream() ) {
740 aLinkedFromNode->RemoveStreamLinkedNode( aNode ) ;
743 // false ==> No error for aNode->LinkedFromNode()
744 RetVal = aLinkedFromNode->RemoveLinkedNode( aNode , false ) ;
746 cdebug << "aLinkedFromNode->RemoveLinkedNode Error RetVal " << RetVal << endl ;
750 // Remove the InPort of the EndSwitchNode from that OutPort
751 RetVal = anOutPort->RemoveInPort( anInPort ) ;
753 cdebug << "anOutPort->RemoveInPort( anInPort ) Error RetVal " << RetVal << endl ;
763 for ( i = aNode->GetNodeOutPortsSize() - 1 ; i >= 0 ; i-- ) {
764 GraphBase::OutPort * anOutPort = aNode->GetChangeNodeOutPort( i ) ;
765 cdebug << "OutPort" << i << ". Remove " << anOutPort->InPortsSize()
766 << " InPortsof OutPort : " << anOutPort->NodeName() << "( " << anOutPort->PortName() << ") "
767 << anOutPort->PortStatus() << " :" << endl ;
769 for ( j = anOutPort->InPortsSize() - 1 ; j >= 0 ; j-- ) {
770 GraphBase::InPort * anInPort = anOutPort->ChangeInPorts( j ) ;
771 cdebug << " to InPort" << j << ". " << anInPort->NodeName() << "( " << anInPort->PortName() << ") "
772 << anInPort->PortStatus() << endl ;
773 if ( !anInPort->IsExternConnected() ) {
774 GraphBase::ComputingNode * ToNode = GetChangeGraphNode( anInPort->NodeName() ) ;
775 RetVal = anInPort->RemoveOutPort() ;
777 cdebug << "anOutPort->RemoveOutPort Error RetVal " << RetVal << endl ;
780 if ( ( aNode->IsGOTONode() && ToNode->IsOneOfInLineNodes() ) ||
781 ( aNode->IsEndLoopNode() && ToNode->IsLoopNode( ) ) ) {
783 else if ( anOutPort->IsDataStream() ) {
784 RetVal = aNode->RemoveStreamLinkedNode( ToNode ) ;
787 RetVal = aNode->RemoveLinkedNode( ToNode ) ;
790 cdebug << "anOutPort->RemoveLinkedNode Error RetVal " << RetVal << endl ;
793 RetVal = anOutPort->RemoveInPort( anInPort ) ;
795 cdebug << "anOutPort->RemoveInPort( anInPort ) Error RetVal " << RetVal << endl ;
801 cdebug << "Error RetVal " << RetVal << endl ;
806 cdebug << "Graph::RemoveNode " << aNode->Name() << " : " << aNode->GetNodeInPortsSize()
807 << " InPorts " << aNode->GetNodeOutPortsSize() << " OutPorts "
808 << aNode->LinkedNodesSize() << " LinkedNodes " << aNode->LinkedFromNodesSize()
809 << " LinkedFromNodes " << endl ;
810 for ( i = 0 ; i < aNode->LinkedNodesSize() ; i++ ) {
811 cdebug << " LinkedNode" << i << ". " << aNode->LinkedNodes( i ) << " "
812 << aNode->LinkedNodes( i )->Name() << endl ;
814 for ( i = 0 ; i < aNode->LinkedFromNodesSize() ; i++ ) {
815 cdebug << " LinkedFromNode" << i << ". " << aNode->LinkedFromNodes( i ) << " "
816 << aNode->LinkedFromNodes( i )->Name() << endl ;
818 // Delete of aNode from the Graph :
819 // The LoopNode is needed by the delete of the EndLoopNode. So the LoopNode will be deleted
820 // when the EndLoopNode is deleted. It is the same for SwitchNode & EndSwitchNode
821 if ( RetVal && !aNode->IsLoopNode() && !aNode->IsSwitchNode() ) {
822 GraphBase::InLineNode * theCoupledNode = NULL ;
823 char * theCoupledNodeName = NULL ;
824 int CoupledIndex = -1 ;
825 if ( aNode->IsEndLoopNode() || aNode->IsEndSwitchNode() ) {
826 theCoupledNode = ((GraphBase::GOTONode * ) aNode)->CoupledNode() ;
827 theCoupledNodeName = ((GraphBase::GOTONode * ) aNode)->CoupledNodeName() ;
828 CoupledIndex = GetGraphNodeIndex( theCoupledNode->Name() ) ;
831 _GraphNodesSize -= 1 ;
832 for ( i = index ; i < _GraphNodesSize ; i++ ) {
833 _GraphNodes[ i ] = _GraphNodes[ i+1 ] ;
834 SetGraphNodeIndex( _GraphNodes[ i ]->Name() , i ) ;
836 _GraphNodes.resize( _GraphNodesSize+1 ) ;
837 _MapOfGraphNodes.erase( aNodeName ) ;
838 // Delete of the LoopNode of that EndLoopNode or of the SwitchNode of that EndSwitchNode :
839 if ( theCoupledNode ) {
840 delete theCoupledNode ;
841 _GraphNodesSize -= 1 ;
842 for ( i = CoupledIndex ; i < _GraphNodesSize ; i++ ) {
843 _GraphNodes[ i ] = _GraphNodes[ i+1 ] ;
844 SetGraphNodeIndex( _GraphNodes[ i ]->Name() , i ) ;
846 _GraphNodes.resize( _GraphNodesSize+1 ) ;
847 _MapOfGraphNodes.erase( theCoupledNodeName ) ;
853 cdebug << "Node not found ERROR " << index << endl ;
856 cdebug_out << "GraphBase::Graph::RemoveNode " << RetVal << endl;
860 bool GraphBase::Graph::AddLink( const char* FromNodeName ,
861 const char* FromServiceParameterName ,
862 const char* ToNodeName ,
863 const char* ToServiceParameterName ) {
864 // , const CORBA::Any aValue ) {
867 cdebug_in << "GraphBase::Graph::AddLink(" << FromNodeName << "("
868 << FromServiceParameterName << ") ---> " << ToNodeName << "("
869 << ToServiceParameterName << ") , aValue )" << endl;
871 GraphBase::ComputingNode *fromNode = GetChangeGraphNode( FromNodeName ) ;
872 GraphBase::ComputingNode *toNode = GetChangeGraphNode( ToNodeName ) ;
874 GraphBase::OutPort *fromPort = NULL ;
875 GraphBase::InPort *toPort = NULL ;
878 // asv : 29.12.04 : as I understand, replacement of "InitLoop" by "DoLoop" was
879 // done by JR in order to keep old graphs and batch test scripts working after change
880 // of special Loop's port name from "InitLoop" to "DoLoop". I suppose, it is not
881 // needed, all old graphs and tests must be changed to use "DoLoop" name for addressing
882 // this port.. It we don't do it, ANY port with "InitLoop" name will be replaced by "DoLoop"
883 // and it can cause unexpected bugs in future... So I comment out the replacement code.
884 //if ( strcmp( FromServiceParameterName , "InitLoop" ) ) {
885 //JR 12.01.05 : Yes the test is not good ; now I test that PortName only in LoopNodes ==>
886 // + old graphs will runs normally (it is not possible to ask CEA to edit their graphs)
887 // + in old graphs "InitLoop" and "DoLoop" were reserved parameter names (but not controlled)
888 // + in new graphs, I have added a control at port creation of that names : they are refused
889 if ( !(fromNode->IsLoopNode() && strcmp( FromServiceParameterName , "InitLoop" ) == 0 ) ) {
890 fromPort = fromNode->GetChangeOutPort( FromServiceParameterName ) ;
893 fromPort = fromNode->GetChangeOutPort( "DoLoop" ) ;
896 cdebug << "ERROR AddLink fromPort " << FromServiceParameterName << " FromNode("
897 << FromNodeName << ") not found." << endl ;
901 cdebug << "ERROR AddLink FromNode " << FromNodeName << " not found." << endl ;
905 // if ( strcmp( ToServiceParameterName , "InitLoop" ) ) {
906 if ( !(toNode->IsLoopNode() && strcmp( ToServiceParameterName , "InitLoop" ) == 0 ) ) {
907 toPort = toNode->GetChangeInPort( ToServiceParameterName ) ;
910 toPort = toNode->GetChangeInPort( "DoLoop" ) ;
913 cdebug << "ERROR AddLink toPort " << ToServiceParameterName << " ToNode("
914 << ToNodeName << ") not found." << endl ;
918 cdebug << "ERROR AddLink toNode " << ToNodeName << " not found." << endl ;
921 RetVal = AddLink( fromNode , fromPort , toNode , toPort ) ;
924 if ( fromPort->IsGate() && toPort->IsGate() ) {
926 aValue <<= (long ) 1 ;
927 fromPort->Value( aValue ) ;
930 // const CORBA::Any * aDataValue = new CORBA::Any( aValue ) ;
931 // fromPort->Value( aDataValue ) ;
933 // fromPort->PortStatus( DataConnected );
936 cdebug_out << "GraphBase::Graph::AddLink " << RetVal << endl;
940 bool GraphBase::Graph::AddLink( GraphBase::ComputingNode *fromNode ,
941 GraphBase::OutPort *fromPort ,
942 GraphBase::ComputingNode *toNode ,
943 GraphBase::InPort *toPort ) {
947 cdebug << "ERROR AddLink fromNode not found." << endl ;
951 cdebug << "ERROR AddLink fromPort not found." << endl ;
956 cdebug << "ERROR AddLink toNode not found." << endl ;
960 cdebug << "ERROR AddLink toPort not found." << endl ;
963 if ( ( fromPort->IsDataStream() && !toPort->IsDataStream() ) ||
964 ( !fromPort->IsDataStream() && toPort->IsDataStream() ) ) {
965 cdebug << "AddLink fromPort/toPort Stream/Flow. ERROR" << endl ;
968 if ( fromPort->IsDataStream() && fromPort->Dependency() == SALOME_ModuleCatalog::DATASTREAM_TEMPORAL &&
969 toPort->Dependency() == SALOME_ModuleCatalog::DATASTREAM_ITERATIVE ) {
970 cdebug << "AddLink fromPort/toPort Stream DATASTREAM_TEMPORAL --> DATASTREAM_ITERATIVE. ERROR" << endl ;
974 cdebug_in << "GraphBase::Graph::AddLink(" << fromNode->Name() << "("
975 << fromPort->PortName() << " " << fromPort->PortStatus() << ") ---> " << toNode->Name() << "("
976 << toPort->PortName() << " " << toPort->PortStatus() << ") )" << endl;
977 if ( fromPort->IsDataConnected() || fromPort->IsExternConnected() ) {
978 if ( !fromPort->RemoveInPort() ) { // There is only one ===> RemoveOutPort()
979 cdebug_out << "GraphBase::Graph::AddLink(" << fromNode->Name() << "("
980 << fromPort->PortName() << " " << fromPort->PortStatus() << ") RemoveInPort ERROR " << endl ;
984 if ( toPort->IsDataConnected() || toPort->IsExternConnected() ) {
985 if ( !toPort->GetOutPort()->RemoveInPort() ) { // There is only one ===> RemoveOutPort()
986 cdebug_out << "GraphBase::Graph::AddLink(" << toNode->Name() << "("
987 << toPort->PortName() << " " << toPort->PortStatus() << ") RemoveInPort ERROR " << endl ;
991 else if ( toPort->IsPortConnected() && !toNode->IsEndSwitchNode() ) {
992 if ( !RemoveLink( toPort->GetOutPort()->NodeName() ,
993 toPort->GetOutPort()->PortName() ,
994 toNode->Name() , toPort->PortName() ) ) {
995 cdebug_out << "RemoveLink(AddLink) toPort->GetOutPort()->NodeName() RemoveLink Error." << endl ;
1000 if ( !fromNode->IsDataFlowNode() && !fromNode->IsDataStreamNode() &&
1001 !toNode->IsDataFlowNode() && !toNode->IsDataStreamNode() &&
1002 toPort->GetOutPort() ) {
1003 if ( !strcmp( toPort->GetOutPort()->NodePortName() ,
1004 fromPort->NodePortName() ) ) {
1005 cdebug << "Link already exists" << endl ;
1006 cdebug_out << "GraphBase::Graph::AddLink 1" << endl;
1009 else if ( toPort->IsDataConnected() || toPort->IsExternConnected() ) {
1010 toPort->GetOutPort()->RemoveInPort( toPort ) ; //dbg
1012 else if ( fromNode->IsGOTONode() ) {
1013 if ( !RemoveLink( toPort->GetOutPort()->NodeName() ,
1014 toPort->GetOutPort()->PortName() ,
1015 toNode->Name() , toPort->PortName() ) ) {
1016 cdebug << "RemoveLink(AddLink) Error."
1018 cdebug_out << "GraphBase::Graph::AddLink" << endl;
1021 if ( fromPort->InPortsSize() ) {
1022 if ( !RemoveLink( fromNode->Name() , fromPort->PortName() ,
1023 fromPort->ChangeInPorts(0)->NodeName() ,
1024 fromPort->ChangeInPorts(0)->PortName() ) ) {
1025 cdebug << "RemoveLink(AddLink) fromNode->IsGOTONode Error." << endl ;
1026 cdebug_out << "GraphBase::Graph::AddLink" << endl;
1031 else if ( !toNode->IsEndSwitchNode() ||
1032 ( toNode->IsEndSwitchNode() && toPort->IsGate() ) ) {
1033 if ( !RemoveLink( fromNode->Name() , fromPort->PortName() ,
1034 toNode->Name() , toPort->PortName() ) ) {
1035 cdebug << "RemoveLink(AddLink) toNode->IsEndSwitchNode Error." << endl ;
1036 cdebug_out << "GraphBase::Graph::AddLink" << endl;
1041 else if ( fromNode->IsGOTONode() && fromPort->InPortsSize() ) {
1042 if ( !RemoveLink( fromNode->Name() , fromPort->PortName() ,
1043 fromPort->ChangeInPorts(0)->NodeName() ,
1044 fromPort->ChangeInPorts(0)->PortName() ) ) {
1045 cdebug << "RemoveLink(AddLink) fromNode->IsGOTONode Error." << endl ;
1046 cdebug_out << "GraphBase::Graph::AddLink" << endl;
1050 else if ( ( fromNode->IsDataFlowNode() || fromNode->IsDataStreamNode() ) &&
1051 ( toPort->IsDataConnected() || toPort->IsExternConnected() ) ) {
1052 fromPort->RemoveInPort( toPort ) ; //dbg
1054 else if ( ( toNode->IsDataFlowNode() || toNode->IsDataStreamNode() ) &&
1055 ( fromPort->IsDataConnected() || fromPort->IsExternConnected() ) ) {
1056 fromPort->RemoveInPort() ; // There is only one
1060 if ( toNode->IsEndSwitchNode() && !toPort->IsGate() ) {
1061 // if ( !toPort->IsEndSwitch() || !fromPort->AddInPort( toPort ) ) {
1062 if ( !fromPort->AddInPort( toPort ) ) {
1063 cdebug << "toNode->IsEndSwitchNode() : !fromPort->AddInPort( toPort ) AddLink Error."
1065 cdebug_out << "GraphBase::Graph::AddLink 0" << endl;
1068 if ( !toPort->IsDataStream() ) {
1069 toPort->Kind( SUPERV::EndSwitchParameter ) ;
1072 // JR 12.01.2005 : an OutPort of a SwitchNode connected to a Gate can be connected only to Gate
1073 else if ( fromNode->IsSwitchNode() && fromPort->IsSwitch() && !toPort->IsGate() ) {
1074 cdebug << "toPort->AddLink Error( fromPort->IsSwitch() && !toPort->IsGate())." << endl ;
1075 cdebug_out << "GraphBase::Graph::AddLink 0" << endl;
1078 else if ( !fromPort->AddInPort( toPort ) ) { // --> MapOfInports in the OutPort
1079 cdebug << "!fromPort->AddLink Error." << endl ;
1080 cdebug_out << "GraphBase::Graph::AddLink 0" << endl;
1084 if ( fromNode->IsGOTONode() && ( !fromPort->IsGate() || !toPort->IsGate() ||
1085 toNode->IsEndLoopNode() || toNode->IsEndSwitchNode() ) ) {
1086 cdebug << "toPort->AddLink Error( fromNode->IsGOTONode() && toNode->IsEndInLineNode() )." << endl ;
1087 cdebug_out << "GraphBase::Graph::AddLink 0" << endl;
1090 else if ( !fromNode->IsSwitchNode() && fromPort->IsParam() && toPort->IsGate() ) {
1091 cdebug << "toPort->AddLink Error( fromPort->IsParam() && toPort->IsGate())." << endl ;
1092 cdebug_out << "GraphBase::Graph::AddLink 0" << endl;
1095 else if ( !toNode->IsEndSwitchNode() && !toNode->IsEndLoopNode() ) {
1096 if ( !toPort->AddOutPort( fromPort ) ) { // --> Unique OutPort of the InPort
1097 cdebug << "toPort->AddLink Error." << endl ;
1098 cdebug_out << "GraphBase::Graph::AddLink 0" << endl;
1103 toPort->AddOutPort( fromPort ) ;
1106 if ( ( fromNode->IsGOTONode() && toNode->IsOneOfInLineNodes() ) ||
1107 ( fromNode->IsEndLoopNode() && toNode->IsLoopNode() ) ) {
1108 cdebug << "AddLink fromPort->PortStatus( PortConnected ) "
1109 << "GOTONode/EndLoopNode-->InLineNode/LoopNode/SwitchNode "
1110 << fromNode->Name() << " " << fromPort->PortName()
1111 << " InLineNode/LoopNode_ConnectedInPortsNumber "
1112 << toNode->ConnectedInPortsNumber() << endl;
1113 if ( fromNode->IsGOTONode() ) {
1114 fromPort->Kind( SUPERV::GOTOParameter ) ;
1116 fromPort->PortStatus( PortConnected ); // GOTO - Loop
1118 else if ( fromNode->IsDataFlowNode() || fromNode->IsDataStreamNode() ) {
1119 cdebug << "AddLink IsDataFlow/StreamNode fromPort->PortStatus( DataConnected ) : "
1120 << fromNode->Name() << " " << fromPort->PortName() << endl ;
1121 fromPort->PortStatus( ExternConnected );
1123 else if ( toNode->IsDataFlowNode() || toNode->IsDataStreamNode() ) {
1124 cdebug << "AddLink IsDataFlow/StreamNode fromPort->PortStatus( ExternConnected ) : "
1125 << fromNode->Name() << " " << fromPort->PortName() << endl ;
1126 fromPort->PortStatus( ExternConnected ) ;
1129 cdebug << "AddLink fromPort->PortStatus( PortConnected ) & fromNode->toNode "
1130 << fromNode->Name() << " " << fromPort->PortName() << " "
1131 << fromPort->Kind() << " OldPortStatus " << fromPort->PortStatus() << " -> " << toNode->Name()
1132 << " " << " " << toPort->PortName() << " " << toPort->Kind() << endl;
1133 fromPort->PortStatus( PortConnected );
1134 if ( fromPort->IsDataStream() && toPort->IsDataStream() ) {
1135 fromNode->AddStreamLinkedNode( toNode ) ;
1138 fromNode->AddLinkedNode( toNode ) ;
1141 if ( fromNode->IsSwitchNode() ) {
1142 if ( !fromPort->IsDataStream() ) {
1143 if ( fromPort->IsInLine() && toPort->IsGate() && !toNode->IsEndSwitchNode() ) {
1144 fromPort->Kind( SUPERV::SwitchParameter ) ;
1146 else if ( !fromPort->IsGate() && !toPort->IsGate() ){
1147 fromPort->Kind( SUPERV::InLineParameter ) ;
1150 if ( fromPort->IsGate() && !toNode->IsEndSwitchNode() ) {
1151 GraphBase::InLineNode * anEndSwitchNode ;
1152 anEndSwitchNode = ((GraphBase::SwitchNode * ) fromNode)->CoupledNode() ;
1153 GraphBase::InPort * anInPort = anEndSwitchNode->GetChangeNodeInGate() ;
1154 GraphBase::OutPort * anOutPort = anInPort->GetOutPort() ;
1155 if ( anOutPort && !strcmp( fromNode->Name() , anOutPort->NodeName() ) &&
1156 !strcmp( fromPort->PortName() , anOutPort->PortName() ) &&
1157 anOutPort->IsGate() ) {
1158 if ( !RemoveLink( fromNode->Name() , anOutPort->PortName() ,
1159 anEndSwitchNode->Name() ,
1160 anInPort->PortName() ) ) {
1161 cdebug << "AddLink Error Removelink ( Switch , Default , EndSwitch , Default )"
1163 cdebug_out << "GraphBase::Graph::AddLink 0" << endl;
1169 // cdebug << fromNode->ServiceName() << " " << toNode->ServiceName() << endl ;
1170 cdebug_out << "GraphBase::Graph::AddLink 1" << endl;
1174 bool GraphBase::Graph::RemoveLink( const char* FromNodeName ,
1175 const char* FromServiceParameterName ,
1176 const char* ToNodeName ,
1177 const char* ToServiceParameterName ) {
1178 cdebug_in << "GraphBase::Graph::RemoveLink from " << FromNodeName << "(" << FromServiceParameterName << ")"
1179 << " to " << ToNodeName << "(" << ToServiceParameterName << ")" << endl;
1180 bool RetVal = false ;
1181 GraphBase::ComputingNode * toNode = GetChangeGraphNode( ToNodeName ) ;
1183 GraphBase::InPort * anInPort = toNode->GetChangeInPort( ToServiceParameterName ) ;
1184 if ( anInPort && ( anInPort->IsPortConnected() ||
1185 anInPort->IsDataConnected() ||
1186 anInPort->IsExternConnected() ) ) {
1187 // JR 13.01.2005 : Bug if it is a link to an EndSwitchNode. The OutPort may be an other one !!!
1188 GraphBase::ComputingNode * fromNode = GetChangeGraphNode( FromNodeName ) ;
1189 GraphBase::OutPort * anOutPort = NULL ;
1190 if ( toNode->IsEndSwitchNode() ) {
1191 anOutPort = fromNode->GetChangeOutPort( FromServiceParameterName ) ;
1192 RetVal = anOutPort->RemoveInPort( anInPort ) ;
1195 anOutPort = anInPort->GetOutPort() ;
1196 RetVal = anOutPort->RemoveInPort( anInPort ) ;
1198 // anInPort->RemoveOutPort() ; // Already done in RemoveInPort
1199 // const char * FromNodeName = anOutPort->NodeName() ;
1202 if ( anInPort->IsDataStream() ) {
1203 fromNode->RemoveStreamLinkedNode( toNode ) ;
1206 fromNode->RemoveLinkedNode( toNode ) ;
1209 if ( fromNode->IsSwitchNode() && !anOutPort->IsGate() && !toNode->IsEndSwitchNode() ) {
1210 anOutPort->Kind( SUPERV::InLineParameter ) ;
1212 // JR 13.01.2005 : Bug if it is a link to an EndSwitchNode. The InPort may be linked !!!
1213 if ( toNode->IsEndSwitchNode() ) {
1216 for ( i = 0 ; i < toNode->LinkedFromNodesSize() ; i++ ) {
1217 GraphBase::StreamNode * fromNode = toNode->LinkedFromNodes( i ) ;
1219 for ( j = 0 ; j < fromNode->GetNodeOutPortsSize() ; j++ ) {
1220 GraphBase::OutPort * fromOutPort = fromNode->GetChangeNodeOutPort( j ) ;
1222 for ( k = 0 ; k < fromOutPort->InPortsSize() ; k++ ) {
1223 if ( strcmp( toNode->Name() , fromOutPort->InPorts( k )->NodeName() ) == 0 ) {
1224 // Restore an OutPort in the InPort
1225 anInPort->ChangeOutPort( fromOutPort ) ;
1226 cdebug << "Graph::RemoveLink reestablish " << fromOutPort->NodeName() << "( "
1227 << fromOutPort->PortName() << " ) in the InPort of EndSwitch : "
1228 << toNode->Name() << "( " << anInPort->PortName() << " )" << endl;
1245 cdebug_out << "GraphBase::Graph::RemoveLink " << RetVal << endl;
1249 bool GraphBase::Graph::GetLink(const char* ToNodeName ,
1250 const char* ToServiceParameterName ,
1251 char** FromNodeName ,
1252 char** FromServiceParameterName ) {
1253 // cdebug_in << "GraphBase::Graph::GetLink " << ToNodeName << "("
1254 // << ToServiceParameterName << ")" << endl;
1255 bool RetVal = false ;
1256 GraphBase::ComputingNode * toNode = GetChangeGraphNode( ToNodeName ) ;
1258 GraphBase::InPort * anInPort = toNode->GetChangeInPort( ToServiceParameterName ) ;
1259 if ( anInPort && !anInPort->IsNotConnected() ) {
1260 GraphBase::OutPort * anOutPort = anInPort->GetOutPort() ;
1261 *FromNodeName = my_strdup( anOutPort->NodeName() ) ;
1262 *FromServiceParameterName = my_strdup( anOutPort->PortName() ) ;
1266 cdebug << "GraphBase::Graph::GetLink ERROR no InPort or NotConnected " << ToNodeName
1267 << " " << ToServiceParameterName << " " << RetVal << endl;
1271 cdebug << "GraphBase::Graph::GetLink ERROR no Node " << ToNodeName << " " << RetVal
1274 // cdebug_out << "GraphBase::Graph::GetLink " << RetVal << endl;
1278 bool GraphBase::Graph::AddInputData( const char* ToNodeName ,
1279 const char* ToServiceParameterName ,
1280 const CORBA::Any aValue ) {
1281 bool RetVal = false ;
1282 cdebug_in << "GraphBase::Graph::AddInputData(" << ToNodeName << ","
1283 << ToServiceParameterName << " , Any " ;
1284 switch (aValue.type()->kind()) {
1285 case CORBA::tk_string:
1288 cdebug << t << " (string) " ;
1290 case CORBA::tk_double:
1293 cdebug << d << " (double) " ;
1295 case CORBA::tk_long:
1298 cdebug << l << " (long) " ;
1300 case CORBA::tk_objref:
1301 cdebug << "(object reference) " ;
1304 cdebug << "(other(tk_string(" << CORBA::tk_string << "),tk_double(" << CORBA::tk_double << "),tk_long("
1305 << CORBA::tk_long << "),tk_objref)(" << CORBA::tk_objref << ")) ERROR : " << aValue.type()->kind() ;
1308 cdebug << " ) in Graph " << Name() << endl;
1310 GraphBase::ComputingNode *toNode ;
1311 GraphBase::InPort *toPort ;
1314 NodePort( ToNodeName , ToServiceParameterName , &aNodeName , &aPortName ) ;
1315 toNode = GetChangeGraphNode( aNodeName ) ;
1316 cdebug << "in Graph " << Name() << " aNodeName " << aNodeName << " aPortName " << aPortName << endl;
1318 toPort = toNode->GetChangeInPort( aPortName ) ;
1319 if ( toPort && !toPort->IsDataConnected() ) {
1320 toPort->RemoveOutPort() ;
1328 for ( i = 0 ; i < GetNodeOutDataNodePortsSize() ; i++ ) {
1329 cdebug << "Graph::AddInputData In" << i << " " << *GetNodeOutDataNodePort(i) << endl ;
1331 for ( i = 0 ; i < GetNodeInDataNodePortsSize() ; i++ ) {
1332 cdebug << "Graph::AddInputData Out" << i << " " << *GetNodeInDataNodePort(i) << endl ;
1335 if ( toNode && toPort ) {
1336 GraphBase::OutPort *fromDataNodePort = NULL ;
1337 fromDataNodePort = GraphBase::DataNode::GetChangeInDataNodePort( toPort->NodePortName() ) ;
1338 if ( fromDataNodePort && fromDataNodePort->GetInPort( toPort ) ) {
1339 fromDataNodePort->RemoveInPort( toPort ) ;
1341 cdebug << "Try AddLink " << toPort->NodePortName() << " : " << Name() << "( "
1342 << fromDataNodePort->PortName() << " ) -->" << toNode->Name() << "( "
1343 << toPort->PortName() << " )" << endl ;
1344 RetVal = AddLink( (GraphBase::ComputingNode * ) this , fromDataNodePort ,
1347 fromDataNodePort->Value( aValue ) ;
1348 fromDataNodePort->PortStatus( DataConnected ) ;
1352 cdebug << "ERROR Node and/or Port not found : " << aNodeName << " " << aPortName << endl ;
1357 cdebug_out << "GraphBase::Graph::AddInputData " << RetVal << endl;
1361 // Used in the Executor in order to change an Input Value and ReRun
1362 bool GraphBase::Graph::ChangeInputData( const char * ToNodeName ,
1363 const char * ToServiceParameterName ,
1364 const CORBA::Any aValue ) {
1365 bool RetVal = false ;
1366 cdebug_in << "GraphBase::Graph::ChangeInputData( '" << ToNodeName << "' , '"
1367 << ToServiceParameterName << "' , Any " ;
1368 switch (aValue.type()->kind()) {
1369 case CORBA::tk_string:
1372 cdebug << t << " (string) " ;
1374 case CORBA::tk_double:
1377 cdebug << d << " (double) " ;
1379 case CORBA::tk_long:
1382 cdebug << l << " (long) " ;
1384 case CORBA::tk_objref:
1385 cdebug << "(object reference) " ;
1388 cdebug << "(other(tk_string,tk_double,tk_long,tk_objref)) ERROR";
1391 cdebug << " ) in Graph " << Name() << endl;
1393 GraphBase::ComputingNode * toNode ;
1394 GraphBase::InPort * toPort = NULL ;
1397 NodePort( ToNodeName , ToServiceParameterName , &aNodeName , &aPortName ) ;
1398 toNode = GetChangeGraphNode( aNodeName ) ;
1399 cdebug << "in Graph " << Name() << " aNodeName " << aNodeName << " aPortName " << aPortName << endl;
1401 toPort = toNode->GetChangeInPort( aPortName ) ;
1402 if ( toPort && toPort->IsDataConnected() ) {
1403 GraphBase::OutPort * fromPort = toPort->GetOutPort();
1406 fromPort->Value( aValue ) ;
1407 fromPort->PortStatus( DataConnected ) ;
1408 toPort->State( SUPERV::ReadyState ) ;
1411 cdebug << "ERROR ChangeInputData fromPort not found" << endl ;
1415 cdebug << "ERROR ChangeInputData toPort not found" << endl ;
1419 cdebug << "ERROR ChangeInputData Node not found : " << ToNodeName << endl ;
1422 cdebug_out << "GraphBase::Graph::ChangeInputData" << endl;
1426 // To restore InputData in CreateService
1427 bool GraphBase::Graph::AddInputData( const char* ToNodeName ,
1428 const char* ToServiceParameterName ,
1429 const CORBA::Any ** aValue ) {
1430 bool RetVal = false ;
1431 cdebug_in << "GraphBase::Graph::AddInputData( " << ToNodeName << " , "
1432 << ToServiceParameterName << ", **Any " ;
1433 const CORBA::Any theValue = **aValue ;
1434 switch (theValue.type()->kind()) {
1435 case CORBA::tk_string:
1438 cdebug << t << " (string) " ;
1440 case CORBA::tk_double:
1443 cdebug << d << " (double) " ;
1445 case CORBA::tk_long:
1448 cdebug << l << " (long) " ;
1450 case CORBA::tk_objref:
1451 cdebug << "(object reference) " ;
1454 cdebug << "(other(tk_string,tk_double,tk_long,tk_objref)) ERROR";
1457 cdebug << ") of Graph " << Name() << endl;
1459 GraphBase::ComputingNode *toNode = GetChangeGraphNode( ToNodeName ) ;
1462 GraphBase::InPort *toPort = NULL ;
1463 GraphBase::OutPort *fromDataNodePort = NULL ;
1464 toPort = toNode->GetChangeInPort( ToServiceParameterName ) ;
1465 fromDataNodePort = GraphBase::DataNode::GetChangeInDataNodePort( toPort->NodePortName() ) ;
1466 cdebug << "Try AddLink " << Name() << "( " << fromDataNodePort << " ) -->"
1467 << toNode->Name() << "( " << toPort->PortName() << " )" << endl ;
1468 RetVal = AddLink( (GraphBase::ComputingNode * ) this , fromDataNodePort ,
1471 fromDataNodePort->Value( aValue ) ;
1472 fromDataNodePort->PortStatus( DataConnected ) ;
1476 cdebug << "ERROR Node not found " << ToNodeName << " ERROR. Known nodes :" << endl ;
1477 map< string , int >::iterator aMapOfGraphNodesIterator ;
1479 for ( aMapOfGraphNodesIterator = _MapOfGraphNodes.begin() ;
1480 aMapOfGraphNodesIterator != _MapOfGraphNodes.end() ; aMapOfGraphNodesIterator++ ) {
1481 cdebug << "MapOfGraphNodes " << i++ << " " << aMapOfGraphNodesIterator->first << " --> "
1482 << aMapOfGraphNodesIterator->second << endl ;
1486 cdebug_out << "GraphBase::Graph::AddInputData " << RetVal << endl;
1490 bool GraphBase::Graph::AddOutputData( const char* FromNodeName ,
1491 const char* FromServiceParameterName ,
1492 const CORBA::Any aValue ) {
1493 bool RetVal = true ;
1494 cdebug_in << "GraphBase::Graph::AddOutputData(" << FromNodeName << ","
1495 << FromServiceParameterName << ")" << endl;
1496 GraphBase::ComputingNode *fromNode = GetChangeGraphNode( FromNodeName ) ;
1498 GraphBase::OutPort *anOutPort = NULL ;
1501 anOutPort = fromNode->GetChangeOutPort( FromServiceParameterName ) ;
1502 // toDataNodePort = GraphBase::DataNode::GetChangeOutDataNodePort( fromPort->NodePortName() ) ;
1503 // RetVal = AddLink( fromNode , fromPort ,
1504 // (GraphBase::ComputingNode * ) this , toDataNodePort ) ;
1505 anOutPort->Value( aValue ) ;
1506 anOutPort->State( SUPERV::ReadyState ) ;
1507 anOutPort->Done( true ) ;
1508 cdebug << *anOutPort ;
1510 anOutPort->StringValue( *_fdebug ) ;
1515 cdebug << "ERROR Node not found" << endl ;
1518 cdebug_out << "GraphBase::Graph::AddOutputData " << RetVal << endl;
1522 map< string , GraphBase::Service * > GraphBase::Graph::MapOfServiceNames() {
1523 return _MapOfServiceNames ; }
1525 GraphBase::Service * GraphBase::Graph::GetServiceOfMap( char * name ) {
1526 return _MapOfServiceNames[ name ] ;
1529 bool GraphBase::Graph::SetServiceOfMap( GraphBase::Service * aService ) {
1530 GraphBase::Service * theService = _MapOfServiceNames[ aService->ServiceName() ] ;
1532 cdebug << "SetServiceOfMap of " << aService->ServiceName()
1533 << " already in MapOfServiceNames : erase" << endl ;
1534 _MapOfServiceNames.erase( aService->ServiceName() ) ;
1536 _MapOfServiceNames[ (char * ) aService->ServiceName() ] = aService ;
1537 cdebug << "SetServiceOfMap of " << aService->ServiceName() << " done" << endl ;
1541 int GraphBase::Graph::GetServiceNameNumber( SALOME_ModuleCatalog::Service aService ) {
1542 GraphBase::Service * theService = _MapOfServiceNames[ (char * ) aService.ServiceName ] ;
1543 if ( theService == NULL ) {
1546 return theService->NewInstance() ;
1549 void GraphBase::Graph::SetGraphPorts() {
1550 cdebug_in << "GraphBase::Graph::SetGraphPorts fill ports of Graph" << endl;
1552 for ( i = 0 ; i < GetNodeInDataNodePortsSize() ; i++ ) {
1553 GraphBase::OutPort * anOutPort = GetChangeNodeInDataNodePort( i ) ;
1554 cdebug << "SetGraphPorts Out" << i << " " << anOutPort->PortName() << " " << anOutPort->PortType()
1555 << " " << anOutPort->Kind() << " " << anOutPort->PortStatus() << " " << anOutPort->State() << endl ;
1556 if ( !anOutPort->IsGate() ) {
1557 anOutPort->PortStatus( ExternConnected ) ;
1560 for ( i = 0 ; i < GetNodeOutDataNodePortsSize() ; i++ ) {
1561 GraphBase::InPort * anInPort = GetChangeNodeOutDataNodePort( i ) ;
1562 cdebug << "SetGraphPorts In" << i << " " << anInPort->PortName() << " " << anInPort->PortType()
1563 << " " << anInPort->Kind() << " " << anInPort->PortStatus() << " " << anInPort->State() << endl ;
1564 if ( !anInPort->IsGate() ) {
1565 GraphBase::OutPort * anOutPort = anInPort->GetOutPort() ;
1566 anOutPort->PortStatus( ExternConnected ) ;
1569 cdebug_out << "GraphBase::Graph::SetGraphPorts" << endl;
1572 bool GraphBase::Graph::CreateService() {
1573 cdebug_in << "GraphBase::Graph::CreateService " << Name() << " GraphMacroLevel : " << GraphMacroLevel() << endl;
1574 bool RetVal = true ;
1575 SALOME_ModuleCatalog::Service aService ;
1577 GraphBase::ComputingNode * aToNode ;
1580 int instreamnbr = 0 ;
1582 int outstreamnbr = 0 ;
1583 vector< SUPERV::KindOfPort > InPortsKind ;
1584 vector< SALOME_ModuleCatalog::DataStreamDependency > InDataStreamDependency ;
1585 vector< SUPERV::KindOfSchema > InKindOfSchema ;
1586 vector< SUPERV::KindOfInterpolation > InKindOfInterpolation ;
1587 vector< SUPERV::KindOfExtrapolation > InKindOfExtrapolation ;
1588 vector< SUPERV::KindOfPort > OutPortsKind ;
1589 vector< SALOME_ModuleCatalog::DataStreamDependency > OutDataStreamDependency ;
1590 vector< long > OutNumberOfValues ;
1591 // if ( GraphMacroLevel() == 0 ) {
1592 for ( dostore = 0 ; dostore <= 2 ; dostore++ ) {
1593 if ( dostore == 1 ) {
1594 aService.ServiceName = Name() ;
1595 aService.ServiceinParameter.length( 0 ) ;
1596 aService.ServiceinParameter.length( innbr ) ;
1597 aService.ServiceoutParameter.length( 0 ) ;
1598 aService.ServiceoutParameter.length( outnbr ) ;
1599 InPortsKind.resize( innbr ) ;
1600 InDataStreamDependency.resize( innbr ) ;
1601 InKindOfSchema.resize( innbr ) ;
1602 InKindOfInterpolation.resize( innbr ) ;
1603 InKindOfExtrapolation.resize( innbr ) ;
1604 OutPortsKind.resize( outnbr ) ;
1605 OutDataStreamDependency.resize( outnbr ) ;
1606 OutNumberOfValues.resize( outnbr ) ;
1608 else if ( dostore == 2 ) {
1609 cdebug << "GraphBase::Graph::CreateService ->DataService innbr " << innbr
1610 << " instreamnbr " << instreamnbr << " outnbr " << outnbr
1611 << " outstreamnbr " << outstreamnbr << endl ;
1612 DataService( _Orb , aService , Graph_prof_debug() , Graph_fdebug() ) ;
1613 aService.ServiceinParameter.length( innbr + instreamnbr ) ;
1614 aService.ServiceoutParameter.length( outnbr + outstreamnbr ) ;
1615 InPortsKind.resize( innbr + instreamnbr ) ;
1616 InDataStreamDependency.resize( innbr + instreamnbr ) ;
1617 InKindOfSchema.resize( innbr + instreamnbr ) ;
1618 InKindOfInterpolation.resize( innbr + instreamnbr ) ;
1619 InKindOfExtrapolation.resize( innbr + instreamnbr ) ;
1620 OutPortsKind.resize( outnbr + outstreamnbr ) ;
1621 OutDataStreamDependency.resize( outnbr + outstreamnbr ) ;
1622 OutNumberOfValues.resize( outnbr + outstreamnbr ) ;
1624 if ( dostore == 0 ) {
1630 if ( dostore == 1 ) {
1634 for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
1635 aToNode = GraphNodes( i ) ;
1636 for ( j = 0 ; j < aToNode->GetNodeInPortsSize() ; j++ ) {
1637 GraphBase::InPort *anInPort = aToNode->GetChangeNodeInPort(j) ;
1638 bool isfromcouplednode = false ;
1639 if ( !anInPort->IsNotConnected() ) {
1640 const char * aFromNodeName = anInPort->GetOutPort()->NodeName() ;
1641 GraphBase::ComputingNode * aFromNode = GetChangeGraphNode( aFromNodeName ) ;
1642 cdebug << "GraphBase::Graph::CreateService aFromNodeName " << aFromNodeName << " aToNode "
1643 << aToNode->Name() << " InPort" << j << " " << anInPort->PortName() << endl ;
1644 if ( aFromNode && aFromNode->IsEndLoopNode() &&
1645 ((GraphBase::EndOfLoopNode * ) aFromNode)->CoupledNode() == aToNode ) {
1646 isfromcouplednode = true ;
1649 if ( !anInPort->IsGate() && !anInPort->IsLoop() &&
1650 ( !anInPort->IsPortConnected() ||
1651 ( anInPort->IsPortConnected() && isfromcouplednode ) ) ) {
1652 if ( dostore == 0 ) {
1653 cdebug << "CreateService " << aToNode->Name() << " Input port "
1654 << anInPort->PortName() << " " << anInPort->Kind() << " " << anInPort->PortStatus() ;
1655 if ( anInPort->GetOutPort() ) {
1656 cdebug << "DataConnected from " << *(anInPort->GetOutPort() ) ;
1659 if ( anInPort->IsDataStream() ) {
1666 else if ( ( dostore == 1 && !anInPort->IsDataStream() ) ||
1667 ( dostore == 2 && anInPort->IsDataStream() ) ) {
1668 aService.ServiceinParameter[innbr].Parametertype = CORBA::string_dup( anInPort->PortType() ) ;
1669 aService.ServiceinParameter[innbr].Parametername = CORBA::string_dup( anInPort->NodePortName() ) ;
1670 InPortsKind[ innbr ] = anInPort->Kind() ;
1671 InDataStreamDependency[ innbr ] = anInPort->Dependency() ;
1672 if ( dostore == 2 && anInPort->IsDataStream() ) {
1673 ((GraphBase::InDataStreamPort * ) anInPort)->Params( InKindOfSchema[ innbr ] ,
1674 InKindOfInterpolation[ innbr ] ,
1675 InKindOfExtrapolation[ innbr ] ) ;
1677 cdebug << "In" << innbr << " " << aService.ServiceinParameter[ innbr ].Parametername << " "
1678 << anInPort->Kind() << " " << anInPort->PortStatus() << endl ;
1682 else if ( dostore == 0 ) {
1683 cdebug << "CreateService " << aToNode->Name() << " Input port " << anInPort->PortName()
1684 << " " << anInPort->PortStatus() ;
1685 if ( anInPort->IsPortConnected() ) {
1686 cdebug << " is connected " ;
1689 cdebug << " is NOT connected " ;
1691 if ( anInPort->IsGate() ) {
1692 cdebug << " IsGate " ;
1694 if ( anInPort->GetOutPort() ) {
1695 cdebug << "DataConnected from " << *(anInPort->GetOutPort()) ;
1698 cdebug << "NOT DataConnected" ;
1703 GraphBase::ComputingNode * aFromNode = aToNode ;
1704 for ( j = 0 ; j < aFromNode->GetNodeOutPortsSize() ; j++ ) {
1705 GraphBase::OutPort *anOutPort = aFromNode->GetChangeNodeOutPort(j) ;
1706 // cdebug << "CreateService Node " << aFromNode->Name() << ". Output port[" << j << "] ";
1707 // if ( anOutPort ) {
1708 // cdebug << anOutPort->PortName() << " " << anOutPort->ServicesParameterType() << endl ;
1711 // cdebug << " NULL" << endl ;
1713 if ( !aFromNode->IsGOTONode() ) {
1714 if ( !anOutPort->IsGate() && ( anOutPort->IsNotConnected() || anOutPort->IsDataConnected() ) ||
1715 anOutPort->IsExternConnected() ) {
1716 if ( dostore == 0 ) {
1717 // cdebug << "CreateService " << aFromNode->Name() << " Output port "
1718 // << anOutPort->PortName() << " " << anOutPort->PortStatus() << endl ;
1719 if ( anOutPort->IsDataStream() ) {
1726 else if ( ( dostore == 1 && !anOutPort->IsDataStream() ) ||
1727 ( dostore == 2 && anOutPort->IsDataStream() ) ) {
1728 aService.ServiceoutParameter[outnbr].Parametertype = CORBA::string_dup( anOutPort->PortType() ) ;
1729 aService.ServiceoutParameter[outnbr].Parametername = CORBA::string_dup( anOutPort->NodePortName() ) ;
1730 OutPortsKind[ outnbr ] = anOutPort->Kind() ;
1731 OutDataStreamDependency[ outnbr ] = anOutPort->Dependency() ;
1732 if ( dostore == 2 && anOutPort->IsDataStream() ) {
1733 OutNumberOfValues[ outnbr ] = ((GraphBase::OutDataStreamPort * ) anOutPort)->NumberOfValues() ;
1735 // cdebug << "Out" << outnbr << " " << aService.ServiceoutParameter[ outnbr ].Parametername << " "
1736 // << anOutPort->Kind() << " " << anOutPort->PortStatus() << endl ;
1747 cdebug << "DataFlowNode ServiceName " << aService.ServiceName << " InPorts " << innbr
1748 << " OutPorts " << outnbr << endl ;
1749 for ( i = 0 ; i < innbr ; i++ ) {
1750 cdebug << "aService.ServiceinParameter[" << i << "].Parametertype "
1751 << aService.ServiceinParameter[i].Parametertype << " Parametername "
1752 << aService.ServiceinParameter[i].Parametername << " " << InPortsKind[ i ] << endl ;
1753 if ( InPortsKind[ i ] != SUPERV::DataStreamParameter ) {
1754 cdebug << "NodeInPort[" << i << "] " << *GetChangeNodeInPort( i ) << endl ;
1757 for ( i = 0 ; i < outnbr ; i++ ) {
1758 cdebug << "aService.ServiceoutParameter[" << i << "].Parametertype "
1759 << aService.ServiceoutParameter[i].Parametertype << " Parametername "
1760 << aService.ServiceoutParameter[i].Parametername << " " << OutPortsKind[ i ] << endl ;
1761 if ( OutPortsKind[ i ] != SUPERV::DataStreamParameter ) {
1762 cdebug << "NodeOutPort[" << i << "] " << *GetChangeNodeOutPort( i ) << endl ;
1767 // DataService( _Orb , aService , InPortsKind , OutPortsKind , Graph_prof_debug() , Graph_fdebug() ) ;
1768 for ( i = 0 ; i < innbr ; i++ ) {
1769 if ( InPortsKind[ i ] == SUPERV::DataStreamParameter ) {
1770 GraphBase::InDataStreamPort * anInPort = AddInDataStreamPort( aService.ServiceinParameter[ i ].Parametername ,
1771 StringToDataStreamType( aService.ServiceinParameter[ i ].Parametertype ) ,
1772 InDataStreamDependency[ i ] ,
1773 SUPERV::DataStreamParameter ) ;
1774 anInPort->SetParams( InKindOfSchema[ i ] ,
1775 InKindOfInterpolation[ i ] ,
1776 InKindOfExtrapolation[ i ] ) ;
1777 // NOT A BUG : AddOutPort for an inport (Reversed service)
1778 anInPort = (GraphBase::InDataStreamPort * ) _DataFlowDataPorts->AddOutPort(
1781 aService.ServiceinParameter[ i ].Parametername ,
1782 aService.ServiceinParameter[ i ].Parametertype ,
1783 SUPERV::DataStreamParameter ,
1785 _Graph_prof_debug , _Graph_fdebug ) ;
1786 anInPort->Dependency( InDataStreamDependency[ i ] ) ;
1787 // Attention : revoir les reversed DataStreamPorts
1788 // anInPort->SetParams( InKindOfSchema[ i ] ,
1789 // InKindOfInterpolation[ i ] ,
1790 // InKindOfExtrapolation[ i ] ) ;
1791 cdebug << "InStreamPort " << GetChangeNodeInPort( i )->PortName() << " " << GetChangeNodeInPort( i )->Kind() << endl ;
1792 cdebug << "ReversedInStreamPort " << _DataFlowDataPorts->GetChangeNodeOutPort( i )->PortName() << " " << _DataFlowDataPorts->GetChangeNodeOutPort( i )->Kind()
1796 GetChangeNodeInPort( i )->Kind( InPortsKind[ i ] ) ;
1797 _DataFlowDataPorts->GetChangeNodeOutPort( i )->Kind( InPortsKind[ i ] ) ;
1798 GetChangeNodeInPort( i )->Dependency( InDataStreamDependency[ i ] ) ;
1799 _DataFlowDataPorts->GetChangeNodeOutPort( i )->Dependency( InDataStreamDependency[ i ] ) ;
1800 cdebug << "InPort " << GetChangeNodeInPort( i )->PortName() << " " << GetChangeNodeInPort( i )->Kind() << endl ;
1801 cdebug << "ReversedInPort " << _DataFlowDataPorts->GetChangeNodeOutPort( i )->PortName() << " " << _DataFlowDataPorts->GetChangeNodeOutPort( i )->Kind()
1805 for ( i = 0 ; i < outnbr ; i++ ) {
1806 if ( OutPortsKind[ i ] == SUPERV::DataStreamParameter ) {
1807 GraphBase::OutDataStreamPort * anOutPort = AddOutDataStreamPort( aService.ServiceoutParameter[ i ].Parametername ,
1808 StringToDataStreamType( aService.ServiceoutParameter[ i ].Parametertype ) ,
1809 OutDataStreamDependency[ i ] ,
1810 SUPERV::DataStreamParameter ) ;
1811 anOutPort->NumberOfValues( OutNumberOfValues[ i ] ) ;
1812 // NOT A BUG : AddInPort for an outport (Reversed service)
1813 anOutPort = (GraphBase::OutDataStreamPort * ) _DataFlowDataPorts->AddInPort(
1816 aService.ServiceoutParameter[ i ].Parametername ,
1817 aService.ServiceoutParameter[ i ].Parametertype ,
1818 SUPERV::DataStreamParameter ,
1820 _Graph_prof_debug , _Graph_fdebug ) ;
1821 anOutPort->Dependency( OutDataStreamDependency[ i ] ) ;
1822 // Attention : revoir les reversed DataStreamPorts
1823 // anOutPort->NumberOfValues( OutNumberOfValues[ i ] ) ;
1824 cdebug << "OutStreamPort " << GetChangeNodeOutPort( i )->PortName() << " " << GetChangeNodeOutPort( i )->Kind() << endl ;
1825 cdebug << "ReversedOutStreamPort " << _DataFlowDataPorts->GetChangeNodeInPort( i )->PortName() << " " << _DataFlowDataPorts->GetChangeNodeInPort( i )->Kind()
1829 GetChangeNodeOutPort( i )->Kind( OutPortsKind[ i ] ) ;
1830 _DataFlowDataPorts->GetChangeNodeInPort( i )->Kind( OutPortsKind[ i ] ) ;
1831 GetChangeNodeOutPort( i )->Dependency( OutDataStreamDependency[ i ] ) ;
1832 _DataFlowDataPorts->GetChangeNodeInPort( i )->Dependency( OutDataStreamDependency[ i ] ) ;
1833 GetChangeNodeOutPort( i )->Dependency( OutDataStreamDependency[ i ] ) ;
1834 _DataFlowDataPorts->GetChangeNodeInPort( i )->Dependency( OutDataStreamDependency[ i ] ) ;
1835 cdebug << "OutPort " << GetChangeNodeOutPort( i )->PortName() << " " << GetChangeNodeOutPort( i )->Kind() << endl ;
1836 cdebug << "ReversedOutPort " << _DataFlowDataPorts->GetChangeNodeInPort( i )->PortName() << " " << _DataFlowDataPorts->GetChangeNodeInPort( i )->Kind()
1840 // Restore input datas and links :
1841 DataStreamInPortsNumber( 0 ) ;
1842 DataStreamOutPortsNumber( 0 ) ;
1843 for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
1844 aToNode = GraphNodes( i ) ;
1845 DataStreamInPortsNumber( DataStreamInPortsNumber() + aToNode->DataStreamInPortsNumber() ) ;
1846 DataStreamOutPortsNumber( DataStreamOutPortsNumber() + aToNode->DataStreamOutPortsNumber() ) ;
1847 for ( j = 0 ; j < aToNode->GetNodeInPortsSize() ; j++ ) {
1848 GraphBase::InPort *anInPort = aToNode->GetChangeNodeInPort(j) ;
1849 if ( !anInPort->IsGate() && anInPort->IsDataConnected() ) {
1850 if ( !AddInputData( anInPort->NodeName() ,
1851 anInPort->PortName() ,
1852 anInPort->GetOutPort()->ValuePtr() ) ) {
1853 cdebug << "CreateService In" << j << " " << anInPort->NodeName() << "(" << anInPort->PortName() << ") "
1854 << anInPort->PortStatus() << " --> AddInputData ERROR" << endl ;
1858 cdebug << "CreateService In" << j << " " << anInPort->NodeName() << "(" << anInPort->PortName() << ") "
1859 << anInPort->PortStatus() << " --> AddInputData" << endl ;
1862 else if ( !anInPort->IsGate() && anInPort->IsNotConnected() ) {
1863 if ( !AddLink( this , GetChangeInDataNodePort( anInPort->NodePortName() ) , aToNode , anInPort ) ) {
1864 cdebug << "CreateService In" << j << " " << anInPort->NodeName() << "(" << anInPort->PortName() << ") "
1865 << anInPort->PortStatus() << " --> AddInLink ERROR" << endl ;
1869 cdebug << "CreateService In" << j << " " << anInPort->NodeName() << "(" << anInPort->PortName() << ") "
1870 << anInPort->PortStatus() << " --> AddInLink" << endl ;
1874 for ( j = 0 ; j < aToNode->GetNodeOutPortsSize() ; j++ ) {
1875 GraphBase::OutPort *anOutPort = aToNode->GetChangeNodeOutPort(j) ;
1876 cdebug << "CreateService Out" << j << " " << anOutPort->NodeName() << "(" << anOutPort->PortName()
1877 << ") " << anOutPort->PortStatus() << " :" << endl ;
1878 if ( !anOutPort->IsGate() && anOutPort->IsNotConnected() && !aToNode->IsGOTONode() ) {
1879 GraphBase::InPort *anInPort = GetChangeOutDataNodePort( anOutPort->NodePortName() ) ;
1880 if ( !AddLink( aToNode , anOutPort , this , anInPort ) ) {
1881 cdebug << " --> " << Name() << "(" << anInPort->PortName()
1882 << ") " << anInPort->PortStatus() << " AddOutLink ERROR" << endl ;
1886 cdebug << " --> " << Name() << "(" << anInPort->PortName()
1887 << ") " << anInPort->PortStatus() << " AddOutLink" << endl ;
1893 cdebug_out << "GraphBase::Graph::CreateService " << RetVal << endl;
1897 bool GraphBase::Graph::InLineServices() {
1898 cdebug_in << "GraphBase::Graph::InLineServices" << endl;
1903 ListPorts( *_Graph_fdebug , 0 ) ;
1906 GraphBase::InLineNode * aINode ;
1907 SALOME_ModuleCatalog::Service aService ;
1908 for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
1909 aINode = (GraphBase::InLineNode * ) GraphNodes( i ) ;
1910 if ( aINode->IsOneOfInLineNodes() ) {
1911 // cdebug << "GraphBase::Graph::InLineServices " << aINode->Name() << endl;
1912 aService.ServiceName = aINode->ServiceName() ;
1913 aService.ServiceinParameter.length( 0 ) ;
1914 aService.ServiceoutParameter.length( 0 ) ;
1915 aINode->DataStreamInPortsNumber( 0 ) ;
1916 aINode->DataStreamOutPortsNumber( 0 ) ;
1918 int InStreamService = 0 ;
1919 for ( j = 0 ; j < aINode->GetNodeInPortsSize() ; j++ ) {
1920 if ( aINode->GetChangeNodeInPort(j)->IsGate() || aINode->GetChangeNodeInPort(j)->IsLoop() ) {
1922 cdebug << "GraphBase::Graph::InLineServices In" << j << " "
1923 << aINode->GetChangeNodeInPort(j)->Kind() << " "
1924 << aINode->GetChangeNodeInPort(j)->PortType() << " "
1925 << aINode->GetChangeNodeInPort(j)->PortName() << " ignored "
1926 << aINode->GetChangeNodeInPort(j)->IsGate() << " "
1927 << aINode->GetChangeNodeInPort(j)->IsLoop() << endl;
1930 else if ( aINode->GetChangeNodeInPort(j)->IsDataStream() ) {
1931 aService.ServiceinDataStreamParameter.length( InStreamService+1 ) ;
1932 aService.ServiceinDataStreamParameter[InStreamService].Parametertype = StringToDataStreamType( aINode->GetChangeNodeInPort(j)->PortType() ) ;
1933 aService.ServiceinDataStreamParameter[InStreamService].Parametername = CORBA::string_dup( aINode->GetChangeNodeInPort(j)->PortName() ) ;
1934 aService.ServiceinDataStreamParameter[InStreamService++].Parameterdependency = aINode->GetChangeNodeInPort(j)->Dependency() ;
1935 aINode->IncrDataStreamInPorts() ;
1937 cdebug << "GraphBase::Graph::InLineServices In" << j << " "
1938 << aINode->GetChangeNodeInPort(j)->Kind() << " "
1939 << aINode->GetChangeNodeInPort(j)->PortType() << " "
1940 << aINode->GetChangeNodeInPort(j)->PortName() << " "
1941 << aINode->GetChangeNodeInPort(j)->IsGate() << " "
1942 << aINode->GetChangeNodeInPort(j)->IsLoop() << endl;
1946 aService.ServiceinParameter.length( InService+1 ) ;
1947 aService.ServiceinParameter[InService].Parametertype = CORBA::string_dup( aINode->GetChangeNodeInPort(j)->PortType() ) ;
1948 aService.ServiceinParameter[InService++].Parametername = CORBA::string_dup( aINode->GetChangeNodeInPort(j)->PortName() ) ;
1950 cdebug << "GraphBase::Graph::InLineServices In" << j << " "
1951 << aINode->GetChangeNodeInPort(j)->Kind() << " "
1952 << aINode->GetChangeNodeInPort(j)->PortType() << " "
1953 << aINode->GetChangeNodeInPort(j)->PortName() << " "
1954 << aINode->GetChangeNodeInPort(j)->IsGate() << " "
1955 << aINode->GetChangeNodeInPort(j)->IsLoop() << endl;
1959 int OutService = 0 ;
1960 int OutStreamService = 0 ;
1961 for ( j = 0 ; j < aINode->GetNodeOutPortsSize() ; j++ ) {
1962 // if ( aINode->GetChangeNodeOutPort(j)->IsGate() || aINode->GetChangeNodeOutPort(j)->IsLoop() || aINode->GetChangeNodeOutPort(j)->IsDataStream() ) {
1963 if ( aINode->GetChangeNodeOutPort(j)->IsGate() || aINode->GetChangeNodeOutPort(j)->IsLoop() ) {
1965 cdebug << "GraphBase::Graph::InLineServices Out" << j << " "
1966 << aINode->GetChangeNodeOutPort(j)->Kind() << " "
1967 << aINode->GetChangeNodeOutPort(j)->PortType() << " "
1968 << aINode->GetChangeNodeOutPort(j)->PortName() << " ignored "
1969 << aINode->GetChangeNodeOutPort(j)->IsGate() << " "
1970 << aINode->GetChangeNodeOutPort(j)->IsLoop() << endl;
1973 else if ( aINode->GetChangeNodeOutPort(j)->IsDataStream() ) {
1974 aService.ServiceoutDataStreamParameter.length( OutStreamService+1 ) ;
1975 aService.ServiceoutDataStreamParameter[OutStreamService].Parametertype = StringToDataStreamType( aINode->GetChangeNodeOutPort(j)->PortType() ) ;
1976 aService.ServiceoutDataStreamParameter[OutStreamService].Parametername = CORBA::string_dup( aINode->GetChangeNodeOutPort(j)->PortName() ) ;
1977 aService.ServiceoutDataStreamParameter[OutStreamService++].Parameterdependency = aINode->GetChangeNodeOutPort(j)->Dependency() ;
1978 aINode->IncrDataStreamOutPorts() ;
1980 cdebug << "GraphBase::Graph::InLineServices Out" << j << " "
1981 << aINode->GetChangeNodeOutPort(j)->Kind() << " "
1982 << aINode->GetChangeNodeOutPort(j)->PortType() << " "
1983 << aINode->GetChangeNodeOutPort(j)->PortName() << " "
1984 << aINode->GetChangeNodeOutPort(j)->IsGate() << " "
1985 << aINode->GetChangeNodeOutPort(j)->IsLoop() << endl;
1989 aService.ServiceoutParameter.length( OutService+1 ) ;
1990 aService.ServiceoutParameter[OutService].Parametertype = CORBA::string_dup( aINode->GetChangeNodeOutPort(j)->PortType() ) ;
1991 aService.ServiceoutParameter[OutService++].Parametername = CORBA::string_dup( aINode->GetChangeNodeOutPort(j)->PortName() ) ;
1993 cdebug << "GraphBase::Graph::InLineServices Out" << j << " "
1994 << aINode->GetChangeNodeOutPort(j)->Kind() << " "
1995 << aINode->GetChangeNodeOutPort(j)->PortType() << " "
1996 << aINode->GetChangeNodeOutPort(j)->PortName() << " "
1997 << aINode->GetChangeNodeOutPort(j)->IsGate() << " "
1998 << aINode->GetChangeNodeOutPort(j)->IsLoop() << endl;
2002 aINode->SetService( aService ) ;
2003 if ( SetServiceOfMap( (GraphBase::Service * ) aINode ) ) {
2005 cdebug << "InLineServices SetServiceOfMap " << aINode->ServiceName() << " in MapOfServices"
2006 << " InStreamPort(" << aINode->DataStreamInPortsNumber()
2007 << ") OutStreamPort(" << aINode->DataStreamOutPortsNumber() << ")" << endl ;
2010 // cdebug << "GraphBase::Graph::InLineServices" << *aINode->GetService() << endl;
2014 cdebug_out << "GraphBase::Graph::InLineServices" << endl;
2018 bool GraphBase::Graph::Sort( int & SubStreamGraphsNumber ) {
2021 int NotSortedNumber = GraphNodesSize() ;
2023 cdebug_in << "GraphBase::Graph::Sort" << endl;
2024 if ( NotSortedNumber ) {
2026 _ParallelExecutionNodes = false ;
2027 _Sorted.resize( GraphNodesSize() ) ;
2028 _CnxInPortsNumber.resize( GraphNodesSize() ) ;
2029 _DecrInPortsNumber.resize( GraphNodesSize() ) ;
2030 if ( _NodesNumber.size() ) {
2031 _NodesNumber.resize( 0 ) ;
2032 _SortedNodes.resize( 0 ) ;
2035 // This is a simulation of the computation of the graph :
2036 // The initial state of nodes is :
2037 // - Sorted = false : the node is not sorted
2038 // - CnxInPortsNumber = ConnectedInPortsNumber : the number of ports that wait for a value from a link
2039 // - DecrInPortsNumber = 0 : there is no value available.
2041 cdebug << "GraphBase::Graph::Sort initial values :" << endl ;
2042 for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
2043 GraphBase::ComputingNode * aNode = GraphNodes( i ) ;
2044 cdebug << aNode->Name() << " --> " << aNode->LinkedNodesSize() << " LinkedNodes :" << endl ;
2045 for ( j = 0 ; j < aNode->LinkedNodesSize() ; j++ ) {
2046 cdebug << " " << aNode->LinkedNodes( j )->Name() << endl ;
2050 for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
2051 _Sorted[ i ] = false ;
2052 _CnxInPortsNumber[ i ] = GraphNodes( i )->ConnectedInPortsNumber() ;
2053 _DecrInPortsNumber[ i ] = 0 ;
2054 // cdebug << "Sort Node [" << i << "] " << GraphNodes( i )->Name() << " initial count "
2055 // << _CnxInPortsNumber[ i ] << endl ;
2058 // Nodes are linked ONLY if Ports are NOT DataStream for topological sort of node
2059 // ==============================================================================
2060 while ( NotSortedNumber ) {
2063 for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
2064 cdebug << "Sort level " << _LevelsNumber << ". [" << i << "] "
2065 << GraphNodes( i )->Name() << " count "
2066 << _CnxInPortsNumber[ i ] << endl ;
2067 if ( !_Sorted[ i ] && _CnxInPortsNumber[ i ] == 0 ) {
2068 // All inputs of GraphNodes( i ) are available : "AllDataReady"
2069 if ( (int ) _NodesNumber.size() != _LevelsNumber+1 ) {
2070 _NodesNumber.resize( _LevelsNumber+1 ) ;
2071 _SortedNodes.resize( _LevelsNumber+1 ) ;
2072 _NodesNumber[ _LevelsNumber ] = -1 ;
2074 // There is one more node at that level
2075 _NodesNumber[ _LevelsNumber ]++ ;
2076 (_SortedNodes[ _LevelsNumber ]).resize( _NodesNumber[ _LevelsNumber ]+1 ) ;
2077 (_SortedNodes[ _LevelsNumber ])[ _NodesNumber[ _LevelsNumber ] ] = GraphNodes( i ) ;
2078 _Sorted[ i ] = true ;
2080 NotSortedNumber -= 1 ;
2081 cdebug << GraphNodes( i )->Name() << " belongs to level "
2082 << _LevelsNumber << ". " << GraphNodes( i )->LinkedNodesSize() << " linkednodes" << endl ;
2083 // GraphNodes( i ) has the state "AllDataReady". We simulate the end of its execution :
2084 // So we loop over all nodes that have a link from that node
2085 // And we increment the number of input ports of GraphNodes( i )->LinkedNodes( j ) that this
2086 // execution will give a value in DecrInPortsNumber : "SomeDataReady"
2087 for ( j = 0 ; j < GraphNodes( i )->LinkedNodesSize() ; j++ ) {
2088 // OutputPorts of GraphNodes( i ) will satisfy
2089 // GraphNodes( i )->LinkedInPortsNumber( j ) InPorts of
2090 // GraphNodes( i )->LinkedNodes( j )
2091 GraphBase::StreamNode * aLinkedNode = GraphNodes( i )->LinkedNodes( j ) ;
2092 int aLinkedInPortsNumber = GraphNodes( i )->LinkedInPortsNumber( j ) ;
2093 cdebug << j << ". LinkedNode " << aLinkedNode->Name() ;
2094 if ( !aLinkedNode->IsDataFlowNode() && !aLinkedNode->IsDataStreamNode() ) {
2095 cdebug << " _DecrInPortsNumber[ "
2096 << GetGraphNodeIndex( aLinkedNode->Name() )
2098 << _DecrInPortsNumber[ GetGraphNodeIndex( aLinkedNode->Name() ) ]
2099 << " += " << aLinkedInPortsNumber ;
2100 _DecrInPortsNumber[ GetGraphNodeIndex( aLinkedNode->Name() ) ] += aLinkedInPortsNumber ;
2106 // If no node was found, that FlowGraph is not valid : if we try to execute it, that FlowGraph
2107 // will wait for data(s) from node(s) not executed or not executing for ever
2109 cdebug << "Loop detected level " << _LevelsNumber << endl ;
2110 return false ; // Loop in the Graph
2112 // cdebug << "Bilan level " << _LevelsNumber << " : " << endl ;
2113 bool ChangeCount = false ;
2114 // We update now the number of InPorts with a link that are waiting for a value
2115 for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
2116 if ( _DecrInPortsNumber[ i ] ) {
2117 // int prevcount = _CnxInPortsNumber[ i ] ;
2118 _CnxInPortsNumber[ i ] -= _DecrInPortsNumber[ i ] ;
2119 _DecrInPortsNumber[ i ] = 0 ;
2120 ChangeCount = true ;
2121 // cdebug << " " << GraphNodes( i )->Name() << " count " << prevcount
2122 // << " --> new count " << _CnxInPortsNumber[ i ] << endl ;
2125 // If there is no loop and if the number of InPorts with a link that are waiting for a value
2126 // does not change, the sort is finished. But there is also NotSortedNumber ...
2127 // if ( !ChangeCount )
2129 if ( NotSortedNumber ) {
2130 _LevelsNumber += 1 ;
2134 int AllSortedNodes = 0 ;
2135 _HeadNodes = _SortedNodes[ 0 ] ;
2136 _HeadNodesSize = _SortedNodes[ 0 ].size() ;
2137 // QueueNodes was used in the past in order to know if the execution of a graph is finished
2138 // But because of loop nodes that was changed. So that part of code is a "clutter"
2139 // Now a graph has finished its execution when the number of executing threads is zero
2140 _QueueNodes = _SortedNodes[ _LevelsNumber ] ;
2141 _QueueNodesSize = _SortedNodes[ _LevelsNumber ].size() ;
2142 for ( i = 0 ; i < _QueueNodesSize ; i++ ) {
2143 if ( !_QueueNodes[ i ]->IsGOTONode() ) {
2147 if ( i == _QueueNodesSize && _LevelsNumber ) {
2148 _QueueNodes = _SortedNodes[ _LevelsNumber - 1 ] ;
2149 _QueueNodesSize = _SortedNodes[ _LevelsNumber - 1 ].size() ;
2151 // Computation of the maximum number of threads == the maximum number of nodes of all levels
2152 for ( i = 0 ; i <= _LevelsNumber ; i++ ) {
2153 AllSortedNodes += _NodesNumber[ i ]+1 ;
2154 if ( _NodesNumber[ i ] + 1 > _ThreadsMax ) {
2155 _ThreadsMax = _NodesNumber[ i ] + 1 ;
2157 cdebug << _NodesNumber[ i ]+1 << " Nodes of level " << i << " : "
2158 << (_SortedNodes[ i ])[ 0 ]->Name() << endl ;
2159 for ( j = 1 ; j <= _NodesNumber[ i ] ; j++ ) {
2160 _ParallelExecutionNodes = true ;
2161 cdebug << " " << (_SortedNodes[ i ])[ j ]->Name()
2165 if ( _ParallelExecutionNodes ) {
2166 // cdebug << "Parallel Execution Nodes detected." << endl ;
2169 // cdebug << "No Parallel Execution Nodes detected." << endl ;
2171 if ( AllSortedNodes != GraphNodesSize() ) {
2172 cdebug << "Loop detected level " << _LevelsNumber << endl ;
2173 return false ; // Loop in the Graph
2176 for ( i= 0 ; i <= _NodesNumber[ 0 ] ; i++ ) {
2177 (_SortedNodes[ 0 ])[ i ]->HeadNode( true ) ;
2180 // Give a subgraph/substreamgraph number > 0 to HeadNodes (level 0)
2181 // There is no substreamgraph for nodes without StreamPorts
2182 for ( j = 0 ; j <= _NodesNumber[ 0 ] ; j++ ) {
2183 (_SortedNodes[ 0 ])[ j ]->Level( 0 ) ;
2184 (_SortedNodes[ 0 ])[ j ]->SortedIndex( j ) ;
2185 (_SortedNodes[ 0 ])[ j ]->SubGraph( j + 1 ) ;
2186 if ( (_SortedNodes[ 0 ])[ j ]->HasDataStream() ) {
2187 (_SortedNodes[ 0 ])[ j ]->SubStreamGraph( j + 1 ) ;
2190 (_SortedNodes[ 0 ])[ j ]->SubStreamGraph( -1 ) ;
2194 // Give a subgraph/substreamgraph number = 0 to all other nodes :
2195 // the SubGraph of that nodes is unknown
2196 // There is no substreamgraph for nodes without StreamPorts
2197 for ( i = 1 ; i <= _LevelsNumber ; i++ ) {
2198 for ( j = 0 ; j <= _NodesNumber[ i ] ; j++ ) {
2199 (_SortedNodes[ i ])[ j ]->Level( i ) ;
2200 (_SortedNodes[ i ])[ j ]->SortedIndex( j ) ;
2201 (_SortedNodes[ i ])[ j ]->SubGraph( 0 ) ;
2202 if ( (_SortedNodes[ i ])[ j ]->HasDataStream() ) {
2203 (_SortedNodes[ i ])[ j ]->SubStreamGraph( 0 ) ;
2206 (_SortedNodes[ i ])[ j ]->SubStreamGraph( -1 ) ;
2211 // Computation of independent SubGraphs which have NO link between them
2212 cdebug << endl << "Computation of SubGraphs" << endl ;
2213 bool Graphs = true ;
2215 for ( i = 0 ; i <= _LevelsNumber ; i++ ) {
2216 cdebug << endl << "LevelsNumber " << _LevelsNumber << " " << _NodesNumber[ i ]
2217 << " Nodes :" << endl ;
2218 for ( j = 0 ; j <= _NodesNumber[ i ] ; j++ ) {
2219 GraphBase::ComputingNode * aNode = (_SortedNodes[ i ])[ j ] ;
2220 cdebug << " " << aNode->Name() << " SubGraph " << aNode->SubGraph() << endl ;
2222 for ( k = 0 ; k < aNode->LinkedNodesSize() ; k++ ) {
2223 if ( aNode->LinkedNodes( k )->SubGraph() ) {
2224 if ( aNode->LinkedNodes( k )->SubGraph() != aNode->SubGraph() ) {
2225 // && aNode->LinkedNodes( k )->Level() == aNode->Level()+1 ) {
2226 // aNode->SubGraph( aNode->LinkedNodes( k )->SubGraph() ) ;
2227 int OldSub = aNode->SubGraph() ;
2228 int NewSub = aNode->LinkedNodes( k )->SubGraph() ;
2229 cdebug << " " << aNode->Name() << " changed SubGraph "
2230 << aNode->LinkedNodes( k )->SubGraph() << endl ;
2232 for ( l = 0 ; l <= _LevelsNumber ; l++ ) {
2234 for ( m = 0 ; m <= _NodesNumber[ l ] ; m++ ) {
2235 if ( (_SortedNodes[ l ])[ m ]->SubGraph() == OldSub ) {
2236 GraphBase::ComputingNode * aSubNode = (_SortedNodes[ l ])[ m ] ;
2237 aSubNode->SubGraph( NewSub ) ;
2245 cdebug << " Linked " << aNode->LinkedNodes( k )->Name()
2246 << " same SubGraph " << aNode->LinkedNodes( k )->SubGraph() << endl ;
2250 cdebug << " LinkedNode " << aNode->LinkedNodes( k )->Name()
2251 << " initial SubGraph " << aNode->SubGraph() << endl ;
2252 aNode->LinkedNodes( k )->SubGraph( aNode->SubGraph() ) ;
2264 cdebug << endl << "SubGraphs result : " << endl ;
2267 cdebug << endl << "One more time" << endl ;
2270 // Make a sequential renumbering of SubGraphs :
2271 _SubGraphsNumber = 0 ;
2272 int CurrGraphsNumber = 0;
2274 for ( k = 0 ; k <= _NodesNumber[ 0 ] ; k++ ) {
2275 if ( (_SortedNodes[ 0 ])[ k ]->SubGraph() > CurrGraphsNumber ) {
2276 CurrGraphsNumber = (_SortedNodes[ 0 ])[ k ]->SubGraph() ;
2277 _SubGraphsNumber += 1 ;
2278 for ( i = 0 ; i <= _LevelsNumber ; i++ ) {
2279 for ( j = 0 ; j <= _NodesNumber[ i ] ; j++ ) {
2280 if ( (_SortedNodes[ i ])[ j ]->SubGraph() == CurrGraphsNumber ) {
2281 (_SortedNodes[ i ])[ j ]->SubGraph( _SubGraphsNumber ) ;
2282 cdebug << "SubGraphsNumber " << _SubGraphsNumber << " " << " Level "
2283 << i << " : " << (_SortedNodes[ i ])[ j ]->Name()
2291 // cdebug << endl << "Computation of SubStreamGraphs" << endl ;
2292 for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
2293 GraphBase::ComputingNode * aNode = GraphNodes( i ) ;
2294 if ( aNode->SubStreamGraph() < 0 ) {
2295 // cdebug << "Graph " << aNode->Name() << " has NO streamport" << endl ;
2298 // cdebug << aNode->Name() << " SubGraph " << aNode->SubGraph() << " --> "
2299 // << aNode->LinkedStreamNodesSize() << " LinkedStreamNodes :" << endl ;
2300 for ( j = 0 ; j < aNode->LinkedStreamNodesSize() ; j++ ) {
2301 // cdebug << " " << aNode->LinkedStreamNodes( j )->Name() << endl ;
2306 // Computation of independent SubStreamGraphs which have NO StreamLink between them
2307 SubStreamGraphsNumber = 0 ;
2309 for ( ilevel = 0 ; ilevel <= _LevelsNumber ; ilevel++ ) {
2310 // Loop for _NodesNumber[ ilevel ] nodes of the level ilevel
2312 for ( jnode = 0 ; jnode <= _NodesNumber[ ilevel ] ; jnode++ ) {
2313 GraphBase::ComputingNode * aNode = (_SortedNodes[ ilevel ])[ jnode ] ;
2314 if ( aNode->SubStreamGraph() < 0 ) {
2315 // cdebug << "Graph " << aNode->SubStreamGraph() << " " << aNode->Name()
2316 // << " has NO streamport" << endl ;
2319 int CurStreamGraphsNumber ;
2320 if ( aNode->SubStreamGraph() > 0 ) {
2321 // cdebug << "SubStreamGraph " << aNode->SubStreamGraph() << " " << aNode->Name()
2322 // << " has streamport LinkedStreamNodesSize already in a SubStreamGraph" << endl ;
2323 CurStreamGraphsNumber = aNode->SubStreamGraph() ;
2326 CurStreamGraphsNumber = SubStreamGraphsNumber+1 ;
2329 while ( RetVal != CurStreamGraphsNumber ) {
2330 RetVal = CurStreamGraphsNumber ;
2331 aNode->SetSubStreamGraph( CurStreamGraphsNumber , RetVal ) ;
2332 if ( RetVal != CurStreamGraphsNumber ) {
2333 for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
2334 GraphBase::ComputingNode * aNode = GraphNodes( i ) ;
2335 if ( aNode->SubStreamGraph() == CurStreamGraphsNumber ) {
2336 aNode->SubStreamGraph( RetVal ) ;
2339 CurStreamGraphsNumber = RetVal ;
2342 if ( CurStreamGraphsNumber > SubStreamGraphsNumber ) {
2343 SubStreamGraphsNumber = CurStreamGraphsNumber ;
2349 // Make a sequential renumbering of SubGraphs :
2350 // cdebug << endl << "Last SubStreamGraphsNumber : " << SubStreamGraphsNumber << endl ;
2351 int CurrStreamGraphsNumber = 0 ;
2353 for ( CurrStreamGraphsNumber = 0 ; CurrStreamGraphsNumber <= SubStreamGraphsNumber ; CurrStreamGraphsNumber++ ) {
2354 bool SearchCurrStreamGraphsNumber = true ;
2355 for ( k = 0 ; k <= _LevelsNumber && SearchCurrStreamGraphsNumber ; k++ ) {
2357 for ( l = 0 ; l <= _NodesNumber[ k ] && SearchCurrStreamGraphsNumber ; l++ ) {
2358 if ( (_SortedNodes[ k ])[ l ]->SubStreamGraph() == CurrStreamGraphsNumber ) {
2359 SearchCurrStreamGraphsNumber = false ;
2361 if ( CurrStreamGraphsNumber != count ) {
2362 // cdebug << "CurrStreamGraphsNumber " << CurrStreamGraphsNumber << " count " << count
2363 // << " Level " << k << " n " << l << endl ;
2364 for ( i = k ; i <= _LevelsNumber ; i++ ) {
2365 for ( j = 0 ; j <= _NodesNumber[ i ] ; j++ ) {
2366 if ( (_SortedNodes[ i ])[ j ]->SubStreamGraph() == CurrStreamGraphsNumber ) {
2367 (_SortedNodes[ i ])[ j ]->SubStreamGraph( count ) ;
2368 // cdebug << "SubStreamGraphsNumber " << CurrStreamGraphsNumber << " --> " << count << " "
2369 // << " Level " << i << " : " << (_SortedNodes[ i ])[ j ]->Name() << endl ;
2371 else if ( (_SortedNodes[ i ])[ j ]->SubStreamGraph() > 0 ) {
2372 // cdebug << "SubStreamGraphsNumber " << (_SortedNodes[ i ])[ j ]->SubStreamGraph()
2373 // << " != " << CurrStreamGraphsNumber << " Level " << i << " : "
2374 // << (_SortedNodes[ i ])[ j ]->Name() << endl ;
2383 SubStreamGraphsNumber = count ;
2384 // cdebug << endl << "SubStreamGraphs result : " << SubStreamGraphsNumber << " SubStreamGraphs" << endl ;
2385 // int CurrStreamGraphsNumber ;
2386 // for ( CurrStreamGraphsNumber = 1 ; CurrStreamGraphsNumber <= SubStreamGraphsNumber ; CurrStreamGraphsNumber++ ) {
2387 // for ( ilevel = 0 ; ilevel <= _LevelsNumber ; ilevel++ ) {
2388 // for ( k = 0 ; k <= _NodesNumber[ ilevel ] ; k++ ) {
2389 // if ( (_SortedNodes[ ilevel ])[ k ]->SubStreamGraph() == CurrStreamGraphsNumber ) {
2390 // cdebug << "SubStreamGraphsNumber " << CurrStreamGraphsNumber << " : "
2391 // << (_SortedNodes[ ilevel ])[ k ]->Name() << endl ;
2399 ListPorts( *_Graph_fdebug , 0 ) ;
2402 cdebug_out << "GraphBase::Graph::Sort" << endl;
2406 bool GraphBase::Graph::ValidLoops() const {
2407 cdebug_in << "GraphBase::Graph::ValidLoops" << endl;
2410 GraphBase::ComputingNode * aNode ;
2411 for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
2412 aNode = GraphNodes( i ) ;
2413 if ( aNode->IsLoopNode() ) {
2414 GraphBase::LoopNode * aLoopNode = (GraphBase::LoopNode * ) aNode ;
2415 GraphBase::EndOfLoopNode * anEndLoopNode ;
2416 anEndLoopNode = (GraphBase::EndOfLoopNode * ) aLoopNode->CoupledNode() ;
2417 if ( !aLoopNode->CheckLoop( aLoopNode , anEndLoopNode ) ) {
2418 cdebug_out << "GraphBase::Graph::ValidLoops false aLoopNode " << aLoopNode->Name()
2422 else if ( !anEndLoopNode->CheckEndLoop( aLoopNode , anEndLoopNode ) ) {
2423 cdebug_out << "GraphBase::Graph::ValidLoops false anEndLoopNode " << anEndLoopNode->Name()
2429 cdebug_out << "GraphBase::Graph::ValidLoops true" << endl;
2433 // Controle de la coherence des noeuds de calcul
2434 // Enregistrement dans la liste des noeuds "tete" de graphe
2436 bool GraphBase::Graph::ComputingNodes() const {
2437 bool RetVal = true ;
2438 cdebug << "GraphExecutor::GraphControl::ComputingNodes ()" << endl;
2440 // list<GraphEditor::Node *> aComputingNodesList = _G->ComputingNodesList() ;
2441 // list<GraphEditor::Node *>::iterator aNode = aComputingNodesList.begin();
2442 // GraphEditor::Port * iP;
2444 // for (aNode = _G->ComputingNodesList().begin(); aNode !=_G->ComputingNodesList().end(); aNode++) {
2445 // while ( aNode != aComputingNodesList.end() ) {
2447 GraphBase::ComputingNode * aNode ;
2448 for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
2449 aNode = GraphNodes( i ) ;
2450 // Tous les ports d'entree de tous les noeuds de calcul sont bien connectes
2451 // Enregistrement eventuel dans la liste des noeuds "tete" de graphe
2452 // if ((*aNode)->GetNodeInPortsSize() == 0)
2453 // _headNodes.push_front(*aNode);
2455 for ( j = 1 ; j < aNode->GetNodeInPortsSize() ; j++ ) {
2456 const GraphBase::InPort *iP = aNode->GetNodeInPort(j);
2457 if ( iP->IsNotConnected() ){
2458 // cdebug << "Le port d'entree " << iP->PortName()
2459 // << " du noeud de calcul " << aNode->Name() << " du graphe "
2460 // << Name() << " n'est pas connecte "<< endl;
2466 // Tous les noeuds de calcul ont au moins un port de sortie connecte
2467 bool oneOutPortConnected = false;
2468 for ( j = 1 ; j < aNode->GetNodeOutPortsSize() ; j++) {
2469 const GraphBase::OutPort *iP = aNode->GetNodeOutPort(j);
2470 if ( iP->IsPortConnected() || iP->IsDataConnected() ){
2471 oneOutPortConnected = true ;
2475 // cdebug << "Le port de sortie " << iP->PortName()
2476 // << " du noeud de calcul " << aNode->Name() << " du graphe "
2477 // << Name() << " n'est pas connecte "<< endl;
2481 if (!oneOutPortConnected) {
2482 // cdebug << "Le noeud de calcul " << aNode->Name() << " du graphe "
2483 // << Name() << " n'a aucun port de sortie connecte "<< endl;
2484 // _computingError.push_front(2);
2487 // return _computingError.size () ;
2491 bool GraphBase::Graph::LinkLoopNodes(bool & NewLink ) {
2492 bool RetVal = true ;
2495 cdebug_in << "GraphBase::Graph::LinkLoopNodes()" << endl;
2496 for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
2497 GraphBase::ComputingNode * aNode = GraphNodes( i ) ;
2498 if ( aNode->IsLoopNode() ) {
2499 GraphBase::LoopNode * aLoopNode = (GraphBase::LoopNode * ) aNode ;
2500 for ( j = 0 ; j < aLoopNode->GetNodeInPortsSize() ; j++ ) {
2501 GraphBase::InPort *anInPort = aLoopNode->GetChangeNodeInPort(j) ;
2502 if ( !anInPort->IsGate() && anInPort->IsNotConnected() ) {
2503 if ( !AddLink( aLoopNode->CoupledNode() , aLoopNode->CoupledNode()->GetChangeNodeOutPort( j ) ,
2504 aLoopNode , anInPort ) ) {
2505 // cdebug << "GraphBase::Graph::CreateService AddLink ERROR " << aLoopNode->CoupledNode()->Name()
2506 // << "( " << aLoopNode->CoupledNode()->GetChangeNodeOutPort( j )->PortName() << " ) --> "
2507 // << aLoopNode->Name() << "( " << anInPort->PortName() << " )" << endl ;
2515 for ( j = 0 ; j < aLoopNode->CoupledNode()->GetNodeInPortsSize() ; j++ ) {
2516 GraphBase::InPort *anInPort = aLoopNode->CoupledNode()->GetChangeNodeInPort( j ) ;
2517 if ( !anInPort->IsGate() && anInPort->IsNotConnected() ) {
2518 if ( !AddLink( aLoopNode , aLoopNode->GetChangeNodeOutPort( j ) ,
2519 aLoopNode->CoupledNode() , anInPort ) ) {
2520 // cdebug << "GraphBase::Graph::CreateService AddLink ERROR " << aLoopNode->Name() << "( "
2521 // << aLoopNode->GetChangeNodeOutPort( j )->PortName() << " ) --> "
2522 // << aLoopNode->CoupledNode()->Name() << "( " << anInPort->PortName() << " )" << endl ;
2531 else if ( aNode->IsGOTONode() ) {
2532 GraphBase::GOTONode * aGOTONode = (GraphBase::GOTONode * ) aNode ;
2533 GraphBase::OutPort *anOutGate = aGOTONode->GetChangeNodeOutGate() ;
2534 if ( anOutGate->IsNotConnected() ) {
2535 RetVal = aGOTONode->CoupledNode() != NULL;
2537 RetVal = AddLink( aGOTONode , anOutGate ,
2538 aGOTONode->CoupledNode() , aGOTONode->CoupledNode()->GetChangeNodeInGate() );
2539 // cdebug << "GraphBase::Graph::CreateService AddLink ERROR " << aGOTONode->Name() << "( "
2540 // << anOutGate->PortName() << " ) --> " << aGOTONode->CoupledNode()->Name() << "( "
2541 // << aGOTONode->CoupledNode()->GetChangeNodeInGate()->PortName() << " )" << endl ;
2548 cdebug_out << "GraphBase::Graph::LinkLoopNodes() " << RetVal << endl;
2552 // Controle de la coherence des noeuds de calcul
2553 // Enregistrement dans la liste des noeuds "tete" de graphe
2555 bool GraphBase::Graph::DataServerNodes() const {
2557 cdebug << "GraphBase::Graph::DataServerNodes ()" << endl;
2559 // const GraphExecutor::InNode *DataFlowDatas = GetDataFlowDatas() ;
2560 int i , j , ierr = 0 ;
2562 // if ( DataFlowDatas == NULL ) {
2563 // MESSAGE( "No input data available in the DataFlow " << _G->Name() );
2567 // const GraphExecutor::InNode *DataFlowNode = _G->GetDataFlowNode() ;
2568 // MESSAGE( "DataServerNodes DataFlowNode : " << *DataFlowNode );
2570 // MESSAGE( "DataServerNodes DataFlowDatas : " << *DataFlowDatas );
2572 // cout are inversed because DataFlowDatas is a mirror node of the DataFlow
2574 ierr = CheckDataServerNodes() ;
2576 // list<GraphExecutor::InNode *> aComputingNodesList = _G->ComputingNodesList() ;
2577 // list<GraphExecutor::InNode *>::iterator aNode = aComputingNodesList.begin();
2578 if ( GraphNodesSize() == 0 ) {
2582 GraphBase::ComputingNode * aNode ;
2583 for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
2584 aNode = GraphNodes( i ) ;
2585 // while ( aNode != aComputingNodesList.end() ) {
2586 if ( aNode->IsFactoryNode() ) {
2587 GraphBase::FactoryNode * FaNode = (GraphBase::FactoryNode * ) aNode ;
2588 if ( !strlen( FaNode->Computer() ) ) {
2589 // cdebug << "ComputerName missing for node " << FaNode->Name() ;
2590 if ( !strlen( FaNode->Computer() ) ) {
2595 // cdebug << ". " << FaNode->Computer() << " will be used." << endl ;
2599 // For Outputs of the DataFlow :
2600 for ( j = 0 ; j < aNode->GetNodeOutPortsSize() ; j++ ) {
2601 if ( aNode->GetNodeOutPort(j)->IsNotConnected() ) {
2602 if ( aNode->GetNodeOutPort(j)->IsDataStream() ) {
2603 aNode->AddStreamLinkedNode( (GraphBase::ComputingNode *) this ) ;
2606 aNode->AddLinkedNode( (GraphBase::ComputingNode *) this ) ;
2613 // Chaque noeud dataserver ne possede qu'un seul port entree ou sortie et il est bien connecte
2615 // list<GraphExecutor::InNode *> aDataServerNodesList = _G->DataServerNodesList() ;
2616 // list<GraphExecutor::InNode *>::iterator it = aDataServerNodesList.begin() ;
2618 // for (it = _G->DataServerNodesList().begin(); it !=_G->DataServerNodesList().end(); it++){
2619 // while ( it != aDataServerNodesList.end() ) {
2620 // if ( (*it)->GetNodeOutPortsSize() && (*it)->GetNodeInPortsSize() ) {
2621 // cerr << "Erreur dans le noeud serveur de donnees "
2622 // << (*it)->Name() << " du graphe " << _G->Name() << endl;
2623 // cerr << "A la fois importation et exportation de donnees" << endl;
2624 // _dataServerError.push_front(1);
2627 // if ((*it)->GetNodeOutPortsSize()) {
2628 // if ((*it)->GetNodeOutPortsSize()==1){
2629 // if ( (*it)->GetNodeOutPort(0)->IsPortConnected() ){
2630 // _headNodes.push_front(*it);
2633 // cerr << "Le port de sortie du noeud serveur de donnees "
2634 // << (*it)->Name() << " du graphe " << _G->Name()
2635 // << " n'est pas connecte "<< endl;
2636 // _dataServerError.push_front(4);
2640 // cerr << "Plus d'une donnee importee du noeud serveur de donnees "
2641 // << (*it)->Name() << " du graphe " << _G->Name() << endl;
2642 // _dataServerError.push_front(2);
2646 // if ((*it)->GetNodeInPortsSize()) {
2647 // if ((*it)->GetNodeInPortsSize() > 1){
2648 // cerr << "Plus d'une donnee exportee vers le noeud serveur de donnees "
2649 // << (*it)->Name() << " du graphe " << _G->Name() << endl;
2650 // _dataServerError.push_front(3);
2653 // if ( !(*it)->GetNodeInPort(0)->IsPortConnected() ){
2654 // cerr << "Le port d'entree du noeud serveur de donnees "
2655 // << (*it)->Name() << " du graphe " << _G->Name()
2656 // << " n'est pas connecte "<< endl;
2657 // _dataServerError.push_front(5);
2663 // return _dataServerError.size ();
2664 return ( ierr == 0 ) ;
2667 SUPERV::GraphState GraphBase::Graph::PortState(
2668 const char* NodeName ,
2669 const char* ServiceParameterName ) {
2670 SUPERV::GraphState aRet = SUPERV::UndefinedState ;
2671 // cdebug << "GraphBase::Graph::PortState( " << NodeName << " , "
2672 // << ServiceParameterName << " )" << endl ;
2676 NodePort( NodeName , ServiceParameterName , &theNode , &aPort ) ;
2678 GraphBase::ComputingNode * aNode = GetChangeGraphNode( theNode ) ;
2680 GraphBase::OutPort *anOutPort ;
2681 anOutPort = aNode->GetChangeOutPort( aPort );
2682 if ( anOutPort == NULL ) {
2683 GraphBase::InPort *anInPort = aNode->GetChangeInPort( aPort );
2685 anOutPort = anInPort->GetOutPort() ;
2687 cdebug << "ERROR GraphBase::Graph::PortState OutPort/InPort not found --> "
2692 aRet = anOutPort->State() ;
2693 // cdebug << "GraphBase::Graph::PortState --> " << aRet << endl ;
2697 cdebug << "ERROR GraphBase::Graph::PortState Node not found --> " << aRet
2705 const CORBA::Any * GraphBase::Graph::PortInData( const char* ToNodeName ,
2706 const char* ToServiceParameterName ) {
2707 const CORBA::Any * aRet = new CORBA::Any() ;
2710 // cdebug_in << "GraphBase::Graph::PortInData " << ToNodeName << " "
2711 // << ToServiceParameterName << endl ;
2712 NodePort( ToNodeName , ToServiceParameterName , &theNode , &aPort ) ;
2714 GraphBase::ComputingNode * aNode = GetChangeGraphNode( theNode ) ;
2717 GraphBase::OutPort *anOutPort = NULL ;
2718 GraphBase::InPort *anInPort = aNode->GetChangeInPort( aPort );
2720 anOutPort = anInPort->GetOutPort() ;
2722 aRet = anOutPort->Value() ;
2723 cdebug << "Graph::PortInData OutPort value " << anOutPort->NodeName() << "("
2724 << anOutPort->PortName() << ") --> InPort " << anInPort->NodeName()
2725 << "(" << anInPort->PortName() << ") " << anInPort->PortStatus() << endl ;
2728 cdebug << "Graph::PortInData GraphBase::Graph::PortInData " << ToNodeName << " "
2729 << ToServiceParameterName << " ERROR no OutPort" << endl ;
2733 cdebug << "GraphBase::Graph::PortInData " << ToNodeName << " "
2734 << ToServiceParameterName << " ERROR no InPort" << endl ;
2738 cdebug << "GraphBase::Graph::PortInData " << ToNodeName << " "
2739 << ToServiceParameterName << " ERROR no Node" << endl ;
2743 // cdebug_out << "GraphBase::Graph::PortInData " << endl ;
2747 const CORBA::Any * GraphBase::Graph::PortOutData( const char* FromNodeName ,
2748 const char* FromServiceParameterName ) {
2749 const CORBA::Any * aRet = new CORBA::Any() ;
2752 // cdebug_in << "GraphBase::Graph::PortOutData " << FromNodeName << " "
2753 // << FromServiceParameterName << endl ;
2754 NodePort( FromNodeName , FromServiceParameterName , &theNode , &aPort ) ;
2756 GraphBase::ComputingNode * aNode = GetChangeGraphNode( theNode ) ;
2759 GraphBase::OutPort *anOutPort ;
2760 anOutPort = aNode->GetChangeOutPort( aPort );
2762 aRet = anOutPort->Value() ;
2765 cdebug << "GraphBase::Graph::PortOutData " << FromNodeName << " "
2766 << FromServiceParameterName << " ERROR no OutPort" << endl ;
2770 cdebug << "GraphBase::Graph::PortOutData " << FromNodeName << " "
2771 << FromServiceParameterName << " ERROR no Node" << endl ;
2775 // cdebug_out << "GraphBase::Graph::PortOutData " << endl ;
2779 SUPERV::ListOfStrings * GraphBase::Graph::LevelNodes(long aLevel ) {
2780 SUPERV::ListOfStrings_var RetVal = new SUPERV::ListOfStrings;
2781 if ( aLevel >= 0 && aLevel <= _LevelsNumber ) {
2783 RetVal->length( _NodesNumber[ aLevel ] + 1 );
2784 for ( i= 0 ; i <= _NodesNumber[ aLevel ] ; i++ ) {
2785 RetVal[i] = CORBA::string_dup( (_SortedNodes[ aLevel ])[ i ]->Name() ) ;
2788 return ( RetVal._retn() ) ;
2791 bool GraphBase::Graph::StartComponent(const int aThread ,
2792 const char * aComputerContainer ,
2793 const char * ComponentName ,
2794 Engines::Container_var & myContainer ,
2795 Engines::Component_var & objComponent ) {
2796 cdebug_in << aThread
2797 << " GraphBase::Graph::StartComponent " << aComputerContainer
2798 << " " << ComponentName << endl;
2799 bool RetVal = true ;
2801 SALOME_LifeCycleCORBA LCC( NamingService() ) ;
2802 objComponent = LCC.FindOrLoad_Component( aComputerContainer ,
2804 if ( CORBA::is_nil( objComponent ) ) {
2805 cdebug_out << aThread
2806 << " StartComponent cannot FindOrLoad " << aComputerContainer
2807 << " " << ComponentName << " ERROR" << endl;
2811 myContainer = LCC.FindContainer( aComputerContainer );
2812 if ( CORBA::is_nil( myContainer ) ) {
2813 cdebug_out << aThread
2814 << " GraphBase::Graph::StartComponent myContainer = LCC.FindContainer( '"
2815 << aComputerContainer << "' ) Container does not exist ERROR"
2820 cdebug_out << aThread << " GraphBase::Graph::StartComponent " << RetVal << endl;