[jboss-cvs] JBossAS SVN: r111919 - branches/JBPAPP_5_1/iiop/src/main/org/jboss/iiop.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Aug 3 15:35:24 EDT 2011


Author: sguilhen at redhat.com
Date: 2011-08-03 15:35:24 -0400 (Wed, 03 Aug 2011)
New Revision: 111919

Added:
   branches/JBPAPP_5_1/iiop/src/main/org/jboss/iiop/JBossNamingContextImpl.java
Modified:
   branches/JBPAPP_5_1/iiop/src/main/org/jboss/iiop/CorbaNamingService.java
Log:
JBPAPP-6956: Added a new JBossNamingContextImpl that is capable of performing local context resolution, avoiding unnecessary remote calls that lead to thread pool exhaustion.

Modified: branches/JBPAPP_5_1/iiop/src/main/org/jboss/iiop/CorbaNamingService.java
===================================================================
--- branches/JBPAPP_5_1/iiop/src/main/org/jboss/iiop/CorbaNamingService.java	2011-08-03 19:29:25 UTC (rev 111918)
+++ branches/JBPAPP_5_1/iiop/src/main/org/jboss/iiop/CorbaNamingService.java	2011-08-03 19:35:24 UTC (rev 111919)
@@ -123,16 +123,23 @@
       namingPOA = rootPOA.create_POA("Naming", null, policies);
       namingPOA.the_POAManager().activate();
 
-      // Create the naming service
-      org.jacorb.naming.NamingContextImpl.init(orb, rootPOA);
-      NamingContextImpl ns = new NamingContextImpl(namingPOA);
-      Configuration config = ((org.jacorb.orb.ORB)orb).getConfiguration();
-      ns.configure(config); // configure the name service using the ORB config
+      // initialize the static naming service variables.
+      JBossNamingContextImpl.init(orb, rootPOA);
+     
+      // create and initialize the root context instance according to the configuration.
+      JBossNamingContextImpl ns = new JBossNamingContextImpl();
+      Configuration configuration = ((org.jacorb.orb.ORB)orb).getConfiguration();
+      boolean doPurge = configuration.getAttribute("jacorb.naming.purge", "off").equals("on");
+      boolean noPing = configuration.getAttribute("jacorb.naming.noping", "off").equals("on");
+      ns.init(namingPOA, doPurge, noPing);
+
+      // create and activate the root context.
       byte[] rootContextId = "root".getBytes();
       namingPOA.activate_object_with_id(rootContextId, ns);
-      namingService = NamingContextExtHelper.narrow(
-                  namingPOA.create_reference_with_id(rootContextId, 
+      namingService = NamingContextExtHelper.narrow(namingPOA.create_reference_with_id(rootContextId, 
                                 "IDL:omg.org/CosNaming/NamingContextExt:1.0"));
+
+      // bind the root context to JNDI.
       bind(NAMING_NAME, "org.omg.CosNaming.NamingContextExt");
       getLog().info("CORBA Naming Started");
       getLog().debug("Naming: ["+orb.object_to_string(namingService)+"]");
@@ -242,47 +249,4 @@
          }
       }
    }
-
-   // Static inner class --------------------------------------------
-
-   /**
-    * This subclass of <code>org.jacorb.naming.NamingContextImpl</code>
-    * overrides the method <code>new_context()</code>, because its
-    * implementation in <code>org.jacorb.naming.NamingContextImpl</code>
-    * is not suitable for our in-VM naming server. The superclass 
-    * implementation of <code>new_context()</code> assumes that naming context
-    * states are persistently stored and requires a servant activator that
-    * reads context states from persistent storage.
-    */
-   static class NamingContextImpl
-      extends org.jacorb.naming.NamingContextImpl
-   {
-      private POA poa;
-      private int childCount = 0;
-      private static final Logger logger = 
-                              Logger.getLogger(NamingContextImpl.class);
-
-      NamingContextImpl(POA poa)
-      {
-         this.poa = poa;
-      }
-
-      public NamingContext new_context() 
-      {
-         try {
-            NamingContextImpl newContextImpl = new NamingContextImpl(poa);
-            byte[] oid = (new String(poa.servant_to_id(this)) +  
-                          "/ctx" + (++childCount)).getBytes();
-            poa.activate_object_with_id(oid, newContextImpl);
-            return NamingContextExtHelper.narrow(
-                        poa.create_reference_with_id(oid, 
-                                "IDL:omg.org/CosNaming/NamingContextExt:1.0"));
-         }
-         catch (Exception e) {
-            logger.error("Cannot create CORBA naming context", e);
-            return null;
-         }
-      }
-   }
-
 }

