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
*/