r72 - in trunk: magalie-persistence/src/main/java/com/franciaflex/magalie/persistence magalie-services/src/main/java/com/franciaflex/magalie/services/exception magalie-services/src/main/java/com/franciaflex/magalie/services/service magalie-services/src/test/java/com/franciaflex/magalie/services/service
Author: bleny Date: 2013-04-04 16:52:50 +0200 (Thu, 04 Apr 2013) New Revision: 72 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: introduce best effort policy Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Sites.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/RequiredDriverLicenceException.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Sites.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Sites.java 2013-04-04 13:38:01 UTC (rev 71) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/Sites.java 2013-04-04 14:52:50 UTC (rev 72) @@ -55,6 +55,10 @@ return new AccessibleSitePredicate(magalieUser); } + public static Predicate<Site> inaccessibleSitePredicate(MagalieUser magalieUser) { + return Predicates.not(accessibleSitePredicate(magalieUser)); + } + public static Predicate<Site> siteRequireDriverLicensePredicate() { return new SiteRequireDriverLicensePredicate(); } 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 13:38:01 UTC (rev 71) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java 2013-04-04 14:52:50 UTC (rev 72) @@ -8,6 +8,7 @@ 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 java.util.Collection; import java.util.Comparator; @@ -25,15 +26,14 @@ @Override public int compare(StoredArticle storedArticle1, StoredArticle storedArticle2) { + boolean storedArticle1isInFixedSite = false; + boolean storedArticle2isInFixedSite = false; Set<Site> fixedSites = article.getFixedSites(); - boolean storedArticle1isInFixedSite = fixedSites.contains(storedArticle1.getSite()); - boolean storedArticle2isInFixedSite = fixedSites.contains(storedArticle2.getSite()); - if (storedArticle1isInFixedSite && ! storedArticle2isInFixedSite) { - return -1; - } else if ( ! storedArticle1isInFixedSite && storedArticle2isInFixedSite) { - return +1; + if (fixedSites != null) { + storedArticle1isInFixedSite = fixedSites.contains(storedArticle1.getSite()); + storedArticle2isInFixedSite = fixedSites.contains(storedArticle2.getSite()); } - return 0; + return Booleans.compare(storedArticle2isInFixedSite, storedArticle1isInFixedSite); } } Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/RequiredDriverLicenceException.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/RequiredDriverLicenceException.java 2013-04-04 13:38:01 UTC (rev 71) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/exception/RequiredDriverLicenceException.java 2013-04-04 14:52:50 UTC (rev 72) @@ -1,7 +1,10 @@ package com.franciaflex.magalie.services.exception; +import com.franciaflex.magalie.persistence.Sites; import com.franciaflex.magalie.persistence.entity.Article; import com.franciaflex.magalie.persistence.entity.MagalieUser; +import com.franciaflex.magalie.persistence.entity.Site; +import com.google.common.base.Predicate; public class RequiredDriverLicenceException extends MagalieException { @@ -9,50 +12,43 @@ protected MagalieUser magalieUser; - protected double requestedQuantity; + protected Site site; - protected double accessibleQuantity; - protected RequiredDriverLicenceException(String message) { super(message); } - public static void throwIfRequestMoreThanAccessible(double requestedQuantity, double accessibleQuantity, MagalieUser magalieUser, Article article) throws RequiredDriverLicenceException { + public Article getArticle() { + return article; + } - if (requestedQuantity > accessibleQuantity) { + public MagalieUser getMagalieUser() { + return magalieUser; + } + public Site getSite() { + return site; + } + + public static void throwIfUserCannotAccessSite(MagalieUser magalieUser, Site site, Article article) throws RequiredDriverLicenceException { + + Predicate<Site> isSiteInaccessiblePredicate = Sites.inaccessibleSitePredicate(magalieUser); + + if (isSiteInaccessiblePredicate.apply(site)) { + String message = "requested article " + article - + " can not be retrieved since user " + magalieUser - + " has no driver license"; + + " can not be retrieved since user " + magalieUser + + " has no driver license"; RequiredDriverLicenceException newException = new RequiredDriverLicenceException(message); - newException.article = article; - newException.magalieUser = magalieUser; - newException.requestedQuantity = requestedQuantity; + newException.site = site; - newException.accessibleQuantity = accessibleQuantity; + newException.article = article; throw newException; - } } - - public Article getArticle() { - return article; - } - - public MagalieUser getMagalieUser() { - return magalieUser; - } - - public double getRequestedQuantity() { - return requestedQuantity; - } - - public double getAccessibleQuantity() { - return accessibleQuantity; - } } Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java 2013-04-04 13:38:01 UTC (rev 71) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java 2013-04-04 14:52:50 UTC (rev 72) @@ -49,27 +49,36 @@ } + public StorageMovementOrder bookArticleWithBestEffortPolicy( + MagalieUser magalieUser, Article article, double requestedQuantity, Site destinationSite) + throws RequiredDriverLicenceException, UnavailableArticleException { + + return bookArticle(magalieUser, article ,requestedQuantity, destinationSite, true); + + } + public StorageMovementOrder bookArticle( MagalieUser magalieUser, Article article, double requestedQuantity, Site destinationSite) throws UnavailableArticleException, RequiredDriverLicenceException { + return bookArticle(magalieUser, article ,requestedQuantity, destinationSite, false); + + } + + protected StorageMovementOrder bookArticle( + MagalieUser magalieUser, Article article, double requestedQuantity, Site destinationSite, boolean bestEffortPolicy) + throws UnavailableArticleException, RequiredDriverLicenceException { + Preconditions.checkNotNull(magalieUser); Preconditions.checkNotNull(article); Preconditions.checkArgument(requestedQuantity > 0.); - double availableQuantity = getAvailableQuantity(article); - UnavailableArticleException.throwIfRequestMoreThanAvailable(requestedQuantity, availableQuantity, article); - - double accessibleQuantity = getAccessibleQuantity(article, magalieUser); - RequiredDriverLicenceException.throwIfRequestMoreThanAccessible(requestedQuantity, accessibleQuantity, magalieUser, article); - if (log.isInfoEnabled()) { log.info("will process article request" + ": requested = " + requestedQuantity - + ", accessible " + accessibleQuantity - + ", available " + availableQuantity); + ); } List<StoredArticle> storedArticles = getStoredArticles(article); @@ -86,13 +95,7 @@ Set<StoredArticle> sortedStoredArticles = Sets.newTreeSet(storedArticlesOrdering); - Iterables.addAll( - sortedStoredArticles, - Iterables.filter( - storedArticles, - StoredArticles.articleStoredInAccessibleSitePredicate(magalieUser) - ) - ); + Iterables.addAll(sortedStoredArticles, storedArticles); StorageMovementOrder storageMovementOrder = new StorageMovementOrder(); @@ -108,28 +111,51 @@ double quantityWithdrawn = Math.min(quantityLeft, quantityInSite); - quantity += quantityWithdrawn; + if (quantityWithdrawn > 0.) { - StorageMovement newStorageMovement = new StorageMovement(); + Site originSite = storedArticle.getSite(); - newStorageMovement.setArticle(article); + RequiredDriverLicenceException.throwIfUserCannotAccessSite(magalieUser, originSite, article); - newStorageMovement.setOrderDate(orderDate); + quantity += quantityWithdrawn; - newStorageMovement.setMagalieUser(magalieUser); + StorageMovement newStorageMovement = new StorageMovement(); - newStorageMovement.setOriginSite(storedArticle.getSite()); + newStorageMovement.setArticle(article); - newStorageMovement.setDestinationSite(destinationSite); + newStorageMovement.setOrderDate(orderDate); - newStorageMovement.setExpectedQuantity(quantityWithdrawn); + newStorageMovement.setMagalieUser(magalieUser); - if (quantityWithdrawn > 0.) { + newStorageMovement.setOriginSite(originSite); + newStorageMovement.setDestinationSite(destinationSite); + + newStorageMovement.setExpectedQuantity(quantityWithdrawn); + storageMovementOrder.addStorageMovement(newStorageMovement); } + } + if (bestEffortPolicy) { + + log.debug("best effort policy, requested quantity was " + + requestedQuantity + " but only " + quantity + + " available"); + + if (storageMovementOrder.getStorageMovements().isEmpty()) { + + UnavailableArticleException.throwIfRequestMoreThanAvailable(requestedQuantity, 0., article); + + } + + } else { + + // strict policy, we must deliver all requested quantity + + UnavailableArticleException.throwIfRequestMoreThanAvailable(requestedQuantity, quantity, article); + } MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); @@ -242,44 +268,6 @@ } - protected double getAvailableQuantity(Article article) { - - List<StoredArticle> storedArticles = getStoredArticles(article); - - double availableQuantity = 0.; - - for (StoredArticle storedArticle : storedArticles) { - - availableQuantity += storedArticle.getQuantity(); - - } - - return availableQuantity; - - } - - protected double getAccessibleQuantity(Article article, MagalieUser magalieUser) { - - List<StoredArticle> storedArticles = getStoredArticles(article); - - Iterable<StoredArticle> accessibleStoredArticles = - Iterables.filter( - storedArticles, - StoredArticles.articleStoredInAccessibleSitePredicate(magalieUser) - ); - - double accessibleQuantity = 0.; - - for (StoredArticle storedArticle : accessibleStoredArticles) { - - accessibleQuantity += storedArticle.getQuantity(); - - } - - return accessibleQuantity; - - } - public void confirmStorageMovement(StorageMovementConfirmation confirmation, MagalieUser magalieUser) { String storageMovementOrderId = confirmation.getStorageMovementOrderId(); Modified: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java 2013-04-04 13:38:01 UTC (rev 71) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java 2013-04-04 14:52:50 UTC (rev 72) @@ -36,12 +36,12 @@ @Test public void testThrowUnavailableArticle() throws Exception { - MagalieUser basile = fixture("basile"); + MagalieUser alexandre = fixture("alexandre"); Article article = fixture("article1"); StorageMovementOrder storageMovementOrder; try { - storageMovementOrder = service.bookArticle(basile, article, 100.); + storageMovementOrder = service.bookArticle(alexandre, article, 100.); if (log.isDebugEnabled()) { log.debug("storageMovementOrder = " + storageMovementOrder); } @@ -59,6 +59,7 @@ MagalieUser basile = fixture("basile"); Article article = fixture("article1"); + Site site2 = fixture("site2"); StorageMovementOrder storageMovementOrder; try { @@ -71,7 +72,7 @@ if (log.isDebugEnabled()) { log.debug("exception raised = " + e); } - Assert.assertEquals(50., e.getAccessibleQuantity(), DELTA); + Assert.assertEquals(site2.getId(), e.getSite().getId()); } } @@ -79,11 +80,11 @@ public void testWithdrawArticleWithoutDriverLicense() throws Exception { MagalieUser basile = fixture("basile"); - Article article = fixture("article1"); + Article article = fixture("article2"); StorageMovementOrder storageMovementOrder = null; try { - storageMovementOrder = service.bookArticle(basile, article, 50.); + storageMovementOrder = service.bookArticle(basile, article, 5.); if (log.isDebugEnabled()) { log.debug("storageMovementOrder = " + storageMovementOrder); } @@ -226,5 +227,33 @@ } } + @Test + public void testWithdrawArticleWithBestEffortPolicy() throws Exception { + MagalieUser alexandre = fixture("alexandre"); + Article article = fixture("article2"); + Site site1 = fixture("site1"); + + try { + StorageMovementOrder storageMovementOrder = service.bookArticleWithBestEffortPolicy(alexandre, article, 30., null); + if (log.isDebugEnabled()) { + log.debug("storageMovementOrder = " + storageMovementOrder); + } + Assert.assertEquals(1, storageMovementOrder.getStorageMovements().size()); + StorageMovement storageMovement = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); + Assert.assertEquals("only 10 is available, so don't propose more", 10., storageMovement.getQuantity(), DELTA); + Assert.assertEquals(site1.getId(), storageMovement.getOriginSite().getId()); + } 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(); + } + } + }
participants (1)
-
bleny@users.forge.codelutin.com