r3238 - in branches/pollen-1.2.6-struts2: pollen-persistence/src/main/java/org/chorem/pollen/business/persistence pollen-services/src/main/java/org/chorem/pollen/services/impl
Author: fdesbois Date: 2012-04-06 14:56:13 +0200 (Fri, 06 Apr 2012) New Revision: 3238 Url: http://chorem.org/repositories/revision/pollen/3238 Log: - create empty list instance if collections from entities are null - add method getPollEditable for update Added: branches/pollen-1.2.6-struts2/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/VotingListImpl.java Modified: branches/pollen-1.2.6-struts2/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/PollImpl.java branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/VoteService.java Modified: branches/pollen-1.2.6-struts2/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/PollImpl.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/PollImpl.java 2012-04-06 07:51:35 UTC (rev 3237) +++ branches/pollen-1.2.6-struts2/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/PollImpl.java 2012-04-06 12:56:13 UTC (rev 3238) @@ -24,13 +24,64 @@ package org.chorem.pollen.business.persistence; import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; import java.util.Date; +import java.util.List; public class PollImpl extends PollAbstract { private static final long serialVersionUID = 1L; + @Override + public List<Vote> getVote() { + if (vote == null) { + vote = Lists.newArrayList(); + } + return vote; + } + + @Override + public List<Choice> getChoice() { + if (choice == null) { + choice = Lists.newArrayList(); + } + return choice; + } + + @Override + public List<Result> getResult() { + if (result == null) { + result = Lists.newArrayList(); + } + return result; + } + + @Override + public List<Comment> getComment() { + if (comment == null) { + comment = Lists.newArrayList(); + } + return comment; + } + + @Override + public List<PreventRule> getPreventRule() { + if (preventRule == null) { + preventRule = Lists.newArrayList(); + } + return preventRule; + } + + @Override + public List<VotingList> getVotingList() { + if (votingList == null) { + votingList = Lists.newArrayList(); + } + return votingList; + } + + @Override public Vote getVoteByPollAccount(PollAccount account) { Preconditions.checkNotNull(account); Vote resultVote = null; @@ -88,5 +139,15 @@ public boolean isAddChoiceFinished(Date currentDate) { return !choiceAddAllowed || (endChoiceDate != null && endChoiceDate.after(currentDate)); } + + public PreventRule getPreventRuleByScope(String scope) { + Preconditions.checkNotNull(scope); + for (PreventRule value : getPreventRule()) { + if (scope.equals(value.getScope())) { + return value; + } + } + return null; + } } //PollImpl Added: branches/pollen-1.2.6-struts2/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/VotingListImpl.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/VotingListImpl.java (rev 0) +++ branches/pollen-1.2.6-struts2/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/VotingListImpl.java 2012-04-06 12:56:13 UTC (rev 3238) @@ -0,0 +1,23 @@ +package org.chorem.pollen.business.persistence; + +import com.google.common.collect.Lists; + +import java.util.List; + +/** + * Created: 05/04/12 + * + * @author fdesbois <desbois@codelutin.com> + */ +public class VotingListImpl extends VotingListAbstract { + + private static final long serialVersionUID = 1L; + + @Override + public List<PersonToList> getPollAccountPersonToList() { + if (pollAccountPersonToList == null) { + pollAccountPersonToList = Lists.newArrayList(); + } + return pollAccountPersonToList; + } +} Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java 2012-04-06 07:51:35 UTC (rev 3237) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java 2012-04-06 12:56:13 UTC (rev 3238) @@ -114,6 +114,106 @@ return result; } + /** + * Retrieve a Poll for edition. It is loaded from database if {@code pollUid} + * is defined, otherwise a new instance is returned. The {@code clone} + * parameter will return the {@code poll} without any technical properties (topiaId) + * and ensure business ids (accountUid, pollUid) with new values. If {@code userId} + * matches an existing {@link UserAccount}, the resulting poll creator will + * be attached to it. + * + * @param pollUid Uid of the poll to edit, if not defined, a new poll is instanciated + * @param userAccount User account to attach to the creator + * @param clone Flag to copy or not ids in case of poll cloning + * @return the Poll ready for edition (no longer linked to the topia context) + * @see #getNewPoll(UserAccount) + */ + public Poll getPollEditable(String pollUid, UserAccount userAccount, boolean clone) { + + Poll result; + if (pollUid == null) { + result = getNewPoll(userAccount); + + } else { + + Poll pollLoaded = getPollByPollId(pollUid); + + PollDAO pollDAO = getDAO(Poll.class); + result = newInstance(pollDAO); + + PollenBinderHelper.simpleCopy(pollLoaded, result, !clone); + if (clone) { + result.setPollId(serviceContext.createPollenUrlId()); + } + + // -- Creator -- // + PollAccount creatorLoaded = pollLoaded.getCreator(); + PollAccountDAO pollAccountDAO = getDAO(PollAccount.class); + PollAccount creatorEditable = newInstance(pollAccountDAO); + result.setCreator(creatorEditable); + + PollenBinderHelper.simpleCopy( + creatorLoaded, creatorEditable, !clone); + if (clone) { + creatorEditable.setAccountId(serviceContext.createPollenUrlId()); + } + + if (creatorLoaded.getUserAccount() != null) { + creatorEditable.setUserAccount(creatorLoaded.getUserAccount()); + + // Set userAccount from arguments + } else if (userAccount != null) { + creatorEditable.setUserAccount(userAccount); + } + + // -- Choice -- // + ChoiceDAO choiceDAO = getDAO(Choice.class); + for (Choice choiceLoaded : pollLoaded.getChoice()) { + Choice choiceEditable = newInstance(choiceDAO); + result.addChoice(choiceEditable); + PollenBinderHelper.simpleCopy( + choiceLoaded, choiceEditable, !clone); + } + + // -- VotingList -- // + VotingListDAO votingListDAO = getDAO(VotingList.class); + PersonToListDAO personToListDAO = getDAO(PersonToList.class); + for (VotingList votingListLoaded : pollLoaded.getVotingList()) { + VotingList votingListEditable = newInstance(votingListDAO); + result.addVotingList(votingListLoaded); + PollenBinderHelper.simpleCopy( + votingListLoaded, votingListEditable, !clone); + + for (PersonToList personToListLoaded : votingListLoaded.getPollAccountPersonToList()) { + PersonToList personToListEditable = newInstance(personToListDAO); + votingListEditable.addPollAccountPersonToList(personToListEditable); + PollenBinderHelper.simpleCopy( + personToListLoaded, personToListEditable, !clone); + + PollAccount personLoaded = personToListLoaded.getPollAccount(); + PollAccount personEditable = newInstance(pollAccountDAO); + personToListEditable.setPollAccount(personEditable); + // copy the person, keeping topiaId is useless because we have the link with PersonToList + PollenBinderHelper.simpleCopy( + personLoaded, personEditable, false); + if (clone) { + personEditable.setAccountId(serviceContext.createPollenUrlId()); + } + } + } + + // -- PreventRule -- // + PreventRuleDAO preventRuleDAO = getDAO(PreventRule.class); + for (PreventRule preventRuleLoaded : pollLoaded.getPreventRule()) { + PreventRule preventRuleEditable = newInstance(preventRuleDAO); + PollenBinderHelper.simpleCopy( + preventRuleLoaded, preventRuleEditable, !clone); + result.addPreventRule(preventRuleEditable); + } + } + return result; + } + public Poll createPoll(Poll poll) { PollDAO pollDAO = getDAO(Poll.class); @@ -153,71 +253,19 @@ result.setCreator(creatorCreated); - if (!poll.isPreventRuleEmpty()) { - - // create prevent rules - - PreventRuleDAO preventRuleDAO = getDAO(PreventRule.class); - for (PreventRule preventRule : poll.getPreventRule()) { - PreventRule preventRuleCreated = create(preventRuleDAO); - preventRuleCreated.setActive(preventRule.isActive()); - preventRuleCreated.setMethod(preventRule.getMethod()); - preventRuleCreated.setOneTime(preventRule.isOneTime()); - preventRuleCreated.setRepeated(preventRule.isRepeated()); - preventRuleCreated.setScope(preventRule.getScope()); - preventRuleCreated.setSensibility(preventRule.getSensibility()); - result.addPreventRule(preventRuleCreated); - } + // -- Choice -- // + for (Choice choice : poll.getChoice()) { + saveChoice(result, choice); } - if (!poll.isVotingListEmpty()) { - - // create voting list - - VotingListDAO votingListDAO = getDAO(VotingList.class); - PersonToListDAO personToListDAO = getDAO(PersonToList.class); - - for (VotingList votingList : poll.getVotingList()) { - VotingList votingListCreated = create(votingListDAO); - - votingListCreated.setName(votingList.getName()); - votingListCreated.setWeight(votingList.getWeight()); - - if (!votingList.isPollAccountPersonToListEmpty()) { - - // create poll account of the voting list - - for (PersonToList personToList : votingList.getPollAccountPersonToList()) { - - PersonToList personToListCreated = create(personToListDAO); - personToListCreated.setHasVoted(personToList.isHasVoted()); - personToListCreated.setWeight(personToList.getWeight()); - - PollAccount pollAccount = personToList.getPollAccount(); - PollAccount pollAccountCreated = create(pollAccountDAO); - pollAccountCreated.setAccountId(pollAccount.getAccountId()); - pollAccountCreated.setEmail(pollAccount.getEmail()); - pollAccountCreated.setUserAccount(pollAccount.getUserAccount()); - pollAccountCreated.setVotingId(pollAccount.getVotingId()); - - personToListCreated.setPollAccount(pollAccountCreated); - - // The model doesn't have any composition for this relation, the link must be set in both objects - personToListCreated.setVotingList(votingListCreated); - votingListCreated.addPollAccountPersonToList(personToListCreated); - } - } - result.addVotingList(votingListCreated); - } + // -- PreventRule -- // + for (Choice choice : poll.getChoice()) { + saveChoice(result, choice); } - if (!poll.isChoiceEmpty()) { - - // create choices - for (Choice choice : poll.getChoice()) { - - addChoice(result, choice); - } + // -- VotingList -- // + for (VotingList votingList : poll.getVotingList()) { + saveVotingList(result, votingList); } commitTransaction("Could not create poll " + poll.getTitle()); @@ -238,67 +286,45 @@ public void updatePoll(Poll poll) throws PollNotFoundException { -// Poll result; -// try { -// -// PollDAO dao = getDAO(Poll.class); -// -// if (!dao.existByTopiaId(poll.getTopiaId())) { -// throw new PollNotFoundException(); -// } -// -// result = dao.update(poll); -// -// } catch (TopiaException e) { -// throw new PollenTechnicalException("Can't update poll [" + poll.getTopiaId() + "]", e); -// } -// return result; - Poll pollToUpdate = getEntityById(Poll.class, poll.getTopiaId()); if (pollToUpdate == null) { throw new PollNotFoundException(); } - PollenBinderHelper.copy("", poll, pollToUpdate, false); + PollAccount creatorToUpdate = pollToUpdate.getCreator(); + // FIXME-fdesbois-2012-04-05 : improve binder to avoid creator copy + PollenBinderHelper.simpleCopy(poll, pollToUpdate, false); + // -- Creator -- // PollAccount creator = poll.getCreator(); - PollAccount creatorToUpdate = pollToUpdate.getCreator(); creatorToUpdate.setUserAccount(creator.getUserAccount()); creatorToUpdate.setVotingId(creator.getVotingId()); creatorToUpdate.setEmail(creator.getEmail()); - pollToUpdate.setCreator(creatorToUpdate); // -- Choices -- // - pollToUpdate.clearChoice(); + + // FIXME-fdesbois-2012-04-05 : manage remove + for (Choice choice : poll.getChoice()) { - addChoice(pollToUpdate, choice); + saveChoice(pollToUpdate, choice); } // -- PreventRules -- // - - // We assume that all previous preventRules will be deleted - pollToUpdate.clearPreventRule(); - - // Create the new preventRules - PreventRuleDAO preventRuleDAO = getDAO(PreventRule.class); for (PreventRule preventRule : poll.getPreventRule()) { - PreventRule preventRuleCreated = create(preventRuleDAO); - preventRuleCreated.setActive(preventRule.isActive()); - preventRuleCreated.setMethod(preventRule.getMethod()); - preventRuleCreated.setOneTime(preventRule.isOneTime()); - preventRuleCreated.setRepeated(preventRule.isRepeated()); - preventRuleCreated.setScope(preventRule.getScope()); - preventRuleCreated.setSensibility(preventRule.getSensibility()); - pollToUpdate.addPreventRule(preventRuleCreated); + savePreventRule(pollToUpdate, preventRule); } // -- VotingLists -- // - pollToUpdate.clearVotingList(); + + // FIXME-fdesbois-2012-04-05 : missing delete-orphan on VotingList, if PollType change, VotingList must be deleted + for (VotingList votingList : poll.getVotingList()) { - addVotingList(pollToUpdate, votingList); + saveVotingList(pollToUpdate, votingList); } + + commitTransaction("Could not update poll [" + poll.getTopiaId() + "]"); } public String getPollVoteUrl(Poll poll) { @@ -625,22 +651,23 @@ throw new PollNotFoundException(); } - addChoice(poll, choice); + saveChoice(poll, choice); commitTransaction("Can't create new choice [" + poll.getChoiceType() + "] for poll '" + pollId + "'"); } - protected void addChoice(Poll poll, Choice choice) { + protected void saveChoice(Poll poll, Choice choice) { ChoiceType choiceType = poll.getChoiceType(); ChoiceDAO dao = getDAO(Choice.class); Choice choiceLoaded; if (choice.getTopiaId() == null) { choiceLoaded = create(dao); + poll.addChoice(choiceLoaded); + } else { - choiceLoaded = getEntityById(Choice.class, choice.getTopiaId()); + choiceLoaded = poll.getChoiceByTopiaId(choice.getTopiaId()); } - poll.addChoice(choiceLoaded); if (choiceType == ChoiceType.IMAGE) { @@ -867,7 +894,7 @@ // } } - protected void addVotingList(Poll poll, VotingList votingList) { + protected void saveVotingList(Poll poll, VotingList votingList) { VotingListDAO votingListDAO = getDAO(VotingList.class); PersonToListDAO personToListDAO = getDAO(PersonToList.class); @@ -877,10 +904,14 @@ VotingList votingListLoaded; if (votingList.getTopiaId() == null) { votingListLoaded = create(votingListDAO); + poll.addVotingList(votingListLoaded); + } else { - votingListLoaded = getEntityById(VotingList.class, votingList.getTopiaId()); + votingListLoaded = poll.getVotingListByTopiaId(votingList.getTopiaId()); + + // It's seems stupid, but it doesn't work without it + votingListLoaded.setPoll(poll); } - poll.addVotingList(votingListLoaded); votingListLoaded.setName(votingList.getName()); votingListLoaded.setWeight(votingList.getWeight()); @@ -891,8 +922,13 @@ PersonToList personToListLoaded; if (personToList.getTopiaId() == null) { personToListLoaded = create(personToListDAO); + votingListLoaded.addPollAccountPersonToList(personToListLoaded); + + // The model doesn't have any composition for this relation, the link must be set in both objects + personToListLoaded.setVotingList(votingListLoaded); + } else { - personToListLoaded = getEntityById(PersonToList.class, personToList.getTopiaId()); + personToListLoaded = votingListLoaded.getPollAccountPersonToListByTopiaId(personToList.getTopiaId()); } // personToListLoaded.setHasVoted(personToList.isHasVoted()); @@ -911,11 +947,27 @@ pollAccountLoaded.setEmail(pollAccount.getEmail()); // pollAccountLoaded.setUserAccount(pollAccount.getUserAccount()); pollAccountLoaded.setVotingId(pollAccount.getVotingId()); + } + } + + protected void savePreventRule(Poll poll, PreventRule preventRule) { - // The model doesn't have any composition for this relation, the link must be set in both objects - personToListLoaded.setVotingList(votingListLoaded); - votingListLoaded.addPollAccountPersonToList(personToListLoaded); + PreventRuleDAO preventRuleDAO = getDAO(PreventRule.class); + + PreventRule preventRuleLoaded; + if (preventRule.getTopiaId() == null) { + preventRuleLoaded = create(preventRuleDAO); + poll.addPreventRule(preventRuleLoaded); + + } else { + preventRuleLoaded = poll.getPreventRuleByTopiaId(preventRule.getTopiaId()); } + preventRuleLoaded.setActive(preventRule.isActive()); + preventRuleLoaded.setMethod(preventRule.getMethod()); + preventRuleLoaded.setOneTime(preventRule.isOneTime()); + preventRuleLoaded.setRepeated(preventRule.isRepeated()); + preventRuleLoaded.setScope(preventRule.getScope()); + preventRuleLoaded.setSensibility(preventRule.getSensibility()); } /** Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/VoteService.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/VoteService.java 2012-04-06 07:51:35 UTC (rev 3237) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/VoteService.java 2012-04-06 12:56:13 UTC (rev 3238) @@ -97,8 +97,10 @@ Vote result; if (voteLoaded != null) { - result = copyVote(voteLoaded); + result = newInstance(dao); + PollenBinderHelper.simpleCopy(voteLoaded, result, true); + // Attach the given accountEditable instead of the loaded one result.setPollAccount(accountEditable); @@ -129,6 +131,7 @@ result = getNewVote(poll, accountEditable); } + // Retrieve weight for Restricted Poll with existing account if (poll.getPollType() != PollType.FREE && accountEditable.getTopiaId() != null) { PersonToListDAO personToListDAO = getDAO(PersonToList.class); PersonToList personToList = personToListDAO.findByPollAndAccount(poll, accountEditable); @@ -136,13 +139,6 @@ } return result; } - - protected Vote copyVote(Vote source) { - VoteDAO dao = getDAO(Vote.class); - Vote result = newInstance(dao); - PollenBinderHelper.copy("", source, result, true); - return result; - } /** * Retrieve the URL to update a vote based on {@link PollUri}.
participants (1)
-
fdesbois@users.chorem.org