Author: pats
Date: Thu Apr 21 22:24:26 2011
New Revision: 1095835

URL: http://svn.apache.org/viewvc?rev=1095835&view=rev
Log:
RIVER-395
Changes to discovery code to make it continue to notify even if a listener 
throws an exception. These changes have passed the existing discovery-related 
QA tests.

Modified:
    river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupDiscovery.java
    
river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupDiscoveryManager.java
    
river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupLocatorDiscovery.java

Modified: 
river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupDiscovery.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupDiscovery.java?rev=1095835&r1=1095834&r2=1095835&view=diff
==============================================================================
--- river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupDiscovery.java 
(original)
+++ river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupDiscovery.java 
Thu Apr 21 22:24:26 2011
@@ -972,17 +972,22 @@ public class LookupDiscovery implements 
                                     }//endif(groups.length)
                                 }//end loop
                             }//endif(firstListener && isLoggable(Level.FINEST)
-                            switch(task.eventType) {
-                                case DISCOVERED:
-                                    l.discovered(e);
-                                    break;
-                                case DISCARDED:
-                                    l.discarded(e);
-                                    break;
-                                case CHANGED:
-                                    ((DiscoveryChangeListener)l).changed(e);
-                                    break;
-                            }//end switch(eventType)
+                            try {
+                               switch(task.eventType) {
+                                    case DISCOVERED:
+                                       l.discovered(e);
+                                       break;
+                                    case DISCARDED:
+                                       l.discarded(e);
+                                       break;
+                                    case CHANGED:
+                                       ((DiscoveryChangeListener)l).changed(e);
+                                       break;
+                               }//end switch(eventType)
+                            } catch (Throwable t) {
+                                logger.log(Levels.HANDLED, "a discovery 
listener failed to process a " +
+                                       (task.eventType == DISCARDED ? 
"discard" : task.eventType == DISCOVERED ? "discover" : "changed") + " event", 
t);
+                            }
                             firstListener = false;
                        }//end loop
                        return null;

Modified: 
river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupDiscoveryManager.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupDiscoveryManager.java?rev=1095835&r1=1095834&r2=1095835&view=diff
==============================================================================
--- 
river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupDiscoveryManager.java
 (original)
+++ 
river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupDiscoveryManager.java
 Thu Apr 21 22:24:26 2011
@@ -25,6 +25,10 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.logging.Logger;
+
+import com.sun.jini.logging.Levels;
+
 import net.jini.config.Configuration;
 import net.jini.config.ConfigurationException;
 import net.jini.config.EmptyConfiguration;
@@ -67,8 +71,7 @@ import net.jini.core.lookup.ServiceRegis
  * <p>
  * </a>
  *
- * Currently, there are no loggers directly supported by this implementation
- * of <code>LookupDiscoveryManager</code>.  All logging information produced
+ * With one exception, all logging information produced
  * when using this utility is controlled by the loggers supported by the
  * following utilities:
  * <p>
@@ -77,9 +80,32 @@ import net.jini.core.lookup.ServiceRegis
  *  <li> {@link LookupLocatorDiscovery} 
  * </ul>
  * <p>
