r75 - in trunk: magalie-persistence/src/main/java/com/franciaflex/magalie/persistence magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity magalie-persistence/src/main/resources magalie-services/src/main/java/com/franciaflex/magalie/services/service magalie-services/src/main/resources magalie-services/src/test/java/com/franciaflex/magalie/services/service magalie-web/src/main/java/com/franciaflex/magalie/web/action
Author: bleny Date: 2013-04-05 14:37:48 +0200 (Fri, 05 Apr 2013) New Revision: 75 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: add fixtures for requested articles, begin implementation of service Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/RequestedArticles.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java Removed: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedItemService.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedItemServiceTest.java Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/Article.java trunk/magalie-persistence/src/main/resources/magalie.properties trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FixturesService.java trunk/magalie-services/src/main/resources/fixtures.yaml trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/DeliverRequestedArticleAction.java Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/RequestedArticles.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/RequestedArticles.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/RequestedArticles.java 2013-04-05 12:37:48 UTC (rev 75) @@ -0,0 +1,21 @@ +package com.franciaflex.magalie.persistence; + +import com.franciaflex.magalie.persistence.entity.RequestedArticle; +import org.apache.commons.collections.comparators.BooleanComparator; + +import java.util.Comparator; + +public class RequestedArticles { + + protected static final class UrgentFirstComparator implements Comparator<RequestedArticle> { + + @Override + public int compare(RequestedArticle x, RequestedArticle y) { + return BooleanComparator.getTrueFirstComparator().compare(x.isUrgent(), y.isUrgent()); + } + } + + public static Comparator<RequestedArticle> urgentFirstComparator() { + return new UrgentFirstComparator(); + } +} Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java 2013-04-04 16:41:25 UTC (rev 74) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java 2013-04-05 12:37:48 UTC (rev 75) @@ -8,11 +8,10 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Ordering; -import com.google.common.primitives.Booleans; +import org.apache.commons.collections.comparators.BooleanComparator; import java.util.Collection; import java.util.Comparator; -import java.util.Set; public class StoredArticles { @@ -25,15 +24,10 @@ } @Override - public int compare(StoredArticle storedArticle1, StoredArticle storedArticle2) { - boolean storedArticle1isInFixedSite = false; - boolean storedArticle2isInFixedSite = false; - Set<Site> fixedSites = article.getFixedSites(); - if (fixedSites != null) { - storedArticle1isInFixedSite = fixedSites.contains(storedArticle1.getSite()); - storedArticle2isInFixedSite = fixedSites.contains(storedArticle2.getSite()); - } - return Booleans.compare(storedArticle2isInFixedSite, storedArticle1isInFixedSite); + public int compare(StoredArticle x, StoredArticle y) { + boolean xIsInFixedSite = article.isFixedSite(x.getSite()); + boolean yIsInFixedSite = article.isFixedSite(y.getSite()); + return BooleanComparator.getTrueFirstComparator().compare(xIsInFixedSite, yIsInFixedSite); } } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/Article.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/Article.java 2013-04-04 16:41:25 UTC (rev 74) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/entity/Article.java 2013-04-05 12:37:48 UTC (rev 75) @@ -70,4 +70,13 @@ public void setDescription(String description) { this.description = description; } + + public boolean isFixedSite(Site site) { + boolean isFixedSite = false; + Set<Site> fixedSites = getFixedSites(); + if (fixedSites != null) { + isFixedSite = fixedSites.contains(site); + } + return isFixedSite; + } } Modified: trunk/magalie-persistence/src/main/resources/magalie.properties =================================================================== --- trunk/magalie-persistence/src/main/resources/magalie.properties 2013-04-04 16:41:25 UTC (rev 74) +++ trunk/magalie-persistence/src/main/resources/magalie.properties 2013-04-05 12:37:48 UTC (rev 75) @@ -4,6 +4,6 @@ javax.persistence.jdbc.password= hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.hbm2ddl.auto=update -hibernate.show_sql=true +hibernate.show_sql=false hibernate.format_sql=true hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FixturesService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FixturesService.java 2013-04-04 16:41:25 UTC (rev 74) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/FixturesService.java 2013-04-05 12:37:48 UTC (rev 75) @@ -3,10 +3,12 @@ import com.franciaflex.magalie.persistence.MagaliePersistenceContext; import com.franciaflex.magalie.persistence.dao.ArticleDao; import com.franciaflex.magalie.persistence.dao.MagalieUserDao; +import com.franciaflex.magalie.persistence.dao.RequestedArticleDao; import com.franciaflex.magalie.persistence.dao.SiteDao; import com.franciaflex.magalie.persistence.dao.StoredArticleDao; import com.franciaflex.magalie.persistence.entity.Article; import com.franciaflex.magalie.persistence.entity.MagalieUser; +import com.franciaflex.magalie.persistence.entity.RequestedArticle; import com.franciaflex.magalie.persistence.entity.Site; import com.franciaflex.magalie.persistence.entity.StoredArticle; import com.franciaflex.magalie.services.MagalieFixtures; @@ -114,6 +116,18 @@ persistenceContext.commit(); + RequestedArticleDao requestedArticleDao = serviceContext.getRequestedArticleDao(); + + Collection<RequestedArticle> requestedArticles = fixtures.fixture("requestedArticles"); + + for (RequestedArticle requestedArticle : requestedArticles) { + + requestedArticleDao.persist(requestedArticle); + + } + + persistenceContext.commit(); + } else { if (log.isWarnEnabled()) { Copied: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java (from rev 74, trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedItemService.java) =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java 2013-04-05 12:37:48 UTC (rev 75) @@ -0,0 +1,178 @@ +package com.franciaflex.magalie.services.service; + +/* + * #%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% + */ + +import com.franciaflex.magalie.persistence.RequestedArticles; +import com.franciaflex.magalie.persistence.dao.RequestedArticleDao; +import com.franciaflex.magalie.persistence.entity.Article; +import com.franciaflex.magalie.persistence.entity.MagalieUser; +import com.franciaflex.magalie.persistence.entity.RequestedArticle; +import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; +import com.franciaflex.magalie.services.MagalieService; +import com.franciaflex.magalie.services.MagalieServiceContext; +import com.franciaflex.magalie.services.exception.RequiredDriverLicenceException; +import com.franciaflex.magalie.services.exception.UnavailableArticleException; +import com.google.common.collect.Lists; +import com.google.common.collect.Ordering; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.PriorityQueue; +import java.util.Queue; + +public class RequestedArticleService implements MagalieService { + + private static final Log log = LogFactory.getLog(RequestedArticleService.class); + + protected MagalieServiceContext serviceContext; + + public void setServiceContext(MagalieServiceContext serviceContext) { + this.serviceContext = serviceContext; + } + + public StorageMovementOrder getStorageMovementOrder( + MagalieUser magalieUser, + String storeCode) { + + List<RequestedArticle> requestedArticles = getRequestedArticles(storeCode); + + Queue<RequestedArticle> requestedArticlesByPriority = getRequestedArticlesByPriority(requestedArticles); + + StorageMovementOrder storageMovementOrder = + findOrderToExecute( + requestedArticlesByPriority, + magalieUser); + + return storageMovementOrder; + + } + + protected List<RequestedArticle> getRequestedArticles(String storeCode) { + + RequestedArticleDao requestedArticleDao = serviceContext.getRequestedArticleDao(); + + List<RequestedArticle> allRequestedArticles = requestedArticleDao.findAll(); + + if (log.isInfoEnabled()) { + log.info(allRequestedArticles.size() + " articles requested"); + } + + // TODO brendan 05/04/13 consider storeCode + + // TODO brendan 05/04/13 remove already treated requests + + return allRequestedArticles; + + } + + protected StorageMovementOrder findOrderToExecute(Queue<RequestedArticle> requestedArticlesByPriority, MagalieUser magalieUser) { + + ArticleStorageService articleStorageService = + serviceContext.newService(ArticleStorageService.class); + + StorageMovementOrder storageMovementOrder = null; + + int requestedArticlesCount = requestedArticlesByPriority.size(); + + Iterator<RequestedArticle> requestedArticleIterator = requestedArticlesByPriority.iterator(); + + boolean everythingIsUnavailable = true; + + boolean requiredDriverLicence = false; + + while (storageMovementOrder == null && requestedArticleIterator.hasNext()) { + + RequestedArticle requestedArticle = requestedArticleIterator.next(); + + Article article = requestedArticle.getArticle(); + + double quantity = requestedArticle.getQuantity(); + + try { + + storageMovementOrder = articleStorageService.bookArticle(magalieUser, article, quantity, null); + + everythingIsUnavailable = false; + + } catch (UnavailableArticleException e) { + + if (log.isDebugEnabled()) { + log.debug("cannot work for order", e); + } + + } catch (RequiredDriverLicenceException e) { + + if (log.isDebugEnabled()) { + log.debug("cannot work for order", e); + } + + requiredDriverLicence = true; + + } + + } + + if (storageMovementOrder == null && requestedArticlesCount > 0) { + + if (everythingIsUnavailable) { + + if (requiredDriverLicence) { + + // throw new RequiredDriverLicenceException(); + + } else { + + // throw new UnavailableArticleException(); + + } + } + } + + return storageMovementOrder; + + } + + protected Queue<RequestedArticle> getRequestedArticlesByPriority(List<RequestedArticle> requests) { + + Comparator<RequestedArticle> priorityComparator = + Ordering.compound( + Lists.newArrayList( + RequestedArticles.urgentFirstComparator() + ) + ); + + PriorityQueue<RequestedArticle> requestedArticles = + new PriorityQueue<RequestedArticle>( + requests.size(), + priorityComparator); + + requestedArticles.addAll(requests); + + return requestedArticles; + + } +} Deleted: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedItemService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedItemService.java 2013-04-04 16:41:25 UTC (rev 74) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedItemService.java 2013-04-05 12:37:48 UTC (rev 75) @@ -1,131 +0,0 @@ -package com.franciaflex.magalie.services.service; - -/* - * #%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% - */ - -import com.franciaflex.magalie.persistence.dao.RequestedArticleDao; -import com.franciaflex.magalie.persistence.entity.Article; -import com.franciaflex.magalie.persistence.entity.MagalieUser; -import com.franciaflex.magalie.persistence.entity.RequestedArticle; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; -import com.franciaflex.magalie.services.MagalieService; -import com.franciaflex.magalie.services.MagalieServiceContext; -import com.franciaflex.magalie.services.exception.RequiredDriverLicenceException; -import com.franciaflex.magalie.services.exception.UnavailableArticleException; -import com.google.common.collect.Sets; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -public class RequestedItemService implements MagalieService { - - private static final Log log = LogFactory.getLog(RequestedItemService.class); - - protected MagalieServiceContext serviceContext; - - public void setServiceContext(MagalieServiceContext serviceContext) { - this.serviceContext = serviceContext; - } - - public StorageMovementOrder getWithdrawTask( - MagalieUser magalieUser, - String storeCode) { - - ArticleStorageService articleStorageService = - serviceContext.newService(ArticleStorageService.class); - - RequestedArticleDao requestedArticleDao = serviceContext.getRequestedArticleDao(); - - List<RequestedArticle> allRequestedArticles = requestedArticleDao.findAll(); - - if (log.isInfoEnabled()) { - log.info(allRequestedArticles.size() + " articles requested"); - } - - Set<RequestedArticle> sortedRequestedArticles = Sets.newHashSet(allRequestedArticles); - - StorageMovementOrder storageMovementOrder = null; - - int requestedArticlesCount = allRequestedArticles.size(); - - Iterator<RequestedArticle> requestedArticleIterator = sortedRequestedArticles.iterator(); - - boolean everythingIsUnavailable = true; - - boolean requiredDriverLicence = false; - - while (storageMovementOrder == null && requestedArticleIterator.hasNext()) { - - RequestedArticle requestedArticle = requestedArticleIterator.next(); - - Article article = requestedArticle.getArticle(); - - double quantity = requestedArticle.getQuantity(); - - try { - - storageMovementOrder = articleStorageService.bookArticle(magalieUser, article, quantity, null); - - everythingIsUnavailable = false; - - } catch (UnavailableArticleException e) { - - if (log.isDebugEnabled()) { - log.debug("cannot work for order", e); - } - - } catch (RequiredDriverLicenceException e) { - - if (log.isDebugEnabled()) { - log.debug("cannot work for order", e); - } - - requiredDriverLicence = true; - - } - - } - - if (storageMovementOrder == null && requestedArticlesCount > 0) { - - if (everythingIsUnavailable) { - - if (requiredDriverLicence) { - - // throw new RequiredDriverLicenceException(); - - } else { - - // throw new UnavailableArticleException(); - - } - } - } - - return storageMovementOrder; - - } -} Modified: trunk/magalie-services/src/main/resources/fixtures.yaml =================================================================== --- trunk/magalie-services/src/main/resources/fixtures.yaml 2013-04-04 16:41:25 UTC (rev 74) +++ trunk/magalie-services/src/main/resources/fixtures.yaml 2013-04-05 12:37:48 UTC (rev 75) @@ -144,3 +144,25 @@ storedArticlesForArticle1: - *storedArticle1 - *storedArticle2 + +requestedArticle1: + &requestedArticle1 !requested-article + id: requestedArticle1 + article: *article3 + quantity: 100 + requestList: 123456789 + requestDate: 2013-04-08 12:00:00 + urgent: true + +requestedArticle2: + &requestedArticle2 !requested-article + id: requestedArticle2 + article: *article3 + quantity: 250 + requestList: 123456789 + requestDate: 2013-04-08 12:00:00 + urgent: false + +requestedArticles: + - *requestedArticle1 + - *requestedArticle2 Copied: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java (from rev 65, trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedItemServiceTest.java) =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java (rev 0) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java 2013-04-05 12:37:48 UTC (rev 75) @@ -0,0 +1,38 @@ +package com.franciaflex.magalie.services.service; + +import com.franciaflex.magalie.persistence.entity.RequestedArticle; +import com.franciaflex.magalie.services.AbstractMagalieServiceTest; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.text.ParseException; +import java.util.Date; +import java.util.List; +import java.util.Queue; + +public class RequestedArticleServiceTest extends AbstractMagalieServiceTest { + + protected RequestedArticleService service; + + @Before + public void setUp() throws ParseException { + + service = newService(RequestedArticleService.class); + + serviceContext.setDate(new Date(1363948427576l)); + + } + + @Test + public void testPrioritize() { + + List<RequestedArticle> requestedArticles = fixture("requestedArticles"); + + Queue<RequestedArticle> requestedArticlesByPriority = + service.getRequestedArticlesByPriority(requestedArticles); + + Assert.assertEquals(requestedArticles.size(), requestedArticlesByPriority.size()); + + } +} Deleted: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedItemServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedItemServiceTest.java 2013-04-04 16:41:25 UTC (rev 74) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedItemServiceTest.java 2013-04-05 12:37:48 UTC (rev 75) @@ -1,50 +0,0 @@ -package com.franciaflex.magalie.services.service; - -import com.franciaflex.magalie.persistence.JpaUtil; -import com.franciaflex.magalie.persistence.entity.MagalieUser; -import com.franciaflex.magalie.services.AbstractMagalieServiceTest; -import com.google.common.collect.Sets; -import org.junit.Test; - -import javax.persistence.EntityManager; -import java.util.Comparator; -import java.util.Set; - -public class RequestedItemServiceTest extends AbstractMagalieServiceTest { - - @Test - public void testGetWithdrawTask() throws Exception { - - getServiceContext(); - - Set<Double> doubles = Sets.newTreeSet(new Comparator<Double>() { - @Override - public int compare(Double o1, Double o2) { - return Double.compare(o1, o2); - } - }); - - doubles.add(3.); - doubles.add(2.); - doubles.add(4.); - doubles.add(1.); - doubles.add(7.); - - System.out.println(doubles); - } - - @Test - public void testName() throws Exception { - getServiceContext(); - - MagalieUser alexandre = fixture("alexandre"); - - EntityManager entityManager = serviceContext.getEntityManager(); - - JpaUtil.cleanDatabase(entityManager); - -// MagalieUser found = serviceContext.getMagalieUserDao().findById(alexandre.getId()); - -// Assert.assertNull(found); - } -} Modified: trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/DeliverRequestedArticleAction.java =================================================================== --- trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/DeliverRequestedArticleAction.java 2013-04-04 16:41:25 UTC (rev 74) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/action/DeliverRequestedArticleAction.java 2013-04-05 12:37:48 UTC (rev 75) @@ -2,7 +2,7 @@ import com.franciaflex.magalie.persistence.entity.MagalieUser; import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; -import com.franciaflex.magalie.services.service.RequestedItemService; +import com.franciaflex.magalie.services.service.RequestedArticleService; import com.franciaflex.magalie.web.MagalieActionSupport; import com.franciaflex.magalie.web.MagalieSession; import org.apache.commons.logging.Log; @@ -19,11 +19,11 @@ protected MagalieSession session; - protected RequestedItemService service; + protected RequestedArticleService service; protected StorageMovementOrder storageMovementOrder; - public void setService(RequestedItemService service) { + public void setService(RequestedArticleService service) { this.service = service; } @@ -38,7 +38,7 @@ String storeCode = session.getStoreCode(); - storageMovementOrder = service.getWithdrawTask(magalieUser, storeCode); + storageMovementOrder = service.getStorageMovementOrder(magalieUser, storeCode); String result = SUCCESS;
participants (1)
-
bleny@users.forge.codelutin.com