Author: fdesbois
Date: 2010-03-09 16:59:47 +0100 (Tue, 09 Mar 2010)
New Revision: 2910
Log:
Optimize votes loading on voteForPoll page + add links for first page and last page on pager
Modified:
branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/converters/DataPollConverter.java
branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServicePollImpl.java
branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVote.java
branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVoteImpl.java
branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Pager.java
branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java
branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/webapp/poll/VoteForPoll.tml
Modified: branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/converters/DataPollConverter.java
===================================================================
--- branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/converters/DataPollConverter.java 2010-03-09 12:16:13 UTC (rev 2909)
+++ branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/converters/DataPollConverter.java 2010-03-09 15:59:47 UTC (rev 2910)
@@ -120,14 +120,14 @@
pollDTO.setChoiceDTOs(choiceConverter.createChoiceDTOs(ePoll
.getChoice()));
}
- if (ePoll.getVote().size() > 0) {
- // FD-20100308 Votes are not loaded for an anonymous vote :
- // see ref ANO #130
- if (!ePoll.getAnonymous()) {
- pollDTO.setVoteDTOs(voteConverter.createVoteDTOs(ePoll.getVote()));
- }
- pollDTO.setNbVotes(ePoll.getVote().size());
- }
+// if (ePoll.getVote().size() > 0) {
+// // FD-20100308 Votes are not loaded for an anonymous vote :
+// // see ref ANO #130
+// if (!ePoll.getAnonymous()) {
+// pollDTO.setVoteDTOs(voteConverter.createVoteDTOs(ePoll.getVote()));
+// }
+// pollDTO.setNbVotes(ePoll.getVote().size());
+// }
if (ePoll.getComment().size() > 0) {
pollDTO.setCommentDTOs(commentConverter.createCommentDTOs(ePoll
.getComment()));
Modified: branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServicePollImpl.java
===================================================================
--- branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServicePollImpl.java 2010-03-09 12:16:13 UTC (rev 2909)
+++ branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServicePollImpl.java 2010-03-09 15:59:47 UTC (rev 2910)
@@ -239,6 +239,14 @@
if (pollEntity != null) {
converter.setTransaction(transaction);
result = converter.createPollDTO(pollEntity);
+ // Need the number total of votes to push in the dto
+ List<Long> tmp = transaction.find(
+ "SELECT COUNT(*)" +
+ " FROM " + Vote.class.getName() +
+ " WHERE poll.pollId = :pollUId",
+ "pollUId", pollId);
+ int count = tmp.get(0).intValue();
+ result.setNbVotes(count);
}
transaction.commitTransaction();
Modified: branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVote.java
===================================================================
--- branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVote.java 2010-03-09 12:16:13 UTC (rev 2909)
+++ branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVote.java 2010-03-09 15:59:47 UTC (rev 2910)
@@ -20,6 +20,7 @@
import java.util.Map;
import org.chorem.pollen.business.dto.PollAccountDTO;
+import org.chorem.pollen.business.dto.PollDTO;
import org.chorem.pollen.business.dto.VoteDTO;
/**
@@ -54,6 +55,20 @@
public boolean deleteVote(String voteId);
/**
+ * Retrieve existings votes from the {@code poll}. Only needed votes inside
+ * the range ({@code startIndex} and {@code endIndex}) will be retrieve.
+ * The results will be ordered by creationDate (the last vote done will
+ * be at the end of the list).
+ *
+ * @param poll to retrieve votes
+ * @param startIndex begin range for resulting votes
+ * @param endIndex end range for resulting votes
+ * @return the votes corresponding to the poll between the range
+ */
+ public List<VoteDTO> getVotesByPoll(PollDTO poll,
+ int startIndex, int endIndex);
+
+ /**
* Retourne les votes d'un sondage
*
* @param properties La HashMap pour sélectionner les votes d'un sondage. Il
Modified: branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVoteImpl.java
===================================================================
--- branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVoteImpl.java 2010-03-09 12:16:13 UTC (rev 2909)
+++ branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVoteImpl.java 2010-03-09 15:59:47 UTC (rev 2910)
@@ -16,6 +16,7 @@
package org.chorem.pollen.business.services;
+import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -24,9 +25,12 @@
import org.chorem.pollen.business.converters.DataPollAccountConverter;
import org.chorem.pollen.business.converters.DataVoteConverter;
import org.chorem.pollen.business.dto.PollAccountDTO;
+import org.chorem.pollen.business.dto.PollDTO;
import org.chorem.pollen.business.dto.VoteDTO;
+import org.chorem.pollen.business.persistence.Poll;
import org.chorem.pollen.business.persistence.PollAccount;
import org.chorem.pollen.business.persistence.PollAccountDAO;
+import org.chorem.pollen.business.persistence.PollDAO;
import org.chorem.pollen.business.persistence.PollenModelDAOHelper;
import org.chorem.pollen.business.persistence.Vote;
import org.chorem.pollen.business.persistence.VoteDAO;
@@ -174,6 +178,60 @@
}
}
+ public List<VoteDTO> getVotesByPoll(PollDTO poll,
+ int startIndex, int endIndex) {
+ TopiaContext transaction = null;
+ List<VoteDTO> results = new ArrayList<VoteDTO>();
+ try {
+ // No need to load votes for an anonymous poll
+ if (poll.isAnonymous()) {
+ return results;
+ }
+
+ // FIXME-FD20100309 : change model to suppress link from poll to vote
+ // It's not necessary to have votes when retrieving the poll, this
+ // method do this job only when it's needed
+
+ if (log.isDebugEnabled()) {
+ log.debug("Load votes for poll with uid = " + poll.getPollId());
+ log.debug("LIMIT : startIndex = " + startIndex + " _ " +
+ "endIndex = " + endIndex);
+ }
+
+ transaction = rootContext.beginTransaction();
+
+ // FIXME : refactor this to use TopiaQuery from ToPIA 2.3
+ // Order the results by creation date (the last vote done will be
+ // at the end of the list)
+ List<Vote> votes = transaction.find(
+ "FROM " + Vote.class.getName() +
+ " WHERE poll.pollId = :pollUId" +
+ " ORDER BY topiaCreateDate",
+ startIndex, endIndex,
+ "pollUId", poll.getPollId());
+
+ if (log.isDebugEnabled()) {
+ log.debug("Nb votes found : " + votes.size());
+ }
+
+// PollDAO dao = PollenModelDAOHelper.getPollDAO(transaction);
+// Poll ePoll = dao.findByPollId(poll.getPollId());
+
+// if (ePoll != null) {
+ converter.setTransaction(transaction);
+ results = converter.createVoteDTOs(votes);
+// }
+
+ } catch (Exception eee) {
+ ContextUtil.doCatch(eee, transaction,
+ "Unable to load votes from poll with uid = " +
+ poll.getPollId());
+ } finally {
+ ContextUtil.doFinally(transaction);
+ }
+ return results;
+ }
+
@Override
public List<VoteDTO> selectVotes(Map<String, Object> properties) {
TopiaContext transaction = null;
Modified: branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Pager.java
===================================================================
--- branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Pager.java 2010-03-09 12:16:13 UTC (rev 2909)
+++ branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Pager.java 2010-03-09 15:59:47 UTC (rev 2910)
@@ -5,6 +5,7 @@
import org.apache.tapestry5.EventConstants;
import org.apache.tapestry5.Link;
import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.annotations.Log;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
@@ -33,7 +34,8 @@
/**
* Main element of the pager, the page which contains the pager have
* to manage this property (using @Persist for exemple) to ensure that
- * the pager will done its work correctly.
+ * the pager will done its work correctly. You can use
+ * {@link #getFirstPage() } to initialize the first page.
*/
@Parameter(required = true)
private int currentPage;
@@ -61,18 +63,31 @@
log.debug("has previous : " + hasPrevious());
log.debug("has next : " + hasNext());
log.debug("indexes from : " + getStartIndex() + " to " + getEndIndex());
+ log.debug("last page : " + getLastPage());
}
writer.element("div", "class", "p-pager");
if (hasPrevious()) {
- writeLink(writer, currentPage - 1, "< ", "p-pager-previous");
+ int previousPage = currentPage - 1;
+ if (previousPage != getFirstPage()) {
+ writeLink(writer, getFirstPage(), "<<", "p-pager-first");
+ writer.write(" ");
+ }
+ writeLink(writer, previousPage, "<", "p-pager-previous");
+ writer.write(" ");
}
writer.element("strong");
writer.write(getFirstValue() + " - " + getLastValue() + " " +
messages.get("over") + " " + nbTotalRows);
writer.end();
if (hasNext()) {
- writeLink(writer, currentPage + 1, " >", "p-pager-next");
+ int nextPage = currentPage + 1;
+ writer.write(" ");
+ writeLink(writer, nextPage, ">", "p-pager-next");
+ if (nextPage != getLastPage()) {
+ writer.write(" ");
+ writeLink(writer, getLastPage(), ">>", "p-pager-last");
+ }
}
writer.end();
}
@@ -147,6 +162,15 @@
return getEndIndex() < (nbTotalRows - 1);
}
+ public int getFirstPage() {
+ return 1;
+ }
+
+ @Log
+ public int getLastPage() {
+ return (int)Math.ceil((double)nbTotalRows / (double)nbRowsPerPage);
+ }
+
/**
* Action event for changing page. The currentPage is changed to
* {@code newPage}.
Modified: branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java
===================================================================
--- branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java 2010-03-09 12:16:13 UTC (rev 2909)
+++ branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java 2010-03-09 15:59:47 UTC (rev 2910)
@@ -302,7 +302,7 @@
public String getVoteSizeMessage() {
if (log.isDebugEnabled()) {
- log.debug("poll voteDTOs list size : " + poll.getVoteDTOs().size());
+ log.debug("poll voteDTOs list size : " + getVotes().size());
log.debug("poll nbVotes : " + poll.getNbVotes());
}
return messages.format("vote-size", poll.getNbVotes());
@@ -380,7 +380,7 @@
// mise à jour du vote ou création d'un nouveau vote
if (alreadyVoted) {
- for (VoteDTO v : poll.getVoteDTOs()) {
+ for (VoteDTO v : getVotes()) {
PollAccountDTO voteAccount = servicePollAccount
.findPollAccountById(v.getPollAccountId());
@@ -402,13 +402,16 @@
getResultsAsString());
sendMailNotification();
voteFeedback.addInfo(messages.get("vote-success"));
+ page = pager.getLastPage();
+ // Reset votes to reload them depends on page change.
+ votes = null;
}
voteChoices.clear();
return pollZone.getBody();
}
private void deleteVote(String voteId) {
- for (VoteDTO vote : poll.getVoteDTOs()) {
+ for (VoteDTO vote : getVotes()) {
if (vote.getId().equals(voteId)) {
List<ChoiceDTO> choiceDTOs = vote.getChoiceDTOs();
@@ -520,7 +523,7 @@
private boolean hasAlreadyVoted(String votingId) {
// comparaison du votant (pollAccount) avec les votants des votes existants
- for (VoteDTO vote : poll.getVoteDTOs()) {
+ for (VoteDTO vote : getVotes()) {
PollAccountDTO account = servicePollAccount
.findPollAccountById(vote.getPollAccountId());
@@ -546,10 +549,10 @@
// parcours des votes pour trouver celui correspondant au votingId
// et contrôle du droit de modification
- while (i < poll.getVoteDTOs().size() && !modifAllowed) {
+ while (i < getVotes().size() && !modifAllowed) {
// account : compte associé au vote courant
- String id = poll.getVoteDTOs().get(i).getPollAccountId();
+ String id = getVotes().get(i).getPollAccountId();
PollAccountDTO account = servicePollAccount.findPollAccountById(id);
// si le votant du vote correspond au votingId
@@ -629,7 +632,7 @@
for (PreventRuleDTO rule : poll.getPreventRuleDTOs()) {
PreventRuleManager manager = new PreventRuleManager(rule);
- manager.execute("vote", poll.getVoteDTOs().size(), data);
+ manager.execute("vote", getVotes().size(), data);
}
}
@@ -1164,7 +1167,7 @@
countPoll();
}
- /************** PAGER MANAGMENT *******************************************/
+ /************** PAGER AND VOTES MANAGMENT *********************************/
@InjectComponent
private Pager pager;
@@ -1175,7 +1178,7 @@
private Integer page;
public int getPage() {
- return page == null ? 1 : page;
+ return page == null ? pager.getFirstPage() : page;
}
@Log
@@ -1185,11 +1188,16 @@
public List<VoteDTO> getVotes() {
if (votes == null) {
- votes = new ArrayList<VoteDTO>();
- List<VoteDTO> all = poll.getVoteDTOs();
- for (int i = pager.getStartIndex(); i <= pager.getEndIndex(); i++) {
- votes.add(all.get(i));
+// votes = new ArrayList<VoteDTO>();
+// List<VoteDTO> all = poll.getVoteDTOs();
+// for (int i = pager.getStartIndex(); i <= pager.getEndIndex(); i++) {
+// votes.add(all.get(i));
+// }
+ if (log.isInfoEnabled()) {
+ log.info("BUSINESS REQUEST [getVotesByPoll]");
}
+ votes = serviceVote.getVotesByPoll(poll,
+ pager.getStartIndex(), pager.getEndIndex());
}
return votes;
}
Modified: branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/webapp/poll/VoteForPoll.tml
===================================================================
--- branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/webapp/poll/VoteForPoll.tml 2010-03-09 12:16:13 UTC (rev 2909)
+++ branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/webapp/poll/VoteForPoll.tml 2010-03-09 15:59:47 UTC (rev 2910)
@@ -50,7 +50,7 @@
<p>${voteSizeMessage}</p>
<t:feedback t:id="voteFeedback"/>
<p:else>
- <t:pager t:nbRowsPerPage="15" t:nbTotalRows="poll.nbVotes" t:currentPage="page"/>
+ <t:pager t:nbRowsPerPage="3" t:nbTotalRows="poll.nbVotes" t:currentPage="page"/>
</p:else>
</t:if>
<t:form t:id="voteForm" t:zone="pollZone">