r3831 - in trunk: pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1 pollen-services/src/main/java/org/chorem/pollen/services/exception pollen-services/src/main/java/org/chorem/pollen/services/service pollen-services/src/test/java/org/chorem/pollen/service pollen-ui-js/src/main/webapp/bundle pollen-ui-js/src/main/webapp/js/libs
Author: tchemit Date: 2013-06-15 16:29:32 +0200 (Sat, 15 Jun 2013) New Revision: 3831 Url: http://chorem.org/projects/pollen/repository/revisions/3831 Log: continue edit form + add service poll test Added: trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/InvalidVoterListFormException.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/InvalidVoterListMemberFormException.java trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoterListService.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/AbstractInvalidFormException.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/AbstractPollenService.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/SecurityService.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java trunk/pollen-services/src/test/java/org/chorem/pollen/service/AbstractPollenServiceTest.java trunk/pollen-ui-js/src/main/webapp/bundle/Messages.properties trunk/pollen-ui-js/src/main/webapp/js/libs/jquery.i18n.properties-min-1.0.9.js Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoterListService.java =================================================================== --- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoterListService.java 2013-06-15 10:58:03 UTC (rev 3830) +++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoterListService.java 2013-06-15 14:29:32 UTC (rev 3831) @@ -27,6 +27,7 @@ import org.chorem.pollen.persistence.entity.VoterListMember; import org.chorem.pollen.services.PollenServiceContext; import org.chorem.pollen.services.exception.EntityNotFoundException; +import org.chorem.pollen.services.exception.InvalidVoterListFormException; import org.debux.webmotion.server.WebMotionController; import java.util.List; @@ -53,11 +54,11 @@ return context.getVoterListService().getVoterList(pollId, voterListId); } - public VoterList addVoterList(PollenServiceContext context, String pollId, VoterList voterList) throws EntityNotFoundException { + public VoterList addVoterList(PollenServiceContext context, String pollId, VoterList voterList) throws EntityNotFoundException, InvalidVoterListFormException { return context.getVoterListService().addVoterList(pollId, voterList); } - public VoterList editVoterList(PollenServiceContext context, String pollId, VoterList voterList) throws EntityNotFoundException { + public VoterList editVoterList(PollenServiceContext context, String pollId, VoterList voterList) throws EntityNotFoundException, InvalidVoterListFormException { return context.getVoterListService().editVoterList(pollId, voterList); } @@ -66,23 +67,23 @@ } public Set<VoterListMember> getMembers(PollenServiceContext context, String pollId, String voterListId) throws EntityNotFoundException { - Set<VoterListMember> members = context.getVoterListService().getMembers(pollId, voterListId); + Set<VoterListMember> members = context.getVoterListService().getVoterListMembers(pollId, voterListId); return members; } public VoterListMember getMember(PollenServiceContext context, String pollId, String voterListId, String memberId) throws EntityNotFoundException { - return context.getVoterListService().getMember(pollId, voterListId, memberId); + return context.getVoterListService().getVoterListMember(pollId, voterListId, memberId); } public VoterListMember addMember(PollenServiceContext context, String pollId, String voterListId, VoterListMember member) throws EntityNotFoundException { - return context.getVoterListService().addMember(pollId, voterListId, member); + return context.getVoterListService().addVoterListMember(pollId, voterListId, member); } public VoterListMember editMember(PollenServiceContext context, String pollId, String voterListId, VoterListMember member) throws EntityNotFoundException { - return context.getVoterListService().editMember(pollId, voterListId, member); + return context.getVoterListService().editVoterListMember(pollId, voterListId, member); } public void deleteMember(PollenServiceContext context, String pollId, String voterListId, String memberId) throws EntityNotFoundException { - context.getVoterListService().deleteMember(pollId, voterListId, memberId); + context.getVoterListService().deleteVoterListMember(pollId, voterListId, memberId); } } Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/AbstractInvalidFormException.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/AbstractInvalidFormException.java 2013-06-15 10:58:03 UTC (rev 3830) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/AbstractInvalidFormException.java 2013-06-15 14:29:32 UTC (rev 3831) @@ -44,4 +44,9 @@ public Multimap<String, String> getErrors() { return errors; } + + @Override + public String toString() { + return super.toString()+ " errors: "+errors; + } } Added: trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/InvalidVoterListFormException.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/InvalidVoterListFormException.java (rev 0) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/InvalidVoterListFormException.java 2013-06-15 14:29:32 UTC (rev 3831) @@ -0,0 +1,41 @@ +package org.chorem.pollen.services.exception; + +/* + * #%L + * Pollen :: Service + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2013 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import com.google.common.collect.Multimap; + +/** + * TODO + * + * @author tchemit <chemit@codelutin.com> + * @since 2.0 + */ +public class InvalidVoterListFormException extends AbstractInvalidFormException { + + private static final long serialVersionUID = 1L; + + public InvalidVoterListFormException(Multimap<String, String> errors) { + super(errors); + } +} Property changes on: trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/InvalidVoterListFormException.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/InvalidVoterListMemberFormException.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/InvalidVoterListMemberFormException.java (rev 0) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/InvalidVoterListMemberFormException.java 2013-06-15 14:29:32 UTC (rev 3831) @@ -0,0 +1,41 @@ +package org.chorem.pollen.services.exception; + +/* + * #%L + * Pollen :: Service + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2013 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import com.google.common.collect.Multimap; + +/** + * TODO + * + * @author tchemit <chemit@codelutin.com> + * @since 2.0 + */ +public class InvalidVoterListMemberFormException extends AbstractInvalidFormException { + + private static final long serialVersionUID = 1L; + + public InvalidVoterListMemberFormException(Multimap<String, String> errors) { + super(errors); + } +} Property changes on: trunk/pollen-services/src/main/java/org/chorem/pollen/services/exception/InvalidVoterListMemberFormException.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/AbstractPollenService.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/AbstractPollenService.java 2013-06-15 10:58:03 UTC (rev 3830) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/AbstractPollenService.java 2013-06-15 14:29:32 UTC (rev 3831) @@ -25,6 +25,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Multimap; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.chorem.pollen.persistence.PollenPersistenceContext; import org.chorem.pollen.services.PollenServiceContext; @@ -35,6 +36,7 @@ import org.nuiton.jpa.api.JpaEntity; import org.nuiton.util.StringUtil; +import java.util.Collection; import java.util.Date; /** @@ -141,6 +143,16 @@ return valid; } + protected boolean checkEmpty(Multimap<String, String> errors, String field, Collection<?> value, String error) { + boolean valid = check(errors, field, CollectionUtils.isEmpty(value ), error); + return valid; + } + + protected boolean checkNotEmpty(Multimap<String, String> errors, String field, Collection<?> value, String error) { + boolean valid = check(errors, field, CollectionUtils.isNotEmpty(value ), error); + return valid; + } + protected boolean checkNotBlank(Multimap<String, String> errors, String field, String value, String error) { boolean valid = check(errors, field, StringUtils.isNotBlank(value), error); return valid; 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 2013-06-15 10:58:03 UTC (rev 3830) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java 2013-06-15 14:29:32 UTC (rev 3831) @@ -25,6 +25,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import org.apache.commons.lang3.StringUtils; @@ -111,6 +112,9 @@ creator.setName(user.getName()); creator.setEmail(user.getEmail()); } + + result.setChoice(Lists.<Choice>newArrayList()); + result.setVoterList(Lists.<VoterList>newArrayList()); return result; } @@ -266,12 +270,12 @@ checkNotNull(errors, "voteCountingType", poll.getVoteCountingType(), "voteCountingType can not be null"); checkNotBlank(errors, "title", poll.getTitle(), "title can not be empty"); - check(errors, "choice", poll.isChoiceEmpty(), "need at least one choice"); + checkNotEmpty(errors, "choice", poll.getChoice(), "need at least one choice"); if (poll.isFreePoll()) { - check(errors, "pollType", poll.isVoterListEmpty(), "can't have voterList with free poll"); + checkEmpty(errors, "voterList", poll.getVoterList(), "can't have voterList with free poll"); } else { - check(errors, "pollType", !poll.isVoterListEmpty(), "must have voterList with not free poll"); + checkNotEmpty(errors, "voterList", poll.getVoterList(), "must have voterList with not free poll"); } if (!poll.isChoiceEmpty()) { @@ -313,44 +317,50 @@ for (VoterList voterList : poll.getVoterList()) { - String voterListField = "voterList[" + (voterListIndex++) + "]"; + String voterListField = "voterList[" + (voterListIndex++) + "]."; - checkNotBlank(errors, voterListField + ".name", voterList.getName(), "voterList name can not be empty"); - check(errors, voterListField + ".weight", voterList.getWeight() > 0, "voterList weight must be greater than 0"); - check(errors, voterListField + ".member", !voterList.isVoterListMemberEmpty(), "voterList must contains at least one member"); + boolean notBlankName = checkNotBlank(errors, voterListField + "name", voterList.getName(), "voterList name can not be empty"); - boolean added = voterListNames.add(voterList.getName()); + if (notBlankName) { + boolean added = voterListNames.add(voterList.getName()); - check(errors, voterListField, added, "voterList name already used"); + check(errors, voterListField + "name", added, "voterList name already used"); + } + check(errors, voterListField + "weight", voterList.getWeight() > 0, "voterList weight must be greater than 0"); + boolean withMember = checkNotEmpty(errors, voterListField + "member", voterList.getVoterListMember(), "voterList must contains at least one member"); - Set<String> voterListMemberNames = Sets.newHashSet(); - Set<String> voterListMemberEmails = Sets.newHashSet(); + if (withMember) { + Set<String> voterListMemberNames = Sets.newHashSet(); + Set<String> voterListMemberEmails = Sets.newHashSet(); - int voterListMemberIndex = 0; + int voterListMemberIndex = 0; - for (VoterListMember voterListMember : voterList.getVoterListMember()) { + for (VoterListMember voterListMember : voterList.getVoterListMember()) { - String voterListMemberField = voterListField + ".member[" + (voterListMemberIndex++) + "]"; + String voterListMemberField = voterListField + "member[" + (voterListMemberIndex++) + "]."; - String voterListMemberName = voterListMember.getName(); - boolean nameNotNull = checkNotBlank(errors, voterListMemberField + ".name", voterListMemberName, "member name can not be empty"); + String voterListMemberName = voterListMember.getName(); + boolean nameNotNull = checkNotBlank(errors, voterListMemberField + "name", voterListMemberName, "member name can not be empty"); - if (nameNotNull) { - boolean nameAdded = voterListMemberNames.add(voterListMemberName); - check(errors, voterListMemberField + ".name", nameAdded, "member name already used in this list"); - } + if (nameNotNull) { + boolean nameAdded = voterListMemberNames.add(voterListMemberName); + check(errors, voterListMemberField + "name", nameAdded, "member name already used in this list"); + } - String voterListMemberEmail = voterListMember.getEmail(); + String voterListMemberEmail = voterListMember.getEmail(); - boolean emailNotNull = checkNotBlank(errors, voterListMemberField + ".email", voterListMemberEmail, "member email can not be empty"); + boolean emailNotNull = checkNotBlank(errors, voterListMemberField + "email", voterListMemberEmail, "member email can not be empty"); - if (emailNotNull) { + if (emailNotNull) { - voterListMemberEmail = StringUtils.lowerCase(voterListMemberEmail); + voterListMemberEmail = StringUtils.lowerCase(voterListMemberEmail); - checkValidEmail(errors, voterListMemberField + ".email", voterListMemberEmail, "member email is not valid"); - boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail); - check(errors, voterListMemberField + ".email", emailAdded, "member email already used in this list"); + checkValidEmail(errors, voterListMemberField + "email", voterListMemberEmail, "member email is not valid"); + boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail); + check(errors, voterListMemberField + "email", emailAdded, "member email already used in this list"); + } + + check(errors, voterListMemberField + "weight", voterListMember.getWeight() > 0, "member weight must be greater than 0"); } } } Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/SecurityService.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/SecurityService.java 2013-06-15 10:58:03 UTC (rev 3830) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/SecurityService.java 2013-06-15 14:29:32 UTC (rev 3831) @@ -39,6 +39,7 @@ PollenPrincipal principal = pollenPrincipalDao.newInstance(); principal.setToken(serviceContext.generateToken()); principal.setCreationDate(serviceContext.getNow()); + pollenPrincipalDao.persist(principal); return principal; } 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 2013-06-15 10:58:03 UTC (rev 3830) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java 2013-06-15 14:29:32 UTC (rev 3831) @@ -24,6 +24,10 @@ */ import com.google.common.base.Preconditions; +import com.google.common.collect.ArrayListMultimap; +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.chorem.pollen.persistence.dao.VoterListJpaDao; import org.chorem.pollen.persistence.dao.VoterListMemberJpaDao; @@ -33,6 +37,8 @@ import org.chorem.pollen.persistence.entity.VoterList; import org.chorem.pollen.persistence.entity.VoterListMember; import org.chorem.pollen.services.exception.EntityNotFoundException; +import org.chorem.pollen.services.exception.InvalidVoterListFormException; +import org.chorem.pollen.services.exception.InvalidVoterListMemberFormException; import org.nuiton.jpa.api.JpaEntities; import java.util.List; @@ -75,7 +81,6 @@ poll.addVoterList(result); getPersistenceContext().getPollDao().merge(poll); - getPersistenceContext().commit(); return result; } @@ -85,25 +90,28 @@ Poll poll = getPollService().getPoll(pollId); - List<VoterList> result = poll.getVoterList(); + List<VoterList> result = Lists.newArrayList(poll.getVoterList()); return result; } public VoterList getVoterList(String pollId, String voterListId) throws EntityNotFoundException { + Preconditions.checkNotNull(pollId); Preconditions.checkNotNull(voterListId); - VoterList result = getPersistenceContext().getVoterListDao().findById(voterListId); - checkEntityExists(VoterList.class, result, voterListId); + Poll poll = getPollService().getPoll(pollId); + VoterList result = getVoterList(poll, voterListId); return result; } - public VoterList addVoterList(String pollId, VoterList voterList) throws EntityNotFoundException { + public VoterList addVoterList(String pollId, VoterList voterList) throws EntityNotFoundException, InvalidVoterListFormException { Preconditions.checkNotNull(pollId); Preconditions.checkNotNull(voterList); checkHasNoId(voterList); Poll poll = getPollService().getPoll(pollId); + checkVoterList(poll, voterList); + VoterList result = saveVoterList(poll, voterList); getPersistenceContext().getPollDao().merge(poll); @@ -111,12 +119,14 @@ return result; } - public VoterList editVoterList(String pollId, VoterList voterList) throws EntityNotFoundException { + public VoterList editVoterList(String pollId, VoterList voterList) throws EntityNotFoundException, InvalidVoterListFormException { Preconditions.checkNotNull(pollId); Preconditions.checkNotNull(voterList); checkHasId(voterList); Poll poll = getPollService().getPoll(pollId); + checkVoterList(poll, voterList); + VoterList result = saveVoterList(poll, voterList); getPersistenceContext().getVoterListDao().merge(voterList); @@ -130,16 +140,16 @@ Poll poll = getPollService().getPoll(pollId); - VoterList voterList = getVoterList(pollId, voterListId); + VoterList voterList = getVoterList(poll, voterListId); poll.removeVoterList(voterList); getPersistenceContext().getPollDao().merge(poll); - getPersistenceContext().commit(); } - public Set<VoterListMember> getMembers(String pollId, String voterListId) throws EntityNotFoundException { + public Set<VoterListMember> getVoterListMembers(String pollId, String voterListId) throws EntityNotFoundException { + Preconditions.checkNotNull(pollId); Preconditions.checkNotNull(voterListId); VoterList voterList = getVoterList(pollId, voterListId); @@ -148,26 +158,20 @@ return result; } - public VoterListMember getMember(String pollId, String voterListId, String memberId) throws EntityNotFoundException { + public VoterListMember getVoterListMember(String pollId, String voterListId, String memberId) throws EntityNotFoundException { + Preconditions.checkNotNull(pollId); + Preconditions.checkNotNull(voterListId); Preconditions.checkNotNull(memberId); VoterList voterList = getVoterList(pollId, voterListId); - VoterListMember result = getMember(voterList, memberId); + VoterListMember result = getVoterListMember(voterList, memberId); checkEntityExists(VoterListMember.class, result, memberId); return result; } - - public VoterListMember getMember(VoterList voterList, String memberId) throws EntityNotFoundException { - Preconditions.checkNotNull(memberId); - - VoterListMember result = voterList.getVoterListMemberById(memberId); - checkEntityExists(VoterListMember.class, result, memberId); - return result; - } - - public VoterListMember addMember(String pollId, String voterListId, VoterListMember member) throws EntityNotFoundException { + public VoterListMember addVoterListMember(String pollId, String voterListId, VoterListMember member) throws EntityNotFoundException { + Preconditions.checkNotNull(pollId); Preconditions.checkNotNull(voterListId); Preconditions.checkNotNull(member); checkHasNoId(member); @@ -181,7 +185,9 @@ return result; } - public VoterListMember editMember(String pollId, String voterListId, VoterListMember member) throws EntityNotFoundException { + + public VoterListMember editVoterListMember(String pollId, String voterListId, VoterListMember member) throws EntityNotFoundException { + Preconditions.checkNotNull(pollId); Preconditions.checkNotNull(voterListId); Preconditions.checkNotNull(member); checkHasId(member); @@ -195,13 +201,14 @@ return result; } - public void deleteMember(String pollId, String voterListId, String memberId) throws EntityNotFoundException { + public void deleteVoterListMember(String pollId, String voterListId, String memberId) throws EntityNotFoundException { + Preconditions.checkNotNull(pollId); Preconditions.checkNotNull(voterListId); Preconditions.checkNotNull(memberId); VoterList voterList = getVoterList(pollId, voterListId); - VoterListMember member = getMember(voterList, memberId); + VoterListMember member = getVoterListMember(voterList, memberId); voterList.removeVoterListMember(member); getPersistenceContext().getVoterListDao().merge(voterList); @@ -209,34 +216,48 @@ getPersistenceContext().commit(); } + protected VoterList getVoterList(Poll poll, String voterListId) throws EntityNotFoundException { + + VoterList result = poll.getVoterListById(voterListId); + checkEntityExists(VoterList.class, result, voterListId); + return result; + } + + protected VoterListMember getVoterListMember(VoterList voterList, String memberId) throws EntityNotFoundException { + Preconditions.checkNotNull(memberId); + + VoterListMember result = voterList.getVoterListMemberById(memberId); + checkEntityExists(VoterListMember.class, result, memberId); + return result; + } + protected VoterList saveVoterList(Poll poll, VoterList voterList) throws EntityNotFoundException { boolean voterListExists = JpaEntities.isEntityHasId(voterList); - VoterList voterListToPersist; + VoterList toSave; if (voterListExists) { - voterListToPersist = - getVoterListService().getVoterList(poll.getId(), voterList.getId()); + toSave = getVoterList(poll, voterList.getId()); } else { VoterListJpaDao voterListDao = getPersistenceContext().getVoterListDao(); - voterListToPersist = voterListDao.newInstance(); + toSave = voterListDao.newInstance(); - poll.addVoterList(voterListToPersist); + poll.addVoterList(toSave); } - voterListToPersist.setName(voterList.getName()); - voterListToPersist.setWeight(voterList.getWeight()); + toSave.setName(voterList.getName()); + toSave.setWeight(voterList.getWeight()); for (VoterListMember voterListMember : voterList.getVoterListMember()) { - saveVoterListMember(voterListToPersist, voterListMember); + saveVoterListMember(toSave, voterListMember); } - return voterListToPersist; + return toSave; } protected VoterListMember saveVoterListMember(VoterList voterList, @@ -245,26 +266,143 @@ boolean voterListMemberExists = JpaEntities.isEntityHasId(voterListMember); - VoterListMember voterListMemberToPersist; + VoterListMember toSave; if (voterListMemberExists) { - voterListMemberToPersist = - getMember(voterList, voterListMember.getId()); + toSave = getVoterListMember(voterList, voterListMember.getId()); } else { VoterListMemberJpaDao voterListMemberDao = getPersistenceContext().getVoterListMemberDao(); - voterListMemberToPersist = voterListMemberDao.newInstance(); + toSave = voterListMemberDao.newInstance(); - voterList.addVoterListMember(voterListMemberToPersist); + voterList.addVoterListMember(toSave); } - voterListMemberToPersist.setName(voterListMember.getName()); - voterListMemberToPersist.setEmail(StringUtils.lowerCase(voterListMember.getEmail())); - voterListMemberToPersist.setWeight(voterListMember.getWeight()); + toSave.setName(voterListMember.getName()); + toSave.setEmail(StringUtils.lowerCase(voterListMember.getEmail())); + toSave.setWeight(voterListMember.getWeight()); - return voterListMemberToPersist; + return toSave; } + + protected void checkVoterList(Poll poll, VoterList voterList) throws InvalidVoterListFormException { + + //TODO use nuiton validator ? + Multimap<String, String> errors = ArrayListMultimap.create(); + + boolean voterListExists = JpaEntities.isEntityHasId(voterList); + + Set<String> voterListNames = Sets.newHashSet(); + + if (!poll.isVoterListEmpty()) { + + // get all used names + + for (VoterList lists : poll.getVoterList()) { + + if (voterListExists && lists.getId().equals(voterList.getId())) { + continue; + } + + voterListNames.add(voterList.getName()); + } + } + + checkNotBlank(errors, "name", voterList.getName(), "voterList name can not be empty"); + check(errors, "weight", voterList.getWeight() > 0, "voterList weight must be greater than 0"); + checkNotEmpty(errors, "member", voterList.getVoterListMember(), "voterList must contains at least one member"); + + boolean added = voterListNames.add(voterList.getName()); + + check(errors, "name", added, "voterList name already used"); + + Set<String> voterListMemberNames = Sets.newHashSet(); + Set<String> voterListMemberEmails = Sets.newHashSet(); + + int voterListMemberIndex = 0; + + for (VoterListMember voterListMember : voterList.getVoterListMember()) { + + String voterListMemberField = "member[" + (voterListMemberIndex++) + "]."; + + String voterListMemberName = voterListMember.getName(); + boolean nameNotNull = checkNotBlank(errors, voterListMemberField + "name", voterListMemberName, "member name can not be empty"); + + if (nameNotNull) { + boolean nameAdded = voterListMemberNames.add(voterListMemberName); + check(errors, voterListMemberField + "name", nameAdded, "member name already used in this list"); + } + + String voterListMemberEmail = voterListMember.getEmail(); + + boolean emailNotNull = checkNotBlank(errors, voterListMemberField + "email", voterListMemberEmail, "member email can not be empty"); + + if (emailNotNull) { + + voterListMemberEmail = StringUtils.lowerCase(voterListMemberEmail); + + checkValidEmail(errors, voterListMemberField + "email", voterListMemberEmail, "member email is not valid"); + boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail); + check(errors, voterListMemberField + "email", emailAdded, "member email already used in this list"); + } + } + + if (!errors.isEmpty()) { + + throw new InvalidVoterListFormException(errors); + } + } + + protected void checkVoterListMember(VoterList voterList, VoterListMember voterListMember) throws InvalidVoterListMemberFormException { + + //TODO use nuiton validator ? + Multimap<String, String> errors = ArrayListMultimap.create(); + + boolean voterListMemberExists = JpaEntities.isEntityHasId(voterListMember); + + Set<String> voterListMemberNames = Sets.newHashSet(); + Set<String> voterListMemberEmails = Sets.newHashSet(); + if (!voterList.isVoterListMemberEmpty()) { + + // get all used names + + for (VoterListMember member : voterList.getVoterListMember()) { + + if (voterListMemberExists && member.getId().equals(voterListMember.getId())) { + continue; + } + + voterListMemberNames.add(voterListMember.getName()); + voterListMemberEmails.add(voterListMember.getEmail()); + } + } + String voterListMemberName = voterListMember.getName(); + boolean nameNotNull = checkNotBlank(errors, "name", voterListMemberName, "member name can not be empty"); + + if (nameNotNull) { + boolean nameAdded = voterListMemberNames.add(voterListMemberName); + check(errors, "name", nameAdded, "member name already used in this list"); + } + + String voterListMemberEmail = voterListMember.getEmail(); + + boolean emailNotNull = checkNotBlank(errors, "email", voterListMemberEmail, "member email can not be empty"); + + if (emailNotNull) { + + voterListMemberEmail = StringUtils.lowerCase(voterListMemberEmail); + + checkValidEmail(errors, "email", voterListMemberEmail, "member email is not valid"); + boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail); + check(errors, "email", emailAdded, "member email already used in this list"); + } + + if (!errors.isEmpty()) { + + throw new InvalidVoterListMemberFormException(errors); + } + } } Modified: trunk/pollen-services/src/test/java/org/chorem/pollen/service/AbstractPollenServiceTest.java =================================================================== --- trunk/pollen-services/src/test/java/org/chorem/pollen/service/AbstractPollenServiceTest.java 2013-06-15 10:58:03 UTC (rev 3830) +++ trunk/pollen-services/src/test/java/org/chorem/pollen/service/AbstractPollenServiceTest.java 2013-06-15 14:29:32 UTC (rev 3831) @@ -23,11 +23,14 @@ * #L% */ +import com.google.common.collect.Multimap; import org.chorem.pollen.persistence.JpaPollenPersistenceContext; import org.chorem.pollen.services.PollenFixtures; +import org.chorem.pollen.services.PollenServiceSupport; import org.chorem.pollen.services.config.PollenServiceConfig; +import org.chorem.pollen.services.exception.AbstractInvalidFormException; import org.chorem.pollen.services.service.FixturesService; -import org.chorem.pollen.services.PollenServiceSupport; +import org.junit.Assert; import org.junit.Rule; import org.nuiton.jpa.junit.JpaEntityManagerRule; @@ -114,4 +117,14 @@ } + protected void assertErrorKeyFound(AbstractInvalidFormException e, String... keys) { + Multimap<String, String> errors = e.getErrors(); + + Assert.assertEquals("Expected " + keys.length + " errors, but had " + errors.keySet(), keys.length, errors.keySet().size()); + for (String key : keys) { + + Assert.assertTrue("Expected error:" + key + ", but not found among:" + errors.keySet(), errors.containsKey(key)); + } + } + } Added: trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java =================================================================== --- trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java (rev 0) +++ trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java 2013-06-15 14:29:32 UTC (rev 3831) @@ -0,0 +1,322 @@ +package org.chorem.pollen.service; + +/* + * #%L + * Pollen :: Service + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2013 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import org.chorem.pollen.persistence.entity.Choice; +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.persistence.entity.VoterList; +import org.chorem.pollen.persistence.entity.VoterListMember; +import org.chorem.pollen.services.exception.EntityNotFoundException; +import org.chorem.pollen.services.exception.InvalidPollFormException; +import org.chorem.pollen.services.service.PollService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.text.ParseException; +import java.util.Date; + +/** + * TODO + * + * @author tchemit <chemit@codelutin.com> + * @since 2.0 + */ +public class PollServiceTest extends AbstractPollenServiceTest { + + protected PollService service; + + @Before + public void setUp() throws ParseException { + + loadFixtures("fixtures"); + + service = serviceContext.getPollService(); + + serviceContext.setDate(new Date(1363948427576l)); + } + + @Test + public void testCreateFreePoll() throws EntityNotFoundException, InvalidPollFormException { + + Poll poll = service.getNewPoll(null, ChoiceType.TEXT); + + poll.setPollType(PollType.FREE); + + try { + service.createPoll(null, poll); + } catch (InvalidPollFormException e) { + // missing title + // missing choice + assertErrorKeyFound(e, "title", "choice"); + } + + poll.setTitle("poll1"); + + Choice choice1 = new Choice(); + poll.addChoice(choice1); + + try { + service.createPoll(null, poll); + } catch (InvalidPollFormException e) { + // missing choice name + assertErrorKeyFound(e, "choice[0].name"); + } + + choice1.setName("A"); + choice1.setDescription("Choice A"); + + + Choice choice2 = new Choice(); + choice2.setName("A"); + choice2.setDescription("Choice B"); + poll.addChoice(choice2); + + try { + service.createPoll(null, poll); + } catch (InvalidPollFormException e) { + // duplicated choice name + assertErrorKeyFound(e, "choice[1].name"); + } + + choice2.setName("B"); + + + Poll createdPoll = service.createPoll(null, poll); + Assert.assertNotNull(createdPoll); + Assert.assertNotNull(createdPoll.getId()); + + Poll reloadedPoll = service.getPoll(createdPoll.getId()); + Assert.assertEquals(createdPoll, reloadedPoll); + + Assert.assertEquals(serviceContext.getNow(), createdPoll.getBeginDate()); + + Assert.assertNotNull(createdPoll.getCreator()); + Assert.assertNotNull(createdPoll.getCreator().getId()); + Assert.assertNotNull(createdPoll.getCreator().getToken()); + Assert.assertNull(createdPoll.getCreator().getName()); + Assert.assertNull(createdPoll.getCreator().getEmail()); + Assert.assertNull(createdPoll.getComment()); + Assert.assertNull(createdPoll.getVote()); + Assert.assertNull(createdPoll.getVoterList()); + + Assert.assertNotNull(createdPoll.getChoice()); + Assert.assertEquals(2, createdPoll.sizeChoice()); + + + Choice createdChoice1 = createdPoll.getChoice(0); + Assert.assertNotNull(createdChoice1); + Assert.assertNotNull(createdChoice1.getId()); + + Choice reloadedChoice1 = serviceContext.getChoiceService().getChoice(createdPoll.getId(), createdChoice1.getId()); + Assert.assertEquals(createdChoice1, reloadedChoice1); + + Assert.assertEquals(choice1.getName(), createdChoice1.getName()); + Assert.assertEquals(choice1.getDescription(), createdChoice1.getDescription()); + Assert.assertEquals(createdPoll.getCreator(), createdChoice1.getCreator()); + + Choice createdChoice2 = createdPoll.getChoice(1); + Assert.assertNotNull(createdChoice2); + Assert.assertNotNull(createdChoice2.getId()); + + Choice reloadedChoice2 = serviceContext.getChoiceService().getChoice(createdPoll.getId(), createdChoice2.getId()); + Assert.assertEquals(createdChoice2, reloadedChoice2); + + Assert.assertEquals(choice2.getName(), createdChoice2.getName()); + Assert.assertEquals(choice2.getDescription(), createdChoice2.getDescription()); + Assert.assertEquals(createdPoll.getCreator(), createdChoice2.getCreator()); + + } + + @Test + public void testCreateRestrictedPoll() throws EntityNotFoundException, InvalidPollFormException { + + Poll poll = service.getNewPoll(null, ChoiceType.TEXT); + poll.setPollType(PollType.RESTRICTED); + + poll.setTitle("poll1"); + + Choice choice1 = new Choice(); + choice1.setName("A"); + choice1.setDescription("Choice A"); + + poll.addChoice(choice1); + + Choice choice2 = new Choice(); + choice2.setName("B"); + choice2.setDescription("Choice B"); + + poll.addChoice(choice2); + + try { + service.createPoll(null, poll); + } catch (InvalidPollFormException e) { + // missing voterList + assertErrorKeyFound(e, "voterList"); + } + + // add voter list + VoterList voterList = new VoterList(); + + poll.addVoterList(voterList); + + try { + service.createPoll(null, poll); + } catch (InvalidPollFormException e) { + // missing name + // missing weight + // missing voterListMember + assertErrorKeyFound(e, "voterList[0].name", "voterList[0].weight", "voterList[0].member"); + } + + voterList.setName("voterList1"); + voterList.setWeight(1); + + VoterListMember voterListMember1 = new VoterListMember(); + voterList.addVoterListMember(voterListMember1); + + try { + service.createPoll(null, poll); + } catch (InvalidPollFormException e) { + // missing member name + // missing member email + assertErrorKeyFound(e, "voterList[0].member[0].name", "voterList[0].member[0].email", "voterList[0].member[0].weight"); + } + + voterListMember1.setName("voter1"); + voterListMember1.setWeight(0.3); + voterListMember1.setEmail("voter1_pollen.org"); + + try { + service.createPoll(null, poll); + } catch (InvalidPollFormException e) { + // invalid member email + assertErrorKeyFound(e, "voterList[0].member[0].email"); + } + + voterListMember1.setEmail("voter1@pollen.org"); + + VoterListMember voterListMember2 = new VoterListMember(); + voterListMember2.setName("voter1"); + voterListMember2.setWeight(0.7); + voterListMember2.setEmail("voter1@pollen.org"); + voterList.addVoterListMember(voterListMember2); + + try { + service.createPoll(null, poll); + } catch (InvalidPollFormException e) { + // same name + // same email + assertErrorKeyFound(e, "voterList[0].member[1].name", "voterList[0].member[1].email"); + } + + voterListMember2.setName("voter2"); + voterListMember2.setEmail("voter2@pollen.org"); + + + Poll createdPoll = service.createPoll(null, poll); + Assert.assertNotNull(createdPoll); + Assert.assertNotNull(createdPoll.getId()); + + Poll reloadedPoll = service.getPoll(createdPoll.getId()); + Assert.assertEquals(createdPoll, reloadedPoll); + + Assert.assertEquals(serviceContext.getNow(), createdPoll.getBeginDate()); + + Assert.assertNotNull(createdPoll.getCreator()); + Assert.assertNotNull(createdPoll.getCreator().getId()); + Assert.assertNotNull(createdPoll.getCreator().getToken()); + Assert.assertNull(createdPoll.getCreator().getName()); + Assert.assertNull(createdPoll.getCreator().getEmail()); + Assert.assertNull(createdPoll.getComment()); + Assert.assertNull(createdPoll.getVote()); + + Assert.assertNotNull(createdPoll.getChoice()); + Assert.assertEquals(2, createdPoll.sizeChoice()); + + Choice createdChoice1 = createdPoll.getChoice(0); + Assert.assertNotNull(createdChoice1); + Assert.assertNotNull(createdChoice1.getId()); + + Choice reloadedChoice1 = serviceContext.getChoiceService().getChoice(createdPoll.getId(), createdChoice1.getId()); + Assert.assertEquals(createdChoice1, reloadedChoice1); + + Assert.assertEquals(choice1.getName(), createdChoice1.getName()); + Assert.assertEquals(choice1.getDescription(), createdChoice1.getDescription()); + Assert.assertEquals(createdPoll.getCreator(), createdChoice1.getCreator()); + + Choice createdChoice2 = createdPoll.getChoice(1); + Assert.assertNotNull(createdChoice2); + Assert.assertNotNull(createdChoice2.getId()); + + Choice reloadedChoice2 = serviceContext.getChoiceService().getChoice(createdPoll.getId(), createdChoice2.getId()); + Assert.assertEquals(createdChoice2, reloadedChoice2); + + Assert.assertEquals(choice2.getName(), createdChoice2.getName()); + 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); + Assert.assertNotNull(createdVoterList); + Assert.assertNotNull(createdVoterList.getId()); + + VoterList reloadedVoterList = serviceContext.getVoterListService().getVoterList(createdPoll.getId(), createdVoterList.getId()); + Assert.assertEquals(createdVoterList, reloadedVoterList); + + Assert.assertEquals(voterList.getName(), createdVoterList.getName()); + Assert.assertEquals(voterList.getWeight(), createdVoterList.getWeight(), 0); + + Assert.assertNotNull(createdVoterList.getVoterListMember()); + Assert.assertEquals(2, createdVoterList.sizeVoterListMember()); + + VoterListMember createdVoterListMember1 = createdVoterList.getVoterListMember(0); + + Assert.assertNotNull(createdVoterListMember1); + Assert.assertNotNull(createdVoterListMember1.getId()); + VoterListMember reloadedVoterListMember1 = serviceContext.getVoterListService().getVoterListMember(createdPoll.getId(), createdVoterList.getId(), createdVoterListMember1.getId()); + Assert.assertEquals(createdVoterListMember1, reloadedVoterListMember1); + + Assert.assertEquals(voterListMember1.getName(), createdVoterListMember1.getName()); + Assert.assertEquals(voterListMember1.getEmail(), createdVoterListMember1.getEmail()); + Assert.assertEquals(voterListMember1.getWeight(), createdVoterListMember1.getWeight(), 0); + + VoterListMember createdVoterListMember2 = createdVoterList.getVoterListMember(1); + + Assert.assertNotNull(createdVoterListMember2); + Assert.assertNotNull(createdVoterListMember2.getId()); + + VoterListMember reloadedVoterListMember2 = serviceContext.getVoterListService().getVoterListMember(createdPoll.getId(), createdVoterList.getId(), createdVoterListMember2.getId()); + Assert.assertEquals(createdVoterListMember2, reloadedVoterListMember2); + + Assert.assertEquals(voterListMember2.getName(), createdVoterListMember2.getName()); + Assert.assertEquals(voterListMember2.getEmail(), createdVoterListMember2.getEmail()); + Assert.assertEquals(voterListMember2.getWeight(), createdVoterListMember2.getWeight(), 0); + + } + +} Property changes on: trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Property changes on: trunk/pollen-ui-js/src/main/webapp/bundle/Messages.properties ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Property changes on: trunk/pollen-ui-js/src/main/webapp/js/libs/jquery.i18n.properties-min-1.0.9.js ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native
participants (1)
-
tchemit@users.chorem.org