Author: ivaynberg
Date: Wed Nov 17 17:27:52 2010
New Revision: 1036125

URL: http://svn.apache.org/viewvc?rev=1036125&view=rev
Log:
request flags and caching for isvisibleinhierarchy

Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.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=1036125&r1=1036124&r2=1036125&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 Wed Nov 
17 17:27:52 2010
@@ -225,8 +225,6 @@ public abstract class Component
                IEventSource
 {
 
-       /** True when component has been configured, had {...@link 
#onConfigure()} called */
-       protected static final int FLAG_CONFIGURED = 0x800000;
 
        /** Log. */
        private static final Logger log = 
LoggerFactory.getLogger(Component.class);
@@ -309,6 +307,9 @@ public abstract class Component
 
        /** an unused flag */
        private static final int FLAG_UNUSED0 = 0x20000000;
+       private static final int FLAG_UNUSED1 = 0x800000;
+       private static final int FLAG_UNUSED2 = 0x1000000;
+       private static final int FLAG_UNUSED3 = 0x10000000;
 
        /** True when a component is being auto-added */
        private static final int FLAG_AUTO = 0x0001;
@@ -366,7 +367,7 @@ public abstract class Component
 
        /** Reserved subclass-definable flag bit */
        protected static final int FLAG_RESERVED5 = 0x10000;
-       /** Reserved subclass-definable flag bit */
+       /** onInitialize called */
        protected static final int FLAG_INITIALIZED = 0x20000;
        /** Reserved subclass-definable flag bit */
        private static final int FLAG_NOTUSED7 = 0x40000;
@@ -384,8 +385,6 @@ public abstract class Component
        /** True when a component is being removed from the hierarchy */
        protected static final int FLAG_REMOVING_FROM_HIERARCHY = 0x200000;
 
-       private static final int FLAG_BEFORE_RENDER_SUPER_CALL_VERIFIED = 
0x1000000;
-       private static final int FLAG_INITIALIZE_SUPER_CALL_VERIFIED = 
0x10000000;
        /**
         * Flag that makes we are in before-render callback phase Set after 
component.onBeforeRender is
         * invoked (right before invoking beforeRender on children)
@@ -429,20 +428,25 @@ public abstract class Component
                private static final long serialVersionUID = 1L;
        };
 
-       /**
-        * Keeps metadata about the enabled state of the component
-        * 
-        * The states are: null - not calculated, true and false
-        */
-       private static final MetaDataKey<Boolean> 
ENABLED_IN_HIERARCHY_CACHE_KEY = new MetaDataKey<Boolean>()
-       {
-               private static final long serialVersionUID = 1L;
-       };
-
        /** Component flags. See FLAG_* for possible non-exclusive flag values. 
*/
        private int flags = FLAG_VISIBLE | FLAG_ESCAPE_MODEL_STRINGS | 
FLAG_VERSIONED | FLAG_ENABLED |
                FLAG_IS_RENDER_ALLOWED | FLAG_VISIBILITY_ALLOWED;
 
+       private static final short RFLAG_ENABLED_IN_HIERARCHY_VALUE = 0x1;
+       private static final short RFLAG_ENABLED_IN_HIERARCHY_SET = 0x2;
+       private static final short RFLAG_VISIBLE_IN_HIEARARCHY_VALUE = 0x4;
+       private static final short RFLAG_VISIBLE_IN_HIERARCHY_SET = 0x8;
+       /** onconfigure has been called */
+       private static final short RFLAG_CONFIGURED = 0x10;
+       private static final short RFLAG_BEFORE_RENDER_SUPER_CALL_VERIFIED = 
0x20;
+       private static final short RFLAG_INITIALIZE_SUPER_CALL_VERIFIED = 0x40;
+
+       /**
+        * Flags that only keep their value during the request. Useful for 
cache markers, etc. At the
+        * end of the request the value of this variable is reset to 0
+        */
+       private transient short requestFlags = 0;
+
        /** Component id. */
        private String id;
 
@@ -961,7 +965,7 @@ public abstract class Component
         */
        protected void onInitialize()
        {
-               setFlag(FLAG_INITIALIZE_SUPER_CALL_VERIFIED, true);
+               setRequestFlag(RFLAG_INITIALIZE_SUPER_CALL_VERIFIED, true);
        }
 
        /**
@@ -990,16 +994,16 @@ public abstract class Component
                if (!getFlag(FLAG_INITIALIZED))
                {
                        setFlag(FLAG_INITIALIZED, true);
-                       setFlag(FLAG_INITIALIZE_SUPER_CALL_VERIFIED, false);
+                       setRequestFlag(RFLAG_INITIALIZE_SUPER_CALL_VERIFIED, 
false);
                        onInitialize();
-                       if (!getFlag(FLAG_INITIALIZE_SUPER_CALL_VERIFIED))
+                       if 
(!getRequestFlag(RFLAG_INITIALIZE_SUPER_CALL_VERIFIED))
                        {
                                throw new 
IllegalStateException(Component.class.getName() +
                                        " has not been properly initialized. 
Something in the hierarchy of " +
                                        getClass().getName() +
                                        " has not called super.onInitialize() 
in the override of onInitialize() method");
                        }
-                       setFlag(FLAG_INITIALIZE_SUPER_CALL_VERIFIED, false);
+                       setRequestFlag(RFLAG_INITIALIZE_SUPER_CALL_VERIFIED, 
false);
 
                        
getApplication().getComponentInitializationListeners().onInitialize(this);
                }
@@ -1046,18 +1050,14 @@ public abstract class Component
                if ((determineVisibility() || callOnBeforeRenderIfNotVisible()) 
&&
                        !getFlag(FLAG_RENDERING) && 
!getFlag(FLAG_PREPARED_FOR_RENDER))
                {
-                       setFlag(FLAG_BEFORE_RENDER_SUPER_CALL_VERIFIED, false);
+                       setRequestFlag(RFLAG_BEFORE_RENDER_SUPER_CALL_VERIFIED, 
false);
 
                        
getApplication().getComponentPreOnBeforeRenderListeners().onBeforeRender(this);
 
-                       // clear the enabled in hierarchy cache as it may 
change as a result of form processing
-                       // or other logic executed in onbeforerender 
(WICKET-2063)
-                       clearEnabledInHierarchyCache();
-
                        onBeforeRender();
                        
getApplication().getComponentPostOnBeforeRenderListeners().onBeforeRender(this);
 
-                       if (!getFlag(FLAG_BEFORE_RENDER_SUPER_CALL_VERIFIED))
+                       if 
(!getRequestFlag(RFLAG_BEFORE_RENDER_SUPER_CALL_VERIFIED))
                        {
                                throw new 
IllegalStateException(Component.class.getName() +
                                        " has not been properly rendered. 
Something in the hierarchy of " +
@@ -1150,10 +1150,12 @@ public abstract class Component
         */
        public final void configure()
        {
-               if (!getFlag(FLAG_CONFIGURED))
+               if (!getRequestFlag(RFLAG_CONFIGURED))
                {
+                       clearEnabledInHierarchyCache();
+                       clearVisibleInHierarchyCache();
                        onConfigure();
-                       setFlag(FLAG_CONFIGURED, true);
+                       setRequestFlag(RFLAG_CONFIGURED, true);
                }
        }
 
@@ -1214,7 +1216,6 @@ public abstract class Component
                                getClass().getName() +
                                " has not called super.onDetach() in the 
override of onDetach() method");
                }
