/** * */ package org.exoplatform.poll.service.ws; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; 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.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.poll.service.Poll; import org.exoplatform.poll.service.PollNodeTypes; import org.exoplatform.poll.service.PollService; import org.exoplatform.poll.service.PollSummary; import org.exoplatform.poll.service.Utils; import org.exoplatform.portal.config.UserACL; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.rest.resource.ResourceContainer; import org.exoplatform.services.security.ConversationState; import org.exoplatform.services.security.Identity; import org.exoplatform.services.security.MembershipEntry; /** * @author Vu Duy Tu * */ @Path("private/ks/poll") public class PollWebservice implements ResourceContainer { private static final Log log = ExoLogger.getLogger(PollWebservice.class); final public static String APP_TYPE = "poll".intern(); public PollWebservice() { } @GET @Path("/viewpoll/{resourceid}") @Produces(MediaType.APPLICATION_JSON) public Response viewPoll(@PathParam("resourceid") String pollId) throws Exception { CacheControl cacheControl = new CacheControl(); cacheControl.setNoCache(true); cacheControl.setNoStore(true); PollService pollService = (PollService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(PollService.class); if (!Utils.isEmpty(pollId)) { try { Poll poll = pollService.getPoll(pollId); if (poll != null) { // poll.setIsAdmin(String.valueOf(hasGroupAdminOfGatein())); poll.setIsAdmin("true"); String group = poll.getParentPath(); boolean hasPerminsion = false; if (group.indexOf(PollNodeTypes.APPLICATION_DATA) > 0 && poll.getIsAdmin().equals("false")) { group = group.substring(group.indexOf(PollNodeTypes.GROUPS + "/") + PollNodeTypes.GROUPS.length(), group.indexOf("/" + PollNodeTypes.APPLICATION_DATA)); for (String group_ : getGroupsOfUser()) { if (group_.indexOf(group) >= 0) { hasPerminsion = true; break; } } } else if (group.indexOf(PollNodeTypes.POLLS) < 0) { hasPerminsion = pollService.hasPermissionInForum(group + "/" + poll.getId(), getAllGroupAndMembershipOfUser()); } else { hasPerminsion = true; } if (!hasPerminsion) { poll = new Poll(); poll.setId("DoNotPermission"); return Response.ok(poll, MediaType.APPLICATION_JSON).cacheControl(cacheControl).build(); } poll.setVotes(); poll.setInfoVote(); poll.setShowVote(isGuestPermission(poll)); return Response.ok(poll, MediaType.APPLICATION_JSON).cacheControl(cacheControl).build(); } } catch (Exception e) { log.error("Can not get poll by id: " + pollId, e); } } PollSummary pollSummary = new PollSummary(); /* if (hasGroupAdminOfGatein()) { pollSummary = pollService.getPollSummary(); pollSummary.setIsAdmin("true"); } else { pollSummary.setId("DoNotPermission"); } */ pollSummary = pollService.getPollSummary(getAllGroupAndMembershipOfUser()); pollSummary.setIsAdmin("true"); return Response.ok(pollSummary, MediaType.APPLICATION_JSON).cacheControl(cacheControl).build(); } @GET @Path("/votepoll/{pollId}/{indexVote}") @Produces(MediaType.APPLICATION_JSON) public Response votePoll(@PathParam("pollId") String pollId, @PathParam("indexVote") String indexVote) throws Exception { CacheControl cacheControl = new CacheControl(); cacheControl.setNoCache(true); cacheControl.setNoStore(true); if (!Utils.isEmpty(pollId) && !Utils.isEmpty(indexVote)) { try { PollService pollService = (PollService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(PollService.class); Poll poll = pollService.getPoll(pollId.trim()); if (poll != null) { poll = calculateVote(poll, getUserId(), indexVote); pollService.savePoll(poll, false, true); poll.setVotes(); poll.setInfoVote(); poll.setShowVote(isGuestPermission(poll)); poll.setIsAdmin(String.valueOf(hasGroupAdminOfGatein())); return Response.ok(poll, MediaType.APPLICATION_JSON).cacheControl(cacheControl).build(); } } catch (Exception e) { log.debug("Failed to vote poll.", e); } } return Response.status(Status.INTERNAL_SERVER_ERROR).build(); } private Poll calculateVote(Poll poll, String userVote, String optionVote) throws Exception { String[] votes; String[] setUserVote; // User vote and vote number String[] temporary = poll.getUserVote(); int size = 0; if (temporary != null && temporary.length > 0) { size = temporary.length; } if (!poll.getIsMultiCheck()) { // order number int j = Integer.valueOf(optionVote); setUserVote = new String[(size + 1)]; System.arraycopy(temporary, 0, setUserVote, 0, size); setUserVote[size] = userVote + ":" + j; size = size + 1; votes = poll.getVote(); double onePercent = (double) 100 / size; int i = 0; for (String vote : votes) { double a = Double.parseDouble(vote); if (i == j) votes[i] = "" + ((a - a / size) + onePercent); else votes[i] = "" + (a - a / size); i = i + 1; } // save Poll poll.setVote(votes); poll.setUserVote(setUserVote); // multichoice when vote } else { List<String> listValue = new ArrayList<String>();// list index checked votes = poll.getVote(); double totalVote = 0; double doubleVote[] = new double[votes.length]; String[] listUserVoted = poll.getUserVote(); if (listUserVoted.length > 0) { for (String us : listUserVoted) { totalVote += us.split(":").length - 1; } } int i = 0; int pos = 0; if (votes != null && votes.length > 0) { for (String v : votes) { doubleVote[i++] = Double.parseDouble(v); } } if (totalVote > 0) { for (i = 0; i < doubleVote.length; i++) { doubleVote[i] = (doubleVote[i] * totalVote) / 100; } } setUserVote = poll.getUserVote(); for (i = 0; i < setUserVote.length; i++) { if (setUserVote[i].split(":")[0].equals(userVote)) { pos = i; break; } } String[] posHaveVoted = (setUserVote[pos].substring(setUserVote[pos].indexOf(":"))).split(":"); setUserVote[pos] = setUserVote[pos].substring(0, setUserVote[pos].indexOf(":")); for (String posVoted : posHaveVoted) { if (Utils.isEmpty(posVoted)) { doubleVote[Integer.parseInt(posVoted)] -= 1; totalVote -= 1; } } i = 0; for (String option : poll.getOption()) { if (listValue.contains(option)) { doubleVote[i] += 1; totalVote += 1; setUserVote[pos] += ":" + i; } i++; } i = 0; for (double dv : doubleVote) { if (totalVote > 0) votes[i] = ((dv / totalVote) * 100) + ""; else votes[i] = "0"; i++; } // save votes: poll.setUserVote(setUserVote); poll.setVote(votes); } return poll; } private boolean isGuestPermission(Poll poll_) throws Exception { if (poll_.getIsClosed()) return true; if (poll_.getTimeOut() > 0) { Date today = Utils.getGreenwichMeanTime().getTime(); if ((today.getTime() - poll_.getCreatedDate().getTime()) >= poll_.getTimeOut() * 86400000) return true; } String username = getUserId(); if (Utils.isEmpty(username)) return true; String[] userVotes = poll_.getUserVote(); for (String string : userVotes) { string = string.substring(0, string.indexOf(":")); if (string.equalsIgnoreCase(username)) return true; } return false; } private boolean hasGroupAdminOfGatein() { try { UserACL userACL = (UserACL) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(UserACL.class); List<String> list = new ArrayList<String>(); Identity identity = ConversationState.getCurrent().getIdentity(); list.add(identity.getUserId()); list.addAll(identity.getGroups()); // for (MembershipEntry membership : identity.getMemberships()) {} // userACL.getAdminMSType(); for (String str : list) { if (str.equals(userACL.getSuperUser()) || str.equals(userACL.getAdminGroups())) return true; } } catch (Exception e) { log.debug("Failed to check has group admin of gatein.", e); } return false; } private String getUserId() { String username = ""; try { username = ConversationState.getCurrent().getIdentity().getUserId(); } catch (Exception e) { } return username; } private List<String> getAllGroupAndMembershipOfUser() { List<String> listOfUser = new ArrayList<String>(); try { Identity identity = ConversationState.getCurrent().getIdentity(); listOfUser.add(identity.getUserId()); Set<String> list = new HashSet<String>(); list.addAll(identity.getGroups()); for (MembershipEntry membership : identity.getMemberships()) { String value = membership.getGroup(); list.add(value); // its groups value = membership.getMembershipType() + ":" + value; list.add(value); } listOfUser.addAll(list); } catch (Exception e) { log.warn("Failed to add all info of user."); } return listOfUser; } private List<String> getGroupsOfUser() { try { return new ArrayList<String>(ConversationState.getCurrent().getIdentity().getGroups()); } catch (Exception e) { log.warn("Failed to add group of user."); return new ArrayList<String>(); } } }