This is an automated email from the ASF dual-hosted git repository.
svenmeier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git
The following commit(s) were added to refs/heads/master by this push:
new ad5e81b WICKET-6824 Replace slow `String.format` with concatenation
ad5e81b is described below
commit ad5e81b83b49ba1b58945cb14df1a63fa508f44a
Author: Thomas Heigl <[email protected]>
AuthorDate: Sun Aug 30 20:42:46 2020 +0200
WICKET-6824 Replace slow `String.format` with concatenation
This closes #449
---
.../src/main/java/org/apache/wicket/Component.java | 6 ++-
.../wicket/ajax/AbstractDefaultAjaxBehavior.java | 52 +++++++++++-----------
2 files changed, 31 insertions(+), 27 deletions(-)
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 d72f24e..423355c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Component.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Component.java
@@ -2365,9 +2365,11 @@ public abstract class Component
{
String name = Strings.isEmpty(tag.getNamespace()) ?
tag.getName()
: tag.getNamespace() + ':' + tag.getName();
+
+ // prefer concatenation over String#format() for performance
response.write(
- String.format("<%s id=\"%s\" hidden=\"\"
data-wicket-placeholder=\"\"></%s>", name,
- getAjaxRegionMarkupId(), name));
+ "<" + name + " id=\"" + getAjaxRegionMarkupId() +
+ "\" hidden=\"\"
data-wicket-placeholder=\"\"></" + name + ">");
}
diff --git
a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
index 291303f..7da491b 100644
---
a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
+++
b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
@@ -61,16 +61,16 @@ public abstract class AbstractDefaultAjaxBehavior extends
AbstractAjaxBehavior
public static final ResourceReference INDICATOR = new
PackageResourceReference(
AbstractDefaultAjaxBehavior.class, "indicator.gif");
- private static final String DYNAMIC_PARAMETER_FUNCTION_TEMPLATE =
"function(attrs){%s}";
- private static final String PRECONDITION_FUNCTION_TEMPLATE =
"function(attrs){%s}";
- private static final String COMPLETE_HANDLER_FUNCTION_TEMPLATE =
"function(attrs, jqXHR, textStatus){%s}";
- private static final String FAILURE_HANDLER_FUNCTION_TEMPLATE =
"function(attrs, jqXHR, errorMessage, textStatus){%s}";
- private static final String SUCCESS_HANDLER_FUNCTION_TEMPLATE =
"function(attrs, jqXHR, data, textStatus){%s}";
- private static final String AFTER_HANDLER_FUNCTION_TEMPLATE =
"function(attrs){%s}";
- private static final String BEFORE_SEND_HANDLER_FUNCTION_TEMPLATE =
"function(attrs, jqXHR, settings){%s}";
- private static final String BEFORE_HANDLER_FUNCTION_TEMPLATE =
"function(attrs){%s}";
- private static final String INIT_HANDLER_FUNCTION_TEMPLATE =
"function(attrs){%s}";
- private static final String DONE_HANDLER_FUNCTION_TEMPLATE =
"function(attrs){%s}";
+ private static final String DYNAMIC_PARAMETER_FUNCTION_SIGNATURE =
"function(attrs)";
+ private static final String PRECONDITION_FUNCTION_SIGNATURE =
"function(attrs)";
+ private static final String COMPLETE_HANDLER_FUNCTION_SIGNATURE =
"function(attrs, jqXHR, textStatus)";
+ private static final String FAILURE_HANDLER_FUNCTION_SIGNATURE =
"function(attrs, jqXHR, errorMessage, textStatus)";
+ private static final String SUCCESS_HANDLER_FUNCTION_SIGNATURE =
"function(attrs, jqXHR, data, textStatus)";
+ private static final String AFTER_HANDLER_FUNCTION_SIGNATURE =
"function(attrs)";
+ private static final String BEFORE_SEND_HANDLER_FUNCTION_SIGNATURE =
"function(attrs, jqXHR, settings)";
+ private static final String BEFORE_HANDLER_FUNCTION_SIGNATURE =
"function(attrs)";
+ private static final String INIT_HANDLER_FUNCTION_SIGNATURE =
"function(attrs)";
+ private static final String DONE_HANDLER_FUNCTION_SIGNATURE =
"function(attrs)";
/**
* Subclasses should call super.onBind()
@@ -261,46 +261,46 @@ public abstract class AbstractDefaultAjaxBehavior extends
AbstractAjaxBehavior
CharSequence initHandler =
ajaxCallListener.getInitHandler(component);
appendListenerHandler(initHandler,
attributesJson,
AjaxAttributeName.INIT_HANDLER.jsonName(),
- INIT_HANDLER_FUNCTION_TEMPLATE);
+
INIT_HANDLER_FUNCTION_SIGNATURE);
CharSequence beforeHandler =
ajaxCallListener.getBeforeHandler(component);
appendListenerHandler(beforeHandler,
attributesJson,
AjaxAttributeName.BEFORE_HANDLER.jsonName(),
-
BEFORE_HANDLER_FUNCTION_TEMPLATE);
+
BEFORE_HANDLER_FUNCTION_SIGNATURE);
CharSequence beforeSendHandler =
ajaxCallListener
.getBeforeSendHandler(component);
appendListenerHandler(beforeSendHandler, attributesJson,
AjaxAttributeName.BEFORE_SEND_HANDLER.jsonName(),
-
BEFORE_SEND_HANDLER_FUNCTION_TEMPLATE);
+
BEFORE_SEND_HANDLER_FUNCTION_SIGNATURE);
CharSequence afterHandler =
ajaxCallListener.getAfterHandler(component);
appendListenerHandler(afterHandler,
attributesJson,
-
AjaxAttributeName.AFTER_HANDLER.jsonName(), AFTER_HANDLER_FUNCTION_TEMPLATE);
+
AjaxAttributeName.AFTER_HANDLER.jsonName(), AFTER_HANDLER_FUNCTION_SIGNATURE);
CharSequence successHandler =
ajaxCallListener.getSuccessHandler(component);
appendListenerHandler(successHandler,
attributesJson,
AjaxAttributeName.SUCCESS_HANDLER.jsonName(),
-
SUCCESS_HANDLER_FUNCTION_TEMPLATE);
+
SUCCESS_HANDLER_FUNCTION_SIGNATURE);
CharSequence failureHandler =
ajaxCallListener.getFailureHandler(component);
appendListenerHandler(failureHandler,
attributesJson,
AjaxAttributeName.FAILURE_HANDLER.jsonName(),
-
FAILURE_HANDLER_FUNCTION_TEMPLATE);
+
FAILURE_HANDLER_FUNCTION_SIGNATURE);
CharSequence completeHandler =
ajaxCallListener.getCompleteHandler(component);
appendListenerHandler(completeHandler,
attributesJson,
AjaxAttributeName.COMPLETE_HANDLER.jsonName(),
-
COMPLETE_HANDLER_FUNCTION_TEMPLATE);
+
COMPLETE_HANDLER_FUNCTION_SIGNATURE);
CharSequence precondition =
ajaxCallListener.getPrecondition(component);
appendListenerHandler(precondition,
attributesJson,
-
AjaxAttributeName.PRECONDITION.jsonName(), PRECONDITION_FUNCTION_TEMPLATE);
+
AjaxAttributeName.PRECONDITION.jsonName(), PRECONDITION_FUNCTION_SIGNATURE);
CharSequence doneHandler =
ajaxCallListener.getDoneHandler(component);
appendListenerHandler(doneHandler,
attributesJson,
AjaxAttributeName.DONE_HANDLER.jsonName(),
- DONE_HANDLER_FUNCTION_TEMPLATE);
+
DONE_HANDLER_FUNCTION_SIGNATURE);
}
}
@@ -317,9 +317,7 @@ public abstract class AbstractDefaultAjaxBehavior extends
AbstractAjaxBehavior
{
for (CharSequence dynamicExtraParameter :
dynamicExtraParameters)
{
- String func =
String.format(DYNAMIC_PARAMETER_FUNCTION_TEMPLATE,
- dynamicExtraParameter);
- JSONFunction function = new
JSONFunction(func);
+ JSONFunction function =
getJsonFunction(DYNAMIC_PARAMETER_FUNCTION_SIGNATURE, dynamicExtraParameter);
attributesJson.append(AjaxAttributeName.DYNAMIC_PARAMETER_FUNCTION.jsonName(),
function);
}
@@ -417,7 +415,7 @@ public abstract class AbstractDefaultAjaxBehavior extends
AbstractAjaxBehavior
}
private void appendListenerHandler(final CharSequence handler, final
JSONObject attributesJson,
- final String propertyName, final String functionTemplate)
throws JSONException
+ final String propertyName, final String signature) throws
JSONException
{
if (Strings.isEmpty(handler) == false)
{
@@ -428,13 +426,17 @@ public abstract class AbstractDefaultAjaxBehavior extends
AbstractAjaxBehavior
}
else
{
- String func = String.format(functionTemplate,
handler);
- function = new JSONFunction(func);
+ function = getJsonFunction(signature, handler);
}
attributesJson.append(propertyName, function);
}
}
+ private JSONFunction getJsonFunction(String signature, CharSequence
body) {
+ String func = signature + "{" + body + "}";
+ return new JSONFunction(func);
+ }
+
/**
* Gives a chance to modify the JSON attributesJson that is going to be
used as attributes for
* the Ajax call.