-               setFlag(FLAG_CONFIGURED, false);
 
                // always detach models because they can be attached without the
                // component. eg component has a compoundpropertymodel and one 
of its
@@ -1237,8 +1238,10 @@ public abstract class Component
                        setFlag(FLAG_INHERITABLE_MODEL, false);
                }
 
-               // clear out enabled state metadata
                clearEnabledInHierarchyCache();
+               clearVisibleInHierarchyCache();
+
+               requestFlags = 0;
 
                // notify any detach listener
                IDetachListener detachListener = 
getApplication().getFrameworkSettings()
@@ -2731,7 +2734,7 @@ public abstract class Component
 
        void clearEnabledInHierarchyCache()
        {
-               setMetaData(ENABLED_IN_HIERARCHY_CACHE_KEY, null);
+               setRequestFlag(RFLAG_ENABLED_IN_HIERARCHY_SET, false);
        }
 
        void onEnabledStateChanged()
@@ -3031,7 +3034,7 @@ public abstract class Component
         */
        public final Component setRenderBodyOnly(final boolean renderTag)
        {
-               this.setFlag(FLAG_RENDER_BODY_ONLY, renderTag);
+               setFlag(FLAG_RENDER_BODY_ONLY, renderTag);
                return this;
        }
 
@@ -3107,10 +3110,22 @@ public abstract class Component
 
                        // Change visibility
                        setFlag(FLAG_VISIBLE, visible);
