/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.tudarmstadt.ukp.clarin.webanno.support;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.FileUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AbstractAjaxBehavior;
import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
import org.apache.wicket.request.resource.ContentDisposition;
import org.apache.wicket.util.resource.AbstractResourceStream;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
/**
* @see <a href="https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow">AJAX update and file download in one blow</a>
* @author Sven Meier
* @author Ernesto Reinaldo Barreiro (reiern70@gmail.com)
* @author Jordi Deu-Pons (jordi@jordeu.net)
*/
public class AJAXDownload
extends AbstractAjaxBehavior
{
private static final long serialVersionUID = -3702600595997355221L;
private boolean addAntiCache;
private String fileName;
public AJAXDownload()
{
this(true);
}
public AJAXDownload(boolean addAntiCache)
{
super();
this.addAntiCache = addAntiCache;
}
/**
* Call this method to initiate the download.
*
* @param aTarget the AJAX target.
* @param aFileName the filename.
*/
public void initiate(AjaxRequestTarget aTarget, String aFileName)
{
fileName = aFileName;
String url = getCallbackUrl().toString();
if (addAntiCache) {
url = url + (url.contains("?") ? "&" : "?");
url = url + "antiCache=" + System.currentTimeMillis();
}
// the timeout is needed to let Wicket release the channel
aTarget.appendJavaScript("setTimeout(\"window.location.href='" + url + "'\", 100);");
}
@Override
public void onRequest()
{
ResourceStreamRequestHandler handler = new ResourceStreamRequestHandler(
getResourceStream(), getFileName());
handler.setContentDisposition(ContentDisposition.ATTACHMENT);
getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
}
/**
* Override this method for a file name which will let the browser prompt with a save/open
* dialog.
*
* @return the filename.
*/
protected String getFileName()
{
return new File(fileName).getName();
}
/**
* Hook method providing the actual resource stream.
*
* @return the stream.
*/
protected IResourceStream getResourceStream()
{
IResourceStream resStream = new AbstractResourceStream() {
private static final long serialVersionUID = 1L;
InputStream inStream;
@Override
public InputStream getInputStream() throws ResourceStreamNotFoundException{
try {
inStream = new FileInputStream(fileName);
} catch (IOException e) {
}
return inStream;
}
@Override
public void close() throws IOException {
inStream.close();
inStream = null;
FileUtils.forceDelete(new File(fileName));
}
};
return resStream;
}
}