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)
 		{