You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2017/03/21 22:23:42 UTC

[7/7] wicket git commit: WICKET-6286 support failure callback for NewWindow too

WICKET-6286 support failure callback for NewWindow too


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

Branch: refs/heads/master
Commit: 3990899278e2dc5a2c60eac9acf71af9716d018c
Parents: a7c0109
Author: Sven Meier <sv...@apache.org>
Authored: Tue Mar 21 23:09:53 2017 +0100
Committer: Sven Meier <sv...@apache.org>
Committed: Tue Mar 21 23:23:17 2017 +0100

----------------------------------------------------------------------
 .../examples/ajax/builtin/AjaxDownloadPage.html |  18 +-
 .../examples/ajax/builtin/AjaxDownloadPage.java | 164 +++++++++++--------
 wicket-examples/src/main/webapp/WEB-INF/web.xml |  21 ---
 .../wicket/extensions/ajax/AjaxDownload.java    |  42 +++--
 .../extensions/ajax/wicket-ajaxdownload.js      |  54 ++++--
 5 files changed, 163 insertions(+), 136 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/39908992/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.html
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.html
index 670c736..0be7fe2 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.html
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.html
@@ -23,23 +23,19 @@
 <wicket:extend>
 
 <p>
-This example demonstrates a <a wicket:id="download">download</a> initiated via Ajax.
+	All links below initiate a download of a resource via Ajax (failing every third time): 
 </p>
 
-<p>
-This download <a wicket:id="downloadFailure">fails</a>.
-</p>
-
-<p>
-A resource reference can be <a wicket:id="downloadReference">used too</a>.
-</p>
+<ul>
+	<li>via an <a wicket:id="download">iframe</a>.</li>
+	<li>in a <a wicket:id="downloadInNewWindow">new browser window</a>.</li>
+	<li>in the <a wicket:id="downloadInSameWindow">same window</a>.</li>
+</ul>
 
 <p>
-    This example demonstrates a <a wicket:id="downloadInNewWindow">download</a>
-    initiated via Ajax and serving the response in a new browser window.
+	Alternatively a <a wicket:id="downloadReference">resource reference</a> can be used too.
 </p>
 
-
 <div wicket:id="downloading" class="download-veil"><span>Preparing download ...</span></div>
 
 </wicket:extend>

http://git-wip-us.apache.org/repos/asf/wicket/blob/39908992/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
index b339b64..b589091 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
@@ -16,6 +16,8 @@
  */
 package org.apache.wicket.examples.ajax.builtin;
 
+import java.util.concurrent.TimeUnit;
+
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.extensions.ajax.AjaxDownload;
@@ -29,8 +31,6 @@ import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.StringResourceStream;
 import org.apache.wicket.util.time.Duration;
 
