Author: fdesbois Date: 2010-05-26 11:17:43 +0200 (Wed, 26 May 2010) New Revision: 3014 Url: http://chorem.org/repositories/revision/pollen/3014 Log: - Use evo from ToPIA to extend DAO. (remove QueryBuilder, put temporarly methods in PollenUtils, maybe will be put in TopiaDAO) - Resolve choice image in UI Added: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteParticipantDAOImpl.java trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountDAOImpl.java Removed: trunk/pollen-business/src/main/java/org/chorem/pollen/PollenQueryBuilder.java trunk/pollen-business/src/main/java/org/chorem/pollen/TopiaQueryBuilder.java Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/EntityQueryProperty.java trunk/pollen-business/src/main/java/org/chorem/pollen/PollenContext.java trunk/pollen-business/src/main/java/org/chorem/pollen/PollenContextImpl.java trunk/pollen-business/src/main/java/org/chorem/pollen/PollenUtils.java trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceUserImpl.java trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceVoteImpl.java trunk/pollen-business/src/main/resources/i18n/pollen-business-en_GB.properties trunk/pollen-business/src/main/resources/i18n/pollen-business-fr_FR.properties trunk/pollen-business/src/main/xmi/pollen.zargo trunk/pollen-business/src/test/java/org/chorem/pollen/TopiaQueryBuilderTest.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/ChoiceImage.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ChoiceField.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java trunk/pollen-ui/src/main/webapp/poll/VoteForPoll.tml Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/EntityQueryProperty.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/EntityQueryProperty.java 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/EntityQueryProperty.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -54,7 +54,7 @@ protected String propertyJoin; /** class of the entity * */ - protected Class<? extends TopiaEntity> entityClass; + protected Class<?> entityClass; /** * Default constructor. mainAlias, propertyJoin and entityClass are null. @@ -76,13 +76,13 @@ /** * Constructor with mainAlias and entityClass. * + * @param entityClass class of the entity corresponding to this + * EntityQueryProperty * @param mainAlias alias of the entity corresponding to this * EntityQueryProperty - * @param entityClass class of the entity corresponding to this - * EntityQueryProperty */ - public EntityQueryProperty(String mainAlias, - Class<? extends TopiaEntity> entityClass) { + public EntityQueryProperty(Class<?> entityClass, + String mainAlias) { this(mainAlias); setEntityClass(entityClass); } @@ -112,7 +112,7 @@ * @param entityClass class of the entity corresponding to this * EntityQueryProperty */ - public void setEntityClass(Class<? extends TopiaEntity> entityClass) { + public void setEntityClass(Class<?> entityClass) { this.entityClass = entityClass; } @@ -176,7 +176,7 @@ * * @return the entity class corresponding to this EntityQueryProperty. */ - public Class<? extends TopiaEntity> getEntityClass() { + public Class<?> getEntityClass() { if (entityClass == null) { throw new NullPointerException("entitClass is not set"); } @@ -192,7 +192,7 @@ * provides it. */ public TopiaQuery newQuery() { - return new TopiaQuery(getEntityClass(), name()); + return new TopiaQuery((Class<? extends TopiaEntity>)getEntityClass(), name()); } /** Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/PollenContext.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/PollenContext.java 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/PollenContext.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -123,7 +123,4 @@ */ void closeTransaction(TopiaContext transaction); - PollenQueryBuilder newQueryBuilder(TopiaQuery query); - - } //PollenContext Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/PollenContextImpl.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/PollenContextImpl.java 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/PollenContextImpl.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -391,13 +391,4 @@ return null; } - @Override - public PollenQueryBuilder newQueryBuilder(TopiaQuery query) { - PollenQueryBuilder builder = new PollenQueryBuilder(); - if (query != null) { - builder.setQuery(query); - } - return builder; - } - } Deleted: trunk/pollen-business/src/main/java/org/chorem/pollen/PollenQueryBuilder.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/PollenQueryBuilder.java 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/PollenQueryBuilder.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -1,79 +0,0 @@ - -package org.chorem.pollen; - -import org.chorem.pollen.bean.Filter; -import org.chorem.pollen.entity.FavoriteList; -import org.chorem.pollen.entity.FavoriteParticipant; -import org.chorem.pollen.entity.Poll; -import org.chorem.pollen.entity.PollAccount; -import org.nuiton.topia.framework.TopiaQuery; -import org.nuiton.topia.persistence.TopiaDAO; - -/** - * PollenQueryBuilder - * - * Created: 28 avr. 2010 - * - * @author fdesbois - * @version $Revision$ - * - * Mise a jour: $Date$ - * par : $Author$ - */ -public class PollenQueryBuilder extends TopiaQueryBuilder { - - protected PollenQueryBuilder() { - super(); - } - - public EntityQueryProperty getFavoriteListProperty(String alias) { - return getEntityProperty(FavoriteList.class, alias); - } - - public EntityQueryProperty getFavoriteParticipantProperty( - String alias) { - return getEntityProperty(FavoriteParticipant.class, alias); - } - - public EntityQueryProperty getPollAccountProperty( - String alias) { - return getEntityProperty(PollAccount.class, alias); - } - - public EntityQueryProperty getPollProperty(String alias) { - return getEntityProperty(Poll.class, alias); - } - - public TopiaQuery createQueryFindFavoriteParticipantsByFavoriteList( - Filter filter) { - - EntityQueryProperty participantProperty = - getFavoriteParticipantProperty("P"); - - EntityQueryProperty listProperty = - getFavoriteListProperty("L"); - - listProperty.setPropertyJoin(FavoriteList.FAVORITE_PARTICIPANT); - - createQueryFindElementsByCollection( - participantProperty, listProperty, filter); - - return query; - } - - public TopiaQuery createQueryFindVotesByPoll(Filter filter) { - - EntityQueryProperty accountProperty = getPollAccountProperty("A"); - - EntityQueryProperty pollProperty = getPollProperty("P"); - pollProperty.setPropertyJoin(Poll.POLL_ACCOUNT); - - createQueryFindElementsByCollection( - accountProperty, pollProperty, filter); - - query.addNotNull(accountProperty.nameProperty(PollAccount.VOTE_DATE)); - - return query; - } - -} Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/PollenUtils.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/PollenUtils.java 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/PollenUtils.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -1,6 +1,15 @@ package org.chorem.pollen; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.chorem.pollen.bean.Filter; +import org.nuiton.topia.framework.TopiaQuery; +import org.nuiton.topia.persistence.TopiaEntity; + +import java.util.ArrayList; import java.util.Date; +import java.util.List; /** * Created: 21 mai 2010 @@ -10,6 +19,8 @@ */ public class PollenUtils { + private static final Log log = LogFactory.getLog(PollenUtils.class); + private static PollenContext context; public static void setContext(PollenContext context) { @@ -19,4 +30,114 @@ public static Date getCurrentDate() { return context.getCurrentDate(); } + + // TEMP METHOD + public static EntityQueryProperty getEntityQueryProperty(String alias) { + return new EntityQueryProperty(alias); + } + + public static EntityQueryProperty getEntityQueryProperty( + Class<? extends TopiaEntity> entityClass, String alias) { + return new EntityQueryProperty(entityClass, alias); + } + + /** + * Create a TopiaQuery to find all participants of a list with + * {@code filter} constraints (order, limit indexes, listId). + * + * @param filter used to add constraint in the query + * @param element + * @param collection + * @return the TopiaQuery created + * @see #prepareQuery(TopiaQuery, Filter, EntityQueryProperty) + */ + public static TopiaQuery createQueryFindElementsByCollection( + EntityQueryProperty element, + EntityQueryProperty collection, + Filter filter) { + + // Instanciate a new query based on element + TopiaQuery query = element.newQuery(); + + // Add the collection in the From of the query + query.addFrom((Class<? extends TopiaEntity>)collection.getEntityClass(), + collection.name()); + + // Add the link between the collection and the element + query.addInElements(element.name(), collection.namePropertyJoin()); + + if (filter != null) { + // Add constraints from filter, the collection is given to provide + // the name of its ID property. + prepareQuery(query, filter, collection); + } + + return query; + } + + /** + * Prepare a query with filter : adding startIndex and endIndex as limit + * and orderBy if defined. Need an existing query in builder. + * + * @param filter Filter to add in the query + * @see #prepareQuery(TopiaQuery, Filter, EntityQueryProperty) + */ + public static void prepareQuery(TopiaQuery query, Filter filter) { + prepareQuery(query, filter, null); + } + + /** + * Prepare a query with filter. The {@code reference} is used + * to retrieve the name of ID property in case of filter using referenceId. + * Need an existing query in builder. + * + * @param filter Filter to add in the query + * @param reference used to filter on referenceId + */ + public static void prepareQuery(TopiaQuery query, Filter filter, + EntityQueryProperty reference) { + + Integer startIndex = filter.getStartIndex(); + Integer endIndex = filter.getEndIndex(); + String orderBy = filter.getOrderBy(); + String referenceId = filter.getReferenceId(); + + EntityQueryProperty mainProperty = + getEntityQueryProperty(query.getMainAlias()); + + if (log.isDebugEnabled()) { + log.debug("Filter added to the query : " + + "startIndex = " + startIndex + + " _ endIndex = " + endIndex + + " _ orderBy = " + orderBy + + " _ referenceId = " + referenceId); + } + + // Add limits. Only startIndex do nothing. + // startIndex + endIndex provides the limit + if (filter.getStartIndex() != null && endIndex != null) { + query.setLimit(startIndex, endIndex); + + // endIndex only provides the maxResults wanted + } else if (endIndex != null) { + query.setMaxResults(endIndex); + } + + // Add order to the main entity in the query, splitted by comma + if (orderBy != null) { + List<String> order = new ArrayList<String>(); + for (String elmt : orderBy.split(",")) { + order.add(mainProperty.nameProperty(elmt.trim())); + } + query.addOrder(order.toArray(new String[order.size()])); + + // Default order by creation date + } else { + query.addOrderDesc(mainProperty.namePropertyCreateDate()); + } + + if (StringUtils.isNotEmpty(referenceId) && reference != null) { + query.add(reference.namePropertyId(), referenceId); + } + } } Deleted: trunk/pollen-business/src/main/java/org/chorem/pollen/TopiaQueryBuilder.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/TopiaQueryBuilder.java 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/TopiaQueryBuilder.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -1,158 +0,0 @@ - -package org.chorem.pollen; - -import java.util.ArrayList; -import java.util.List; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.chorem.pollen.bean.Filter; -import org.nuiton.topia.framework.TopiaQuery; -import org.nuiton.topia.persistence.TopiaDAO; -import org.nuiton.topia.persistence.TopiaEntity; - -/** - * TopiaQueryBuilder is used to build a TopiaQuery. <br /> - * Convention rules : - * <ul> - * <li>method with prefix {@code prepare} will modify the current query</li> - * <li>method with prefix {@code create} will instantiate a new query</li> - * </ul> - * <br /> - * To use directly {@code prepare} methods, you have to set the query using - * {@link #setQuery(TopiaQuery)}. - * - * Created: 28 avr. 2010 - * - * @author fdesbois <fdesbois@codelutin.com> - */ -public class TopiaQueryBuilder { - - private static final Log log = LogFactory.getLog(TopiaQueryBuilder.class); - - protected TopiaQuery query; - - protected TopiaQueryBuilder() { - } - - public static TopiaQueryBuilder newInstance() { - return new TopiaQueryBuilder(); - } - - public void setQuery(TopiaQuery query) { - this.query = query; - } - - public TopiaQuery getQuery() { - return query; - } - - public EntityQueryProperty getEntityProperty(String alias) { - return new EntityQueryProperty(alias); - } - - public EntityQueryProperty getEntityProperty( - Class<? extends TopiaEntity> entityClass, String alias) { - return new EntityQueryProperty(alias, entityClass); - } - - public EntityQueryProperty getMainProperty() { - return getEntityProperty(query.getMainAlias()); - } - - /** - * Create a TopiaQuery to find all participants of a list with - * {@code filter} constraints (order, limit indexes, listId). - * - * @param filter used to add constraint in the query - * @param element - * @param collection - * @return the TopiaQuery created - * @see #prepareQuery(Filter, EntityQueryProperty) - */ - public TopiaQuery createQueryFindElementsByCollection( - EntityQueryProperty element, - EntityQueryProperty collection, - Filter filter) { - - // Instanciate a new query based on element - query = element.newQuery(); - - // Add the collection in the From of the query - query.addFrom(collection.getEntityClass(), collection.name()); - - // Add the link between the collection and the element - query.addInElements(element.name(), collection.namePropertyJoin()); - - if (filter != null) { - // Add constraints from filter, the collection is given to provide - // the name of its ID property. - prepareQuery(filter, collection); - } - - return query; - } - - /** - * Prepare a query with filter : adding startIndex and endIndex as limit - * and orderBy if defined. Need an existing query in builder. - * - * @param filter Filter to add in the query - * @see #prepareQuery(Filter filter, EntityQueryProperty) - */ - public void prepareQuery(Filter filter) { - prepareQuery(filter, null); - } - - /** - * Prepare a query with filter. The {@code reference} is used - * to retrieve the name of ID property in case of filter using referenceId. - * Need an existing query in builder. - * - * @param filter Filter to add in the query - * @param reference used to filter on referenceId - */ - public void prepareQuery(Filter filter, - EntityQueryProperty reference) { - - Integer startIndex = filter.getStartIndex(); - Integer endIndex = filter.getEndIndex(); - String orderBy = filter.getOrderBy(); - String referenceId = filter.getReferenceId(); - - if (log.isDebugEnabled()) { - log.debug("Filter added to the query : " + - "startIndex = " + startIndex + - " _ endIndex = " + endIndex + - " _ orderBy = " + orderBy + - " _ referenceId = " + referenceId); - } - - // Add limits. Only startIndex do nothing. - // startIndex + endIndex provides the limit - if (filter.getStartIndex() != null && endIndex != null) { - query.setLimit(startIndex, endIndex); - - // endIndex only provides the maxResults wanted - } else if (endIndex != null) { - query.setMaxResults(endIndex); - } - - // Add order to the main entity in the query, splitted by comma - if (orderBy != null) { - List<String> order = new ArrayList<String>(); - for (String elmt : orderBy.split(",")) { - order.add(getMainProperty().nameProperty(elmt.trim())); - } - query.addOrder(order.toArray(new String[order.size()])); - - // Default order by creation date - } else { - query.addOrderDesc(getMainProperty().namePropertyCreateDate()); - } - - if (StringUtils.isNotEmpty(referenceId) && reference != null) { - query.add(reference.namePropertyId(), referenceId); - } - } -} Added: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteParticipantDAOImpl.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteParticipantDAOImpl.java (rev 0) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteParticipantDAOImpl.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -0,0 +1,34 @@ +package org.chorem.pollen.entity; + +import org.chorem.pollen.EntityQueryProperty; +import org.chorem.pollen.PollenUtils; +import org.chorem.pollen.bean.Filter; +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.framework.TopiaQuery; + +/** + * Created: 26 mai 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public class FavoriteParticipantDAOImpl<E extends FavoriteParticipant> + extends FavoriteParticipantDAOAbstract<E> { + + @Override + public TopiaQuery createQueryFindAllByFavoriteList(Filter filter) { + + EntityQueryProperty participantProperty = + PollenUtils.getEntityQueryProperty(FavoriteParticipant.class, "P"); + + EntityQueryProperty listProperty = + PollenUtils.getEntityQueryProperty(FavoriteList.class, "L"); + + listProperty.setPropertyJoin(FavoriteList.FAVORITE_PARTICIPANT); + + TopiaQuery query = PollenUtils.createQueryFindElementsByCollection( + participantProperty, listProperty, filter); + + return query; + } +} Property changes on: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteParticipantDAOImpl.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountDAOImpl.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountDAOImpl.java (rev 0) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountDAOImpl.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -0,0 +1,35 @@ +package org.chorem.pollen.entity; + +import org.chorem.pollen.EntityQueryProperty; +import org.chorem.pollen.PollenUtils; +import org.chorem.pollen.bean.Filter; +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.framework.TopiaQuery; + +/** + * Created: 26 mai 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public class PollAccountDAOImpl<E extends PollAccount> extends PollAccountDAOAbstract<E> { + + @Override + public TopiaQuery createQueryFindAllByPoll(Filter filter) { + + EntityQueryProperty accountProperty = + PollenUtils.getEntityQueryProperty(PollAccount.class, "A"); + + EntityQueryProperty pollProperty = + PollenUtils.getEntityQueryProperty(Poll.class, "P"); + + pollProperty.setPropertyJoin(Poll.POLL_ACCOUNT); + + TopiaQuery query = PollenUtils.createQueryFindElementsByCollection( + accountProperty, pollProperty, filter); + + query.addNotNull(accountProperty.nameProperty(PollAccount.VOTE_DATE)); + + return query; + } +} Property changes on: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountDAOImpl.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -8,7 +8,6 @@ import org.chorem.pollen.PollenContext; import org.chorem.pollen.PollenDAOHelper; import org.chorem.pollen.PollenException; -import org.chorem.pollen.PollenQueryBuilder; import org.chorem.pollen.bean.Filter; import org.chorem.pollen.entity.FavoriteList; import org.chorem.pollen.entity.FavoriteListDAO; @@ -244,14 +243,11 @@ protected Map<String, FavoriteParticipant> executeGetFavoriteParticipants( TopiaContext transaction, Filter filter) throws TopiaException { - PollenQueryBuilder builder = context.newQueryBuilder(null); - - TopiaQuery query = - builder.createQueryFindFavoriteParticipantsByFavoriteList(filter); - FavoriteParticipantDAO dao = PollenDAOHelper.getFavoriteParticipantDAO(transaction); + TopiaQuery query = dao.createQueryFindAllByFavoriteList(filter); + if (log.isDebugEnabled()) { log.debug("Query : " + query); } @@ -268,12 +264,12 @@ protected int executeGetNbFavoriteParticipants(TopiaContext transaction, Filter filter) throws TopiaException { - PollenQueryBuilder builder = context.newQueryBuilder(null); + FavoriteParticipantDAO dao = + PollenDAOHelper.getFavoriteParticipantDAO(transaction); - TopiaQuery query = - builder.createQueryFindFavoriteParticipantsByFavoriteList(filter); + TopiaQuery query = dao.createQueryFindAllByFavoriteList(filter); - int result = query.executeCount(transaction); + int result = dao.countByQuery(query); return result; } } Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -7,8 +7,6 @@ import org.chorem.pollen.PollenContext; import org.chorem.pollen.PollenDAOHelper; import org.chorem.pollen.PollenException; -import org.chorem.pollen.PollenQueryBuilder; -import org.chorem.pollen.TopiaQueryBuilder; import org.chorem.pollen.common.ChoiceType; import org.chorem.pollen.common.PollType; import org.chorem.pollen.common.VoteCountingType; Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceUserImpl.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceUserImpl.java 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceUserImpl.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -12,6 +12,7 @@ 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.entity.FavoriteList; import org.chorem.pollen.entity.FavoriteListDAO; @@ -19,8 +20,6 @@ import org.chorem.pollen.entity.FavoriteParticipant; import org.chorem.pollen.entity.FavoriteParticipantDAO; import org.chorem.pollen.entity.FavoriteParticipantImpl; -import org.chorem.pollen.PollenQueryBuilder; -import org.chorem.pollen.TopiaQueryBuilder; import org.chorem.pollen.entity.UserAccount; import org.chorem.pollen.entity.UserAccountDAO; import org.chorem.pollen.entity.UserAccountImpl; @@ -269,7 +268,7 @@ UserAccountDAO dao = PollenDAOHelper.getUserAccountDAO(transaction); TopiaQuery query = dao.createQuery(); - context.newQueryBuilder(query).prepareQuery(filter); + PollenUtils.prepareQuery(query, filter); Map<String, UserAccount> results = dao.findAllMappedByQuery( query, UserAccount.LOGIN, String.class); @@ -283,7 +282,7 @@ UserAccountDAO dao = PollenDAOHelper.getUserAccountDAO(transaction); TopiaQuery query = dao.createQuery(); - context.newQueryBuilder(query).prepareQuery(filter); + PollenUtils.prepareQuery(query, filter); int result = query.executeCount(); return result; 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-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceVoteImpl.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -1,17 +1,20 @@ package org.chorem.pollen.service; import org.chorem.pollen.EntityQueryProperty; +import org.chorem.pollen.PollenBusinessException; import org.chorem.pollen.PollenContext; import org.chorem.pollen.PollenDAOHelper; import org.chorem.pollen.PollenException; -import org.chorem.pollen.PollenQueryBuilder; import org.chorem.pollen.bean.Filter; +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.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; @@ -49,7 +52,8 @@ } @Override - protected boolean executeCanVote(TopiaContext transaction, Poll poll, PollAccount participant) throws Exception { + protected boolean executeCanVote(TopiaContext transaction, Poll poll, + PollAccount participant) throws Exception { return false; } @@ -69,15 +73,14 @@ Filter filter) throws Exception { - PollenQueryBuilder builder = context.newQueryBuilder(null); + PollAccountDAO dao = PollenDAOHelper.getPollAccountDAO(transaction); - TopiaQuery query = builder.createQueryFindVotesByPoll(filter); + TopiaQuery query = dao.createQueryFindAllByPoll(filter); - PollAccountDAO dao = PollenDAOHelper.getPollAccountDAO(transaction); - query.addLoad(PollAccount.CHOICE_VOTE); List<PollAccount> results = dao.findAllByQuery(query); + return results; } @@ -85,15 +88,44 @@ protected int executeGetNbVotes(TopiaContext transaction, Filter filter) throws TopiaException { - PollenQueryBuilder builder = context.newQueryBuilder(null); + PollAccountDAO dao = PollenDAOHelper.getPollAccountDAO(transaction); - TopiaQuery query = builder.createQueryFindVotesByPoll(filter); + TopiaQuery query = dao.createQueryFindAllByPoll(filter); - int result = query.executeCount(transaction); + int result = dao.countByQuery(query); return result; } @Override protected void executeDeleteVote(TopiaContext transaction, Poll poll, PollAccount participant) throws Exception { } + + @Override + protected Vote executeGetNewVote(Choice choice) { + Vote result = new VoteImpl(); + result.setChoice(choice); + return result; + } + + @Override + protected void executeSaveVote(TopiaContext transaction, Poll poll, + PollAccount participant) + throws PollenBusinessException { + + // 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 + + // NEED test : + // need existing poll with choices + // getNewPollAccount + // set some votes for poll choices + // saveVote + + + + } } Modified: trunk/pollen-business/src/main/resources/i18n/pollen-business-en_GB.properties =================================================================== --- trunk/pollen-business/src/main/resources/i18n/pollen-business-en_GB.properties 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-business/src/main/resources/i18n/pollen-business-en_GB.properties 2010-05-26 09:17:43 UTC (rev 3014) @@ -79,11 +79,13 @@ pollen.error.serviceVote.deleteVote= pollen.error.serviceVote.getNbVotes= pollen.error.serviceVote.getNewPollAccount= +pollen.error.serviceVote.getNewVote= pollen.error.serviceVote.getPollAccount= pollen.error.serviceVote.getVote= pollen.error.serviceVote.getVotes= pollen.error.serviceVote.getVotesByPoll=Unable to load votes from poll with uid \= %1$s pollen.error.serviceVote.hasAlreadyVoted=Unable test vote existing for account with votingId \= %1$s and poll with uid \= %2$s +pollen.error.serviceVote.saveVote= pollen.exception.favorite_list_name_exist= pollen.exception.favorite_participant_exist= pollen.exception.favorite_participant_exist_without_email= Modified: trunk/pollen-business/src/main/resources/i18n/pollen-business-fr_FR.properties =================================================================== --- trunk/pollen-business/src/main/resources/i18n/pollen-business-fr_FR.properties 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-business/src/main/resources/i18n/pollen-business-fr_FR.properties 2010-05-26 09:17:43 UTC (rev 3014) @@ -78,11 +78,13 @@ pollen.error.serviceVote.deleteVote= pollen.error.serviceVote.getNbVotes= pollen.error.serviceVote.getNewPollAccount= +pollen.error.serviceVote.getNewVote= pollen.error.serviceVote.getPollAccount= pollen.error.serviceVote.getVote= pollen.error.serviceVote.getVotes= pollen.error.serviceVote.getVotesByPoll= pollen.error.serviceVote.hasAlreadyVoted= +pollen.error.serviceVote.saveVote= pollen.exception.favorite_list_name_exist=La liste %1$s existe d\u00E9j\u00E0 pour l'utilisateur %2$s pollen.exception.load_configuration=La configuration n'a pas \u00E9t\u00E9 charg\u00E9e correctement \! Veuillez v\u00E9rifier le d\u00E9marrage de l'application. pollen.exception.participant_doubloons=Les doublons de la liste %1$s ont \u00E9t\u00E9 ignor\u00E9s \: %2$s Modified: trunk/pollen-business/src/main/xmi/pollen.zargo =================================================================== (Binary files differ) Modified: trunk/pollen-business/src/test/java/org/chorem/pollen/TopiaQueryBuilderTest.java =================================================================== --- trunk/pollen-business/src/test/java/org/chorem/pollen/TopiaQueryBuilderTest.java 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-business/src/test/java/org/chorem/pollen/TopiaQueryBuilderTest.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -34,24 +34,25 @@ filter.setEndIndex(40); filter.setOrderBy(UserAccount.LOGIN); - TopiaQueryBuilder builder = new TopiaQueryBuilder(); - builder.setQuery(new TopiaQuery(UserAccount.class)); - builder.prepareQuery(filter); +// TopiaQueryBuilder builder = new TopiaQueryBuilder(); +// builder.setQuery(new TopiaQuery(UserAccount.class)); + TopiaQuery query = new TopiaQuery(UserAccount.class); + PollenUtils.prepareQuery(query, filter); - log.debug("Query : " + builder.getQuery()); + log.debug("Query : " + query); - Assert.assertEquals(builder.getQuery().fullQuery(), + Assert.assertEquals(query.fullQuery(), "FROM " + UserAccount.class.getName() + " ORDER BY " + UserAccount.LOGIN); filter.setOrderBy(null); - builder.setQuery(new TopiaQuery(UserAccount.class)); - builder.prepareQuery(filter); + query = new TopiaQuery(UserAccount.class); + PollenUtils.prepareQuery(query, filter); - log.debug("Query : " + builder.getQuery()); + log.debug("Query : " + query); - Assert.assertEquals(builder.getQuery().fullQuery(), + Assert.assertEquals(query.fullQuery(), "FROM " + UserAccount.class.getName() + " ORDER BY " + TopiaEntity.TOPIA_CREATE_DATE + " DESC"); @@ -60,7 +61,7 @@ @Test public void testCreateQueryFindElementsByCollection() throws IOException { - TopiaQueryBuilder builder = new TopiaQueryBuilder(); + //TopiaQueryBuilder builder = new TopiaQueryBuilder(); Filter filter = new Filter(); filter.setStartIndex(1); @@ -68,14 +69,14 @@ filter.setOrderBy(FavoriteParticipant.NAME); EntityQueryProperty participantPropertyProvider = - builder.getEntityProperty(FavoriteParticipant.class, "P"); + PollenUtils.getEntityQueryProperty(FavoriteParticipant.class, "P"); EntityQueryProperty listPropertyProvider = - builder.getEntityProperty(FavoriteList.class, "L"); + PollenUtils.getEntityQueryProperty(FavoriteList.class, "L"); listPropertyProvider.setPropertyJoin(FavoriteList.FAVORITE_PARTICIPANT); log.info("test1 : orderBy FavoriteParticipant name"); - TopiaQuery result = builder.createQueryFindElementsByCollection( + TopiaQuery result = PollenUtils.createQueryFindElementsByCollection( participantPropertyProvider, listPropertyProvider, filter); log.debug("Query : " + result); @@ -89,7 +90,7 @@ log.info("test2 : orderBy not set (default to topiaCreateDate desc)"); filter.setOrderBy(null); - result = builder.createQueryFindElementsByCollection( + result = PollenUtils.createQueryFindElementsByCollection( participantPropertyProvider, listPropertyProvider, filter); log.debug("Query : " + result); @@ -104,7 +105,7 @@ String orderBy = FavoriteParticipant.NAME + ", " + FavoriteParticipant.EMAIL + " desc"; filter.setOrderBy(orderBy); - result = builder.createQueryFindElementsByCollection( + result = PollenUtils.createQueryFindElementsByCollection( participantPropertyProvider, listPropertyProvider, filter); log.debug("Query : " + result); Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/ChoiceImage.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/ChoiceImage.java 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/ChoiceImage.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -1,5 +1,6 @@ package org.chorem.pollen.ui.components; +import org.apache.commons.lang.StringUtils; import org.apache.tapestry5.ClientElement; import org.apache.tapestry5.ComponentResources; import org.apache.tapestry5.Link; @@ -44,8 +45,11 @@ Link thumbLink = resources.createEventLink("showImage", source.getImageFileName(), source.getImageDir(), true); + String alt = StringUtils.isNotEmpty(source.getDescription()) ? + source.getDescription() : source.getImageFileName(); + writeLink(writer, link, "rel", "lightbox[pollChoiceImages]"); - writer.element("img", "src", thumbLink, "alt", source.getDescription()); + writer.element("img", "src", thumbLink, "alt", alt); writer.end(); writer.end(); } Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ChoiceField.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ChoiceField.java 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ChoiceField.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -52,6 +52,8 @@ protected String text; + protected Double voteValue; + public ChoiceField() { } @@ -272,4 +274,12 @@ public boolean isHidden() { return choice.isHidden(); } + + public void setVoteValue(Double voteValue) { + this.voteValue = voteValue; + } + + public Double getVoteValue() { + return voteValue; + } } 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-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java 2010-05-26 09:17:43 UTC (rev 3014) @@ -22,6 +22,8 @@ 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; @@ -45,6 +47,7 @@ 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; @@ -496,6 +499,10 @@ manager.getProperty(PollenProperty.NB_VOTES_PER_PAGE)); } + public boolean isPagerNeeded() throws PollenBusinessException { + return getPagerRange() < getNbVotes(); + } + public int getNbVotes() throws PollenBusinessException { if (nbVotes == null) { Filter filter = new Filter(); @@ -555,6 +562,36 @@ return vote; } + private List<Vote> editedVotes; + + @Property + private Vote editedVote; + + public List<Vote> getEditedVotes() { + if (editedVotes == null) { + editedVotes = new ArrayList<Vote>(); + + for (ChoiceField choice : choices) { + Vote vote = getPollAccount().getChoiceVote(choice.getChoice()); + if (vote == null) { + vote = serviceVote.getNewVote(choice.getChoice()); + } + editedVotes.add(vote); + } + } + return editedVotes; + } + + void onValidateFormFromVoteForm() { + // percentage : check total = 100 + getPollAccount().setChoiceVote(getEditedVotes()); + try { + serviceVote.saveVote(getPollAccount()); + } catch (PollenBusinessException eee) { + // record error + } + } + // /** // * Retourne vrai si le champs pollAccount doit apparaître. // * @@ -572,15 +609,8 @@ // return !getPoll().getAnonymous() || isRestrictedPoll() || isGroupPoll(); // } - public void setChoiceValue(Integer value) { -// getCurrentVote().setChoiceValue(choice.getId(), value); - } - -// public Integer getChoiceValue() { -// return getCurrentVote().getChoiceValue(choice.getId()); -// } - public boolean getCanVote() { + // FIXME-fdesbois-2010-05-25 : copy check treatment directly in service if (poll.isFinished()) { return false; } Modified: trunk/pollen-ui/src/main/webapp/poll/VoteForPoll.tml =================================================================== --- trunk/pollen-ui/src/main/webapp/poll/VoteForPoll.tml 2010-05-25 15:13:12 UTC (rev 3013) +++ trunk/pollen-ui/src/main/webapp/poll/VoteForPoll.tml 2010-05-26 09:17:43 UTC (rev 3014) @@ -44,12 +44,12 @@ <!-- Sondage --> <!--<t:zone t:id="pollZone" t:show="show" t:update="show">--> - <t:if t:test="poll.anonymous"> - <p>${format:vote-size=nbVotes}</p> + <t:if t:test="pagerNeeded"> + <t:pager t:nbRowsPerPage="nbVotesPerPage" t:nbTotalRows="nbVotes" + t:currentPage="page" t:noPagerText="prop:noPagerText" t:range="pagerRange"/> <!--<t:feedback t:id="voteFeedback"/>--> <p:else> - <t:pager t:nbRowsPerPage="nbVotesPerPage" t:nbTotalRows="nbVotes" - t:currentPage="page" t:noPagerText="prop:noPagerText" t:range="pagerRange"/> + <p>${format:vote-size=nbVotes}</p> </p:else> </t:if> <t:form t:id="voteForm"> @@ -98,38 +98,38 @@ </th> </tr> </thead> - <!--<t:if test="canVote">--> - <!--<tfoot>--> - <!--<tr>--> + <t:if test="canVote"> + <tfoot> + <tr> <!--<t:if test="accountFieldDisplayed">--> - <!--<th id="voterName">--> - <!--<input t:type="textfield" t:id="pollAccountName" value="pollAccount.votingId" t:validate="required"/>--> - <!--</th>--> + <th id="voterName"> + <input t:type="textfield" t:id="pollAccountName" value="pollAccount.name" t:validate="required"/> + </th> <!--<p:else>--> <!--<th></th>--> <!--</p:else>--> <!--</t:if>--> - <!--<t:loop t:source="choices" t:value="choice" volatile="true">--> - <!--<t:unless test="choice.hidden">--> - <!--<th>--> - <!--<t:if test="poll.voteCounting.normal">--> - <!--<input t:type="checkbox" value="addChoice" />--> - <!--</t:if>--> - <!--<t:if test="poll.voteCounting.percentage">--> - <!--<t:textField t:value="currentVote.getChoiceValues(choice.id)" size="3" t:validate="required, min=0, max=100"/>%--> - <!--</t:if>--> - <!--<t:if test="poll.voteCounting.condorcet">--> - <!--<t:textField t:id="condorcetInput" t:value="choiceOfVote.value" size="3" t:nulls="zero" t:validate="min=0, max=99"/>--> - <!--</t:if>--> - <!--<t:if test="poll.voteCounting.number">--> - <!--<t:textField t:value="addNumberVote" size="3" />--> - <!--</t:if>--> - <!--</th>--> - <!--</t:unless>--> - <!--</t:loop>--> - <!--</tr>--> - <!--</tfoot>--> - <!--</t:if>--> + <t:loop t:source="editedVotes" t:value="editedVote" volatile="true"> + <t:unless test="editedChoice.hidden"> + <th> + <t:if test="poll.voteCountingType.normal"> + <input t:type="checkbox" value="editedVote.voteValue" /> + </t:if> + <t:if test="poll.voteCountingType.percentage"> + <input t:type="textfield" value="editedVote.voteValue" size="3" t:validate="required, min=0, max=100"/>% + </t:if> + <t:if test="poll.voteCountingType.condorcet"> + <input t:type="textfield" value="editedVote.voteValue" size="3" t:id="condorcetInput" t:nulls="zero" t:validate="min=0, max=99"/> + </t:if> + <t:if test="poll.voteCountingType.number"> + <input t:type="textfield" value="editedVote.voteValue" size="3" /> + </t:if> + </th> + </t:unless> + </t:loop> + </tr> + </tfoot> + </t:if> <tbody> <t:unless t:test="poll.anonymous"> <t:loop t:source="participants" t:value="participant" t:rowIndex="participantIndex" volatile="true">