r3920 - in trunk: pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity pollen-persistence/src/main/xmi pollen-rest-api/src/main/java/org/chorem/pollen/rest/api pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1 pollen-rest-api/src/main/resources pollen-rest-api/src/test/java/org/chorem/pollen/rest/api pollen-services/src/main/java/org/chorem/pollen/services/service pollen-services/src/main/java/org/chorem/pollen/services/service/security pollen-services/src/main/re
Author: tchemit Date: 2014-05-07 17:49:33 +0200 (Wed, 07 May 2014) New Revision: 3920 Url: http://forge.chorem.org/projects/pollen/repository/revisions/3920 Log: improve conversions and lots of stuff... to be continued... Added: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java Modified: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollTopiaDao.java trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/Polls.java trunk/pollen-persistence/src/main/xmi/pollen.zargo trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/Jsons.java trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityConverter.java trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java trunk/pollen-rest-api/src/main/resources/mapping trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityConverterTest.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ChoiceService.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/CommentService.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java trunk/pollen-services/src/main/resources/fixtures.yaml trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java Added: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java =================================================================== --- trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java (rev 0) +++ trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -0,0 +1,17 @@ +package org.chorem.pollen.persistence.entity; + +import com.google.common.collect.ImmutableList; + +import java.util.List; + +public class ChoiceTopiaDao extends AbstractChoiceTopiaDao<Choice> { + + public List<Choice> findAll(Poll poll) { + + List<Choice> choices = forPollEquals(poll). + setOrderByArguments(Choice.PROPERTY_CHOICE_ORDER). + findAll(); + return ImmutableList.copyOf(choices); + + } +} Property changes on: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollTopiaDao.java =================================================================== --- trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollTopiaDao.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollTopiaDao.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -26,6 +26,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; +import java.util.List; import java.util.Set; /** @@ -51,7 +52,52 @@ public Set<Poll> findAllFreePolls() { - return ImmutableSet.copyOf(forPollTypeEquals(PollType.FREE).findAll()); + List<Poll> polls = forPollTypeEquals(PollType.FREE).findAll(); + return ImmutableSet.copyOf(polls); } + + @Override + public void delete(Poll entity) { + + + { // --- remove choices --- // + + ChoiceTopiaDao dao = topiaDaoSupplier + .getDao(Choice.class, ChoiceTopiaDao.class); + List<Choice> list = dao.forPollEquals(entity).findAll(); + dao.deleteAll(list); + + } + + { // --- remove votes --- // + + VoteTopiaDao dao = topiaDaoSupplier + .getDao(Vote.class, VoteTopiaDao.class); + List<Vote> list = dao.forPollEquals(entity).findAll(); + dao.deleteAll(list); + + } + + { // --- remove comments -- // + + CommentTopiaDao dao = topiaDaoSupplier + .getDao(Comment.class, CommentTopiaDao.class); + List<Comment> list = dao.forPollEquals(entity).findAll(); + dao.deleteAll(list); + + } + + { // --- remove voterLists --- // + + VoterListTopiaDao dao = topiaDaoSupplier + .getDao(VoterList.class, VoterListTopiaDao.class); + List<VoterList> list = dao.forPollEquals(entity).findAll(); + dao.deleteAll(list); + + } + + super.delete(entity); + + } } Modified: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/Polls.java =================================================================== --- trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/Polls.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/Polls.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -23,11 +23,8 @@ * #L% */ -import com.google.common.collect.Sets; - import java.util.Date; import java.util.Objects; -import java.util.Set; /** * TODO @@ -85,16 +82,16 @@ (endChoiceDate != null && endChoiceDate.before(currentDate)); } - public static Set<VoterListMember> getAllVoters(Poll poll) { - Set<VoterListMember> result = Sets.newHashSet(); - if (poll.isVoterListNotEmpty()) { - for (VoterList list : poll.getVoterList()) { - - if (!list.isMemberEmpty()) { - result.addAll(list.getMember()); - } - } - } - return result; - } +// public static Set<VoterListMember> getAllVoters(Poll poll) { +// Set<VoterListMember> result = Sets.newHashSet(); +// if (poll.isVoterListNotEmpty()) { +// for (VoterList list : poll.getVoterList()) { +// +// if (!list.isMemberEmpty()) { +// result.addAll(list.getMember()); +// } +// } +// } +// return result; +// } } Modified: trunk/pollen-persistence/src/main/xmi/pollen.zargo =================================================================== (Binary files differ) Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/Jsons.java =================================================================== --- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/Jsons.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/Jsons.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -1,6 +1,7 @@ package org.chorem.pollen.rest.api; import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; @@ -45,4 +46,10 @@ } + public static String entitiesToString(Object o) throws JsonProcessingException { + + return newEntityMapper().writeValueAsString(o); + + } + } Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java =================================================================== --- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -48,30 +48,14 @@ // --- init converters --- // -// serverContext.addConverter(new Converter() { -// @Override -// public Object convert(Class type, Object value) { -// Object result = null; -// if (value != null) { -// if (value.getClass().isAssignableFrom(Date.class)) { -// result = value; -// } else { -// Object o = ((Object[]) value)[0]; -// String sTime = o.toString(); -// Long time = Long.parseLong(sTime); -// result = new Date(time); -// } -// } -// return result; -// } -// -// }, Date.class); - for (Class<? extends TopiaEntity> entityClass : PollenEntityEnum.getContractClasses()) { TopiaEntityConverter<? extends TopiaEntity> converter = TopiaEntityConverter.newconverter(entityClass); serverContext.addConverter(converter, entityClass); + TopiaEntityArrayConverter<? extends TopiaEntity> arrayConverter = TopiaEntityArrayConverter.newconverter(entityClass); + serverContext.addConverter(arrayConverter, arrayConverter.getDefaultType()); + } // --- init injectors --- // Added: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java =================================================================== --- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java (rev 0) +++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -0,0 +1,67 @@ +package org.chorem.pollen.rest.api; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.beanutils.converters.AbstractConverter; +import org.chorem.pollen.services.PollenTechnicalException; +import org.nuiton.topia.persistence.TopiaEntity; + +import java.io.IOException; +import java.lang.reflect.Array; + +/** + * Created on 5/7/14. + * + * @author Tony Chemit <chemit@codelutin.com> + * @since 2.0 + */ +public class TopiaEntityArrayConverter<E extends TopiaEntity> extends AbstractConverter { + + protected final Class<E[]> type; + + protected final ObjectMapper mapper; + + + public static <E extends TopiaEntity> TopiaEntityArrayConverter<E> newconverter(Class<E> entityType) { + return new TopiaEntityArrayConverter<>(entityType); + } + + public TopiaEntityArrayConverter(Class<E> entityType) { + this.type = getArrayClass(entityType); + this.mapper = Jsons.newEntityMapper(); + } + + <T> Class<T[]> getArrayClass(Class<T> clazz) { + return (Class<T[]>) Array.newInstance(clazz, 0).getClass(); + } + + @Override + protected <T> T convertToType(Class<T> type, Object value) throws Throwable { + + String stringValue; + + if (value instanceof String) { + + stringValue = (String) value; + + } else { + + stringValue = ((String[]) value)[0]; + + } + + try { + + E[] values = mapper.readValue(stringValue, this.type); + return (T) values; + + } catch (IOException e) { + throw new PollenTechnicalException("Could not convert " + stringValue + " to " + type.getName(), e); + } + + } + + @Override + protected Class<?> getDefaultType() { + return type; + } +} Property changes on: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityConverter.java =================================================================== --- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityConverter.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityConverter.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -1,7 +1,5 @@ package org.chorem.pollen.rest.api; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import org.apache.commons.beanutils.converters.AbstractConverter; Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java =================================================================== --- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -23,13 +23,17 @@ * #L% */ +import com.google.common.collect.Lists; +import org.chorem.pollen.persistence.entity.Choice; import org.chorem.pollen.persistence.entity.Poll; +import org.chorem.pollen.persistence.entity.VoterList; import org.chorem.pollen.services.service.InvalidFormException; import org.chorem.pollen.services.service.PollService; import org.chorem.pollen.services.service.PollenPrincipalRef; import org.debux.webmotion.server.WebMotionController; import java.io.File; +import java.util.List; import java.util.Set; /** @@ -82,9 +86,21 @@ } - public PollenPrincipalRef<Poll> createPoll(PollService pollService, Poll poll) throws InvalidFormException { + public PollenPrincipalRef<Poll> createPoll(PollService pollService, Poll poll, Choice[] choices, VoterList[] voterLists) throws InvalidFormException { - Poll createdPoll = pollService.createPoll(poll); + List<Choice> choiceList = null; + + if (choices != null && choices.length > 0) { + choiceList = Lists.newArrayList(choices); + } + + List<VoterList> voterListList = null; + + if (voterLists != null && voterLists.length > 0) { + voterListList = Lists.newArrayList(voterLists); + } + + Poll createdPoll = pollService.createPoll(poll, choiceList, voterListList); PollenPrincipalRef<Poll> principalRef = PollenPrincipalRef.newRef(createdPoll); return principalRef; Modified: trunk/pollen-rest-api/src/main/resources/mapping =================================================================== --- trunk/pollen-rest-api/src/main/resources/mapping 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-rest-api/src/main/resources/mapping 2014-05-07 15:49:33 UTC (rev 3920) @@ -71,6 +71,7 @@ GET /v1/polls/participated PollApi.getParticipatedPolls POST /v1/polls PollApi.createPoll GET /v1/polls/create PollApi.createPoll +GET /v1/polls/edit PollApi.editPoll PUT /v1/polls/{pollId} PollApi.editPoll GET /v1/polls/{pollId} PollApi.getPoll DELETE /v1/polls/{pollId} PollApi.deletePoll Modified: trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java =================================================================== --- trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -38,6 +38,8 @@ import java.io.IOException; import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; import static org.junit.Assert.assertNotNull; @@ -122,21 +124,23 @@ poll.setVoteVisibility(VoteVisibility.EVERYBODY); poll.setVoteCountingType(1); poll.setTitle("title"); + + List<Choice> choices = new ArrayList<>(); Choice choice1 = new ChoiceImpl(); choice1.setChoiceType(ChoiceType.TEXT); choice1.setName("choiceA"); - poll.addChoice(choice1); + choices.add(choice1); Choice choice2 = new ChoiceImpl(); choice2.setChoiceType(ChoiceType.TEXT); choice2.setName("choiceB"); - poll.addChoice(choice2); + choices.add(choice2); - TopiaEntityConverter<Poll> converter = TopiaEntityConverter.newconverter(Poll.class); + String choiceStr = Jsons.entitiesToString(choices); + String pollStr = Jsons.entitiesToString(poll); - String strPoll = converter.convertToString(poll); - Request request = createRequest("/v1/polls") - .addParameter("poll", strPoll) + .addParameter("poll", pollStr) + .addParameter("choices", choiceStr) .Post(); String content = request.execute().returnContent().asString(); Added: trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java =================================================================== --- trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java (rev 0) +++ trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -0,0 +1,23 @@ +package org.chorem.pollen.rest.api; + +import org.chorem.pollen.persistence.entity.Choice; +import org.junit.Assert; +import org.junit.Test; + +public class TopiaEntityArrayConverterTest { + + @Test + public void convertToType() throws Exception { + + String choicesStr = "[ {name: \"choice1\", choiceType: \"TEXT\"}, " + + "{name: \"choice2\", choiceType: \"IMAGE\"} ]"; + + TopiaEntityArrayConverter converter = TopiaEntityArrayConverter.newconverter(Choice.class); + + TopiaEntityList<Choice> choices = converter.convert(TopiaEntityList.class, choicesStr); + Assert.assertNotNull(choices); + Assert.assertEquals(2, choices.size()); + + + } +} \ No newline at end of file Property changes on: trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityConverterTest.java =================================================================== --- trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityConverterTest.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityConverterTest.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -1,6 +1,5 @@ package org.chorem.pollen.rest.api; -import org.chorem.pollen.persistence.entity.ChoiceType; import org.chorem.pollen.persistence.entity.CommentVisibility; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollType; @@ -27,11 +26,11 @@ Assert.assertEquals(VoteVisibility.ANONYMOUS, poll.getVoteVisibility()); Assert.assertEquals(CommentVisibility.NOBODY, poll.getCommentVisibility()); Assert.assertEquals(PollType.FREE, poll.getPollType()); - Assert.assertEquals(2, poll.sizeChoice()); - Assert.assertEquals("choice1", poll.getChoice(0).getName()); - Assert.assertEquals(ChoiceType.TEXT, poll.getChoice(0).getChoiceType()); - Assert.assertEquals("choice2", poll.getChoice(1).getName()); - Assert.assertEquals(ChoiceType.IMAGE, poll.getChoice(1).getChoiceType()); +// Assert.assertEquals(2, poll.sizeChoice()); +// Assert.assertEquals("choice1", poll.getChoice(0).getName()); +// Assert.assertEquals(ChoiceType.TEXT, poll.getChoice(0).getChoiceType()); +// Assert.assertEquals("choice2", poll.getChoice(1).getName()); +// Assert.assertEquals(ChoiceType.IMAGE, poll.getChoice(1).getChoiceType()); String convert = converter.convert(String.class, poll); Assert.assertNotNull(convert); Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ChoiceService.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ChoiceService.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ChoiceService.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -24,8 +24,10 @@ */ import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; +import org.apache.commons.collections4.CollectionUtils; import org.chorem.pollen.persistence.entity.Choice; import org.chorem.pollen.persistence.entity.ChoiceTopiaDao; import org.chorem.pollen.persistence.entity.Poll; @@ -49,7 +51,8 @@ Poll poll = getPollService().getPoll(pollId); - return poll.getChoice(); + List<Choice> choices = getChoiceDao().findAll(poll); + return ImmutableList.copyOf(choices); } @@ -74,9 +77,14 @@ checkPermission(PermissionVerb.editPoll, pollId); Poll poll = getPollService().getPoll(pollId); + List<Choice> existingChoices = getChoiceDao().findAll(poll); - checkChoiceForm(poll, choice); + ErrorMap errorMap = checkChoice(existingChoices, choice); + errorMap.failIfNotEmpty(); + // set the choice order + choice.setChoiceOrder(existingChoices.size()); + Choice result = saveChoice(poll, choice); getPollDao().update(poll); @@ -94,8 +102,10 @@ checkPermission(PermissionVerb.editChoice, choice.getTopiaId()); Poll poll = getPollService().getPoll(pollId); + List<Choice> existingChoices = getChoiceDao().findAll(poll); - checkChoiceForm(poll, choice); + ErrorMap errorMap = checkChoice(existingChoices, choice); + errorMap.failIfNotEmpty(); Choice result = saveChoice(poll, choice); @@ -116,9 +126,7 @@ Poll poll = getPollService().getPoll(pollId); Choice choice = getChoice(poll, choiceId); - poll.removeChoice(choice); - - getPollDao().update(poll); + getChoiceDao().delete(choice); commit(); //TODO Notify Choice deleted @@ -128,9 +136,9 @@ Choice result = getChoiceDao().findByTopiaId(choiceId); - if (!poll.containsChoice(result)) { + if (!poll.equals(result.getPoll())) { - throw new InvalidEntityLinkException(Poll.PROPERTY_CHOICE, poll, result); + throw new InvalidEntityLinkException(Choice.PROPERTY_POLL, result, poll); } @@ -150,10 +158,11 @@ // get existing choice choiceToPersist = getChoice(poll, choice.getTopiaId()); + } else { // create a new choice - choiceToPersist = choiceDao.newInstance(); + choiceToPersist = choiceDao.create(); // create a new principal PollenPrincipal principal = getSecurityService().generatePollenPrincipal(); @@ -166,7 +175,9 @@ choiceToPersist.setChoiceType(choice.getChoiceType()); choiceToPersist.setCreator(principal); - poll.addChoice(choiceToPersist); + choiceToPersist.setPoll(poll); + choiceToPersist.setChoiceOrder(choice.getChoiceOrder()); + } switch (choiceToPersist.getChoiceType()) { @@ -188,21 +199,80 @@ } - protected void checkChoiceForm(Poll poll, Choice choice) throws InvalidFormException { +// protected void checkChoiceForm(List<Choice> existingChoices, Choice choice) throws InvalidFormException { +// +// //TODO use nuiton validator ? +// Multimap<String, String> errors = ArrayListMultimap.create(); +// +// boolean choiceExists = choice.isPersisted(); +// +// Set<String> choiceNames = Sets.newHashSet(); +// +// checkNotNull(errors, "choiceType", choice.getChoiceType(), "choiceType can not be null"); +// +// if (CollectionUtils.isNotEmpty(existingChoices)) { +// +// // get all used names +// +// for (Choice choice1 : existingChoices) { +// +// if (choiceExists && +// choice1.getTopiaId().equals(choice.getTopiaId())) { +// continue; +// } +// choiceNames.add(choice1.getName()); +// +// } +// } +// +// switch (choice.getChoiceType()) { +// +// case TEXT: +// +// String choiceName = choice.getName(); +// boolean nameNotBlank = checkNotBlank(errors, +// "name", +// choiceName, +// "choice name can not be empty"); +// +// if (nameNotBlank) { +// boolean nameAdded = choiceNames.add(choiceName); +// check(errors, "name", nameAdded, "choice name already used in this list"); +// } +// +// break; +// case DATE: +// +// throw new IllegalStateException("Not implemented"); +// +// case IMAGE: +// +// throw new IllegalStateException("Not implemented"); +// } +// +// if (!errors.isEmpty()) { +// +// throw new InvalidFormException(errors); +// +// } +// +// } - //TODO use nuiton validator ? - Multimap<String, String> errors = ArrayListMultimap.create(); + protected ErrorMap checkChoice(List<Choice> existingChoices, Choice choice) { + ErrorMap errors = new ErrorMap(); + boolean choiceExists = choice.isPersisted(); Set<String> choiceNames = Sets.newHashSet(); - checkNotNull(errors, "choiceType", choice.getChoiceType(), "choiceType can not be null"); - if (!poll.isChoiceEmpty()) { + boolean withChoiceType = checkNotNull(errors, "choiceType", choice.getChoiceType(), "choiceType can not be null"); + if (CollectionUtils.isNotEmpty(existingChoices)) { + // get all used names - for (Choice choice1 : poll.getChoice()) { + for (Choice choice1 : existingChoices) { if (choiceExists && choice1.getTopiaId().equals(choice.getTopiaId())) { @@ -213,36 +283,37 @@ } } - switch (choice.getChoiceType()) { + if (withChoiceType) { - case TEXT: + switch (choice.getChoiceType()) { - String choiceName = choice.getName(); - boolean nameNotBlank = checkNotBlank(errors, - "name", - choiceName, - "choice name can not be empty"); + case TEXT: - if (nameNotBlank) { - boolean nameAdded = choiceNames.add(choiceName); - check(errors, "name", nameAdded, "choice name already used in this list"); - } + String choiceName = choice.getName(); + boolean nameNotBlank = checkNotBlank(errors, + "name", + choiceName, + "choice name can not be empty"); - break; - case DATE: + if (nameNotBlank) { + boolean nameAdded = choiceNames.add(choiceName); + check(errors, "name", nameAdded, "choice name already used in this list"); + } - throw new IllegalStateException("Not implemented"); + break; + case DATE: - case IMAGE: + throw new IllegalStateException("Not implemented"); - throw new IllegalStateException("Not implemented"); - } + case IMAGE: - if (!errors.isEmpty()) { + throw new IllegalStateException("Not implemented"); - throw new InvalidFormException(errors); - + } } + return errors; + } + } Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/CommentService.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/CommentService.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/CommentService.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -24,6 +24,7 @@ */ import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import org.apache.commons.lang3.StringUtils; import org.chorem.pollen.persistence.entity.Comment; @@ -46,7 +47,8 @@ checkNotNull(pollId); Poll poll = getPollService().getPoll(pollId); - return poll.getComment(); + List<Comment> comments = getCommentDao().forPollEquals(poll).findAll(); + return ImmutableList.copyOf(comments); } @@ -113,9 +115,7 @@ Comment comment = getComment(poll, commentId); - poll.removeComment(comment); - - getPollDao().update(poll); + getCommentDao().delete(comment); commit(); } @@ -124,9 +124,9 @@ Comment result = getCommentDao().findByTopiaId(commentId); - if (!poll.containsComment(result)) { + if (!poll.equals(result.getPoll())) { - throw new InvalidEntityLinkException(Poll.PROPERTY_COMMENT, poll, result); + throw new InvalidEntityLinkException(Comment.PROPERTY_POLL, result, poll); } @@ -174,9 +174,8 @@ PollenPrincipal author = getSecurityService().generatePollenPrincipal(); toSave.setAuthor(author); + toSave.setPoll(poll); - poll.addComment(toSave); - } toSave.setText(comment.getText()); Added: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java (rev 0) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -0,0 +1,64 @@ +package org.chorem.pollen.services.service; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; + +import java.util.Collection; + +/** + * Created on 5/7/14. + * + * @author Tony Chemit <chemit@codelutin.com> + * @since 2.0 + */ +public class ErrorMap { + + protected Multimap<String, String> errors; + + public ErrorMap() { + + errors = ArrayListMultimap.create(); + + } + + public void addError(String key, String error) { + + errors.put(key, error); + + } + + public void addErrors(String key, Iterable<String> error) { + + errors.putAll(key, error); + + } + + public void copyTo(ErrorMap errorMap, String prefix) { + + for (String key : errors.keySet()) { + + Collection<String> errors = this.errors.get(key); + + errorMap.addErrors(prefix + key, errors); + } + + } + + public boolean isEmpty() { + + return errors.isEmpty(); + + } + + public Multimap<String, String> getErrors() { + return errors; + } + + public void failIfNotEmpty() throws InvalidFormException { + + if (!errors.isEmpty()) { + + throw new InvalidFormException(errors); + } + } +} Property changes on: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -29,6 +29,7 @@ import org.apache.commons.logging.LogFactory; import org.chorem.pollen.persistence.PollenPersistenceContext; import org.chorem.pollen.persistence.PollenTopiaApplicationContext; +import org.chorem.pollen.persistence.entity.Choice; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollenUser; import org.chorem.pollen.persistence.entity.PollenUserTopiaDao; @@ -37,6 +38,7 @@ import org.chorem.pollen.services.service.security.SecurityService; import java.util.Collection; +import java.util.List; import java.util.Map; public class FixturesService extends PollenServiceSupport { @@ -102,14 +104,15 @@ PollService pollService = newService(PollService.class); Collection<Poll> polls = fixtures.fixture("polls"); + List<Choice> choices= fixtures.fixture("choices"); for (Poll poll : polls) { try { - Poll createdPoll = pollService.createPoll(poll); + Poll createdPoll = pollService.createPoll(poll, choices, null); poll.setTopiaId(createdPoll.getTopiaId()); poll.setCreator(createdPoll.getCreator()); - poll.setChoice(createdPoll.getChoice()); +// poll.setChoice(createdPoll.getChoice()); } catch (InvalidFormException e) { throw new PollenTechnicalException(e); } Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -23,23 +23,18 @@ * #L% */ -import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Lists; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.collections4.CollectionUtils; import org.chorem.pollen.persistence.entity.Choice; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollenPrincipal; import org.chorem.pollen.persistence.entity.PollenUser; import org.chorem.pollen.persistence.entity.Polls; import org.chorem.pollen.persistence.entity.VoterList; -import org.chorem.pollen.persistence.entity.VoterListMember; import org.chorem.pollen.services.service.security.PermissionVerb; import java.io.File; -import java.util.HashSet; +import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -130,21 +125,22 @@ creator.setEmail(connectedUser.getEmail()); } - result.setChoice(Lists.<Choice>newArrayList()); - result.setVoterList(Lists.<VoterList>newArrayList()); - return result; } - public Poll createPoll(Poll poll) throws InvalidFormException { + public Poll createPoll(Poll poll, List<Choice> choices, List<VoterList> voterLists) throws InvalidFormException { checkNotNull(poll); checkIsNotPersisted(poll); - checkPollForm(poll); - Poll savedPoll = savePoll(poll); + ErrorMap errorMap = checkPoll(poll); + checkChoices(errorMap, choices); + checkvoterLists(errorMap, poll, voterLists); + errorMap.failIfNotEmpty(); + Poll savedPoll = savePoll(poll, choices, voterLists); + getPollDao().create(savedPoll); commit(); @@ -159,10 +155,12 @@ checkNotNull(poll); checkIsPersisted(poll); checkPermission(PermissionVerb.editPoll, poll.getTopiaId()); - checkPollForm(poll); - Poll savedPoll = savePoll(poll); + ErrorMap errorMap = checkPoll(poll); + errorMap.failIfNotEmpty(); + Poll savedPoll = savePoll(poll, null, null); + getPollDao().update(savedPoll); commit(); @@ -228,19 +226,23 @@ } - protected Poll savePoll(Poll poll) { + protected Poll savePoll(Poll poll, List<Choice> choices, List<VoterList> voterLists) { boolean pollExists = poll.isPersisted(); + List<Choice> existingChoices; + Poll toSave; if (pollExists) { toSave = getPoll(poll.getTopiaId()); + existingChoices = getChoiceDao().findAll(poll); } else { toSave = getPollDao().newInstance(); + existingChoices = new ArrayList<>(); PollenPrincipal creatorToPersist = getSecurityService().generatePollenPrincipal(); @@ -290,20 +292,29 @@ // -- choice -- // - for (Choice choice : poll.getChoice()) { + if (CollectionUtils.isNotEmpty(choices)) { - getChoiceService().saveChoice(toSave, choice); + ChoiceService choiceService = getChoiceService(); + for (Choice choice : choices) { + + choice.setChoiceOrder(existingChoices.size()); + Choice persistedChoice = choiceService.saveChoice(toSave, choice); + existingChoices.add(persistedChoice); + + } } // -- voting list -- // - if (!poll.isVoterListEmpty()) { + if (CollectionUtils.isNotEmpty(voterLists)) { - for (VoterList voterList : poll.getVoterList()) { + VoterListService voterListService = getVoterListService(); - getVoterListService().saveVoterList(toSave, voterList); + for (VoterList voterList : voterLists) { + voterListService.saveVoterList(toSave, voterList); + } } @@ -311,10 +322,152 @@ } - protected void checkPollForm(Poll poll) throws InvalidFormException { +// protected void checkPollForm(Poll poll, List<Choice> choices, List<VoterList> voterLists) throws InvalidFormException { +// +// //TODO use nuiton validator ? +// Multimap<String, String> errors = ArrayListMultimap.create(); +// +// checkNotNull(errors, Poll.PROPERTY_POLL_TYPE, poll.getPollType(), "pollType can not be null"); +// checkNotNull(errors, Poll.PROPERTY_COMMENT_VISIBILITY, poll.getCommentVisibility(), "commentVisibility can not be null"); +// checkNotNull(errors, Poll.PROPERTY_VOTE_VISIBILITY, poll.getVoteVisibility(), "voteVisibility can not be null"); +// checkNotNull(errors, Poll.PROPERTY_VOTE_COUNTING_TYPE, poll.getVoteCountingType(), "voteCountingType can not be null"); +// +// checkNotBlank(errors, Poll.PROPERTY_TITLE, poll.getTitle(), "title can not be empty"); +// +// if (!poll.isPersisted()) { +// +// // check choices +// checkNotEmpty(errors, "choice", choices, "need at least one choice"); +// +// if (CollectionUtils.isNotEmpty(choices)) { +// +// // validate choices +// +// Set<String> choiceNames = new HashSet<>(); +// int choiceIndex = 0; +// +// for (Choice choice : choices) { +// +// String choiceField = "choice" + "[" + (choiceIndex++) + "]."; +// +// checkNotNull(errors, +// choiceField + Choice.PROPERTY_CHOICE_TYPE, +// choice.getChoiceType(), +// "choiceType can not be null"); +// if (choice.getChoiceType() != null) { +// switch (choice.getChoiceType()) { +// +// case TEXT: +// +// boolean checkNotBlank = checkNotBlank(errors, +// choiceField + Choice.PROPERTY_NAME, +// choice.getName(), +// "choice name can not be empty"); +// +// if (checkNotBlank) { +// +// // check duplicated name +// +// check(errors, +// choiceField + Choice.PROPERTY_NAME, +// choiceNames.add(choice.getName()), +// "Duplicated choice name"); +// } +// break; +// case DATE: +// throw new IllegalStateException("Not implemented"); +// +// case IMAGE: +// throw new IllegalStateException("Not implemented"); +// } +// } +// } +// } +// +// +// // check voter lists +// +// if (Polls.isPollFree(poll)) { +// checkEmpty(errors, "voterList", voterLists, "can't have voterList with free poll"); +// } else if (Polls.isPollRestricted(poll)) { +// check(errors, "voterList", voterLists != null && 1 == voterLists.size(), "must have a unique voterList with a resitricted poll"); +// } else if (Polls.isPollGroup(poll)) { +// checkNotEmpty(errors, "voterList", voterLists, "must have at least one voterList with a group poll"); +// } +// +// +// if (CollectionUtils.isNotEmpty(voterLists)) { +// +// Set<String> voterListNames = Sets.newHashSet(); +// +// // validate voter lists +// +// int voterListIndex = 0; +// +// for (VoterList voterList : voterLists) { +// +// String voterListField = "voterList" + "[" + (voterListIndex++) + "]."; +// +// boolean notBlankName = checkNotBlank(errors, voterListField + VoterList.PROPERTY_NAME, voterList.getName(), "voterList name can not be empty"); +// +// if (notBlankName) { +// boolean added = voterListNames.add(voterList.getName()); +// +// check(errors, voterListField + VoterList.PROPERTY_NAME, added, "voterList name already used"); +// } +// check(errors, voterListField + VoterList.PROPERTY_WEIGHT, voterList.getWeight() > 0, "voterList weight must be greater than 0"); +// boolean withMember = checkNotEmpty(errors, voterListField + VoterList.PROPERTY_MEMBER, voterList.getMember(), "voterList must contains at least one member"); +// +// if (withMember) { +// Set<String> voterListMemberNames = Sets.newHashSet(); +// Set<String> voterListMemberEmails = Sets.newHashSet(); +// +// int voterListMemberIndex = 0; +// +// for (VoterListMember voterListMember : voterList.getMember()) { +// +// String voterListMemberField = voterListField + VoterList.PROPERTY_MEMBER + "[" + (voterListMemberIndex++) + "]."; +// +// String voterListMemberName = voterListMember.getName(); +// boolean nameNotNull = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, voterListMemberName, "member name can not be empty"); +// +// if (nameNotNull) { +// boolean nameAdded = voterListMemberNames.add(voterListMemberName); +// check(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, nameAdded, "member name already used in this list"); +// } +// +// String voterListMemberEmail = voterListMember.getEmail(); +// +// boolean emailNotNull = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email can not be empty"); +// +// if (emailNotNull) { +// +// voterListMemberEmail = StringUtils.lowerCase(voterListMemberEmail); +// +// checkValidEmail(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email is not valid"); +// boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail); +// check(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, emailAdded, "member email already used in this list"); +// } +// +// check(errors, voterListMemberField + VoterListMember.PROPERTY_WEIGHT, voterListMember.getWeight() > 0, "member weight must be greater than 0"); +// } +// } +// } +// } +// } +// +// if (!errors.isEmpty()) { +// +// throw new InvalidFormException(errors); +// +// } +// +// } + protected ErrorMap checkPoll(Poll poll) { + //TODO use nuiton validator ? - Multimap<String, String> errors = ArrayListMultimap.create(); + ErrorMap errors = new ErrorMap(); checkNotNull(errors, Poll.PROPERTY_POLL_TYPE, poll.getPollType(), "pollType can not be null"); checkNotNull(errors, Poll.PROPERTY_COMMENT_VISIBILITY, poll.getCommentVisibility(), "commentVisibility can not be null"); @@ -322,124 +475,70 @@ checkNotNull(errors, Poll.PROPERTY_VOTE_COUNTING_TYPE, poll.getVoteCountingType(), "voteCountingType can not be null"); checkNotBlank(errors, Poll.PROPERTY_TITLE, poll.getTitle(), "title can not be empty"); - checkNotEmpty(errors, Poll.PROPERTY_CHOICE, poll.getChoice(), "need at least one choice"); - if (Polls.isPollFree(poll)) { - checkEmpty(errors, Poll.PROPERTY_VOTER_LIST, poll.getVoterList(), "can't have voterList with free poll"); - } else if (Polls.isPollRestricted(poll)) { - check(errors, Poll.PROPERTY_VOTER_LIST, 1 == poll.sizeVoterList(), "must have a unique voterList with a resitricted poll"); - } else if (Polls.isPollGroup(poll)) { - checkNotEmpty(errors, Poll.PROPERTY_VOTER_LIST, poll.getVoterList(), "must have at least one voterList with a group poll"); - } + return errors; - if (!poll.isChoiceEmpty()) { + } - // validate choices - Set<String> choiceNames = new HashSet<>(); - int choiceIndex = 0; + protected void checkChoices(ErrorMap errorMap, List<Choice> choices) { - for (Choice choice : poll.getChoice()) { + boolean choicesNotEmpty = CollectionUtils.isNotEmpty(choices); - String choiceField = Poll.PROPERTY_CHOICE + "[" + (choiceIndex++) + "]."; + check(errorMap, "choice", choicesNotEmpty, "need at least one choice"); - checkNotNull(errors, - choiceField + Choice.PROPERTY_CHOICE_TYPE, - choice.getChoiceType(), - "choiceType can not be null"); - if (choice.getChoiceType() != null) { - switch (choice.getChoiceType()) { + if (choicesNotEmpty) { - case TEXT: + List<Choice> existingChoices = new ArrayList<>(); - boolean checkNotBlank = checkNotBlank(errors, - choiceField + Choice.PROPERTY_NAME, - choice.getName(), - "choice name can not be empty"); + for (int i = 0; i < choices.size(); i++) { - if (checkNotBlank) { + Choice choice = choices.get(i); - // check duplicated name + ErrorMap choiceErrors = getChoiceService().checkChoice(existingChoices, choice); + choiceErrors.copyTo(errorMap, "choice[" + i + "]."); - check(errors, - choiceField + Choice.PROPERTY_NAME, - choiceNames.add(choice.getName()), - "Duplicated choice name"); - } - break; - case DATE: - throw new IllegalStateException("Not implemented"); + existingChoices.add(choice); - case IMAGE: - throw new IllegalStateException("Not implemented"); - } - } } + } + } - if (!poll.isVoterListEmpty()) { + protected void checkvoterLists(ErrorMap errorMap, Poll poll, List<VoterList> voterLists) { - Set<String> voterListNames = Sets.newHashSet(); + boolean voterListsNotEmpty = CollectionUtils.isNotEmpty(voterLists); - // validate voter lists + if (Polls.isPollFree(poll)) { - int voterListIndex = 0; + checkEmpty(errorMap, "voterList", voterLists, "can't have voterList with free poll"); - for (VoterList voterList : poll.getVoterList()) { + } else if (Polls.isPollRestricted(poll)) { - String voterListField = Poll.PROPERTY_VOTER_LIST + "[" + (voterListIndex++) + "]."; + check(errorMap, "voterList", voterListsNotEmpty && 1 == voterLists.size(), "must have a unique voterList with a resitricted poll"); - boolean notBlankName = checkNotBlank(errors, voterListField + VoterList.PROPERTY_NAME, voterList.getName(), "voterList name can not be empty"); + } else if (Polls.isPollGroup(poll)) { - if (notBlankName) { - boolean added = voterListNames.add(voterList.getName()); + check(errorMap, "voterList", voterListsNotEmpty, "must have at least one voterList with a group poll"); - check(errors, voterListField + VoterList.PROPERTY_NAME, added, "voterList name already used"); - } - check(errors, voterListField + VoterList.PROPERTY_WEIGHT, voterList.getWeight() > 0, "voterList weight must be greater than 0"); - boolean withMember = checkNotEmpty(errors, voterListField + VoterList.PROPERTY_MEMBER, voterList.getMember(), "voterList must contains at least one member"); + } - if (withMember) { - Set<String> voterListMemberNames = Sets.newHashSet(); - Set<String> voterListMemberEmails = Sets.newHashSet(); + if (voterListsNotEmpty) { - int voterListMemberIndex = 0; + List<VoterList> existingVoterLists = new ArrayList<>(); - for (VoterListMember voterListMember : voterList.getMember()) { + for (int i = 0; i < voterLists.size(); i++) { - String voterListMemberField = voterListField + VoterList.PROPERTY_MEMBER + "[" + (voterListMemberIndex++) + "]."; + VoterList voterList = voterLists.get(i); - String voterListMemberName = voterListMember.getName(); - boolean nameNotNull = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, voterListMemberName, "member name can not be empty"); + ErrorMap voterListErrors = getVoterListService().checkVoterList(existingVoterLists, voterList); - if (nameNotNull) { - boolean nameAdded = voterListMemberNames.add(voterListMemberName); - check(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, nameAdded, "member name already used in this list"); - } + voterListErrors.copyTo(errorMap, "voterList[" + i + "]."); - String voterListMemberEmail = voterListMember.getEmail(); + existingVoterLists.add(voterList); - boolean emailNotNull = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email can not be empty"); - - if (emailNotNull) { - - voterListMemberEmail = StringUtils.lowerCase(voterListMemberEmail); - - checkValidEmail(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email is not valid"); - boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail); - check(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, emailAdded, "member email already used in this list"); - } - - check(errors, voterListMemberField + VoterListMember.PROPERTY_WEIGHT, voterListMember.getWeight() > 0, "member weight must be greater than 0"); - } - } } - } - if (!errors.isEmpty()) { - - throw new InvalidFormException(errors); - } } Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -277,4 +277,42 @@ boolean valid = check(errors, field, StringUtil.isEmail(value), error); return valid; } + + protected boolean checkNot(ErrorMap errors, String field, boolean condition, String error) { + boolean valid = check(errors, field, !condition, error); + return valid; + } + + protected boolean checkNotNull(ErrorMap errors, String field, Object value, String error) { + boolean valid = check(errors, field, value != null, error); + return valid; + } + + protected boolean checkEmpty(ErrorMap errors, String field, Collection<?> value, String error) { + boolean valid = check(errors, field, CollectionUtils.isEmpty(value), error); + return valid; + } + + protected boolean checkNotEmpty(ErrorMap errors, String field, Collection<?> value, String error) { + boolean valid = check(errors, field, CollectionUtils.isNotEmpty(value), error); + return valid; + } + + protected boolean checkNotBlank(ErrorMap errors, String field, String value, String error) { + boolean valid = check(errors, field, StringUtils.isNotBlank(value), error); + return valid; + } + + protected boolean checkValidEmail(ErrorMap errors, String field, String value, String error) { + boolean valid = check(errors, field, StringUtil.isEmail(value), error); + return valid; + } + + protected boolean check(ErrorMap errors, String field, boolean condition, String error) { + boolean valid = condition; + if (!valid) { + errors.addError(field, error); + } + return valid; + } } Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -24,6 +24,7 @@ */ import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.Polls; @@ -46,10 +47,9 @@ checkNotNull(pollId); Poll poll = getPollService().getPoll(pollId); + List<Vote> votes = getVoteDao().forPollEquals(poll).findAll(); + return ImmutableList.copyOf(votes); - List<Vote> result = poll.getVote(); - return result; - } public Vote getVote(String pollId, String voteId) { @@ -115,10 +115,8 @@ Poll poll = getPollService().getPoll(pollId); Vote vote = getVote(poll, voteId); - - poll.removeVote(vote); - - getPollDao().update(poll); + + getVoteDao().delete(vote); commit(); //TODO Notify vote deleted @@ -144,9 +142,9 @@ if (!errors.isEmpty()) { throw new InvalidFormException(errors); - + } - + } protected Vote saveVote(Poll poll, Vote vote) { @@ -168,8 +166,7 @@ // PollenPrincipal author = getSecurityService().generatePollenPrincipal(); // toSave.setAuthor(author); - - poll.addVote(toSave); + toSave.setPoll(poll); } // toSave.setText(vote.getText()); @@ -182,16 +179,16 @@ // } return toSave; - + } protected Vote getVote(Poll poll, String voteId) { Vote result = getVoteDao().findByTopiaId(voteId); - if (!poll.containsVote(result)) { + if (!poll.equals(result.getPoll())) { - throw new InvalidEntityLinkException(Poll.PROPERTY_VOTE, poll, result); + throw new InvalidEntityLinkException(Vote.PROPERTY_POLL, result, poll); } Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -24,9 +24,10 @@ */ import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Lists; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; +import org.apache.commons.collections4.CollectionUtils; import org.chorem.pollen.persistence.entity.FavoriteList; import org.chorem.pollen.persistence.entity.FavoriteListMember; import org.chorem.pollen.persistence.entity.Poll; @@ -73,9 +74,8 @@ voterListMember.setEmail(favoriteListMember.getEmail()); result.addMember(voterListMember); } + result.setPoll(poll); - poll.addVoterList(result); - getPollDao().update(poll); commit(); @@ -88,10 +88,9 @@ checkNotNull(pollId); Poll poll = getPollService().getPoll(pollId); + List<VoterList> voterLists = getVoterListDao().forPollEquals(poll).findAll(); + return ImmutableList.copyOf(voterLists); - List<VoterList> result = Lists.newArrayList(poll.getVoterList()); - return result; - } public VoterList getVoterList(String pollId, String voterListId) { @@ -153,9 +152,7 @@ VoterList voterList = getVoterList(poll, voterListId); - poll.removeVoterList(voterList); - - getPollDao().update(poll); + getVoterListDao().delete(voterList); commit(); } @@ -246,9 +243,9 @@ VoterList result = getVoterListDao().findByTopiaId(voterListId); - if (!poll.containsVoterList(result)) { + if (!poll.equals(result.getPoll())) { - throw new InvalidEntityLinkException(Poll.PROPERTY_VOTER_LIST, poll, result); + throw new InvalidEntityLinkException(VoterList.PROPERTY_POLL, result, poll); } @@ -282,10 +279,9 @@ } else { - toSave = getVoterListDao().newInstance(); + toSave = getVoterListDao().create(); + toSave.setPoll(poll); - poll.addVoterList(toSave); - } toSave.setName(voterList.getName()); @@ -337,11 +333,19 @@ Set<String> voterListNames = Sets.newHashSet(); - if (!poll.isVoterListEmpty()) { + List<VoterList> existingVoterLists = null; + if (poll.isPersisted()) { + + existingVoterLists = getVoterListDao().forPollEquals(poll).findAll(); + + } + + if (CollectionUtils.isNotEmpty(existingVoterLists)) { + // get all used names - for (VoterList lists : poll.getVoterList()) { + for (VoterList lists : existingVoterLists) { if (voterListExists && lists.getTopiaId().equals(voterList.getTopiaId())) { continue; @@ -452,4 +456,77 @@ } } + + protected ErrorMap checkVoterList(List<VoterList> existingVoterLists, VoterList voterList) { + + ErrorMap errors = new ErrorMap(); + + boolean voterListExists = voterList.isPersisted(); + + Set<String> voterListNames = Sets.newHashSet(); + + if (CollectionUtils.isNotEmpty(existingVoterLists)) { + + // get all used names + + for (VoterList lists : existingVoterLists) { + + if (voterListExists && lists.getTopiaId().equals(voterList.getTopiaId())) { + continue; + } + + voterListNames.add(voterList.getName()); + + } + + } + + checkNotBlank(errors, VoterList.PROPERTY_NAME, voterList.getName(), "voterList name can not be empty"); + check(errors, VoterList.PROPERTY_WEIGHT, voterList.getWeight() > 0, "voterList weight must be greater than 0"); + checkNotEmpty(errors, VoterList.PROPERTY_MEMBER, voterList.getMember(), "voterList must contains at least one member"); + + boolean added = voterListNames.add(voterList.getName()); + + check(errors, VoterList.PROPERTY_NAME, added, "voterList name already used"); + + Set<String> voterListMemberNames = Sets.newHashSet(); + Set<String> voterListMemberEmails = Sets.newHashSet(); + + int voterListMemberIndex = 0; + + if (voterList.getMember() != null) { + for (VoterListMember voterListMember : voterList.getMember()) { + + String voterListMemberField = "member[" + (voterListMemberIndex++) + "]."; + + String voterListMemberName = voterListMember.getName(); + boolean nameNotBlank = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, voterListMemberName, "member name can not be empty"); + + if (nameNotBlank) { + + boolean nameAdded = voterListMemberNames.add(voterListMemberName); + check(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, nameAdded, "member name already used in this list"); + + } + + String voterListMemberEmail = getCleanMail(voterListMember.getEmail()); + + boolean emailNotBlank = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email can not be empty"); + + if (emailNotBlank) { + + checkValidEmail(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email is not valid"); + boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail); + check(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, emailAdded, "member email already used in this list"); + + } + + check(errors, voterListMemberField + VoterListMember.PROPERTY_WEIGHT, voterListMember.getWeight() > 0, "member weight must be greater than 0"); + + } + } + + return errors; + + } } Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -206,7 +206,7 @@ } - public void checkPermission(String permission) { + public boolean isPermitted(String permission) { Subject subject = getSubject(); @@ -214,8 +214,15 @@ log.info("Check permission: " + permission); } - boolean valid = subject.isPermitted(permission); + boolean permitted = subject.isPermitted(permission); + return permitted; + } + + public void checkPermission(String permission) { + + boolean valid = isPermitted(permission); + if (!valid) { throw new PollenInvalidPermissionException(permission); } @@ -281,20 +288,29 @@ permissions.add(createSubjectPermission(PermissionVerb.readPoll, poll)); permissions.add(createSubjectPermission(PermissionVerb.readPoll, poll)); - if (poll.isChoiceNotEmpty()) { - for (Choice choice : poll.getChoice()) { + // add choices permissions + + List<Choice> choices = getChoiceDao().forPollEquals(poll).findAll(); + if (CollectionUtils.isNotEmpty(choices)) { + for (Choice choice : choices) { permissions.add(createSubjectPermission(PermissionVerb.readChoice, choice)); } } - if (poll.isCommentNotEmpty()) { - for (Comment comment : poll.getComment()) { + // add comment permissions + + List<Comment> comments = getCommentDao().forPollEquals(poll).findAll(); + if (CollectionUtils.isNotEmpty(comments)) { + for (Comment comment : comments) { permissions.add(createSubjectPermission(PermissionVerb.readComment, comment)); } } - if (poll.isVoteNotEmpty()) { - for (Vote vote : poll.getVote()) { + // add vote permissions + + List<Vote> votes = getVoteDao().forPollEquals(poll).findAll(); + if (CollectionUtils.isNotEmpty(votes)) { + for (Vote vote : votes) { permissions.add(createSubjectPermission(PermissionVerb.readVote, vote)); } } @@ -349,18 +365,29 @@ // creator has all rights on the poll, choices and comments, but can only read votes permissions.add(createWildcardSubjectPermission(poll)); - if (poll.isChoiceNotEmpty()) { - for (Choice choice : poll.getChoice()) { + // add choices permissions + + List<Choice> choices = getChoiceDao().forPollEquals(poll).findAll(); + if (CollectionUtils.isNotEmpty(choices)) { + for (Choice choice : choices) { permissions.add(createWildcardSubjectPermission(choice)); } } - if (poll.isCommentNotEmpty()) { - for (Comment comment : poll.getComment()) { + + // add comment permissions + + List<Comment> comments = getCommentDao().forPollEquals(poll).findAll(); + if (CollectionUtils.isNotEmpty(comments)) { + for (Comment comment : comments) { permissions.add(createWildcardSubjectPermission(comment)); } } - if (poll.isVoteNotEmpty()) { - for (Vote vote : poll.getVote()) { + + // add vote permissions + + List<Vote> votes = getVoteDao().forPollEquals(poll).findAll(); + if (CollectionUtils.isNotEmpty(votes)) { + for (Vote vote : votes) { permissions.add(createSubjectPermission(PermissionVerb.readVote, vote)); } } Modified: trunk/pollen-services/src/main/resources/fixtures.yaml =================================================================== --- trunk/pollen-services/src/main/resources/fixtures.yaml 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-services/src/main/resources/fixtures.yaml 2014-05-07 15:49:33 UTC (rev 3920) @@ -41,41 +41,63 @@ creator: !pollen-principal name: poll creator email: poll_creator@pollen.chorem.org - choice: - - &normal_choixA !choice - name: choixA - description: choixA description - choiceType: TEXT - - &normal_choixB !choice - name: choixB - description: choixB description - choiceType: TEXT - - &normal_choixC !choice - name: choixC - description: choixC description - choiceType: TEXT - vote: - - &normal_vote1 !vote - weight: 1.0 - anonymous: false - voteToChoice: !java.util.LinkedList - - &normal_voteToChoice11 !vote-to-choice - choice: *normal_choixA - voteValue: 1 - - &normal_voteToChoice12 !vote-to-choice - choice: *normal_choixC - voteValue: 1 - - &normal_vote2 !vote - weight: 1.0 - anonymous: false - voteToChoice: !java.util.LinkedList - - &normal_voteToChoice21 !vote-to-choice - choice: *normal_choixA - voteValue: 2 - - &normal_voteToChoice22 !vote-to-choice - choice: *normal_choixB - voteValue: 2 +# choice: +# - &normal_choixA !choice +# name: choixA +# description: choixA description +# choiceType: TEXT +# - &normal_choixB !choice +# name: choixB +# description: choixB description +# choiceType: TEXT +# - &normal_choixC !choice +# name: choixC +# description: choixC description +# choiceType: TEXT +# vote: +# - &normal_vote1 !vote +# weight: 1.0 +# anonymous: false +# voteToChoice: !java.util.LinkedList +# - &normal_voteToChoice11 !vote-to-choice +# choice: *normal_choixA +# voteValue: 1 +# - &normal_voteToChoice12 !vote-to-choice +# choice: *normal_choixC +# voteValue: 1 +# - &normal_vote2 !vote +# weight: 1.0 +# anonymous: false +# voteToChoice: !java.util.LinkedList +# - &normal_voteToChoice21 !vote-to-choice +# choice: *normal_choixA +# voteValue: 2 +# - &normal_voteToChoice22 !vote-to-choice +# choice: *normal_choixB +# voteValue: 2 +choiceA: + &normal_choixA !choice + poll: *normal + name: choixA + description: choixA description + choiceType: TEXT + +choiceB: + &normal_choixB !choice + poll: *normal + name: choixB + description: choixB description + choiceType: TEXT + +choices: + - *normal_choixA + - *normal_choixB + +votes: + - normal_vote1 + - normal_vote2 + users: - *tony - *jean Modified: trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java =================================================================== --- trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java 2014-05-07 13:14:48 UTC (rev 3919) +++ trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java 2014-05-07 15:49:33 UTC (rev 3920) @@ -29,8 +29,8 @@ import org.chorem.pollen.persistence.entity.PollType; import org.chorem.pollen.persistence.entity.VoterList; import org.chorem.pollen.persistence.entity.VoterListMember; +import org.chorem.pollen.services.service.ChoiceService; import org.chorem.pollen.services.service.InvalidFormException; -import org.chorem.pollen.services.service.ChoiceService; import org.chorem.pollen.services.service.PollService; import org.chorem.pollen.services.service.VoterListService; import org.chorem.pollen.services.service.security.PollenInvalidPermissionException; @@ -40,7 +40,9 @@ import org.junit.Test; import java.text.ParseException; +import java.util.ArrayList; import java.util.Date; +import java.util.List; /** * TODO @@ -52,12 +54,18 @@ protected PollService service; + protected ChoiceService choiceService; + + protected VoterListService voterListService; + @Before public void setUp() throws ParseException { loadFixtures("fixtures"); service = newService(PollService.class); + choiceService = newService(ChoiceService.class); + voterListService = newService(VoterListService.class); getServiceContext().setDate(new Date(1363948427576l)); @@ -72,7 +80,7 @@ poll.setPollType(PollType.FREE); try { - service.createPoll(poll); + service.createPoll(poll, null, null); Assert.fail(); } catch (InvalidFormException e) { // missing title @@ -82,11 +90,12 @@ poll.setTitle("poll1"); + List<Choice> choices = new ArrayList<>(); Choice choice1 = getServiceContext().getPersistenceContext().getChoiceDao().newInstance(); - poll.addChoice(choice1); + choices.add(choice1); try { - service.createPoll(poll); + service.createPoll(poll, choices, null); Assert.fail(); } catch (InvalidFormException e) { // missing choice type @@ -95,7 +104,7 @@ choice1.setChoiceType(ChoiceType.TEXT); try { - service.createPoll(poll); + service.createPoll(poll, choices, null); Assert.fail(); } catch (InvalidFormException e) { // missing choice name @@ -110,10 +119,10 @@ choice2.setChoiceType(ChoiceType.TEXT); choice2.setName("A"); choice2.setDescription("Choice B"); - poll.addChoice(choice2); + choices.add(choice2); try { - service.createPoll(poll); + service.createPoll(poll, choices, null); Assert.fail(); } catch (InvalidFormException e) { // duplicated choice name @@ -123,7 +132,7 @@ choice2.setName("B"); - Poll createdPoll = service.createPoll(poll); + Poll createdPoll = service.createPoll(poll, choices, null); Assert.assertNotNull(createdPoll); Assert.assertNotNull(createdPoll.getTopiaId()); @@ -136,19 +145,20 @@ Assert.assertNotNull(createdPoll.getCreator().getTopiaId()); Assert.assertNull(createdPoll.getCreator().getName()); Assert.assertNull(createdPoll.getCreator().getEmail()); - Assert.assertNull(createdPoll.getComment()); - Assert.assertNull(createdPoll.getVote()); - Assert.assertNull(createdPoll.getVoterList()); +// Assert.assertNull(createdPoll.getComment()); +// Assert.assertNull(createdPoll.getVote()); +// Assert.assertNull(createdPoll.getVoterList()); - Assert.assertNotNull(createdPoll.getChoice()); - Assert.assertEquals(2, createdPoll.sizeChoice()); + List<Choice> createdChoices = choiceService.getChoices(createdPoll.getTopiaId()); + Assert.assertNotNull(createdChoices); + Assert.assertEquals(2, createdChoices.size()); - Choice createdChoice1 = createdPoll.getChoice(0); + + Choice createdChoice1 = createdChoices.get(0); Assert.assertNotNull(createdChoice1); Assert.assertNotNull(createdChoice1.getTopiaId()); - ChoiceService choiceService = newService(ChoiceService.class); Choice reloadedChoice1 = choiceService.getChoice(createdPoll.getTopiaId(), createdChoice1.getTopiaId()); Assert.assertEquals(createdChoice1, reloadedChoice1); @@ -156,7 +166,7 @@ Assert.assertEquals(choice1.getDescription(), createdChoice1.getDescription()); Assert.assertEquals(createdPoll.getCreator(), createdChoice1.getCreator()); - Choice createdChoice2 = createdPoll.getChoice(1); + Choice createdChoice2 = createdChoices.get(1); Assert.assertNotNull(createdChoice2); Assert.assertNotNull(createdChoice2.getTopiaId()); @@ -177,35 +187,39 @@ poll.setTitle("poll1"); + List<Choice> choices = new ArrayList<>(); + Choice choice1 = getServiceContext().getPersistenceContext().getChoiceDao().newInstance(); choice1.setChoiceType(ChoiceType.TEXT); choice1.setName("A"); choice1.setDescription("Choice A"); - poll.addChoice(choice1); + choices.add(choice1); Choice choice2 = getServiceContext().getPersistenceContext().getChoiceDao().newInstance(); choice2.setChoiceType(ChoiceType.TEXT); choice2.setName("B"); choice2.setDescription("Choice B"); - poll.addChoice(choice2); + choices.add(choice2); try { - service.createPoll(poll); + service.createPoll(poll, choices, null); Assert.fail(); } catch (InvalidFormException e) { // missing voterList assertErrorKeyFound(e, "voterList"); } + List<VoterList> voterLists = new ArrayList<>(); + // add voter list VoterList voterList = getServiceContext().getPersistenceContext().getVoterListDao().newInstance(); - poll.addVoterList(voterList); + voterLists.add(voterList); try { - service.createPoll(poll); + service.createPoll(poll, choices, voterLists); Assert.fail(); } catch (InvalidFormException e) { // missing name @@ -221,7 +235,7 @@ voterList.addMember(voterListMember1); try { - service.createPoll(poll); + service.createPoll(poll, choices, voterLists); Assert.fail(); } catch (InvalidFormException e) { // missing member name @@ -234,7 +248,7 @@ voterListMember1.setEmail("voter1_pollen.org"); try { - service.createPoll(poll); + service.createPoll(poll, choices, voterLists); Assert.fail(); } catch (InvalidFormException e) { // invalid member email @@ -250,7 +264,7 @@ voterList.addMember(voterListMember2); try { - service.createPoll(poll); + service.createPoll(poll, choices, voterLists); Assert.fail(); } catch (InvalidFormException e) { // same name @@ -261,7 +275,7 @@ voterListMember2.setName("voter2"); voterListMember2.setEmail("voter2@pollen.org"); - Poll createdPoll = service.createPoll(poll); + Poll createdPoll = service.createPoll(poll, choices, voterLists); Assert.assertNotNull(createdPoll); Assert.assertNotNull(createdPoll.getTopiaId()); @@ -284,17 +298,18 @@ Assert.assertNotNull(createdPoll.getCreator().getTopiaId()); Assert.assertNull(createdPoll.getCreator().getName()); Assert.assertNull(createdPoll.getCreator().getEmail()); - Assert.assertNull(createdPoll.getComment()); - Assert.assertNull(createdPoll.getVote()); +// Assert.assertNull(createdPoll.getComment()); +// Assert.assertNull(createdPoll.getVote()); - Assert.assertNotNull(createdPoll.getChoice()); - Assert.assertEquals(2, createdPoll.sizeChoice()); + List<Choice> createdChoices = choiceService.getChoices(createdPoll.getTopiaId()); - Choice createdChoice1 = createdPoll.getChoice(0); + Assert.assertNotNull(createdChoices); + Assert.assertEquals(2, createdChoices.size()); + + Choice createdChoice1 = createdChoices.get(0); Assert.assertNotNull(createdChoice1); Assert.assertNotNull(createdChoice1.getTopiaId()); - ChoiceService choiceService = newService(ChoiceService.class); Choice reloadedChoice1 = choiceService.getChoice(createdPoll.getTopiaId(), createdChoice1.getTopiaId()); Assert.assertEquals(createdChoice1, reloadedChoice1); @@ -302,7 +317,7 @@ Assert.assertEquals(choice1.getDescription(), createdChoice1.getDescription()); Assert.assertEquals(createdPoll.getCreator(), createdChoice1.getCreator()); - Choice createdChoice2 = createdPoll.getChoice(1); + Choice createdChoice2 = createdChoices.get(1); Assert.assertNotNull(createdChoice2); Assert.assertNotNull(createdChoice2.getTopiaId()); @@ -313,13 +328,14 @@ Assert.assertEquals(choice2.getDescription(), createdChoice2.getDescription()); Assert.assertEquals(createdPoll.getCreator(), createdChoice2.getCreator()); - Assert.assertNotNull(createdPoll.getVoterList()); - Assert.assertEquals(1, createdPoll.sizeVoterList()); - VoterList createdVoterList = createdPoll.getVoterList(0); + List<VoterList> createdVoterLists = voterListService.getVoterLists(createdPoll.getTopiaId()); + + Assert.assertNotNull(createdVoterLists); + Assert.assertEquals(1, createdVoterLists.size()); + VoterList createdVoterList = createdVoterLists.get(0); Assert.assertNotNull(createdVoterList); Assert.assertNotNull(createdVoterList.getTopiaId()); - VoterListService voterListService = newService(VoterListService.class); VoterList reloadedVoterList = voterListService.getVoterList(createdPoll.getTopiaId(), createdVoterList.getTopiaId()); Assert.assertEquals(createdVoterList, reloadedVoterList);
participants (1)
-
tchemit@users.chorem.org