-import java.util.concurrent.TimeUnit;
-
 /**
  * Ajax download.
  * 
@@ -52,30 +52,26 @@ public class AjaxDownloadPage extends BasePage
 		
 		initDownload();
 
-		initDownloadFailure();
+		initDownloadInNewWindow();
 
-		initDownloadReference();
+		initDownloadInSameWindow();
 
-		initDownloadInNewWindow();
+		initDownloadReference();
 	}
 
+	@Override
+	protected void onConfigure()
+	{
+		super.onConfigure();
+
+		// download cannot continue on page refresh
+		downloadingContainer.setVisible(false);
+	}
+	
 	private void initDownload()
 	{
-		IResource resource = new ResourceStreamResource() {
-			protected IResourceStream getResourceStream() {
-				// simulate delay
-				try
-				{
-					TimeUnit.MILLISECONDS.sleep(5000);
-				}
-				catch (InterruptedException e)
-				{
-				}
-				
-				return new StringResourceStream("downloaded via ajax");
-			};
-			
-		}.setFileName("File-from-IResource.txt").setContentDisposition(ContentDisposition.ATTACHMENT).setCacheDuration(Duration.NONE);
+		IResource resource = new ExampleResource("downloaded via ajax")
+			.setContentDisposition(ContentDisposition.ATTACHMENT);
 		
 		final AjaxDownload download = new AjaxDownload(resource) {
 			
@@ -98,6 +94,8 @@ public class AjaxDownloadPage extends BasePage
 			{
 				downloadingContainer.setVisible(false);
 				target.add(downloadingContainer);
+				
+				target.appendJavaScript("alert('Download failed');");
 			}
 		};
 		add(download);
@@ -112,25 +110,17 @@ public class AjaxDownloadPage extends BasePage
 		});
 	}
 	
-	private void initDownloadFailure()
+	private void initDownloadReference()
 	{
-		IResource resource = new ResourceStreamResource() {
-			protected IResourceStream getResourceStream() {
-				// simulate delay
-				try
-				{
-					TimeUnit.MILLISECONDS.sleep(2000);
-				}
-				catch (InterruptedException e)
-				{
-				}
-				
-				throw new AbortWithHttpErrorCodeException(500);
-			};
-			
-		}.setFileName("file").setContentDisposition(ContentDisposition.ATTACHMENT).setCacheDuration(Duration.NONE);
+		ResourceReference reference = new ResourceReference("referenceToResource") {
+			@Override
+			public IResource getResource()
+			{
+				return new StaticResource();
+			}
+		};
 		
-		final AjaxDownload download = new AjaxDownload(resource) {
+		final AjaxDownload download = new AjaxDownload(reference) {
 			
 			@Override
 			protected void onBeforeDownload(AjaxRequestTarget target)
@@ -157,7 +147,7 @@ public class AjaxDownloadPage extends BasePage
 		};
 		add(download);
 		
-		add(new AjaxLink<Void>("downloadFailure")
+		add(new AjaxLink<Void>("downloadReference")
 		{
 			@Override
 			public void onClick(AjaxRequestTarget target)
@@ -166,19 +156,14 @@ public class AjaxDownloadPage extends BasePage
 			}
 		});
 	}
-	
-	private void initDownloadReference()
+
+	private void initDownloadInNewWindow()
 	{
-		ResourceReference reference = new ResourceReference("referenceToResource") {
-			@Override
-			public IResource getResource()
-			{
-				return new StaticResource();
-			}
-		};
-		
-		final AjaxDownload download = new AjaxDownload(reference) {
-			
+		IResource resource = new ExampleResource("downloaded via ajax in a new browser window")
+			.setContentDisposition(ContentDisposition.INLINE);
+
+		final AjaxDownload download = new AjaxDownload(resource) {
+
 			@Override
 			protected void onBeforeDownload(AjaxRequestTarget target)
 			{
@@ -192,17 +177,27 @@ public class AjaxDownloadPage extends BasePage
 				downloadingContainer.setVisible(false);
 				target.add(downloadingContainer);
 			}
-			
+
 			@Override
 			protected void onDownloadFailed(AjaxRequestTarget target)
 			{
 				downloadingContainer.setVisible(false);
 				target.add(downloadingContainer);
+				
+				target.appendJavaScript("alert('Download failed');");
+			}
+
+			@Override
+			protected void onDownloadCompleted(AjaxRequestTarget target)
+			{
+				downloadingContainer.setVisible(false);
+				target.add(downloadingContainer);
 			}
 		};
+		download.setLocation(AjaxDownload.Location.NewWindow);
 		add(download);
-		
-		add(new AjaxLink<Void>("downloadReference")
+
+		add(new AjaxLink<Void>("downloadInNewWindow")
 		{
 			@Override
 			public void onClick(AjaxRequestTarget target)
@@ -212,23 +207,10 @@ public class AjaxDownloadPage extends BasePage
 		});
 	}
 
-	private void initDownloadInNewWindow()
+	private void initDownloadInSameWindow()
 	{
-		IResource resource = new ResourceStreamResource() {
-			protected IResourceStream getResourceStream() {
-				// simulate delay
-				try
-				{
-					TimeUnit.MILLISECONDS.sleep(5000);
-				}
-				catch (InterruptedException e)
-				{
-				}
-
-				return new StringResourceStream("downloaded via ajax in a new browser window");
-			};
-
-		}.setFileName("File-from-IResource.txt").setContentDisposition(ContentDisposition.INLINE).setCacheDuration(Duration.NONE);
+		IResource resource = new ExampleResource("downloaded via ajax in same browser window")
+			.setContentDisposition(ContentDisposition.ATTACHMENT);
 
 		final AjaxDownload download = new AjaxDownload(resource) {
 
@@ -251,6 +233,8 @@ public class AjaxDownloadPage extends BasePage
 			{
 				downloadingContainer.setVisible(false);
 				target.add(downloadingContainer);
+				
+				target.appendJavaScript("alert('Download failed');");
 			}
 
 			@Override
@@ -263,7 +247,7 @@ public class AjaxDownloadPage extends BasePage
 		download.setLocation(AjaxDownload.Location.SameWindow);
 		add(download);
 
-		add(new AjaxLink<Void>("downloadInNewWindow")
+		add(new AjaxLink<Void>("downloadInSameWindow")
 		{
 			@Override
 			public void onClick(AjaxRequestTarget target)
@@ -290,7 +274,7 @@ public class AjaxDownloadPage extends BasePage
 		}
 		
 		@Override
-		protected IResourceStream getResourceStream()
+		protected IResourceStream getResourceStream(Attributes attributes)
 		{
 			// simulate delay
 			try
@@ -304,4 +288,40 @@ public class AjaxDownloadPage extends BasePage
 			return new StringResourceStream("downloaded via ajax with resource reference");
 		}
 	}
-}
+	
+	private class ExampleResource extends ResourceStreamResource {
+		
+		private String content;
+		
+		private int count = 0;
+
+		public ExampleResource(String content)
+		{
+			this.content = content;
+
+			setFileName("File-from-IResource.txt");
+			setCacheDuration(Duration.NONE);
+		}
+		
+		@Override
+		protected IResourceStream getResourceStream(Attributes attributes) {
+			// simulate delay
+			try
+			{
+				TimeUnit.MILLISECONDS.sleep(3000);
+			}
+			catch (InterruptedException e)
+			{
+			}
+			
+			count++;
+			if (count == 3) {
+				count = 0;
+				throw new AbortWithHttpErrorCodeException(400);
+			}
+
+			return new StringResourceStream(content);
+		};
+
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/39908992/wicket-examples/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/webapp/WEB-INF/web.xml b/wicket-examples/src/main/webapp/WEB-INF/web.xml
index e23b1a1..b26c571 100644
--- a/wicket-examples/src/main/webapp/WEB-INF/web.xml
+++ b/wicket-examples/src/main/webapp/WEB-INF/web.xml
@@ -796,27 +796,6 @@
 	</filter-mapping>
 
 
-    <!-- CDI EXAMPLE APPLICATION -->
-    <filter>
-        <filter-name>CdiApplication</filter-name>
-        <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
-        <init-param>
-            <param-name>applicationClassName</param-name>
-            <param-value>org.apache.wicket.examples.cdi.CdiApplication</param-value>
-        </init-param>
-    </filter>
-    <filter-mapping>
-        <filter-name>CdiApplication</filter-name>
-        <url-pattern>/cdi/*</url-pattern>
-    </filter-mapping>
-
-    <listener>
-        <!-- initialize Weld in servlet environment -->
-        <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
-    </listener>
-    <!-- END CDI EXAMPLE APPLICATION -->
-
-
     <!-- Bean Validation EXAMPLE APPLICATION -->
     <filter>
         <filter-name>BeanValidation</filter-name>

http://git-wip-us.apache.org/repos/asf/wicket/blob/39908992/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
index 34595e6..7e6c191 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
@@ -16,16 +16,17 @@
  */
 package org.apache.wicket.extensions.ajax;
 
