/*
* 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 javax.jcr.Node;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
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.exoplatform.ecm.connector.fckeditor.FCKUtils;
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;
/**
* Returns and sets a vote value of a given node in the sent parameter.
*
* {{{{portalname}}}}: The name of portal.
* {{{{restcontextname}}}}: The context name of the REST web application which is deployed to the "{{{{portalname}}}}" portal.
*
* @LevelAPI Provisional
*
* @anchor VoteConnector
*/
@Path("/contents/vote/")
public class VoteConnector extends BaseConnector implements ResourceContainer {
/**
* Instantiates a new vote connector.
*/
public VoteConnector() {}
/**
* Sets a vote value for a given content.
*
* @param jcrPath The path of the content.
* @param vote The vote value.
* @return http The code.
* @throws Exception The exception
*
* @anchor VoteConnector.postStarVote
*/
@POST
@Path("/star/")
// @InputTransformer(PassthroughInputTransformer.class)
public Response postStarVote(
@FormParam("jcrPath") String jcrPath,
@FormParam("vote") String vote
) throws Exception {
if (jcrPath.contains("%20")) jcrPath = URLDecoder.decode(jcrPath, "UTF-8");
return postVote(null, null, jcrPath, vote, "en" );
}
/**
* Returns a vote value for a given content.
*
* @param repositoryName The repository name.
* @param workspaceName The workspace name.
* @param jcrPath The path of the content.
* @return http The code.
* @throws Exception The exception
*
* @anchor VoteConnector.getStarVote
*/
@GET
@Path("/star/")
// @OutputTransformer(XMLOutputTransformer.class)
public Response getStarVote(
@QueryParam("repositoryName") String repositoryName,
@QueryParam("workspaceName") String workspaceName,
@QueryParam("jcrPath") String jcrPath) throws Exception {
return getVote(repositoryName, workspaceName, jcrPath);
}
/**
* Sets a vote value for a given content.
*
* @param repositoryName The repository name.
* @param workspaceName The workspace name.
* @param jcrPath The path of the content.
* @param vote The vote value.
* @param lang The language of the content.
* @return http The code.
* @throws Exception The exception
*
* @anchor VoteConnector.postVote
*/
@GET
@Path("/postVote/")
// @InputTransformer(PassthroughInputTransformer.class)
public Response postVote(
@QueryParam("repositoryName") String repositoryName,
@QueryParam("workspaceName") String workspaceName,
@QueryParam("jcrPath") String jcrPath,
@QueryParam("vote") String vote,
@QueryParam("lang") String lang
) throws Exception {
try {
if (repositoryName==null && workspaceName==null) {
String[] path = jcrPath.split("/");
repositoryName = path[1];
workspaceName = path[2];
jcrPath = jcrPath.substring(repositoryName.length()+workspaceName.length()+2);
if (jcrPath.charAt(1)=='/') jcrPath.substring(1);
}
Node content = getContent(workspaceName, jcrPath, null, false);
if (content.isNodeType("mix:votable")) {
String userName = content.getSession().getUserID();
votingService.vote(content, Double.parseDouble(vote), userName, lang);
}
} 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();
}
/**
* Returns a vote value for a given content.
*
* @param repositoryName The repository name.
* @param workspaceName The workspace name.
* @param jcrPath The path of the content.
* @return http The code
* @throws Exception The exception
*
* @anchor VoteConnector.getVote
*/
@GET
@Path("/getVote/")
// @OutputTransformer(XMLOutputTransformer.class)
public Response getVote(
@QueryParam("repositoryName") String repositoryName,
@QueryParam("workspaceName") String workspaceName,
@QueryParam("jcrPath") String jcrPath) throws Exception {
try {
if (repositoryName==null && workspaceName==null) {
String[] path = jcrPath.split("/");
repositoryName = path[1];
workspaceName = path[2];
jcrPath = jcrPath.substring(repositoryName.length()+workspaceName.length()+2);
if (jcrPath.charAt(1)=='/') jcrPath.substring(1);
}
Node content = getContent(workspaceName, jcrPath);
if (content.isNodeType("mix:votable")) {
String votingRate = "";
if (content.hasProperty("exo:votingRate"))
votingRate = content.getProperty("exo:votingRate").getString();
String votingTotal = "";
if (content.hasProperty("exo:voteTotalOfLang"))
votingTotal = content.getProperty("exo:voteTotalOfLang").getString();
Document document =
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element element = document.createElement("vote");
Element rate = document.createElement("rate");
rate.setTextContent(votingRate);
Element total = document.createElement("total");
total.setTextContent(votingTotal);
element.appendChild(rate);
element.appendChild(total);
document.appendChild(element);
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();
}
/*
* (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;
}
}