Salome HOME
CCAR: some corrections in :
[modules/kernel.git] / src / NamingService / SALOME_NamingServicePy.py
index 9b46f5c2f06c645e13cd8d9656706b2799985946..81ad8d15a94b01799eeb1f900daa6fbb29f4fc10 100644 (file)
@@ -1,23 +1,44 @@
 #! /usr/bin/env python
-
-#=============================================================================
-# File      : SALOME_NamingServicePy.py
-# Created   : lun oct  15 14:55 CEST 2001
-# Author    : Estelle Deville, CEA
-# Project   : SALOME
-# Copyright : CEA 2001
-# $Header$
-#=============================================================================
+#
+#  SALOME NamingService : wrapping NamingService services
+#
+#  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+# 
+#  This library is free software; you can redistribute it and/or 
+#  modify it under the terms of the GNU Lesser General Public 
+#  License as published by the Free Software Foundation; either 
+#  version 2.1 of the License. 
+# 
+#  This library is distributed in the hope that it will be useful, 
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+#  Lesser General Public License for more details. 
+# 
+#  You should have received a copy of the GNU Lesser General Public 
+#  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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+#
+#
+#  File   : SALOME_NamingServicePy.py
+#  Author : Estelle Deville, CEA
+#  Module : SALOME
+#  $Header$
 
 import sys
+import time
 from omniORB import CORBA
 import CosNaming
+import string
 from string import *
 
 from SALOME_utilities import *
 #=============================================================================
 
-class SALOME_NamingServicePy_i:
+class SALOME_NamingServicePy_i(object):
     _orb = None
     _root_context=None
     _current_context=None
@@ -26,20 +47,40 @@ class SALOME_NamingServicePy_i:
     #-------------------------------------------------------------------------
 
     def __init__(self, orb):
-        MESSAGE ( "SALOME_NamingServicePy_i::__init__" )
+        #MESSAGE ( "SALOME_NamingServicePy_i::__init__" )
         self._orb = orb
         # initialize root context and current context
-        obj =self._orb.resolve_initial_references("NameService")
-        self._root_context =obj._narrow(CosNaming.NamingContext)
-        self._current_context = self._root_context
+       ok = 0
+       steps = 240
+       while steps > 0 and ok == 0:
+         try:
+            obj =self._orb.resolve_initial_references("NameService")
+            self._root_context =obj._narrow(CosNaming.NamingContext)
+            self._current_context = self._root_context
 
         
-        if self._root_context is None :
-            MESSAGE ( "Name Service Reference is invalid" )
-            sys.exit(1)
+            if self._root_context is None :
+              #MESSAGE ( "Name Service Reference is invalid" )
+              #sys.exit(1)
+             MESSAGE(" Name service not found")
+           else:
+             ok = 1
+         except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE):
+           MESSAGE(" Name service not found")
+         time.sleep(0.25)
+         steps = steps - 1
+        if steps == 0 and self._root_context is None: 
+          MESSAGE ( "Name Service Reference is invalid" )
+          sys.exit(1)
+
     #-------------------------------------------------------------------------
+
     def Register(self,ObjRef, Path):
+        """ ns.Register(object,pathname )  
+        
+        register a CORBA object under a pathname
+        """
+
         MESSAGE ( "SALOME_NamingServicePy_i::Register" )
         _not_exist = 0
         path_list = list(Path)
@@ -48,7 +89,7 @@ class SALOME_NamingServicePy_i:
             #delete first '/' before split
             Path=Path[1:]
 
-        result_resolve_path = split(Path,'/')
+        result_resolve_path = string.split(Path,'/')
         if len(result_resolve_path)>1:
             # A directory is treated (not only an object name)
             # We had to test if the directory where ObjRef should be recorded 
@@ -67,8 +108,8 @@ class SALOME_NamingServicePy_i:
                 MESSAGE ( "Register : CosNaming.NamingContext.InvalidName" )
             except CosNaming.NamingContext.CannotProceed, ex:
                 MESSAGE ( "Register : CosNaming.NamingContext.CannotProceed" )
-            except CORBA.COMM_FAILURE, ex:
-                MESSAGE ( "Register : CORBA.COMM_FAILURE" )
+            except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE):
+                MESSAGE ( "Register : CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE" )
 
             if _not_exist:
                 # at least one context of the complete path is not created, we had