+import java.util.Locale;
+
 import javax.annotation.Resource;
 import javax.servlet.http.Cookie;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.IResourceListener;
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.json.JSONObject;
-import org.apache.wicket.ajax.json.JsonFunction;
+import org.apache.wicket.ajax.json.JSONFunction;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
@@ -34,13 +35,14 @@ import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
 import org.apache.wicket.request.http.WebResponse;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.resource.ContentDisposition;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.IResource.Attributes;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.resource.JQueryPluginResourceReference;
 import org.apache.wicket.util.lang.Args;
 
-import java.util.Locale;
+import com.github.openjson.JSONObject;
 
 /**
  * Download resources via Ajax.
@@ -69,7 +71,9 @@ public class AjaxDownload extends AbstractDefaultAjaxBehavior
 
 	public enum Location {
 		/**
-		 * The resource will be downloaded via a temporary created iframe.
+		 * The resource will be downloaded via a temporary created iframe, the resource has to be a
+		 * {@link ContentDisposition#ATTACHMENT}.
+		 * <p>
 		 * This is recommended when there are resources in the DOM which will be
 		 * closed automatically on JavaScript <em>unload</em> event, like WebSockets.
 		 * Supports both <em>success</em> and <em>failure</em> callbacks!
@@ -77,18 +81,18 @@ public class AjaxDownload extends AbstractDefaultAjaxBehavior
 		IFrame,
 
 		/**
-		 * The resource will be downloaded by changing the location of the current DOM document.
+		 * The resource will be downloaded by changing the location of the current DOM document, the resource has to be a
+		 * {@link ContentDisposition#ATTACHMENT}.
+		 * <p>
 		 * Note: This will trigger JavaScript <em>unload</em> event on the page!
-		 * Supports only <em>success</em> callback, i.e. it is not possible to detect whether
-		 * the download has finished successfully or not.
+		 * Does not support {@link AjaxDownload#onDownloadFailed(AjaxRequestTarget)} callback, i.e. it is not possible to detect
+		 * when the download has failed!
 		 */
 		SameWindow,
 
 		/**
-		 * The resource will be downloaded in a new browser window by using JavaScript
-		 * <code>window.open()</code> API.
-		 * Supports only <em>success</em> callback, i.e. it is not possible to detect whether
-		 * the download has finished successfully or not.
+		 * The resource will be downloaded in a new browser window by using JavaScript <code>window.open()</code> API,
+		 * the resource has to be a {@link ContentDisposition#INLINE}.
 		 */
 		NewWindow
 	}
