You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by re...@apache.org on 2022/01/27 15:59:04 UTC
[wicket] 01/01: [WICKET-6949] add initiate method that receive parameters: this allows to initiate "dynamic" downloads
This is an automated email from the ASF dual-hosted git repository.
reiern70 pushed a commit to branch improvement/reiern70/WICKET-6949
in repository https://gitbox.apache.org/repos/asf/wicket.git
commit 7027d42cf5b53415b6b04e012e82a5305d1b757f
Author: reiern70 <re...@gmail.com>
AuthorDate: Wed Jan 26 20:30:31 2022 -0500
[WICKET-6949] add initiate method that receive parameters: this allows to initiate "dynamic" downloads
---
.../examples/ajax/builtin/AjaxApplication.java | 2 +
.../examples/ajax/builtin/AjaxDownloadPage.html | 14 +++
.../examples/ajax/builtin/AjaxDownloadPage.java | 129 ++++++++++++++++++++-
.../extensions/ajax/AjaxDownloadBehavior.java | 15 +++
4 files changed, 156 insertions(+), 4 deletions(-)
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
index 77ad598..4436582 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
@@ -71,6 +71,8 @@ public class AjaxApplication extends WicketExampleApplication
mountPage("world-clock", WorldClockPage.class);
mountPage("upload", FileUploadPage.class);
mountPage("download", AjaxDownloadPage.class);
+
+ mountResource("dynamic-text-file", AjaxDownloadPage.DynamicTextFileResource.instance);
}
/**
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 0ac79df..5e30257 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
@@ -17,6 +17,20 @@
</ul>
<p>
+ <form wicket:id="form">
+ <p>
+ Type something bellow:
+ </p>
+ <p>
+ <textarea wicket:id="text" rows="5" cols="40"></textarea>
+ </p>
+ <p>
+ <a wicket:id="downloadDynamicContents">then click here in order to generate and download a file based on the text above</a>.
+ </p>
+ </form>
+</p>
+
+<p>
Alternatively a <a wicket:id="downloadReference">resource reference</a> can be used too.
</p>
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 0b1cccc..211d9a6 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,12 +20,20 @@ import java.time.Duration;
import java.util.concurrent.TimeUnit;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
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;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextArea;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.resource.AbstractResource;
import org.apache.wicket.request.resource.ContentDisposition;
+import org.apache.wicket.request.resource.DynamicImageResource;
import org.apache.wicket.request.resource.IResource;
import org.apache.wicket.request.resource.ResourceReference;
import org.apache.wicket.request.resource.ResourceStreamResource;
@@ -40,7 +48,9 @@ import org.apache.wicket.util.resource.StringResourceStream;
public class AjaxDownloadPage extends BasePage
{
private static final long serialVersionUID = 1L;
- private WebMarkupContainer downloadingContainer;
+ private final WebMarkupContainer downloadingContainer;
+
+ private IModel<String> text;
/**
* Constructor
@@ -60,6 +70,8 @@ public class AjaxDownloadPage extends BasePage
initDownloadInSameWindow();
+ initDynamicDownload();
+
initDownloadReference();
}
@@ -326,6 +338,62 @@ public class AjaxDownloadPage extends BasePage
});
}
+ private void initDynamicDownload()
+ {
+ final AjaxDownloadBehavior download = new AjaxDownloadBehavior(DynamicTextFileResource.instance)
+ {
+ 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');");
+ }
+
+ @Override
+ protected void onDownloadCompleted(AjaxRequestTarget target)
+ {
+ downloadingContainer.setVisible(false);
+ target.add(downloadingContainer);
+ }
+ };
+ add(download);
+ download.setLocation(Location.Blob);
+ text = Model.of("");
+ Form<Void> form = new Form<>("form");
+ add(form);
+ final TextArea<String> stringTextArea =new TextArea<>("text", text);
+ stringTextArea.setOutputMarkupId(true);
+ form.add(stringTextArea);
+ form.add(new AjaxSubmitLink("downloadDynamicContents")
+ {
+ @Override
+ protected void onSubmit(AjaxRequestTarget target)
+ {
+ download.initiate(target, DynamicTextFileResource.encodeText(text.getObject()));
+ text.setObject("");
+ target.add(stringTextArea);
+ }
+ });
+ }
+
public static class StaticResource extends ResourceStreamResource
{
private static final long serialVersionUID = 1L;
@@ -360,7 +428,7 @@ public class AjaxDownloadPage extends BasePage
}
}
- private class ExampleResource extends ResourceStreamResource
+ private static class ExampleResource extends ResourceStreamResource
{
private static final long serialVersionUID = 1L;
@@ -368,6 +436,12 @@ public class AjaxDownloadPage extends BasePage
private int count = 0;
+ public ExampleResource()
+ {
+ setFileName("Dynamic-File-from-IResource.txt");
+ setCacheDuration(Duration.ZERO);
+ }
+
public ExampleResource(String content)
{
this.content = content;
@@ -393,8 +467,55 @@ public class AjaxDownloadPage extends BasePage
throw new AbortWithHttpErrorCodeException(400);
}
- return new StringResourceStream(content);
- };
+ return new StringResourceStream(getContent(attributes));
+ }
+
+ protected String getContent(Attributes attributes) {
+ return content;
+ }
+
+ }
+
+ public static class DynamicTextFileResource extends ResourceReference {
+
+ static final String FILE_CONTENTS = "fileContents";
+ public static DynamicTextFileResource instance = new DynamicTextFileResource();
+
+ public DynamicTextFileResource() {
+ super(AjaxDownloadPage.class, "DynamicTextFileResource");
+ }
+
+ public static PageParameters encodeText(String text) {
+ PageParameters parameters = new PageParameters();
+ parameters.add(FILE_CONTENTS, text);
+ return parameters;
+ }
+
+ @Override
+ public IResource getResource() {
+ return new ExampleResource() {
+ @Override
+ protected String getContent(Attributes attributes) {
+ String licence = "/*\n" +
+ " * Licensed to the Apache Software Foundation (ASF) under one or more\n" +
+ " * contributor license agreements. See the NOTICE file distributed with\n" +
+ " * this work for additional information regarding copyright ownership.\n" +
+ " * The ASF licenses this file to You under the Apache License, Version 2.0\n" +
+ " * (the \"License\"); you may not use this file except in compliance with\n" +
+ " * the License. You may obtain a copy of the License at\n" +
+ " *\n" +
+ " * http://www.apache.org/licenses/LICENSE-2.0\n" +
+ " *\n" +
+ " * Unless required by applicable law or agreed to in writing, software\n" +
+ " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" +
+ " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" +
+ " * See the License for the specific language governing permissions and\n" +
+ " * limitations under the License.\n" +
+ " */ \n\n\n";
+ return licence + attributes.getParameters().get(FILE_CONTENTS).toString("");
+ }
+ };
+ }
}
}
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 d3882ff..9d176ea 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
@@ -197,6 +197,21 @@ public class AjaxDownloadBehavior extends AbstractDefaultAjaxBehavior
}
/**
+ * Call this method to initiate the download. You can use the {@link #resourceParameters} to dynamically pass
+ * information to the {@link org.apache.wicket.request.resource.IResource} in order to generate contents.
+ *
+ * @param handler
+ * the initiating RequestHandler
+ * @param resourceParameters
+ * Some PageParameters that might be used by the resource in order to generate content
+ */
+ public void initiate(IPartialPageRequestHandler handler, PageParameters resourceParameters)
+ {
+ this.resourceParameters = resourceParameters;
+ initiate(handler);
+ }
+
+ /**
* Call this method to initiate the download.
*
* @param handler