/** * @author Uoc Nguyen * */ package org.exoplatform.forum.service.ws; import java.io.InputStream; import java.net.URI; import java.util.ArrayList; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.CacheControl; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.Response.Status; import javax.ws.rs.ext.RuntimeDelegate; import org.exoplatform.common.http.HTTPStatus; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.forum.service.ForumService; import org.exoplatform.forum.service.Post; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.rest.impl.RuntimeDelegateImpl; import org.exoplatform.services.rest.resource.ResourceContainer; @Path("ks/forum") public class ForumWebservice implements ResourceContainer { protected final static String JSON_CONTENT_TYPE = MediaType.APPLICATION_JSON; final public static String APP_TYPE = "forum".intern(); private String strQuery; private List<BanIP> ipsToJson = new ArrayList<BanIP>(); private static Log log = ExoLogger.getLogger(ForumWebservice.class); private static final CacheControl cc; static { RuntimeDelegate.setInstance(new RuntimeDelegateImpl()); cc = new CacheControl(); cc.setNoCache(true); cc.setNoStore(true); } public ForumWebservice() { } private MessageBean getNewPosts(String userName, int maxcount) throws Exception { ForumService forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class); List<Post> list = forumService.getRecentPostsForUser(userName, maxcount); if (list != null) { for (Post post : list) { post.setLink(post.getLink() + "/" + post.getId()); } } MessageBean data = new MessageBean(); data.setData(list); return data; } private String getUserId(SecurityContext sc, UriInfo uriInfo) { try { return sc.getUserPrincipal().getName(); } catch (NullPointerException e) { return getViewerId(uriInfo); } catch (Exception e) { log.debug("Failed to get user id", e); return null; } } private String getViewerId(UriInfo uriInfo) { URI uri = uriInfo.getRequestUri(); String requestString = uri.getQuery(); if (requestString == null) return null; String[] queryParts = requestString.split("&"); for (String queryPart : queryParts) { if (queryPart.startsWith("opensocial_viewer_id")) { return queryPart.substring(queryPart.indexOf("=") + 1, queryPart.length()); } } return null; } /** * The rest can gets response is recent posts for user and limited by number post. * * @param maxcount is max number post for render in gadget * @param sc is SecurityContext for get userId login when we use rest link to render gadget. * @param uriInfo is UriInfo for get userId login when we render gadget via gadgets service * @return the response is json-data content list recent post for user. * @throws Exception the exception */ @GET @Path("getmessage/{maxcount}") @Produces(MediaType.APPLICATION_JSON) public Response getMessage(@PathParam("maxcount") int maxcount, @Context SecurityContext sc, @Context UriInfo uriInfo) throws Exception { try { String userName = getUserId(sc, uriInfo); MessageBean data = getNewPosts(userName, maxcount); return Response.ok(data, MediaType.APPLICATION_JSON).cacheControl(cc).build(); } catch (Exception e) { log.debug("Failed to get new post by user."); return Response.status(HTTPStatus.INTERNAL_ERROR).cacheControl(cc).build(); } } /** * The rest can gets response is recent public post limited by number post. * * @param maxcount is max number post for render in gadget * @return the response is json-data content list recent public post. * @throws Exception the exception */ @GET @Path("getpublicmessage/{maxcount}") @Produces(MediaType.APPLICATION_JSON) public Response getPulicMessage(@PathParam("maxcount") int maxcount) throws Exception { MessageBean data = getNewPosts(null, maxcount); return Response.ok(data, MediaType.APPLICATION_JSON).cacheControl(cc).build(); } @GET @Path("filter/{strIP}") @Produces(MediaType.APPLICATION_JSON) public Response filterIps(@PathParam("strIP") String str) throws Exception { ForumService forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class); if (str.equals("all")) { ipsToJson.clear(); List<String> banIps = forumService.getBanList(); for (String ip : banIps) { ipsToJson.add(new BanIP(ip)); } } else if (!str.equals(strQuery)) { ipsToJson.clear(); List<String> banIps = forumService.getBanList(); for (String ip : banIps) { if (ip.startsWith(str)) ipsToJson.add(new BanIP(ip)); } strQuery = str; } return Response.ok(new BeanToJsons<BanIP>(ipsToJson), JSON_CONTENT_TYPE).cacheControl(cc).build(); } @GET @Path("filterIpBanforum/{strForumId}/{strIP}") @Produces(MediaType.APPLICATION_JSON) public Response filterIpBanForum(@PathParam("strForumId") String forumId, @PathParam("strIP") String str) throws Exception { ForumService forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class); if (str.equals("all")) { ipsToJson.clear(); List<String> banIps = forumService.getForumBanList(forumId); for (String ip : banIps) { ipsToJson.add(new BanIP(ip)); } } else if (!str.equals(strQuery)) { ipsToJson.clear(); List<String> banIps = forumService.getForumBanList(forumId); for (String ip : banIps) { if (ip.startsWith(str)) ipsToJson.add(new BanIP(ip)); } strQuery = str; } return Response.ok(new BeanToJsons<BanIP>(ipsToJson), JSON_CONTENT_TYPE).cacheControl(cc).build(); } @GET @Path("filterTagNameForum/{userAndTopicId}/{strTagName}") @Produces(MediaType.APPLICATION_JSON) public Response filterTagNameForum(@PathParam("strTagName") String str, @PathParam("userAndTopicId") String userAndTopicId) throws Exception { ForumService forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class); if (str.equals(" ")) { ipsToJson.clear(); } else if (str.equals("onclickForm")) { ipsToJson.clear(); List<String> banIps = forumService.getTagNameInTopic(userAndTopicId); for (String ip : banIps) { ipsToJson.add(new BanIP(ip)); } } else { ipsToJson.clear(); List<String> banIps = forumService.getAllTagName(str, userAndTopicId); for (String ip : banIps) { if (ip.startsWith(str)) ipsToJson.add(new BanIP(ip)); } } return Response.ok(new BeanToJsons<BanIP>(ipsToJson), JSON_CONTENT_TYPE).cacheControl(cc).build(); } @GET @Path("rss/{resourceid}") @Produces(MediaType.APPLICATION_XML) public Response viewrss(@PathParam("resourceid") String resourceid) throws Exception { try { ForumService forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class); InputStream is = forumService.createForumRss(resourceid, "http://www.exoplatform.com"); return Response.ok(is, MediaType.APPLICATION_XML).cacheControl(cc).build(); } catch (Exception e) { log.trace("\nView RSS fail: " + e.getMessage() + "\n" + e.getCause()); return Response.status(Status.INTERNAL_SERVER_ERROR).build(); } } @GET @Path("rss/user/{resourceid}") @Produces(MediaType.TEXT_XML) public Response userrss(@PathParam("resourceid") String resourceid) throws Exception { try { ForumService forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class); InputStream is = forumService.createUserRss(resourceid, "http://www.exoplatform.com"); return Response.ok(is, MediaType.APPLICATION_XML).cacheControl(cc).build(); } catch (Exception e) { log.trace("\nGet UserRSS fail: ", e); return Response.status(Status.INTERNAL_SERVER_ERROR).build(); } } }