]> SALOME platform Git repositories - modules/superv.git/blobdiff - src/GraphBase/DataFlowBase_Graph.cxx
Salome HOME
*** empty log message ***
[modules/superv.git] / src / GraphBase / DataFlowBase_Graph.cxx
index 81c0fe9fa2bf0d2bbc51e82915fa1d7c13bd065d..427db40b164152fc0c5b4e3c5ee79543f7a94bde 100644 (file)
@@ -27,7 +27,7 @@
 //  $Header:
 
 using namespace std;
-#include "DataFlowBase_Graph.hxx"
+#include "DataFlowBase_StreamGraph.hxx"
 
 #include "SALOME_LifeCycleCORBA.hxx"
 
@@ -40,11 +40,13 @@ GraphBase::Graph::Graph() :
 GraphBase::Graph::Graph( CORBA::ORB_ptr ORB ,
                          SALOME_NamingService* ptrNamingService ,
                          const char *DataFlowName ,
-                         const char * DebugFileName ) :
+                         int * Graph_prof_debug ,
+                         ofstream * Graph_fdebug ) :
+//                         const char * DebugFileName ) :
            DataNode( ORB ,ptrNamingService , DataFlowName ) {
-  Set_prof_debug( ORB , DebugFileName ) ;
-  cdebug << "GraphBase::Graph::Graph( " << DataFlowName << ")" << endl ;
   _Orb = CORBA::ORB::_duplicate( ORB ) ;
+  Set_prof_debug( Graph_prof_debug , Graph_fdebug ) ;
+  cdebug << "GraphBase::Graph::Graph( " << DataFlowName << ") GraphNodesSize() " << GraphNodesSize() << endl ;
   _GraphNodesSize = 0 ;
 }
 
@@ -61,16 +63,18 @@ GraphBase::Graph::Graph( CORBA::ORB_ptr ORB ,
                          const char * DataFlowAuthor ,
                          const char * DataFlowComputer ,
                          const char * DataFlowComment ,
-                         const char * DebugFileName ) :
+                         int * Graph_prof_debug ,
+                         ofstream * Graph_fdebug ) :
+//                         const char * DebugFileName ) :
            DataNode( ORB , ptrNamingService , DataFlowService ,
                      DataFlowName , DataFlowkind ,
                      DataFlowFirstCreation , DataFlowLastModification  ,
                      DataFlowEditorRelease , DataFlowAuthor , DataFlowComment ) {
   _Orb = CORBA::ORB::_duplicate( ORB ) ;
   _GraphNodesSize = 0 ;
-  Set_prof_debug( ORB , DebugFileName ) ;
+  Set_prof_debug( Graph_prof_debug , Graph_fdebug ) ;
   cdebug_in << "GraphBase::Graph::Graph" << endl ;
-  DataService( ORB , DataFlowService , Graph_prof_debug() , Graph_fdebug() ) ;
+  DataService( ORB , DataFlowService , Graph_prof_debug , Graph_fdebug ) ;
   cdebug_out << "GraphBase::Graph::Graph" << endl ;
 }
 
@@ -78,15 +82,11 @@ GraphBase::Graph::~Graph() {
   cdebug << "GraphBase::Graph::~Graph" << endl ;
 }
 
