Author: ivaynberg
Date: Mon Nov 15 00:43:32 2010
New Revision: 1035111

URL: http://svn.apache.org/viewvc?rev=1035111&view=rev
Log:
caching for isVisibleInHieararchy()
Issue: WICKET-3166

Modified:
    
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/Component.java

Modified: 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/Component.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/Component.java?rev=1035111&r1=1035110&r2=1035111&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/Component.java
 (original)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/Component.java
 Mon Nov 15 00:43:32 2010
@@ -82,10 +82,10 @@ import org.slf4j.LoggerFactory;
  * <ul>
  * <li><b>Construction </b>- A Component is constructed with the Java language 
new operator.
  * Children may be added during construction if the Component is a 
MarkupContainer.
- *
+ * 
  * <li><b>onInitialize </b>- The {...@link #onInitialize()} method is called 
when a path from this
- * component to its parent has been established, usually after the component 
has been added to
- * its parent.
+ * component to its parent has been established, usually after the component 
has been added to its
+ * parent.
  * 
  * <li><b>Request Handling </b>- An incoming request is processed by a 
protocol request handler such
  * as WicketServlet. An associated Application object creates Session, Request 
and Response objects
@@ -696,6 +696,17 @@ public abstract class Component implemen
                private static final long serialVersionUID = 1L;
        };
 
+       /**
+        * Keeps metadata about the visibility state of the component
+        * 
+        * The states are: null - not calculated, true and false
+        */
+       private static final MetaDataKey<Boolean> 
VISIBLE_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;
@@ -2212,13 +2223,21 @@ public abstract class Component implemen
         */
        public final boolean isVisibleInHierarchy()
        {
-               Component parent = getParent();
-               if (parent != null && !parent.isVisibleInHierarchy())
+               Boolean state = getMetaData(VISIBLE_IN_HIERARCHY_CACHE_KEY);
+               if (state == null)
                {
-                       return false;
+                       Component parent = getParent();
+                       if (parent != null && !parent.isVisibleInHierarchy())
+                       {
+                               state = false;
+                       }
+                       else
+                       {
+                               state = determineVisibility();
+                       }
+                       setMetaData(VISIBLE_IN_HIERARCHY_CACHE_KEY, state);
                }
-
-               return determineVisibility();
+               return state;
        }
 
        /**


Reply via email to