You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2011/10/15 00:03:17 UTC

svn commit: r1183526 - in /tapestry/tapestry5/trunk/tapestry-ioc/src: main/java/org/apache/tapestry5/ioc/internal/ main/java/org/apache/tapestry5/ioc/internal/services/ main/java/org/apache/tapestry5/ioc/internal/services/cron/ main/java/org/apache/tap...

Author: hlship
Date: Fri Oct 14 22:03:16 2011
New Revision: 1183526

URL: http://svn.apache.org/viewvc?rev=1183526&view=rev
Log:
TAP5-1539: Add registry will shutdown notifications

Deprecated RegistyDidShutdownListener ... a Runnable will due as well
Added methods to registry Runnables as "did" and "will" shutdown listeners

Modified:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownHub.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownListener.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java?rev=1183526&r1=1183525&r2=1183526&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java Fri Oct 14 22:03:16 2011
@@ -885,6 +885,20 @@ public class RegistryImpl implements Reg
         registryShutdownHub.addRegistryShutdownListener(listener);
     }
 
+    public void addRegistryShutdownListener(Runnable listener)
+    {
+        lock.check();
+
+        registryShutdownHub.addRegistryShutdownListener(listener);
+    }
+
+    public void addRegistryWillShutdownListener(Runnable listener)
+    {
+        lock.check();
+
+        registryShutdownHub.addRegistryWillShutdownListener(listener);
+    }
+
     public String expandSymbols(String input)
     {
         lock.check();

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImpl.java?rev=1183526&r1=1183525&r2=1183526&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImpl.java Fri Oct 14 22:03:16 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -14,7 +14,8 @@
 
 package org.apache.tapestry5.ioc.internal.services;
 
-import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newThreadSafeList;
+import org.apache.tapestry5.func.F;
+import org.apache.tapestry5.func.Worker;
 import org.apache.tapestry5.ioc.internal.util.OneShotLock;
 import org.apache.tapestry5.ioc.services.RegistryShutdownHub;
 import org.apache.tapestry5.ioc.services.RegistryShutdownListener;
@@ -22,26 +23,54 @@ import org.slf4j.Logger;
 
 import java.util.List;
 
+import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newThreadSafeList;
+
 public class RegistryShutdownHubImpl implements RegistryShutdownHub
 {
     private final OneShotLock lock = new OneShotLock();
 
     private final Logger logger;
 
-    private final List<RegistryShutdownListener> listeners = newThreadSafeList();
+    private final List<Runnable> listeners = newThreadSafeList();
+
+    private final List<Runnable> preListeners = newThreadSafeList();
 
     public RegistryShutdownHubImpl(Logger logger)
     {
         this.logger = logger;
     }
 
-    public void addRegistryShutdownListener(RegistryShutdownListener listener)
+    public void addRegistryShutdownListener(final RegistryShutdownListener listener)
+    {
+        assert listener != null;
+
+        addRegistryShutdownListener(new Runnable()
+        {
+            public void run()
+            {
+                listener.registryDidShutdown();
+            }
+        });
+    }
+
+    public void addRegistryShutdownListener(Runnable listener)
     {
+        assert listener != null;
+
         lock.check();
 
         listeners.add(listener);
     }
 
+    public void addRegistryWillShutdownListener(Runnable listener)
+    {
+        assert listener != null;
+
+        lock.check();
+
+        preListeners.add(listener);
+    }
+
     /**
      * Fires the {@link RegistryShutdownListener#registryDidShutdown()} method on each listener. At the end, all the
      * listeners are discarded.
@@ -50,18 +79,21 @@ public class RegistryShutdownHubImpl imp
     {
         lock.lock();
 
-        for (RegistryShutdownListener l : listeners)
+        F.flow(preListeners).concat(listeners).each(new Worker<Runnable>()
         {
-            try
-            {
-                l.registryDidShutdown();
-            }
-            catch (Exception ex)
+            public void work(Runnable element)
             {
-                logger.error(ServiceMessages.shutdownListenerError(l, ex), ex);
+                try
+                {
+                    element.run();
+                } catch (RuntimeException ex)
+                {
+                    logger.error(ServiceMessages.shutdownListenerError(element, ex), ex);
+                }
             }
-        }
+        });
 
+        preListeners.clear();
         listeners.clear();
     }
 

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java?rev=1183526&r1=1183525&r2=1183526&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java Fri Oct 14 22:03:16 2011
@@ -19,7 +19,6 @@ import org.apache.tapestry5.ioc.annotati
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.services.ParallelExecutor;
 import org.apache.tapestry5.ioc.services.RegistryShutdownHub;
-import org.apache.tapestry5.ioc.services.RegistryShutdownListener;
 import org.apache.tapestry5.ioc.services.cron.PeriodicExecutor;
 import org.apache.tapestry5.ioc.services.cron.PeriodicJob;
 import org.apache.tapestry5.ioc.services.cron.Schedule;
@@ -28,7 +27,7 @@ import org.slf4j.Logger;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
-public class PeriodicExecutorImpl implements PeriodicExecutor, Runnable, RegistryShutdownListener
+public class PeriodicExecutorImpl implements PeriodicExecutor, Runnable
 {
     private final ParallelExecutor parallelExecutor;
 
@@ -195,7 +194,13 @@ public class PeriodicExecutorImpl implem
     @PostInjection
     public void start(RegistryShutdownHub hub)
     {
-        hub.addRegistryShutdownListener(this);
+        hub.addRegistryShutdownListener(new Runnable()
+        {
+            public void run()
+            {
+                registryDidShutdown();
+            }
+        });
 
         thread.start();
     }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownHub.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownHub.java?rev=1183526&r1=1183525&r2=1183526&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownHub.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownHub.java Fri Oct 14 22:03:16 2011
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -23,4 +23,21 @@ public interface RegistryShutdownHub
      * Adds a listener for eventual notification.
      */
     void addRegistryShutdownListener(RegistryShutdownListener listener);
+
+    /**
+     * Adds a listener for eventual notification when the registry shuts down.  Runtime exceptions thrown by the listener
+     * will be logged and ignored.
+     *
+     * @since 5.3
+     */
+    void addRegistryShutdownListener(Runnable listener);
+
+    /**
+     * Adds a listener for eventual notification. RegistryWillShutdownListeners are notified before any standard listeners,
+     * and before service proxies and other parts of the Registry are  disabled. Runtime exceptions thrown by the listener will
+     * be logged and ignored.
+     *
+     * @since 5.3
+     */
+    void addRegistryWillShutdownListener(Runnable listener);
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownListener.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownListener.java?rev=1183526&r1=1183525&r2=1183526&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownListener.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownListener.java Fri Oct 14 22:03:16 2011
@@ -18,6 +18,9 @@ import java.util.EventListener;
 
 /**
  * Event listener interfaces for objects that need to know when the Registry shutsdown.
+ *
+ * @see RegistryShutdownHub#addRegistryShutdownListener(Runnable)
+ * @deprecated In Tapestry 5.3, to be removed in a later release.
  */
 public interface RegistryShutdownListener extends EventListener
 {

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImplTest.java?rev=1183526&r1=1183525&r2=1183526&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImplTest.java Fri Oct 14 22:03:16 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -15,12 +15,16 @@
 package org.apache.tapestry5.ioc.internal.services;
 
 import org.apache.tapestry5.ioc.internal.IOCInternalTestCase;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.services.RegistryShutdownListener;
-import static org.easymock.EasyMock.contains;
-import static org.easymock.EasyMock.same;
 import org.slf4j.Logger;
 import org.testng.annotations.Test;
 
+import java.util.List;
+
+import static org.easymock.EasyMock.contains;
+import static org.easymock.EasyMock.same;
+
 public class RegistryShutdownHubImplTest extends IOCInternalTestCase
 {
 
@@ -46,6 +50,40 @@ public class RegistryShutdownHubImplTest
         verify();
     }
 
+    @Test
+    public void pre_listeners_before_normal_listeners()
+    {
+        final List<String> ordering = CollectionFactory.newList();
+
+
+        RegistryShutdownHubImpl hub = new RegistryShutdownHubImpl(null);
+
+        for (int i = 1; i <= 3; i++)
+        {
+            final int k = i;
+
+            hub.addRegistryShutdownListener(new RegistryShutdownListener()
+            {
+                public void registryDidShutdown()
+                {
+                    ordering.add("did:" + k);
+                }
+            });
+
+            hub.addRegistryWillShutdownListener(new Runnable()
+            {
+                public void run()
+                {
+                    ordering.add("will:" + k);
+                }
+            });
+        }
+
+        hub.fireRegistryDidShutdown();
+
+        assertListsEquals(ordering, "will:1", "will:2", "will:3", "did:1", "did:2", "did:3");
+    }
+
     /**
      * Shows that multiple listener will be notified, and that an error in one doesn't prevent others from being
      * notified.