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 <[email protected]>
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

Reply via email to