Author: ivaynberg
Date: Fri Mar 26 06:12:54 2010
New Revision: 927702

URL: http://svn.apache.org/viewvc?rev=927702&view=rev
Log:
implemented Component#onInitialize

Added:
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/ComponentInitializationTest.java
   (with props)
Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java?rev=927702&r1=927701&r2=927702&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java Fri Mar 
26 06:12:54 2010
@@ -356,9 +356,9 @@ public abstract class Component implemen
        /** Reserved subclass-definable flag bit */
        protected static final int FLAG_RESERVED5 = 0x10000;
        /** Reserved subclass-definable flag bit */
-       protected static final int FLAG_RESERVED6 = 0x20000;
+       private static final int FLAG_INITIALIZED = 0x20000;
        /** Reserved subclass-definable flag bit */
-       protected static final int FLAG_RESERVED7 = 0x40000;
+       private static final int FLAG_NOTUSED7 = 0x40000;
        /** Reserved subclass-definable flag bit */
        protected static final int FLAG_RESERVED8 = 0x80000;
 
@@ -860,11 +860,45 @@ public abstract class Component implemen
         * Callback method invoked after the component was added to its parent 
AND you can walk up the
         * hierarchy up until the Page. That is, all parents must be have been 
added to their parents as
         * well. Add this point in time {...@link #getMarkup() getMarkup} is 
guaranteed to be available.
-        * <p/>
+        * <p>
+        * This method is guaranteed to only be called once
+        * </p>
+        * <p>
         * If you don't like constructors to initialize your component, this is 
the method to use.
+        * </p>
+        */
+       protected void onInitialize()
+       {
+       }
+
+       /**
+        * Checks if the component has been initialized - {...@link 
#onInitialize()} has been called
+        * 
+        * @return {...@code true} if component has been initialized
+        */
+       boolean isInitialized()
+       {
+               return getFlag(FLAG_INITIALIZED);
+       }
+
+       /**
+        * Used to call {...@link #onInitialize()}
+        */
+       void initialize()
+       {
+               if (!getFlag(FLAG_INITIALIZED))
+               {
+                       performInitialization();
+                       setFlag(FLAG_INITIALIZED, true);
+               }
+       }
+
+       /**
+        * Takes care of calling {...@link #onInitialize()}
         */
-       protected void onConnectedToPage()
+       void performInitialization()
        {
+               onInitialize();
        }
 
        /**

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java?rev=927702&r1=927701&r2=927702&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java 
Fri Mar 26 06:12:54 2010
@@ -943,8 +943,6 @@ public abstract class MarkupContainer ex
                // Set child's parent
                child.setParent(this);
 
-               final Page page = findPage();
-
                final IDebugSettings debugSettings = 
Application.get().getDebugSettings();
                if (debugSettings.isLinePreciseReportingOnAddComponentEnabled())
                {
@@ -952,23 +950,19 @@ public abstract class MarkupContainer ex
                                "added")));
                }
 
-               if (page != null)
+               if (this instanceof Page)
+               { // a little icky...
+                       child.initialize();
+               }
+               else if (isInitialized())
                {
-                       child.onConnectedToPage();
+                       child.initialize();
+               }
 
-                       // Tell all children of "component" as well
-                       if (child instanceof MarkupContainer)
-                       {
-                               MarkupContainer container = 
(MarkupContainer)child;
-                               container.visitChildren(new IVisitor<Component, 
Void>()
-                               {
-                                       public void component(final Component 
component, final IVisit<Void> visit)
-                                       {
-                                               component.onConnectedToPage();
-                                       }
-                               });
-                       }
+               final Page page = findPage();
 
+               if (page != null)
+               {
                        // Tell the page a component has been added
                        page.componentAdded(child);
                }
@@ -981,6 +975,19 @@ public abstract class MarkupContainer ex
                }
        }
 
+       @Override
+       final void performInitialization()
+       {
+               super.performInitialization();
+               visitChildren(new IVisitor<Component, Void>()
+               {
+                       public void component(final Component component, final 
IVisit<Void> visit)
+                       {
+                               component.initialize();
+                       }
+               });
+       }
+
        /**
         * @param child
         *            Child to add
@@ -2007,4 +2014,5 @@ public abstract class MarkupContainer ex
                        }
                }
        }
+
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java?rev=927702&r1=927701&r2=927702&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java Fri Mar 26 
06:12:54 2010
@@ -1267,4 +1267,16 @@ public abstract class Page extends Marku
                }
                return (Page)session.getPageManager().getPage(id);
        }
+
+       /**
+        * This method does nothing, it is here to prevent subclasses from 
overriding it since this
+        * callback is never called on the {...@link Page}
+        * 
+        * @see org.apache.wicket.Component#onInitialize()
+        */
+       @Override
+       protected final void onInitialize()
+       {
+       }
+
 }

Added: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ComponentInitializationTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ComponentInitializationTest.java?rev=927702&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ComponentInitializationTest.java
 (added)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ComponentInitializationTest.java
 Fri Mar 26 06:12:54 2010
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket;
+
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.WebPage;
+
+public class ComponentInitializationTest extends WicketTestCase
+{
+       public void testPropagation()
+       {
+               Page page = new TestPage();
+
+               TestComponent t1 = new TestComponent("t1");
+               TestComponent t2 = new TestComponent("t2");
+               TestComponent t3 = new TestComponent("t3");
+
+               // as soon as we add to page child should be initialized
+               page.add(t1);
+               assertEquals(1, t1.getCount());
+
+               // unless the page is available no initialization takes place
+               t2.add(t3);
+               assertEquals(0, t2.getCount());
+               assertEquals(0, t3.getCount());
+
+               // initialization cascades from initialized
+               t1.add(t2);
+               assertEquals(1, t1.getCount());
+               assertEquals(1, t2.getCount());
+               assertEquals(1, t3.getCount());
+       }
+
+       public void testAtomicity()
+       {
+               Page page = new TestPage();
+
+               TestComponent t1 = new TestComponent("t1");
+               TestComponent t2 = new TestComponent("t2");
+               TestComponent t3 = new TestComponent("t3");
+
+               t1.add(t2);
+               t2.add(t3);
+
+               page.add(t1);
+
+               assertEquals(1, t1.getCount());
+               assertEquals(1, t2.getCount());
+               assertEquals(1, t3.getCount());
+
+               // test moving
+               page.add(t3);
+               assertEquals(1, t3.getCount());
+
+               // test removal and readdition
+               page.remove(t1);
+               assertEquals(1, t1.getCount());
+               page.add(t1);
+               assertEquals(1, t1.getCount());
+               assertEquals(1, t2.getCount());
+
+       }
+
+       private static class TestPage extends WebPage
+       {
+
+       }
+
+       private static class TestComponent extends WebMarkupContainer
+       {
+               private int count = 0;
+
+               public TestComponent(String id)
+               {
+                       super(id);
+               }
+
+               @Override
+               protected void onInitialize()
+               {
+                       count++;
+               }
+
+               public int getCount()
+               {
+                       return count;
+               }
+
+
+       }
+}

Propchange: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ComponentInitializationTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to