You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by kn...@apache.org on 2008/08/25 14:50:24 UTC
svn commit: r688709 - in
/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket:
ajaxng/ ajaxng/js/ ajaxng/request/ protocol/http/servlet/
Author: knopp
Date: Mon Aug 25 05:50:23 2008
New Revision: 688709
URL: http://svn.apache.org/viewvc?rev=688709&view=rev
Log:
header contribution
Modified:
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/AjaxBehavior.java
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/js/wicket-ajax-ng.js
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/request/AjaxRequestTarget.java
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/request/AjaxUrlCodingStrategy.java
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/AjaxBehavior.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/AjaxBehavior.java?rev=688709&r1=688708&r2=688709&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/AjaxBehavior.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/AjaxBehavior.java Mon Aug 25 05:50:23 2008
@@ -23,6 +23,7 @@
import org.apache.wicket.Component;
import org.apache.wicket.Page;
+import org.apache.wicket.Request;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.ajaxng.json.JSONArray;
@@ -34,6 +35,7 @@
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.markup.html.resources.JavascriptResourceReference;
+import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
/**
* @author Matej Knopp
@@ -128,11 +130,39 @@
config.append(AjaxUrlCodingStrategy.PARAM_BEHAVIOR_INDEX);
config.append("';\n");
+ config.append("gs.urlParamUrlDepth='");
+ config.append(AjaxUrlCodingStrategy.PARAM_URL_DEPTH);
+ config.append("';\n");
+
+ config.append("gs.urlDepthValue=");
+ config.append(getUrlDepth());
+ config.append(";\n");
+
config.append("})();");
response.renderJavascript(config, WICKET_NS + "-Config");
}
+ private int getUrlDepth()
+ {
+ Request request = RequestCycle.get().getRequest();
+ if (request instanceof ServletWebRequest)
+ {
+ ServletWebRequest swr = (ServletWebRequest)request;
+ // If we're coming in with an existing depth, use it. Otherwise,
+ // compute from the URL. This provides correct behavior for repeated
+ // AJAX requests: If we need to generate a URL within an AJAX
+ // request for another one, it needs to be at the same depth as the
+ // original AJAX request.
+ int urlDepth = swr.getRequestParameters().getUrlDepth();
+ return urlDepth > -1 ? urlDepth : swr.getDepthRelativeToWicketHandler();
+ }
+ else
+ {
+ return -1;
+ }
+ }
+
public void afterRender(Component component)
{
}
Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/js/wicket-ajax-ng.js
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/js/wicket-ajax-ng.js?rev=688709&r1=688708&r2=688709&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/js/wicket-ajax-ng.js (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/js/wicket-ajax-ng.js Mon Aug 25 05:50:23 2008
@@ -182,7 +182,7 @@
logger = FirebugLogger;
}
- var logConfig = { disableAll: false, trace: true, debug: true, info: true, error: true, "trace:GarbageCollector": false };
+ var logConfig = { disableAll: false, trace: true, debug: true, info: true, error: true, "trace:GarbageCollector": false, "trace:Contribution":false };
W.Log =
{
@@ -395,7 +395,7 @@
}
catch (ex)
{
- log.error("FunctionExecutor", "Error execution function: ", f);
+ log.error("FunctionsExecutor", "Error execution function: ", f);
notify();
}
}, this);
@@ -779,7 +779,7 @@
for (key in map)
{
var value = map[key];
- if (L.isString(value) || L.isNumber(value))
+ if (L.isString(value) || L.isNumber(value) || L.isBoolean(value))
{
if (res.length > 0)
{
@@ -794,7 +794,7 @@
for (var i = 0; i < value.length; ++i)
{
var v = value[i];
- if (L.isString(v) || L.isNumber(v))
+ if (L.isString(v) || L.isNumber(v) || L.isBoolean(v))
{
if (res.length > 0)
{
@@ -971,9 +971,9 @@
*/
var loadStylesheet = function(url, notify)
{
- var failureHandler = function()
+ var failureHandler = function(req, failure)
{
- log.error("Contribution", "Error loading stylesheet from ", url);
+ log.error("Contribution", "Error loading stylesheet from ", url, req, failure);
notify();
};
@@ -985,7 +985,7 @@
}
catch (exception)
{
- log.error("Contribution", "Error adding stylesheet from ", url);
+ log.error("Contribution", "Error adding stylesheet from ", url, exception);
}
notify();
};
@@ -1017,9 +1017,9 @@
*/
var loadJavascript = function(url, notify)
{
- var failureHandler = function()
+ var failureHandler = function(req)
{
- log.error("Contribution", "Error loading javascript from ", url);
+ log.error("Contribution", "Error loading javascript from ", url, req);
notify();
};
@@ -1077,7 +1077,7 @@
var isContributed = function(id, url)
{
- if (L.isString(id) && (Wicket.$(id) != null || getContributed().ids[id] == true))
+ if (L.isString(id) && (W.$(id) != null || getContributed().ids[id] == true))
{
return true;
}
@@ -1126,9 +1126,9 @@
url = element.getAttribute("href");
}
- log.trace("Contribution", "TagName:", tagName, "url:", url, "id:", id);
+ log.trace("Contribution", "TagName:", tagName, ", URL:", url, ", ID:", id);
- if (!isContribute(id, url))
+ if (!isContributed(id, url))
{
markContributed(id, url);
if (tagName == "script")
@@ -1136,7 +1136,7 @@
if (url != null)
{
log.trace("Contribution", "Loading javascript:", url);
- loadJavascipt(url, notify);
+ loadJavascript(url, notify);
}
else
{
@@ -1147,6 +1147,7 @@
log.trace("Contribution", "Evaluating javascript:", body);
eval(body);
+ notify();
}
}
else if (tagName == "link")
@@ -1162,17 +1163,19 @@
log.trace("Contribution", "Adding stylesheet: ", body);
- addStyle(body);
+ addStyle(body);
+ notify();
}
}
else
{
log.trace("Contribution", "Skipped - element already contributed.");
+ notify();
}
}
catch (e)
{
- log.error("Contribution", "Error contributing element:", element);
+ log.error("Contribution", "Error contributing element:", element, e);
notify();
}
}
@@ -1486,6 +1489,7 @@
{
if (this.next != null)
{
+ log.info("RequestQueue", "Item processed successfully", this);
this.invokeSuccessHandlers();
this.next();
this.next = null;
@@ -1549,8 +1553,81 @@
return url;
},
+ parseHeaderContribution: function(header)
+ {
+ var s = "<head>" + header + "</head>";
+ // build a DOM tree of the contribution
+ var xmldoc;
+ if (window.ActiveXObject) {
+ xmldoc = new ActiveXObject("Microsoft.XMLDOM");
+ xmldoc.loadXML(s);
+ } else {
+ var parser = new DOMParser();
+ xmldoc = parser.parseFromString(s, "text/xml");
+ }
+
+ return xmldoc.documentElement;;
+ },
+
+ processHeaderContribution: function(header, steps)
+ {
+ var rootNode = this.parseHeaderContribution(header);
+
+ var processNode = function(node)
+ {
+ var tagName = node.tagName.toLowerCase();
+ if (tagName == "script" || tagName == "link" || tagName == "style")
+ {
+ steps.push(function(notify)
+ {
+ contributeElement(node, notify);
+ });
+ }
+ };
+
+ // go through the individual elements and process them according to their type
+ for (var i = 0; i < rootNode.childNodes.length; i++)
+ {
+ var node = rootNode.childNodes[i];
+ if (node.tagName != null)
+ {
+ var name = node.tagName.toLowerCase();
+
+ // it is possible that a reference is surrounded by a <wicket:link
+ // in that case, we need to find the inner element
+ if (name == "wicket:link") {
+ for (var j = 0; j < node.childNodes.length; ++j)
+ {
+ var childNode = node.childNodes[j];
+ // try to find a regular node inside wicket:link
+ if (childNode.nodeType == 1)
+ {
+ processNode(childNode);
+ }
+ }
+ }
+
+ // process the element
+ processNode(node);
+ }
+ }
+
+ },
+
processResponse: function(response)
{
+ var steps = new Array();
+
+ this.processHeaderContribution(response.header, steps);
+
+ steps.push(bind(function(notify)
+ {
+ this.success();
+ }, this));
+
+ log.debug("RequestQueue", "Response processed: ", {toString: function() { return "Steps..."; }, steps:steps}, ". Executing.");
+
+ new FunctionsExecutor(steps).start();
},
onSuccess: function(transactionId, responseObject)
@@ -1561,11 +1638,12 @@
var responseText = responseObject.responseText.substring(10);
var response = eval(responseText);
log.debug("RequestQueue", "Response parsed: ", response);
-
- alert(response.header);
-
- } catch (exception) {
- log.error("RequestQueue","Error parsing or processing response.");
+
+ this.processResponse(response);
+ }
+ catch (exception)
+ {
+ log.error("RequestQueue","Error parsing or processing response.", exception);
this.failure(exception);
}
@@ -1577,7 +1655,8 @@
this.failure();
},
- getRequestCfg: function(url) {
+ getRequestCfg: function(url)
+ {
var a = this.attributes;
var m = a.formId != null ? "POST" : "GET";
var f = a.formId != null ? { id:a.formId } : null;
@@ -1604,13 +1683,11 @@
var url = this.buildUrl();
var cfg = this.getRequestCfg(url);
- log.debug("RequestQueue", "Initiating AJAX Request on ", url, " with configuration ", cfg);
+ log.info("RequestQueue", "Initiating AJAX Request on ", url, " with configuration ", cfg);
var request = Y.io(url, cfg);
log.trace("RequestQueue", "Obtained request object ", request);
-
- this.success();
}
};
@@ -1769,11 +1846,13 @@
var reqCount = 0;
- var timestampArgumentMethod = function(item)
+ var defaultArgumentMethod = function(item)
{
var stamp = "" + (reqCount ++) + (Math.ceil(Math.random() * 10000));
var res = {};
- res[W.ajax.globalSettings.urlParamTimestamp] = stamp;
+ res[W.ajax.globalSettings.urlParamTimestamp] = stamp;
+ res[W.ajax.globalSettings.urlParamUrlDepth] = W.ajax.globalSettings.urlDepthValue;
+ res["wicket:ajax"] = true;
return res;
}
@@ -1789,14 +1868,16 @@
successHandlers: [],
errorHandlers: [],
urlPostProcessors: [],
- urlArgumentMethods: [ timestampArgumentMethod ],
+ urlArgumentMethods: [ defaultArgumentMethod ],
urlPrefix: "INVALID_URL_PREFIX",
urlParamComponentId: "INVALID_COMPONENT_ID_PARAM",
urlParamTimestamp: "INVALID_TIMESTAMP_PARAM",
urlParamPageId: "INVALID_PAGE_ID_PARAM",
urlParamFormId: "INVALID_FORM_ID_PARAM",
urlParamListenerInterface: "INVALID_LISTENER_INTERFACE_PARAM",
- urlParamBehaviorIndex: "INVALID_BEHAVIOR_INDEX_PARAM"
+ urlParamBehaviorIndex: "INVALID_BEHAVIOR_INDEX_PARAM",
+ urlParamUrlDepth: "INVALID_URL_DEPTH_PARAM",
+ urlDepthValue: 0
};
var Ajax = function()
Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/request/AjaxRequestTarget.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/request/AjaxRequestTarget.java?rev=688709&r1=688708&r2=688709&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/request/AjaxRequestTarget.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/request/AjaxRequestTarget.java Mon Aug 25 05:50:23 2008
@@ -75,7 +75,7 @@
public void onBeforeRespond(List<ComponentEntry> components, AjaxRequestTarget target);
/**
- * Triggered after ajax request target is done with its response cycle. At this point only
+ * Triggered after ajax request target is notify with its response cycle. At this point only
* additional javascript can be output to the response using the provided
* {@link IJavascriptResponse} object
*
@@ -228,7 +228,7 @@
* <dt>sourceComponentId</dt>
* <dd>MarkupId of component that has initiated current ajax request or <code>null</code>
* if the component is not available.
- * <dt>done</dt>
+ * <dt>notify</dt>
* <dd>Method that javascript needs to execute after it has finished. Note that it is
* mandatory to call this method otherwise the processing pipeline will stop</dd>
* </dl>
@@ -261,7 +261,7 @@
* <dd>RequestQueueItem instance for current request</dd>
* <dt>componentId</dt>
* <dd>MarkupId of component that has been replaced
- * <dt>done</dt>
+ * <dt>notify</dt>
* <dd>Method that javascript needs to execute after it has finished. Note that it is
* mandatory to call this method otherwise the processing pipeline will stop</dd>
* </dl>
@@ -296,7 +296,7 @@
* <dd>MarkupId of component that has been replaced
* <dt>markup</dt>
* <dd>The new markup that should replace current markup</dd>
- * <dt>done</dt>
+ * <dt>notify</dt>
* <dd>Method that javascript needs to execute after the component has been replaced. Note
* that it is mandatory to call this method otherwise the processing pipeline will stop</dd>
* </dl>
@@ -306,7 +306,7 @@
* <pre>
* var element = W.$(componentId);
* W.replaceOuterHtml(element, markup);
- * done();
+ * notify();
* </pre>
*
* @param replaceJavascript
@@ -465,7 +465,7 @@
* <dl>
* <dt>requestQueueItem</dt>
* <dd>RequestQueueItem instance for current request</dd>
- * <dt>done</dt>
+ * <dt>notify</dt>
* <dd>Must be called for asynchronous javascript
* </dl>
*
@@ -474,7 +474,7 @@
* @param async
* indicates if the javascript should be evaluated asynchrously. If
* <code>async</code> is <code>true</code>, the javascript must invoke the
- * <code>done</code> function that it gets passed for the processing queue to
+ * <code>notify</code> function that it gets passed for the processing queue to
* continue.
*/
public void prependJavascript(String javascript, boolean async)
@@ -512,7 +512,7 @@
* <dl>
* <dt>requestQueueItem</dt>
* <dd>RequestQueueItem instance for current request</dd>
- * <dt>done</dt>
+ * <dt>notify</dt>
* <dd>Must be called for asynchronous javascript
* </dl>
*
@@ -521,7 +521,7 @@
* @param async
* indicates if the javascript should be evaluated asynchrously. If
* <code>async</code> is <code>true</code>, the javascript must invoke the
- * <code>done</code> function that it gets passed for the processing queue to
+ * <code>notify</code> function that it gets passed for the processing queue to
* continue.
*/
public void appendJavascript(String javascript, boolean async)
Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/request/AjaxUrlCodingStrategy.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/request/AjaxUrlCodingStrategy.java?rev=688709&r1=688708&r2=688709&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/request/AjaxUrlCodingStrategy.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/ajaxng/request/AjaxUrlCodingStrategy.java Mon Aug 25 05:50:23 2008
@@ -19,6 +19,7 @@
import org.apache.wicket.Component;
import org.apache.wicket.IRequestTarget;
import org.apache.wicket.Page;
+import org.apache.wicket.RequestCycle;
import org.apache.wicket.Session;
import org.apache.wicket.Component.IVisitor;
import org.apache.wicket.protocol.http.PageExpiredException;
@@ -118,6 +119,10 @@
int behaviorIndex = Integer.valueOf(getParameter(requestParameters, PARAM_BEHAVIOR_INDEX));
+ int urlDepth = Integer.valueOf(getParameter(requestParameters, PARAM_URL_DEPTH));
+
+ RequestCycle.get().getRequest().getRequestParameters().setUrlDepth(urlDepth);
+
return new AjaxRequestTarget(component, behaviorIndex);
}
@@ -139,6 +144,7 @@
public static final String PARAM_FORM_ID = PARAM_PREFIX + "formId";
public static final String PARAM_LISTENER_INTEFACE = PARAM_PREFIX + "listenerInterface";
public static final String PARAM_BEHAVIOR_INDEX = PARAM_PREFIX + "behaviorIndex";
+ public static final String PARAM_URL_DEPTH = PARAM_PREFIX + "urlDepth";
public boolean matches(IRequestTarget requestTarget)
{
Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=688709&r1=688708&r2=688709&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java Mon Aug 25 05:50:23 2008
@@ -415,6 +415,11 @@
{
boolean ajax = false;
+ if (Strings.isTrue(httpServletRequest.getParameter("wicket:ajax")))
+ {
+ return true;
+ }
+
String ajaxHeader = httpServletRequest.getHeader("Wicket-Ajax");
if (Strings.isEmpty(ajaxHeader) == false)
{