> We chose that, yes.  But would it be better to simply have all feedback
> messages stored in the session?  That would solve all our scoping problems
> wouldn't it?  Every feedback message would go into the session and then
> feedback panels could pull them out when they're ready to.  If a feedback
> message is in the session for more than one request cycle and it is not
> cleared
> by a feedback panel, we would discard it (and maybe warn in debug mode).

I think I'm fine with a session based solution. The thing that
wouldn't work anymore is when you assign messages to components/ pages
which are not rendered this request but a next request. That might be
too far-fetched to support though. However, the solution which I'll
post as a patch on the end of this message will support anything it
does now. The thing I like about putting them in the session is that
it is clean and will save a little bit of memory in the page. WDYT?

Eelco

Index: 
/Users/eelcohillenius/Documents/workspace_wicket/wicket-1.x/jdk-1.4/wicket/src/main/java/wicket/Component.java
===================================================================
--- 
/Users/eelcohillenius/Documents/workspace_wicket/wicket-1.x/jdk-1.4/wicket/src/main/java/wicket/Component.java
      (revision
524461)
+++ 
/Users/eelcohillenius/Documents/workspace_wicket/wicket-1.x/jdk-1.4/wicket/src/main/java/wicket/Component.java
      (working
copy)
@@ -662,7 +662,7 @@
         */
        public final void debug(final String message)
        {
-               getPage().getFeedbackMessages().debug(this, message);
+               Page.addMessage(new FeedbackMessage(this, message, 
FeedbackMessage.DEBUG));
        }

        /**
@@ -685,7 +685,7 @@
         */
        public final void error(final Serializable message)
        {
-               getPage().getFeedbackMessages().error(this, message);
+               Page.addMessage(new FeedbackMessage(this, message, 
FeedbackMessage.ERROR));
        }

        /**
@@ -696,7 +696,7 @@
         */
        public final void fatal(final String message)
        {
-               getPage().getFeedbackMessages().fatal(this, message);
+               Page.addMessage(new FeedbackMessage(this, message, 
FeedbackMessage.FATAL));
        }

        /**
@@ -1235,7 +1235,7 @@
         */
        public final void info(final String message)
        {
-               getPage().getFeedbackMessages().info(this, message);
+               Page.addMessage(new FeedbackMessage(this, message, 
FeedbackMessage.INFO));
        }

        /**
@@ -2376,7 +2376,7 @@
         */
        public final void warn(final String message)
        {
-               getPage().getFeedbackMessages().warn(this, message);
+               Page.addMessage(new FeedbackMessage(this, message, 
FeedbackMessage.WARNING));
        }

        /**
Index: 
/Users/eelcohillenius/Documents/workspace_wicket/wicket-1.x/jdk-1.4/wicket/src/main/java/wicket/feedback/FeedbackMessages.java
===================================================================
--- 
/Users/eelcohillenius/Documents/workspace_wicket/wicket-1.x/jdk-1.4/wicket/src/main/java/wicket/feedback/FeedbackMessages.java
      (revision
524461)
+++ 
/Users/eelcohillenius/Documents/workspace_wicket/wicket-1.x/jdk-1.4/wicket/src/main/java/wicket/feedback/FeedbackMessages.java
      (working
copy)
@@ -301,7 +301,7 @@
         * @param message
         * @param level
         */
