Salome HOME
Join modifications from BR_Dev_For_4_0 tag V4_1_1.
[modules/superv.git] / src / Supervision / Graph_Impl.cxx
index b6aee77e1bd8cb40d387be9bf2718c5316d2d8e0..bbc0feca64336ecf870de88d2193f2b0efb15b24 100644 (file)
@@ -17,7 +17,7 @@
 //  License along with this library; if not, write to the Free Software 
 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
 // 
-//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 //
 //
@@ -400,16 +400,31 @@ SUPERV::CNode_ptr Graph_Impl::CNode( const SALOME_ModuleCatalog::Service &NodeSe
 
 SUPERV::FNode_ptr Graph_Impl::FNode( const char * NodeComponentName ,
                                      const char * NodeInterfaceName ,
-                                     const SALOME_ModuleCatalog::Service &NodeService ) {
+                                     const SALOME_ModuleCatalog::Service &NodeService ,
+                                    const SALOME_ModuleCatalog::ImplType ImplType ) {
   beginService( "Graph_Impl::FNode" );
   SUPERV::FNode_var iobject = SUPERV::FNode::_nil() ;
+  bool isCimpl = true;
+  switch (ImplType)
+  {
+  case SALOME_ModuleCatalog::PY:
+    isCimpl = false;
+    break;
+  case SALOME_ModuleCatalog::SO:
+  case SALOME_ModuleCatalog::EXE:
+  default:
+    ;
+  }
   if ( DataFlowEditor()->IsEditing() && !DataFlowEditor()->IsReadOnly() && !IsMacro() ) {
     FNode_Impl * myNode = new FNode_Impl( _Orb , _Poa , _ContId ,
                                           instanceName() , interfaceName() ,
                                           DataFlowEditor() ,
                                           NodeService ,
                                           NodeComponentName ,
-                                          NodeInterfaceName ) ;
+                                          NodeInterfaceName ,
+                                         NULLSTRING ,
+                                         SUPERV::FactoryNode ,
+                                         isCimpl ) ;
     if ( myNode->DataFlowNode() ) {
       PortableServer::ObjectId * id = myNode->getId() ;
       CORBA::Object_var obj = _poa->id_to_reference(*id);
@@ -512,12 +527,12 @@ SUPERV::LNode_ptr Graph_Impl::LNode( const char * InitName ,
       SALOME_ModuleCatalog::Service aVoidService = SALOME_ModuleCatalog::Service() ;
       char * anEndName ;
       if ( strlen( InitName ) ) {
-        anEndName = new char( 3 + strlen( InitName ) + 1 ) ;
+        anEndName = new char[ 3 + strlen( InitName ) + 1 ];
         strcpy( anEndName , "End" ) ;
         strcat( anEndName , InitName ) ;
       }
       else {
-        anEndName = new char( 3 + strlen( "Loop" ) + 1 ) ;
+        anEndName = new char[ 3 + strlen( "Loop" ) + 1 ];
         strcpy( anEndName , "EndLoop" ) ;
       }
       ELNode_Impl * myEndNode = new ELNode_Impl( _Orb , _Poa , _ContId ,
@@ -585,10 +600,11 @@ SUPERV::SNode_ptr Graph_Impl::SNode( const char * FuncName ,
       myEndNode->SetObjRef( SUPERV::ESNode::_duplicate( iendobject ) ) ;
       myNode->SetCoupled( myEndNode->BaseNode()->Name() ) ;
       myEndNode->SetCoupled( myNode->BaseNode()->Name() ) ;
-      if ( !Link( myNode->Port( "Default" ) , myEndNode->Port( "Default" ) ) ) {
-        iobject = SUPERV::SNode::_nil() ;
-        iendobject = SUPERV::ESNode::_nil() ;
-      }
+//JR NPAL14793 05.02.2007 : do not add that link
+//      if ( !Link( myNode->Port( "Default" ) , myEndNode->Port( "Default" ) ) ) {
+//        iobject = SUPERV::SNode::_nil() ;
+//        iendobject = SUPERV::ESNode::_nil() ;
+//      }
     }
   }
   anEndOfSwitch = SUPERV::ESNode::_duplicate( iendobject ) ;
@@ -808,6 +824,7 @@ SUPERV::Graph_var Graph_Impl::LoadDataFlows( GraphExecutor::DataFlow * aDataFlow
          GraphExecutor::DataFlow * aMacroGraphExecutor ;
          CreateExecutor( _Orb , instanceName() , aMacroGraphName , SUPERV::DataStreamGraph ,
                        dbgfile , &aMacroGraphExecutor );
+          theAutomaton->Executed() ; // Decrement _GraphExecutingNumber for MacroSubGraph
 
        // set GraphMacroLevel for Executor's graph
          GraphBase::Graph* aMacroGraphExe = aMacroGraphExecutor->Graph();
@@ -1035,35 +1052,40 @@ SUPERV::Graph_ptr Graph_Impl::GraphMNode( SUPERV::Graph_ptr myMacroGraph ) {
     aDataFlowNode->SetObjRef( SUPERV::CNode::_duplicate( SUPERV::CNode::_narrow( obj ) ) ) ;
     aDataFlowNode->SetObjImpl( this ) ;
 
+    GraphBase::Graph * aSubGraph = NULL ;
 //    GraphBase::Graph * aGraph = DataFlowEditor()->Automaton()->MapGraph( myMacroGraph->Name() ) ;
-    GraphBase::Graph * aGraph ;
     //DataFlowEditor()->Automaton()->GraphBase( &aGraph ) ;
+//JR 20.09.2005 Debug SAB_data_1609_bugPAL.py from CEA (Anthony)
+//    Graph_Impl * aSubGraphImpl = dynamic_cast<Graph_Impl * >( _Poa->id_to_servant( *myMacroGraph->_Id ) ) ;
+    myMacroGraph->ping() ;
+    Graph_Impl * aSubGraphImpl = theAutomaton->GraphImpl() ;
+    aSubGraph = aSubGraphImpl->DataFlowEditor()->Graph() ;
     myMacroGraph->Coupled() ;
     GraphBase::Graph * aGraphOfMacroGraph = myMacroNode->DataFlowEditor()->Graph() ;
     GraphBase::Graph * aMacroGraph = myMacroNode->DataFlowNode()->GraphMacroNode() ;
     aMacroGraph->Kind( SUPERV::MacroNode ) ;
     aMacroGraph->GraphEditor( DataFlowEditor() ) ;
 // Creation of the Ports of the MacroNode from the ports of the GraphMacroNode
-    aMacroGraph->SetMacroPorts( aGraph ) ;
+    aMacroGraph->SetMacroPorts( aSubGraph ) ;
 // Valid ==> creation of Service and the ports of the current Graph
     DataFlowEditor()->IsValid() ;
 // Set the Input Datas from the GraphMacroNode to the current Graph
-    aMacroGraph->SetMacroDatas( aGraph , aGraphOfMacroGraph ) ;
+    aMacroGraph->SetMacroDatas( aSubGraph , aGraphOfMacroGraph ) ;
 //    aMacroGraphDataFlowEditor->UnValid() ;
-    aGraph->GraphEditor()->UnValid() ;
+    aSubGraph->GraphEditor()->UnValid() ;
 // Set the MacroNode ObjRef in the GraphMacroNode
-    aGraph->CoupledNode( aMacroGraph ) ;
-    aGraph->MacroObject( SUPERV::Graph::_duplicate( macroiobject ) ) ;
+    aSubGraph->CoupledNode( aMacroGraph ) ;
+    aSubGraph->MacroObject( SUPERV::Graph::_duplicate( macroiobject ) ) ;
 // Set the GraphMacroNode ObjRef in the MacroNode
     aDataFlowNode->GraphMacroNode()->GraphMacroLevel( aGraphOfMacroGraph->GraphMacroLevel() + 1 ) ;
-    aMacroGraph->CoupledNode( aGraph ) ;
+    aMacroGraph->CoupledNode( aSubGraph ) ;
     aMacroGraph->MacroObject( SUPERV::Graph::_duplicate( iobject ) ) ;
-//    aDataFlowNode->CoupledNode( aGraph ) ;
+//    aDataFlowNode->CoupledNode( aSubGraph ) ;
 //    aDataFlowNode->ComputingNode()->MacroObject( SUPERV::Graph::_duplicate( iobject ) ) ;
 // Set the MacroLevel of that graph
-    aGraph->GraphMacroLevel( aGraphOfMacroGraph->GraphMacroLevel() + 1 ) ;
+    aSubGraph->GraphMacroLevel( aGraphOfMacroGraph->GraphMacroLevel() + 1 ) ;
     aMacroGraph->Coordinates( 0 , 0 ) ;
-    MESSAGE( aGraph->Name() << "->CoupledNode()->GraphEditor() : " << aGraph->CoupledNode()->GraphEditor() ) ;
+    MESSAGE( aSubGraph->Name() << "->CoupledNode()->GraphEditor() : " << aSubGraph->CoupledNode()->GraphEditor() ) ;
     MESSAGE( aMacroGraph->Name() << "->CoupledNode()->GraphEditor() : "
              << aMacroGraph->CoupledNode()->GraphEditor() ) ;
     MESSAGE( "DataFlowNode Graph " << this << " DataFlowEditor " << DataFlowEditor() << " aDataFlowNode "
@@ -1734,16 +1756,16 @@ bool Graph_Impl::IsReadOnly() {
   return RetVal ;
 }
 
-long Graph_Impl::LevelMax() {
+CORBA::Long Graph_Impl::LevelMax() {
 //  beginService( "Graph_Impl::LevelMax" );
-  long RetVal = 0 ;
+  CORBA::Long RetVal = 0 ;
   if ( !IsMacro() ) {
     RetVal = DataFlowEditor()->LevelMax() ;
   }
 //  endService( "Graph_Impl::LevelMax" );
   return RetVal ;
 }
-SUPERV::ListOfNodes * Graph_Impl::LevelNodes(long aLevel ) {
+SUPERV::ListOfNodes * Graph_Impl::LevelNodes(CORBA::Long aLevel ) {
 //  beginService( "Graph_Impl::LevelNodes" );
   SUPERV::ListOfNodes_var RetVal = new SUPERV::ListOfNodes;
   if ( !IsMacro() ) {
@@ -1769,27 +1791,27 @@ SUPERV::ListOfNodes * Graph_Impl::LevelNodes(long aLevel ) {
 //  endService( "Graph_Impl::LevelNodes" );
   return ( RetVal._retn() ) ;
 }
-long Graph_Impl::ThreadsMax() {
+CORBA::Long Graph_Impl::ThreadsMax() {
 //  beginService( "Graph_Impl::ThreadsMax" );
-  long RetVal = 0 ;
+  CORBA::Long RetVal = 0 ;
   if ( !IsMacro() ) {
     RetVal =  DataFlowEditor()->ThreadsMax() ;
   }
 //  endService( "Graph_Impl::ThreadsMax" );
   return RetVal ;
 }
-long Graph_Impl::Threads() {
+CORBA::Long Graph_Impl::Threads() {
 //  beginService( "Node_Impl::Threads" );
-  long RetVal = false ;
+  CORBA::Long RetVal = false ;
   if ( !IsMacro() ) {
     RetVal = DataFlowExecutor()->Threads() ;
   }
 //  endService( "Node_Impl::Threads" );
   return RetVal ;
 }
-long Graph_Impl::SuspendedThreads() {
+CORBA::Long Graph_Impl::SuspendedThreads() {
 //  beginService( "Node_Impl::SuspendedThreads" );
-  long RetVal = false ;
+  CORBA::Long RetVal = false ;
   if ( !IsMacro() ) {
     RetVal = DataFlowExecutor()->SuspendedThreads() ;
   }
@@ -1799,6 +1821,13 @@ long Graph_Impl::SuspendedThreads() {
 
 bool Graph_Impl::Begin() {
   bool RetVal = false ;
+  // mkr : IPAL11408 : "Run()" method returns "0" after trying to start graph execution.
+  // If we call Run() method from Python script two times for one graph, we have to be sure,
+  // that first execution of this graph ended (i.e. GraphEditor::DataFlow::Editing() method was called).
+  // Otherwise, the second call of Run() method will return 0. Therefore, we have to waiting for
+  // the first execution finish. 
+  // NB! From GUI we cann't run dataflow if its previous execution not finished.
+  while ( !DataFlowEditor()->IsEditing() ) {} // waiting for the previous execution of this graph ended
   if ( DataFlowEditor()->IsEditing() ) {
     if ( pthread_mutex_lock( &_MutexExecutorWait ) ) {
       perror("pthread_mutex_lock _MutexExecutorWait") ;
@@ -2005,9 +2034,9 @@ bool Graph_Impl::EventW( SUPERV::CNode_out aNode ,
   return RetVal ;
 }
 
-long Graph_Impl::EventQSize() {
+CORBA::Long Graph_Impl::EventQSize() {
 //  beginService( "Graph_Impl::EventQSize" );
-  long QSize = -1 ;
+  CORBA::Long QSize = -1 ;
   if ( pthread_mutex_lock( &_MutexExecutorWait ) ) {
     perror("pthread_mutex_lock _MutexExecutorWait") ;
     exit( 0 ) ;
@@ -2023,13 +2052,13 @@ long Graph_Impl::EventQSize() {
   return QSize ;
 }
 
-long Graph_Impl::LastLevelDone() {
+CORBA::Long Graph_Impl::LastLevelDone() {
 //  beginService( "Graph_Impl::LastLevelDone" );
   if ( pthread_mutex_lock( &_MutexExecutorWait ) ) {
     perror("pthread_mutex_lock _MutexExecutorWait") ;
     exit( 0 ) ;
   }
-  long RetVal = 0 ;
+  CORBA::Long RetVal = 0 ;
   if ( DataFlowExecutor() && !IsMacro() ) {
     RetVal = DataFlowExecutor()->LastLevelDone() ;
   }
@@ -2041,9 +2070,9 @@ long Graph_Impl::LastLevelDone() {
   return RetVal ;
 }
 
-long Graph_Impl::SubGraphsNumber() {
+CORBA::Long Graph_Impl::SubGraphsNumber() {
 //  beginService( "Graph_Impl::SubGraphsNumber" );
-  long RetVal = 0 ;
+  CORBA::Long RetVal = 0 ;
   if ( DataFlowEditor()->IsExecutable() && !IsMacro() ) {
     RetVal = DataFlowEditor()->SubGraphsNumber() ;
   }
@@ -2051,7 +2080,7 @@ long Graph_Impl::SubGraphsNumber() {
   return RetVal ;
 }
 
-SUPERV::ListOfNodes * Graph_Impl::SubGraphsNodes( const long aSubGraphNumber ) {
+SUPERV::ListOfNodes * Graph_Impl::SubGraphsNodes( CORBA::Long aSubGraphNumber ) {
   beginService( "Graph_Impl::SubGraphsNodes" );
   SUPERV::ListOfNodes_var RetVal = new SUPERV::ListOfNodes ;
   if ( DataFlowEditor()->IsEditing() && !IsMacro() ) {
@@ -2171,9 +2200,12 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM
     if ( RetVal ) {
       for ( i = 0 ; i < (int ) aGraphNodes->FNodes.length() ; i++ ) {
         SUPERV::FNode_var aNode = (aGraphNodes->FNodes)[ i ] ;
+        SALOME_ModuleCatalog::ImplType implType = SALOME_ModuleCatalog::SO;
+        if (!aNode->IsCimpl()) implType = SALOME_ModuleCatalog::PY;
         SUPERV::FNode_ptr myNode = FNode( aNode->GetComponentName() ,
                                           aNode->GetInterfaceName() ,
-                                          *(aNode->Service()) ) ;
+                                          *(aNode->Service()) ,
+                                         implType ) ; // mkr : PAL11273
         if ( !CORBA::is_nil( myNode ) ) {
           myNode->SetName( aNode->Name() ) ;
           myNode->SetAuthor( aNode->Author() ) ;
@@ -2228,10 +2260,10 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM
             SUPERV::ListOfStreamPorts myStreamPorts = *(aNode->StreamPorts()) ;
             for ( j = 0 ; j < (int ) myStreamPorts.length() ; j++ ) {
               if ( myStreamPorts[ j ]->IsInput() ) {
-                aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ;
+                aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ;
              }
               else {
-                aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ;
+                aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ;
              }
            }
          }
@@ -2270,10 +2302,10 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM
             SUPERV::ListOfStreamPorts myStreamPorts = *(aNode->StreamPorts()) ;
             for ( j = 0 ; j < (int ) myStreamPorts.length() ; j++ ) {
               if ( myStreamPorts[ j ]->IsInput() ) {
-                aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ;
+                aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ;
              }
               else {
-                aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ;
+                aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ;
              }
            }
          }
@@ -2319,10 +2351,10 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM
             SUPERV::ListOfStreamPorts myStreamPorts = *(aNode->StreamPorts()) ;
             for ( j = 0 ; j < (int ) myStreamPorts.length() ; j++ ) {
               if ( myStreamPorts[ j ]->IsInput() ) {
-                aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ;
+                aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ;
              }
               else {
-                aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ;
+                aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ;
              }
            }
          }
@@ -2338,10 +2370,10 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM
             SUPERV::ListOfStreamPorts myStreamLoopPorts = *(myEndOfLoop->StreamPorts()) ;
             for ( j = 0 ; j < (int ) myStreamLoopPorts.length() ; j++ ) {
               if ( myStreamLoopPorts[ j ]->IsInput() ) {
-                aPort = myNode->InStreamPort( myStreamLoopPorts[ j ]->Name() , StringToDataStreamType( myStreamLoopPorts[ j ]->Type() ) , myStreamLoopPorts[ j ]->Dependency() ) ;
+                aPort = myNode->InStreamPort( myStreamLoopPorts[ j ]->Name(), myStreamLoopPorts[ j ]->Type(), myStreamLoopPorts[ j ]->Dependency() ) ;
              }
               else {
-                aPort = myNode->OutStreamPort( myStreamLoopPorts[ j ]->Name() , StringToDataStreamType( myStreamLoopPorts[ j ]->Type() ) , myStreamLoopPorts[ j ]->Dependency() ) ;
+                aPort = myNode->OutStreamPort( myStreamLoopPorts[ j ]->Name(), myStreamLoopPorts[ j ]->Type(), myStreamLoopPorts[ j ]->Dependency() ) ;
              }
            }
          }
@@ -2382,10 +2414,10 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM
             SUPERV::ListOfStreamPorts myStreamPorts = *(aNode->StreamPorts()) ;
             for ( j = 0 ; j < (int ) myStreamPorts.length() ; j++ ) {
               if ( myStreamPorts[ j ]->IsInput() ) {
-                aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ;
+                aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ;
              }
               else {
-                aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ;
+                aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ;
              }
            }
          }
@@ -2401,20 +2433,20 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM
           myPorts = *(myEndOfSwitch->Ports()) ;
           for ( j = 0 ; j < (int ) myPorts.length() ; j++ ) {
             if ( myPorts[ j ]->IsInput() ) {
-              aPort = myNode->InPort( myPorts[ j ]->Name() , myPorts[ j ]->Type() ) ;
+              aPort = anEndOfSwitch->InPort( myPorts[ j ]->Name() , myPorts[ j ]->Type() ) ; // mkr : IPAL11394 (add port to !EndSwitch! node)
            }
             else {
-              aPort = myNode->OutPort( myPorts[ j ]->Name() , myPorts[ j ]->Type() ) ;
+              aPort = anEndOfSwitch->OutPort( myPorts[ j ]->Name() , myPorts[ j ]->Type() ) ; // mkr : IPAL11394 (add port to !EndSwitch! node)
            }
          }
           if ( DataFlowEditor()->Graph()->IsDataStreamNode() ) {
             SUPERV::ListOfStreamPorts myStreamSwitchPorts = *(myEndOfSwitch->StreamPorts()) ;
             for ( j = 0 ; j < (int ) myStreamSwitchPorts.length() ; j++ ) {
               if ( myStreamSwitchPorts[ j ]->IsInput() ) {
-                aPort = myNode->InStreamPort( myStreamSwitchPorts[ j ]->Name() , StringToDataStreamType( myStreamSwitchPorts[ j ]->Type() ) , myStreamSwitchPorts[ j ]->Dependency() ) ;
+                aPort = anEndOfSwitch->InStreamPort( myStreamSwitchPorts[ j ]->Name(), myStreamSwitchPorts[ j ]->Type(), myStreamSwitchPorts[ j ]->Dependency() ) ; // mkr : IPAL11394 (add port to !EndSwitch! node)
              }
               else {
-                aPort = myNode->OutStreamPort( myStreamSwitchPorts[ j ]->Name() , StringToDataStreamType( myStreamSwitchPorts[ j ]->Type() ) , myStreamSwitchPorts[ j ]->Dependency() ) ;
+                aPort = anEndOfSwitch->OutStreamPort( myStreamSwitchPorts[ j ]->Name(), myStreamSwitchPorts[ j ]->Type(), myStreamSwitchPorts[ j ]->Dependency() ) ; // mkr : IPAL11394 (add port to !EndSwitch! node)
              }
            }
          }
@@ -2442,9 +2474,9 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM
                                            DataFlowEditor()->Graph()->GetGraphNode( aMapOfNodes[ aLinkToNodeName->c_str() ] )->Name() ,
                                            InPort->Name() ) ;
         if ( RetVal ) {
-          int j ;
+          CORBA::Long j ;
           for ( j = 1 ; j <= aLink->CoordsSize() ; j++ ) {
-            long X , Y ;
+            CORBA::Long X , Y ;
             RetVal = aLink->Coords( j , X , Y ) ;
             if ( !RetVal )
               break ;
@@ -2535,3 +2567,27 @@ void Graph_Impl::Editing() {
   }
 }
 
+/**
+ * Returns the default name of container for C component
+ */
+char* Graph_Impl::DefaultCContainerName() {
+  return ( CORBA::string_dup( FACTORYSERVER ) );
+}
+
+/**
+ * Returns the default name of container for Python component
+ */
+char* Graph_Impl::DefaultPythonContainerName() {
+  return ( CORBA::string_dup( FACTORYSERVERPY ) );
+}
+
+/*! 
+ * Returns the last container name associated with theComponentName component
+ */ 
+char* Graph_Impl::ContainerNameForComponent( const char * theComponentName ) {
+  const char* aContainer = DataFlowEditor()->Graph()->RetrieveFromMapOfComponentNameContainer(theComponentName);
+  if ( aContainer )
+    return my_strdup(aContainer);
+  else
+    return "";
+}