This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit eb9f117c10c875b5148e642b9261c20a35bf24da Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri Apr 21 11:57:14 2017 +0200 Services : modification des liste de votants, le context d'UI dans le header de la requête et le context de service --- .../chorem/pollen/persistence/entity/Polls.java | 4 - .../persistence/entity/VoterListTopiaDao.java | 3 + pollen-persistence/src/main/xmi/pollen.zargo | Bin 23829 -> 23790 bytes .../rest/api/PollenRestApiRequestContext.java | 5 + .../rest/api/PollenRestApiRequestFilter.java | 16 + .../org/chorem/pollen/rest/api/v1/PollApi.java | 16 +- .../chorem/pollen/rest/api/v1/VoterListApi.java | 55 +- pollen-rest-api/src/main/resources/mapping | 5 +- .../services/DefaultPollenServiceContext.java | 12 + .../pollen/services/PollenServiceContext.java | 4 + .../org/chorem/pollen/services/bean/PollBean.java | 4 - .../chorem/pollen/services/bean/VoterListBean.java | 13 + .../pollen/services/bean/VoterListMemberBean.java | 15 + .../pollen/services/service/FixturesService.java | 5 +- .../services/service/NotificationService.java | 26 +- .../pollen/services/service/PollService.java | 67 +-- .../services/service/PollenServiceSupport.java | 7 + .../services/service/VoteCountingService.java | 18 +- .../pollen/services/service/VoterListService.java | 644 ++++++++++++--------- .../pollen/services/service/mail/EmailService.java | 14 +- .../pollen/services/service/PollServiceTest.java | 13 +- .../services/service/VoteCountingServiceTest.java | 3 +- .../services/service/VoterListServiceTest.java | 137 +++-- pollen-ui-riot-js/src/main/web/js/FetchService.js | 1 + 24 files changed, 626 insertions(+), 461 deletions(-) diff --git a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/Polls.java b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/Polls.java index dd907a9..0454272 100644 --- a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/Polls.java +++ b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/Polls.java @@ -40,10 +40,6 @@ public class Polls { return Objects.equals(PollType.RESTRICTED, poll.getPollType()); } - public static boolean isPollGroup(Poll poll) { - return Objects.equals(PollType.GROUP, poll.getPollType()); - } - public static boolean isStarted(Poll poll, Date currentDate) { Date beginDate = poll.getBeginDate(); return beginDate == null || beginDate.before(currentDate); diff --git a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/VoterListTopiaDao.java b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/VoterListTopiaDao.java index ce28529..24f9bc3 100644 --- a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/VoterListTopiaDao.java +++ b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/VoterListTopiaDao.java @@ -35,6 +35,9 @@ public class VoterListTopiaDao extends AbstractVoterListTopiaDao<VoterList> { List<VoterListMember> list = dao.forVoterListEquals(entity).findAll(); dao.deleteAll(list); + List<VoterList> children = forParentEquals(entity).findAll(); + deleteAll(children); + super.delete(entity); } diff --git a/pollen-persistence/src/main/xmi/pollen.zargo b/pollen-persistence/src/main/xmi/pollen.zargo index 8676954..8b3a4eb 100644 Binary files a/pollen-persistence/src/main/xmi/pollen.zargo and b/pollen-persistence/src/main/xmi/pollen.zargo differ diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestContext.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestContext.java index 824c011..65b9ce0 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestContext.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestContext.java @@ -22,6 +22,7 @@ package org.chorem.pollen.rest.api; */ import org.chorem.pollen.services.PollenServiceContext; +import org.chorem.pollen.services.PollenUIContext; import org.chorem.pollen.services.service.security.PollenSecurityContext; import org.chorem.pollen.services.service.security.SecurityService; import org.debux.webmotion.server.call.HttpContext; @@ -68,4 +69,8 @@ public class PollenRestApiRequestContext { public SecurityService getSecurityService() { return serviceContext.newService(SecurityService.class); } + + public void setUIContext(PollenUIContext uiContext) { + serviceContext.setUIContext(uiContext); + } } diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestFilter.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestFilter.java index 9393d19..83ce6fd 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestFilter.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestFilter.java @@ -21,6 +21,7 @@ package org.chorem.pollen.rest.api; * #L% */ +import org.apache.commons.beanutils.Converter; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -28,6 +29,7 @@ import org.chorem.pollen.persistence.PollenPersistenceContext; import org.chorem.pollen.persistence.entity.PollenPrincipal; import org.chorem.pollen.persistence.entity.SessionToken; import org.chorem.pollen.services.PollenServiceContext; +import org.chorem.pollen.services.PollenUIContext; import org.chorem.pollen.services.service.security.PollenCypherTechnicalException; import org.chorem.pollen.services.service.security.PollenInvalidSessionTokenException; import org.chorem.pollen.services.service.security.PollenSecurityContext; @@ -58,6 +60,7 @@ public class PollenRestApiRequestFilter extends WebMotionFilter { public static final String REQUEST_PERMISSION_PARAMETER = "permission"; public static final String REQUEST_HEADER_SESSION_TOKEN = "X-Pollen-Session-Token"; + public static final String REQUEST_HEADER_UI_CONTEXT = "X-Pollen-UI-context"; /** Logger. */ private static final Log log = LogFactory.getLog(PollenRestApiRequestFilter.class); @@ -119,12 +122,25 @@ public class PollenRestApiRequestFilter extends WebMotionFilter { PollenSecurityContext securityContext = createSecurityContext(context, applicationContext, requestContext); requestContext.setSecurityContext(securityContext); + PollenUIContext uiContext = extractUIContext(context); + requestContext.setUIContext(uiContext); + PollenRestApiRequestContext.setRequestContext(context, requestContext); return requestContext; } + private PollenUIContext extractUIContext(HttpContext context) { + String uiContextJson = context.getHeader(REQUEST_HEADER_UI_CONTEXT); + PollenUIContext uiContext = null; + if (uiContextJson != null) { + Converter converter = context.getServerContext().getConverter().lookup(PollenUIContext.class); + uiContext = converter.convert(PollenUIContext.class, uiContextJson); + } + return uiContext; + } + private PollenSecurityContext createSecurityContext(HttpContext context, PollenRestApiApplicationContext applicationContext, PollenRestApiRequestContext requestContext) throws PollenInvalidSessionTokenException, PollenCypherTechnicalException { diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java index 39a567f..a770f07 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java @@ -24,13 +24,14 @@ package org.chorem.pollen.rest.api.v1; import com.google.common.collect.Lists; import org.chorem.pollen.persistence.entity.ChoiceType; import org.chorem.pollen.persistence.entity.Poll; -import org.chorem.pollen.services.PollenUIContext; import org.chorem.pollen.services.bean.ChoiceBean; import org.chorem.pollen.services.bean.PaginationParameterBean; import org.chorem.pollen.services.bean.PaginationResultBean; import org.chorem.pollen.services.bean.PollBean; import org.chorem.pollen.services.bean.PollenEntityId; import org.chorem.pollen.services.bean.PollenEntityRef; +import org.chorem.pollen.services.bean.VoterListBean; +import org.chorem.pollen.services.bean.VoterListMemberBean; import org.chorem.pollen.services.service.InvalidFormException; import org.chorem.pollen.services.service.PollService; import org.debux.webmotion.server.WebMotionController; @@ -85,17 +86,18 @@ public class PollApi extends WebMotionController { public PollenEntityRef<Poll> createPoll(PollService pollService, PollBean poll, ChoiceBean[] choices, - PollenUIContext pollenUIContext) throws InvalidFormException { + List<VoterListBean> voterLists, + List<VoterListMemberBean> voterListMembers) throws InvalidFormException { List<ChoiceBean> choiceList = Lists.newArrayList(choices); - return pollService.createPoll(poll, choiceList, pollenUIContext); + return pollService.createPoll(poll, choiceList, voterLists, voterListMembers); } - public PollBean editPoll(PollService pollService, PollBean poll, PollenUIContext pollenUIContext) throws InvalidFormException { + public PollBean editPoll(PollService pollService, PollBean poll) throws InvalidFormException { - return pollService.editPoll(poll, pollenUIContext); + return pollService.editPoll(poll); } @@ -105,9 +107,9 @@ public class PollApi extends WebMotionController { } - public PollenEntityRef<Poll> clonePoll(PollService pollService, PollenEntityId<Poll> pollId, PollenUIContext pollenUIContext) { + public PollenEntityRef<Poll> clonePoll(PollService pollService, PollenEntityId<Poll> pollId) { - return pollService.clonePoll(pollId.getEntityId(), pollenUIContext); + return pollService.clonePoll(pollId.getEntityId()); } diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoterListApi.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoterListApi.java index 7d37ff9..cb2ef7c 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoterListApi.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoterListApi.java @@ -22,11 +22,9 @@ package org.chorem.pollen.rest.api.v1; */ import com.google.common.collect.Lists; -import org.chorem.pollen.persistence.entity.FavoriteList; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.VoterList; import org.chorem.pollen.persistence.entity.VoterListMember; -import org.chorem.pollen.services.PollenUIContext; import org.chorem.pollen.services.bean.PollenEntityId; import org.chorem.pollen.services.bean.PollenEntityRef; import org.chorem.pollen.services.bean.VoterListBean; @@ -37,6 +35,7 @@ import org.debux.webmotion.server.WebMotionController; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; /** * TODO @@ -46,21 +45,21 @@ import java.util.Set; */ public class VoterListApi extends WebMotionController { - public PollenEntityRef<VoterList> importFavoriteListNewGroup(VoterListService voterListService, PollenEntityId<Poll> pollId, PollenEntityId<FavoriteList> favoriteListId) { +// public PollenEntityRef<VoterList> importFavoriteListNewGroup(VoterListService voterListService, PollenEntityId<Poll> pollId, PollenEntityId<FavoriteList> favoriteListId) { +// +// return voterListService.importFavoriteList(pollId.getEntityId(), null, favoriteListId.getEntityId()); +// +// } +// +// public PollenEntityRef<VoterList> importFavoriteList(VoterListService voterListService, PollenEntityId<Poll> pollId, PollenEntityId<VoterList> voterListId, PollenEntityId<FavoriteList> favoriteListId) { +// +// return voterListService.importFavoriteList(pollId.getEntityId(), voterListId.getEntityId(), favoriteListId.getEntityId()); +// +// } - return voterListService.importFavoriteList(pollId.getEntityId(), null, favoriteListId.getEntityId()); + public List<VoterListBean> getVoterLists(VoterListService voterListService, PollenEntityId<Poll> pollId, PollenEntityId<VoterList> parentId) { - } - - public PollenEntityRef<VoterList> importFavoriteList(VoterListService voterListService, PollenEntityId<Poll> pollId, PollenEntityId<VoterList> voterListId, PollenEntityId<FavoriteList> favoriteListId) { - - return voterListService.importFavoriteList(pollId.getEntityId(), voterListId.getEntityId(), favoriteListId.getEntityId()); - - } - - public List<VoterListBean> getVoterLists(VoterListService voterListService, PollenEntityId<Poll> pollId) { - - return voterListService.getVoterLists(pollId.getEntityId()); + return voterListService.getVoterLists(pollId.getEntityId(), parentId.getEntityId()); } @@ -70,11 +69,11 @@ public class VoterListApi extends WebMotionController { } - public PollenEntityRef<VoterList> createVoterList(VoterListService voterListService, PollenEntityId<Poll> pollId, VoterListBean voterList, PollenUIContext pollenUIContext, VoterListMemberBean... members) throws InvalidFormException { + public PollenEntityRef<VoterList> createVoterList(VoterListService voterListService, PollenEntityId<Poll> pollId, VoterListBean voterList, VoterListMemberBean... members) throws InvalidFormException { List<VoterListMemberBean> memberList = Lists.newArrayList(members); - return voterListService.addVoterList(pollId.getEntityId(), voterList, memberList, pollenUIContext); + return voterListService.addVoterList(pollId.getEntityId(), voterList, memberList); } @@ -102,22 +101,34 @@ public class VoterListApi extends WebMotionController { } - public VoterListMemberBean addMember(VoterListService voterListService, PollenEntityId<Poll> pollId, PollenEntityId<VoterList> voterListId, VoterListMemberBean member, PollenUIContext uiContext) throws InvalidFormException { + public VoterListMemberBean addMember(VoterListService voterListService, PollenEntityId<Poll> pollId, VoterListMemberBean member) throws InvalidFormException { - return voterListService.addVoterListMember(pollId.getEntityId(), voterListId.getEntityId(), member, uiContext); + return voterListService.addVoterListMember(pollId.getEntityId(), member); } - public VoterListMemberBean editMember(VoterListService voterListService, PollenEntityId<Poll> pollId, PollenEntityId<VoterList> voterListId, VoterListMemberBean member) throws InvalidFormException { + public VoterListMemberBean editMember(VoterListService voterListService, PollenEntityId<Poll> pollId, VoterListMemberBean member) throws InvalidFormException { - return voterListService.editVoterListMember(pollId.getEntityId(), voterListId.getEntityId(), member); + return voterListService.editVoterListMember(pollId.getEntityId(), member); } - public void deleteMember(VoterListService voterListService, PollenEntityId<Poll> pollId, PollenEntityId<VoterList> voterListId, PollenEntityId<VoterListMember> memberId) { + public void deleteMember(VoterListService voterListService, PollenEntityId<Poll> pollId, PollenEntityId<VoterList> voterListId, PollenEntityId<VoterListMember> memberId) throws InvalidFormException { voterListService.deleteVoterListMember(pollId.getEntityId(), voterListId.getEntityId(), memberId.getEntityId()); } + public void saveVoters(VoterListService voterListService, PollenEntityId<Poll> pollId, + List<VoterListBean> listsToSave, + List<VoterListMemberBean> membersToSave, + List<PollenEntityId<VoterList>> listIdsToDelete, + List<PollenEntityId<VoterListMember>> memberIdsToDelete) throws InvalidFormException { + voterListService.saveVoters(pollId.getEntityId(), + listsToSave, + membersToSave, + listIdsToDelete.stream().map(PollenEntityId::getEntityId).collect(Collectors.toList()), + memberIdsToDelete.stream().map(PollenEntityId::getEntityId).collect(Collectors.toList())); + } + } diff --git a/pollen-rest-api/src/main/resources/mapping b/pollen-rest-api/src/main/resources/mapping index 6666858..6d2f707 100644 --- a/pollen-rest-api/src/main/resources/mapping +++ b/pollen-rest-api/src/main/resources/mapping @@ -163,13 +163,14 @@ GET /v1/voteCountingTypes/{id} VoteCountingTypeApi.getVoteCounti # VoterListApi -PUT /v1/polls/{pollId}/favoriteLists/{favoriteListId} VoterListApi.importFavoriteListNewGroup +# PUT /v1/polls/{pollId}/favoriteLists/{favoriteListId} VoterListApi.importFavoriteListNewGroup +# PUT /v1/polls/{pollId}/voterLists/{voterListId}/favoriteLists/{favoriteListId} VoterListApi.importFavoriteList GET /v1/polls/{pollId}/voterLists VoterListApi.getVoterLists GET /v1/polls/{pollId}/voterLists/{voterListId} VoterListApi.getVoterList POST /v1/polls/{pollId}/voterLists VoterListApi.createVoterList +POST /v1/polls/{pollId}/voterLists/save VoterListApi.saveVoters PUT,POST /v1/polls/{pollId}/voterLists/{voterListId} VoterListApi.editVoterList DELETE /v1/polls/{pollId}/voterLists/{voterListId} VoterListApi.deleteVoterList -PUT /v1/polls/{pollId}/voterLists/{voterListId}/favoriteLists/{favoriteListId} VoterListApi.importFavoriteList GET /v1/polls/{pollId}/voterLists/{voterListId}/members VoterListApi.getMembers GET /v1/polls/{pollId}/voterLists/{voterListId}/members/{memberId} VoterListApi.getMember 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 ce45c8f..9fef42d 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 @@ -62,6 +62,8 @@ public class DefaultPollenServiceContext implements PollenServiceContext { protected VoteCountingFactory voteCountingFactory; + protected PollenUIContext uiContext; + public void setPollenServicesConfig(PollenServicesConfig pollenServicesConfig) { this.pollenServicesConfig = pollenServicesConfig; } @@ -105,6 +107,16 @@ public class DefaultPollenServiceContext implements PollenServiceContext { } @Override + public PollenUIContext getUIContext() { + return uiContext; + } + + @Override + public void setUIContext(PollenUIContext uiContext) { + this.uiContext = uiContext; + } + + @Override public String generateSalt() { RandomNumberGenerator generator = getHashService().getRandomNumberGenerator(); 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 c41ce0e..c725e8d 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 @@ -63,4 +63,8 @@ public interface PollenServiceContext { String encodePassword(String salt, String password); VoteCountingFactory getVoteCountingFactory(); + + PollenUIContext getUIContext(); + + void setUIContext(PollenUIContext uiContext); } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollBean.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollBean.java index a9e5e45..b742aa6 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollBean.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollBean.java @@ -67,10 +67,6 @@ public class PollBean extends PollenBean<Poll> { return Objects.equals(PollType.RESTRICTED, poll.getPollType()); } - public static boolean isPollGroup(PollBean poll) { - return Objects.equals(PollType.GROUP, poll.getPollType()); - } - protected String permission; protected String creatorName; diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoterListBean.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoterListBean.java index 877c36c..906c931 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoterListBean.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoterListBean.java @@ -36,6 +36,8 @@ public class VoterListBean extends PollenBean<VoterList> { protected double weight; + protected PollenEntityId<VoterList> parentId; + public VoterListBean() { super(VoterList.class); } @@ -46,6 +48,7 @@ public class VoterListBean extends PollenBean<VoterList> { setEntityId(entity.getTopiaId()); setName(entity.getName()); setWeight(entity.getWeight()); + setParentId(entity.getParent().getTopiaId()); } @@ -77,4 +80,14 @@ public class VoterListBean extends PollenBean<VoterList> { this.weight = weight; } + public PollenEntityId<VoterList> getParentId() { + if (parentId == null) { + parentId = PollenEntityId.newId(VoterList.class); + } + return parentId; + } + + public void setParentId(String parentId) { + getParentId().setEntityId(parentId); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoterListMemberBean.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoterListMemberBean.java index 8f0bc24..649de10 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoterListMemberBean.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoterListMemberBean.java @@ -23,6 +23,7 @@ package org.chorem.pollen.services.bean; import org.chorem.pollen.persistence.entity.PollenPrincipal; import org.chorem.pollen.persistence.entity.PollenPrincipalImpl; +import org.chorem.pollen.persistence.entity.VoterList; import org.chorem.pollen.persistence.entity.VoterListMember; import org.chorem.pollen.persistence.entity.VoterListMemberImpl; @@ -40,6 +41,8 @@ public class VoterListMemberBean extends PollenBean<VoterListMember> { protected double weight; + protected PollenEntityId<VoterList> voterListId; + public VoterListMemberBean() { super(VoterListMember.class); } @@ -53,6 +56,7 @@ public class VoterListMemberBean extends PollenBean<VoterListMember> { setEmail(entity.getMember().getEmail()); } setWeight(entity.getWeight()); + setVoterListId(entity.getVoterList().getTopiaId()); } @@ -97,4 +101,15 @@ public class VoterListMemberBean extends PollenBean<VoterListMember> { public void setWeight(double weight) { this.weight = weight; } + + public PollenEntityId<VoterList> getVoterListId() { + if (voterListId == null) { + voterListId = PollenEntityId.newId(VoterList.class); + } + return voterListId; + } + + public void setVoterListId(String voterListId) { + getVoterListId().setEntityId(voterListId); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java index f4f9ad7..59eb839 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java @@ -41,6 +41,7 @@ import org.chorem.pollen.services.service.security.SecurityService; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -90,6 +91,8 @@ public class FixturesService extends PollenServiceSupport { topiaApplicationContext.createSchema(); } + + serviceContext.setUIContext(fixtures.fixture("pollenUIContext_chorem")); SecurityService securityService = getSecurityService(); @@ -120,7 +123,7 @@ public class FixturesService extends PollenServiceSupport { try { PollBean pollBean = new PollBean(); pollBean.fromEntity(poll); - PollenEntityRef<Poll> createdPoll = pollService.createPoll(pollBean, choicesBean, fixtures.fixture("pollenUIContext_chorem")); + PollenEntityRef<Poll> createdPoll = pollService.createPoll(pollBean, choicesBean, Collections.emptyList(), Collections.emptyList()); poll.setTopiaId(createdPoll.getEntityId()); PollenPrincipal principal = securityService.getPollenPrincipalByPermissionToken(createdPoll.getPermission()); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java index b2a8b47..0566e7a 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java @@ -27,10 +27,8 @@ import org.chorem.pollen.persistence.entity.Comment; import org.chorem.pollen.persistence.entity.FavoriteList; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollType; -import org.chorem.pollen.persistence.entity.PollenPrincipal; import org.chorem.pollen.persistence.entity.PollenUser; import org.chorem.pollen.persistence.entity.Vote; -import org.chorem.pollen.persistence.entity.VoterList; import org.chorem.pollen.persistence.entity.VoterListMember; import org.chorem.pollen.services.PollenUIContext; import org.chorem.pollen.services.service.mail.EmailService; @@ -113,12 +111,12 @@ public class NotificationService extends PollenServiceSupport { // TODO } - public void onPollCreated(Poll poll, PollenUIContext pollenUIContext) { + public void onPollCreated(Poll poll) { EmailService emailService = getEmailService(); if (StringUtils.isNotBlank(poll.getCreator().getEmail())) { - PollCreatedEmail email = emailService.newPollCreatedEmail(poll, pollenUIContext); + PollCreatedEmail email = emailService.newPollCreatedEmail(poll); email.addTo(poll.getCreator().getEmail()); @@ -127,7 +125,7 @@ public class NotificationService extends PollenServiceSupport { if (PollType.FREE.equals(poll.getPollType()) && poll.getParticipants() != null) { for (String email : poll.getParticipants().split("\\s+")) { - PollInvitationEmail mail = emailService.newPollInvitationEmail(poll, pollenUIContext); + PollInvitationEmail mail = emailService.newPollInvitationEmail(poll); mail.addTo(email); @@ -138,12 +136,12 @@ public class NotificationService extends PollenServiceSupport { } - public void onPollEdited(Poll poll, Set<String> newParticipants, PollenUIContext pollenUIContext) { + public void onPollEdited(Poll poll, Set<String> newParticipants) { EmailService emailService = getEmailService(); if (PollType.FREE.equals(poll.getPollType()) ) { for (String email : newParticipants) { - PollInvitationEmail mail = emailService.newPollInvitationEmail(poll, pollenUIContext); + PollInvitationEmail mail = emailService.newPollInvitationEmail(poll); mail.addTo(email); @@ -208,25 +206,17 @@ public class NotificationService extends PollenServiceSupport { } - public void onAddVoterList(Poll poll, List<VoterListMember> voterListMembers, PollenUIContext pollenUIContext) { + public void onAddVoterList(Poll poll, List<VoterListMember> voterListMembers) { EmailService emailService = getEmailService(); voterListMembers.stream() .map(VoterListMember::getMember) + .distinct() .forEach(pollenPrincipal -> { - RestrictedPollInvitationEmail email = emailService.newRestrictedPollInvitationEmail(poll, pollenPrincipal, pollenUIContext); + RestrictedPollInvitationEmail email = emailService.newRestrictedPollInvitationEmail(poll, pollenPrincipal); email.addTo(pollenPrincipal.getEmail()); emailService.send(email); }); } - - public void onAddVoterListMember(VoterList voterList, VoterListMember member, PollenUIContext uiContext) { - EmailService emailService = getEmailService(); - PollenPrincipal principal = member.getMember(); - RestrictedPollInvitationEmail email = emailService.newRestrictedPollInvitationEmail(voterList.getPoll(), principal, uiContext); - email.addTo(principal.getEmail()); - emailService.send(email); - - } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java index 2a11fbf..b18f3e8 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java @@ -30,8 +30,6 @@ import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollType; import org.chorem.pollen.persistence.entity.PollenPrincipal; import org.chorem.pollen.persistence.entity.PollenUser; -import org.chorem.pollen.persistence.entity.VoterList; -import org.chorem.pollen.services.PollenUIContext; import org.chorem.pollen.services.bean.ChoiceBean; import org.chorem.pollen.services.bean.PaginationParameterBean; import org.chorem.pollen.services.bean.PaginationResultBean; @@ -48,6 +46,7 @@ import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Set; @@ -188,7 +187,15 @@ public class PollService extends PollenServiceSupport { } - public PollenEntityRef<Poll> createPoll(PollBean poll, List<ChoiceBean> choices, PollenUIContext pollenUIContext) throws InvalidFormException { + public PollenEntityRef<Poll> createPoll(PollBean poll, + List<ChoiceBean> choices) throws InvalidFormException { + return createPoll(poll, choices, Collections.emptyList(), Collections.emptyList()); + } + + public PollenEntityRef<Poll> createPoll(PollBean poll, + List<ChoiceBean> choices, + List<VoterListBean> voterLists, + List<VoterListMemberBean> voterListMembers) throws InvalidFormException { checkNotNull(poll); checkIsNotPersisted(poll); @@ -197,27 +204,26 @@ public class PollService extends PollenServiceSupport { checkChoices(errorMap, choices); errorMap.failIfNotEmpty(); + if (poll.getPollType() == PollType.RESTRICTED) { + getVoterListService().checkVoters(null, voterLists, voterListMembers); + } + Poll savedPoll = savePoll(poll, choices); if (poll.getPollType() == PollType.RESTRICTED) { - Set<String> participants = poll.getParticipants(); - if (poll.isWithMe()) { - participants.add(poll.getCreatorEmail()); - } - - getVoterListService().updatePollParticipants(savedPoll.getTopiaId(), participants, pollenUIContext); + getVoterListService().createVoters(savedPoll, voterLists, voterListMembers); } commit(); - getNotificationService().onPollCreated(savedPoll, pollenUIContext); + getNotificationService().onPollCreated(savedPoll); return PollenEntityRef.of(savedPoll); } - public PollBean editPoll(PollBean poll, PollenUIContext pollenUIContext) throws InvalidFormException { + public PollBean editPoll(PollBean poll) throws InvalidFormException { checkNotNull(poll); checkIsPersisted(poll); @@ -236,19 +242,10 @@ public class PollService extends PollenServiceSupport { } Poll savedPoll = savePoll(poll, null); - if (poll.getPollType() == PollType.RESTRICTED) { - - Set<String> participants = poll.getParticipants(); - if (poll.isWithMe()) { - participants.add(poll.getCreatorEmail()); - } - - getVoterListService().updatePollParticipants(savedPoll.getTopiaId(), participants, pollenUIContext); - } commit(); - getNotificationService().onPollEdited(savedPoll, newParticipants, pollenUIContext); + getNotificationService().onPollEdited(savedPoll, newParticipants); return toBean(PollBean.class, savedPoll, pollBeanFunction); @@ -269,7 +266,7 @@ public class PollService extends PollenServiceSupport { } - public PollenEntityRef<Poll> clonePoll(String pollId, PollenUIContext pollenUIContext) { + public PollenEntityRef<Poll> clonePoll(String pollId) { checkNotNull(pollId); checkPermission(PermissionVerb.clonePoll, pollId); @@ -301,21 +298,21 @@ public class PollService extends PollenServiceSupport { Poll savedPoll = savePoll(clonedPoll, clonedChoices); //clone VoterList - List<VoterListBean> clonedVoterList = toBeanList(VoterListBean.class, getVoterListService().getVoterLists0(poll)); - for (VoterListBean voterList : clonedVoterList) { - List<VoterListMemberBean> clonedVoterListMember = toBeanList(VoterListMemberBean.class, getVoterListService().getVoterListMembers0(voterList.toEntity())); - - voterList.setEntityId(null); - VoterList savedVoterList = getVoterListService().saveVoterList(savedPoll, voterList); - - for (VoterListMemberBean member : clonedVoterListMember) { - member.setEntityId(null); - getVoterListService().saveVoterListMember(savedVoterList, member); - } - } +// List<VoterListBean> clonedVoterList = toBeanList(VoterListBean.class, getVoterListService().getVoterLists0(poll)); +// for (VoterListBean voterList : clonedVoterList) { +// List<VoterListMemberBean> clonedVoterListMember = toBeanList(VoterListMemberBean.class, getVoterListService().getVoterListMembers0(voterList.toEntity())); +// +// voterList.setEntityId(null); +// VoterList savedVoterList = getVoterListService().saveVoterList(savedPoll, voterList); +// +// for (VoterListMemberBean member : clonedVoterListMember) { +// member.setEntityId(null); +// getVoterListService().saveVoterListMember(savedVoterList, member); +// } +// } commit(); - getNotificationService().onPollCreated(savedPoll, pollenUIContext); + getNotificationService().onPollCreated(savedPoll); return PollenEntityRef.of(savedPoll); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java index a076dbb..f6076a6 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java @@ -45,6 +45,7 @@ import org.chorem.pollen.persistence.entity.VoterListMemberTopiaDao; import org.chorem.pollen.persistence.entity.VoterListTopiaDao; import org.chorem.pollen.services.PollenService; import org.chorem.pollen.services.PollenServiceContext; +import org.chorem.pollen.services.PollenUIContext; import org.chorem.pollen.services.bean.PaginationResultBean; import org.chorem.pollen.services.bean.PollenBean; import org.chorem.pollen.services.bean.PollenBeans; @@ -391,6 +392,12 @@ public abstract class PollenServiceSupport implements PollenService { } + protected PollenUIContext getUIContext() { + + return serviceContext.getUIContext(); + + } + protected <T extends TopiaEntity, B extends PollenBean<T>> B toBean(Class<B> beanType, T entity) { return toBean(beanType, entity, null); 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 3e86bb9..6e2e958 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 @@ -68,7 +68,7 @@ public class VoteCountingService extends PollenServiceSupport { VoteCountingResultBean mainResult; - if (Polls.isPollGroup(poll)) { + if (Polls.isPollRestricted(poll)) { GroupVoteCountingResultBean groupResult = getGroupResult(pollId); mainResult = groupResult.getMainResult(); @@ -110,14 +110,14 @@ public class VoteCountingService extends PollenServiceSupport { Preconditions.checkNotNull(pollId); Poll poll = getPollService().getPoll0(pollId); - List<VoterList> voterLists = getVoterListService().getVoterLists0(poll); + VoterList mainVoterList = getVoterListService().getMainVoterList0(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); + GroupOfVoter group = toGroupOfVoters(poll, mainVoterList, votes); GroupVoteCountingResult groupVoteCountingResult = strategy.votecount(group); @@ -167,17 +167,17 @@ public class VoteCountingService extends PollenServiceSupport { * <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 mainVoterList voterList 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) { + protected GroupOfVoter toGroupOfVoters(Poll poll, VoterList mainVoterList, List<Vote> votes) { Preconditions.checkNotNull(poll); - Preconditions.checkNotNull(voterLists); + Preconditions.checkNotNull(mainVoterList); Preconditions.checkNotNull(votes); - Preconditions.checkArgument(Polls.isPollGroup(poll), - "Can only use this method for a group poll"); + Preconditions.checkArgument(Polls.isPollRestricted(poll), + "Can only use this method for a restricted poll"); GroupOfVoterBuilder builder = new GroupOfVoterBuilder(); @@ -187,6 +187,8 @@ public class VoteCountingService extends PollenServiceSupport { Vote::getVoterListMember ); + List<VoterList> voterLists = getVoterListDao().forParentEquals(mainVoterList).findAll(); + for (VoterList voterList : voterLists) { builder.newGroupVoter(voterList.getTopiaId(), 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 228084b..d09647b 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 @@ -22,27 +22,25 @@ package org.chorem.pollen.services.service; */ import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.common.collect.Sets; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.chorem.pollen.persistence.entity.FavoriteList; -import org.chorem.pollen.persistence.entity.FavoriteListMember; +import org.apache.commons.lang3.tuple.Pair; import org.chorem.pollen.persistence.entity.Poll; -import org.chorem.pollen.persistence.entity.PollType; import org.chorem.pollen.persistence.entity.PollenPrincipal; import org.chorem.pollen.persistence.entity.PollenUser; import org.chorem.pollen.persistence.entity.VoterList; import org.chorem.pollen.persistence.entity.VoterListMember; -import org.chorem.pollen.persistence.entity.VoterListTopiaDao; -import org.chorem.pollen.services.PollenUIContext; import org.chorem.pollen.services.bean.PollenEntityRef; import org.chorem.pollen.services.bean.VoterListBean; import org.chorem.pollen.services.bean.VoterListMemberBean; import org.chorem.pollen.services.service.security.PermissionVerb; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import static org.nuiton.i18n.I18n.l; @@ -55,123 +53,108 @@ import static org.nuiton.i18n.I18n.l; */ public class VoterListService extends PollenServiceSupport { - public static final String RESTRICTED_VOTER_LIST_NAME = "restrictedVoterList"; - - protected VoterListMemberBean emailToMember(String email) { - VoterListMemberBean member = new VoterListMemberBean(); - member.setEmail(email); - member.setWeight(1.0); - PollenUser user = getPollenUserDao().forEmailEquals(email).findAnyOrNull(); - if (user != null) { - member.setName(user.getName()); - } else { - member.setName(email); - } - return member; - } - - public VoterListBean newRestrictedVoterList() { - - VoterListBean list = new VoterListBean(); - list.setName(RESTRICTED_VOTER_LIST_NAME); - list.setWeight(1.0f); - return list; - - } - - public VoterListBean newGroupVoterList() { - - VoterListBean list = new VoterListBean(); - list.setWeight(1.0f); - return list; - - } - - public PollenEntityRef<VoterList> importFavoriteList(String pollId, - String favoriteListId) { - return importFavoriteList(pollId, null, favoriteListId); - } - - public PollenEntityRef<VoterList> importFavoriteList(String pollId, - String voterListId, - String favoriteListId) { - - checkIsConnected(); - checkNotNull(pollId); - checkNotNull(favoriteListId); - checkPermission(PermissionVerb.editPoll, pollId); - - Poll poll = getPollService().getPoll0(pollId); - - PollenUser user = getConnectedUser(); - - FavoriteList favoriteList = getFavoriteListService().getFavoriteList0(user, favoriteListId); - - VoterList result = null; - List<VoterListMember> existingVoterListMembers = null; - if (voterListId != null) { - result = getVoterList0(poll, voterListId); - } else { - if (poll.getPollType() == PollType.RESTRICTED) { - List<VoterList> existingVoterList = getVoterLists0(poll); - if (existingVoterList.size() > 0) { - result = getVoterList0(poll, existingVoterList.get(0).getTopiaId()); - } - } - } - - if (result == null) { - VoterListTopiaDao dao = getVoterListDao(); - result = dao.create(); - result.setName(favoriteList.getName()); - result.setWeight(1d); - } else { - existingVoterListMembers = getVoterListMembers0(result); - } - - List<FavoriteListMember> favoriteListMembers = getFavoriteListService().getFavoriteListMembers0(favoriteList); - - for (FavoriteListMember favoriteListMember : favoriteListMembers) { - VoterListMemberBean voterListMember = new VoterListMemberBean(); - - voterListMember.setName(favoriteListMember.getName()); - voterListMember.setEmail(favoriteListMember.getEmail()); - voterListMember.setWeight(1d); - - ErrorMap errorMap = checkVoterListMember(existingVoterListMembers, voterListMember); - if (errorMap.isEmpty()) { - // no error then create member - saveVoterListMember(result, voterListMember); - } - - } - - result.setPoll(poll); - - commit(); - - return PollenEntityRef.of(result); - - } - - public List<VoterListBean> getVoterLists(String pollId) { + public static final String TEMP_ID_PREFIX = "TEMP-"; + +// protected VoterListMemberBean emailToMember(String email) { +// VoterListMemberBean member = new VoterListMemberBean(); +// member.setEmail(email); +// member.setWeight(1.0); +// PollenUser user = getPollenUserDao().forEmailEquals(email).findAnyOrNull(); +// if (user != null) { +// member.setName(user.getName()); +// } else { +// member.setName(email); +// } +// return member; +// } + +// public PollenEntityRef<VoterList> importFavoriteList(String pollId, +// String favoriteListId) { +// return importFavoriteList(pollId, null, favoriteListId); +// } +// +// public PollenEntityRef<VoterList> importFavoriteList(String pollId, +// String parentId, +// String favoriteListId) { +// +// checkIsConnected(); +// checkNotNull(pollId); +// checkNotNull(favoriteListId); +// checkPermission(PermissionVerb.editPoll, pollId); +// +// Poll poll = getPollService().getPoll0(pollId); +// +// PollenUser user = getConnectedUser(); +// +// FavoriteList favoriteList = getFavoriteListService().getFavoriteList0(user, favoriteListId); +// +// VoterList result = null; +// List<VoterListMember> existingVoterListMembers = null; +// if (parentId != null) { +// result = getVoterList0(poll, parentId); +// } else { +// if (poll.getPollType() == PollType.RESTRICTED) { +// List<VoterList> existingVoterList = getVoterLists0(poll); +// if (existingVoterList.size() > 0) { +// result = getVoterList0(poll, existingVoterList.get(0).getTopiaId()); +// } +// } +// } +// +// if (result == null) { +// VoterListTopiaDao dao = getVoterListDao(); +// result = dao.create(); +// result.setName(favoriteList.getName()); +// result.setWeight(1d); +// } else { +// existingVoterListMembers = getVoterListMembers0(result); +// } +// +// List<FavoriteListMember> favoriteListMembers = getFavoriteListService().getFavoriteListMembers0(favoriteList); +// +// for (FavoriteListMember favoriteListMember : favoriteListMembers) { +// VoterListMemberBean voterListMember = new VoterListMemberBean(); +// +// voterListMember.setName(favoriteListMember.getName()); +// voterListMember.setEmail(favoriteListMember.getEmail()); +// voterListMember.setWeight(1d); +// +// ErrorMap errorMap = checkVoterListMember(existingVoterListMembers, voterListMember); +// if (errorMap.isEmpty()) { +// // no error then create member +// saveVoterListMember(result, voterListMember); +// } +// +// } +// +// result.setPoll(poll); +// +// commit(); +// +// return PollenEntityRef.of(result); +// +// } + + public List<VoterListBean> getVoterLists(String pollId, String parentId) { checkNotNull(pollId); checkPermission(PermissionVerb.readPoll, pollId); Poll poll = getPollService().getPoll0(pollId); - List<VoterList> voterLists = getVoterLists0(poll); + List<VoterList> voterLists = getVoterLists0(poll, parentId); return toBeanList(VoterListBean.class, voterLists); } - public VoterListBean getRestrictedVoterList(String pollId) { + public VoterListBean getMainVoterList(String pollId) { checkNotNull(pollId); checkPermission(PermissionVerb.readPoll, pollId); - VoterList voterList = getVoterListDao().forProperties(VoterList.PROPERTY_POLL + "." + Poll.PROPERTY_TOPIA_ID, pollId) - .addEquals(VoterList.PROPERTY_NAME, RESTRICTED_VOTER_LIST_NAME).findUniqueOrNull(); + VoterList voterList = getVoterListDao() + .forProperties(VoterList.PROPERTY_POLL + "." + Poll.PROPERTY_TOPIA_ID, pollId) + .addNull(VoterList.PROPERTY_PARENT) + .findUniqueOrNull(); VoterListBean result = null; if (voterList != null) { @@ -192,70 +175,19 @@ public class VoterListService extends PollenServiceSupport { } - protected void updatePollParticipants(String pollId, Set<String> emails, PollenUIContext pollenUIContext) throws InvalidFormException { - - VoterListBean voterList = getRestrictedVoterList(pollId); - if (voterList == null) { - List<VoterListMemberBean> members = emails.stream() - .filter(StringUtils::isNotBlank) - .map(this::emailToMember) - .collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(members)) { - voterList = newRestrictedVoterList(); - addVoterList(pollId, voterList, members, pollenUIContext); - } - } else { - String voterListId = voterList.getEntityId(); - Set<String> emailMembers = getVoterListMembers(pollId, voterListId).stream() - .map(VoterListMemberBean::getEmail) - .collect(Collectors.toSet()); - - List<VoterListMemberBean> newMember = emails.stream() - .filter(StringUtils::isNotBlank) - .filter(email -> !emailMembers.contains(email)) - .map(this::emailToMember) - .collect(Collectors.toList()); - - for (VoterListMemberBean member : newMember) { - addVoterListMember(pollId, voterListId, member, pollenUIContext); - } - } - } - public PollenEntityRef<VoterList> addVoterList(String pollId, VoterListBean voterList, - List<VoterListMemberBean> members, - PollenUIContext pollenUIContext) throws InvalidFormException { + List<VoterListMemberBean> members) throws InvalidFormException { - checkNotNull(pollId); checkNotNull(voterList); checkIsNotPersisted(voterList); - checkPermission(PermissionVerb.editPoll, pollId); + saveVoters(pollId, + Collections.singletonList(voterList), + members, + Collections.emptyList(), + Collections.emptyList()); - Poll poll = getPollService().getPoll0(pollId); - - List<VoterList> existingVoterLists = getVoterLists0(poll); - - ErrorMap errorMap = checkVoterList(existingVoterLists, voterList, members); - errorMap.failIfNotEmpty(); - - VoterList result = saveVoterList(poll, voterList); - List<VoterListMember> voterListMembers = Lists.newLinkedList(); - - if (CollectionUtils.isNotEmpty(members)) { - - for (VoterListMemberBean member : members) { - - VoterListMember voterListMember = saveVoterListMember(result, member); - voterListMembers.add(voterListMember); - - } - - } - - commit(); - - getNotificationService().onAddVoterList(poll, voterListMembers, pollenUIContext); + VoterList result = getVoterListDao().forTopiaIdEquals(voterList.getEntityId()).findUnique(); return PollenEntityRef.of(result); @@ -263,21 +195,16 @@ public class VoterListService extends PollenServiceSupport { public VoterListBean editVoterList(String pollId, VoterListBean voterList) throws InvalidFormException { - checkNotNull(pollId); checkNotNull(voterList); checkIsPersisted(voterList); - checkPermission(PermissionVerb.editPoll, pollId); - - Poll poll = getPollService().getPoll0(pollId); - List<VoterList> existingVoterLists = getVoterLists0(poll); - List<VoterListMember> existingVoterListMembers = getVoterListMembers0(voterList.toEntity()); + saveVoters(pollId, + Collections.singletonList(voterList), + Collections.emptyList(), + Collections.emptyList(), + Collections.emptyList()); - ErrorMap errorMap = checkVoterList(existingVoterLists, voterList, toBeanList(VoterListMemberBean.class, existingVoterListMembers)); - errorMap.failIfNotEmpty(); - - VoterList result = saveVoterList(poll, voterList); - commit(); + VoterList result = getVoterListDao().forTopiaIdEquals(voterList.getEntityId()).findUnique(); //TODO Notify return toBean(VoterListBean.class, result); @@ -325,72 +252,64 @@ public class VoterListService extends PollenServiceSupport { } - public VoterListMemberBean addVoterListMember(String pollId, String voterListId, VoterListMemberBean member, PollenUIContext uiContext) throws InvalidFormException { + public VoterListMemberBean addVoterListMember(String pollId, VoterListMemberBean member) throws InvalidFormException { - checkNotNull(pollId); - checkNotNull(voterListId); checkNotNull(member); checkIsNotPersisted(member); - checkPermission(PermissionVerb.editPoll, pollId); - - VoterList voterList = getVoterList0(pollId, voterListId); - - List<VoterListMember> existingVoterListMembers = getVoterListMembers0(voterList); - - ErrorMap errorMap = checkVoterListMember(existingVoterListMembers, member); - errorMap.failIfNotEmpty(); - - VoterListMember result = saveVoterListMember(voterList, member); - commit(); - - getNotificationService().onAddVoterListMember(voterList, result, uiContext); + saveVoters(pollId, + Collections.emptyList(), + Collections.singletonList(member), + Collections.emptyList(), + Collections.emptyList()); + VoterListMember result = getVoterListMemberDao().forTopiaIdEquals(member.getEntityId()).findUnique(); return toBean(VoterListMemberBean.class, result); } - public VoterListMemberBean editVoterListMember(String pollId, String voterListId, VoterListMemberBean member) throws InvalidFormException { + public VoterListMemberBean editVoterListMember(String pollId, VoterListMemberBean member) throws InvalidFormException { - checkNotNull(pollId); - checkNotNull(voterListId); checkNotNull(member); checkIsPersisted(member); - checkPermission(PermissionVerb.editPoll, pollId); - - VoterList voterList = getVoterList0(pollId, voterListId); - List<VoterListMember> existingVoterListMembers = getVoterListMembers0(voterList); - - ErrorMap errorMap = checkVoterListMember(existingVoterListMembers, member); - errorMap.failIfNotEmpty(); - - VoterListMember result = saveVoterListMember(voterList, member); - commit(); + saveVoters(pollId, + Collections.emptyList(), + Collections.singletonList(member), + Collections.emptyList(), + Collections.emptyList()); + VoterListMember result = getVoterListMemberDao().forTopiaIdEquals(member.getEntityId()).findUnique(); return toBean(VoterListMemberBean.class, result); } - public void deleteVoterListMember(String pollId, String voterListId, String memberId) { + public void deleteVoterListMember(String pollId, String voterListId, String memberId) throws InvalidFormException { - checkNotNull(pollId); checkNotNull(voterListId); checkNotNull(memberId); - checkPermission(PermissionVerb.editPoll, pollId); - - VoterList voterList = getVoterList0(pollId, voterListId); - VoterListMember member = getVoterListMember0(voterList, memberId); - getVoterListMemberDao().delete(member); - commit(); + saveVoters(pollId, + Collections.emptyList(), + Collections.emptyList(), + Collections.emptyList(), + Collections.singletonList(memberId)); } - protected List<VoterList> getVoterLists0(Poll poll) { + protected List<VoterList> getVoterLists0(Poll poll, String parentId) { - return getVoterListDao().forPollEquals(poll).findAll(); + return getVoterListDao() + .forPollEquals(poll) + .addEquals(VoterList.PROPERTY_PARENT + "." + VoterList.PROPERTY_TOPIA_ID, parentId) + .findAll(); + + } + protected VoterList getMainVoterList0(Poll poll) { + return getVoterListDao() + .forPollEquals(poll) + .findUniqueOrNull(); } protected VoterList getVoterList0(Poll poll, String voterListId) { @@ -424,6 +343,14 @@ public class VoterListService extends PollenServiceSupport { } + protected List<VoterListMember> getVoterListMembers0(String voterListId) { + + return getVoterListMemberDao() + .forProperties(VoterListMember.PROPERTY_VOTER_LIST + "." + VoterList.PROPERTY_TOPIA_ID, voterListId) + .findAll(); + + } + protected VoterListMember getVoterListMember0(VoterList voterList, String memberId) { VoterListMember result = getVoterListMemberDao().forTopiaIdEquals(memberId).findUnique(); @@ -452,6 +379,11 @@ public class VoterListService extends PollenServiceSupport { toSave = getVoterListDao().create(); toSave.setPoll(poll); + String parentId = voterList.getParentId().getEntityId(); + if (parentId != null) { + VoterList parent = getVoterList0(poll, parentId); + toSave.setParent(parent); + } } @@ -462,13 +394,14 @@ public class VoterListService extends PollenServiceSupport { } - protected VoterListMember saveVoterListMember(VoterList voterList, - VoterListMemberBean voterListMember) { + protected VoterListMember saveVoterListMember(Poll poll, VoterListMemberBean voterListMember) { boolean voterListMemberExists = voterListMember.isPersisted(); VoterListMember toSave; + VoterList voterList = getVoterList0(poll, voterListMember.getVoterListId().getEntityId()); + if (voterListMemberExists) { toSave = getVoterListMember0(voterList, voterListMember.getEntityId()); @@ -506,110 +439,277 @@ public class VoterListService extends PollenServiceSupport { } - protected ErrorMap checkVoterList(List<VoterList> existingVoterLists, VoterListBean voterList, List<VoterListMemberBean> members) { + protected ErrorMap checkVoterList(Set<String> sisterNames, VoterListBean voterList, List<VoterListMemberBean> members) { ErrorMap errors = new ErrorMap(); - boolean voterListExists = voterList.isPersisted(); + checkNotBlank(errors, VoterList.PROPERTY_NAME, voterList.getName(), l(getLocale(), "pollen.error.voterList.name.mandatory")); + check(errors, VoterList.PROPERTY_WEIGHT, voterList.getWeight() > 0, l(getLocale(), "pollen.error.voterList.weight.greaterThan0")); + checkNotEmpty(errors, "member", members, l(getLocale(), "pollen.error.voterList.member.mandatory")); - Set<String> voterListNames = Sets.newHashSet(); + boolean nameAlreadyUse = sisterNames.contains(voterList.getName()); - if (CollectionUtils.isNotEmpty(existingVoterLists)) { + check(errors, VoterList.PROPERTY_NAME, !nameAlreadyUse, l(getLocale(), "pollen.error.voterList.name.alreadyUsed")); - // get all used names + int voterListMemberIndex = 0; - for (VoterList oneVoterList : existingVoterLists) { + if (CollectionUtils.isNotEmpty(members)) { - if (voterListExists && - oneVoterList.getTopiaId().equals(voterList.getEntityId())) { - continue; - } + Set<String> brotherNames = Sets.newHashSet(); + Set<String> brotherEmails = Sets.newHashSet(); - voterListNames.add(oneVoterList.getName()); + for (VoterListMemberBean voterListMember : members) { + + ErrorMap voterListMemberErrors = checkVoterListMember(brotherNames, brotherEmails, voterListMember); + voterListMemberErrors.copyTo(errors, "member[" + (voterListMemberIndex++) + "]."); + brotherNames.add(voterListMember.getName()); + brotherEmails.add(voterListMember.getEmail()); } + } + + return errors; + + } + + protected ErrorMap checkVoterListMember( Set<String> voterListMemberNames, Set<String> voterListMemberEmails, VoterListMemberBean voterListMember) { + + ErrorMap errors = new ErrorMap(); + + String voterListMemberName = voterListMember.getName(); + boolean nameNotblank = checkNotBlank(errors, PollenPrincipal.PROPERTY_NAME, voterListMemberName, l(getLocale(), "pollen.error.voterList.member.name.mandatory")); + + if (nameNotblank) { + + boolean nameAlreadyUsed = voterListMemberNames.contains(voterListMemberName); + check(errors, PollenPrincipal.PROPERTY_NAME, !nameAlreadyUsed, l(getLocale(), "pollen.error.voterList.member.name.alreadyUsed")); } - checkNotBlank(errors, VoterList.PROPERTY_NAME, voterList.getName(), l(getLocale(), "pollen.error.voterList.name.mandatory")); - check(errors, VoterList.PROPERTY_WEIGHT, voterList.getWeight() > 0, l(getLocale(), "pollen.error.voterList.weight.greaterThan0")); - checkNotEmpty(errors, "member", members, l(getLocale(), "pollen.error.voterList.member.mandatory")); + String voterListMemberEmail = getCleanMail(voterListMember.getEmail()); - boolean added = voterListNames.add(voterList.getName()); + boolean emailNotBlank = checkNotBlank(errors, PollenPrincipal.PROPERTY_EMAIL, voterListMemberEmail, l(getLocale(), "pollen.error.voterList.member.email.mandatory")); - check(errors, VoterList.PROPERTY_NAME, added, l(getLocale(), "pollen.error.voterList.name.alreadyUsed")); + if (emailNotBlank) { - int voterListMemberIndex = 0; + checkValidEmail(errors, PollenPrincipal.PROPERTY_EMAIL, voterListMemberEmail, l(getLocale(), "pollen.error.voterList.member.email.invalid")); + boolean emailAlreadyUsed = voterListMemberEmails.contains(voterListMemberEmail); + check(errors, PollenPrincipal.PROPERTY_EMAIL, !emailAlreadyUsed, l(getLocale(), "pollen.error.voterList.member.email.alreadyUsed")); - if (CollectionUtils.isNotEmpty(members)) { + } - List<VoterListMember> existingVoterListMembers = new ArrayList<>(); + check(errors, VoterListMember.PROPERTY_WEIGHT, voterListMember.getWeight() > 0, l(getLocale(), "pollen.error.voterList.member.weight.greaterThan0")); - for (VoterListMemberBean voterListMember : members) { + return errors; - ErrorMap voterListMemberErrors = checkVoterListMember(existingVoterListMembers, voterListMember); - voterListMemberErrors.copyTo(errors, "member[" + (voterListMemberIndex++) + "]."); - existingVoterListMembers.add(voterListMember.toEntity()); + } + + public void saveVoters(String pollId, + List<VoterListBean> listsToSave, + List<VoterListMemberBean> membersToSave, + List<String> listIdsToDelete, + List<String> memberIdsToDelete) throws InvalidFormException { + + checkNotNull(pollId); + checkPermission(PermissionVerb.editPoll, pollId); + + Poll poll = getPollService().getPoll0(pollId); + + checkVoters(poll, listsToSave, membersToSave); + checkNotNull(listIdsToDelete); + checkNotNull(memberIdsToDelete); + + List<VoterList> voterListToDelete = Lists.newLinkedList(); + for (String listIdToDelete : listIdsToDelete) { + + VoterList voterList = getVoterListDao().forTopiaIdEquals(listIdToDelete).findUnique(); + + if (!voterList.getPoll().equals(poll)) { + + throw new InvalidEntityLinkException(VoterList.PROPERTY_POLL, voterList, poll); } + + voterListToDelete.add(voterList); + } + + List<VoterListMember> voterListMemberToDelete = Lists.newLinkedList(); + for (String memberIdToDelete : memberIdsToDelete) { + + VoterListMember voterListMember = getVoterListMemberDao().forTopiaIdEquals(memberIdToDelete).findUnique(); + + if (!voterListMember.getVoterList().getPoll().equals(poll)) { + + throw new InvalidEntityLinkException(VoterListMember.PROPERTY_VOTER_LIST + "." + VoterList.PROPERTY_POLL, voterListMember, poll); + + } + + voterListMemberToDelete.add(voterListMember); } - return errors; + + List<VoterListMember> newVoters = createVoters(poll, listsToSave, membersToSave); + + for (VoterList voterList : voterListToDelete) { + + getVoterListDao().delete(voterList); + + } + + for (VoterListMember voterListMember : voterListMemberToDelete) { + + getVoterListMemberDao().delete(voterListMember); + + } + + commit(); + + getNotificationService().onAddVoterList(poll, newVoters); } - protected ErrorMap checkVoterListMember(List<VoterListMember> existingVoterListMembers, VoterListMemberBean voterListMember) { + protected void checkVoters(Poll poll, List<VoterListBean> listsToSave, List<VoterListMemberBean> membersToSave) throws InvalidFormException { - ErrorMap errors = new ErrorMap(); + checkNotNull(listsToSave); + checkNotNull(membersToSave); + // verification des listes de voteurs + Map<String, Set<String>> listNameByParentId = Maps.newHashMap(); - boolean voterListMemberExists = voterListMember.isPersisted(); + for (VoterListBean voterList : listsToSave) { - Set<String> voterListMemberNames = Sets.newHashSet(); - Set<String> voterListMemberEmails = Sets.newHashSet(); - if (CollectionUtils.isNotEmpty(existingVoterListMembers)) { + Set<String> sisterNames = listNameByParentId.computeIfAbsent(voterList.getParentId().getEntityId(), parentId -> { + if (poll == null || parentId == null || parentId.startsWith(TEMP_ID_PREFIX)) { + return Sets.newHashSet(); + } else { + List<VoterList> existingVoterLists = getVoterLists0(poll, parentId); + return existingVoterLists.stream() + .map(VoterList::getName) + .collect(Collectors.toSet()); + } + }); + + List<VoterListMemberBean> members = Collections.emptyList(); + + if (voterList.getEntityId() != null) { - // get all used names and email + if (voterList.getEntityId().startsWith(TEMP_ID_PREFIX)) { - for (VoterListMember voterListMember1 : existingVoterListMembers) { + members = membersToSave.stream() + .filter(member -> member.getVoterListId().getEntityId().equals(voterList.getEntityId())) + .collect(Collectors.toList()); + + } else { - if (voterListMemberExists && - voterListMember1.getTopiaId().equals(voterListMember.getEntityId())) { - continue; + VoterList oldVoterList = getVoterList0(poll, voterList.getEntityId()); + sisterNames.remove(oldVoterList.getName()); + + List<VoterListMember> existingVoterListMembers = getVoterListMembers0(voterList.toEntity()); + members = toBeanList(VoterListMemberBean.class, existingVoterListMembers); } - voterListMemberNames.add(voterListMember1.getMember().getName()); - voterListMemberEmails.add(voterListMember1.getMember().getEmail()); + } else if (listsToSave.size() == 1){ + + members = membersToSave; } + ErrorMap errorMap = checkVoterList(sisterNames, voterList, members); + errorMap.failIfNotEmpty(); + + sisterNames.add(voterList.getName()); } - String voterListMemberName = voterListMember.getName(); - boolean nameNotblank = checkNotBlank(errors, PollenPrincipal.PROPERTY_NAME, voterListMemberName, l(getLocale(), "pollen.error.voterList.member.name.mandatory")); + // Vérification des membres + Map<String, Pair<Set<String>, Set<String>>> listNamesEmailsByListId = Maps.newHashMap(); - if (nameNotblank) { - boolean nameAdded = voterListMemberNames.add(voterListMemberName); - check(errors, PollenPrincipal.PROPERTY_NAME, nameAdded, l(getLocale(), "pollen.error.voterList.member.name.alreadyUsed")); + for (VoterListMemberBean voterListMember : membersToSave) { + + if (voterListMember.getVoterListId().getEntityId() != null && !voterListMember.getVoterListId().getEntityId().startsWith(TEMP_ID_PREFIX)) { + + Pair<Set<String>, Set<String>> brotherNamesEmails = listNamesEmailsByListId.computeIfAbsent(voterListMember.getVoterListId().getEntityId(), voterListId -> { + List<VoterListMember> existingVoterListMembers = getVoterListMembers0(voterListId); + Set<String> names = existingVoterListMembers.stream() + .map(VoterListMember::getMember) + .map(PollenPrincipal::getName) + .collect(Collectors.toSet()); + Set<String> emails = existingVoterListMembers.stream() + .map(VoterListMember::getMember) + .map(PollenPrincipal::getEmail) + .collect(Collectors.toSet()); + return Pair.of(names, emails); + }); + + Set<String> brotherNames = brotherNamesEmails.getLeft(); + Set<String> brotherEmails = brotherNamesEmails.getLeft(); + + if (voterListMember.isPersisted()) { + + VoterList voterList = getVoterList0(poll, voterListMember.getVoterListId().getEntityId()); + + VoterListMember oldMember = getVoterListMember0(voterList, voterListMember.getEntityId()); + brotherNames.remove(oldMember.getMember().getName()); + brotherEmails.remove(oldMember.getMember().getEmail()); + + } + + ErrorMap errorMap = checkVoterListMember(brotherNames, brotherEmails, voterListMember); + errorMap.failIfNotEmpty(); + brotherNames.add(voterListMember.getName()); + brotherEmails.add(voterListMember.getEmail()); + } } + } - String voterListMemberEmail = getCleanMail(voterListMember.getEmail()); + protected List<VoterListMember> createVoters(Poll poll, List<VoterListBean> listsToSave, List<VoterListMemberBean> membersToSave) { - boolean emailNotBlank = checkNotBlank(errors, PollenPrincipal.PROPERTY_EMAIL, voterListMemberEmail, l(getLocale(), "pollen.error.voterList.member.email.mandatory")); + Map<String, VoterListBean> voterListBeanByTempId = listsToSave.stream() + .filter(list -> list.getEntityId() == null || list.getEntityId().startsWith(TEMP_ID_PREFIX)) + .collect(Collectors.toMap( + VoterListBean::getEntityId, + Function.identity())); - if (emailNotBlank) { + List<VoterListMember> newVoters = Lists.newLinkedList(); - checkValidEmail(errors, PollenPrincipal.PROPERTY_EMAIL, voterListMemberEmail, l(getLocale(), "pollen.error.voterList.member.email.invalid")); - boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail); - check(errors, PollenPrincipal.PROPERTY_EMAIL, emailAdded, l(getLocale(), "pollen.error.voterList.member.email.alreadyUsed")); + for (VoterListBean voterList : listsToSave) { + + if (voterList.getEntityId() == null || voterList.getEntityId().startsWith(TEMP_ID_PREFIX)) { + String parentId = voterList.getParentId().getEntityId(); + if (parentId != null && parentId.startsWith(TEMP_ID_PREFIX)) { + parentId = voterListBeanByTempId.get(parentId).getEntityId(); + voterList.setParentId(parentId); + } + + voterList.setEntityId(null); + VoterList voterListSaved = saveVoterList(poll, voterList); + voterList.setEntityId(voterListSaved.getTopiaId()); + + } else { + saveVoterList(poll, voterList); + } } - check(errors, VoterListMember.PROPERTY_WEIGHT, voterListMember.getWeight() > 0, l(getLocale(), "pollen.error.voterList.member.weight.greaterThan0")); + for (VoterListMemberBean voterListMember : membersToSave) { + if (!voterListMember.isPersisted()) { - return errors; + String voterListId = voterListMember.getVoterListId().getEntityId(); + if (voterListId == null || voterListId.startsWith(TEMP_ID_PREFIX)) { + voterListId = voterListBeanByTempId.get(voterListId).getEntityId(); + voterListMember.setVoterListId(voterListId); + } - } + voterListMember.setEntityId(null); + VoterListMember voterListMemberSaved = saveVoterListMember(poll, voterListMember); + voterListMember.setEntityId(voterListMemberSaved.getTopiaId()); + newVoters.add(voterListMemberSaved); + } else { + saveVoterListMember(poll, voterListMember); + } + } + + return newVoters; + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java index 9b01808..d3450cb 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java @@ -120,17 +120,17 @@ public class EmailService extends PollenServiceSupport { return email; } - public PollCreatedEmail newPollCreatedEmail(Poll poll, PollenUIContext pollenUIContext) { + public PollCreatedEmail newPollCreatedEmail(Poll poll) { PollCreatedEmail email = new PollCreatedEmail(getLocale()); email.setPoll(poll); - email.setPollenUrl(pollenUIContext.getUiEndPoint()); + email.setPollenUrl(getUIContext().getUiEndPoint()); PollenEntityId<Poll> pollId = PollenEntityId.newId(Poll.class); pollId.setEntityId(poll.getTopiaId()); pollId.encode(serviceContext.getTopiaApplicationContext().getTopiaIdFactory()); - email.setUrl(getPollenUIUrlRenderService().getPollEditUrl(pollenUIContext.getPollEditUrl(), + email.setUrl(getPollenUIUrlRenderService().getPollEditUrl(getUIContext().getPollEditUrl(), pollId.getReducedId(), poll.getCreator().getPermission().getToken())); @@ -173,7 +173,7 @@ public class EmailService extends PollenServiceSupport { return email; } - public PollInvitationEmail newPollInvitationEmail(Poll poll, PollenUIContext pollenUIContext) { + public PollInvitationEmail newPollInvitationEmail(Poll poll) { PollInvitationEmail email = new PollInvitationEmail(getLocale()); email.setPoll(poll); @@ -182,14 +182,14 @@ public class EmailService extends PollenServiceSupport { pollId.encode(serviceContext.getTopiaApplicationContext().getTopiaIdFactory()); email.setVoteUrl(getPollenUIUrlRenderService().getPollVoteUrl - (pollenUIContext.getPollVoteUrl(), + (getUIContext().getPollVoteUrl(), pollId.getReducedId(), null)); return email; } - public RestrictedPollInvitationEmail newRestrictedPollInvitationEmail(Poll poll, PollenPrincipal principal, PollenUIContext pollenUIContext) { + public RestrictedPollInvitationEmail newRestrictedPollInvitationEmail(Poll poll, PollenPrincipal principal) { RestrictedPollInvitationEmail email = new RestrictedPollInvitationEmail(getLocale()); email.setPoll(poll); email.setPrincipal(principal); @@ -199,7 +199,7 @@ public class EmailService extends PollenServiceSupport { pollId.encode(serviceContext.getTopiaApplicationContext().getTopiaIdFactory()); email.setVoteUrl(getPollenUIUrlRenderService().getPollVoteUrl - (pollenUIContext.getPollVoteUrl(), + (getUIContext().getPollVoteUrl(), pollId.getReducedId(), principal.getPermission().getToken())); diff --git a/pollen-services/src/test/java/org/chorem/pollen/services/service/PollServiceTest.java b/pollen-services/src/test/java/org/chorem/pollen/services/service/PollServiceTest.java index 8673736..11d0cd6 100644 --- a/pollen-services/src/test/java/org/chorem/pollen/services/service/PollServiceTest.java +++ b/pollen-services/src/test/java/org/chorem/pollen/services/service/PollServiceTest.java @@ -25,7 +25,6 @@ import org.chorem.pollen.persistence.entity.ChoiceType; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollType; import org.chorem.pollen.services.AbstractPollenServiceTest; -import org.chorem.pollen.services.PollenUIContext; import org.chorem.pollen.services.bean.ChoiceBean; import org.chorem.pollen.services.bean.PollBean; import org.chorem.pollen.services.bean.PollenEntityRef; @@ -94,7 +93,7 @@ public class PollServiceTest extends AbstractPollenServiceTest { choice2.setDescription("Choice B"); choices.add(choice2); - PollenEntityRef<Poll> createdPoll = service.createPoll(poll, choices, new PollenUIContext()); + PollenEntityRef<Poll> createdPoll = service.createPoll(poll, choices); Assert.assertNotNull(createdPoll); String createdPollId = createdPoll.getEntityId(); Assert.assertNotNull(createdPollId); @@ -140,7 +139,7 @@ public class PollServiceTest extends AbstractPollenServiceTest { poll.setPollType(PollType.FREE); try { - service.createPoll(poll, null, new PollenUIContext()); + service.createPoll(poll, null); Assert.fail(); } catch (InvalidFormException e) { // missing title @@ -155,7 +154,7 @@ public class PollServiceTest extends AbstractPollenServiceTest { choices.add(choice1); try { - service.createPoll(poll, choices, new PollenUIContext()); + service.createPoll(poll, choices); Assert.fail(); } catch (InvalidFormException e) { // missing choice type @@ -164,7 +163,7 @@ public class PollServiceTest extends AbstractPollenServiceTest { choice1.setChoiceType(ChoiceType.TEXT); try { - service.createPoll(poll, choices, new PollenUIContext()); + service.createPoll(poll, choices); Assert.fail(); } catch (InvalidFormException e) { // missing choice name @@ -182,7 +181,7 @@ public class PollServiceTest extends AbstractPollenServiceTest { choices.add(choice2); try { - service.createPoll(poll, choices, new PollenUIContext()); + service.createPoll(poll, choices); Assert.fail(); } catch (InvalidFormException e) { // duplicated choice name @@ -192,7 +191,7 @@ public class PollServiceTest extends AbstractPollenServiceTest { choice2.setChoiceValue("B"); - PollenEntityRef<Poll> createdPoll = service.createPoll(poll, choices, new PollenUIContext()); + PollenEntityRef<Poll> createdPoll = service.createPoll(poll, choices); Assert.assertNotNull(createdPoll); String createdPollId = createdPoll.getEntityId(); Assert.assertNotNull(createdPollId); 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 index cc42ecb..a86d904 100644 --- 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 @@ -25,7 +25,6 @@ import org.apache.commons.lang3.time.DateUtils; import org.chorem.pollen.persistence.entity.ChoiceType; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.services.AbstractPollenServiceTest; -import org.chorem.pollen.services.PollenUIContext; import org.chorem.pollen.services.bean.ChoiceBean; import org.chorem.pollen.services.bean.PollBean; import org.chorem.pollen.services.bean.PollenEntityRef; @@ -95,7 +94,7 @@ public class VoteCountingServiceTest extends AbstractPollenServiceTest { choice2.setDescription("Choice B"); choices.add(choice2); - PollenEntityRef<Poll> createdPollRef = pollService.createPoll(poll, choices, new PollenUIContext()); + PollenEntityRef<Poll> createdPollRef = pollService.createPoll(poll, choices); String pollId = createdPollRef.getEntityId(); diff --git a/pollen-services/src/test/java/org/chorem/pollen/services/service/VoterListServiceTest.java b/pollen-services/src/test/java/org/chorem/pollen/services/service/VoterListServiceTest.java index 76a3c9c..dcf6217 100644 --- a/pollen-services/src/test/java/org/chorem/pollen/services/service/VoterListServiceTest.java +++ b/pollen-services/src/test/java/org/chorem/pollen/services/service/VoterListServiceTest.java @@ -21,19 +21,14 @@ package org.chorem.pollen.services.service; * #L% */ -import com.google.common.base.Charsets; import com.google.common.collect.Sets; -import com.google.common.io.Files; import org.chorem.pollen.persistence.entity.ChoiceType; -import org.chorem.pollen.persistence.entity.FavoriteList; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollType; import org.chorem.pollen.persistence.entity.PollenUser; import org.chorem.pollen.persistence.entity.VoterList; import org.chorem.pollen.services.AbstractPollenServiceTest; -import org.chorem.pollen.services.PollenUIContext; import org.chorem.pollen.services.bean.ChoiceBean; -import org.chorem.pollen.services.bean.FavoriteListBean; import org.chorem.pollen.services.bean.PollBean; import org.chorem.pollen.services.bean.PollenEntityRef; import org.chorem.pollen.services.bean.VoterListBean; @@ -44,13 +39,11 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import java.io.File; -import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; -import java.util.Set; /** * Created on 6/6/14. @@ -88,65 +81,65 @@ public class VoterListServiceTest extends AbstractPollenServiceTest { user = application.fixture("user_jean"); } - @Test - public void importFavoriteList() throws FavoriteListImportException, InvalidFormException, IOException, PollenInvalidSessionTokenException, PollenAuthenticationException { - - login("jean@pollen.fake", "fake"); - - // create favorite list - - FavoriteListBean favoriteListBean1 = new FavoriteListBean(); - - favoriteListBean1.setName("list1"); - PollenEntityRef<FavoriteList> savedList1 = favoriteListService.createFavoriteList(favoriteListBean1); - Assert.assertNotNull(savedList1); - String favoriteListId = savedList1.getEntityId(); - Assert.assertNotNull(favoriteListId); - - // create import file - - File importFile = new File(application.getTestBasedir(), "importFavoriteListFromFile_" + System.nanoTime()); - Files.write(FavoriteListServiceTest.IMPORT_FILE_CONTENT, importFile, Charsets.UTF_8); - - // import file - - favoriteListService.importFavoriteListMembersFromCsv(favoriteListId, importFile); - - // create poll and voter list - - PollBean poll = pollService.getNewPoll(ChoiceType.TEXT); - - poll.setPollType(PollType.RESTRICTED); - poll.setTitle("poll1"); - poll.setParticipants(Sets.newHashSet()); - - List<ChoiceBean> choices = new ArrayList<>(); - - ChoiceBean choice1 = new ChoiceBean(); - choices.add(choice1); - choice1.setChoiceType(ChoiceType.TEXT); - choice1.setChoiceValue("A"); - choice1.setDescription("Choice A"); - - ChoiceBean choice2 = new ChoiceBean(); - choice2.setChoiceType(ChoiceType.TEXT); - choice2.setChoiceValue("B"); - choice2.setDescription("Choice B"); - choices.add(choice2); - - PollenEntityRef<Poll> createdPoll = pollService.createPoll(poll, choices, new PollenUIContext()); - Assert.assertNotNull(createdPoll); - - String pollId = createdPoll.getEntityId(); - - PollenEntityRef<VoterList> createdVoterList = voterListService.importFavoriteList(pollId, favoriteListId); - Assert.assertNotNull(createdVoterList); - - Set<VoterListMemberBean> voterListMembers = voterListService.getVoterListMembers(pollId, createdVoterList.getEntityId()); - Assert.assertNotNull(voterListMembers); - Assert.assertEquals(2, voterListMembers.size()); - - } +// @Test +// public void importFavoriteList() throws FavoriteListImportException, InvalidFormException, IOException, PollenInvalidSessionTokenException, PollenAuthenticationException { +// +// login("jean@pollen.fake", "fake"); +// +// // create favorite list +// +// FavoriteListBean favoriteListBean1 = new FavoriteListBean(); +// +// favoriteListBean1.setName("list1"); +// PollenEntityRef<FavoriteList> savedList1 = favoriteListService.createFavoriteList(favoriteListBean1); +// Assert.assertNotNull(savedList1); +// String favoriteListId = savedList1.getEntityId(); +// Assert.assertNotNull(favoriteListId); +// +// // create import file +// +// File importFile = new File(application.getTestBasedir(), "importFavoriteListFromFile_" + System.nanoTime()); +// Files.write(FavoriteListServiceTest.IMPORT_FILE_CONTENT, importFile, Charsets.UTF_8); +// +// // import file +// +// favoriteListService.importFavoriteListMembersFromCsv(favoriteListId, importFile); +// +// // create poll and voter list +// +// PollBean poll = pollService.getNewPoll(ChoiceType.TEXT); +// +// poll.setPollType(PollType.RESTRICTED); +// poll.setTitle("poll1"); +// poll.setParticipants(Sets.newHashSet()); +// +// List<ChoiceBean> choices = new ArrayList<>(); +// +// ChoiceBean choice1 = new ChoiceBean(); +// choices.add(choice1); +// choice1.setChoiceType(ChoiceType.TEXT); +// choice1.setChoiceValue("A"); +// choice1.setDescription("Choice A"); +// +// ChoiceBean choice2 = new ChoiceBean(); +// choice2.setChoiceType(ChoiceType.TEXT); +// choice2.setChoiceValue("B"); +// choice2.setDescription("Choice B"); +// choices.add(choice2); +// +// PollenEntityRef<Poll> createdPoll = pollService.createPoll(poll, choices); +// Assert.assertNotNull(createdPoll); +// +// String pollId = createdPoll.getEntityId(); +// +// PollenEntityRef<VoterList> createdVoterList = voterListService.importFavoriteList(pollId, favoriteListId); +// Assert.assertNotNull(createdVoterList); +// +// Set<VoterListMemberBean> voterListMembers = voterListService.getVoterListMembers(pollId, createdVoterList.getEntityId()); +// Assert.assertNotNull(voterListMembers); +// Assert.assertEquals(2, voterListMembers.size()); +// +// } @Test public void createVoterList() throws InvalidFormException, PollenInvalidSessionTokenException, PollenAuthenticationException { @@ -173,14 +166,14 @@ public class VoterListServiceTest extends AbstractPollenServiceTest { choice2.setDescription("Choice B"); choices.add(choice2); - PollenEntityRef<Poll> createdPoll = pollService.createPoll(poll, choices, new PollenUIContext()); + PollenEntityRef<Poll> createdPoll = pollService.createPoll(poll, choices); Assert.assertNotNull(createdPoll); String pollId = createdPoll.getEntityId(); VoterListBean voterList = new VoterListBean(); try { - voterListService.addVoterList(pollId, voterList, null, new PollenUIContext()); + voterListService.addVoterList(pollId, voterList, Collections.emptyList()); Assert.fail(); } catch (InvalidFormException e) { // missing name @@ -190,7 +183,7 @@ public class VoterListServiceTest extends AbstractPollenServiceTest { } voterList.setWeight(1); try { - voterListService.addVoterList(pollId, voterList, null, new PollenUIContext()); + voterListService.addVoterList(pollId, voterList, Collections.emptyList()); Assert.fail(); } catch (InvalidFormException e) { // missing name @@ -200,7 +193,7 @@ public class VoterListServiceTest extends AbstractPollenServiceTest { voterList.setName("voterList1"); List<VoterListMemberBean> listMember = new ArrayList<>(); try { - voterListService.addVoterList(pollId, voterList, listMember, new PollenUIContext()); + voterListService.addVoterList(pollId, voterList, listMember); Assert.fail(); } catch (InvalidFormException e) { // missing member @@ -212,7 +205,7 @@ public class VoterListServiceTest extends AbstractPollenServiceTest { member.setWeight(1); listMember.add(member); - PollenEntityRef<VoterList> voterListPersisted = voterListService.addVoterList(pollId, voterList, listMember, new PollenUIContext()); + PollenEntityRef<VoterList> voterListPersisted = voterListService.addVoterList(pollId, voterList, listMember); Assert.assertNotNull(voterListPersisted); } diff --git a/pollen-ui-riot-js/src/main/web/js/FetchService.js b/pollen-ui-riot-js/src/main/web/js/FetchService.js index 9aeec9a..5c81334 100644 --- a/pollen-ui-riot-js/src/main/web/js/FetchService.js +++ b/pollen-ui-riot-js/src/main/web/js/FetchService.js @@ -32,6 +32,7 @@ class FetchService { if (!(body instanceof FormData)) { headers["Content-Type"] = "application/json;charset=UTF-8"; } + headers["X-Pollen-UI-context"] = JSON.stringify(require("./Session").pollenUIContext); let loadEvent = {}; bus.trigger("loading", loadEvent); -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.