Author: ehillenius
Date: Thu Apr 12 13:58:21 2007
New Revision: 528231

URL: http://svn.apache.org/viewvc?view=rev&rev=528231
Log:
improvements in feedbackmessages handling:
* got rid of special purpose clearThis and clearThat in favor of supporting a 
filter for clearing up. Much more flexible for users this way, and just more 
elegant.
* clearing up of session scoped, rendered messages and component scoped 
(regardles of whether they were rendered or not) now folded into one method.

Modified:
    
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java
    
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/Session.java
    
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/feedback/FeedbackMessages.java
    
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/feedback/IFeedbackMessageFilter.java
    
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/protocol/http/MockWebApplicationTest.java

Modified: 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java?view=diff&rev=528231&r1=528230&r2=528231
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java
 Thu Apr 12 13:58:21 2007
@@ -533,7 +533,8 @@
         */
        public void setAutomaticallyClearFeedbackMessages(boolean 
automaticallyClearFeedbackMessages)
        {
-               // FIXME This method is a quick fix for a unit testing problem 
that should not exist
+               // FIXME This method is a quick fix for a unit testing problem 
that
+               // should not exist
                this.automaticallyClearFeedbackMessages = 
automaticallyClearFeedbackMessages;
        }
 
@@ -871,7 +872,6 @@
                        // the session
                        try
                        {
-                               session.cleanupRenderedFeedbackMessages();
                                final Page page = getResponsePage();
                                if (page != null)
                                {

Modified: 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/Session.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/Session.java?view=diff&rev=528231&r1=528230&r2=528231
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/Session.java
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/Session.java
 Thu Apr 12 13:58:21 2007
@@ -35,6 +35,7 @@
 import org.apache.wicket.authorization.IAuthorizationStrategy;
 import org.apache.wicket.feedback.FeedbackMessage;
 import org.apache.wicket.feedback.FeedbackMessages;
+import org.apache.wicket.feedback.IFeedbackMessageFilter;
 import org.apache.wicket.request.ClientInfo;
 import org.apache.wicket.session.ISessionStore;
 import org.apache.wicket.util.convert.IConverter;
@@ -158,6 +159,34 @@
                }
        }
 
+       /**
+        * Filter that returns all component scoped messages ([EMAIL PROTECTED] 
FeedbackMessage#getReporter()} !=
+        * null).
+        */
+       public static final IFeedbackMessageFilter MESSAGES_FOR_COMPONENTS = 
new IFeedbackMessageFilter()
+       {
+               private static final long serialVersionUID = 1L;
+
+               public boolean accept(FeedbackMessage message)
+               {
+                       return message.getReporter() != null;
+               }
+       };
+
+       /**
+        * Filter that returns all session scoped messages ([EMAIL PROTECTED] 
FeedbackMessage#getReporter()} ==
+        * null).
+        */
+       private static final IFeedbackMessageFilter 
RENDERED_SESSION_SCOPED_MESSAGES = new IFeedbackMessageFilter()
+       {
+               private static final long serialVersionUID = 1L;
+
+               public boolean accept(FeedbackMessage message)
+               {
+                       return message.getReporter() == null && 
message.isRendered();
+               }
+       };
+
        /** meta data key for missing body tags logging. */
        public static final MetaDataKey PAGEMAP_ACCESS_MDK = new MetaDataKey(
                        PageMapAccessMetaData.class)
@@ -363,15 +392,8 @@
        }
 
        /**
-        * Cleans up any unrendered, dangling feedback messages there may be. 
This
-        * implementation calls [EMAIL PROTECTED] 
FeedbackMessages#clearComponentSpecific()} to
-        * aggresively ensure there won't be memory leaks. Clients can override 
this
-        * method to e.g. call [EMAIL PROTECTED] 
FeedbackMessages#clearPageSpecific(Page)}.
-        * <p>
-        * This method should be called from by the framework right before a 
even
-        * handler is called. There is no need for clients to call this method
-        * directly
-        * </p>
+        * Cleans up all rendered feedback messages and any unrendered, dangling
+        * feedback messages there may be left after that.
         * 
         * @param page
         *            any current page (the page on which the event handler is 
that
@@ -379,7 +401,15 @@
         */
        public void cleanupFeedbackMessages(Page page)
        {
-               feedbackMessages.clearComponentSpecific();
+
+               // if session scoped, rendered messages got indeed cleaned up, 
mark the
+               // session as dirty
+               if (feedbackMessages.clear(RENDERED_SESSION_SCOPED_MESSAGES) > 
0)
+               {
+                       dirty();
+               }
+
+               feedbackMessages.clear(MESSAGES_FOR_COMPONENTS);
        }
 
        /**
@@ -1234,22 +1264,6 @@
 
                                setAttribute(attribute, object);
                        }
-               }
-       }
-
-       /**
-        * Removes any rendered feedback messages as well as compacts memory. 
This
-        * method is usually called at the end of the request cycle processing.
-        */
-       protected void cleanupRenderedFeedbackMessages()
-       {
-               int size = feedbackMessages.size();
-               feedbackMessages.clearRendered();
-
-               // the session is dirty when the list of feedback messages was 
changed
-               if (size != feedbackMessages.size())
-               {
-                       dirty();
                }
        }
 

