package org.exoplatform.wcm.connector.collaboration; import java.io.InputStream; import java.net.URLEncoder; import javax.jcr.AccessDeniedException; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.Session; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.exoplatform.common.http.HTTPStatus; import org.exoplatform.ecm.utils.text.Text; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.rest.resource.ResourceContainer; import org.exoplatform.services.wcm.utils.WCMCoreUtils; /** * Enables downloading the content of _nt\:file_. * * @LevelAPI Provisional * * @anchor DownloadConnector */ @Path("/contents/") public class DownloadConnector implements ResourceContainer{ /** * Returns to browser a stream got from _jcr\:content_/_jcr\:data_ for downloading the content of the node. * * @param workspace The workspace where stores the document node. * @param path The path to the document node. * @param version The version name. * @return the instance of javax.ws.rs.core.Response. * @throws Exception The exception * * @anchor DownloadConnector.download */ @GET @Path("/download/{workspace}/{path:.*}/") public Response download(@PathParam("workspace") String workspace, @PathParam("path") String path, @QueryParam("version") String version) throws Exception { InputStream is = null; String mimeType = MediaType.TEXT_XML; Node node = null; String fileName = null; SessionProvider sessionProvider = WCMCoreUtils.getUserSessionProvider(); ManageableRepository manageableRepository = WCMCoreUtils.getRepository(); Session session = sessionProvider.getSession(workspace, manageableRepository); if (!path.startsWith("/")) { path = "/" + path; } try { node = (Node) session.getItem(path); fileName = node.getName(); if (node.hasProperty("exo:title")){ fileName = node.getProperty("exo:title").getString(); } fileName = Text.unescapeIllegalJcrChars(fileName); fileName = URLEncoder.encode(fileName, "utf-8").replace("+", "%20"); // In case version is specified, get file from version history if (version != null) { node = node.getVersionHistory().getVersion(version).getNode("jcr:frozenNode"); } Node jrcNode = node.getNode("jcr:content"); is = jrcNode.getProperty("jcr:data").getStream(); }catch (PathNotFoundException pne) { return Response.status(HTTPStatus.NOT_FOUND).build(); } catch (AccessDeniedException ade) { return Response.status(HTTPStatus.UNAUTHORIZED).build(); } if (node.isNodeType("nt:file")) { mimeType = node.getNode("jcr:content").getProperty("jcr:mimeType").getString(); } return Response.ok(is, mimeType) .header("Content-Disposition","attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + fileName) .build(); } }