Question

I want to download a CSV file using Wicket, by implementing an AbstractResource. It looks something like this:

public class ExportCsvFileResource extends AbstractResource 
{
   @Override
   protected AbstractResource.ResourceResponse newResourceResponse(IResource.Attributes attributes) 
   {
        AbstractResource.ResourceResponse resourceResponse = new AbstractResource.ResourceResponse();
        resourceResponse.setContentType("text/csv");
        resourceResponse.setFileName("exported-contacts-file.csv");
        resourceResponse.setTextEncoding("utf-8");
        resourceResponse.setWriteCallback(new AbstractResource.WriteCallback() 
        {
            @Override
            public void writeData(IResource.Attributes attributes) throws IOException 
            {
                OutputStream stream = attributes.getResponse().getOutputStream();
                generateContentInBatches(stream);
            }
        });
        return resourceResponse;
    }
    private void generateContentInBatches(OutputStream stream) 
    {
        int numberOfChunks=//...
        for (int i=0; i<numberOfChunks; i++) 
        {
            byte[] contentChunk = retrieveContentFromBackend(i);
            IOUtils.write(contentChunk, stream);
        }  
    }
}

The problem is that, while the content is being generated with the retrieveContentFromBackend function (which is quite time consuming), the user interface is unresponsive. I click the buttons etc. but nothing happens, only after the file is done being generate can I use the interface again.

How do I avoid blocking the user interface while the file is being generated gradually?

Was it helpful?

Solution

Take a look at RequestMapperApplication and MapperDemoResourceReference from wicket-examples.

You can mount resource references:

mountResource("/print/${sheet}/${format}", new MapperDemoResourceReference());

To load such a resource without blocking the page, you'll have to render a link which triggers the resource directly:

add(new WebMarkupContainer("link")
{
    @Override
    protected void onComponentTag(ComponentTag tag)
    {
        super.onComponentTag(tag);

        PageParameters parameters = new PageParameters();
        parameters.add("sheet", "sheet1");
        parameters.add("format", "A4");
        tag.put("href", urlFor(new MapperDemoResourceReference(), parameters));
    }
});

OTHER TIPS

Here is an example of lazy loading:

http://www.wicket-library.com/wicket-examples/ajax/lazy-loading?1

I don't know how this works with your AbstractResource object but this should get you in the right direction.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top