You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2013/08/14 11:42:04 UTC

[35/37] git commit: Merge branch 'master' into 5299-ajax-strategy

Merge branch 'master' into 5299-ajax-strategy


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/7af68957
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/7af68957
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/7af68957

Branch: refs/heads/5299-ajax-strategy
Commit: 7af68957d9a156a21e370bda1cbfa6ccada49a12
Parents: 30603f4 bfd4649
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Aug 14 12:23:20 2013 +0300
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Wed Aug 14 12:23:20 2013 +0300

----------------------------------------------------------------------
 .../main/resources/archetype-resources/pom.xml  |    2 +-
 pom.xml                                         |    4 +-
 .../authentication/AuthenticatedWebSession.java |    2 +-
 .../wicket/ajax/AbstractAjaxResponse.java       |   23 +-
 .../apache/wicket/ajax/AjaxRequestHandler.java  |    4 +-
 .../apache/wicket/ajax/AjaxRequestTarget.java   |    2 +-
 .../ajax/attributes/ThrottlingSettings.java     |   69 +-
 .../wicket/ajax/res/js/wicket-ajax-jquery.js    |   77 +-
 .../ajax/strategies/Wicket6AjaxStrategy.java    |    8 +-
 .../ComponentRenderingRequestHandler.java       |   13 +-
 .../wicket/markup/head/ResourceAggregator.java  |    2 +-
 .../protocol/http/AjaxEnclosureListener.java    |   24 +-
 .../http/servlet/ServletWebRequest.java         |    2 +-
 .../request/handler/render/WebPageRenderer.java |  160 +-
 .../request/resource/AbstractResource.java      |   14 +-
 ...enameWithVersionResourceCachingStrategy.java |   10 +
 .../caching/IResourceCachingStrategy.java       |   10 +
 ...tringWithVersionResourceCachingStrategy.java |   11 +
 .../loader/BundleStringResourceLoader.java      |   11 +-
 .../form/FormComponentTest$TestPage2.properties |    0
 .../markup/html/internal/TogglePageTest.java    |    6 +-
 .../http/servlet/ServletWebRequestTest.java     |   15 +
 ...eWithVersionResourceCachingStrategyTest.java |   87 +
 ...gWithVersionResourceCachingStrategyTest.java |   94 +
 .../request/resource/caching/TestResource.java  |   51 +
 wicket-core/src/test/js/ajax.js                 |   58 +-
 .../examples/ajax/builtin/EffectsPage.html      |    9 +-
 .../examples/ajax/builtin/EffectsPage.java      |    6 +-
 .../wicket/examples/ajax/builtin/Index.html     |    2 +-
 .../bean/validation/BeanValidationPage.html     |    2 +-
 .../wicket/examples/compref/MyBorder.html       |    2 +-
 .../apache/wicket/examples/navomatic/Page1.html |    8 +-
 .../apache/wicket/examples/navomatic/Page2.html |    8 +-
 .../apache/wicket/examples/navomatic/Page3.html |   10 +-
 .../wicket/examples/source/SourcesPage.html     |    3 -
 wicket-examples/src/main/webapp/effects.js      |  903 -------
 .../src/main/webapp/jquery-ui-1.10.3.custom.js  | 2261 ++++++++++++++++++
 .../src/main/webapp/scriptaculous.js            |   45 -
 .../wicket/examples/JettyTestCaseDecorator.java |    5 +-
 .../wicket/examples/WicketWebTestCase.java      |    3 +-
 .../wicket/filtertest/WithCPWithFPTest.java     |    4 +-
 .../wicket/filtertest/WithCPWithoutFPTest.java  |    4 +-
 .../util/license/ApacheLicenceHeaderTest.java   |    9 +-
 .../wicket/bean/validation/SizeTagModifier.java |    5 +-
 .../wicket-native-websocket/pom.xml             |    1 +
 .../ws/api/AbstractWebSocketProcessor.java      |    1 -
 .../protocol/ws/api/WebSocketBehavior.java      |    4 +
 .../ws/api/res/js/wicket-websocket-jquery.js    |   23 +-
 .../api/res/js/wicket-websocket-setup.js.tmpl   |    2 +-
 .../wicket-native-websocket-javax/pom.xml       |   67 +
 .../ws/javax/JavaxUpgradeHttpRequest.java       |  558 +++++
 .../ws/javax/JavaxWebSocketConnection.java      |  119 +
 .../protocol/ws/javax/JavaxWebSocketFilter.java |  280 +++
 .../ws/javax/JavaxWebSocketProcessor.java       |   83 +
 .../protocol/ws/javax/WicketEndpoint.java       |   70 +
 .../src/test/java/log4j.properties              |   16 +
 .../util/licence/ApacheLicenceHeaderTest.java   |   34 +
 .../AbstractAutoCompleteBehavior.java           |    1 +
 .../html/autocomplete/AutoCompleteSettings.java |   23 +
 .../html/autocomplete/wicket-autocomplete.js    |   20 +-
 .../repeater/data/table/AbstractToolbar.java    |    5 +-
 .../html/repeater/data/table/DataTable.java     |   11 +
 .../java/org/apache/wicket/request/Url.java     |   17 +-
 63 files changed, 4210 insertions(+), 1173 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/7af68957/wicket-core/src/main/java/org/apache/wicket/ajax/strategies/Wicket6AjaxStrategy.java
