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);
 +              }
 +      }
 +
 +}

Reply via email to