package org.exoplatform.services.rest; import java.io.IOException; import java.net.URI; import javax.annotation.security.RolesAllowed; import javax.jcr.ItemNotFoundException; import javax.jcr.Node; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import org.apache.commons.lang.StringUtils; import org.exoplatform.commons.utils.CommonsUtils; import org.exoplatform.services.cms.documents.DocumentService; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.core.ExtendedSession; import org.exoplatform.services.jcr.ext.app.SessionProviderService; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.rest.resource.ResourceContainer; import org.exoplatform.services.wcm.utils.WCMCoreUtils; /** * Web service to redirect to the Documents app to display the document with the given workspace and the given id */ @Path("/documents/view") public class DocumentsAppRedirectService implements ResourceContainer { private static final Log LOG = ExoLogger.getLogger(DocumentsAppRedirectService.class); private SessionProviderService sessionProviderService; private RepositoryService repositoryService; private DocumentService documentService; public DocumentsAppRedirectService(SessionProviderService sessionProviderService, RepositoryService repositoryService, DocumentService documentService) { this.sessionProviderService = sessionProviderService; this.repositoryService = repositoryService; this.documentService = documentService; } @GET @RolesAllowed("users") @Path("/{workspaceName}/{docId}") public Response redirect(@Context HttpServletRequest request, @PathParam("workspaceName") String workspaceName, @PathParam("docId") String docId) throws IOException { if(StringUtils.isEmpty(workspaceName) || StringUtils.isEmpty(docId)) { return Response.serverError().entity("Parameters workspaceName and docId are mandatory").build(); } LOG.debug("Requesting Documents app redirection for doc with id {0}", docId); try { SessionProvider systemSessionProvider = sessionProviderService.getSystemSessionProvider(null); ExtendedSession session = (ExtendedSession) systemSessionProvider.getSession(workspaceName, repositoryService.getCurrentRepository()); Node node = session.getNodeByIdentifier(docId); if(node != null) { String linkInDocumentsApp = documentService.getLinkInDocumentsApp(node.getPath()); URI redirectUrl = new URI(getURLPrefix(request) + linkInDocumentsApp); return Response.temporaryRedirect(redirectUrl).build(); } } catch(ItemNotFoundException e) { LOG.error("Cannot get node " + docId + " : " + e.getMessage(), e); return Response.status(404).build(); } catch(Exception e) { LOG.error("Cannot get node " + docId + " : " + e.getMessage(), e); return Response.serverError().build(); } return Response.serverError().build(); } protected String getURLPrefix(HttpServletRequest request) { StringBuilder result = new StringBuilder(); result.append(request.getScheme()) .append("://") .append(request.getServerName()); int port = request.getServerPort(); if (port != 80) { result.append(':') .append(port); } return result.toString(); } }