02/02: vote counting service
This is an automated email from the git hooks/post-receive script. unknown user pushed a commit to branch devel in repository Pollen. commit c6b78dfab0a087655078779d102d8b64661b3586 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu May 22 13:24:31 2014 +0200 vote counting service --- pollen-rest-api/pom.xml | 5 + .../rest/api/PollenRestApiApplicationContext.java | 15 ++ .../chorem/pollen/rest/api/v1/VoteCountingApi.java | 14 +- .../pollen/rest/api/AbstractPollenRestApiTest.java | 3 +- pollen-services/pom.xml | 11 ++ .../services/DefaultPollenServiceContext.java | 12 ++ .../pollen/services/PollenApplicationContext.java | 3 + .../pollen/services/PollenServiceContext.java | 3 + .../pollen/services/bean/PollResultBean.java | 38 ---- .../org/chorem/pollen/services/bean/VoteBean.java | 39 ++++ .../services/service/VoteCountingService.java | 205 ++++++++++++++++++++- .../pollen/services/service/VoteService.java | 33 +++- .../pollen/services/service/VoterListService.java | 15 +- .../services/service/security/PermissionVerb.java | 2 + .../test/FakePollenApplicationContext.java | 17 +- .../services/test/FakePollenServiceContext.java | 6 +- .../services/service/VoteCountingServiceTest.java | 126 +++++++++++++ 17 files changed, 493 insertions(+), 54 deletions(-) diff --git a/pollen-rest-api/pom.xml b/pollen-rest-api/pom.xml index 4680c26..8e0c599 100644 --- a/pollen-rest-api/pom.xml +++ b/pollen-rest-api/pom.xml @@ -21,6 +21,11 @@ <dependency> <groupId>${project.groupId}</groupId> + <artifactId>pollen-votecounting-api</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> <artifactId>pollen-persistence</artifactId> <version>${project.version}</version> </dependency> diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationContext.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationContext.java index 0ffb9c3..bd2a0a7 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationContext.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationContext.java @@ -44,6 +44,7 @@ import org.chorem.pollen.services.service.PollenUserService; import org.chorem.pollen.services.service.security.DefaultPollenSecurityContext; import org.chorem.pollen.services.service.security.PollenSecurityContext; import org.chorem.pollen.services.service.security.PollenSecurityRealm; +import org.chorem.pollen.votecounting.VoteCountingFactory; import org.nuiton.i18n.I18n; import org.nuiton.i18n.init.DefaultI18nInitializer; import org.nuiton.i18n.init.I18nInitializer; @@ -108,6 +109,8 @@ public class PollenRestApiApplicationContext implements PollenApplicationContext protected PollenServiceConfig applicationConfig; + protected VoteCountingFactory voteCountingFactory; + protected PollenRestApiApplicationContext(PollenServiceConfig applicationConfig, PollenTopiaApplicationContext topiaApplicationContext) { Preconditions.checkNotNull(applicationConfig, "Configuration can not be null!"); @@ -130,6 +133,17 @@ public class PollenRestApiApplicationContext implements PollenApplicationContext } @Override + public VoteCountingFactory getVoteCountingFactory() { + + if (voteCountingFactory == null) { + voteCountingFactory = new VoteCountingFactory(); + } + + return voteCountingFactory; + + } + + @Override public PollenTopiaPersistenceContext newPersistenceContext() { PollenTopiaPersistenceContext persistenceContext = topiaApplicationContext.newPersistenceContext(); @@ -144,6 +158,7 @@ public class PollenRestApiApplicationContext implements PollenApplicationContext newServiceContext.setPollenServiceConfig(applicationConfig); newServiceContext.setTopiaApplicationContext(topiaApplicationContext); newServiceContext.setPersistenceContext(persistenceContext); + newServiceContext.setVoteCountingFactory(getVoteCountingFactory()); newServiceContext.setLocale(locale); return newServiceContext; diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoteCountingApi.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoteCountingApi.java index cd95fbc..2db98ed 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoteCountingApi.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoteCountingApi.java @@ -23,8 +23,9 @@ package org.chorem.pollen.rest.api.v1; * #L% */ -import org.chorem.pollen.services.bean.PollResultBean; import org.chorem.pollen.services.service.VoteCountingService; +import org.chorem.pollen.votecounting.model.GroupVoteCountingResult; +import org.chorem.pollen.votecounting.model.VoteCountingResult; import org.debux.webmotion.server.WebMotionController; /** @@ -35,9 +36,16 @@ import org.debux.webmotion.server.WebMotionController; */ public class VoteCountingApi extends WebMotionController { - public PollResultBean getResult(VoteCountingService voteCountingService, String pollId) { + public VoteCountingResult getMainResult(VoteCountingService voteCountingService, String pollId) { - PollResultBean result = voteCountingService.getResult(pollId); + VoteCountingResult result = voteCountingService.getMainResult(pollId); + return result; + + } + + public GroupVoteCountingResult getGroupResult(VoteCountingService voteCountingService, String pollId) { + + GroupVoteCountingResult result = voteCountingService.getGroupResult(pollId); return result; } diff --git a/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/AbstractPollenRestApiTest.java b/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/AbstractPollenRestApiTest.java index 1715191..7fafbbe 100644 --- a/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/AbstractPollenRestApiTest.java +++ b/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/AbstractPollenRestApiTest.java @@ -93,7 +93,8 @@ public class AbstractPollenRestApiTest extends WebMotionTest { Locale.FRANCE, application.getApplicationConfig(), application.getTopiaApplicationContext(), - application.newPersistenceContext()); + application.newPersistenceContext(), + application.getVoteCountingFactory()); return serviceContext; } diff --git a/pollen-services/pom.xml b/pollen-services/pom.xml index 8f5dfdf..668add6 100644 --- a/pollen-services/pom.xml +++ b/pollen-services/pom.xml @@ -18,6 +18,17 @@ <dependency> <groupId>${project.groupId}</groupId> + <artifactId>pollen-votecounting-api</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>pollen-votecounting-aggregator</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> <artifactId>pollen-persistence</artifactId> <version>${project.version}</version> </dependency> diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/DefaultPollenServiceContext.java b/pollen-services/src/main/java/org/chorem/pollen/services/DefaultPollenServiceContext.java index 245a356..08eef5d 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/DefaultPollenServiceContext.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/DefaultPollenServiceContext.java @@ -37,6 +37,7 @@ import org.chorem.pollen.persistence.PollenPersistenceContext; import org.chorem.pollen.persistence.PollenTopiaApplicationContext; import org.chorem.pollen.services.config.PollenServiceConfig; import org.chorem.pollen.services.service.security.PollenSecurityContext; +import org.chorem.pollen.votecounting.VoteCountingFactory; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -61,6 +62,8 @@ public class DefaultPollenServiceContext implements PollenServiceContext { */ protected DefaultHashService hashService; + protected VoteCountingFactory voteCountingFactory; + public void setPollenServiceConfig(PollenServiceConfig pollenServiceConfig) { this.pollenServiceConfig = pollenServiceConfig; } @@ -154,6 +157,15 @@ public class DefaultPollenServiceContext implements PollenServiceContext { } @Override + public VoteCountingFactory getVoteCountingFactory() { + return voteCountingFactory; + } + + public void setVoteCountingFactory(VoteCountingFactory voteCountingFactory) { + this.voteCountingFactory = voteCountingFactory; + } + + @Override public PollenPersistenceContext getPersistenceContext() { return persistenceContext; } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/PollenApplicationContext.java b/pollen-services/src/main/java/org/chorem/pollen/services/PollenApplicationContext.java index 514c601..ec5d09f 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/PollenApplicationContext.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/PollenApplicationContext.java @@ -28,6 +28,7 @@ import org.chorem.pollen.persistence.entity.PollenPrincipal; import org.chorem.pollen.persistence.entity.SessionToken; import org.chorem.pollen.services.config.PollenServiceConfig; import org.chorem.pollen.services.service.security.PollenSecurityContext; +import org.chorem.pollen.votecounting.VoteCountingFactory; import java.io.Closeable; import java.util.Locale; @@ -44,6 +45,8 @@ public interface PollenApplicationContext extends Closeable { PollenServiceConfig getApplicationConfig(); + VoteCountingFactory getVoteCountingFactory(); + PollenTopiaPersistenceContext newPersistenceContext(); PollenServiceContext newServiceContext(PollenPersistenceContext persistenceContext, Locale locale); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceContext.java b/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceContext.java index 7d95782..ac196b4 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceContext.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceContext.java @@ -27,6 +27,7 @@ import org.chorem.pollen.persistence.PollenPersistenceContext; import org.chorem.pollen.persistence.PollenTopiaApplicationContext; import org.chorem.pollen.services.config.PollenServiceConfig; import org.chorem.pollen.services.service.security.PollenSecurityContext; +import org.chorem.pollen.votecounting.VoteCountingFactory; import java.util.Date; import java.util.Locale; @@ -62,4 +63,6 @@ public interface PollenServiceContext { String generateSalt(); String encodePassword(String salt, String password); + + VoteCountingFactory getVoteCountingFactory(); } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollResultBean.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollResultBean.java deleted file mode 100644 index 7f854bd..0000000 --- a/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollResultBean.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.chorem.pollen.services.bean; - -/* - * #%L - * Pollen :: Service - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2013 CodeLutin - * %% - * 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 Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import java.io.Serializable; - -/** - * TODO - * - * @author tchemit <chemit@codelutin.com> - * @since 2.0 - */ -public class PollResultBean implements Serializable { - - private static final long serialVersionUID = 1L; - -} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoteBean.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoteBean.java index ff99433..6cf20cd 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoteBean.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoteBean.java @@ -1,11 +1,14 @@ package org.chorem.pollen.services.bean; +import org.apache.commons.lang3.StringUtils; import org.chorem.pollen.persistence.entity.PollenPrincipal; import org.chorem.pollen.persistence.entity.PollenPrincipalImpl; import org.chorem.pollen.persistence.entity.Vote; import org.chorem.pollen.persistence.entity.VoteImpl; import org.chorem.pollen.persistence.entity.VoteToChoice; import org.chorem.pollen.persistence.entity.VoteToChoices; +import org.chorem.pollen.persistence.entity.VoterListMember; +import org.chorem.pollen.persistence.entity.VoterListMemberImpl; import java.util.ArrayList; import java.util.LinkedHashSet; @@ -24,12 +27,16 @@ public class VoteBean extends PollenBean<Vote> { protected String voterId; + protected String voterListMemberId; + protected String voterName; protected String permission; protected Boolean anonymous; + protected double weight; + protected Set<VoteToChoiceBean> choice = new LinkedHashSet<>(); @Override @@ -50,6 +57,7 @@ public class VoteBean extends PollenBean<Vote> { setAnonymous(vote.isAnonymous()); setVoterId(vote.getVoter().getTopiaId()); setVoterName(vote.getVoter().getName()); + setWeight(vote.getWeight()); List<VoteToChoice> voteToChoices = new ArrayList<>(vote.getVoteToChoice()); VoteToChoices.sortByChoiceOrder(voteToChoices); @@ -62,6 +70,12 @@ public class VoteBean extends PollenBean<Vote> { } + if (vote.getVoterListMember() != null) { + + setVoterListMemberId(vote.getVoterListMember().getTopiaId()); + + } + } @Override @@ -71,6 +85,7 @@ public class VoteBean extends PollenBean<Vote> { entity.setTopiaId(getId()); entity.setAnonymous(getAnonymous() != null && getAnonymous()); + entity.setWeight(getWeight()); PollenPrincipal voter = new PollenPrincipalImpl(); entity.setVoter(voter); @@ -84,6 +99,14 @@ public class VoteBean extends PollenBean<Vote> { } + if (StringUtils.isNotBlank(voterListMemberId)) { + + // FIXME + VoterListMember member = new VoterListMemberImpl(); + member.setTopiaId(voterListMemberId); + + } + return entity; } @@ -131,4 +154,20 @@ public class VoteBean extends PollenBean<Vote> { public boolean isAnonymous() { return anonymous != null && anonymous; } + + public String getVoterListMemberId() { + return voterListMemberId; + } + + public void setVoterListMemberId(String voterListMemberId) { + this.voterListMemberId = voterListMemberId; + } + + public double getWeight() { + return weight; + } + + public void setWeight(double weight) { + this.weight = weight; + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteCountingService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteCountingService.java index 0921474..cd3a08d 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteCountingService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteCountingService.java @@ -23,9 +23,29 @@ package org.chorem.pollen.services.service; * #L% */ +import com.google.common.base.Function; import com.google.common.base.Preconditions; +import com.google.common.collect.Maps; import org.chorem.pollen.persistence.entity.Poll; -import org.chorem.pollen.services.bean.PollResultBean; +import org.chorem.pollen.persistence.entity.Polls; +import org.chorem.pollen.persistence.entity.Vote; +import org.chorem.pollen.persistence.entity.VoteToChoice; +import org.chorem.pollen.persistence.entity.VoterList; +import org.chorem.pollen.persistence.entity.VoterListMember; +import org.chorem.pollen.votecounting.VoteCounting; +import org.chorem.pollen.votecounting.VoteCountingFactory; +import org.chorem.pollen.votecounting.VoteCountingStrategy; +import org.chorem.pollen.votecounting.model.GroupOfVoter; +import org.chorem.pollen.votecounting.model.GroupOfVoterBuilder; +import org.chorem.pollen.votecounting.model.GroupVoteCountingResult; +import org.chorem.pollen.votecounting.model.SimpleVoterBuilder; +import org.chorem.pollen.votecounting.model.VoteCountingResult; +import org.chorem.pollen.votecounting.model.Voter; +import org.chorem.pollen.votecounting.model.VoterBuilder; + +import java.util.List; +import java.util.Map; +import java.util.Set; /** * TODO @@ -35,10 +55,187 @@ import org.chorem.pollen.services.bean.PollResultBean; */ public class VoteCountingService extends PollenServiceSupport { - public PollResultBean getResult(String pollId) { + public VoteCountingResult getMainResult(String pollId) { + Preconditions.checkNotNull(pollId); + + Poll poll = getPollService().getPoll0(pollId); - //TODO - return null; + + VoteCountingResult mainResult; + + if (Polls.isPollGroup(poll)) { + + GroupVoteCountingResult groupResult = getGroupResult(pollId); + mainResult = groupResult.getMainResult(); + + } else { + mainResult = getSimpleResult(pollId); + + } + + return mainResult; + } + + public VoteCountingResult getSimpleResult(String pollId) { + + Preconditions.checkNotNull(pollId); + + Poll poll = getPollService().getPoll0(pollId); + List<Vote> votes = getVoteService().getVotes0(poll); + + VoteCounting voteCounting = getVoteCounting(poll); + VoteCountingStrategy strategy = voteCounting.newStrategy(); + + GroupOfVoter groupOfVoter = toSimpleVotersGroup(votes); + + GroupVoteCountingResult result = strategy.votecount(groupOfVoter); + + VoteCountingResult mainResult = result.getMainResult(); + return mainResult; + + } + + public GroupVoteCountingResult getGroupResult(String pollId) { + + Preconditions.checkNotNull(pollId); + + Poll poll = getPollService().getPoll0(pollId); + List<VoterList> voterLists = getVoterListService().getVoterLists0(poll); + List<Vote> votes = getVoteService().getVotes0(poll); + + VoteCounting voteCounting = getVoteCounting(poll); + VoteCountingStrategy strategy = voteCounting.newStrategy(); + + // Create a groupVoter including of the root voters + GroupOfVoter group = toGroupOfVoters(poll, voterLists, votes); + + GroupVoteCountingResult result = strategy.votecount(group); + return result; + + } + + + /** + * Collect all vote for all voters of the givne poll. + * <p/> + * The result (a set of simple voters) are stored in a fictiv group of voter. + * <p/> + * <strong>Note:</strong> Even if the poll is a group type, then no of his + * group are used (just collect simple voters with no group linkage). + * + * @param votes votes to scan + * @return the aggregate group of voter containing simple voters with + * their votes. + */ + protected GroupOfVoter toSimpleVotersGroup(List<Vote> votes) { + + Preconditions.checkNotNull(votes); + + SimpleVoterBuilder builder = new SimpleVoterBuilder(); + + for (Vote vote : votes) { + + fillSimpleVoter(builder, vote); + + } + + Set<Voter> voter = builder.getVoters(); + + GroupOfVoter result = GroupOfVoter.newVoter(null, 1.0, voter); + return result; + + } + + /** + * Build the group of voter of the poll, using his group to build sub + * group of the poll. + * <p/> + * <strong>Note:</strong> This method can only be used for a group poll. + * + * @param poll the poll to scan + * @param voterLists voterLists to scan + * @param votes votes to scan + * @return the aggregate group of group of voters with their votes + */ + protected GroupOfVoter toGroupOfVoters(Poll poll, List<VoterList> voterLists, List<Vote> votes) { + + Preconditions.checkNotNull(poll); + Preconditions.checkNotNull(voterLists); + Preconditions.checkNotNull(votes); + Preconditions.checkArgument(Polls.isPollGroup(poll), + "Can only use this method for a group poll"); + + GroupOfVoterBuilder builder = new GroupOfVoterBuilder(); + + // create group of voter + Map<VoterListMember, Vote> voteByVoterListMember = Maps.uniqueIndex( + votes, + new Function<Vote, VoterListMember>() { + @Override + public VoterListMember apply(Vote input) { + return input.getVoterListMember(); + } + } + ); + + for (VoterList voterList : voterLists) { + + builder.newGroupVoter(voterList.getTopiaId(), + voterList.getWeight()); + + for (VoterListMember voterListMember : voterList.getMember()) { + + Vote vote = voteByVoterListMember.get(voterListMember); + + if (vote != null) { + + fillSimpleVoter(builder, vote); + + } + + } + + } + + Set<Voter> voter = builder.getVoters(); + + GroupOfVoter result = GroupOfVoter.newVoter(null, 1.0, voter); + return result; + + } + + protected void fillSimpleVoter(VoterBuilder builder, Vote vote) { + + builder.newVoter(vote.getVoter().getTopiaId(), vote.getWeight()); + + if (!vote.isVoteToChoiceEmpty()) { + + for (VoteToChoice voteToChoice : vote.getVoteToChoice()) { + + builder.addVoteForChoice( + voteToChoice.getChoice().getTopiaId(), + voteToChoice.getVoteValue()); + + } + + } + + } + + protected VoteCounting getVoteCounting(Poll poll) { + + int id = poll.getVoteCountingType(); + + VoteCountingFactory voteCountingFactory = serviceContext.getVoteCountingFactory(); + VoteCounting result = voteCountingFactory.getVoteCounting(id); + + Preconditions.checkNotNull( + result, "Could not find vote counting for id " + id); + + return result; + + } + } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java index d75da00..129cc61 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java @@ -23,6 +23,7 @@ package org.chorem.pollen.services.service; * #L% */ +import org.apache.commons.lang3.StringUtils; import org.chorem.pollen.persistence.entity.Choice; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollenPrincipal; @@ -53,7 +54,7 @@ public class VoteService extends PollenServiceSupport { checkNotNull(pollId); Poll poll = getPollService().getPoll0(pollId); - List<Vote> votes = getVoteDao().findAll(poll); + List<Vote> votes = getVotes0(poll); List<VoteBean> voteBeans = copyAsList(VoteBean.class, votes); for (VoteBean voteBean : voteBeans) { @@ -191,6 +192,29 @@ public class VoteService extends PollenServiceSupport { // toSave.setText(vote.getText()); // + // -- weight -- // + + if (!voteExist) { + + double weight; + + if (StringUtils.isBlank(vote.getVoterListMemberId())) { + + // not link to a member, use default value + + weight = 1d; + + } else { + + //FIXME Get member and his weight + weight = 1d; + + } + + toSave.setWeight(weight); + + } + // -- author -- // toSave.getVoter().setName(vote.getVoterName()); @@ -231,6 +255,13 @@ public class VoteService extends PollenServiceSupport { } + protected List<Vote> getVotes0(Poll poll) { + + List<Vote> votes = getVoteDao().findAll(poll); + return votes; + + } + protected VoteToChoice getVoteToChoice(Vote vote, String voteToChoiceId) { VoteToChoice result = getVoteToChoiceDao().findByTopiaId(voteToChoiceId); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java index d34d307..dd6ceb9 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java @@ -88,7 +88,7 @@ public class VoterListService extends PollenServiceSupport { checkNotNull(pollId); Poll poll = getPollService().getPoll0(pollId); - List<VoterList> voterLists = getVoterListDao().forPollEquals(poll).findAll(); + List<VoterList> voterLists = getVoterLists0(poll); List<VoterListBean> voterListBeans = copyAsList(VoterListBean.class, voterLists); return voterListBeans; @@ -113,7 +113,7 @@ public class VoterListService extends PollenServiceSupport { Poll poll = getPollService().getPoll0(pollId); - List<VoterList> existingVoterLists = getVoterListDao().forPollEquals(poll).findAll(); + List<VoterList> existingVoterLists = getVoterLists0(poll); ErrorMap errorMap = checkVoterList(existingVoterLists, voterList); errorMap.failIfNotEmpty(); @@ -137,7 +137,7 @@ public class VoterListService extends PollenServiceSupport { Poll poll = getPollService().getPoll0(pollId); - List<VoterList> existingVoterLists = getVoterListDao().forPollEquals(poll).findAll(); + List<VoterList> existingVoterLists = getVoterLists0(poll); ErrorMap errorMap = checkVoterList(existingVoterLists, voterList); errorMap.failIfNotEmpty(); @@ -213,7 +213,6 @@ public class VoterListService extends PollenServiceSupport { } - public VoterListMemberBean editVoterListMember(String pollId, String voterListId, VoterListMemberBean member) throws InvalidFormException { checkNotNull(pollId); @@ -236,6 +235,7 @@ public class VoterListService extends PollenServiceSupport { } + public void deleteVoterListMember(String pollId, String voterListId, String memberId) { checkNotNull(pollId); @@ -250,6 +250,13 @@ public class VoterListService extends PollenServiceSupport { } + protected List<VoterList> getVoterLists0(Poll poll) { + + List<VoterList> voterLists = getVoterListDao().forPollEquals(poll).findAll(); + return voterLists; + + } + protected VoterList getVoterList(Poll poll, String voterListId) { VoterList result = getVoterListDao().findByTopiaId(voterListId); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PermissionVerb.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PermissionVerb.java index 7bf249c..b16f99b 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PermissionVerb.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PermissionVerb.java @@ -30,10 +30,12 @@ package org.chorem.pollen.services.service.security; * @since 2.0 */ public enum PermissionVerb { + readPoll, readChoice, readComment, readVote, + readPollResult, addPoll, addChoice, diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/test/FakePollenApplicationContext.java b/pollen-services/src/main/java/org/chorem/pollen/services/test/FakePollenApplicationContext.java index 17f9fd4..eba5700 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/test/FakePollenApplicationContext.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/test/FakePollenApplicationContext.java @@ -39,6 +39,7 @@ import org.chorem.pollen.services.config.PollenServiceConfig; import org.chorem.pollen.services.config.PollenServiceConfigOption; import org.chorem.pollen.services.service.FixturesService; import org.chorem.pollen.services.service.security.PollenSecurityRealm; +import org.chorem.pollen.votecounting.VoteCountingFactory; import org.junit.rules.TestWatcher; import org.junit.runner.Description; import org.nuiton.topia.junit.ConfigurationHelper; @@ -75,6 +76,8 @@ public class FakePollenApplicationContext extends TestWatcher implements PollenA protected PollenFixtures fixtures; + protected VoteCountingFactory voteCountingFactory; + protected String methodName; protected int currentPortNumber; @@ -178,6 +181,17 @@ public class FakePollenApplicationContext extends TestWatcher implements PollenA } @Override + public VoteCountingFactory getVoteCountingFactory() { + + if (voteCountingFactory == null) { + voteCountingFactory = new VoteCountingFactory(); + } + + return voteCountingFactory; + + } + + @Override public PollenTopiaPersistenceContext newPersistenceContext() { PollenTopiaPersistenceContext persistenceContext; @@ -202,7 +216,8 @@ public class FakePollenApplicationContext extends TestWatcher implements PollenA Locale.FRANCE, getApplicationConfig(), getTopiaApplicationContext(), - newPersistenceContext()); + newPersistenceContext(), + getVoteCountingFactory()); return serviceContext; } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/test/FakePollenServiceContext.java b/pollen-services/src/main/java/org/chorem/pollen/services/test/FakePollenServiceContext.java index f0609d2..e4876b0 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/test/FakePollenServiceContext.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/test/FakePollenServiceContext.java @@ -30,7 +30,7 @@ import org.chorem.pollen.persistence.PollenTopiaApplicationContext; import org.chorem.pollen.persistence.PollenTopiaPersistenceContext; import org.chorem.pollen.services.DefaultPollenServiceContext; import org.chorem.pollen.services.config.PollenServiceConfig; -import org.chorem.pollen.services.service.security.PollenSecurityContext; +import org.chorem.pollen.votecounting.VoteCountingFactory; import java.util.Date; import java.util.Locale; @@ -47,11 +47,13 @@ public class FakePollenServiceContext extends DefaultPollenServiceContext { Locale locale, PollenServiceConfig serviceConfig, PollenTopiaApplicationContext applicationcontext, - PollenTopiaPersistenceContext persistenceContext) { + PollenTopiaPersistenceContext persistenceContext, + VoteCountingFactory voteCountingFactory) { FakePollenServiceContext serviceContext = new FakePollenServiceContext(); serviceContext.setPersistenceContext(persistenceContext); serviceContext.setPollenServiceConfig(serviceConfig); serviceContext.setTopiaApplicationContext(applicationcontext); + serviceContext.setVoteCountingFactory(voteCountingFactory); serviceContext.setSecurityContext(new FakePollenSecurityContext()); serviceContext.setLocale(locale); serviceContext.setDate(now); diff --git a/pollen-services/src/test/java/org/chorem/pollen/services/service/VoteCountingServiceTest.java b/pollen-services/src/test/java/org/chorem/pollen/services/service/VoteCountingServiceTest.java new file mode 100644 index 0000000..15c8554 --- /dev/null +++ b/pollen-services/src/test/java/org/chorem/pollen/services/service/VoteCountingServiceTest.java @@ -0,0 +1,126 @@ +package org.chorem.pollen.services.service; + +import org.apache.commons.lang3.time.DateUtils; +import org.chorem.pollen.persistence.entity.ChoiceType; +import org.chorem.pollen.persistence.entity.PollType; +import org.chorem.pollen.services.AbstractPollenServiceTest; +import org.chorem.pollen.services.bean.ChoiceBean; +import org.chorem.pollen.services.bean.CreateBeanRef; +import org.chorem.pollen.services.bean.PollBean; +import org.chorem.pollen.services.bean.VoteBean; +import org.chorem.pollen.services.bean.VoteToChoiceBean; +import org.chorem.pollen.votecounting.model.ChoiceScore; +import org.chorem.pollen.votecounting.model.VoteCountingResult; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.math.BigDecimal; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * Created on 5/22/14. + * + * @author Tony Chemit <chemit@codelutin.com> + * @since 2.0 + */ +public class VoteCountingServiceTest extends AbstractPollenServiceTest { + + private PollService pollService; + + private ChoiceService choiceService; + + private VoteService voteService; + + private VoteCountingService service; + + @Before + public void setUp() throws ParseException { + + loadFixtures("fixtures"); + + pollService = newService(PollService.class); + voteService = newService(VoteService.class); + choiceService = newService(ChoiceService.class); + service = newService(VoteCountingService.class); + + getServiceContext().setDate(new Date(1363948427576l)); + + } + + @Test + public void simplePoll() throws InvalidFormException { + + PollBean poll = pollService.getNewPoll(); + + poll.setBeginDate(DateUtils.addMinutes(serviceContext.getNow(), -1)); + poll.setTitle("poll1"); + + List<ChoiceBean> choices = new ArrayList<>(); + + ChoiceBean choice1 = new ChoiceBean(); + choices.add(choice1); + choice1.setChoiceType(ChoiceType.TEXT); + choice1.setName("A"); + choice1.setDescription("Choice A"); + + + ChoiceBean choice2 = new ChoiceBean(); + choice2.setChoiceType(ChoiceType.TEXT); + choice2.setName("B"); + choice2.setDescription("Choice B"); + choices.add(choice2); + + CreateBeanRef createdPollRef = pollService.createPoll(poll, choices, null); + + String pollId = createdPollRef.getId(); + + List<ChoiceBean> createdChoices = choiceService.getChoices(pollId); + ChoiceBean createdChoiceBean1 = createdChoices.get(0); + ChoiceBean createdChoiceBean2 = createdChoices.get(1); + + // vote 1 (A = 1) + VoteBean vote1 = new VoteBean(); + vote1.setVoterName("voter1"); + VoteToChoiceBean vote1Choice1 = new VoteToChoiceBean(); + + vote1Choice1.setChoiceId(createdChoiceBean1.getId()); + vote1Choice1.setVoteValue(1d); + vote1.addChoice(vote1Choice1); + voteService.addVote(pollId, vote1); + + // vote 2 (B = 1) + VoteBean vote2 = new VoteBean(); + vote2.setVoterName("voter2"); + VoteToChoiceBean vote2Choice2 = new VoteToChoiceBean(); + vote2Choice2.setChoiceId(createdChoiceBean2.getId()); + vote2Choice2.setVoteValue(1d); + vote2.addChoice(vote2Choice2); + voteService.addVote(pollId, vote2); + + // vote 3 (A = 1) + VoteBean vote3 = new VoteBean(); + vote3.setVoterName("voter3"); + VoteToChoiceBean vote3Choice1 = new VoteToChoiceBean(); + vote3Choice1.setChoiceId(createdChoiceBean1.getId()); + vote3Choice1.setVoteValue(1d); + vote3.addChoice(vote3Choice1); + voteService.addVote(pollId, vote3); + + VoteCountingResult mainResult = service.getMainResult(pollId); + Assert.assertNotNull(mainResult); + Assert.assertNotNull(mainResult.getScores()); + Assert.assertEquals(2, mainResult.getScores().size()); + Assert.assertNotNull(mainResult.getTopRanking()); + Assert.assertEquals(1, mainResult.getTopRanking().size()); + + ChoiceScore choiceScore = mainResult.getTopRanking().get(0); + Assert.assertEquals(createdChoiceBean1.getId(), choiceScore.getChoiceId()); + Assert.assertEquals(2, choiceScore.getScoreValue().intValue()); + + } + +} -- To stop receiving notification emails like this one, please contact Chorem.org SCM administrator <admin+scm@chorem.org>.
participants (1)
-
Chorem.org scm