You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2010/11/17 18:27:52 UTC
svn commit: r1036125 - in
/wicket/trunk/wicket/src/main/java/org/apache/wicket: Component.java
MarkupContainer.java
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()