Modified: 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/feedback/FeedbackMessages.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/feedback/FeedbackMessages.java?view=diff&rev=528231&r1=528230&r2=528231
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/feedback/FeedbackMessages.java
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/feedback/FeedbackMessages.java
 Thu Apr 12 13:58:21 2007
@@ -26,7 +26,6 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.wicket.Component;
 import org.apache.wicket.IClusterable;
-import org.apache.wicket.Page;
 import org.apache.wicket.util.concurrent.CopyOnWriteArrayList;
 import org.apache.wicket.util.string.StringList;
 
@@ -34,6 +33,9 @@
 /**
  * Holds list of feedback messages. The list can be added to, cleared, queried
  * and filtered.
+ * <p>
+ * WARNING: This class should typically NOT be used directly.
+ * <p>
  * 
  * @author Eelco Hillenius
  * @author Jonathan Locke
@@ -63,22 +65,6 @@
        }
 
        /**
-        * Call this constructor if you want to replace the internal store with
-        * another implemention then the default (ArrayList). This could be a
-        * [EMAIL PROTECTED] CopyOnWriteArrayList} if this feedbackmessages 
instance is used by
-        * multiply threads.
-        * 
-        * @param messagesList
-        * 
-        */
-       public FeedbackMessages(List messagesList)
-       {
-               if (messagesList == null)
-                       throw new IllegalArgumentException("messages list can't 
be null");
-               messages = messagesList;
-       }
-
-       /**
         * Adds a message
         * 
         * @param reporter
@@ -91,74 +77,43 @@
        }
 
        /**
-        * Clears any existing messages
+        * Clears any existing messages.
+        * 
+        * @return The number of messages deleted
         */
-       public final void clear()
+       public final int clear()
        {
-               messages.clear();
+               return clear(null);
        }
 
        /**
-        * Clears any messages specifically for components. This is an 
aggressive
-        * cleanup to ensure there won't be a memory leak in session.
-        */
-       public final void clearComponentSpecific()
-       {
-               for (int i = messages.size() - 1; i >= 0; i--)
-               {
-                       final FeedbackMessage msg = 
(FeedbackMessage)messages.get(i);
-                       Component reporter = msg.getReporter();
-                       if (reporter != null)
-                       {
-                               messages.remove(i);
-                       }
-               }
-               trimToSize();
-       }
-
-       /**
-        * Clears any messages specifically for components on the provided page.
+        * Clears all messsages that are accepted by the filter.
         * 
-        * @param page
-        *            The page to clear messages for
+        * @param filter
+        *            Filter for selecting messages. If null, all messages will 
be
+        *            returned
+        * @return The number of messages deleted
         */
-       public final void clearPageSpecific(Page page)
+       public final int clear(final IFeedbackMessageFilter filter)
        {
-               if (page == null)
+               if (messages.size() == 0)
                {
-                       return;
+                       return 0;
                }
 
-               for (int i = messages.size() - 1; i >= 0; i--)
+               int count = 0;
+               for (final Iterator iterator = messages.iterator(); 
iterator.hasNext();)
                {
-                       final FeedbackMessage msg = 
(FeedbackMessage)messages.get(i);
-                       Component reporter = msg.getReporter();
-                       if (reporter != null)
+                       final FeedbackMessage message = 
(FeedbackMessage)iterator.next();
+                       if (filter == null || filter.accept(message))
                        {
-                               Page reporterPage = 
(Page)reporter.findParent(Page.class);
-                               if (reporterPage != null && 
reporterPage.equals(page))
-                               {
-                                       messages.remove(i);
-                               }
+                               messages.remove(message);
+                               count++;
                        }
                }
-               trimToSize();
-       }
 
-       /**
-        * Removes messages that have been rendered
-        */
-       public final void clearRendered()
-       {
-               for (int i = messages.size() - 1; i >= 0; i--)
-               {
-                       final FeedbackMessage msg = 
(FeedbackMessage)messages.get(i);
-                       if (msg.isRendered())
-                       {
-                               messages.remove(i);
-                       }
-               }
                trimToSize();
+               return count;
        }
 
        /**
@@ -311,7 +266,8 @@
         * Gets a list of messages from the page using a filter.
         * 
         * @param filter
-        *            Filter for selecting messages
+        *            Filter for selecting messages. If null, all messages will 
be
+        *            returned
         * @return The messages or an empty list if no messages are found
         */
        public final List messages(final IFeedbackMessageFilter filter)
@@ -320,19 +276,17 @@
                {
                        return Collections.EMPTY_LIST;
                }
-               else
+
+               final List list = new ArrayList();
+               for (final Iterator iterator = messages.iterator(); 
iterator.hasNext();)
                {
-                       final List list = new ArrayList();
-                       for (final Iterator iterator = messages.iterator(); 
iterator.hasNext();)
+                       final FeedbackMessage message = 
(FeedbackMessage)iterator.next();
+                       if (filter == null || filter.accept(message))
                        {
-                               final FeedbackMessage message = 
(FeedbackMessage)iterator.next();
-                               if (filter == null || filter.accept(message))
-                               {
-                                       list.add(message);
-                               }
+                               list.add(message);
                        }
-                       return list;
                }
+               return list;
        }
 
        /**

Modified: 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/feedback/IFeedbackMessageFilter.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/feedback/IFeedbackMessageFilter.java?view=diff&rev=528231&r1=528230&r2=528231
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/feedback/IFeedbackMessageFilter.java
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/feedback/IFeedbackMessageFilter.java
 Thu Apr 12 13:58:21 2007
@@ -19,12 +19,25 @@
 import org.apache.wicket.IClusterable;
 
 /**
- * Interface for filtering feedback messages
+ * Interface for filtering feedback messages.
  * 
  * @author Jonathan Locke
  */
 public interface IFeedbackMessageFilter extends IClusterable
 {
+       /**
+        * Filter that returns simply all available messages.
+        */
+       public static final IFeedbackMessageFilter ALL = new 
IFeedbackMessageFilter()
+       {
+               private static final long serialVersionUID = 1L;
+
+               public boolean accept(FeedbackMessage message)
+               {
+                       return true;
+               }
+       };
+
        /**
         * @param message
         *            The message to test for inclusion

Modified: 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/protocol/http/MockWebApplicationTest.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/protocol/http/MockWebApplicationTest.java?view=diff&rev=528231&r1=528230&r2=528231
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/protocol/http/MockWebApplicationTest.java
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/jdk-1.4/wicket/src/test/java/org/apache/wicket/protocol/http/MockWebApplicationTest.java
 Thu Apr 12 13:58:21 2007
@@ -24,6 +24,7 @@
 import org.apache.wicket.Session;
 import org.apache.wicket.feedback.FeedbackMessage;
 import org.apache.wicket.feedback.FeedbackMessages;
+import org.apache.wicket.feedback.IFeedbackMessageFilter;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.util.diff.DiffUtil;
 import org.apache.wicket.util.tester.WicketTester;
@@ -36,10 +37,22 @@
  */
 public class MockWebApplicationTest extends TestCase
 {
-
        private WicketTester application;
 
        /**
+        * Filter that returns all rendered messages.
+        */
+       private static final IFeedbackMessageFilter RENDERED_MESSAGES = new 
IFeedbackMessageFilter()
+       {
+               private static final long serialVersionUID = 1L;
+
+               public boolean accept(FeedbackMessage message)
+               {
+                       return message.isRendered();
+               }
+       };
+
+       /**
         * Create the test.
         * 
         * @param name
@@ -56,6 +69,7 @@
                application = new WicketTester();
                application.startPage(MockPage.class);
        }
+
        protected void tearDown() throws Exception
        {
                application.destroy();
@@ -76,9 +90,10 @@
        }
 
        /**
-        * Tests the clean up of flash messages put into the session when they 
are rendered.
+        * Tests the clean up of flash messages put into the session when they 
are
+        * rendered.
         */
-       public void testSessionFeedbackMessagesCleanUp() 
+       public void testSessionFeedbackMessagesCleanUp()
        {
                Session session = Session.get();
                session.info("Message");
@@ -87,13 +102,14 @@
                Iterator iterator = feedbackMessages.iterator();
                FeedbackMessage message = (FeedbackMessage)iterator.next();
                message.markRendered();
-               feedbackMessages.clearRendered();
+               feedbackMessages.clear(RENDERED_MESSAGES);
                assertEquals(1, feedbackMessages.size());
                message = (FeedbackMessage)iterator.next();
                message.markRendered();
-               feedbackMessages.clearRendered();
+               feedbackMessages.clear(RENDERED_MESSAGES);
                assertEquals(0, feedbackMessages.size());
        }
+
        /**
         * @throws Exception
         */


Reply via email to