1 package org.exoplatform.services.rest;
2
3 import java.io.IOException;
4 import java.net.URI;
5
6 import javax.annotation.security.RolesAllowed;
7 import javax.jcr.ItemNotFoundException;
8 import javax.jcr.Node;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.ws.rs.GET;
11 import javax.ws.rs.Path;
12 import javax.ws.rs.PathParam;
13 import javax.ws.rs.core.Context;
14 import javax.ws.rs.core.Response;
15
16 import org.apache.commons.lang.StringUtils;
17
18 import org.exoplatform.commons.utils.CommonsUtils;
19 import org.exoplatform.services.cms.documents.DocumentService;
20 import org.exoplatform.services.jcr.RepositoryService;
21 import org.exoplatform.services.jcr.core.ExtendedSession;
22 import org.exoplatform.services.jcr.ext.app.SessionProviderService;
23 import org.exoplatform.services.jcr.ext.common.SessionProvider;
24 import org.exoplatform.services.log.ExoLogger;
25 import org.exoplatform.services.log.Log;
26 import org.exoplatform.services.rest.resource.ResourceContainer;
27 import org.exoplatform.services.wcm.utils.WCMCoreUtils;
28
29
30
31
32 @Path("/documents/view")
33 public class DocumentsAppRedirectService implements ResourceContainer {
34
35 private static final Log LOG = ExoLogger.getLogger(DocumentsAppRedirectService.class);
36
37 private SessionProviderService sessionProviderService;
38 private RepositoryService repositoryService;
39 private DocumentService documentService;
40
41 public DocumentsAppRedirectService(SessionProviderService sessionProviderService, RepositoryService repositoryService, DocumentService documentService) {
42 this.sessionProviderService = sessionProviderService;
43 this.repositoryService = repositoryService;
44 this.documentService = documentService;
45 }
46
47 @GET
48 @RolesAllowed("users")
49 @Path("/{workspaceName}/{docId}")
50 public Response redirect(@Context HttpServletRequest request,
51 @PathParam("workspaceName") String workspaceName,
52 @PathParam("docId") String docId) throws IOException {
53
54 if(StringUtils.isEmpty(workspaceName) || StringUtils.isEmpty(docId)) {
55 return Response.serverError().entity("Parameters workspaceName and docId are mandatory").build();
56 }
57
58 LOG.debug("Requesting Documents app redirection for doc with id {0}", docId);
59
60 try {
61 SessionProvider systemSessionProvider = sessionProviderService.getSystemSessionProvider(null);
62 ExtendedSession session = (ExtendedSession) systemSessionProvider.getSession(workspaceName, repositoryService.getCurrentRepository());
63 Node node = session.getNodeByIdentifier(docId);
64 if(node != null) {
65 String linkInDocumentsApp = documentService.getLinkInDocumentsApp(node.getPath());
66 URI redirectUrl = new URI(getURLPrefix(request) + linkInDocumentsApp);
67 return Response.temporaryRedirect(redirectUrl).build();
68 }
69 } catch(ItemNotFoundException e) {
70 LOG.error("Cannot get node " + docId + " : " + e.getMessage(), e);
71 return Response.status(404).build();
72 } catch(Exception e) {
73 LOG.error("Cannot get node " + docId + " : " + e.getMessage(), e);
74 return Response.serverError().build();
75 }
76
77 return Response.serverError().build();
78 }
79
80 protected String getURLPrefix(HttpServletRequest request) {
81 StringBuilder result = new StringBuilder();
82 result.append(request.getScheme())
83 .append("://")
84 .append(request.getServerName());
85
86 int port = request.getServerPort();
87 if (port != 80) {
88 result.append(':')
89 .append(port);
90 }
91
92 return result.toString();
93 }
94
95 }