r3422 - in trunk: pollen-services/src/main/java/org/chorem/pollen/services pollen-services/src/main/java/org/chorem/pollen/services/impl pollen-services/src/test/java/org/chorem/pollen/services pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll
Author: tchemit Date: 2012-06-05 09:40:14 +0200 (Tue, 05 Jun 2012) New Revision: 3422 Url: http://chorem.org/repositories/revision/pollen/3422 Log: fixes #583: Make sure pollId is never used twice Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/DefaultPollenServiceContext.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceContext.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceSupport.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java trunk/pollen-services/src/test/java/org/chorem/pollen/services/FakeServiceContext.java trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/LoadPoll.java trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/SavePoll.java Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/DefaultPollenServiceContext.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/DefaultPollenServiceContext.java 2012-06-05 07:32:19 UTC (rev 3421) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/DefaultPollenServiceContext.java 2012-06-05 07:40:14 UTC (rev 3422) @@ -30,7 +30,6 @@ import java.net.URL; import java.util.Date; import java.util.Locale; -import java.util.UUID; /** * Instances of this class will be given to service factory. @@ -116,17 +115,7 @@ return serviceFactory; } - /** - * Create an id to easily managed polls using urls. - * - * @return a fresh generated String - */ @Override - public String createPollenUrlId() { - return UUID.randomUUID().toString().replaceAll("-", ""); - } - - @Override public Date getCurrentTime() { return new Date(); } Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceContext.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceContext.java 2012-06-05 07:32:19 UTC (rev 3421) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceContext.java 2012-06-05 07:40:14 UTC (rev 3422) @@ -55,15 +55,6 @@ <E extends PollenService> E newService(Class<E> clazz); - /** - * createPollenUrlId : - * Create a unique UId for entities which need it (PollAccount, Poll). - * This UId represent the entity in UI module. - * - * @return String - */ - String createPollenUrlId(); - /** @return the current date */ Date getCurrentTime(); Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceSupport.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceSupport.java 2012-06-05 07:32:19 UTC (rev 3421) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceSupport.java 2012-06-05 07:40:14 UTC (rev 3422) @@ -148,6 +148,13 @@ } } + protected <T extends TopiaEntity, D extends TopiaDAO<? super T>> T createWithProperties(D dao, Object... properties) { + try { + return (T) dao.create(properties); + } catch (TopiaException e) { + throw new PollenTechnicalException("Could not create entity ", e); + } + } protected <T extends TopiaEntity, D extends TopiaDAO<? super T>> T update(D dao, T entity) { try { return (T) dao.update(entity); Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java 2012-06-05 07:32:19 UTC (rev 3421) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java 2012-06-05 07:40:14 UTC (rev 3422) @@ -77,6 +77,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.UUID; import static org.nuiton.i18n.I18n.l_; @@ -85,44 +86,8 @@ /** Logger. */ private static final Log log = LogFactory.getLog(PollService.class); - /** - * Build a new Poll instance with given {@code user} as creator - * - * @param user Build a new Poll instance with given {@code user} as creator - * @return Build a new Poll instance with given {@code user} as creator - */ - public Poll getNewPoll(UserAccount user) { + public static final String THUMB_PREFIX = "thumb_"; - PollDAO pollDAO = getDAO(Poll.class); - Poll result = newInstance(pollDAO); - - PollenConfiguration configuration = getConfiguration(); - - // default values from configuration - result.setChoiceType(configuration.getDefaultChoiceType()); - result.setVoteCountingType(configuration.getDefaultVoteCountingType()); - result.setPollType(configuration.getDefaultPollType()); - - // Initialize creator of the poll - PollAccountDAO pollAccountDAO = getDAO(PollAccount.class); - PollAccount creator = newInstance(pollAccountDAO); - creator.setAccountId(serviceContext.createPollenUrlId()); - - if (user != null) { - - // Link the creator with the user - creator.setVotingId(user.getDisplayName()); - creator.setEmail(user.getEmail()); - creator.setUserAccount(user); - } - result.setCreator(creator); - - // Generate Uid to have a unique poll. Will avoid multi-submit, existing - // poll will be check by its uid. - result.setPollId(serviceContext.createPollenUrlId()); - 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} @@ -132,122 +97,29 @@ * 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 userAccount Optinal 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) - * @see #getNewPollCopy(Poll, UserAccount, boolean) + * @see #getNewPollCopy(String, UserAccount, boolean) */ - public Poll getPollEditable(String pollUid, UserAccount userAccount, boolean clone) { - + public Poll getPollEditable(String pollUid, + UserAccount userAccount, + boolean clone) throws PollNotFoundException { Poll result; - if (pollUid == null) { - result = getNewPoll(userAccount); + if (StringUtils.isEmpty(pollUid)) { + + // creates a new poll + result = getNewPoll(userAccount); } else { - Poll poll = getPollByPollId(pollUid); - - if (poll == null) { - result = getNewPoll(userAccount); - - } else { - result = getNewPollCopy(poll, userAccount, clone); - } + // obtains a copy of an existing poll + result = getNewPollCopy(pollUid, userAccount, clone); } return result; } - protected Poll getNewPollCopy(Poll source, UserAccount userAccount, boolean clone) { - - Preconditions.checkNotNull(source); - - PollDAO pollDAO = getDAO(Poll.class); - Poll result = newInstance(pollDAO); - - PollenBinderHelper.simpleCopy(source, result, !clone); - if (clone) { - result.setPollId(serviceContext.createPollenUrlId()); - } - - // -- Creator -- // - PollAccount creatorLoaded = source.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 -- // - Function<Choice, Choice> choiceCreator = - PollenServiceFunctions.newChoiceCreator(source.getChoiceType()); - Iterable<Choice> choices = - Iterables.transform(source.getChoice(), choiceCreator); - - for (Choice choiceLoaded : choices) { - // Reset topiaId for clone case - if (clone) { - choiceLoaded.setTopiaId(null); - } - result.addChoice(choiceLoaded); - } - - // -- VotingList -- // - VotingListDAO votingListDAO = getDAO(VotingList.class); - PersonToListDAO personToListDAO = getDAO(PersonToList.class); - for (VotingList votingListLoaded : source.getVotingList()) { - VotingList votingListEditable = newInstance(votingListDAO); - result.addVotingList(votingListEditable); - // Do not keep votingLists topiaId, to simplify the update will delete old votingLists and create new ones - PollenBinderHelper.simpleCopy( - votingListLoaded, votingListEditable, false); - - for (PersonToList personToListLoaded : votingListLoaded.getPollAccountPersonToList()) { - PersonToList personToListEditable = newInstance(personToListDAO); - votingListEditable.addPollAccountPersonToList(personToListEditable); - // Do not keep personToLists topiaId, to simplify the update will delete old personToLists and create new ones - PollenBinderHelper.simpleCopy( - personToListLoaded, personToListEditable, false); - - 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 : source.getPreventRule()) { - PreventRule preventRuleEditable = newInstance(preventRuleDAO); - PollenBinderHelper.simpleCopy( - preventRuleLoaded, preventRuleEditable, !clone); - result.addPreventRule(preventRuleEditable); - } - - // Load votes to have the correct size used to check if vote is started - result.setVote(source.getVote()); - - return result; - } - public Map<String, Object> pollToMap(Poll poll, Binder<Poll, Poll> binder) { Map<String, Object> map = binder.obtainProperties( @@ -307,7 +179,8 @@ public Poll createPoll(Poll poll) { PollDAO pollDAO = getDAO(Poll.class); - Poll result = create(pollDAO); + Poll result = createWithProperties(pollDAO, + Poll.PROPERTY_POLL_ID, generateId()); // check max number choice authorized (can not be more than // XXX-fdesbois-2012-04-11 : don't know why the maxNbChoice must be @@ -328,7 +201,6 @@ result.setDescription(poll.getDescription()); result.setEndDate(poll.getEndDate()); result.setEndChoiceDate(poll.getEndChoiceDate()); - result.setPollId(poll.getPollId()); // TODO AThimel 04/06/2012 pollId coming from the JSP page ???? result.setPollType(poll.getPollType()); result.setMaxChoiceNb(poll.getMaxChoiceNb()); result.setPublicResults(poll.isPublicResults()); @@ -337,12 +209,13 @@ // create creator PollAccountDAO pollAccountDAO = getDAO(PollAccount.class); - PollAccount creatorCreated = create(pollAccountDAO); + PollAccount creatorCreated = createWithProperties( + pollAccountDAO, + PollAccount.PROPERTY_ACCOUNT_ID, generateId()); PollAccount creator = poll.getCreator(); creatorCreated.setVotingId(creator.getVotingId()); creatorCreated.setEmail(creator.getEmail()); creatorCreated.setUserAccount(creator.getUserAccount()); - creatorCreated.setAccountId(creator.getAccountId()); result.setCreator(creatorCreated); @@ -448,59 +321,6 @@ commitTransaction("Could not update poll [" + poll.getTopiaId() + "]"); } -// public PollUrl getPollVoteUrl(Poll poll, boolean moderate) { -// URL applicationUrl = serviceContext.getApplicationURL(); -// String baseUrl = applicationUrl + "/poll/votefor/"; -// PollUri pollUri = PollUri.newPollUri(poll.getPollId()); -// -// if (moderate) { -// String creatorId = poll.getCreator().getAccountId(); -// pollUri.setAccountId(creatorId); -// } -// -// PollUrl result = PollUrl.newPollUrl(baseUrl, pollUri); -// return result; -// } - -// public PollUrl getPollUpdateVoteUrl(Poll poll) { -// Preconditions.checkNotNull(poll); -// -// URL applicationUrl = serviceContext.getApplicationURL(); -// String baseUrl = applicationUrl + "/poll/votefor/"; -// PollUri pollUri = PollUri.newPollUri(poll.getPollId()); -// -// String creatorId = poll.getCreator().getAccountId(); -// pollUri.setAccountId(creatorId); -// -// PollUrl result = PollUrl.newPollUrl(baseUrl, pollUri); -// return result; -// } - -// public PollUrl getPollEditUrl(Poll poll) { -// URL applicationUrl = serviceContext.getApplicationURL(); -// String baseUrl = applicationUrl + "/poll/modification/"; -// -// String creatorId = poll.getCreator().getAccountId(); -// PollUri pollUri = PollUri.newPollUri(poll.getPollId(), creatorId); -// -// PollUrl result = PollUrl.newPollUrl(baseUrl, pollUri); -// return result; -// } - -// public PollUrl getPollResultUrl(Poll poll) { -// URL applicationUrl = serviceContext.getApplicationURL(); -// String baseUrl = applicationUrl + "/poll/results/"; -// PollUri pollUri = PollUri.newPollUri(poll.getPollId()); -// -// if (!poll.isPublicResults()) { -// String creatorId = poll.getCreator().getAccountId(); -// pollUri.setAccountId(creatorId); -// } -// -// PollUrl result = PollUrl.newPollUrl(baseUrl, pollUri); -// return result; -// } - public List<Poll> getPolls(TopiaFilterPagerUtil.FilterPagerBean pager) { Preconditions.checkNotNull(pager); @@ -626,7 +446,9 @@ * @throws PollAccountNotFound if accountId is defined and doesn't match any * existing PollAccount */ - public PollAccount getPollAccountEditable(String accountId, UserAccount userAccount, Poll poll) throws PollAccountNotFound { + public PollAccount getPollAccountEditable(String accountId, + UserAccount userAccount, + Poll poll) throws PollAccountNotFound { PollAccount result = null; if (StringUtils.isNotEmpty(accountId)) { PollAccount pollAccountLoaded = getPollAccountByAccountId(accountId); @@ -638,10 +460,11 @@ result.setUserAccount(userAccount); if (log.isDebugEnabled()) { - log.debug(String.format("Attach User '%s' [%s] to the existing Account [%s]", - userAccount.getDisplayName(), - userAccount.getTopiaId(), - accountId + log.debug(String.format( + "Attach User '%s' [%s] to the existing Account [%s]", + userAccount.getDisplayName(), + userAccount.getTopiaId(), + accountId )); } } @@ -653,7 +476,8 @@ PollAccountDAO pollAccountDAO = getDAO(PollAccount.class); PollAccount pollAccountLoaded; try { - pollAccountLoaded = pollAccountDAO.findByPollVoteUser(poll, userAccount); + pollAccountLoaded = + pollAccountDAO.findByPollVoteUser(poll, userAccount); } catch (TopiaException e) { throw new PollenTechnicalException(e); } @@ -663,9 +487,10 @@ } if (log.isDebugEnabled()) { - String account = result == null - ? "null" - : result.getVotingId() + " [" + result.getAccountId() + "]"; + String account = + result == null + ? "null" + : result.getVotingId() + " [" + result.getAccountId() + "]"; log.debug(String.format( "PollAccount found from user '%s' = %s", @@ -681,6 +506,149 @@ return result; } + /** + * Build a new Poll instance with given {@code user} as creator + * + * @param user Build a new Poll instance with given {@code user} as creator + * @return Build a new Poll instance with given {@code user} as creator + */ + protected Poll getNewPoll(UserAccount user) { + + PollDAO pollDAO = getDAO(Poll.class); + Poll result = newInstance(pollDAO); + + PollenConfiguration configuration = getConfiguration(); + + // default values from configuration + result.setChoiceType(configuration.getDefaultChoiceType()); + result.setVoteCountingType(configuration.getDefaultVoteCountingType()); + result.setPollType(configuration.getDefaultPollType()); + + // Initialize creator of the poll + PollAccountDAO pollAccountDAO = getDAO(PollAccount.class); + PollAccount creator = newInstance(pollAccountDAO); + + if (user != null) { + + // Link the creator with the user + creator.setVotingId(user.getDisplayName()); + creator.setEmail(user.getEmail()); + creator.setUserAccount(user); + } + result.setCreator(creator); + + return result; + } + + /** + * Obtains a copy of an existing poll given his {@code pollUid}. + * <p/> + * If flag {@code clone} is setted to {@code true}, then all id will + * be removed (pollId, accountId, topiaId). + * + * @param pollUid the {@link Poll#getPollId()} of the poll to copy + * @param userAccount optional incoming user account to link to the + * {@link Poll#getCreator()} + * @param clone flag to clone or not the copy of the poll (if setted + * to {@code true} then all id will be removed). + * @return the copy of the poll + * @throws PollNotFoundException if poll was not found + */ + protected Poll getNewPollCopy(String pollUid, + UserAccount userAccount, + boolean clone) throws PollNotFoundException { + + // pollUid can not be blank + Preconditions.checkState(StringUtils.isNotBlank(pollUid)); + + // load for sure existing poll + Poll poll = getExistingPollByPollId(pollUid); + + PollDAO pollDAO = getDAO(Poll.class); + Poll result = newInstance(pollDAO); + + PollenBinderHelper.simpleCopy(poll, result, !clone); + if (clone) { + // reset id for clone case + result.setPollId(null); + } + + // -- Creator -- // + PollAccount creatorLoaded = poll.getCreator(); + PollAccountDAO pollAccountDAO = getDAO(PollAccount.class); + PollAccount creatorEditable = newInstance(pollAccountDAO); + result.setCreator(creatorEditable); + + PollenBinderHelper.simpleCopy(creatorLoaded, creatorEditable, !clone); + if (clone) { + // reset id for clone case + creatorEditable.setAccountId(null); + } + + if (creatorEditable.getUserAccount() == null) { + // use the incoming userAccount + creatorEditable.setUserAccount(userAccount); + } + + // -- Choice -- // + Function<Choice, Choice> choiceCreator = + PollenServiceFunctions.newChoiceCreator(poll.getChoiceType()); + Iterable<Choice> choices = + Iterables.transform(poll.getChoice(), choiceCreator); + + for (Choice choiceLoaded : choices) { + if (clone) { + // reset id for clone case + choiceLoaded.setTopiaId(null); + } + result.addChoice(choiceLoaded); + } + + // -- VotingList -- // + VotingListDAO votingListDAO = getDAO(VotingList.class); + PersonToListDAO personToListDAO = getDAO(PersonToList.class); + for (VotingList votingListLoaded : poll.getVotingList()) { + VotingList votingListEditable = newInstance(votingListDAO); + result.addVotingList(votingListEditable); + // Do not keep votingLists topiaId, to simplify the update will delete old votingLists and create new ones + PollenBinderHelper.simpleCopy( + votingListLoaded, votingListEditable, false); + + for (PersonToList personToListLoaded : votingListLoaded.getPollAccountPersonToList()) { + PersonToList personToListEditable = newInstance(personToListDAO); + votingListEditable.addPollAccountPersonToList(personToListEditable); + // Do not keep personToLists topiaId, to simplify the update will delete old personToLists and create new ones + PollenBinderHelper.simpleCopy( + personToListLoaded, personToListEditable, false); + + 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) { + // reset id for clone case + personEditable.setAccountId(null); + } + } + } + + // -- PreventRule -- // + PreventRuleDAO preventRuleDAO = getDAO(PreventRule.class); + for (PreventRule preventRuleLoaded : poll.getPreventRule()) { + PreventRule preventRuleEditable = newInstance(preventRuleDAO); + PollenBinderHelper.simpleCopy( + preventRuleLoaded, preventRuleEditable, !clone); + result.addPreventRule(preventRuleEditable); + } + + // Load votes to have the correct size used to check if vote is started + result.setVote(poll.getVote()); + + return result; + } + protected PollAccount copyPollAccount(PollAccount source) { PollAccountDAO dao = getDAO(PollAccount.class); PollAccount result = newInstance(dao); @@ -692,7 +660,6 @@ public PollAccount getNewPollAccount(UserAccount userAccount) { PollAccountDAO dao = getDAO(PollAccount.class); PollAccount result = newInstance(dao); - result.setAccountId(serviceContext.createPollenUrlId()); String votingId = userAccount != null ? userAccount.getDisplayName() : ""; result.setVotingId(votingId); result.setUserAccount(userAccount); @@ -861,7 +828,6 @@ } else if (choiceType == ChoiceType.DATE) { // date choice - PollDateChoice dateChoice = (PollDateChoice) choice; dateChoice.toChoice(choiceLoaded); @@ -985,8 +951,6 @@ } - public static final String THUMB_PREFIX = "thumb_"; - /** * Sauvegarde des images d'un choix de type image. * @@ -1008,38 +972,10 @@ createThumbnail(pollChoiceImage, pollChoiceImageThumb, 100); } -// public void addVoteToPoll(Poll poll, Vote vote) { -// -// String pollId = poll.getTopiaId(); -// String voteId = vote.getTopiaId(); -// -// Poll pollToUpdate = getEntityById(Poll.class, pollId); -// Vote voteToAdd = getEntityById(Vote.class, voteId); -// -// pollToUpdate.addVote(voteToAdd); -// -// // Update hasVoted flag for RESTRICTED/GROUP poll -// if (PollType.FREE != poll.getPollType()) { -// -// PersonToList personToList = pollToUpdate.getPersonToListByVote(voteToAdd); -// personToList.setHasVoted(true); -// } -// -// commitTransaction("Can't add the vote [" + voteId + "] to the poll [" + pollId + "]"); -// -// // Send notification if necessary -// PreventRuleService preventRuleService = newService(PreventRuleService.class); -// PollUrl pollVoteUrl = getPollVoteUrl(pollToUpdate, false); -// PollUrl modifUrl = getPollEditUrl(pollToUpdate); -// preventRuleService.onVoteAdded(poll, pollVoteUrl, modifUrl); -// } - public PersonToList getNewPersonToList(PollAccount pollAccount) { PersonToList result = newInstance(getDAO(PersonToList.class)); result.setWeight(1); PollAccount pollAccount2 = newInstance(getDAO(PollAccount.class)); - String accountId = serviceContext.createPollenUrlId(); - pollAccount2.setAccountId(accountId); result.setPollAccount(pollAccount2); if (pollAccount != null) { pollAccount2.setComment(pollAccount.getComment()); @@ -1050,7 +986,9 @@ return result; } - protected void saveVotingList(Poll poll, VotingList votingList, EmailService emailService) throws TopiaException { + protected void saveVotingList(Poll poll, + VotingList votingList, + EmailService emailService) throws TopiaException { VotingListDAO votingListDAO = getDAO(VotingList.class); PersonToListDAO personToListDAO = getDAO(PersonToList.class); @@ -1085,21 +1023,26 @@ PersonToList personToListLoaded; PollAccount pollAccountLoaded; if (personToList.getTopiaId() == null) { + + // creates a new PersonToList + personToListLoaded = create(personToListDAO); // The model doesn't have any composition for this relation, // the link must be set in both objects personToListLoaded.setVotingList(result); - // FIXME-fdesbois-2012-04-12 : find a better way to ensure accountId +// // FIXME-fdesbois-2012-04-12 : find a better way to ensure accountId String accountId = pollAccount.getAccountId(); - if (accountId == null) { - accountId = serviceContext.createPollenUrlId(); - } pollAccountLoaded = pollAccountDAO.findByAccountId(accountId); if (pollAccountLoaded == null) { - pollAccountLoaded = create(pollAccountDAO); + + // creates a new pollAccount + + pollAccountLoaded = createWithProperties( + pollAccountDAO, + PollAccount.PROPERTY_ACCOUNT_ID, generateId()); pollAccountLoaded.setAccountId(accountId); } @@ -1182,4 +1125,15 @@ + thumbCopied.length() + ")"); } } + + /** + * Generates a unique id usable for {@link Poll#getPollId()} or + * {@link PollAccount#getAccountId()}. + * + * @return a fresh generated id + * @since 1.4 + */ + public String generateId() { + return UUID.randomUUID().toString().replaceAll("-", ""); + } } Modified: trunk/pollen-services/src/test/java/org/chorem/pollen/services/FakeServiceContext.java =================================================================== --- trunk/pollen-services/src/test/java/org/chorem/pollen/services/FakeServiceContext.java 2012-06-05 07:32:19 UTC (rev 3421) +++ trunk/pollen-services/src/test/java/org/chorem/pollen/services/FakeServiceContext.java 2012-06-05 07:40:14 UTC (rev 3422) @@ -26,8 +26,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.chorem.pollen.PollenIOUtil; import org.chorem.pollen.PollenConfiguration; +import org.chorem.pollen.PollenIOUtil; import org.chorem.pollen.PollenTopiaRootContextFactory; import org.junit.rules.TestWatcher; import org.junit.runner.Description; @@ -41,7 +41,6 @@ import java.util.Date; import java.util.Locale; import java.util.Properties; -import java.util.UUID; /** * Provide an implementation of {@link PollenServiceContext} suitable for repeatable, @@ -65,7 +64,7 @@ protected Date fakeCurrentTime; protected File testDir; - + protected URL applicationUrl; public TopiaContext getRootContext() { @@ -156,17 +155,7 @@ this.applicationUrl = applicationUrl; } - /** - * Create an id to easily managed polls using urls. - * - * @return a fresh generated String - */ @Override - public String createPollenUrlId() { - return UUID.randomUUID().toString().replaceAll("-", ""); - } - - @Override public PollenConfiguration getConfiguration() { Properties props = new Properties(); Modified: trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/LoadPoll.java =================================================================== --- trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/LoadPoll.java 2012-06-05 07:32:19 UTC (rev 3421) +++ trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/LoadPoll.java 2012-06-05 07:40:14 UTC (rev 3422) @@ -33,9 +33,14 @@ import java.util.List; /** + * Load the poll form for modification (or only read if poll is no more + * editable). + * <p/> * Created: 04/04/12 * * @author fdesbois <desbois@codelutin.com> + * @author tchemit <chemit@codelutin.com> + * @since 1.3 */ public class LoadPoll extends AbstractPollForm { @@ -76,11 +81,12 @@ pollChoices, pollVotingLists, !isVoteStarted()); + //TODO-tchemit comment me Simplyf this! +// if (poll.getMaxChoiceNb() > 0) { +// setLimitChoice(true); +// } + setLimitChoice(poll.getMaxChoiceNb() > 0); - if (poll.getMaxChoiceNb() > 0) { - setLimitChoice(true); - } - PreventRule reminder = poll.getPreventRuleByScope( PreventRuleService.SCOPE_REMINDER); if (reminder != null) { Modified: trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/SavePoll.java =================================================================== --- trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/SavePoll.java 2012-06-05 07:32:19 UTC (rev 3421) +++ trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/SavePoll.java 2012-06-05 07:40:14 UTC (rev 3422) @@ -67,7 +67,7 @@ import java.util.regex.Pattern; /** - * Creates a new poll. + * Saves the incoming poll, could be a new poll or just an update. * * @author tchemit <chemit@codelutin.com> * @since 1.3 @@ -88,27 +88,41 @@ private static final Pattern IMAGE_CHOICE_NAME_PATTERN = Pattern.compile("imageChoice_(\\d+)\\.name"); - /** Flag when there is some errors on the information panel. */ + /** + * Flag when there is some errors on the information panel. + * + * @since 1.3 + */ protected boolean informationsError; - /** Flag when there is some errors on the options panel. */ + /** + * Flag when there is some errors on the options panel. + * + * @since 1.3 + */ private boolean optionsError; /** * All the parameters send by request used to build back choices of the * poll. + * + * @since 1.3 */ protected final Map<String, String[]> parameters = Maps.newTreeMap(); /** * Indexed choices retreive from parameters for the choiceType selected in * form. (Other choices are lost). + * + * @since 1.3 */ private Map<Integer, Choice> choices; /** * Indexed voting lists retreive from parameters for the pollType selected * in form. (Other voting lists are lost). + * + * @since 1.3 */ private Map<Integer, VotingList> votingLists; @@ -118,18 +132,34 @@ prepareFormPage(); String pollUid = getNonEmptyParameterValue("poll.pollId"); - + //TODO-tchemit comment me No ! inverse tests otherwise make possible to change owner of a poll! :( // Retrieve userAccount to attach to the poll - UserAccount userAccount = getPollenUserAccount(); - if (userAccount == null) { +// UserAccount userAccount = getPollenUserAccount(); +// if (userAccount == null) { +// +// // from parameter userId if defined during update loading +// String userId = getNonEmptyParameterValue("userId"); +// if (userId != null) { +// userAccount = getPollService().getEntityById(UserAccount.class, userId); +// } +// } + String userId = getNonEmptyParameterValue("userId"); + if (StringUtils.isBlank(userId)) { - // from parameter userId if defined during update loading - String userId = getNonEmptyParameterValue("userId"); - if (userId != null) { - userAccount = getPollService().getEntityById(UserAccount.class, userId); + // try to take the one from current user + UserAccount userAccount = getPollenUserAccount(); + if (userAccount != null) { + userId = userAccount.getTopiaId(); } } + UserAccount userAccount = null; + if (StringUtils.isNotBlank(userId)) { + // load use account to use + userAccount = + getPollService().getEntityById(UserAccount.class, userId); + } + // get a copy (or a fresh new poll) poll = getPollService().getPollEditable(pollUid, userAccount, false); // If vote is started, prepare choices and votingLists is useless @@ -155,16 +185,17 @@ choices = buildImageChoices(); break; } - + //TODO-tchemit comment me No the nullite tests is not possible : if pollType is null not possible ? PollType pollType; String pollTypeParam = getNonEmptyParameterValue("poll.pollType"); - if (pollTypeParam == null) { - pollType = poll.getPollType(); + pollType = PollType.valueOf(pollTypeParam); +// if (pollTypeParam == null) { +// pollType = poll.getPollType(); +// +// } else { +// pollType = PollType.valueOf(pollTypeParam); +// } - } else { - pollType = PollType.valueOf(pollTypeParam); - } - switch (pollType) { case FREE: @@ -198,10 +229,7 @@ Collection<VotingList> pollVotingLists = isVoteStarted() ? poll.getVotingList() : votingLists.values(); - loadChoicesAndvotingLists(poll, - pollChoices, - pollVotingLists, - true); + loadChoicesAndvotingLists(poll, pollChoices, pollVotingLists, true); return INPUT; } @@ -220,15 +248,19 @@ // Save choices and votingLists only if vote is not started if (!isVoteStarted()) { - + //TODO-tchemit comment me 2012-06-04 A merge would be nicer but more complex to code // Clear previous collections to save those from the form poll.clearChoice(); poll.clearVotingList(); - - Map<Integer, Choice> orderedChoices = choices; - - for (Integer index : orderedChoices.keySet()) { - Choice choice = orderedChoices.get(index); + //TODO-tchemit comment me this variables, works directly on choices +// Map<Integer, Choice> orderedChoices = choices; +// +// for (Integer index : orderedChoices.keySet()) { +// Choice choice = orderedChoices.get(index); +// poll.addChoice(choice); +// } + for (Integer index : choices.keySet()) { + Choice choice = choices.get(index); poll.addChoice(choice); } @@ -245,7 +277,7 @@ if (!isLimitChoice()) { poll.setMaxChoiceNb(0); } - + //TODO-tchemit comment me 2012-06-04 A merge would be nicer but more complex to code poll.clearPreventRule(); PreventRuleService preventRuleService = getPreventRuleService(); @@ -270,11 +302,13 @@ if (isEdit()) { getPollService().updatePoll(poll); - addFlashMessage(_("pollen.information.poll.updated", poll.getTitle())); + addFlashMessage( + _("pollen.information.poll.updated", poll.getTitle())); } else { getPollService().createPoll(poll); - addFlashMessage(_("pollen.information.poll.created", poll.getTitle())); + addFlashMessage( + _("pollen.information.poll.created", poll.getTitle())); } // remove all stuff from session @@ -285,9 +319,8 @@ @Override public void addFile(int index, File file) { - parameters.put( - "imageChoice_" + index + ".location", - new String[]{file.getAbsolutePath()}); + parameters.put("imageChoice_" + index + ".location", + new String[]{file.getAbsolutePath()}); } @Override @@ -297,8 +330,7 @@ @Override public void addFileName(int index, String fileName) { - parameters.put("imageChoice_" + index + ".name", - new String[]{fileName}); + parameters.put("imageChoice_" + index + ".name", new String[]{fileName}); } @Override
participants (1)
-
tchemit@users.chorem.org