View Javadoc
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   * Web service to redirect to the Documents app to display the document with the given workspace and the given id
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  }