Author: bleny Date: 2013-03-22 16:46:02 +0100 (Fri, 22 Mar 2013) New Revision: 34 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: refs #2162: consider sites reported in errors Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/SiteErrorDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaSiteErrorDao.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/SiteErrorsService.java Removed: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/Site.java Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/JpaUtil.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/Sites.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/StoredArticles.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/AbstractJpaDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStorageMovementDao.java trunk/magalie-persistence/src/main/resources/magalie.properties trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/ArticleStorageService.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/DefaultMagalieServiceContext.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieServiceContext.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/JpaUtil.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/JpaUtil.java 2013-03-22 15:45:13 UTC (rev 33) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/JpaUtil.java 2013-03-22 15:46:02 UTC (rev 34) @@ -54,10 +54,13 @@ String h2dataPath = databaseFile.getAbsolutePath() + File.separator + "h2data"; - allJpaParameters.put(AvailableSettings.JDBC_URL, "jdbc:h2:file:" + h2dataPath); + String jdbcUrl = "jdbc:h2:file:" + h2dataPath; + allJpaParameters.put(AvailableSettings.JDBC_URL, jdbcUrl); + if (log.isTraceEnabled()) { log.trace("will store H2 data in " + h2dataPath); + log.trace("jdbc url is\n" + jdbcUrl); log.trace("allJpaParameters = " + allJpaParameters); } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/Sites.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/Sites.java 2013-03-22 15:45:13 UTC (rev 33) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/Sites.java 2013-03-22 15:46:02 UTC (rev 34) @@ -3,7 +3,9 @@ import com.franciaflex.magalie.entity.MagalieUser; import com.franciaflex.magalie.entity.Site; import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import java.util.Collection; import java.util.Comparator; public class Sites { @@ -60,4 +62,8 @@ public static Comparator<Site> siteRequiringDriverLicenseFirstComparator() { return new SiteRequiringDriverLicenseFirstComparator(); } + + public static Predicate<Site> siteIsNotReportedInError(Collection<Site> allSitesInError) { + return Predicates.not(Predicates.in(allSitesInError)); + } } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/StoredArticles.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/StoredArticles.java 2013-03-22 15:45:13 UTC (rev 33) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/StoredArticles.java 2013-03-22 15:46:02 UTC (rev 34) @@ -9,6 +9,7 @@ import com.google.common.base.Predicates; import com.google.common.collect.Ordering; +import java.util.Collection; import java.util.Comparator; public class StoredArticles { @@ -118,5 +119,7 @@ return new ArticleStoredInSitesRequiringDriverLicenseFirstComparator(); } - + public static Predicate<StoredArticle> articleNotStoredInSiteReportedInError(Collection<Site> allSitesInError) { + return Predicates.compose(Sites.siteIsNotReportedInError(allSitesInError), getSiteFunction()); + } } Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/SiteErrorDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/SiteErrorDao.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/SiteErrorDao.java 2013-03-22 15:46:02 UTC (rev 34) @@ -0,0 +1,17 @@ +package com.franciaflex.magalie.dao; + +import com.franciaflex.magalie.entity.Site; +import com.franciaflex.magalie.entity.SiteError; + +import java.util.List; + +/** + * @author bleny + */ +public interface SiteErrorDao extends Dao<SiteError> { + + SiteError findBySite(Site site); + + List<Site> getAllSitesInError(); + +} Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/AbstractJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/AbstractJpaDao.java 2013-03-22 15:45:13 UTC (rev 33) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/AbstractJpaDao.java 2013-03-22 15:46:02 UTC (rev 34) @@ -4,6 +4,7 @@ import com.franciaflex.magalie.entity.AbstractJpaEntity; import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; public abstract class AbstractJpaDao<E extends AbstractJpaEntity> implements Dao<E> { @@ -23,7 +24,10 @@ @Override public void persist(E entity) { + EntityTransaction transaction = entityManager.getTransaction(); + transaction.begin(); entityManager.persist(entity); + transaction.commit(); } @Override Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaSiteErrorDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaSiteErrorDao.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaSiteErrorDao.java 2013-03-22 15:46:02 UTC (rev 34) @@ -0,0 +1,40 @@ +package com.franciaflex.magalie.dao.jpa; + +import com.franciaflex.magalie.dao.SiteErrorDao; +import com.franciaflex.magalie.entity.Site; +import com.franciaflex.magalie.entity.SiteError; +import com.google.common.collect.Iterables; + +import javax.persistence.EntityManager; +import javax.persistence.Query; +import java.util.List; + +public class JpaSiteErrorDao extends AbstractJpaDao<SiteError> implements SiteErrorDao { + + public JpaSiteErrorDao(EntityManager entityManager) { + super(entityManager); + } + + @Override + protected Class<SiteError> getEntityClass() { + return SiteError.class; + } + + @Override + public SiteError findBySite(Site site) { + Query query = entityManager.createQuery("from SiteError se where se.site = :site"); + query.setParameter("site", site); + SiteError siteError = (SiteError) + Iterables.getOnlyElement( + query.getResultList(), + null); + return siteError; + } + + @Override + public List<Site> getAllSitesInError() { + Query query = entityManager.createQuery("select se.site from SiteError se"); + List<Site> allSitesInError = query.getResultList(); + return allSitesInError; + } +} Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStorageMovementDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStorageMovementDao.java 2013-03-22 15:45:13 UTC (rev 33) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStorageMovementDao.java 2013-03-22 15:46:02 UTC (rev 34) @@ -5,7 +5,6 @@ import com.franciaflex.magalie.entity.StorageMovement; import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; import javax.persistence.Query; import java.util.List; @@ -29,11 +28,11 @@ @Override public void persistAll(Iterable<StorageMovement> storageMovements) { - EntityTransaction transaction = entityManager.getTransaction(); - transaction.begin(); + // EntityTransaction transaction = entityManager.getTransaction(); + // transaction.begin(); for (StorageMovement storageMovement : storageMovements) { persist(storageMovement); } - transaction.commit(); + // transaction.commit(); } } Modified: trunk/magalie-persistence/src/main/resources/magalie.properties =================================================================== --- trunk/magalie-persistence/src/main/resources/magalie.properties 2013-03-22 15:45:13 UTC (rev 33) +++ trunk/magalie-persistence/src/main/resources/magalie.properties 2013-03-22 15:46:02 UTC (rev 34) @@ -6,5 +6,4 @@ hibernate.hbm2ddl.auto=create-drop hibernate.show_sql=true hibernate.format_sql=true -hibernate.transaction.flush_before_completion=true hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/ArticleStorageService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/ArticleStorageService.java 2013-03-22 15:45:13 UTC (rev 33) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/ArticleStorageService.java 2013-03-22 15:46:02 UTC (rev 34) @@ -138,7 +138,7 @@ List<StorageMovement> storageMovements = storageMovementDao.findAllByArticle(article); - ImmutableMap<Site,StoredArticle> storedArticlesBySite = + ImmutableMap<Site, StoredArticle> storedArticlesBySite = Maps.uniqueIndex( storedArticles, StoredArticles.getSiteFunction() @@ -165,8 +165,20 @@ } - // TODO brendan 21/03/13 consider sites in error + // exclude sites reported in error + SiteErrorsService siteErrorsService = serviceContext.newService(SiteErrorsService.class); + + List<Site> allSitesInError = siteErrorsService.getAllSitesInError(); + + storedArticles = + Lists.newArrayList( + Iterables.filter( + storedArticles, + StoredArticles.articleNotStoredInSiteReportedInError(allSitesInError) + ) + ); + return storedArticles; } Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/DefaultMagalieServiceContext.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/DefaultMagalieServiceContext.java 2013-03-22 15:45:13 UTC (rev 33) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/DefaultMagalieServiceContext.java 2013-03-22 15:46:02 UTC (rev 34) @@ -5,11 +5,13 @@ import com.franciaflex.magalie.dao.ArticleDao; import com.franciaflex.magalie.dao.MagalieUserDao; import com.franciaflex.magalie.dao.RequestedArticleDao; +import com.franciaflex.magalie.dao.SiteErrorDao; import com.franciaflex.magalie.dao.StorageMovementDao; import com.franciaflex.magalie.dao.StoredArticleDao; import com.franciaflex.magalie.dao.jpa.JpaArticleDao; import com.franciaflex.magalie.dao.jpa.JpaMagalieUserDao; import com.franciaflex.magalie.dao.jpa.JpaRequestedArticleDao; +import com.franciaflex.magalie.dao.jpa.JpaSiteErrorDao; import com.franciaflex.magalie.dao.jpa.JpaStorageMovementDao; import com.franciaflex.magalie.dao.jpa.JpaStoredArticleDao; @@ -102,4 +104,9 @@ public StorageMovementDao getStorageMovementDao() { return new JpaStorageMovementDao(entityManager); } + + @Override + public SiteErrorDao getSiteErrorDao() { + return new JpaSiteErrorDao(entityManager); + } } Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieServiceContext.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieServiceContext.java 2013-03-22 15:45:13 UTC (rev 33) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieServiceContext.java 2013-03-22 15:46:02 UTC (rev 34) @@ -27,6 +27,7 @@ import com.franciaflex.magalie.dao.ArticleDao; import com.franciaflex.magalie.dao.MagalieUserDao; import com.franciaflex.magalie.dao.RequestedArticleDao; +import com.franciaflex.magalie.dao.SiteErrorDao; import com.franciaflex.magalie.dao.StorageMovementDao; import com.franciaflex.magalie.dao.StoredArticleDao; @@ -52,4 +53,7 @@ StorageMovementDao getStorageMovementDao(); MagalieApplicationConfig getMagalieApplicationConfig(); + + SiteErrorDao getSiteErrorDao(); + } Deleted: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/Site.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/Site.java 2013-03-22 15:45:13 UTC (rev 33) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/Site.java 2013-03-22 15:46:02 UTC (rev 34) @@ -1,86 +0,0 @@ -package com.franciaflex.magalie.services; - -/* - * #%L - * MagaLiE :: Services - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2013 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -public class Site { - - protected String name; - - protected String barcode; - - protected int available; - - protected int withdrawn; - - protected boolean used; - - public Site() {} - - public Site(String name, String barcode, int available) { - this.name = name; - this.barcode = barcode; - this.available = available; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getBarcode() { - return barcode; - } - - public void setBarcode(String barcode) { - this.barcode = barcode; - } - - public int getAvailable() { - return available; - } - - public void setAvailable(int available) { - this.available = available; - } - - public int getWithdrawn() { - return withdrawn; - } - - public void setWithdrawn(int withdrawn) { - this.withdrawn = withdrawn; - } - - public boolean isUsed() { - return used; - } - - public void setUsed(boolean used) { - this.used = used; - } - -} Added: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/SiteErrorsService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/SiteErrorsService.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/SiteErrorsService.java 2013-03-22 15:46:02 UTC (rev 34) @@ -0,0 +1,63 @@ +package com.franciaflex.magalie.services; + +import com.franciaflex.magalie.dao.SiteErrorDao; +import com.franciaflex.magalie.entity.MagalieUser; +import com.franciaflex.magalie.entity.Site; +import com.franciaflex.magalie.entity.SiteError; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.Date; +import java.util.List; + +public class SiteErrorsService implements MagalieService { + + private static final Log log = LogFactory.getLog(SiteErrorsService.class); + + protected MagalieServiceContext serviceContext; + + @Override + public void setServiceContext(MagalieServiceContext serviceContext) { + this.serviceContext = serviceContext; + } + + public void reportError(Site site, MagalieUser magalieUser) { + + SiteErrorDao siteErrorDao = serviceContext.getSiteErrorDao(); + + SiteError existingSiteError = siteErrorDao.findBySite(site); + + if (existingSiteError == null) { + + SiteError newSiteError = new SiteError(); + + newSiteError.setMagalieUser(magalieUser); + + newSiteError.setSite(site); + + Date reportDate = serviceContext.getDate(); + + newSiteError.setReportDate(reportDate); + + siteErrorDao.persist(newSiteError); + + } else { + + if (log.isInfoEnabled()) { + log.info("error on site " + site + " already reported, nothing saved"); + } + + } + + } + + public List<Site> getAllSitesInError() { + + SiteErrorDao siteErrorDao = serviceContext.getSiteErrorDao(); + + List<Site> allSitesInError = siteErrorDao.getAllSitesInError(); + + return allSitesInError; + + } +} Modified: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java 2013-03-22 15:45:13 UTC (rev 33) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java 2013-03-22 15:46:02 UTC (rev 34) @@ -3,6 +3,7 @@ import com.franciaflex.magalie.AbstractMagalieServiceTest; import com.franciaflex.magalie.entity.Article; import com.franciaflex.magalie.entity.MagalieUser; +import com.franciaflex.magalie.entity.Site; import com.google.common.collect.Iterables; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -184,5 +185,42 @@ } } + @Test + public void testWithdrawArticleConsiderSitesInError() throws Exception { + MagalieUser alexandre = fixture("alexandre"); + MagalieUser cathy = fixture("cathy"); + + Article article = fixture("article1"); + + // report site 2 in error + Site site2 = fixture("site2"); + SiteErrorsService siteErrorsService = newService(SiteErrorsService.class); + siteErrorsService.reportError(site2, alexandre); + + try { + WithdrawTask withdrawTask = service.withdrawArticle(cathy, article, 30.); + if (log.isDebugEnabled()) { + log.debug("withdrawTask = " + withdrawTask); + } + Assert.assertEquals(1, withdrawTask.getSites().size()); + WithdrawArticleFromSiteTask site = Iterables.get(withdrawTask.getSites(), 0, null); + Assert.assertNotEquals( + "site2 must not be returned because it was reported in error", + site2.getId(), + site.getSiteId()); + } catch (RequiredDriverLicenceException e) { + if (log.isDebugEnabled()) { + log.debug("exception raised = " + e); + } + Assert.fail(); + } catch (UnavailableArticleException e) { + if (log.isDebugEnabled()) { + log.debug("exception raised = " + e); + } + Assert.fail(); + } + } + + }