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 <[email protected]> Authored: Wed Aug 14 12:23:20 2013 +0300 Committer: Martin Tzvetanov Grigorov <[email protected]> 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); + } + } + +}