@@ -221,7 +225,7 @@ public class AjaxDownload extends AbstractDefaultAjaxBehavior
 		}
 
 		JSONObject settings = new JSONObject();
-		settings.put("attributes", new JsonFunction(renderAjaxAttributes(getComponent())));
+		settings.put("attributes", new JSONFunction(renderAjaxAttributes(getComponent())));
 		settings.put("name", getName());
 		settings.put("downloadUrl", url);
 		settings.put("method", location.name().toLowerCase(Locale.ENGLISH));
@@ -304,7 +308,7 @@ public class AjaxDownload extends AbstractDefaultAjaxBehavior
 	/**
 	 * The behavior responding with the actual resource.
 	 */
-	private class ResourceBehavior extends Behavior implements IResourceListener
+	private class ResourceBehavior extends Behavior implements IRequestListener
 	{
 		private final IResource resource;
 
@@ -314,7 +318,13 @@ public class AjaxDownload extends AbstractDefaultAjaxBehavior
 		}
 
 		@Override
-		public void onResourceRequested()
+		public boolean rendersPage()
+		{
+			return false;
+		}
+		
+		@Override
+		public void onRequest()
 		{
 			final RequestCycle requestCycle = RequestCycle.get();
 			final Response response = requestCycle.getResponse();
@@ -327,7 +337,7 @@ public class AjaxDownload extends AbstractDefaultAjaxBehavior
 
 		public CharSequence getUrl()
 		{
-			return getComponent().urlFor(this, IResourceListener.INTERFACE, null);
+			return getComponent().urlForListener(this, null);
 		}
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/39908992/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
index 26de71e..0c232cf 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
@@ -28,35 +28,31 @@
 	Wicket.AjaxDownload = {
 		initiate : function(settings) {
 
-			var notifyServer = function (result) {
+			var notifyServer = function(result) {
                 settings.attributes.ep = settings.attributes.ep || {};
                 settings.attributes.ep.result = result;
                 Wicket.Ajax.ajax(settings.attributes);
             };
 
-			var checkComplete = function (frame) {
+			var checkComplete = function(watcher) {
 				var result;
 
 				if (document.cookie.indexOf(settings.name + '=') > -1) {
 					result = "success";
-				} else if (frame) {
-					var html = frame.contents().find('body').html();
+				} else {
+					var html = watcher.html();
 					if (html && html.length) {
 						result = "failed";
 					}
 				}
 
 				if (result) {
-					if (frame) {
-						setTimeout(function () {
-							frame.remove();
-						}, 0);
-					}
-
+					watcher.dismiss(result);
+					
 					notifyServer(result);
 				} else {
 					setTimeout(function() {
-						checkComplete(frame);
+						checkComplete(watcher);
 					}, 100);
 				}
 			};
@@ -64,16 +60,42 @@
 			if (settings.method === 'samewindow') {
 				setTimeout(function () {
 					window.location.assign(settings.downloadUrl);
-					checkComplete();
+					checkComplete({
+						html: function() {
+							return jQuery();
+						},
+						
+						dismiss: function(result) {
+						}
+					});
 				}, 10);
 			} else if (settings.method === 'newwindow') {
-				var wo = window.open(settings.downloadUrl, 'ajax-download');
-				jQuery(wo).load(function(evt) {
-					notifyServer(undefined);
+				var wo = window.open(settings.downloadUrl);
+				checkComplete({
+					html: function() {
+						return jQuery(wo ? wo.document : undefined).find('body').html();
+					},
+					
+					dismiss: function(result) {
+						if (result == "failed") {
+							wo.close();
+						}
+					}
 				});
 			} else {
 				var frame = jQuery("<iframe></iframe>").hide().prop("src", settings.downloadUrl).appendTo("body");
-				checkComplete(frame);
+				checkComplete({
+					html: function() {
+						return frame.contents().find('body').html();
+					},
+					
+					dismiss: function() {
+						// don't remove iframe immediately
+						setTimeout(function () {
+							frame.remove();
+						}, 0);
+					}
+				});
 			}
 		}
 	};