- * For information about how to obtain logging information when using this
- * implementation of  <code>LookupDiscoveryManager</code>, please refer to
- * the documentation provided with the discovery utilities listed above.
+ * This implementation of <code>LookupDiscoveryManager</code> uses the {@link 
Logger}
+ * named <code>net.jini.discovery.LookupDiscoveryManager</code> to log 
information
+ * at the following logging levels: <p>
+ * 
+ * <table border="1" cellpadding="5"
+ *       summary="Describes the information logged by LookupDiscoveryManager, 
and
+ *                 the levels at which that information is logged">
+ * 
+ * <caption halign="center" valign="top">
+ *   <b><code>net.jini.discovery.LookupDiscoveryManager</code></b>
+ * </caption>
+ *
+ * <tr> <th scope="col"> Level</th>
+ *      <th scope="col"> Description</th>
+ * </tr>
+ * 
+ * <tr>
+ *   <td>{@link java.util.logging.Level#HANDLED HANDLED}</td>
+ *   <td>
+ *     when this utility asynchronously invokes a {@link 
net.jini.discovery.DiscoveryListener}
+ *     implementation and that listener throws and unchecked exception. If the 
listener throws
+ *     in a synchronous path (namely, via {@link 
#addDiscoveryListener(DiscoveryListener)}) then
+ *     the exception is not trapped and will instead throw back to the caller.
+ *   </td>
+ * </tr>
+ * </table>
  * <p>
  *
  * @author Sun Microsystems, Inc.
@@ -93,6 +119,11 @@ public class LookupDiscoveryManager impl
                                                DiscoveryGroupManagement,
                                                DiscoveryLocatorManagement
 {
+    /* Name of this component; used in config entry retrieval and the logger.*/
+    private static final String COMPONENT_NAME
+                                        = 
"net.jini.discovery.LookupDiscoveryManager";
+    /* Logger used by this utility. */
+    private static final Logger logger = Logger.getLogger(COMPONENT_NAME);
     /** Constant that indicates the discovery mechanism is group discovery */
     public static final int FROM_GROUP = 1;
     /** Constant that indicates the discovery mechanism is locator discovery */
@@ -1350,7 +1381,12 @@ public class LookupDiscoveryManager impl
        Iterator iter = notifies.iterator();
        while(iter.hasNext()) {
            DiscoveryListener l = (DiscoveryListener)iter.next();
-            notifyListener(l, groupsMap, eventType);
+           try {
+                notifyListener(l, groupsMap, eventType);
+           } catch (Throwable t) {
+                logger.log(Levels.HANDLED, "a discovery listener failed to 
process a " +
+                       (eventType == DISCARDED ? "discard" : eventType == 
DISCOVERED ? "discover" : "changed") + " event", t);
+           }
        }
     }//end notifyListener
     
@@ -1364,7 +1400,8 @@ public class LookupDiscoveryManager impl
         }
         DiscoveryEvent evt = new DiscoveryEvent(LookupDiscoveryManager.this,
                                                 deepCopy((HashMap)groupsMap) );
-        switch(eventType) {
+        try {
+            switch(eventType) {
             case DISCOVERED:
                 l.discovered(evt);
                 break;
@@ -1374,7 +1411,11 @@ public class LookupDiscoveryManager impl
             case CHANGED:
                 ((DiscoveryChangeListener)l).changed(evt);
                 break;
-        }//end switch
+            }//end switch
+        } catch (Throwable t) {
+            logger.log(Levels.HANDLED, "a discovery listener failed to process 
a " +
+                    (eventType == DISCARDED ? "discard" : eventType == 
DISCOVERED ? "discover" : "changed") + " event", t);
+        }
     }//end notifyListener
 
     /** Determines if two sets of registrar member groups have identical

Modified: 
river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupLocatorDiscovery.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupLocatorDiscovery.java?rev=1095835&r1=1095834&r2=1095835&view=diff
==============================================================================
--- 
river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupLocatorDiscovery.java
 (original)
+++ 
river/jtsk/skunk/PatsRiver395/src/net/jini/discovery/LookupLocatorDiscovery.java
 Thu Apr 21 22:24:26 2011
@@ -650,11 +650,16 @@ public class LookupLocatorDiscovery impl
                             }//endif(groups.length)
                         }//end loop
                     }//endif(firstListener && isLoggable(Level.FINEST)
-                   if (task.discard) {
-                       l.discarded(e);
-                   } else {
-                       l.discovered(e);
-                    }//endif
+                    try {
+                       if (task.discard) {
+                           l.discarded(e);
+                       } else {
+                           l.discovered(e);
+                       }//endif
+                    } catch (Throwable t) {
+                       logger.log(Levels.HANDLED, "a discovery listener failed 
to process a " +
+                               (task.discard ? "discard" : "discover") + " 
event", t);
+                    }
                }//end loop
            }//end loop
        }//end run


Reply via email to