This is an automated email from the ASF dual-hosted git repository.
mgrigorov pushed a commit to branch wicket-8.x
in repository https://gitbox.apache.org/repos/asf/wicket.git
The following commit(s) were added to refs/heads/wicket-8.x by this push:
new ef6963c WICKET-6830 Convert `Behaviors` into a static utility class
to avoid allocating a new object on every invocation
ef6963c is described below
commit ef6963c32086212871d0e2ef118a0bc82797f2dc
Author: Thomas Heigl <[email protected]>
AuthorDate: Sun Sep 13 11:21:25 2020 +0200
WICKET-6830 Convert `Behaviors` into a static utility class to avoid
allocating a new object on every invocation
(cherry picked from commit 887cc751158df571d5778afb61484bbb564a8309)
---
.../src/main/java/org/apache/wicket/Behaviors.java | 52 ++++++++++------------
.../src/main/java/org/apache/wicket/Component.java | 28 ++++++------
2 files changed, 38 insertions(+), 42 deletions(-)
diff --git a/wicket-core/src/main/java/org/apache/wicket/Behaviors.java
b/wicket-core/src/main/java/org/apache/wicket/Behaviors.java
index 0573ec5..fc99c6c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Behaviors.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Behaviors.java
@@ -22,25 +22,22 @@ import java.util.List;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.behavior.InvalidBehaviorIdException;
-import org.apache.wicket.model.IDetachable;
import org.apache.wicket.util.lang.Args;
/**
- * Manages behaviors in a {@link Component} instance
+ * Manages behaviors for {@link Component} instances
*
* @author igor
*/
-final class Behaviors implements IDetachable
+final class Behaviors
{
- private static final long serialVersionUID = 1L;
- private final Component component;
- public Behaviors(Component component)
+ private Behaviors()
{
- this.component = component;
+ // utility class
}
- public void add(Behavior... behaviors)
+ public static void add(Component component, Behavior... behaviors)
{
Args.notNull(behaviors, "behaviors");
@@ -48,7 +45,7 @@ final class Behaviors implements IDetachable
{
Args.notNull(behavior, "behavior");
- internalAdd(behavior);
+ internalAdd(component, behavior);
if (!behavior.isTemporary(component))
{
@@ -60,17 +57,17 @@ final class Behaviors implements IDetachable
}
}
- private void internalAdd(final Behavior behavior)
+ private static void internalAdd(Component component, Behavior behavior)
{
component.data_add(behavior);
if (behavior.getStatelessHint(component) == false)
{
- getBehaviorId(behavior);
+ getBehaviorId(component, behavior);
}
}
@SuppressWarnings("unchecked")
- public <M extends Behavior> List<M> getBehaviors(Class<M> type)
+ public static <M extends Behavior> List<M> getBehaviors(Component
component, Class<M> type)
{
int len = component.data_length();
if (len == 0)
@@ -110,11 +107,11 @@ final class Behaviors implements IDetachable
}
- public void remove(Behavior behavior)
+ public static void remove(Component component, Behavior behavior)
{
Args.notNull(behavior, "behavior");
- if (internalRemove(behavior))
+ if (internalRemove(component, behavior))
{
if (!behavior.isTemporary(component))
{
@@ -138,8 +135,7 @@ final class Behaviors implements IDetachable
* component's behaviors after header contribution has been done (which
is separated from
* component render).
*/
- @Override
- public final void detach()
+ public static void detach(Component component)
{
int len = component.data_length();
if (len == 0)
@@ -162,7 +158,7 @@ final class Behaviors implements IDetachable
if (behavior.isTemporary(component))
{
- internalRemove(behavior);
+ internalRemove(component, behavior);
i--;
len--;
}
@@ -170,7 +166,7 @@ final class Behaviors implements IDetachable
}
}
- private boolean internalRemove(final Behavior behavior)
+ private static boolean internalRemove(Component component, Behavior
behavior)
{
final int len = component.data_length();
for (int i = component.data_start(); i < len; i++)
@@ -182,7 +178,7 @@ final class Behaviors implements IDetachable
behavior.unbind(component);
// remove behavior from behavior-ids
- ArrayList<Behavior> ids =
getBehaviorsIdList(false);
+ ArrayList<Behavior> ids =
getBehaviorsIdList(component, false);
if (ids != null)
{
int idx = ids.indexOf(behavior);
@@ -198,7 +194,7 @@ final class Behaviors implements IDetachable
if (ids.isEmpty())
{
- removeBehaviorsIdList();
+
removeBehaviorsIdList(component);
}
}
@@ -208,7 +204,7 @@ final class Behaviors implements IDetachable
return false;
}
- private void removeBehaviorsIdList()
+ private static void removeBehaviorsIdList(Component component)
{
for (int i = component.data_start(); i <
component.data_length(); i++)
{
@@ -221,7 +217,7 @@ final class Behaviors implements IDetachable
}
}
- private BehaviorIdList getBehaviorsIdList(boolean createIfNotFound)
+ private static BehaviorIdList getBehaviorsIdList(Component component,
boolean createIfNotFound)
{
int len = component.data_length();
for (int i = component.data_start(); i < len; i++)
@@ -248,7 +244,7 @@ final class Behaviors implements IDetachable
* @param component
* the component that will be removed from its parent
*/
- public void onRemove(Component component)
+ public static void onRemove(Component component)
{
int len = component.data_length();
if (len == 0)
@@ -282,7 +278,7 @@ final class Behaviors implements IDetachable
}
}
- public final int getBehaviorId(Behavior behavior)
+ public static int getBehaviorId(Component component, Behavior behavior)
{
Args.notNull(behavior, "behavior");
@@ -299,10 +295,10 @@ final class Behaviors implements IDetachable
{
throw new IllegalStateException(
"Behavior must be added to component before its
id can be generated. Behavior: " +
- behavior + ", Component: " + this);
+ behavior + ", Component: " + component);
}
- ArrayList<Behavior> ids = getBehaviorsIdList(true);
+ ArrayList<Behavior> ids = getBehaviorsIdList(component, true);
int id = ids.indexOf(behavior);
@@ -331,11 +327,11 @@ final class Behaviors implements IDetachable
return id;
}
- public final Behavior getBehaviorById(int id)
+ public static Behavior getBehaviorById(Component component, int id)
{
Behavior behavior = null;
- ArrayList<Behavior> ids = getBehaviorsIdList(false);
+ ArrayList<Behavior> ids = getBehaviorsIdList(component, false);
if (ids != null)
{
if (id >= 0 && id < ids.size())
diff --git a/wicket-core/src/main/java/org/apache/wicket/Component.java
b/wicket-core/src/main/java/org/apache/wicket/Component.java
index 89e31a4..2a1d639 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Component.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Component.java
@@ -133,7 +133,7 @@ import org.slf4j.LoggerFactory;
* unlikely for a web application and even the need to implement a listener
interface directly is
* highly discouraged. Instead, calls to listeners are routed through logic
specific to the event,
* resulting in calls to user code through other overridable methods. See
{@link Form} for an
- * example of a component which listens for events via {@link
IFormSubmitListener}.</li>
+ * example of a component which listens for events via {@link
IRequestListener}.</li>
* <li><b>Rendering </b>- Before a page or part of a page (in case of Ajax
updates) is rendered, all
* containing components are able to prepare for rendering via two hook
methods:
* {@link #onConfigure()} (regardless whether they are visible or not) and
{@link #onBeforeRender()}
@@ -1085,11 +1085,11 @@ public abstract class Component
if (getRequestFlag(RFLAG_REMOVING_FROM_HIERARCHY))
{
throw new
IllegalStateException(Component.class.getName() +
- " has not been properly removed from hierachy.
Something in the hierarchy of " +
+ " has not been properly removed from hierarchy.
Something in the hierarchy of " +
getClass().getName() +
" has not called super.onRemove() in the
override of onRemove() method");
}
- new Behaviors(this).onRemove(this);
+ Behaviors.onRemove(this);
removeChildren();
}
@@ -1118,7 +1118,7 @@ public abstract class Component
detachModels();
// detach any behaviors
- new Behaviors(this).detach();
+ Behaviors.detach(this);
}
catch (Exception x)
{
@@ -2115,8 +2115,6 @@ public abstract class Component
* @param setRenderingFlag
* if this is false only the PREPARED_FOR_RENDER flag is
removed from component, the
* RENDERING flag is not set.
- *
- * @see #internalPrepareForRender(boolean)
*/
public final void markRendering(boolean setRenderingFlag)
{
@@ -3622,7 +3620,7 @@ public abstract class Component
*/
public <M extends Behavior> List<M> getBehaviors(Class<M> type)
{
- return new Behaviors(this).getBehaviors(type);
+ return Behaviors.getBehaviors(this, type);
}
/**
@@ -4431,26 +4429,28 @@ public abstract class Component
*/
public Component remove(final Behavior... behaviors)
{
- Behaviors helper = new Behaviors(this);
for (Behavior behavior : behaviors)
{
- helper.remove(behavior);
+ Behaviors.remove(this, behavior);
}
return this;
}
- /** {@inheritDoc} */
@Override
public final Behavior getBehaviorById(int id)
{
- return new Behaviors(this).getBehaviorById(id);
+ return Behaviors.getBehaviorById(this, id);
}
- /** {@inheritDoc} */
@Override
public final int getBehaviorId(Behavior behavior)
{
- return new Behaviors(this).getBehaviorId(behavior);
+ if (behavior.isTemporary(this))
+ {
+ throw new IllegalArgumentException(
+ "Cannot get a stable id for temporary behavior
" + behavior);
+ }
+ return Behaviors.getBehaviorId(this, behavior);
}
/**
@@ -4462,7 +4462,7 @@ public abstract class Component
*/
public Component add(final Behavior... behaviors)
{
- new Behaviors(this).add(behaviors);
+ Behaviors.add(this, behaviors);
return this;
}