package org.nocket.gen.page.visitor.bind.builder; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Serializable; import org.apache.commons.lang.StringUtils; import org.apache.wicket.model.IModel; import org.apache.wicket.request.resource.AbstractResource; import org.apache.wicket.request.resource.ContentDisposition; import org.apache.wicket.util.time.Duration; @SuppressWarnings("serial") public class LinkResource extends AbstractResource { private static final long serialVersionUID = 1L; public static class ResourceResponseXMLUTF8 extends ResourceResponse implements Serializable { public ResourceResponseXMLUTF8() { super(); setContentType("text/xml"); setTextEncoding("utf-8"); } } public static class ResourceResponseHTMLUTF8 extends ResourceResponse implements Serializable { public ResourceResponseHTMLUTF8() { super(); setContentType("text/html"); setTextEncoding("utf-8"); } } public static class ResourceResponseFile extends ResourceResponse implements Serializable { public ResourceResponseFile() { super(); setContentDisposition(ContentDisposition.ATTACHMENT); setCacheDuration(Duration.NONE); } } private IModel<?> model; public LinkResource(IModel<?> model) { this.model = model; } @Override protected ResourceResponse newResourceResponse(Attributes attributes) { ResourceResponse resourceResponse = createResourceResponse(); // if there is no file name defined if (StringUtils.isBlank(resourceResponse.getFileName())) { if (model.getObject() instanceof File) { // if there is a file in the model then use the one from the file resourceResponse.setFileName(((File) model.getObject()).getName()); } else { // if it a stream use a default name resourceResponse.setFileName("download"); } } resourceResponse.setWriteCallback(new WriteCallback() { @Override public void writeData(Attributes attributes) throws IOException { OutputStream outputstream = attributes.getResponse().getOutputStream(); Object object = model.getObject(); InputStream inputstream; if (object instanceof File) { inputstream = new FileInputStream((File) object); } else { inputstream = (InputStream) object; } if (inputstream != null) { try { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputstream.read(buffer)) != -1) { outputstream.write(buffer, 0, bytesRead); } } finally { inputstream.close(); } } } }); return resourceResponse; } protected ResourceResponse createResourceResponse() { return new ResourceResponseFile(); } }