-void GraphBase::Graph::Set_prof_debug( CORBA::ORB_ptr ORB ,
-                                       const char * DebugFileName ) {
-  _Graph_prof_debug = 0 ;
-  if ( DebugFileName ) {
-    _Graph_fdebug = new ofstream( DebugFileName );
-    MESSAGE( endl << "Trace redirected to file " << DebugFileName << endl)
-    SetDebug( ORB , &_Graph_prof_debug , _Graph_fdebug ) ;
-  }
-  cdebug << "GraphBase::Graph::Set_prof_debug redirect Trace to file " << DebugFileName << endl ;
+void GraphBase::Graph::Set_prof_debug( int * Graph_prof_debug ,
+                                       ofstream * Graph_fdebug ) {
+  SetDebug( _Orb , Graph_prof_debug , Graph_fdebug ) ;
+  _Graph_prof_debug = Graph_prof_debug ;
+  _Graph_fdebug = Graph_fdebug ;
 }
 
 GraphBase::SNode * GraphBase::Graph::GetInfo() const {
@@ -95,6 +95,15 @@ GraphBase::SNode * GraphBase::Graph::GetInfo() const {
   Info->theInterfaceName = "" ;
   Info->theName = Name() ;
   Info->theKind = Kind() ;
+  if ( IsDataStreamNode() ) {
+    long Timeout ;
+    SUPERV::KindOfDataStreamTrace DataStreamTrace ;
+    double DeltaTime ;
+    ((GraphBase::StreamGraph * ) this)->StreamParams( Timeout , DataStreamTrace , DeltaTime ) ;
+    Info->theTimeout = Timeout ;
+    Info->theDataStreamTrace = DataStreamTrace ;
+    Info->theDeltaTime = DeltaTime ;
+  }
   Info->theService = *GetService() ;
   Info->theFirstCreation = FirstCreation() ;
   Info->theLastModification = LastModification() ;
@@ -115,6 +124,7 @@ GraphBase::ListOfNodes * GraphBase::Graph::GetNodes() const {
   GraphBase::ListOfNodes * _list_nodes = 
                                   new GraphBase::ListOfNodes;
 
+  cdebug_in << "GraphBase::Graph::GetNodes" << endl ;
   // All the nodes from _InNodes are taken
 //  vector< InNode *> Nodes = InNodes() ;
 
@@ -192,10 +202,100 @@ GraphBase::ListOfNodes * GraphBase::Graph::GetNodes() const {
         else {
           (*_list_nodes)[ind].theCoupledNode = CORBA::string_dup( "" ) ;
         }
-        (*_list_nodes)[ind].theDataStreamInArgsNumber = aCNode->DataStreamInPortsNumber() ;
-        (*_list_nodes)[ind].theDataStreamOutArgsNumber = aCNode->DataStreamOutPortsNumber() ;
+//        (*_list_nodes)[ind].theDataStreamInArgsNumber = aCNode->DataStreamInPortsNumber() ;
+//        (*_list_nodes)[ind].theDataStreamOutArgsNumber = aCNode->DataStreamOutPortsNumber() ;
+
+        (*_list_nodes)[ind].theListOfInDataStreams.resize( aCNode->DataStreamInPortsNumber() ) ;
+        cdebug << "GraphBase::Graph::GetNodes " << aCNode->Name() << " " << aCNode->DataStreamInPortsNumber() << " DataStreamInPortsNumber" << endl ;
+        int iostream ;
+        int streamind = 0 ;
+        for ( iostream = 0 ; iostream < aCNode->GetNodeInPortsSize() ; iostream++ ) {
+          const GraphBase::InPort * anInPort ;
+          anInPort = aCNode->GetNodeInPort( iostream ) ;
+          if ( anInPort->IsDataStream() ) {
+            cdebug << "GraphBase::Graph::GetNodes In" << iostream << " " << aCNode->Name() << " " << anInPort->NodeName() << " " << anInPort->PortName()
+                   << endl ;
+            (*_list_nodes)[ind].theListOfInDataStreams[streamind].theDataStreamParameter.Parametertype = StringToDataStreamType( anInPort->PortType() ) ;
+            (*_list_nodes)[ind].theListOfInDataStreams[streamind].theDataStreamParameter.Parametername = CORBA::string_dup( anInPort->PortName() ) ;
+            (*_list_nodes)[ind].theListOfInDataStreams[streamind].theDataStreamParameter.Parameterdependency = anInPort->Dependency() ;
+            SUPERV::KindOfSchema        aKindOfSchema ;
+            SUPERV::KindOfInterpolation aKindOfInterpolation ;
+            SUPERV::KindOfExtrapolation aKindOfExtrapolation ;
+            ((GraphBase::InDataStreamPort * ) anInPort)->Params( aKindOfSchema , aKindOfInterpolation , aKindOfExtrapolation ) ;
+            (*_list_nodes)[ind].theListOfInDataStreams[streamind].theKindOfSchema = aKindOfSchema ;
+            (*_list_nodes)[ind].theListOfInDataStreams[streamind].theKindOfInterpolation = aKindOfInterpolation ;
+            (*_list_nodes)[ind].theListOfInDataStreams[streamind].theKindOfExtrapolation = aKindOfExtrapolation ;
+            cdebug << "GraphBase::Graph::GetNodes " << aCNode->Name() << " " << anInPort->NodeName() << " " << anInPort->PortName() << " "
+                   <<  anInPort->Dependency() << " " << aKindOfSchema << " " << aKindOfInterpolation << " " << aKindOfExtrapolation << " list_nodes "
+                   << (*_list_nodes)[ind].theListOfInDataStreams[streamind].theDataStreamParameter.Parametername << " "
+                   << (*_list_nodes)[ind].theListOfInDataStreams[streamind].theDataStreamParameter.Parametertype << " "
+                   << (*_list_nodes)[ind].theListOfInDataStreams[streamind].theDataStreamParameter.Parameterdependency << " "
+                   << (*_list_nodes)[ind].theListOfInDataStreams[streamind].theKindOfSchema << " "
+                   << (*_list_nodes)[ind].theListOfInDataStreams[streamind].theKindOfInterpolation << " "
+                   << (*_list_nodes)[ind].theListOfInDataStreams[streamind].theKindOfExtrapolation << " " << endl ;
+            streamind += 1 ;
+         }
+          else {
+            cdebug << "GraphBase::Graph::GetNodes " << aCNode->Name() << " " << anInPort->NodeName() << " " << anInPort->PortName() << " "
+                   << anInPort->Kind() << " IsDataStream " << anInPort->IsDataStream() << endl ;
+         }
+       }
+
+        (*_list_nodes)[ind].theListOfOutDataStreams.resize( aCNode->DataStreamOutPortsNumber() ) ;
+        cdebug << "GraphBase::Graph::GetNodes " << aCNode->Name() << " " << aCNode->DataStreamOutPortsNumber() << " DataStreamOutPortsNumber" << endl ;
+        streamind = 0 ;
+        for ( iostream = 0 ; iostream < aCNode->GetNodeOutPortsSize() ; iostream++ ) {
+          const GraphBase::OutPort * anOutPort ;
+          anOutPort = aCNode->GetNodeOutPort( iostream ) ;
+          if ( anOutPort->IsDataStream() ) {
+            cdebug << "GraphBase::Graph::GetNodes Out" << iostream << " " << aCNode->Name() << " " << anOutPort->NodeName() << " " << anOutPort->PortName() << " "
+                   << endl ;
+            (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theDataStreamParameter.Parametertype = StringToDataStreamType( anOutPort->PortType() ) ;
+            (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theDataStreamParameter.Parametername = CORBA::string_dup( anOutPort->PortName() ) ;
+            (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theDataStreamParameter.Parameterdependency = anOutPort->Dependency() ;
+            long aNumberOfValues = ((GraphBase::OutDataStreamPort * ) anOutPort)->NumberOfValues() ;
+            (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theNumberOfValues = aNumberOfValues ;
+            cdebug << "GraphBase::Graph::GetNodes " << aCNode->Name() << " " << anOutPort->NodeName() << " " << anOutPort->PortName() << " "
+                   <<  anOutPort->Dependency() << " " << aNumberOfValues << " list_nodes "
+                   << (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theDataStreamParameter.Parametername << " "
+                   << (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theDataStreamParameter.Parametertype << " "
+                   << (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theDataStreamParameter.Parameterdependency << " "
+                   << (*_list_nodes)[ind].theListOfOutDataStreams[streamind].theNumberOfValues << endl ;
+            streamind += 1 ;
+         }
+          else {
+            cdebug << "GraphBase::Graph::GetNodes " << aCNode->Name() << " " << anOutPort->NodeName() << " " << anOutPort->PortName() << " "
+                   << anOutPort->Kind() << " IsDataStream " << anOutPort->IsDataStream() << endl ;
+         }
+       }
+
         (*_list_nodes)[ind].theService = *aCNode->GetService();
-//        (*_list_nodes)[ind].theListOfParameters = *aCNode->GetListOfParameters() ;
+        cdebug << "GraphBase::Graph::GetNodes theService " << &(*_list_nodes)[ind].theService.ServiceName << endl ;
+        unsigned int i ;
+        for ( i = 0 ; i < (*_list_nodes)[ind].theService.ServiceinParameter.length() ; i++ ) {
+          cdebug << "     In" << i << " " << &(*_list_nodes)[ind].theService.ServiceinParameter[i].Parametername
+                 << " " << (*_list_nodes)[ind].theService.ServiceinParameter[i].Parametername
+                 << " " << &(*_list_nodes)[ind].theService.ServiceinParameter[i].Parametertype
+                 << " " << (*_list_nodes)[ind].theService.ServiceinParameter[i].Parametertype << endl ;
+       }
+        for ( i = 0 ; i < (*_list_nodes)[ind].theService.ServiceoutParameter.length() ; i++ ) {
+          cdebug << "     Out" << i << " " << &(*_list_nodes)[ind].theService.ServiceoutParameter[i].Parametername
+                 << " " << (*_list_nodes)[ind].theService.ServiceoutParameter[i].Parametername
+                 << " " << &(*_list_nodes)[ind].theService.ServiceoutParameter[i].Parametertype
+                 << " " << (*_list_nodes)[ind].theService.ServiceoutParameter[i].Parametertype << endl ;
+       }
+        for ( i = 0 ; i < (*_list_nodes)[ind].theService.ServiceinDataStreamParameter.length() ; i++ ) {
+          cdebug << "     InDataStream" << i << " " << &(*_list_nodes)[ind].theService.ServiceinDataStreamParameter[i].Parametername
+                 << " " << (*_list_nodes)[ind].theService.ServiceinDataStreamParameter[i].Parametername
+                 << " " << &(*_list_nodes)[ind].theService.ServiceinDataStreamParameter[i].Parametertype
+                 << " " << (*_list_nodes)[ind].theService.ServiceinDataStreamParameter[i].Parametertype << endl ;
+       }
+        for ( i = 0 ; i < (*_list_nodes)[ind].theService.ServiceoutDataStreamParameter.length() ; i++ ) {
+          cdebug << "     OutDataStream" << i << " " << &(*_list_nodes)[ind].theService.ServiceoutDataStreamParameter[i].Parametername
+                 << " " << (*_list_nodes)[ind].theService.ServiceoutDataStreamParameter[i].Parametername
+                 << " " << &(*_list_nodes)[ind].theService.ServiceoutDataStreamParameter[i].Parametertype
+                 << " " << (*_list_nodes)[ind].theService.ServiceoutDataStreamParameter[i].Parametertype << endl ;
+       }
         if ( aCNode->IsOneOfInLineNodes() ) {
           GraphBase::InLineNode * aINode = (GraphBase::InLineNode * ) aCNode ;
           GraphBase::LoopNode * aLNode = NULL ;
@@ -244,6 +344,7 @@ GraphBase::ListOfNodes * GraphBase::Graph::GetNodes() const {
       }
     }
   }
+  cdebug_out << "GraphBase::Graph::GetNodes" << endl ;
   return _list_nodes ;
 }
 
@@ -380,24 +481,27 @@ GraphBase::ListOfLinks * GraphBase::Graph::GetDatas() const {
 }
 
 bool GraphBase::Graph::AddNode( GraphBase::ComputingNode * aNode ) {
-  cdebug_in << "GraphBase::Graph::AddNode "  << (void *) aNode << " "
-            << aNode->Name() << " " << aNode->ServiceName() << endl;
+  cdebug_in << "GraphBase::Graph::AddNode "  << (void *) aNode << " " << aNode->Name() << " " << aNode->ServiceName() << endl;
   bool RetVal = false ;
   int index = GetGraphNodeIndex( aNode->Name() ) ;
   if ( index < 0 ) {
+    cdebug << "GraphBase::Graph::AddNode " << _GraphNodesSize << " nodes + 1" << endl ;
     _GraphNodes.resize( _GraphNodesSize+1 ) ;
     _GraphNodes[ _GraphNodesSize ] = aNode ;
     SetGraphNodeIndex( aNode->Name() , _GraphNodesSize ) ;
     _GraphNodesSize += 1 ;
     RetVal = true ;
-  }
-//  cout << "GraphBase::Graph::AddNode(" << aNode->ComponentName() << " , "
-//       << aNode->Name() << ")" << endl;
-  int i ;
-  cdebug << "GraphBase::Graph::AddNode Known nodes :" << endl ;
-  for ( i = 0 ; i < _GraphNodesSize ; i++ ) {
-    cdebug << i << ". " << GetGraphNode( i )->Name() << " "
-           << _MapOfGraphNodes[ GetGraphNode( i )->Name() ] - 1 << endl ;
+    int i ;
+    cdebug << "GraphBase::Graph::AddNode " << _GraphNodesSize << " Known nodes :" << endl ;
+    for ( i = 0 ; i < _GraphNodesSize ; i++ ) {
+      const GraphBase::ComputingNode * aKnownNode = GetGraphNode( i ) ;
+      if ( aKnownNode ) {
+        cdebug << i << ". " << aKnownNode->Name() << " " << _MapOfGraphNodes[ GetGraphNode( i )->Name() ] - 1 << endl ;
+      }
+      else {
+        cdebug << i << ". ERROR" << endl ;
+      }
+    }
   }
   cdebug_out << "GraphBase::Graph::AddNode " << _GraphNodesSize << " Nodes. "
              << aNode->ServiceName() << endl;
@@ -659,7 +763,8 @@ bool GraphBase::Graph::AddLink( GraphBase::ComputingNode *fromNode ,
   cdebug_in << "GraphBase::Graph::AddLink(" << fromNode->Name() << "("
             << fromPort->PortName() << ") ---> " << toNode->Name() << "("
             << toPort->PortName() << ") )" << endl;
-  if ( !fromNode->IsDataFlowNode() && !toNode->IsDataFlowNode() &&
+  if ( !fromNode->IsDataFlowNode() && !fromNode->IsDataStreamNode() &&
+       !toNode->IsDataFlowNode() && !toNode->IsDataStreamNode() &&
        toPort->GetOutPort() ) {
     if ( !strcmp( toPort->GetOutPort()->NodePortName() ,
                   fromPort->NodePortName() ) ) {
@@ -717,7 +822,9 @@ bool GraphBase::Graph::AddLink( GraphBase::ComputingNode *fromNode ,
       cdebug_out << "GraphBase::Graph::AddLink" << endl;
       return false ;
     }
-    toPort->Kind( SUPERV::EndSwitchParameter ) ;
+    if ( !toPort->IsDataStream() ) {
+      toPort->Kind( SUPERV::EndSwitchParameter ) ;
+    }
   }
   else if ( !fromPort->AddInPort( toPort ) ) { // --> MapOfInports in the OutPort
     cdebug << "!fromPort->AddLink Error." << endl ;
@@ -725,7 +832,8 @@ bool GraphBase::Graph::AddLink( GraphBase::ComputingNode *fromNode ,
     return false ;
   }
 
-  if ( fromNode->IsDataFlowNode() && toPort->IsDataConnected() ) {
+  if ( ( fromNode->IsDataFlowNode() || fromNode->IsDataStreamNode() ) &&
+       toPort->IsDataConnected() ) {
     toPort->RemoveOutPort() ;
   }
 
@@ -763,7 +871,8 @@ bool GraphBase::Graph::AddLink( GraphBase::ComputingNode *fromNode ,
     }
     fromPort->PortStatus( PortConnected ); // GOTO - Loop
   }
-  else if ( fromNode->IsDataFlowNode() || toNode->IsDataFlowNode() ) {
+  else if ( fromNode->IsDataFlowNode() || fromNode->IsDataStreamNode() ||
+            toNode->IsDataFlowNode() || toNode->IsDataStreamNode() ) {
     cdebug << "AddLink IsDataFlowNode fromPort->PortStatus( DataConnected ) "
            << fromNode->Name() << " " << fromPort->PortName() << endl ;
     fromPort->PortStatus( DataConnected );
@@ -779,11 +888,13 @@ bool GraphBase::Graph::AddLink( GraphBase::ComputingNode *fromNode ,
     }
   }
   if ( fromNode->IsSwitchNode() ) {
-    if ( fromPort->IsInLine() && toPort->IsGate() && !toNode->IsEndSwitchNode() ) {
-      fromPort->Kind( SUPERV::SwitchParameter ) ;
-    }
-    else if ( !fromPort->IsGate() && !toPort->IsGate() ){
-      fromPort->Kind( SUPERV::InLineParameter ) ;
+    if ( !fromPort->IsDataStream() ) {
+      if ( fromPort->IsInLine() && toPort->IsGate() && !toNode->IsEndSwitchNode() ) {
+        fromPort->Kind( SUPERV::SwitchParameter ) ;
+      }
+      else if ( !fromPort->IsGate() && !toPort->IsGate() ){
+        fromPort->Kind( SUPERV::InLineParameter ) ;
+      }
     }
     if ( fromPort->IsGate() && !toNode->IsEndSwitchNode() ) {
       GraphBase::InLineNode * anEndSwitchNode ;
@@ -1171,9 +1282,17 @@ bool GraphBase::Graph::CreateService() {
   GraphBase::ComputingNode * aToNode ;
   int dostore ;
   int innbr ;
+  int instreamnbr ;
   int outnbr ;
+  int outstreamnbr ;
   vector< SUPERV::KindOfPort > InPortsKind ;
+  vector< SALOME_ModuleCatalog::DataStreamDependency > InDataStreamDependency ;
+  vector< SUPERV::KindOfSchema > InKindOfSchema ;
+  vector< SUPERV::KindOfInterpolation > InKindOfInterpolation ;
+  vector< SUPERV::KindOfExtrapolation > InKindOfExtrapolation ;
   vector< SUPERV::KindOfPort > OutPortsKind ;
+  vector< SALOME_ModuleCatalog::DataStreamDependency > OutDataStreamDependency ;
+  vector< long > OutNumberOfValues ;
   for ( dostore = 0 ; dostore <= 2 ; dostore++ ) {
     if ( dostore == 1 ) {
       aService.ServiceName = Name() ;
@@ -1182,9 +1301,36 @@ bool GraphBase::Graph::CreateService() {
       aService.ServiceoutParameter.length( 0 ) ;
       aService.ServiceoutParameter.length( outnbr ) ;
       InPortsKind.resize( innbr ) ;
+      InDataStreamDependency.resize( innbr ) ;
+      InKindOfSchema.resize( innbr ) ;
+      InKindOfInterpolation.resize( innbr ) ;
+      InKindOfExtrapolation.resize( innbr ) ;
       OutPortsKind.resize( outnbr ) ;
+      OutDataStreamDependency.resize( outnbr ) ;
+      OutNumberOfValues.resize( outnbr ) ;
+    }
+    else if ( dostore == 2 ) {
+      cdebug << "GraphBase::Graph::CreateService ->DataService innbr " << innbr << " instreamnbr " << instreamnbr << " outnbr " << outnbr
+             << " outstreamnbr " << outstreamnbr << endl ;
+      DataService( _Orb , aService , Graph_prof_debug() , Graph_fdebug() ) ;
+      aService.ServiceinParameter.length( innbr + instreamnbr ) ;
+      aService.ServiceoutParameter.length( outnbr + outstreamnbr ) ;
+      InPortsKind.resize( innbr + instreamnbr ) ;
+      InDataStreamDependency.resize( innbr + instreamnbr ) ;
+      InKindOfSchema.resize( innbr + instreamnbr ) ;
+      InKindOfInterpolation.resize( innbr + instreamnbr ) ;
+      InKindOfExtrapolation.resize( innbr + instreamnbr ) ;
+      OutPortsKind.resize( outnbr + outstreamnbr ) ;
+      OutDataStreamDependency.resize( outnbr + outstreamnbr ) ;
+      OutNumberOfValues.resize( outnbr + outstreamnbr ) ;
+    }
+    if ( dostore == 0 ) {
+      innbr = 0 ;
+      instreamnbr = 0 ;
+      outnbr = 0 ;
+      outstreamnbr = 0 ;
     }
-    if ( dostore <= 1 ) {
+    if ( dostore == 1 ) {
       innbr = 0 ;
       outnbr = 0 ;
     }
@@ -1193,6 +1339,7 @@ bool GraphBase::Graph::CreateService() {
       for ( j = 0 ; j < aToNode->GetNodeInPortsSize() ; j++ ) {
         GraphBase::InPort *anInPort = aToNode->GetChangeNodeInPort(j) ;
         bool isfromcouplednode = false ;
+        cdebug << "GraphBase::Graph::CreateService aToNode " << aToNode->Name() << " InPort" << j << endl ;
         if ( anInPort->IsConnected() && anInPort->GetOutPort() ) {
           GraphBase::ComputingNode * aFromNode = GetChangeGraphNode( anInPort->GetOutPort()->NodeName() ) ;
           if ( aFromNode->IsEndLoopNode() && ((GraphBase::EndOfLoopNode * ) aFromNode)->CoupledNode() == aToNode ) {
@@ -1208,17 +1355,30 @@ bool GraphBase::Graph::CreateService() {
               cdebug << "DataConnected from " <<  *(anInPort->GetOutPort() ) ;
            }
             cdebug << endl ;
-            innbr += 1 ;
+            if ( anInPort->IsDataStream() ) {
+              instreamnbr += 1 ;
+           }
+            else {
+              innbr += 1 ;
+           }
          }
           else if ( ( dostore == 1 && !anInPort->IsDataStream() ) ||
                     ( dostore == 2 && anInPort->IsDataStream() ) ) {
             aService.ServiceinParameter[innbr].Parametertype = CORBA::string_dup( anInPort->PortType() ) ;
             aService.ServiceinParameter[innbr].Parametername = CORBA::string_dup( anInPort->NodePortName() ) ;
-            InPortsKind[ innbr++ ] = anInPort->Kind() ;
-            cdebug << "In " << aService.ServiceinParameter[ innbr - 1 ].Parametername << " " << anInPort->Kind() << endl ;
+            InPortsKind[ innbr ] = anInPort->Kind() ;
+            InDataStreamDependency[ innbr ] = anInPort->Dependency() ;
+            if ( dostore == 2 && anInPort->IsDataStream() ) {
+              ((GraphBase::InDataStreamPort * ) anInPort)->Params( InKindOfSchema[ innbr ] ,
+                                                                   InKindOfInterpolation[ innbr ] ,
+                                                                   InKindOfExtrapolation[ innbr ] ) ;
+           }
+            cdebug << "In" << innbr << " " << aService.ServiceinParameter[ innbr ].Parametername << " "
+                   << anInPort->Kind() << endl ;
+            innbr += 1 ;
          }
         }
-        else {
+        else if ( dostore == 0 ) {
           cdebug << "CreateService " << aToNode->Name() << " Input port " << anInPort->PortName() ;
           if ( anInPort->IsConnected() ) {
             cdebug << " is connected " ;
@@ -1241,27 +1401,38 @@ bool GraphBase::Graph::CreateService() {
       GraphBase::ComputingNode * aFromNode = aToNode ;
       for ( j = 0 ; j < aFromNode->GetNodeOutPortsSize() ; j++ ) {
         GraphBase::OutPort *anOutPort = aFromNode->GetChangeNodeOutPort(j) ;
-        cdebug << "CreateService Node " << aFromNode->Name() << ". Output port[" << j << "] ";
-        if ( anOutPort ) {
-          cdebug << anOutPort->PortName() << " " << anOutPort->ServicesParameterType() << endl ;
-       }
-        else {
-          cdebug << " NULL" << endl ;
-       }
+//        cdebug << "CreateService Node " << aFromNode->Name() << ". Output port[" << j << "] ";
+//        if ( anOutPort ) {
+//          cdebug << anOutPort->PortName() << " " << anOutPort->ServicesParameterType() << endl ;
+//     }
+//        else {
+//          cdebug << " NULL" << endl ;
+//     }
         if ( !aFromNode->IsGOTONode() ) {
           if ( !anOutPort->IsGate() && 
                ( anOutPort->IsNotConnected() || anOutPort->IsDataConnected() ) ) {
             if ( dostore == 0 ) {
-              cdebug << "CreateService " << aFromNode->Name() << " Output port "
-                     << anOutPort->PortName() << endl ;
-              outnbr += 1 ;
+//              cdebug << "CreateService " << aFromNode->Name() << " Output port "
+//                     << anOutPort->PortName() << endl ;
+              if ( anOutPort->IsDataStream() ) {
+                outstreamnbr += 1 ;
+             }
+              else {
+                outnbr += 1 ;
+             }
            }
             else if ( ( dostore == 1 && !anOutPort->IsDataStream() ) ||
                       ( dostore == 2 && anOutPort->IsDataStream() ) ) {
               aService.ServiceoutParameter[outnbr].Parametertype = CORBA::string_dup( anOutPort->PortType() ) ;
               aService.ServiceoutParameter[outnbr].Parametername = CORBA::string_dup( anOutPort->NodePortName() ) ;
-              OutPortsKind[ outnbr++ ] = anOutPort->Kind() ;
-              cdebug << "Out " << aService.ServiceoutParameter[ outnbr - 1 ].Parametername << " " << anOutPort->Kind() << endl ;
+              OutPortsKind[ outnbr ] = anOutPort->Kind() ;
+              OutDataStreamDependency[ outnbr ] = anOutPort->Dependency() ;
+              if ( dostore == 2 && anOutPort->IsDataStream() ) {
+                OutNumberOfValues[ outnbr ] = ((GraphBase::OutDataStreamPort * ) anOutPort)->NumberOfValues() ;
+             }
+              cdebug << "Out" << outnbr << " " << aService.ServiceoutParameter[ outnbr ].Parametername << " "
+                     << anOutPort->Kind() << endl ;
+              outnbr += 1 ;
            }
          }
         }
@@ -1269,36 +1440,102 @@ bool GraphBase::Graph::CreateService() {
     }
   }
 
-//  MESSAGE( "DataFlowNode ServiceName " << aService.ServiceName );
-//  for ( i = 0 ; i < innbr ; i++ ) {
-//    cout << "aService.ServiceinParameter[" << i << "].Parametertype "
-//         << aService.ServiceinParameter[i].Parametertype << endl ;
-//    cout << "aService.ServiceinParameter[" << i << "].Parametername "
-//         << aService.ServiceinParameter[i].Parametername << endl ;
-//  }
-//  for ( i = 0 ; i < outnbr ; i++ ) {
-//    cout << "aService.ServiceoutParameter[" << i << "].Parametertype "
-//         << aService.ServiceoutParameter[i].Parametertype << endl ;
-//    cout << "aService.ServiceoutParameter[" << i << "].Parametername "
-//         << aService.ServiceoutParameter[i].Parametername << endl ;
-//  }
+  MESSAGE( "DataFlowNode ServiceName " << aService.ServiceName );
+  for ( i = 0 ; i < innbr ; i++ ) {
+    cdebug << "aService.ServiceinParameter[" << i << "].Parametertype "
+         << aService.ServiceinParameter[i].Parametertype << " Parametername "
+         << aService.ServiceinParameter[i].Parametername << " " << InPortsKind[ i ] << endl ;
+    if ( InPortsKind[ i ] != SUPERV::DataStreamParameter ) {
+      cdebug << "NodeInPort[" << i << "] " << *GetChangeNodeInPort( i ) << endl ;
+    }
+  }
+  for ( i = 0 ; i < outnbr ; i++ ) {
+    cdebug << "aService.ServiceoutParameter[" << i << "].Parametertype "
+         << aService.ServiceoutParameter[i].Parametertype << " Parametername "
+         << aService.ServiceoutParameter[i].Parametername << " " << OutPortsKind[ i ] << endl ;
+    if ( OutPortsKind[ i ] != SUPERV::DataStreamParameter ) {
+      cdebug << "NodeOutPort[" << i << "] " << *GetChangeNodeOutPort( i ) << endl ;
+    }
+  }
 
-  DataService( _Orb , aService , Graph_prof_debug() , Graph_fdebug() ) ;
+//  DataService( _Orb , aService , InPortsKind , OutPortsKind , Graph_prof_debug() , Graph_fdebug() ) ;
   for ( i = 0 ; i < innbr ; i++ ) {
-    GetChangeNodeInPort( i )->Kind( InPortsKind[ i ] ) ;
-    cdebug << "In " << GetChangeNodeInPort( i )->PortName() << " " << GetChangeNodeInPort( i )->Kind() << endl ;
-    _DataFlowDataPorts->GetChangeNodeOutPort( i )->Kind( InPortsKind[ i ] ) ;
-    cdebug << "ReversedIn " << _DataFlowDataPorts->GetChangeNodeOutPort( i )->PortName() << " " << _DataFlowDataPorts->GetChangeNodeOutPort( i )->Kind() << endl ;
+    if ( InPortsKind[ i ] == SUPERV::DataStreamParameter ) {
+      GraphBase::InDataStreamPort * anInPort = AddInDataStreamPort( aService.ServiceinParameter[ i ].Parametername ,
+                                                                    StringToDataStreamType( aService.ServiceinParameter[ i ].Parametertype ) ,
+                                                                    InDataStreamDependency[ i ] ,
+                                                                    SUPERV::DataStreamParameter ) ;
+      anInPort->SetParams( InKindOfSchema[ i ] ,
+                           InKindOfInterpolation[ i ] ,
+                           InKindOfExtrapolation[ i ] ) ;
+// NOT A BUG : AddOutPort for an inport (Reversed service)
+      anInPort = (GraphBase::InDataStreamPort * ) _DataFlowDataPorts->AddOutPort( _Orb , NamePtr() ,
+                                                                                  Kind() ,
+                                                                                  aService.ServiceinParameter[ i ].Parametername ,
+                                                                                  aService.ServiceinParameter[ i ].Parametertype ,
+                                                                                  SUPERV::DataStreamParameter ,
+//                                                                                  _DataFlowDataPorts->DataStreamOutPortsNumber() ,
+                                                                                  _Graph_prof_debug , _Graph_fdebug ) ;
+      anInPort->Dependency( InDataStreamDependency[ i ] ) ;
+// Attention : revoir les reversed DataStreamPorts
+//      anInPort->SetParams( InKindOfSchema[ i ] ,
+//                           InKindOfInterpolation[ i ] ,
+//                           InKindOfExtrapolation[ i ] ) ;
+      cdebug << "InStreamPort " << GetChangeNodeInPort( i )->PortName() << " " << GetChangeNodeInPort( i )->Kind() << endl ;
+      cdebug << "ReversedInStreamPort " << _DataFlowDataPorts->GetChangeNodeOutPort( i )->PortName() << " " << _DataFlowDataPorts->GetChangeNodeOutPort( i )->Kind()
+             << endl ;
+    }
+    else {
+      GetChangeNodeInPort( i )->Kind( InPortsKind[ i ] ) ;
+      _DataFlowDataPorts->GetChangeNodeOutPort( i )->Kind( InPortsKind[ i ] ) ;
+      GetChangeNodeInPort( i )->Dependency( InDataStreamDependency[ i ] ) ;
+      _DataFlowDataPorts->GetChangeNodeOutPort( i )->Dependency( InDataStreamDependency[ i ] ) ;
+      cdebug << "InPort " << GetChangeNodeInPort( i )->PortName() << " " << GetChangeNodeInPort( i )->Kind() << endl ;
+      cdebug << "ReversedInPort " << _DataFlowDataPorts->GetChangeNodeOutPort( i )->PortName() << " " << _DataFlowDataPorts->GetChangeNodeOutPort( i )->Kind()
+             << endl ;
+    }
   }
   for ( i = 0 ; i < outnbr ; i++ ) {
-    GetChangeNodeOutPort( i )->Kind( OutPortsKind[ i ] ) ;
-    cdebug << "Out " << GetChangeNodeOutPort( i )->PortName() << " " << GetChangeNodeOutPort( i )->Kind() << endl ;
-    _DataFlowDataPorts->GetChangeNodeInPort( i )->Kind( OutPortsKind[ i ] ) ;
-    cdebug << "ReversedOut " << _DataFlowDataPorts->GetChangeNodeInPort( i )->PortName() << " " << _DataFlowDataPorts->GetChangeNodeInPort( i )->Kind() << endl ;
+    if ( OutPortsKind[ i ] == SUPERV::DataStreamParameter ) {
+      GraphBase::OutDataStreamPort * anOutPort = AddOutDataStreamPort( aService.ServiceoutParameter[ i ].Parametername ,
+                                                                       StringToDataStreamType( aService.ServiceoutParameter[ i ].Parametertype ) ,
+                                                                       OutDataStreamDependency[ i ] ,
+                                                                       SUPERV::DataStreamParameter ) ;
+      anOutPort->NumberOfValues( OutNumberOfValues[ i ] ) ;
+// NOT A BUG : AddInPort for an outport (Reversed service)
+      anOutPort = (GraphBase::OutDataStreamPort * ) _DataFlowDataPorts->AddInPort( _Orb , NamePtr() ,
+                                                                                   Kind() ,
+                                                                                   aService.ServiceoutParameter[ i ].Parametername ,
+                                                                                   aService.ServiceoutParameter[ i ].Parametertype ,
+                                                                                   SUPERV::DataStreamParameter ,
+//                                                                                   _DataFlowDataPorts->DataStreamInPortsNumber() ,
+                                                                                   _Graph_prof_debug , _Graph_fdebug ) ;
+      anOutPort->Dependency( OutDataStreamDependency[ i ] ) ;
+// Attention : revoir les reversed DataStreamPorts
+//      anOutPort->NumberOfValues( OutNumberOfValues[ i ] ) ;
+      cdebug << "OutStreamPort " << GetChangeNodeOutPort( i )->PortName() << " " << GetChangeNodeOutPort( i )->Kind() << endl ;
+      cdebug << "ReversedOutStreamPort " << _DataFlowDataPorts->GetChangeNodeInPort( i )->PortName() << " " << _DataFlowDataPorts->GetChangeNodeInPort( i )->Kind()
+             << endl ;
+    }
+    else {
+      GetChangeNodeOutPort( i )->Kind( OutPortsKind[ i ] ) ;
+      _DataFlowDataPorts->GetChangeNodeInPort( i )->Kind( OutPortsKind[ i ] ) ;
+      GetChangeNodeOutPort( i )->Dependency( OutDataStreamDependency[ i ] ) ;
+      _DataFlowDataPorts->GetChangeNodeInPort( i )->Dependency( OutDataStreamDependency[ i ] ) ;
+      GetChangeNodeOutPort( i )->Dependency( OutDataStreamDependency[ i ] ) ;
+      _DataFlowDataPorts->GetChangeNodeInPort( i )->Dependency( OutDataStreamDependency[ i ] ) ;
+      cdebug << "OutPort " << GetChangeNodeOutPort( i )->PortName() << " " << GetChangeNodeOutPort( i )->Kind() << endl ;
+      cdebug << "ReversedOutPort " << _DataFlowDataPorts->GetChangeNodeInPort( i )->PortName() << " " << _DataFlowDataPorts->GetChangeNodeInPort( i )->Kind()
+             << endl ;
+    }
   }
 // Restore input datas :
+  DataStreamInPortsNumber( 0 ) ;
+  DataStreamOutPortsNumber( 0 ) ;
   for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
     aToNode = GraphNodes( i ) ;
+    DataStreamInPortsNumber( DataStreamInPortsNumber() + aToNode->DataStreamInPortsNumber() ) ;
+    DataStreamOutPortsNumber( DataStreamOutPortsNumber() + aToNode->DataStreamOutPortsNumber() ) ;
     for ( j = 0 ; j < aToNode->GetNodeInPortsSize() ; j++ ) {
       GraphBase::InPort *anInPort = aToNode->GetChangeNodeInPort(j) ;
       if ( anInPort->IsDataConnected() ) {
@@ -1322,15 +1559,15 @@ bool GraphBase::Graph::InLineServices() {
   SALOME_ModuleCatalog::Service aService ;
   for ( i = 0 ; i < GraphNodesSize() ; i++ ) {
     aINode = (GraphBase::InLineNode * ) GraphNodes( i ) ;
-    if ( aINode->IsOneOfInLineNodes() || aINode->HasDataStream() ) {
+//    if ( aINode->IsOneOfInLineNodes() || aINode->HasDataStream() ) {
+    if ( aINode->IsOneOfInLineNodes() ) {
       cdebug << "GraphBase::Graph::InLineServices " << aINode->Name() << endl;
       aService.ServiceName = aINode->ServiceName() ;
       aService.ServiceinParameter.length( 0 ) ;
       aService.ServiceoutParameter.length( 0 ) ;
       int InService = 0 ;
       for ( j = 0 ; j < aINode->GetNodeInPortsSize() ; j++ ) {
-        if ( aINode->GetChangeNodeInPort(j)->IsGate() ||
-             aINode->GetChangeNodeInPort(j)->IsLoop() ) {
+        if ( aINode->GetChangeNodeInPort(j)->IsGate() || aINode->GetChangeNodeInPort(j)->IsLoop() || aINode->GetChangeNodeInPort(j)->IsDataStream() ) {
           cdebug << "GraphBase::Graph::InLineServices In" << j << " "
                  << aINode->GetChangeNodeInPort(j)->Kind() << " " 
                  << aINode->GetChangeNodeInPort(j)->PortType() << " " 
@@ -1352,8 +1589,7 @@ bool GraphBase::Graph::InLineServices() {
       }
       int OutService = 0 ;
       for ( j = 0 ; j < aINode->GetNodeOutPortsSize() ; j++ ) {
-        if ( aINode->GetChangeNodeOutPort(j)->IsGate() ||
-             aINode->GetChangeNodeOutPort(j)->IsLoop() ) {
+        if ( aINode->GetChangeNodeOutPort(j)->IsGate() || aINode->GetChangeNodeOutPort(j)->IsLoop() || aINode->GetChangeNodeOutPort(j)->IsDataStream() ) {
           cdebug << "GraphBase::Graph::InLineServices Out" << j << " "
                  << aINode->GetChangeNodeOutPort(j)->Kind() << " " 
                  << aINode->GetChangeNodeOutPort(j)->PortType() << " " 
@@ -1401,6 +1637,7 @@ bool GraphBase::Graph::Sort() {
       _Sorted[ i ] = false ;
       _CnxInPortsNumber[ i ] = GraphNodes( i )->ConnectedInPortsNumber() ;
       _DecrInPortsNumber[ i ] = 0 ;
+      cdebug << "Sort Node [" << i << "] " << GraphNodes( i )->Name() << " initial count " << _CnxInPortsNumber[ i ] << endl ;
     }
     
     while ( NotSortedNumber ) {
@@ -1431,7 +1668,7 @@ bool GraphBase::Graph::Sort() {
            GraphBase::ComputingNode * aLinkedNode = GraphNodes( i )->LinkedNodes( j ) ;
             int aLinkedInPortsNumber = GraphNodes( i )->LinkedInPortsNumber( j ) ;
             cdebug << j << ". LinkedNode " << aLinkedNode->Name() ;
-            if ( !aLinkedNode->IsDataFlowNode() ) {
+            if ( !aLinkedNode->IsDataFlowNode() && !aLinkedNode->IsDataStreamNode() ) {
               cdebug << " _DecrInPortsNumber[ "
                      << GetGraphNodeIndex( aLinkedNode->Name() )
                      << " ] = "
@@ -1749,7 +1986,7 @@ bool GraphBase::Graph::DataServerNodes() const {
       aNode = GraphNodes( i ) ;
 //  while ( aNode != aComputingNodesList.end() ) {
       if ( aNode->IsFactoryNode() ) {
-      GraphBase::FactoryNode * FaNode = (GraphBase::FactoryNode * ) aNode ;
+        GraphBase::FactoryNode * FaNode = (GraphBase::FactoryNode * ) aNode ;
         if ( !strlen( FaNode->Computer() ) ) {
           cdebug << "ComputerName missing for node " << FaNode->Name() ;
           if ( !strlen( FaNode->Computer() ) ) {