@@ -99,20 +140,24 @@ class SALOME_NamingServicePy_i:
         except CosNaming.NamingContext.AlreadyBound, ex:
             MESSAGE ( "Register : CosNaming.NamingContext.AlreadyBound, object will be rebind" )
             self._current_context.rebind(_context_name,ObjRef)
-        except CORBA.COMM_FAILURE, ex:
-            MESSAGE ( "Register : CORBA.COMM_FAILURE" )
+        except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE):
+            MESSAGE ( "Register : CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE" )
 
-            
     #-------------------------------------------------------------------------
+
     def Resolve(self, Path):
-        MESSAGE ( "SALOME_NamingServicePy_i::Resolve" )
+        """ ns.Resolve(pathname) -> object
+
+        find a CORBA object (ior) by its pathname
+        """
+        #MESSAGE ( "SALOME_NamingServicePy_i::Resolve" )
         path_list = list(Path)
         if path_list[0]=='/':
             self._current_context = self._root_context
             #delete first '/' before split
             Path=Path[1:]
 
-        result_resolve_path = split(Path,'/')
+        result_resolve_path = string.split(Path,'/')
         _context_name=[]
         for i in range(len(result_resolve_path)-1):
             _context_name.append(CosNaming.NameComponent(result_resolve_path[i],"dir"))
@@ -128,14 +173,14 @@ class SALOME_NamingServicePy_i:
         except CosNaming.NamingContext.CannotProceed, ex:
             MESSAGE ( "Resolve : CosNaming.NamingContext.CannotProceed" )
             self._obj = None
-        except CORBA.COMM_FAILURE, ex:
-            MESSAGE ( "Resolve : CORBA.COMM_FAILURE" )
+        except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE):
+            MESSAGE ( "Resolve : CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE" )
             self._obj = None
         return self._obj
 
 
-
     #-------------------------------------------------------------------------
+
     def Create_Directory(self,ObjRef, Path):
         MESSAGE ( "SALOME_NamingServicePy_i::Create_Directory" )
         _not_exist = 0
@@ -145,7 +190,7 @@ class SALOME_NamingServicePy_i:
             #delete first '/' before split
             Path=Path[1:]
 
-        result_resolve_path = split(Path,'/')
+        result_resolve_path = string.split(Path,'/')
         _context_name = []
         for i in range(len(result_resolve_path)):
             _context_name[CosNaming.NameComponent(result_resolve_path[i],"dir")]            
@@ -158,9 +203,48 @@ class SALOME_NamingServicePy_i:
                 MESSAGE ( "Create_Directory : CosNaming.NamingContext.InvalidName" )
             except CosNaming.NamingContext.CannotProceed, ex:
                 MESSAGE ( "Create_Directory : CosNaming.NamingContext.CannotProceed" )
-            except CORBA.COMM_FAILURE, ex:
-                MESSAGE ( "Create_Directory : CORBA.COMM_FAILURE" )
-
+            except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE):
+                MESSAGE ( "Create_Directory : CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE" )
  
-
-    
+    def Destroy_Name(self,Path):
+      resolve_path=string.split(Path,'/')
+      if resolve_path[0] == '': del resolve_path[0]
+      dir_path=resolve_path[:-1]
+      context_name=[]
+      for e in dir_path:
+         context_name.append(CosNaming.NameComponent(e,"dir"))
+      context_name.append(CosNaming.NameComponent(resolve_path[-1],"object"))
+      
+      try:
+        self._root_context.unbind(context_name)
+      except CosNaming.NamingContext.NotFound, ex:
+        return
+      except CORBA.Exception,ex:
+        return
+
+    def Destroy_FullDirectory(self,Path):
+      context_name=[]
+      for e in string.split(Path,'/'):
+        if e == '':continue
+        context_name.append(CosNaming.NameComponent(e,"dir"))
+
+      try:
+        context=self._root_context.resolve(context_name)
+      except CosNaming.NamingContext.NotFound, ex:
+        return
+      except CORBA.Exception,ex:
+        return
+
+      bl,bi=context.list(0)
+      if bi is not None:
+         ok,b=bi.next_one()
+         while(ok):
+            for s in b.binding_name :
+               if s.kind == "object":
+                  context.unbind([s])
+               elif s.kind == "dir":
+                  context.unbind([s])
+            ok,b=bi.next_one()
+
+      context.destroy()
+      self._root_context.unbind(context_name)