package org.jivesoftware.openfire.plugin.rest.service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.packet.JID;
import org.jivesoftware.util.NotFoundException;
import org.jivesoftware.openfire.plugin.rest.exceptions.ServiceException;
import org.jivesoftware.openfire.group.Group;
import org.jivesoftware.openfire.group.GroupManager;
import org.jivesoftware.openfire.group.GroupNotFoundException;
import org.jivesoftware.openfire.plugin.rest.exceptions.ExceptionType;
import org.jivesoftware.openfire.plugin.spark.Bookmark;
import org.jivesoftware.openfire.plugin.spark.Bookmarks;
import org.jivesoftware.openfire.plugin.spark.BookmarkManager;
@Path("restapi/v1/bookmarks")
public class BookmarkService {
private static final Logger Log = LoggerFactory.getLogger(BookmarkService.class);
@PostConstruct
public void init() {
}
@POST
public Bookmark createBookmark(Bookmark newBookmark) throws ServiceException {
Log.info("createBookmark " + newBookmark);
try {
return new Bookmark(newBookmark.getType(), newBookmark.getName(), newBookmark.getValue(),
newBookmark.getUsers(), newBookmark.getGroups());
} catch (Exception e) {
throw new ServiceException("Exception", e.getMessage(), ExceptionType.ILLEGAL_ARGUMENT_EXCEPTION,
Response.Status.BAD_REQUEST);
}
}
@GET
@Path("/")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Bookmarks getBookmarks() throws ServiceException {
Log.info("getBookmarks ");
try {
return new Bookmarks(BookmarkManager.getBookmarks());
} catch (Exception e) {
throw new ServiceException("Exception", e.getMessage(), ExceptionType.ILLEGAL_ARGUMENT_EXCEPTION,
Response.Status.BAD_REQUEST);
}
}
@GET
@Path("/user/{userID}")
public Bookmarks getBookmarkss(@PathParam("userID") String userid) throws ServiceException {
Log.info("getBookmarks " + userid);
Collection<Bookmark> bookmarks = new ArrayList<Bookmark>();
try {
for (Bookmark bookmark : BookmarkManager.getBookmarks()) {
if (isBookmarkForJID(userid, bookmark)) {
bookmarks.add(bookmark);
}
}
return new Bookmarks(bookmarks);
} catch (Exception e) {
throw new ServiceException("Exception", e.getMessage(), ExceptionType.ILLEGAL_ARGUMENT_EXCEPTION,
Response.Status.BAD_REQUEST);
}
}
private boolean isBookmarkForJID(String username, Bookmark bookmark) {
// String username = jid.getNode();
Log.info("isbookmarkforJid " + username);
Log.info(bookmark.getUsers().toString());
if (bookmark.isGlobalBookmark()) {
return true;
}
if (bookmark.getUsers().contains(username)) {
Log.info("true");
return true;
}
Collection<String> groups = bookmark.getGroups();
if (groups != null && !groups.isEmpty()) {
GroupManager groupManager = GroupManager.getInstance();
for (String groupName : groups) {
try {
Group group = groupManager.getGroup(groupName);
if (group.isUser(username)) {
Log.info("true");
return true;
}
} catch (GroupNotFoundException e) {
Log.debug(e.getMessage(), e);
}
}
}
Log.info("false");
return false;
}
@GET
@Path("/{bookmarkID}")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Bookmark getBookmark(@PathParam("bookmarkID") String bookmarkID) throws ServiceException {
Log.info("getBookmark " + bookmarkID);
try {
return new Bookmark(Long.parseLong(bookmarkID));
} catch (Exception e) {
throw new ServiceException("Exception", e.getMessage(), ExceptionType.ILLEGAL_ARGUMENT_EXCEPTION,
Response.Status.BAD_REQUEST);
}
}
@GET
@Path("/{bookmarkID}/property")
public String getBookmark(@PathParam("bookmarkID") String bookmarkID, @QueryParam("name") String name)
throws ServiceException {
Log.info("getBookmark property " + bookmarkID + " " + name);
try {
Bookmark bookmark = BookmarkManager.getBookmark(Long.parseLong(bookmarkID));
return bookmark.getProperty(name);
} catch (Exception e) {
throw new ServiceException("Exception", e.getMessage(), ExceptionType.ILLEGAL_ARGUMENT_EXCEPTION,
Response.Status.BAD_REQUEST);
}
}
@DELETE
@Path("/{bookmarkID}")
public Response deleteBookmark(@PathParam("bookmarkID") String bookmarkID) throws ServiceException {
Log.info("deleteBookmark " + bookmarkID);
try {
BookmarkManager.deleteBookmark(Long.parseLong(bookmarkID));
} catch (Exception e) {
throw new ServiceException("Exception", e.getMessage(), ExceptionType.ILLEGAL_ARGUMENT_EXCEPTION,
Response.Status.BAD_REQUEST);
}
return Response.status(Response.Status.OK).build();
}
@PUT
@Path("/{bookmarkID}")
public Bookmark updateBookmark(@PathParam("bookmarkID") String bookmarkID, Bookmark newBookmark)
throws ServiceException {
Log.info("updateBookmark " + bookmarkID + " " + newBookmark.getType() + " " + newBookmark.getName() + " "
+ newBookmark.getValue() + " " + newBookmark.getUsers() + " " + newBookmark.getGroups() + " "
+ newBookmark.getProperties());
try {
Bookmark bookmark = BookmarkManager.getBookmark(Long.parseLong(bookmarkID));
bookmark.setType(newBookmark.getType());
bookmark.setValue(newBookmark.getValue());
bookmark.setUsers(newBookmark.getUsers());
bookmark.setGroups(newBookmark.getGroups());
return bookmark;
} catch (Exception e) {
throw new ServiceException("Exception", e.getMessage(), ExceptionType.ILLEGAL_ARGUMENT_EXCEPTION,
Response.Status.BAD_REQUEST);
}
}
@PUT
@Path("/{bookmarkID}/property")
public Bookmark updateBookmarkProperty(@PathParam("bookmarkID") String bookmarkID, @QueryParam("name") String name,
@QueryParam("value") String value) throws ServiceException {
Log.info("updateBookmarkProperty " + bookmarkID + " " + name + " " + value);
try {
Bookmark bookmark = BookmarkManager.getBookmark(Long.parseLong(bookmarkID));
bookmark.setProperty(name, value);
return bookmark;
} catch (Exception e) {
throw new ServiceException("Exception", e.getMessage(), ExceptionType.ILLEGAL_ARGUMENT_EXCEPTION,
Response.Status.BAD_REQUEST);
}
}
@DELETE
@Path("/{bookmarkID}/property")
public Bookmark deleteBookmarkProperty(@PathParam("bookmarkID") String bookmarkID, @QueryParam("name") String name)
throws ServiceException {
Log.info("deleteBookmarkProperty " + bookmarkID + " " + name);
try {
Bookmark bookmark = BookmarkManager.getBookmark(Long.parseLong(bookmarkID));
bookmark.deleteProperty(name);
return bookmark;
} catch (Exception e) {
throw new ServiceException("Exception", e.getMessage(), ExceptionType.ILLEGAL_ARGUMENT_EXCEPTION,
Response.Status.BAD_REQUEST);
}
}
}