/* * Copyright (C) 2003-2008 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.wcm.connector.collaboration; import java.net.URLDecoder; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import javax.jcr.Node; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.dom.DOMSource; import org.apache.commons.lang.StringUtils; import org.exoplatform.ecm.connector.fckeditor.FCKUtils; import org.exoplatform.services.cms.comments.CommentsService; import org.exoplatform.services.rest.resource.ResourceContainer; import org.exoplatform.services.wcm.portal.PortalFolderSchemaHandler; import org.exoplatform.services.wcm.webcontent.WebContentSchemaHandler; import org.exoplatform.wcm.connector.BaseConnector; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * The CommentConnector aims to manage and use comments for the content. * * @LevelAPI Experimental * * @anchor CommentConnector */ @Path("/contents/comment/") public class CommentConnector extends BaseConnector implements ResourceContainer { CommentsService commentsService; /** * Instantiates a new tag connector. * * @param commentsService Service instantiation. */ public CommentConnector(CommentsService commentsService) { this.commentsService = commentsService; } /** * * Adds a new comment to the content. * * @param jcrPath The JCR path of the content. * @param comment The comment to add. * @return The last modified date as a property to check the result. * @throws Exception The exception * * @anchor CommentConnector.addComment */ @POST @Path("/add") public Response addComment( @FormParam("jcrPath") String jcrPath, @FormParam("comment") String comment ) throws Exception { Node content = getNode(jcrPath); commentsService.addComment(content, content.getSession().getUserID(), null, null, comment,null); DateFormat dateFormat = new SimpleDateFormat(IF_MODIFIED_SINCE_DATE_FORMAT); return Response.ok().header(LAST_MODIFIED_PROPERTY, dateFormat.format(new Date())).build(); } /** * Gets all comments for a specific content. * * @param jcrPath The JCR path of the content. * @return All comments * @throws Exception The exception * * @anchor CommentConnector.getComments */ @GET @Path("/all") public Response getComments( @QueryParam("jcrPath") String jcrPath ) throws Exception { try { Node content = getNode(jcrPath); List<Node> comments = commentsService.getComments(content, null); Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); Element tagsElt = document.createElement("comments"); for (Node comment:comments) { Element tagElt = document.createElement("comment"); //exo:name Element id = document.createElement("id"); id.setTextContent(comment.getName()); //exo:commentor Element commentor = document.createElement("commentor"); commentor.setTextContent(comment.getProperty("exo:commentor").getString()); //exo:commentorEmail Element commentorEmail = document.createElement("email"); if (comment.hasProperty("exo:commentorEmail")) { commentorEmail.setTextContent(comment.getProperty("exo:commentorEmail").getString()); } //exo:commentDate Element date = document.createElement("date"); date.setTextContent(DateFormat.getDateTimeInstance().format(comment.getProperty("exo:commentDate").getDate().getTime())); //exo:commentContent Element commentElt = document.createElement("content"); commentElt.setTextContent(comment.getProperty("exo:commentContent").getString()); tagElt.appendChild(id); tagElt.appendChild(commentor); tagElt.appendChild(commentorEmail); tagElt.appendChild(date); tagElt.appendChild(commentElt); tagsElt.appendChild(tagElt); } document.appendChild(tagsElt); DateFormat dateFormat = new SimpleDateFormat(IF_MODIFIED_SINCE_DATE_FORMAT); return Response.ok(new DOMSource(document), MediaType.TEXT_XML) .header(LAST_MODIFIED_PROPERTY, dateFormat.format(new Date())) .build(); } catch (Exception e){ Response.serverError().build(); } DateFormat dateFormat = new SimpleDateFormat(IF_MODIFIED_SINCE_DATE_FORMAT); return Response.ok().header(LAST_MODIFIED_PROPERTY, dateFormat.format(new Date())).build(); } /** * * Delete a comment of a content. * * @param jcrPath The JCR path of the content. * @param commentId The id of the comment to delete. * @return * @throws Exception The exception * * @anchor CommentConnector.deleteComment */ @DELETE @Path("/delete") public Response deleteComment( @QueryParam("jcrPath") String jcrPath, @QueryParam("commentId") String commentId ) throws Exception { if(StringUtils.isEmpty(jcrPath) || StringUtils.isEmpty(commentId)) { return Response.status(400).entity("jcrPath and commentId query parameters are mandatory").build(); } Node content = getNode(jcrPath); if(content.hasNode("comments")) { Node commentsNode = content.getNode("comments"); if(commentsNode.hasNode(commentId)) { commentsService.deleteComment(commentsNode.getNode(commentId)); } else { return Response.noContent().build(); } } else { return Response.noContent().build(); } return Response.ok().build(); } /** * Get the jcr node of the given jcr path * @param jcrPath * @return The node of the given jcr path * @throws Exception */ protected Node getNode(@QueryParam("jcrPath") String jcrPath) throws Exception { if (jcrPath.contains("%20")) { jcrPath = URLDecoder.decode(jcrPath, "UTF-8"); } String[] path = jcrPath.split("/"); String repositoryName = path[1]; String workspaceName = path[2]; jcrPath = jcrPath.substring(repositoryName.length()+workspaceName.length()+2); if (jcrPath.charAt(1)=='/') { jcrPath.substring(1); } return getContent(workspaceName, jcrPath, null, false); } /* * (non-Javadoc) * @see * org.exoplatform.wcm.connector.fckeditor.BaseConnector#getRootContentStorage * (javax.jcr.Node) */ @Override protected Node getRootContentStorage(Node parentNode) throws Exception { try { PortalFolderSchemaHandler folderSchemaHandler = webSchemaConfigService.getWebSchemaHandlerByType(PortalFolderSchemaHandler.class); return folderSchemaHandler.getDocumentStorage(parentNode); } catch (Exception e) { WebContentSchemaHandler webContentSchemaHandler = webSchemaConfigService.getWebSchemaHandlerByType(WebContentSchemaHandler.class); return webContentSchemaHandler.getDocumentFolder(parentNode); } } /* * (non-Javadoc) * @see * org.exoplatform.wcm.connector.fckeditor.BaseConnector#getContentStorageType * () */ @Override protected String getContentStorageType() throws Exception { return FCKUtils.DOCUMENT_TYPE; } }