/*
* 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.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
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.cms.folksonomy.NewFolksonomyService;
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;
/*
* Created by The eXo Platform SAS
* Author : Benjamin Paillereau
* benjamin.paillereau@exoplatform.com
* March 25, 2011
*/
/**
* Adds and queries the public tags of a document.
*/
@Path("/contents/tag/")
public class TagConnector extends BaseConnector implements ResourceContainer {
NewFolksonomyService tagService;
/**
* Instantiates a new tag connector.
*/
public TagConnector(NewFolksonomyService tagService) {
this.tagService = tagService;
}
/**
* Adds a public tag to a given document.
*
* @param tag The tag to be added.
*
* @param jcrPath The path of the document, e.g. /portal/collaboration/test/document1,
* in which "portal" is the repository, "collaboration" is the workspace.
*
* @request POST: http://localhost:8080/rest/private/contents/tag/add/tag1?jcrPath=/portal/collaboration/test/document1
*
* @response HTTP Status code. 200 on success. 500 if any error during the process.
*
* @anchor TagConnector.addTag
*/
@POST
@Path("/add/{tag}")
public Response addTag(
@PathParam("tag") String tag,
@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);
Node content = getContent(workspaceName, jcrPath, null, false);
// tagService.addPublicTag("/Application Data/Tags", new String[]{tag}, content, workspaceName);
tagService.addPublicTag("/tags", new String[]{tag}, content, workspaceName);
DateFormat dateFormat = new SimpleDateFormat(IF_MODIFIED_SINCE_DATE_FORMAT);
return Response.ok().header(LAST_MODIFIED_PROPERTY, dateFormat.format(new Date())).build();
}
/**
* Gets the list of public tags of a given document.
*
* @param jcrPath The path of the document, e.g. /portal/collaboration/test/document1,
* in which "portal" is the repository, "collaboration" is the workspace.
*
* @request GET: http://localhost:8080/rest/private/contents/tag/public?jcrPath=/portal/collaboration/test/document1
*
* @format XML
*
* @response The tag names in XML format.
* {@code
* <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
* <tags>
* <tag name="gold" />
* <tag name="silver" />
* </tags>
* }
*
* @anchor TagConnector.getPublicTags
*/
@GET
@Path("/public")
public Response getPublicTags(
@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);
try {
Node content = getContent(workspaceName, jcrPath, null, false);
List<Node> tags = tagService.getLinkedTagsOfDocumentByScope(NewFolksonomyService.PUBLIC,
"",
content,
workspaceName);
Document document =
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element tagsElt = document.createElement("tags");
for (Node tag:tags) {
Element element = document.createElement("tag");
element.setAttribute("name", tag.getName());
tagsElt.appendChild(element);
}
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();
}
/*
* (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;
}
}