package org.exoplatform.wcm.connector.collaboration;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.jcr.ItemNotFoundException;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.ws.rs.GET;
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 org.apache.commons.lang.StringUtils;
import org.exoplatform.ecm.utils.comparator.PropertyValueComparator;
import org.exoplatform.services.cms.documents.FavoriteService;
import org.exoplatform.services.cms.drives.DriveData;
import org.exoplatform.services.cms.drives.ManageDriveService;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.rest.resource.ResourceContainer;
/**
* Returns a list of favorite documents of a given user.
*
* @LevelAPI Provisional
*
* @anchor FavoriteRESTService
*/
@Path("/favorite/")
public class FavoriteRESTService implements ResourceContainer {
private final FavoriteService favoriteService;
private ManageDriveService manageDriveService;
private static final String DATE_MODIFIED = "exo:dateModified";
private static final String TITLE = "exo:title";
private static final int NO_PER_PAGE = 10;
/** The Constant LAST_MODIFIED_PROPERTY. */
private static final String LAST_MODIFIED_PROPERTY = "Last-Modified";
/** The Constant IF_MODIFIED_SINCE_DATE_FORMAT. */
private static final String IF_MODIFIED_SINCE_DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss z";
private static final Log LOG = ExoLogger.getLogger(FavoriteRESTService.class.getName());
public FavoriteRESTService(FavoriteService favoriteService, ManageDriveService manageDriveService) {
this.favoriteService = favoriteService;
this.manageDriveService = manageDriveService;
}
/**
* Returns a list of favorite documents of a given user.
*
* @param repoName The repository name.
* @param workspaceName The workspace name.
* @param userName The username.
* @param showItems Shows the number of items per page.
* @return Response inputstream.
* @throws Exception
*
* @anchor FavoriteRESTService.getFavoriteByUser
*/
@GET
@Path("/all/{repoName}/{workspaceName}/{userName}")
public Response getFavoriteByUser(@PathParam("repoName") String repoName,
@PathParam("workspaceName") String workspaceName,
@PathParam("userName") String userName, @QueryParam("showItems") String showItems) throws Exception {
List<FavoriteNode> listFavorites = new ArrayList<FavoriteNode>();
List<DriveData> listDrive = manageDriveService.getAllDrives();
if (StringUtils.isEmpty(showItems)) {
showItems = String.valueOf(NO_PER_PAGE);
}
try {
List<Node> listNodes = favoriteService.getAllFavoriteNodesByUser(workspaceName,
repoName, userName);
Collections.sort(listNodes, new PropertyValueComparator(DATE_MODIFIED, PropertyValueComparator.DESCENDING_ORDER));
FavoriteNode favoriteNode;
for (Node favorite : listNodes) {
favoriteNode = new FavoriteNode();
favoriteNode.setName(favorite.getName());
favoriteNode.setTitle(getTitle(favorite));
favoriteNode.setDateAddFavorite(getDateFormat(favorite.getProperty(DATE_MODIFIED).getDate()));
favoriteNode.setDriveName(getDriveName(listDrive, favorite));
favoriteNode.setPath(favorite.getPath());
if (favoriteNode != null) {
if (listFavorites.size() < Integer.valueOf(showItems))
listFavorites.add(favoriteNode);
}
}
} catch (ItemNotFoundException e) {
if (LOG.isErrorEnabled()) {
LOG.error(e);
}
return Response.serverError().build();
} catch (RepositoryException e) {
if (LOG.isErrorEnabled()) {
LOG.error(e);
}
return Response.serverError().build();
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error(e);
}
return Response.serverError().build();
}
ListResultNode listResultNode = new ListResultNode();
listResultNode.setListFavorite(listFavorites);
DateFormat dateFormat = new SimpleDateFormat(IF_MODIFIED_SINCE_DATE_FORMAT);
return Response.ok(listResultNode, new MediaType("application", "json"))
.header(LAST_MODIFIED_PROPERTY, dateFormat.format(new Date()))
.build();
}
private String getTitle(Node node) throws Exception {
if (node.hasProperty(TITLE))
return node.getProperty(TITLE).getString();
return node.getName();
}
private String getDateFormat(Calendar date) {
return String.valueOf(date.getTimeInMillis());
}
private String getDriveName(List<DriveData> listDrive, Node node) throws RepositoryException{
String driveName = "";
for (DriveData drive : listDrive) {
if (node.getSession().getWorkspace().getName().equals(drive.getWorkspace())
&& node.getPath().contains(drive.getHomePath()) && drive.getHomePath().equals("/")) {
driveName = drive.getName();
break;
}
}
return driveName;
}
public class ListResultNode {
private List<? extends FavoriteNode> listFavorite;
public List<? extends FavoriteNode> getListFavorite() {
return listFavorite;
}
public void setListFavorite(List<? extends FavoriteNode> listFavorite) {
this.listFavorite = listFavorite;
}
}
public class FavoriteNode {
private String name;
private String nodePath;
private String dateAddFavorite;
private String driveName;
private String title;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setPath(String path) {
this.nodePath = path;
}
public String getPath() {
return nodePath;
}
public void setDateAddFavorite(String dateAddFavorite) {
this.dateAddFavorite = dateAddFavorite;
}
public String getDateAddFavorite() {
return dateAddFavorite;
}
public void setDriveName(String driveName) {
this.driveName = driveName;
}
public String getDriveName() {
return driveName;
}
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
}
}