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