-       public final void add(Component reporter, String message, int level) {
+       public final void add(Component reporter, Serializable message, int 
level) {
                add(new FeedbackMessage(reporter, message, level));
        }
        
@@ -311,7 +311,7 @@
         * @param message
         *            the message
         */
-       final void add(FeedbackMessage message)
+       public final void add(FeedbackMessage message)
        {
                if (log.isDebugEnabled())
                {
Index: 
/Users/eelcohillenius/Documents/workspace_wicket/wicket-1.x/jdk-1.4/wicket/src/main/java/wicket/Page.java
===================================================================
--- 
/Users/eelcohillenius/Documents/workspace_wicket/wicket-1.x/jdk-1.4/wicket/src/main/java/wicket/Page.java
   (revision
524461)
+++ 
/Users/eelcohillenius/Documents/workspace_wicket/wicket-1.x/jdk-1.4/wicket/src/main/java/wicket/Page.java
   (working
copy)
@@ -18,6 +18,7 @@

 import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;

@@ -25,6 +26,7 @@
 import org.apache.commons.logging.LogFactory;

 import wicket.authorization.UnauthorizedActionException;
+import wicket.feedback.FeedbackMessage;
 import wicket.feedback.FeedbackMessages;
 import wicket.feedback.IFeedback;
 import wicket.markup.MarkupException;
@@ -288,23 +290,24 @@
         */
        public void detachModels()
        {
-//             // visit all this page's children to detach the models
-//             visitChildren(new IVisitor()
-//             {
-//                     public Object component(Component component)
-//                     {
-//                             try
-//                             {
-//                                     // detach any models of the component
-//                                     component.detachModels();
-//                             }
-//                             catch (Exception e) // catch anything; we MUST 
detach all models
-//                             {
-//                                     log.error("detaching models of 
component " + component + " failed:", e);
-//                             }
-//                             return IVisitor.CONTINUE_TRAVERSAL;
-//                     }
-//             });
+               // // visit all this page's children to detach the models
+               // visitChildren(new IVisitor()
+               // {
+               // public Object component(Component component)
+               // {
+               // try
+               // {
+               // // detach any models of the component
+               // component.detachModels();
+               // }
+               // catch (Exception e) // catch anything; we MUST detach all 
models
+               // {
+               // log.error("detaching models of component " + component + " 
failed:",
+               // e);
+               // }
+               // return IVisitor.CONTINUE_TRAVERSAL;
+               // }
+               // });

                super.detachModels();
        }
@@ -317,6 +320,84 @@
                Session.get().dirtyPage(this);
        }

+       private static final ThreadLocal tempFeedbackMessages = new 
ThreadLocal();
+
+       /**
+        * Adds message for thread
+        *
+        * @param message
+        *            feedback message
+        */
+       static void addMessage(FeedbackMessage message)
+       {
+               synchronized (tempFeedbackMessages)
+               {
+                       FeedbackMessages messages = 
(FeedbackMessages)tempFeedbackMessages.get();
+                       if (messages == null)
+                       {
+                               messages = new FeedbackMessages();
+                               tempFeedbackMessages.set(messages);
+                       }
+                       messages.add(message);
+               }
+       }
+
+       private static void assignFeedbackMessagesToPages()
+       {
+               FeedbackMessages messages = 
(FeedbackMessages)tempFeedbackMessages.get();
+               if (messages != null)
+               {
+                       for (Iterator i = messages.iterator(); i.hasNext();)
+                       {
+                               FeedbackMessage msg = (FeedbackMessage)i.next();
+                               Component reporter = msg.getReporter();
+                               if (reporter != null)
+                               {
+                                       // it's a page specific message
+                                       Page page = reporter.findPage();
+                                       if (page != null)
+                                       {
+                                               if (page.feedbackMessages == 
null)
+                                               {
+                                                       page.feedbackMessages = 
new FeedbackMessages();
+                                               }
+                                               page.feedbackMessages.add(msg);
+                                       }
+                                       // remove, regardles of whether we were 
actually able to
+                                       // distribute it to a page
+                                       i.remove();
+                               }
+                       }
+               }
+               tempFeedbackMessages.remove();
+       }
+
+       private void assignFeedbackMessagesToPage()
+       {
+               FeedbackMessages messages = 
(FeedbackMessages)tempFeedbackMessages.get();
+               if (messages != null)
+               {
+                       for (Iterator i = messages.iterator(); i.hasNext();)
+                       {
+                               FeedbackMessage msg = (FeedbackMessage)i.next();
+                               Component reporter = msg.getReporter();
+                               if (reporter != null)
+                               {
+                                       Page page = reporter.findPage();
+                                       if (page != null && page.equals(this))
+                                       {
+                                               if (feedbackMessages == null)
+                                               {
+                                                       feedbackMessages = new 
FeedbackMessages();
+                                               }
+                                               feedbackMessages.add(msg);
+                                               i.remove();
+                                       }
+                               }
+                       }
+               }
+       }
+
        /**
         * THIS METHOD IS NOT PART OF THE WICKET PUBLIC API. DO NOT CALL IT.
         */
@@ -341,6 +422,8 @@
                // Set form component values from cookies
                setFormComponentValuesFromCookies();

+               assignFeedbackMessagesToPages();
+
                // First, give priority to IFeedback instances, as they have to
                // collect their messages before components like ListViews
                // remove any child components
@@ -455,7 +538,7 @@
        }

        /**
-        * @return The current ajax version number of this page.
+        * @return The current ajax version number of this page.
         */
        public final int getAjaxVersionNumber()
        {
@@ -461,7 +544,7 @@
        {
                return versionManager == null ? 0 : 
versionManager.getAjaxVersionNumber();
        }
-       
+
        /**
         * This returns a page instance that is rollbacked the number of 
versions
         * that is specified compared to the current page.
@@ -466,9 +549,10 @@
         * This returns a page instance that is rollbacked the number of 
versions
         * that is specified compared to the current page.
         *
-        * This is a rollback including ajax versions.
+        * This is a rollback including ajax versions.
         *
-        * @param numberOfVersions to rollback
+        * @param numberOfVersions
+        *            to rollback
         * @return
         */
        public final Page rollbackPage(int numberOfVersions)
@@ -473,10 +557,11 @@
         */
        public final Page rollbackPage(int numberOfVersions)
        {
-               Page page =  versionManager == null? this :
versionManager.rollbackPage(numberOfVersions);
+               Page page = versionManager == null ? this :
versionManager.rollbackPage(numberOfVersions);
                getSession().touch(page);
                return page;
        }
+
        /**
         * @return Returns feedback messages from all components in this page
         *         (including the page itself).
@@ -487,6 +572,7 @@
                {
                        feedbackMessages = new FeedbackMessages();
                }
+               assignFeedbackMessagesToPage();
                return feedbackMessages;
        }

@@ -610,7 +696,8 @@
                                }

                                // If we went all the way back to the original 
page
-                               if (page != null && 
page.getCurrentVersionNumber() == 0 &&
page.getAjaxVersionNumber() == 0)
+                               if (page != null && 
page.getCurrentVersionNumber() == 0
+                                               && page.getAjaxVersionNumber() 
== 0)
                                {
                                        // remove version info
                                        page.versionManager = null;
@@ -861,15 +948,16 @@
         */
        public String toString()
        {
-               if(versionManager != null)
+               if (versionManager != null)
                {
-                       return "[Page class = " + getClass().getName() + ", id 
= " + getId() +
-                               ", version = " + 
versionManager.getCurrentVersionNumber()  + ", ajax = " +
-                               versionManager.getAjaxVersionNumber() + "]";    
+                       return "[Page class = " + getClass().getName() + ", id 
= " +
getId() + ", version = "
+                                       + 
versionManager.getCurrentVersionNumber() + ", ajax = "
+                                       + versionManager.getAjaxVersionNumber() 
+ "]";
                }
                else
                {
-                       return "[Page class = " + getClass().getName() + ", id 
= " +
getId() + ", version = " + 0 + "]";
+                       return "[Page class = " + getClass().getName() + ", id 
= " +
getId() + ", version = "
+                                       + 0 + "]";
                }
        }

@@ -928,7 +1016,7 @@
                }

                endVersion();
-               
+
                super.onDetach();
        }

@@ -1253,7 +1341,7 @@
                // this effectively means that change tracking begins after the
                // first request to a page completes.
                setFlag(FLAG_TRACK_CHANGES, true);
-               
+
                // If a new version was created
                if (getFlag(FLAG_NEW_VERSION))
                {
@@ -1362,14 +1450,14 @@
        }

        /**
-        * Call this method when the current (ajax) request shouldn't merge
-        * the changes that are happening to the page with the previous version.
+        * Call this method when the current (ajax) request shouldn't merge the
+        * changes that are happening to the page with the previous version.
         *
-        * This is for example needed when you want to redirect to this
-        * page in an ajax request and then you do want to version normally..
+        * This is for example needed when you want to redirect to this page in 
an
+        * ajax request and then you do want to version normally..
         *
-        * This method doesn't do anything if the getRequest().mergeVersion
-        * doesn't return true.
+        * This method doesn't do anything if the getRequest().mergeVersion 
doesn't
+        * return true.
         */
        public final void ignoreVersionMerge()
        {

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Wicket-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wicket-user

Reply via email to