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:03 UTC
[wicket] branch improvement/reiern70/WICKET-6949 created (now 7027d42)
This is an automated email from the ASF dual-hosted git repository.
reiern70 pushed a change to branch improvement/reiern70/WICKET-6949
in repository https://gitbox.apache.org/repos/asf/wicket.git.
at 7027d42 [WICKET-6949] add initiate method that receive parameters: this allows to initiate "dynamic" downloads
This branch includes the following new commits:
new 7027d42 [WICKET-6949] add initiate method that receive parameters: this allows to initiate "dynamic" downloads
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[wicket] 01/01: [WICKET-6949] add initiate method that receive parameters: this allows to initiate "dynamic" downloads
Posted by re...@apache.org.
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