Author: fdesbois Date: 2010-05-28 10:40:01 +0200 (Fri, 28 May 2010) New Revision: 3019 Url: http://chorem.org/repositories/revision/pollen/3019 Log: - use EntityTransformer from ToPIA - implement saveVote method (need javadoc and tests) Modified: trunk/pollen-business/pom.xml trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollImpl.java trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceVoteImpl.java trunk/pollen-business/src/main/xmi/pollen.zargo trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/models/PollFormModel.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/Results.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java Modified: trunk/pollen-business/pom.xml =================================================================== --- trunk/pollen-business/pom.xml 2010-05-27 11:35:27 UTC (rev 3018) +++ trunk/pollen-business/pom.xml 2010-05-28 08:40:01 UTC (rev 3019) @@ -113,11 +113,17 @@ <defaultPackage>org.chorem.pollen</defaultPackage> <templates> org.nuiton.topia.generator.TopiaMetaTransformer, + org.nuiton.topia.generator.EntityTransformer, org.nuiton.topia.generator.ServiceTransformer, org.nuiton.eugene.java.JavaInterfaceTransformer, org.nuiton.eugene.java.JavaBeanTransformer, org.nuiton.topia.generator.BinderHelperTransformer </templates> + <excludeTemplates> + <excludeTemplate>org.nuiton.topia.generator.EntityAbstractTransformer</excludeTemplate> + <excludeTemplate>org.nuiton.topia.generator.EntityImplTransformer</excludeTemplate> + <excludeTemplate>org.nuiton.topia.generator.EntityInterfaceTransformer</excludeTemplate> + </excludeTemplates> </configuration> <goals> <goal>smart-generate</goal> Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollImpl.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollImpl.java 2010-05-27 11:35:27 UTC (rev 3018) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollImpl.java 2010-05-28 08:40:01 UTC (rev 3019) @@ -1,7 +1,6 @@ package org.chorem.pollen.entity; -import org.chorem.pollen.PollenBusinessException; import org.chorem.pollen.PollenUtils; import org.chorem.pollen.common.ChoiceType; import org.chorem.pollen.common.PollType; @@ -80,6 +79,6 @@ @Override public boolean isRunning() { - return isStarted() && !isFinished() && !getClosed(); + return isStarted() && !isFinished() && !isClosed(); } } Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceVoteImpl.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceVoteImpl.java 2010-05-27 11:35:27 UTC (rev 3018) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceVoteImpl.java 2010-05-28 08:40:01 UTC (rev 3019) @@ -3,27 +3,25 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.chorem.pollen.EntityQueryProperty; -import org.chorem.pollen.PollenBusinessException; +import org.chorem.pollen.PollenBinderHelper; import org.chorem.pollen.PollenContext; import org.chorem.pollen.PollenDAOHelper; import org.chorem.pollen.PollenException; import org.chorem.pollen.PollenUtils; import org.chorem.pollen.bean.Filter; -import org.chorem.pollen.common.PollType; import org.chorem.pollen.entity.Choice; import org.chorem.pollen.entity.Poll; import org.chorem.pollen.entity.PollAccount; import org.chorem.pollen.entity.PollAccountDAO; import org.chorem.pollen.entity.PollAccountImpl; import org.chorem.pollen.entity.PollDAO; -import org.chorem.pollen.entity.UserAccount; import org.chorem.pollen.entity.Vote; import org.chorem.pollen.entity.VoteDAO; import org.chorem.pollen.entity.VoteImpl; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; import org.nuiton.topia.framework.TopiaQuery; -import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.util.TopiaEntityBinder; import java.util.List; @@ -59,15 +57,34 @@ context.closeTransaction(transaction); } + protected void copyPollAccount(PollAccount source, PollAccount destination) { + + String[] excludes = null; + + // Exclude properties for anonymous account + if (source.isAnonymous()) { + excludes = new String[]{ + PollAccount.NAME, + PollAccount.EMAIL, + PollAccount.USER_ACCOUNT}; + } + + TopiaEntityBinder binder = + PollenBinderHelper.getSimpleTopiaBinder(PollAccount.class); + + binder.copyExcluding(source, destination, excludes); + } + @Override protected boolean executeCanVote(TopiaContext transaction, Poll poll, - PollAccount participant) throws Exception { + PollAccount participant) + throws TopiaException { if (log.isDebugEnabled()) { log.debug("Poll started : " + poll.isStarted()); log.debug("Poll finished : " + poll.isFinished()); - log.debug("Poll closed : " + poll.getClosed()); + log.debug("Poll closed : " + poll.isClosed()); } boolean result = true; if (!poll.isRunning()) { @@ -120,31 +137,6 @@ participant ); -// TopiaQuery query = dao.createQuery("participant"). -// addFrom(Poll.class, "poll"). -// addEquals("poll", poll); -// -// // By default the parentCollection is pollAccount in poll -// String parentCollectionProperty = -// TopiaQuery.getProperty("poll", Poll.POLL_ACCOUNT); -// -// if (poll.getPollType().isGroup()) { -// query.addFrom(PollAccount.class, "group"). -// // It's not really necessary, but better to be sure -// addEquals("group." + PollAccount.LIST, Boolean.TRUE). -// addInElements("group", parentCollectionProperty); -// -// // In case of group, the parentCollection is the child -// // pollAccount from the list -// parentCollectionProperty = -// TopiaQuery.getProperty("group", PollAccount.CHILD); -// } -// -// // Add link between the Account to find and his parent -// query.addInElements("participant", parentCollectionProperty). -// addEquals("participant." + TopiaEntity.TOPIA_ID, -// participant.getTopiaId()); - if (log.isDebugEnabled()) { log.debug("Query : " + query); } @@ -161,8 +153,14 @@ } @Override - protected PollAccount executeGetPollAccount(TopiaContext transaction, String accountUid) throws Exception { - return null; + protected PollAccount executeGetPollAccount(TopiaContext transaction, + String accountUid) + throws Exception { + + PollAccount result = PollenDAOHelper.getPollAccountDAO(transaction). + findByUid(accountUid); + + return result; } @Override @@ -205,24 +203,109 @@ } @Override - protected void executeSaveVote(TopiaContext transaction, Poll poll, + protected String executeSaveVote(TopiaContext transaction, Poll poll, PollAccount participant) - throws PollenBusinessException { + throws TopiaException { // 1- executeCanVote(transaction, poll, participant); // 2- generate uid if needed // 3- update or create participant // 4- add participant in the poll if needed - // 5- save only votes with voteValue != 0 : update or votes - // 6- maybe execute calcul for continuousResults poll + // 5- save only votes with voteValue != 0 : update/create/delete + // 6- execute calcul for continuousResults poll // NEED test : // need existing poll with choices // getNewPollAccount // set some votes for poll choices // saveVote - - + String result = null; + if (executeCanVote(transaction, poll, participant)) { + + PollAccountDAO dao = PollenDAOHelper.getPollAccountDAO(transaction); + + PollAccount participantToSave = + dao.findByTopiaId(participant.getTopiaId()); + + // canVote method check the existence of participant for a + // restricted poll, so the create case is only for FREE poll. + if (participantToSave == null) { + participantToSave = createNewParticipant(transaction, poll); + } + + // Copy data (care about anonymous case) + copyPollAccount(participant, participantToSave); + + // Update vote date + participantToSave.setVoteDate(context.getCurrentDate()); + + // Save votes + saveParticipantVotes(transaction, participant, participantToSave); + + dao.update(participantToSave); + + result = participantToSave.getUid(); + + // TODO-fdesbois-2010-05-27 : execute vote counting if poll.isContinuousResults() + + transaction.commitTransaction(); + } else { + // maybe throw exception + } + + return result; } + + protected PollAccount createNewParticipant(TopiaContext transaction, + Poll poll) + throws TopiaException { + + PollAccountDAO dao = PollenDAOHelper.getPollAccountDAO(transaction); + + // Generate new uid + String newUid = context.createPollenUrlId(); + PollAccount newParticipant = dao.create(newUid); + + // Add the new participant in poll + PollDAO pollDAO = PollenDAOHelper.getPollDAO(transaction); + + Poll pollFound = pollDAO.findByTopiaId(poll.getTopiaId()); + pollFound.addPollAccount(newParticipant); + + pollDAO.update(pollFound); + return newParticipant; + } + + protected void saveParticipantVotes(TopiaContext transaction, + PollAccount source, + PollAccount destination) + throws TopiaException { + + VoteDAO voteDAO = PollenDAOHelper.getVoteDAO(transaction); + for (Vote vote : source.getChoiceVote()) { + + Vote voteToSave = voteDAO.findByTopiaId(vote.getTopiaId()); + + if (vote.getVoteValue() != 0) { + // Create vote + if (voteToSave == null) { + voteToSave = voteDAO.create(); + voteToSave.setChoice(vote.getChoice()); + // Add new vote to destination participant + destination.addChoiceVote(voteToSave); + } + + // Update vote + voteToSave.setVoteValue(vote.getVoteValue()); + voteDAO.update(voteToSave); + + // Delete vote if exist and new value is 0 + } else if (voteToSave != null) { + // Normally the vote will be removed from ChoiceVote list in + // pollAccount. + voteDAO.delete(voteToSave); + } + } + } } Modified: trunk/pollen-business/src/main/xmi/pollen.zargo =================================================================== (Binary files differ) Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/models/PollFormModel.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/models/PollFormModel.java 2010-05-27 11:35:27 UTC (rev 3018) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/models/PollFormModel.java 2010-05-28 08:40:01 UTC (rev 3019) @@ -4,7 +4,6 @@ import org.apache.tapestry5.ValueEncoder; import org.apache.tapestry5.ioc.Messages; import org.chorem.pollen.PollenBusinessException; -import org.chorem.pollen.PollenException; import org.chorem.pollen.common.ChoiceType; import org.chorem.pollen.common.PollType; import org.chorem.pollen.entity.Choice; @@ -363,7 +362,7 @@ } // Add choices is allowed after creation - if (poll.getChoiceAddAllowed()) { + if (poll.isChoiceAddAllowed()) { // Initialize beginChoiceDate if needed Date beginChoiceDate = poll.getBeginChoiceDate(); Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/Results.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/Results.java 2010-05-27 11:35:27 UTC (rev 3018) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/Results.java 2010-05-28 08:40:01 UTC (rev 3019) @@ -486,7 +486,7 @@ creator = poll.getCreator(); // creator = servicePollAccount.findPollAccountById(poll // .getCreatorId()); - if (poll.getPublicResults()) { + if (poll.isPublicResults()) { userAllowed = true; } else if (id.split(":", 2).length == 2) { String creatorId = id.split(":", 2)[1]; @@ -502,7 +502,7 @@ feedback.addError(messages.get("pollNotFound")); } else if (!userAllowed) { feedback.addError(messages.get("userNotAllowed")); - } else if (!poll.getClosed()) { + } else if (!poll.isClosed()) { feedback.addError(messages.get("pollNotClosed")); } } Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java 2010-05-27 11:35:27 UTC (rev 3018) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java 2010-05-28 08:40:01 UTC (rev 3019) @@ -18,18 +18,14 @@ import java.text.DateFormat; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Locale; -import java.util.Map; import org.apache.tapestry5.BindingConstants; import org.apache.tapestry5.Block; import org.apache.tapestry5.ComponentResources; import org.apache.tapestry5.EventContext; -import org.apache.tapestry5.Link; -import org.apache.tapestry5.StreamResponse; import org.apache.tapestry5.annotations.IncludeJavaScriptLibrary; import org.apache.tapestry5.annotations.IncludeStylesheet; import org.apache.tapestry5.annotations.InjectComponent; @@ -47,7 +43,6 @@ import org.chorem.pollen.entity.PollAccount; import org.chorem.pollen.entity.UserAccount; import org.chorem.pollen.entity.Vote; -import org.chorem.pollen.entity.VoteImpl; import org.chorem.pollen.service.ServicePoll; import org.chorem.pollen.service.ServiceUser; import org.chorem.pollen.service.ServiceVote; @@ -157,7 +152,7 @@ // poll = null; // getPoll(); // -// if (getPoll().getClosed()) { +// if (getPoll().isClosed()) { // addInfo(messages.get("pollClosed")); // } else if (!isPollStarted()) { // addInfo(messages.get("pollNotStarted")); @@ -400,7 +395,7 @@ //// } // // public boolean isPollChoiceRunning() throws PollenBusinessException { -// return getPoll().getChoiceAddAllowed() && isPollChoiceStarted(); +// return getPoll().isChoiceAddAllowed() && isPollChoiceStarted(); // } // // /** @@ -606,7 +601,7 @@ // */ // @Deprecated // public boolean isAccountFieldDisplayed() throws PollenBusinessException { -// return !getPoll().getAnonymous() || isRestrictedPoll() || isGroupPoll(); +// return !getPoll().isAnonymous() || isRestrictedPoll() || isGroupPoll(); // } public boolean getCanVote() { @@ -614,7 +609,7 @@ if (poll.isFinished()) { return false; } - if (poll.getPollType().isRestrictedOrGroup() || poll.getAnonymous()) { + if (poll.getPollType().isRestrictedOrGroup() || poll.isAnonymous()) { return serviceVote.canVote(poll, pollAccount); } return true;