You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by so...@apache.org on 2019/04/09 12:34:06 UTC
[wicket] branch wicket-8.x updated: [WICKET-6648] initiate and
onBeforeDownload signatures are changed (#351)
This is an automated email from the ASF dual-hosted git repository.
solomax pushed a commit to branch wicket-8.x
in repository https://gitbox.apache.org/repos/asf/wicket.git
The following commit(s) were added to refs/heads/wicket-8.x by this push:
new 638c84a [WICKET-6648] initiate and onBeforeDownload signatures are changed (#351)
638c84a is described below
commit 638c84ac6ef9c9b883e8de17baeee0a806f38e51
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Tue Apr 9 19:34:00 2019 +0700
[WICKET-6648] initiate and onBeforeDownload signatures are changed (#351)
* [WICKET-6648] initiate and onBeforeDownload signatures are changed
* Cookie clear is moved to JS, example is added
---
.../examples/ajax/builtin/AjaxDownloadPage.java | 122 +++++++++++++--------
.../websocket/WebSocketBehaviorDemoPage.html | 5 +-
.../websocket/WebSocketBehaviorDemoPage.java | 71 +++++++++++-
.../extensions/ajax/AjaxDownloadBehavior.java | 65 +++++++----
.../wicket/extensions/ajax/wicket-ajaxdownload.js | 3 +-
5 files changed, 190 insertions(+), 76 deletions(-)
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 70a682d..fdd43fb 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
@@ -20,6 +20,7 @@ import java.util.concurrent.TimeUnit;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
import org.apache.wicket.extensions.ajax.AjaxDownloadBehavior;
import org.apache.wicket.extensions.ajax.AjaxDownloadBehavior.Location;
import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -34,11 +35,12 @@ import org.apache.wicket.util.time.Duration;
/**
* Ajax download.
- *
+ *
* @author svenmeier
*/
public class AjaxDownloadPage extends BasePage
{
+ private static final long serialVersionUID = 1L;
private WebMarkupContainer downloadingContainer;
/**
@@ -50,9 +52,9 @@ public class AjaxDownloadPage extends BasePage
downloadingContainer.setOutputMarkupPlaceholderTag(true);
downloadingContainer.setVisible(false);
add(downloadingContainer);
-
+
initDownload();
-
+
initDownloadInIframe();
initDownloadInNewWindow();
@@ -75,14 +77,15 @@ public class AjaxDownloadPage extends BasePage
{
IResource resource = new ExampleResource("downloaded via ajax")
.setContentDisposition(ContentDisposition.ATTACHMENT);
-
+
final AjaxDownloadBehavior download = new AjaxDownloadBehavior(resource) {
-
+ private static final long serialVersionUID = 1L;
+
@Override
- protected void onBeforeDownload(AjaxRequestTarget target)
+ protected void onBeforeDownload(IPartialPageRequestHandler handler)
{
downloadingContainer.setVisible(true);
- target.add(downloadingContainer);
+ handler.add(downloadingContainer);
}
@Override
@@ -91,20 +94,22 @@ 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');");
}
};
add(download);
-
+
add(new AjaxLink<Void>("download")
{
+ private static final long serialVersionUID = 1L;
+
@Override
public void onClick(AjaxRequestTarget target)
{
@@ -117,14 +122,16 @@ public class AjaxDownloadPage extends BasePage
{
IResource resource = new ExampleResource("downloaded via ajax in iframe")
.setContentDisposition(ContentDisposition.ATTACHMENT);
-
- final AjaxDownloadBehavior download = new AjaxDownloadBehavior(resource) {
-
+
+ final AjaxDownloadBehavior download = new AjaxDownloadBehavior(resource)
+ {
+ private static final long serialVersionUID = 1L;
+
@Override
- protected void onBeforeDownload(AjaxRequestTarget target)
+ protected void onBeforeDownload(IPartialPageRequestHandler handler)
{
downloadingContainer.setVisible(true);
- target.add(downloadingContainer);
+ handler.add(downloadingContainer);
}
@Override
@@ -133,21 +140,23 @@ 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');");
}
};
download.setLocation(Location.IFrame);
add(download);
-
+
add(new AjaxLink<Void>("downloadIframe")
{
+ private static final long serialVersionUID = 1L;
+
@Override
public void onClick(AjaxRequestTarget target)
{
@@ -155,24 +164,29 @@ public class AjaxDownloadPage extends BasePage
}
});
}
-
+
private void initDownloadReference()
{
- ResourceReference reference = new ResourceReference("referenceToResource") {
+ ResourceReference reference = new ResourceReference("referenceToResource")
+ {
+ private static final long serialVersionUID = 1L;
+
@Override
public IResource getResource()
{
return new StaticResource();
}
};
-
- final AjaxDownloadBehavior download = new AjaxDownloadBehavior(reference) {
-
+
+ final AjaxDownloadBehavior download = new AjaxDownloadBehavior(reference)
+ {
+ private static final long serialVersionUID = 1L;
+
@Override
- protected void onBeforeDownload(AjaxRequestTarget target)
+ protected void onBeforeDownload(IPartialPageRequestHandler handler)
{
downloadingContainer.setVisible(true);
- target.add(downloadingContainer);
+ handler.add(downloadingContainer);
}
@Override
@@ -181,20 +195,22 @@ 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');");
}
};
add(download);
-
+
add(new AjaxLink<Void>("downloadReference")
{
+ private static final long serialVersionUID = 1L;
+
@Override
public void onClick(AjaxRequestTarget target)
{
@@ -208,13 +224,15 @@ public class AjaxDownloadPage extends BasePage
IResource resource = new ExampleResource("downloaded via ajax in a new browser window")
.setContentDisposition(ContentDisposition.INLINE);
- final AjaxDownloadBehavior download = new AjaxDownloadBehavior(resource) {
+ final AjaxDownloadBehavior download = new AjaxDownloadBehavior(resource)
+ {
+ private static final long serialVersionUID = 1L;
@Override
- protected void onBeforeDownload(AjaxRequestTarget target)
+ protected void onBeforeDownload(IPartialPageRequestHandler handler)
{
downloadingContainer.setVisible(true);
- target.add(downloadingContainer);
+ handler.add(downloadingContainer);
}
@Override
@@ -229,7 +247,7 @@ public class AjaxDownloadPage extends BasePage
{
downloadingContainer.setVisible(false);
target.add(downloadingContainer);
-
+
target.appendJavaScript("alert('Download failed');");
}
@@ -245,6 +263,8 @@ public class AjaxDownloadPage extends BasePage
add(new AjaxLink<Void>("downloadInNewWindow")
{
+ private static final long serialVersionUID = 1L;
+
@Override
public void onClick(AjaxRequestTarget target)
{
@@ -258,13 +278,15 @@ public class AjaxDownloadPage extends BasePage
IResource resource = new ExampleResource("downloaded via ajax in same browser window")
.setContentDisposition(ContentDisposition.ATTACHMENT);
- final AjaxDownloadBehavior download = new AjaxDownloadBehavior(resource) {
+ final AjaxDownloadBehavior download = new AjaxDownloadBehavior(resource)
+ {
+ private static final long serialVersionUID = 1L;
@Override
- protected void onBeforeDownload(AjaxRequestTarget target)
+ protected void onBeforeDownload(IPartialPageRequestHandler handler)
{
downloadingContainer.setVisible(true);
- target.add(downloadingContainer);
+ handler.add(downloadingContainer);
}
@Override
@@ -279,7 +301,7 @@ public class AjaxDownloadPage extends BasePage
{
downloadingContainer.setVisible(false);
target.add(downloadingContainer);
-
+
target.appendJavaScript("alert('Download failed');");
}
@@ -295,6 +317,8 @@ public class AjaxDownloadPage extends BasePage
add(new AjaxLink<Void>("downloadInSameWindow")
{
+ private static final long serialVersionUID = 1L;
+
@Override
public void onClick(AjaxRequestTarget target)
{
@@ -303,22 +327,24 @@ public class AjaxDownloadPage extends BasePage
});
}
- public static class StaticResource extends ResourceStreamResource {
+ public static class StaticResource extends ResourceStreamResource
+ {
+ private static final long serialVersionUID = 1L;
StaticResource() {
setFileName("File-from-ResourceReference");
setContentDisposition(ContentDisposition.ATTACHMENT);
setCacheDuration(Duration.NONE);
}
-
+
@Override
public void respond(Attributes attributes)
{
AjaxDownloadBehavior.markCompleted(attributes);
-
+
super.respond(attributes);
}
-
+
@Override
protected IResourceStream getResourceStream(Attributes attributes)
{
@@ -330,15 +356,17 @@ public class AjaxDownloadPage extends BasePage
catch (InterruptedException e)
{
}
-
+
return new StringResourceStream("downloaded via ajax with resource reference");
}
}
-
- private class ExampleResource extends ResourceStreamResource {
-
+
+ private class ExampleResource extends ResourceStreamResource
+ {
+ private static final long serialVersionUID = 1L;
+
private String content;
-
+
private int count = 0;
public ExampleResource(String content)
@@ -348,7 +376,7 @@ public class AjaxDownloadPage extends BasePage
setFileName("File-from-IResource.txt");
setCacheDuration(Duration.NONE);
}
-
+
@Override
protected IResourceStream getResourceStream(Attributes attributes) {
// simulate delay
@@ -359,7 +387,7 @@ public class AjaxDownloadPage extends BasePage
catch (InterruptedException e)
{
}
-
+
count++;
if (count == 3) {
count = 0;
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/WebSocketBehaviorDemoPage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/WebSocketBehaviorDemoPage.html
index f94fa4b..b9b0e92 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/WebSocketBehaviorDemoPage.html
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/WebSocketBehaviorDemoPage.html
@@ -23,8 +23,9 @@
</head>
<body>
<wicket:extend>
-
- <div wicket:id="chartPanel"></div>
+ <div wicket:id="chartPanel"></div>
+ <button onclick="Wicket.WebSocket.send('start');">Initiate download with Web Socket message</button>
+ <div wicket:id="downloading" class="download-veil"><span>Preparing download ...</span></div>
</wicket:extend>
</body>
</html>
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/WebSocketBehaviorDemoPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/WebSocketBehaviorDemoPage.java
index cf3b321..d27bf29 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/WebSocketBehaviorDemoPage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/websocket/WebSocketBehaviorDemoPage.java
@@ -18,23 +18,82 @@ package org.apache.wicket.examples.websocket;
import java.util.concurrent.ScheduledExecutorService;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
import org.apache.wicket.examples.WicketExamplePage;
import org.apache.wicket.examples.websocket.charts.ChartUpdater;
import org.apache.wicket.examples.websocket.charts.WebSocketChart;
+import org.apache.wicket.extensions.ajax.AjaxDownloadBehavior;
+import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.protocol.https.RequireHttps;
import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
import org.apache.wicket.protocol.ws.api.message.TextMessage;
+import org.apache.wicket.request.resource.ContentDisposition;
+import org.apache.wicket.request.resource.IResource;
+import org.apache.wicket.request.resource.ResourceStreamResource;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
+import org.apache.wicket.util.time.Duration;
@RequireHttps
public class WebSocketBehaviorDemoPage extends WicketExamplePage
{
- public WebSocketBehaviorDemoPage()
- {
+ private static final long serialVersionUID = 1L;
+ private final WebMarkupContainer downloadingContainer = new WebMarkupContainer("downloading");
+
+ @Override
+ protected void onInitialize() {
+ super.onInitialize();
+
+ ResourceStreamResource resource = new ResourceStreamResource()
+ {
+ private static final long serialVersionUID = 1L;
+ private int i = 42;
+
+ @Override
+ protected IResourceStream getResourceStream(IResource.Attributes attributes)
+ {
+ return new StringResourceStream("downloaded via ajax " + (i++) + " times");
+ }
+ }.setContentDisposition(ContentDisposition.ATTACHMENT)
+ .setFileName("File-from-IResource.txt")
+ .setCacheDuration(Duration.NONE);
+
+ final AjaxDownloadBehavior download = new AjaxDownloadBehavior(resource)
+ {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onBeforeDownload(IPartialPageRequestHandler handler)
+ {
+ downloadingContainer.setVisible(true);
+ handler.add(downloadingContainer);
+ }
+
+ @Override
+ protected void onDownloadSuccess(AjaxRequestTarget target)
+ {
+ downloadingContainer.setVisible(false);
+ target.add(downloadingContainer);
+ }
+
+ @Override
+ protected void onDownloadFailed(AjaxRequestTarget target)
+ {
+ downloadingContainer.setVisible(false);
+ target.add(downloadingContainer);
+
+ target.appendJavaScript("alert('Download failed');");
+ }
+ };
+ add(download);
WebSocketChart chartPanel = new WebSocketChart("chartPanel");
chartPanel.add(new WebSocketBehavior()
{
+ private static final long serialVersionUID = 1L;
+
@Override
protected void onConnect(ConnectedMessage message)
{
@@ -44,14 +103,20 @@ public class WebSocketBehaviorDemoPage extends WicketExamplePage
ChartUpdater.start(message, service);
}
});
+ add(downloadingContainer.setOutputMarkupPlaceholderTag(true).setVisible(false));
add(chartPanel);
add(new WebSocketBehavior()
{
+ private static final long serialVersionUID = 1L;
+
@Override
protected void onMessage(WebSocketRequestHandler handler, TextMessage message)
{
- super.onMessage(handler, message);
+ if ("start".equals(message.getText()))
+ {
+ download.initiate(handler);
+ }
}
});
}
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownloadBehavior.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownloadBehavior.java
index 4b2a217..609a2be 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownloadBehavior.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownloadBehavior.java
@@ -25,6 +25,7 @@ import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.json.JSONFunction;
import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.request.Response;
@@ -45,17 +46,17 @@ import com.github.openjson.JSONObject;
* Download resources via Ajax.
* <p>
* Usage:
- *
+ *
* <pre>
* final AjaxDownload download = new AjaxDownload(resource);
* add(download);
- *
+ *
* add(new AjaxButton("download")
* {
* @Override
- * protected void onSubmit(AjaxRequestTarget target, Form<?> form)
+ * protected void onSubmit(IPartialPageRequestHandler handler, Form<?> form)
* {
- * download.initiate(target);
+ * download.initiate(handler);
* }
* });
* </pre>
@@ -63,7 +64,7 @@ import com.github.openjson.JSONObject;
* <p>To set the name of the downloaded resource make use of
* {@link org.apache.wicket.request.resource.ResourceStreamResource#setFileName(String)} or
* {@link org.apache.wicket.request.resource.AbstractResource.ResourceResponse#setFileName(String)}</p>
- *
+ *
* @author svenmeier
* @author Martin Grigorov
* @author Maxim Solodovnik
@@ -95,7 +96,7 @@ public class AjaxDownloadBehavior extends AbstractDefaultAjaxBehavior
* the resource has to be a {@link ContentDisposition#ATTACHMENT}.
* <p>
* Note: This will trigger JavaScript <em>unload</em> event on the page!
- * Does not support {@link AjaxDownloadBehavior#onDownloadFailed(AjaxRequestTarget)} callback,
+ * Does not support {@link AjaxDownloadBehavior#onDownloadFailed(IPartialPageRequestHandler)} callback,
* i.e. it is not possible to detect when the download has failed!
*/
SameWindow,
@@ -127,7 +128,7 @@ public class AjaxDownloadBehavior extends AbstractDefaultAjaxBehavior
/**
* Download of a {@link IResource}.
- *
+ *
* @param resource
* resource to download
*/
@@ -143,8 +144,8 @@ public class AjaxDownloadBehavior extends AbstractDefaultAjaxBehavior
* <p>
* The {@link IResource} returned by {@link ResourceReference#getResource()} must call
* {@link #markCompleted(Attributes)} when responding, otherwise the callback
- * {@link #onDownloadSuccess(AjaxRequestTarget)} will not work.
- *
+ * {@link #onDownloadSuccess(IPartialPageRequestHandler)} will not work.
+ *
* @param reference
* reference to resource to download
*/
@@ -158,8 +159,8 @@ public class AjaxDownloadBehavior extends AbstractDefaultAjaxBehavior
* <p>
* The {@link IResource} returned by {@link ResourceReference#getResource()} must call
* {@link #markCompleted(Attributes)} when responding, otherwise the callback
- * {@link #onDownloadSuccess(AjaxRequestTarget)} will not work.
- *
+ * {@link #onDownloadSuccess(IPartialPageRequestHandler)} will not work.
+ *
* @param reference
* reference to resource to download
* @param resourceParameters
@@ -195,21 +196,25 @@ public class AjaxDownloadBehavior extends AbstractDefaultAjaxBehavior
}
}
+ @Deprecated
+ public void initiate(AjaxRequestTarget target)
+ {
+ initiate((IPartialPageRequestHandler)target);
+ }
+
/**
* Call this method to initiate the download.
- *
- * @param target
- * the initiating Ajax target
+ *
+ * @param handler
+ * the initiating RequestHandler
*/
- public void initiate(AjaxRequestTarget target)
+ public void initiate(IPartialPageRequestHandler handler)
{
if (getComponent() == null)
{
throw new WicketRuntimeException("not bound to a component");
}
- ((WebResponse)RequestCycle.get().getResponse()).clearCookie(cookie(getName()));
-
CharSequence url;
if (resourceBehavior == null)
{
@@ -240,15 +245,28 @@ public class AjaxDownloadBehavior extends AbstractDefaultAjaxBehavior
settings.put("downloadUrl", url);
settings.put("method", getLocation().name().toLowerCase(Locale.ROOT));
- target.appendJavaScript(String.format("Wicket.AjaxDownload.initiate(%s);", settings));
+ handler.appendJavaScript(String.format("Wicket.AjaxDownload.initiate(%s);", settings));
- onBeforeDownload(target);
+ if (handler instanceof AjaxRequestTarget) {
+ onBeforeDownload((AjaxRequestTarget)handler);
+ }
+ onBeforeDownload(handler);
}
+ /**
+ * Please use {@link #onBeforeDownload(IPartialPageRequestHandler)} instead
+ *
+ * @param target
+ */
+ @Deprecated
protected void onBeforeDownload(AjaxRequestTarget target)
{
}
+ protected void onBeforeDownload(IPartialPageRequestHandler handler)
+ {
+ }
+
/**
* A callback executed when the download of the resource finished successfully.
*
@@ -324,6 +342,7 @@ public class AjaxDownloadBehavior extends AbstractDefaultAjaxBehavior
*/
private class ResourceBehavior extends Behavior implements IRequestListener
{
+ private static final long serialVersionUID = 1L;
private final IResource resource;
private ResourceBehavior(IResource resource)
@@ -336,7 +355,7 @@ public class AjaxDownloadBehavior extends AbstractDefaultAjaxBehavior
{
return false;
}
-
+
@Override
public void onRequest()
{
@@ -360,7 +379,7 @@ public class AjaxDownloadBehavior extends AbstractDefaultAjaxBehavior
* <p>
* Has to be called from {@link IResource#respond(Attributes)} when downloaded via
* {@link #AjaxDownloadBehavior(IResource)}.
- *
+ *
* @param attributes
* resource attributes
*/
@@ -374,12 +393,12 @@ public class AjaxDownloadBehavior extends AbstractDefaultAjaxBehavior
private static Cookie cookie(String name)
{
Cookie cookie = new Cookie(name, "complete");
-
+
// has to be on root, otherwise JavaScript will not be able to access the
// cookie when it is set from a different path - which is the case when a
// ResourceReference is used
cookie.setPath("/");
-
+
return cookie;
}
}
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 6aaa43a..d0e490c 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
@@ -27,7 +27,8 @@
Wicket.AjaxDownload = {
initiate : function(settings) {
-
+ document.cookie = settings.name +
+ '=;path=/;Max-Age=0;expires=Thu, 01 Jan 1970 00:00:01 GMT';
var notifyServer = function(result) {
settings.attributes.ep = settings.attributes.ep || {};
settings.attributes.ep.result = result;