Added: branches/JBPAPP_5_1/iiop/src/main/org/jboss/iiop/JBossNamingContextImpl.java
===================================================================
--- branches/JBPAPP_5_1/iiop/src/main/org/jboss/iiop/JBossNamingContextImpl.java	                        (rev 0)
+++ branches/JBPAPP_5_1/iiop/src/main/org/jboss/iiop/JBossNamingContextImpl.java	2011-08-03 19:35:24 UTC (rev 111919)
@@ -0,0 +1,710 @@
+package org.jboss.iiop;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jacorb.naming.BindingIteratorImpl;
+import org.jacorb.naming.Name;
+import org.jboss.logging.Logger;
+import org.omg.CORBA.INTERNAL;
+import org.omg.CORBA.ORB;
+import org.omg.CosNaming.Binding;
+import org.omg.CosNaming.BindingIteratorHelper;
+import org.omg.CosNaming.BindingIteratorHolder;
+import org.omg.CosNaming.BindingListHolder;
+import org.omg.CosNaming.BindingType;
+import org.omg.CosNaming.NameComponent;
+import org.omg.CosNaming.NamingContext;
+import org.omg.CosNaming.NamingContextExtHelper;
+import org.omg.CosNaming.NamingContextExtPOA;
+import org.omg.CosNaming.NamingContextExtPackage.InvalidAddress;
+import org.omg.CosNaming.NamingContextPackage.AlreadyBound;
+import org.omg.CosNaming.NamingContextPackage.CannotProceed;
+import org.omg.CosNaming.NamingContextPackage.InvalidName;
+import org.omg.CosNaming.NamingContextPackage.NotEmpty;
+import org.omg.CosNaming.NamingContextPackage.NotFound;
+import org.omg.CosNaming.NamingContextPackage.NotFoundReason;
+import org.omg.PortableServer.POA;
+
+public class JBossNamingContextImpl extends NamingContextExtPOA implements Serializable
+{
+   
+   private static final long serialVersionUID = 132820915998903191L;
+
+   /** the logger used by the naming service implementation. */
+   private static final Logger logger = Logger.getLogger(JBossNamingContextImpl.class);
+
+   /** static references to the running ORB and root POA. */
+   private static ORB orb;
+   private static POA rootPoa;
+
+   /** the naming service POA - i.e. the POA that activates all naming contexts. */
+   private transient POA poa;
+   
+   /** table of all name bindings in this contexts, ie. name -> obj ref. */
+   private Map<Name, Object> names = new Hashtable<Name, Object>();
+
+   /** table of all subordinate naming contexts, ie. name -> obj ref. */
+   private Map<Name, Object> contexts = new Hashtable<Name, Object>();
+
+   /** 
+    * cache of all active naming context implementations - used when resolving contexts recursively to avoid
+    * unnecessary remote calls that may lead to thread pool depletion.
+    */
+   private static Map<String, JBossNamingContextImpl> contextImpls = new Hashtable<String, JBossNamingContextImpl>();
+
+   /** no tests of bound objects for existence */
+   private boolean noPing = false;
+
+   /** purge? */
+   private boolean doPurge = false;
+
+   private boolean destroyed = false;
+
+   private int childCount = 0;
+
+   //======================================= Initialization Methods ==================================//
+   
+   /**
+    * This method needs to be called once to initialize the static fields orb and rootPoa.
+    */
+   public static void init(org.omg.CORBA.ORB orb, org.omg.PortableServer.POA rootPoa)
+   {
+      JBossNamingContextImpl.orb = orb;
+      JBossNamingContextImpl.rootPoa = rootPoa;
+   }
+
+   /**
+    * This method needs to be called for each newly created or re-read naming context to set its POA.
+    */
+   public void init(POA poa, boolean doPurge, boolean noPing)
+   {
+      this.poa = poa;
+      this.doPurge = doPurge;
+      this.noPing = noPing;
+
+      /**
+       * Recreate tables. For serialization, object references have been
+       * transformed into strings
+       */
+      for (Name key : this.contexts.keySet())
+      {
+         String ref = (String) this.contexts.remove(key);
+         this.contexts.put(key, orb.string_to_object(ref));
+      }
+
+      for (Name key : this.names.keySet())
+      {
+         String ref = (String) this.names.remove(key);
+         this.names.put(key, orb.string_to_object(ref));
+      }
+
+   }
+
+   //======================================= NamingContextOperation Methods ==================================//
+   
+   /**
+    * Bind a name (an array of name components) to an object.
+    */
+   public void bind(NameComponent[] nc, org.omg.CORBA.Object obj) throws NotFound, CannotProceed, InvalidName,
+         AlreadyBound
+   {
+      if (this.destroyed)
+         throw new CannotProceed();
+
+      if (nc == null || nc.length == 0)
+         throw new InvalidName();
+
+      if (obj == null)
+         throw new org.omg.CORBA.BAD_PARAM();
+
+      Name n = new Name(nc);
+      Name ctx = n.ctxName();
+      NameComponent nb = n.baseNameComponent();
+
+      if (ctx == null)
+      {
+         if (this.names.containsKey(n))
+         {
+            // if the name is still in use, try to ping the object
+            org.omg.CORBA.Object ref = (org.omg.CORBA.Object) this.names.get(n);
+            if (isDead(ref))
+            {
+               rebind(n.components(), obj);
+               return;
+            }
+            throw new AlreadyBound();
+         }
+         else if (this.contexts.containsKey(n))
+         {
+            // if the name is still in use, try to ping the object
+            org.omg.CORBA.Object ref = (org.omg.CORBA.Object) this.contexts.get(n);
+            if (isDead(ref))
+            {
+               unbind(n.components());
+            }
+            throw new AlreadyBound();
+         }
+
+         if ((this.names.put(n, obj)) != null)
+            throw new CannotProceed(_this(), n.components());
+
+         logger.debug("Bound name: " + n.toString());
+      }
+      else
+      {
+         NameComponent[] ncx = new NameComponent[] {nb};
+         org.omg.CORBA.Object context = this.resolve(ctx.components());
+       
+         // try first to call the context implementation object directly.
+         String contextOID = this.getObjectOID(context);
+         JBossNamingContextImpl jbossContext = (contextOID == null ? null : contextImpls.get(contextOID));
+         if (jbossContext != null)
+            jbossContext.bind(ncx, obj);
+         else
+            NamingContextExtHelper.narrow(context).bind(ncx, obj);
+      }
+   }
+
+   /**
+    * Bind a context to a name.
+    */
+   public void bind_context(NameComponent[] nc, NamingContext obj) throws NotFound, CannotProceed, InvalidName,
+         AlreadyBound
+   {
+      if (this.destroyed)
+         throw new CannotProceed();
+
+      Name n = new Name(nc);
+      Name ctx = n.ctxName();
+      NameComponent nb = n.baseNameComponent();
+
+      if (ctx == null)
+      {
+         if (this.names.containsKey(n))
+         {
+            // if the name is still in use, try to ping the object
+            org.omg.CORBA.Object ref = (org.omg.CORBA.Object) this.names.get(n);
+            if (isDead(ref))
+               unbind(n.components());
+            else
+               throw new AlreadyBound();
+         }
+         else if (this.contexts.containsKey(n))
+         {
+            // if the name is still in use, try to ping the object
+            org.omg.CORBA.Object ref = (org.omg.CORBA.Object) this.contexts.get(n);
+            if (isDead(ref))
+            {
+               rebind_context(n.components(), obj);
+               return;
+            }
+            throw new AlreadyBound();
+         }
+
+         if ((this.contexts.put(n, obj)) != null)
+            throw new CannotProceed(_this(), n.components());
+
+         logger.debug("Bound context: " + n.toString());
+      }
+      else
+      {
+         NameComponent[] ncx = new NameComponent[] {nb};
+         org.omg.CORBA.Object context = this.resolve(ctx.components());
+         
+         // try first to call the context implementation object directly.
+         String contextOID = this.getObjectOID(context);
+         JBossNamingContextImpl jbossContext = (contextOID == null ? null : contextImpls.get(contextOID));
+         if (jbossContext != null)
+            jbossContext.bind_context(ncx, obj);
+         else
+            NamingContextExtHelper.narrow(context).bind_context(ncx, obj);
+      }
+   }
+
+   public NamingContext bind_new_context(NameComponent[] nc) throws NotFound, CannotProceed, InvalidName, AlreadyBound
+   {
+      if (this.destroyed)
+         throw new CannotProceed();
+
+      if (nc == null || nc.length == 0)
+         throw new InvalidName();
+
+      NamingContext context = new_context();
+      if (context == null)
+         throw new CannotProceed();
+
+      bind_context(nc, context);
+      return context;
+   }
+
+   public void destroy() throws NotEmpty
+   {
+      if (this.destroyed)
+         return;
+
+      if (!this.names.isEmpty() || !this.contexts.isEmpty())
+         throw new NotEmpty();
+      else
+      {
+         this.names = null;
+         this.contexts = null;
+         this.destroyed = true;
+      }
+   }
+
+   /**
+    * List all bindings
+    */
+   public void list(int how_many, BindingListHolder bl, BindingIteratorHolder bi)
+   {
+      if (this.destroyed)
+         return;
+
+      Binding[] result;
+      this.cleanup();
+
+      int size = how_many();
+
+      Iterator<Name> names = this.names.keySet().iterator();
+      Iterator<Name> contexts = this.contexts.keySet().iterator();
+
+      if (how_many < size)
+      {
+         // counter for copies
+         int how_many_ctr = how_many;
+
+         // set up an array with "how_many" bindings
+         result = new Binding[how_many];
+         for (; names.hasNext() && how_many_ctr > 0; how_many_ctr--)
+         {
+            result[how_many_ctr - 1] = new Binding((names.next()).components(), BindingType.nobject);
+         }
+
+         for (; contexts.hasNext() && how_many_ctr > 0; how_many_ctr--)
+         {
+            result[how_many_ctr - 1] = new Binding((contexts.next()).components(), BindingType.ncontext);
+         }
+
+         // create a new BindingIterator for the remaining arrays
+         size -= how_many;
+         Binding[] rest = new Binding[size];
+         for (; names.hasNext() && size > 0; size--)
+         {
+            rest[size - 1] = new Binding(((Name) names.next()).components(), BindingType.nobject);
+         }
+
+         for (; contexts.hasNext() && size > 0; size--)
+         {
+            rest[size - 1] = new Binding(((Name) contexts.next()).components(), BindingType.ncontext);
+         }
+
+         org.omg.CORBA.Object o = null;
+         try
+         {
+            // Iterators are activated with the RootPOA (transient)
+            byte[] oid = rootPoa.activate_object(new BindingIteratorImpl(rest));
+            o = rootPoa.id_to_reference(oid);
+         }
+         catch (Exception e)
+         {
+            logger.error("unexpected exception", e);
+            throw new INTERNAL(e.toString());
+         }
+
+         bi.value = BindingIteratorHelper.narrow(o);
+      }
+      else
+      {
+         result = new Binding[size];
+         for (; names.hasNext() && size > 0; size--)
+         {
+            result[size - 1] = new Binding((names.next()).components(), BindingType.nobject);
+         }
+
+         for (; contexts.hasNext() && size > 0; size--)
+         {
+            result[size - 1] = new Binding((contexts.next()).components(), BindingType.ncontext);
+         }
+      }
+
+      bl.value = result;
+   }
+
+   public NamingContext new_context()
+   {
+      try
+      {
+         // create and initialize a new context.
+         JBossNamingContextImpl newContextImpl = new JBossNamingContextImpl();
+         newContextImpl.init(this.poa, this.doPurge, this.noPing);
+         // create the oid for the new context and activate it with the naming service POA.
+         String oid = new String(this.poa.servant_to_id(this)) + "/ctx" + (++this.childCount);
+         this.poa.activate_object_with_id(oid.getBytes(), newContextImpl);
+         // add the newly-created context to the cache.
+         contextImpls.put(oid, newContextImpl);
+         return NamingContextExtHelper.narrow(this.poa.create_reference_with_id(oid.getBytes(),
+               "IDL:omg.org/CosNaming/NamingContextExt:1.0"));
+      }
+      catch (Exception e)
+      {
+         logger.error("Cannot create CORBA naming context", e);
+         return null;
+      }
+   }
+
+   /**
+    * Bind an object to a name that's already in use, i.e. rebind the name.
+    */
+   public void rebind(NameComponent[] nc, org.omg.CORBA.Object obj) throws NotFound, CannotProceed, InvalidName
+   {
+      if (this.destroyed)
+         throw new CannotProceed();
+
+      if (nc == null || nc.length == 0)
+         throw new InvalidName();
+
+      if (obj == null)
+         throw new org.omg.CORBA.BAD_PARAM();
+
+      Name n = new Name(nc);
+      Name ctx = n.ctxName();
+      NameComponent nb = n.baseNameComponent();
+
+      if (ctx == null)
+      {
+         // the name is bound, but it is bound to a context - the client should have been using rebind_context!
+         if (this.contexts.containsKey(n))
+            throw new NotFound(NotFoundReason.not_object, new NameComponent[]{nb});
+
+         // try remove an existing binding.
+         org.omg.CORBA.Object ref = (org.omg.CORBA.Object) this.names.remove(n);
+         if (ref != null)
+            ref._release();
+
+         // do the rebinding in this context
+         this.names.put(n, obj);
+         logger.debug("re-Bound name: " + n.toString());
+      }
+      else
+      {
+         // rebind in the correct context
+         NameComponent[] ncx = new NameComponent[] {nb};
+         org.omg.CORBA.Object context = this.resolve(ctx.components());
+         
+         // try first to call the context implementation object directly.
+         String contextOID = this.getObjectOID(context);
+         JBossNamingContextImpl jbossContext = (contextOID == null ? null : contextImpls.get(contextOID));
+         if (jbossContext != null)
+            jbossContext.rebind(ncx, obj);
+         else
+            NamingContextExtHelper.narrow(context).rebind(ncx, obj);
+      }
+   }
+
+   /**
+    * Bind an context to a name that's already in use, i.e. rebind the name.
+    */
+   public void rebind_context(NameComponent[] nc, NamingContext obj) throws NotFound, CannotProceed, InvalidName
+   {
+      if (this.destroyed)
+         throw new CannotProceed();
+
+      if (nc == null || nc.length == 0)
+         throw new InvalidName();
+
+      if (obj == null)
+         throw new org.omg.CORBA.BAD_PARAM();
+
+      Name n = new Name(nc);
+      Name ctx = n.ctxName();
+      NameComponent nb = n.baseNameComponent();
+
+      if (ctx == null)
+      {
+         // the name is bound, but it is bound to an object - the client should have been using rebind().
+         if (this.names.containsKey(n))
+            throw new NotFound(NotFoundReason.not_context, new NameComponent[] {nb});
+   
+         // try to remove an existing context binding.
+         org.omg.CORBA.Object ref = (org.omg.CORBA.Object) this.contexts.remove(n);
+         if (ref != null)
+         {
+            ref._release();
+            // remove the old context from the implementation cache.
+            String oid = this.getObjectOID(ref);
+            if (oid != null)
+               contextImpls.remove(oid);
+         }
+
+         this.contexts.put(n, obj);
+         logger.debug("Re-Bound context: " + n.baseNameComponent().id);
+      }
+      else
+      {
+         // rebind in the correct context
+         NameComponent[] ncx = new NameComponent[] {nb};
+         org.omg.CORBA.Object context = this.resolve(ctx.components());
+         
+         // try first to call the context implementation object directly.
+         String contextOID = this.getObjectOID(context);
+         JBossNamingContextImpl jbossContext = (contextOID == null ? null : contextImpls.get(contextOID));
+         if (jbossContext != null)
+            jbossContext.rebind_context(ncx, obj);
+         else
+            NamingContextExtHelper.narrow(context).rebind_context(ncx, obj);
+      }
+   }
+
+   public org.omg.CORBA.Object resolve(NameComponent[] nc) throws NotFound, CannotProceed, InvalidName
+   {
+      if (this.destroyed)
+         throw new CannotProceed();
+
+      if (nc == null || nc.length == 0)
+         throw new InvalidName();
+
+      Name n = new Name(nc[0]);
+      if (nc.length > 1)
+      {
+         org.omg.CORBA.Object next_context = (org.omg.CORBA.Object) this.contexts.get(n);
+         if ((next_context == null) || (isDead(next_context)))
+            throw new NotFound(NotFoundReason.missing_node, nc);
+
+         NameComponent[] nc_prime = new NameComponent[nc.length - 1];
+         for (int i = 1; i < nc.length; i++)
+            nc_prime[i - 1] = nc[i];
+
+         // try first to call the context implementation object directly.
+         String contextOID = this.getObjectOID(next_context);
+         JBossNamingContextImpl jbossContext = (contextOID == null ? null : contextImpls.get(contextOID));
+         if (jbossContext != null)
+            return jbossContext.resolve(nc_prime);
+         else
+            return NamingContextExtHelper.narrow(next_context).resolve(nc_prime);
+      }
+      else
+      {
+         org.omg.CORBA.Object result = (org.omg.CORBA.Object) this.contexts.get(n);
+
+         if (result == null)
+            result = (org.omg.CORBA.Object) this.names.get(n);
+
+         if (result == null)
+            throw new NotFound(NotFoundReason.missing_node, n.components());
+
+         if (!noPing && isDead(result))
+            throw new NotFound(NotFoundReason.missing_node, n.components());
+
+         return result;
+      }
+   }
+
+   /**
+    * Unbind a name
+    */
+   public void unbind(NameComponent[] nc) throws NotFound, CannotProceed, InvalidName
+   {
+      if (this.destroyed)
+         throw new CannotProceed();
+
+      if (nc == null || nc.length == 0)
+         throw new InvalidName();
+
+      Name n = new Name(nc);
+      Name ctx = n.ctxName();
+      NameComponent nb = n.baseNameComponent();
+
+      if (ctx == null)
+      {
+         if (this.names.containsKey(n))
+         {
+            org.omg.CORBA.Object ref = (org.omg.CORBA.Object) this.names.remove(n);
+            ref._release();
+            logger.debug("Unbound: " + n.toString());
+         }
+         else if (this.contexts.containsKey(n))
+         {
+            org.omg.CORBA.Object ref = (org.omg.CORBA.Object) this.contexts.remove(n);
+            ref._release();
+            // remove the context from the implementation cache.
+            String oid = this.getObjectOID(ref);
+            if (oid != null)
+               contextImpls.remove(oid);
+
+            logger.debug("Unbound: " + n.toString());
+         }
+         else
+         {
+            logger.warn("Unbind failed for " + n.toString());
+            throw new NotFound(NotFoundReason.not_context, n.components());
+         }
+      }
+      else
+      {
+         NameComponent[] ncx = new NameComponent[] {nb};
+         org.omg.CORBA.Object context = this.resolve(ctx.components());
+         
+         // try first to call the context implementation object directly.
+         String contextOID = this.getObjectOID(context);
+         JBossNamingContextImpl jbossContext = (contextOID == null ? null : contextImpls.get(contextOID));
+         if (jbossContext != null)
+            jbossContext.unbind(ncx);
+         else
+            NamingContextExtHelper.narrow(context).unbind(ncx);
+      }
+   }
+
+   //======================================= NamingContextExtOperations Methods ==================================//
+
+   public org.omg.CORBA.Object resolve_str(String n) throws NotFound, CannotProceed, InvalidName
+   {
+      return resolve(to_name(n));
+   }
+   
+   /**
+    * Convert a string into name
+    * 
+    * @throws InvalidName
+    */
+   public NameComponent[] to_name(String sn) throws InvalidName
+   {
+      return Name.toName(sn);
+   }
+
+   /**
+    * Convert a name into its string representation
+    */
+   public String to_string(NameComponent[] n) throws InvalidName
+   {
+      return Name.toString(n);
+   }
+
+   /**
+    * Convert a name into its URL representation.
+    */
+   public String to_url(String addr, String sn) throws InvalidAddress, InvalidName
+   {
+      org.jacorb.orb.util.CorbaLoc corbaLoc;
+      try
+      {
+         corbaLoc = new org.jacorb.orb.util.CorbaLoc((org.jacorb.orb.ORB) orb, addr);
+         return corbaLoc.toCorbaName(sn);
+      }
+      catch (IllegalArgumentException ia)
+      {
+         throw new InvalidAddress();
+      }
+   }
+
+   //======================================= Private Helper Methods ==================================//
+
+   /**
+    * cleanup bindings, i.e. ping every object and remove bindings to non-existent objects
+    */
+   private void cleanup()
+   {
+      // Check if object purging enabled
+      if (!this.doPurge)
+         return;
+
+      for (Name key : this.names.keySet())
+      {
+         if (isDead(((org.omg.CORBA.Object) this.names.get(key))))
+         {
+            logger.debug("Removing name " + key.baseNameComponent().id);
+            this.names.remove(key);
+         }
+      }
+
+      for (Name key : this.contexts.keySet())
+      {
+         org.omg.CORBA.Object object = (org.omg.CORBA.Object) this.contexts.get(key);
+         if (isDead(object))
+         {
+            logger.debug("Removing context " + key.baseNameComponent().id);
+            this.contexts.remove(key);
+            String oid = this.getObjectOID(object);
+            if (oid != null)
+               contextImpls.remove(oid);
+         }
+      }
+   }
+
+   /**
+    * <p>
+    * Obtains the OID of the specified CORBA object.
+    * </p>
+    * 
+    * @param object the CORBA object whose OID is to be extracted.
+    * @return a {@code String} representing the object OID or null if the method is unable to obtain the object OID.
+    */
+   private String getObjectOID(org.omg.CORBA.Object object)
+   {
+      String oid = null;
+      try
+      {
+         byte[] oidBytes = this.poa.reference_to_id(object);
+         if (oidBytes != null)
+            oid = new String(oidBytes);
+      }
+      catch (Exception e)
+      {
+         logger.debug("Unable to obtain oid from object", e);
+      }
+      return oid;
+   }
+   
+   /**
+    * @return The number of bindings in this context
+    */
+   private int how_many()
+   {
+      if (this.destroyed)
+         return 0;
+      return this.names.size() + this.contexts.size();
+   }
+
+   /**
+    * determine if non_existent
+    */
+   private boolean isDead(org.omg.CORBA.Object o)
+   {
+      boolean non_exist = true;
+      try
+      {
+         non_exist = o._non_existent();
+      }
+      catch (org.omg.CORBA.SystemException e)
+      {
+         non_exist = true;
+      }
+      return non_exist;
+   }
+   
+   /**
+    * Overrides writeObject in Serializable
+    */
+   private void writeObject(java.io.ObjectOutputStream out) throws IOException
+   {
+      /*
+       * For serialization, object references are transformed into strings
+       */
+      for (Name key : this.contexts.keySet())
+      {
+         org.omg.CORBA.Object o = (org.omg.CORBA.Object) this.contexts.remove(key);
+         this.contexts.put(key, orb.object_to_string(o));
+      }
+
+      for (Name key : this.names.keySet())
+      {
+         org.omg.CORBA.Object o = (org.omg.CORBA.Object) this.names.remove(key);
+         this.names.put(key, orb.object_to_string(o));
+      }
+
+      out.defaultWriteObject();
+   }
+}



More information about the jboss-cvs-commits mailing list