----------------------------------------------------------------------
diff --cc wicket-core/src/main/java/org/apache/wicket/ajax/strategies/Wicket6AjaxStrategy.java
index 6df17b0,0000000..e737eaf
mode 100644,000000..100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/strategies/Wicket6AjaxStrategy.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/strategies/Wicket6AjaxStrategy.java
@@@ -1,326 -1,0 +1,330 @@@
 +package org.apache.wicket.ajax.strategies;
 +
 +import java.util.List;
 +
 +import org.apache.wicket.Component;
 +import org.apache.wicket.Page;
 +import org.apache.wicket.WicketRuntimeException;
 +import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 +import org.apache.wicket.ajax.AjaxChannel;
 +import org.apache.wicket.ajax.AjaxEventBehavior;
 +import org.apache.wicket.ajax.attributes.AjaxAttributeName;
 +import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
 +import org.apache.wicket.ajax.attributes.CallbackParameter;
 +import org.apache.wicket.ajax.attributes.IAjaxCallListener;
 +import org.apache.wicket.ajax.attributes.ThrottlingSettings;
 +import org.apache.wicket.ajax.json.JSONArray;
 +import org.apache.wicket.ajax.json.JSONException;
 +import org.apache.wicket.ajax.json.JSONObject;
 +import org.apache.wicket.ajax.json.JsonFunction;
 +import org.apache.wicket.ajax.json.JsonUtils;
 +import org.apache.wicket.markup.ComponentTag;
 +import org.apache.wicket.markup.head.IHeaderResponse;
 +import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 +import org.apache.wicket.util.string.Strings;
 +import org.apache.wicket.util.time.Duration;
 +
 +/**
 + *
 + */
 +public class Wicket6AjaxStrategy implements IAjaxStrategy
 +{
 +	public void renderHead(final AjaxEventBehavior behavior, final IHeaderResponse response)
 +	{
 +		CharSequence js = behavior.getCallbackScript();
 +
 +		response.render(OnDomReadyHeaderItem.forScript(js.toString()));
 +	}
 +
 +	public void onComponentTag(final AjaxEventBehavior behavior, final ComponentTag tag)
 +	{
 +	}
 +
 +	/**
 +	 * @return the attributes as string in JSON format
 +	 */
 +	@Override
 +	public final JSONObject getAjaxAttributes(AbstractDefaultAjaxBehavior behavior, Component component, AjaxRequestAttributes attributes)
 +	{
 +		JSONObject attributesJson = new JSONObject();
 +
 +		try
 +		{
 +			attributesJson.put(AjaxAttributeName.URL.jsonName(), behavior.getCallbackUrl());
 +			AjaxRequestAttributes.Method method = attributes.getMethod();
 +			if (AjaxRequestAttributes.Method.POST == method)
 +			{
 +				attributesJson.put(AjaxAttributeName.METHOD.jsonName(), method);
 +			}
 +
 +			if (component instanceof Page == false)
 +			{
 +				String componentId = component.getMarkupId();
 +				attributesJson.put(AjaxAttributeName.MARKUP_ID.jsonName(), componentId);
 +			}
 +
 +			String formId = attributes.getFormId();
 +			if (Strings.isEmpty(formId) == false)
 +			{
 +				attributesJson.put(AjaxAttributeName.FORM_ID.jsonName(), formId);
 +			}
 +
 +			if (attributes.isMultipart())
 +			{
 +				attributesJson.put(AjaxAttributeName.IS_MULTIPART.jsonName(), true);
 +			}
 +
 +			String submittingComponentId = attributes.getSubmittingComponentName();
 +			if (Strings.isEmpty(submittingComponentId) == false)
 +			{
 +				attributesJson.put(AjaxAttributeName.SUBMITTING_COMPONENT_NAME.jsonName(),
 +						submittingComponentId);
 +			}
 +
 +			String indicatorId = behavior.findIndicatorId();
 +			if (Strings.isEmpty(indicatorId) == false)
 +			{
 +				attributesJson.put(AjaxAttributeName.INDICATOR_ID.jsonName(), indicatorId);
 +			}
 +
 +			for (IAjaxCallListener ajaxCallListener : attributes.getAjaxCallListeners())
 +			{
 +				if (ajaxCallListener != null)
 +				{
 +					CharSequence beforeHandler = ajaxCallListener.getBeforeHandler(component);
 +					appendListenerHandler(beforeHandler, attributesJson,
 +							AjaxAttributeName.BEFORE_HANDLER.jsonName(),
 +							BEFORE_HANDLER_FUNCTION_TEMPLATE);
 +
 +					CharSequence beforeSendHandler = ajaxCallListener
 +							.getBeforeSendHandler(component);
 +					appendListenerHandler(beforeSendHandler, attributesJson,
 +							AjaxAttributeName.BEFORE_SEND_HANDLER.jsonName(),
 +							BEFORE_SEND_HANDLER_FUNCTION_TEMPLATE);
 +
 +					CharSequence afterHandler = ajaxCallListener.getAfterHandler(component);
 +					appendListenerHandler(afterHandler, attributesJson,
 +							AjaxAttributeName.AFTER_HANDLER.jsonName(), AFTER_HANDLER_FUNCTION_TEMPLATE);
 +
 +					CharSequence successHandler = ajaxCallListener.getSuccessHandler(component);
 +					appendListenerHandler(successHandler, attributesJson,
 +							AjaxAttributeName.SUCCESS_HANDLER.jsonName(),
 +							SUCCESS_HANDLER_FUNCTION_TEMPLATE);
 +
 +					CharSequence failureHandler = ajaxCallListener.getFailureHandler(component);
 +					appendListenerHandler(failureHandler, attributesJson,
 +							AjaxAttributeName.FAILURE_HANDLER.jsonName(),
 +							FAILURE_HANDLER_FUNCTION_TEMPLATE);
 +
 +					CharSequence completeHandler = ajaxCallListener.getCompleteHandler(component);
 +					appendListenerHandler(completeHandler, attributesJson,
 +							AjaxAttributeName.COMPLETE_HANDLER.jsonName(),
 +							COMPLETE_HANDLER_FUNCTION_TEMPLATE);
 +
 +					CharSequence precondition = ajaxCallListener.getPrecondition(component);
 +					appendListenerHandler(precondition, attributesJson,
 +							AjaxAttributeName.PRECONDITION.jsonName(), PRECONDITION_FUNCTION_TEMPLATE);
 +				}
 +			}
 +
 +			JSONArray extraParameters = JsonUtils.asArray(attributes.getExtraParameters());
 +
 +			if (extraParameters.length() > 0)
 +			{
 +				attributesJson.put(AjaxAttributeName.EXTRA_PARAMETERS.jsonName(), extraParameters);
 +			}
 +
 +			List<CharSequence> dynamicExtraParameters = attributes.getDynamicExtraParameters();
 +			if (dynamicExtraParameters != null)
 +			{
 +				for (CharSequence dynamicExtraParameter : dynamicExtraParameters)
 +				{
 +					String func = String.format(DYNAMIC_PARAMETER_FUNCTION_TEMPLATE,
 +							dynamicExtraParameter);
 +					JsonFunction function = new JsonFunction(func);
 +					attributesJson.append(AjaxAttributeName.DYNAMIC_PARAMETER_FUNCTION.jsonName(),
 +							function);
 +				}
 +			}
 +
 +			if (attributes.isAsynchronous() == false)
 +			{
 +				attributesJson.put(AjaxAttributeName.IS_ASYNC.jsonName(), false);
 +			}
 +
 +			String[] eventNames = attributes.getEventNames();
 +			if (eventNames.length == 1)
 +			{
 +				attributesJson.put(AjaxAttributeName.EVENT_NAME.jsonName(), eventNames[0]);
 +			}
 +			else
 +			{
 +				for (String eventName : eventNames)
 +				{
 +					attributesJson.append(AjaxAttributeName.EVENT_NAME.jsonName(), eventName);
 +				}
 +			}
 +
 +			AjaxChannel channel = attributes.getChannel();
 +			if (channel != null)
 +			{
 +				attributesJson.put(AjaxAttributeName.CHANNEL.jsonName(), channel);
 +			}
 +
 +			if (attributes.isPreventDefault())
 +			{
 +				attributesJson.put(AjaxAttributeName.IS_PREVENT_DEFAULT.jsonName(), true);
 +			}
 +
 +			if (AjaxRequestAttributes.EventPropagation.STOP
 +					.equals(attributes.getEventPropagation()))
 +			{
 +				attributesJson.put(AjaxAttributeName.EVENT_PROPAGATION.jsonName(), "stop");
 +			}
 +			else if (AjaxRequestAttributes.EventPropagation.STOP_IMMEDIATE.equals(attributes
 +					.getEventPropagation()))
 +			{
 +				attributesJson.put(AjaxAttributeName.EVENT_PROPAGATION.jsonName(), "stopImmediate");
 +			}
 +
 +			Duration requestTimeout = attributes.getRequestTimeout();
 +			if (requestTimeout != null)
 +			{
 +				attributesJson.put(AjaxAttributeName.REQUEST_TIMEOUT.jsonName(),
 +						requestTimeout.getMilliseconds());
 +			}
 +
 +			boolean wicketAjaxResponse = attributes.isWicketAjaxResponse();
 +			if (wicketAjaxResponse == false)
 +			{
 +				attributesJson.put(AjaxAttributeName.IS_WICKET_AJAX_RESPONSE.jsonName(), false);
 +			}
 +
 +			String dataType = attributes.getDataType();
 +			if (AjaxRequestAttributes.XML_DATA_TYPE.equals(dataType) == false)
 +			{
 +				attributesJson.put(AjaxAttributeName.DATATYPE.jsonName(), dataType);
 +			}
 +
 +			ThrottlingSettings throttlingSettings = attributes.getThrottlingSettings();
 +			if (throttlingSettings != null)
 +			{
 +				JSONObject throttlingSettingsJson = new JSONObject();
- 				throttlingSettingsJson.put(AjaxAttributeName.THROTTLING_ID.jsonName(),
- 						throttlingSettings.getId());
++				String throttleId = throttlingSettings.getId();
++				if (throttleId == null)
++				{
++					throttleId = component.getMarkupId();
++				}
++				throttlingSettingsJson.put(AjaxAttributeName.THROTTLING_ID.jsonName(), throttleId);
 +				throttlingSettingsJson.put(AjaxAttributeName.THROTTLING_DELAY.jsonName(),
 +						throttlingSettings.getDelay().getMilliseconds());
 +				if (throttlingSettings.getPostponeTimerOnUpdate())
 +				{
 +					throttlingSettingsJson.put(
 +							AjaxAttributeName.THROTTLING_POSTPONE_ON_UPDATE.jsonName(), true);
 +				}
 +				attributesJson.put(AjaxAttributeName.THROTTLING.jsonName(), throttlingSettingsJson);
 +			}
 +
 +			postprocessConfiguration(behavior, attributesJson, component);
 +		}
 +		catch (JSONException e)
 +		{
 +			throw new WicketRuntimeException(e);
 +		}
 +
 +		return attributesJson;
 +	}
 +
 +	@Override
 +	public void postprocessConfiguration(AbstractDefaultAjaxBehavior behavior, JSONObject attributesJson,
 +		Component component) throws JSONException
 +	{
 +		behavior.postprocessConfiguration(attributesJson, component);
 +	}
 +
 +	@Override
 +	public CharSequence getCallbackScript(Component component, JSONObject ajaxAttributes)
 +	{
 +		return "Wicket.Ajax.ajax(" + ajaxAttributes + ");";
 +	}
 +
 +	@Override
 +	public CharSequence getCallbackFunction(AjaxRequestAttributes attributes, CallbackParameter... extraParameters)
 +	{
 +		StringBuilder sb = new StringBuilder();
 +		sb.append("function (");
 +		boolean first = true;
 +		for (CallbackParameter curExtraParameter : extraParameters)
 +		{
 +			if (curExtraParameter.getFunctionParameterName() != null)
 +			{
 +				if (!first)
 +					sb.append(',');
 +				else
 +					first = false;
 +				sb.append(curExtraParameter.getFunctionParameterName());
 +			}
 +		}
 +		sb.append(") {\n");
 +		sb.append(getCallbackFunctionBody(attributes, extraParameters));
 +		sb.append("}\n");
 +		return sb;
 +	}
 +
 +	@Override
 +	public CharSequence getCallbackFunctionBody(AjaxRequestAttributes attributes, CallbackParameter... extraParameters)
 +	{
 +		attributes.setEventNames();
 +		StringBuilder sb = new StringBuilder();
 +		sb.append("var attrs = ");
 +		sb.append(attributes);
 +		sb.append(";\n");
 +		sb.append("var params = {");
 +		boolean first = true;
 +		for (CallbackParameter curExtraParameter : extraParameters)
 +		{
 +			if (curExtraParameter.getAjaxParameterName() != null)
 +			{
 +				if (!first)
 +					sb.append(',');
 +				else
 +					first = false;
 +				sb.append('\'').append(curExtraParameter.getAjaxParameterName()).append("': ")
 +						.append(curExtraParameter.getAjaxParameterCode());
 +			}
 +		}
 +		sb.append("};\n");
 +		if (attributes.getExtraParameters().isEmpty())
 +		{
 +			sb.append("attrs.").append(AjaxAttributeName.EXTRA_PARAMETERS).append(" = params;\n");
 +		}
 +		else
 +		{
 +			sb.append("attrs.").append(AjaxAttributeName.EXTRA_PARAMETERS).append(" = Wicket.merge(attrs.")
 +					.append(AjaxAttributeName.EXTRA_PARAMETERS).append(", params);\n");
 +		}
 +		sb.append("Wicket.Ajax.ajax(attrs);\n");
 +		return sb;
 +	}
 +
 +	private void appendListenerHandler(final CharSequence handler, final JSONObject attributesJson,
 +		final String propertyName, final String functionTemplate) throws JSONException
 +	{
 +		if (Strings.isEmpty(handler) == false)
 +		{
 +			final JsonFunction function;
 +			if (handler instanceof JsonFunction)
 +			{
 +				function = (JsonFunction)handler;
 +			}
 +			else
 +			{
 +				String func = String.format(functionTemplate, handler);
 +				function = new JsonFunction(func);
 +			}
 +			attributesJson.append(propertyName, function);
 +		}
 +	}
 +
 +}