package org.brixcms.plugin.content.resource; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import org.apache.wicket.request.resource.AbstractResource; import org.apache.wicket.request.resource.ContentDisposition; import org.apache.wicket.request.resource.IResource; import org.apache.wicket.request.resource.ResourceReference; import org.apache.wicket.util.io.IOUtils; import org.apache.wicket.util.string.Strings; import org.apache.wicket.util.time.Time; import org.brixcms.Brix; import org.brixcms.jcr.api.JcrNode; import org.brixcms.jcr.wrapper.BrixFileNode; import org.brixcms.jcr.wrapper.BrixNode; import org.brixcms.plugin.content.resource.admin.ResourceNodePlugin; import org.brixcms.plugin.hierarchical.nodes.TitledNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author dan.simko@gmail.com */ @SuppressWarnings("serial") public class FileResourceReference extends ResourceReference { public static FileResourceReference INSTANCE = new FileResourceReference(); private FileResourceReference() { super(FileResourceReference.class, FileResourceReference.class.getName()); } @Override public IResource getResource() { return new FileResource(); } public static class FileResource extends AbstractResource { private final static Logger LOG = LoggerFactory.getLogger(FileResource.class); private BrixNode getNode(Attributes attributes) { String workspace = attributes.getParameters().get(ResourceNodePlugin.WS_PARAM_NAME).toOptionalString(); String id = attributes.getParameters().get(ResourceNodePlugin.ID_PARAM_NAME).toOptionalString(); if (!Strings.isEmpty(workspace) && !Strings.isEmpty(id)) { try { return (BrixNode) Brix.get().getCurrentSession(workspace).getNodeByIdentifier(id); } catch (Exception e) { LOG.info("File in workspace {} with id {} was not found due to " + e.getMessage(), workspace, id); } } return null; } @Override protected ResourceResponse newResourceResponse(Attributes attributes) { final ResourceResponse response = new ResourceResponse(); BrixNode node = getNode(attributes); if (node != null) { if (BrixFileNode.isFileNode(node)) { BrixFileNode fileNode = new BrixFileNode(node, node.getSession()); response.setContentType(fileNode.getMimeType()); response.setLastModified(Time.valueOf(fileNode.getCreated())); response.setContentLength(fileNode.getContentLength()); if (ResourceUtils.isImage(fileNode)) { response.setContentDisposition(ContentDisposition.INLINE); } else { response.setFileName(getNodeTitle(node)); response.setContentDisposition(ContentDisposition.ATTACHMENT); } final byte[] data; try { data = IOUtils.toByteArray(fileNode.getDataAsStream()); } catch (IOException e) { LOG.error(e.getMessage(), e); response.setError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); return response; } if (response.dataNeedsToBeWritten(attributes)) { response.setWriteCallback(new WriteCallback() { @Override public void writeData(final Attributes attributes) { attributes.getResponse().write(data); } }); } } else { response.setError(HttpServletResponse.SC_NOT_FOUND); } } else { response.setError(HttpServletResponse.SC_NOT_FOUND); } return response; } private String getNodeTitle(JcrNode node) { if (node instanceof TitledNode) { return ((TitledNode) node).getTitle(); } return node.getName(); } } }