+                       onVisibleStateChanged();
                }
                return this;
        }
 
+       void clearVisibleInHierarchyCache()
+       {
+               setRequestFlag(RFLAG_VISIBLE_IN_HIERARCHY_SET, false);
+       }
+
+       void onVisibleStateChanged()
+       {
+               clearVisibleInHierarchyCache();
+       }
+
+
        /**
         * Gets the string representation of this component.
         * 
@@ -3523,9 +3538,9 @@ public abstract class Component
         *            The flag to test
         * @return True if the flag is set
         */
-       protected final boolean getFlag(final short flag)
+       protected final boolean getRequestFlag(final short flag)
        {
-               return getFlag((int)flag);
+               return (requestFlags & flag) != 0;
        }
 
        /**
@@ -3648,7 +3663,7 @@ public abstract class Component
         */
        protected final boolean isIgnoreAttributeModifier()
        {
-               return this.getFlag(FLAG_IGNORE_ATTRIBUTE_MODIFIER);
+               return getFlag(FLAG_IGNORE_ATTRIBUTE_MODIFIER);
        }
 
        /**
@@ -3683,7 +3698,7 @@ public abstract class Component
        {
                setFlag(FLAG_PREPARED_FOR_RENDER, true);
                onBeforeRenderChildren();
-               setFlag(FLAG_BEFORE_RENDER_SUPER_CALL_VERIFIED, true);
+               setRequestFlag(RFLAG_BEFORE_RENDER_SUPER_CALL_VERIFIED, true);
        }
 
        /**
@@ -3933,9 +3948,16 @@ public abstract class Component
         * @param set
         *            True to turn the flag on, false to turn it off
         */
-       protected final void setFlag(final short flag, final boolean set)
+       protected final void setRequestFlag(final short flag, final boolean set)
        {
-               setFlag((int)flag, set);
+               if (set)
+               {
+                       requestFlags |= flag;
+               }
+               else
+               {
+                       requestFlags &= ~flag;
+               }
        }
 
        /**
@@ -3947,7 +3969,7 @@ public abstract class Component
         */
        protected final Component setIgnoreAttributeModifier(final boolean 
ignore)
        {
-               this.setFlag(FLAG_IGNORE_ATTRIBUTE_MODIFIER, ignore);
+               setFlag(FLAG_IGNORE_ATTRIBUTE_MODIFIER, ignore);
                return this;
        }
 
@@ -4245,20 +4267,24 @@ public abstract class Component
         */
        public final boolean isEnabledInHierarchy()
        {
-               Boolean state = getMetaData(ENABLED_IN_HIERARCHY_CACHE_KEY);
-               if (state == null)
+               if (getRequestFlag(RFLAG_ENABLED_IN_HIERARCHY_SET))
                {
-                       Component parent = getParent();
-                       if (parent != null && !parent.isEnabledInHierarchy())
-                       {
-                               state = false;
-                       }
-                       else
-                       {
-                               state = isEnabled() && isEnableAllowed();
-                       }
-                       setMetaData(ENABLED_IN_HIERARCHY_CACHE_KEY, state);
+                       return getRequestFlag(RFLAG_ENABLED_IN_HIERARCHY_VALUE);
+               }
+
+               final boolean state;
+               Component parent = getParent();
+               if (parent != null && !parent.isEnabledInHierarchy())
+               {
+                       state = false;
                }
+               else
+               {
+                       state = isEnabled() && isEnableAllowed();
+               }
+
+               setRequestFlag(RFLAG_ENABLED_IN_HIERARCHY_SET, true);
+               setRequestFlag(RFLAG_ENABLED_IN_HIERARCHY_VALUE, state);
                return state;
        }
 

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=1036125&r1=1036124&r2=1036125&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 
Wed Nov 17 17:27:52 2010
@@ -1779,6 +1779,19 @@ public abstract class MarkupContainer ex
                });
        }
 
+       @Override
+       void onVisibleStateChanged()
+       {
+               super.onVisibleStateChanged();
+               visitChildren(new IVisitor<Component, Void>()
+               {
+                       public void component(Component component, IVisit<Void> 
visit)
+                       {
+                               component.clearVisibleInHierarchyCache();
+                       }
+               });
+       }
+
        /**
         * 
         * @see org.apache.wicket.Component#onAfterRenderChildren()


Reply via email to