r29 - in trunk: . magalie-persistence magalie-persistence/src/main/java/com/franciaflex/magalie magalie-persistence/src/main/java/com/franciaflex/magalie/dao magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa magalie-persistence/src/main/java/com/franciaflex/magalie/entity magalie-persistence/src/test/java/com/franciaflex/magalie magalie-persistence/src/test/resources magalie-services magalie-services/src/main/java/com/franciaflex/magalie/services magalie-service
Author: bleny Date: 2013-03-18 18:25:24 +0100 (Mon, 18 Mar 2013) New Revision: 29 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: implements force service Added: 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/Dao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/StoredArticleDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/AbstractJpaDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaMagalieUserDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStoredArticleDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/AbstractJpaEntity.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/ArticleStorageService.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieException.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequiredDriverLicenceException.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/UnavailableArticleException.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawArticleFromSiteTask.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/MagalieFixtures.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java trunk/magalie-services/src/test/resources/fixtures.yaml trunk/magalie-services/src/test/resources/log4j.properties Removed: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/AbstractJpaDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/JpaDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/JpaMagalieUserDao.java trunk/magalie-persistence/src/test/java/com/franciaflex/magalie/MagalieFixtures.java trunk/magalie-persistence/src/test/resources/fixtures.yaml Modified: trunk/magalie-persistence/pom.xml trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/MagalieUserDao.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/Article.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/MagalieUser.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/RequestedArticle.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/Site.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/SiteError.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StorageMovement.java trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StoredArticle.java trunk/magalie-persistence/src/test/java/com/franciaflex/magalie/PersistenceTest.java trunk/magalie-services/pom.xml 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/main/java/com/franciaflex/magalie/services/RequestedItemService.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawTask.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/RequestedItemServiceTest.java trunk/magalie-web/pom.xml trunk/magalie-web/src/main/resources/log4j.properties trunk/pom.xml Modified: trunk/magalie-persistence/pom.xml =================================================================== --- trunk/magalie-persistence/pom.xml 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/pom.xml 2013-03-18 17:25:24 UTC (rev 29) @@ -21,13 +21,6 @@ <dependencies> <dependency> - <groupId>com.esotericsoftware.yamlbeans</groupId> - <artifactId>yamlbeans</artifactId> - <version>1.06</version> - <scope>test</scope> - </dependency> - - <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> </dependency> Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/Sites.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/Sites.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/Sites.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,63 @@ +package com.franciaflex.magalie; + +import com.franciaflex.magalie.entity.MagalieUser; +import com.franciaflex.magalie.entity.Site; +import com.google.common.base.Predicate; + +import java.util.Comparator; + +public class Sites { + + protected static class SiteRequireDriverLicensePredicate implements Predicate<Site> { + + @Override + public boolean apply(Site site) { + return site.isDriverLicenseRequired(); + } + } + + protected static class AccessibleSitePredicate implements Predicate<Site> { + + protected MagalieUser magalieUser; + + public AccessibleSitePredicate(MagalieUser magalieUser) { + this.magalieUser = magalieUser; + } + + @Override + public boolean apply(Site site) { + boolean isSiteAccessible = magalieUser.isDriverLicenseOwner() + || ! site.isDriverLicenseRequired(); + return isSiteAccessible; + } + + } + + protected static class SiteRequiringDriverLicenseFirstComparator implements Comparator<Site> { + + @Override + public int compare(Site site1, Site site2) { + boolean site1RequireDriverLicense = siteRequireDriverLicensePredicate().apply(site1); + boolean site2RequireDriverLicense = siteRequireDriverLicensePredicate().apply(site2); + if (site1RequireDriverLicense && ! site2RequireDriverLicense) { + return -1; + } else if ( ! site1RequireDriverLicense && site2RequireDriverLicense) { + return +1; + } else { + return 0; + } + } + } + + public static Predicate<Site> accessibleSitePredicate(MagalieUser magalieUser) { + return new AccessibleSitePredicate(magalieUser); + } + + public static Predicate<Site> siteRequireDriverLicensePredicate() { + return new SiteRequireDriverLicensePredicate(); + } + + public static Comparator<Site> siteRequiringDriverLicenseFirstComparator() { + return new SiteRequiringDriverLicenseFirstComparator(); + } +} Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/StoredArticles.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/StoredArticles.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/StoredArticles.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,122 @@ +package com.franciaflex.magalie; + +import com.franciaflex.magalie.entity.Article; +import com.franciaflex.magalie.entity.MagalieUser; +import com.franciaflex.magalie.entity.Site; +import com.franciaflex.magalie.entity.StoredArticle; +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import com.google.common.collect.Ordering; + +import java.util.Comparator; + +public class StoredArticles { + + protected static class FixedSiteForArticleFirst implements Comparator<StoredArticle> { + + protected Article article; + + public FixedSiteForArticleFirst(Article article) { + this.article = article; + } + + @Override + public int compare(StoredArticle o1, StoredArticle o2) { + if (o1.getSite().equals(article.getFixedSite())) { + return -1; + } else if (o2.getSite().equals(article.getFixedSite())) { + return +1; + } + return 0; + } + + } + + protected static class SiteWithHighestQuantityFirst implements Comparator<StoredArticle> { + + @Override + public int compare(StoredArticle o1, StoredArticle o2) { + return Double.compare(o1.getQuantity(), o2.getQuantity()); + } + + } + + protected static class AccessibleSiteFirst implements Comparator<StoredArticle> { + + protected Predicate<StoredArticle> articleStoredInAccessibleSitePredicate; + + public AccessibleSiteFirst(MagalieUser magalieUser) { + articleStoredInAccessibleSitePredicate = + articleStoredInAccessibleSitePredicate(magalieUser); + } + + @Override + public int compare(StoredArticle o1, StoredArticle o2) { + boolean isSite1Accessible = articleStoredInAccessibleSitePredicate.apply(o1); + boolean isSite2Accessible = articleStoredInAccessibleSitePredicate.apply(o2); + if (isSite1Accessible && ! isSite2Accessible) { + return -1; + } else if ( ! isSite1Accessible && isSite2Accessible) { + return 1; + } else { + return 0; + } + } + + } + + protected static class GetSiteFunction implements Function<StoredArticle, Site> { + + @Override + public Site apply(StoredArticle storedArticle) { + return storedArticle.getSite(); + } + } + + protected static class ArticleStoredInSitesRequiringDriverLicenseFirstComparator implements Comparator<StoredArticle> { + + @Override + public int compare(StoredArticle o1, StoredArticle o2) { + return Sites.siteRequiringDriverLicenseFirstComparator().compare(o1.getSite(), o2.getSite()); + } + } + + public static Comparator<StoredArticle> siteWithHighestQuantityFirst() { + return new SiteWithHighestQuantityFirst(); + } + + public static Comparator<StoredArticle> siteWithLowestQuantityFirstComparator() { + return Ordering.from(new SiteWithHighestQuantityFirst()).reverse(); + } + + + public static Comparator<StoredArticle> accessibleSiteFirstComparator(MagalieUser magalieUser) { + return new AccessibleSiteFirst(magalieUser); + } + + public static Comparator<StoredArticle> fixedSiteForArticleFirstComparator(Article article) { + return new FixedSiteForArticleFirst(article); + } + + public static Comparator<StoredArticle> fixedSiteForArticleLastComparator(Article article) { + return Ordering.from(new FixedSiteForArticleFirst(article)).reverse(); + } + + public static Function<StoredArticle, Site> getSiteFunction() { + return new GetSiteFunction(); + } + + public static Predicate<StoredArticle> articleStoredInAccessibleSitePredicate(MagalieUser magalieUser) { + Predicate<StoredArticle> predicate = Predicates.compose( + Sites.accessibleSitePredicate(magalieUser), + getSiteFunction()); + return predicate; + } + + public static Comparator<StoredArticle> articleStoredInSitesRequiringDriverLicenseFirstComparator() { + return new ArticleStoredInSitesRequiringDriverLicenseFirstComparator(); + } + + +} Deleted: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/AbstractJpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/AbstractJpaDao.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/AbstractJpaDao.java 2013-03-18 17:25:24 UTC (rev 29) @@ -1,37 +0,0 @@ -package com.franciaflex.magalie.dao; - -import javax.persistence.EntityManager; - -public abstract class AbstractJpaDao<E> implements JpaDao<E> { - - protected EntityManager entityManager; - - public AbstractJpaDao(EntityManager entityManager) { - this.entityManager = entityManager; - } - - @Override - public void persist(E entity) { - entityManager.persist(entity); - } - - @Override - public E merge(E entity) { - return entityManager.merge(entity); - } - - @Override - public void remove(E entity) { - entityManager.remove(entity); - } - - @Override - public boolean contains(E entity) { - return entityManager.contains(entity); - } - - @Override - public void commit() { - entityManager.getTransaction().commit(); - } -} Copied: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/Dao.java (from rev 23, trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/JpaDao.java) =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/Dao.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/Dao.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,16 @@ +package com.franciaflex.magalie.dao; + +import com.franciaflex.magalie.entity.AbstractJpaEntity; + +public interface Dao<E extends AbstractJpaEntity> { + + void persist(E entity); + + E merge(E entity); + + void remove(E entity); + + boolean contains(E entity); + + void commit(); +} Deleted: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/JpaDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/JpaDao.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/JpaDao.java 2013-03-18 17:25:24 UTC (rev 29) @@ -1,14 +0,0 @@ -package com.franciaflex.magalie.dao; - -public interface JpaDao<E> { - - void persist(E entity); - - E merge(E entity); - - void remove(E entity); - - boolean contains(E entity); - - void commit(); -} Deleted: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/JpaMagalieUserDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/JpaMagalieUserDao.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/JpaMagalieUserDao.java 2013-03-18 17:25:24 UTC (rev 29) @@ -1,12 +0,0 @@ -package com.franciaflex.magalie.dao; - -import com.franciaflex.magalie.entity.MagalieUser; - -import javax.persistence.EntityManager; - -public class JpaMagalieUserDao extends AbstractJpaDao<MagalieUser> implements MagalieUserDao { - - public JpaMagalieUserDao(EntityManager entityManager) { - super(entityManager); - } -} Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/MagalieUserDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/MagalieUserDao.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/MagalieUserDao.java 2013-03-18 17:25:24 UTC (rev 29) @@ -5,6 +5,6 @@ /** * @author bleny */ -public interface MagalieUserDao extends JpaDao<MagalieUser> { +public interface MagalieUserDao extends Dao<MagalieUser> { } Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/StoredArticleDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/StoredArticleDao.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/StoredArticleDao.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,13 @@ +package com.franciaflex.magalie.dao; + +import com.franciaflex.magalie.entity.Article; +import com.franciaflex.magalie.entity.StoredArticle; + +import java.util.List; +import java.util.Set; + +public interface StoredArticleDao extends Dao<StoredArticle> { + + List<StoredArticle> findAllForArticle(Article article); + +} Copied: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/AbstractJpaDao.java (from rev 23, trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/AbstractJpaDao.java) =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/AbstractJpaDao.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/AbstractJpaDao.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,40 @@ +package com.franciaflex.magalie.dao.jpa; + +import com.franciaflex.magalie.dao.Dao; +import com.franciaflex.magalie.entity.AbstractJpaEntity; + +import javax.persistence.EntityManager; + +public abstract class AbstractJpaDao<E extends AbstractJpaEntity> implements Dao<E> { + + protected EntityManager entityManager; + + public AbstractJpaDao(EntityManager entityManager) { + this.entityManager = entityManager; + } + + @Override + public void persist(E entity) { + entityManager.persist(entity); + } + + @Override + public E merge(E entity) { + return entityManager.merge(entity); + } + + @Override + public void remove(E entity) { + entityManager.remove(entity); + } + + @Override + public boolean contains(E entity) { + return entityManager.contains(entity); + } + + @Override + public void commit() { + entityManager.getTransaction().commit(); + } +} Copied: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaMagalieUserDao.java (from rev 23, trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/JpaMagalieUserDao.java) =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaMagalieUserDao.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaMagalieUserDao.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,13 @@ +package com.franciaflex.magalie.dao.jpa; + +import com.franciaflex.magalie.dao.MagalieUserDao; +import com.franciaflex.magalie.entity.MagalieUser; + +import javax.persistence.EntityManager; + +public class JpaMagalieUserDao extends AbstractJpaDao<MagalieUser> implements MagalieUserDao { + + public JpaMagalieUserDao(EntityManager entityManager) { + super(entityManager); + } +} Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStoredArticleDao.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStoredArticleDao.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/dao/jpa/JpaStoredArticleDao.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,24 @@ +package com.franciaflex.magalie.dao.jpa; + +import com.franciaflex.magalie.dao.StoredArticleDao; +import com.franciaflex.magalie.entity.Article; +import com.franciaflex.magalie.entity.StoredArticle; + +import javax.persistence.EntityManager; +import javax.persistence.Query; +import java.util.List; + +public class JpaStoredArticleDao extends AbstractJpaDao<StoredArticle> implements StoredArticleDao { + + public JpaStoredArticleDao(EntityManager entityManager) { + super(entityManager); + } + + @Override + public List<StoredArticle> findAllForArticle(Article article) { + Query query = entityManager.createQuery("from storedArticle sa where sa.article = :article"); + query.setParameter("article", article); + List resultList = query.getResultList(); + return resultList; + } +} Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/AbstractJpaEntity.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/AbstractJpaEntity.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/AbstractJpaEntity.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,29 @@ +package com.franciaflex.magalie.entity; + +import com.google.common.base.Objects; +import org.apache.commons.lang3.builder.ToStringBuilder; + +public abstract class AbstractJpaEntity { + + public abstract String getId(); + + @Override + public boolean equals(Object o) { + String id = getId(); + if (this == o) return true; + if (!(o instanceof AbstractJpaEntity)) return false; + AbstractJpaEntity that = (AbstractJpaEntity) o; + if (!id.equals(that.getId())) return false; + return Objects.equal(id, that.getId()); + } + + @Override + public int hashCode() { + return Objects.hashCode(getId()); + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/Article.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/Article.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/Article.java 2013-03-18 17:25:24 UTC (rev 29) @@ -5,7 +5,7 @@ import javax.persistence.ManyToOne; @Entity -public class Article { +public class Article extends AbstractJpaEntity { @Id protected String id; @@ -21,6 +21,7 @@ protected String unit; + @Override public String getId() { return id; } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/MagalieUser.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/MagalieUser.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/MagalieUser.java 2013-03-18 17:25:24 UTC (rev 29) @@ -4,7 +4,7 @@ import javax.persistence.Id; @Entity -public class MagalieUser { +public class MagalieUser extends AbstractJpaEntity { @Id protected String id; @@ -15,6 +15,7 @@ protected int accreditationLevel; + @Override public String getId() { return id; } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/RequestedArticle.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/RequestedArticle.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/RequestedArticle.java 2013-03-18 17:25:24 UTC (rev 29) @@ -6,7 +6,7 @@ import java.util.Date; @Entity -public class RequestedArticle { +public class RequestedArticle extends AbstractJpaEntity { @Id protected String id; @@ -22,6 +22,15 @@ protected double quantity; + @Override + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + public String getRequestList() { return requestList; } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/Site.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/Site.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/Site.java 2013-03-18 17:25:24 UTC (rev 29) @@ -4,7 +4,7 @@ import javax.persistence.Id; @Entity -public class Site { +public class Site extends AbstractJpaEntity { @Id protected String id; @@ -15,6 +15,7 @@ protected int requiredAccreditationLevel; + @Override public String getId() { return id; } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/SiteError.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/SiteError.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/SiteError.java 2013-03-18 17:25:24 UTC (rev 29) @@ -8,7 +8,7 @@ import java.util.Date; @Entity -public class SiteError { +public class SiteError extends AbstractJpaEntity { @Id @GeneratedValue @@ -22,6 +22,7 @@ protected Date reportDate; + @Override public String getId() { return id; } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StorageMovement.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StorageMovement.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StorageMovement.java 2013-03-18 17:25:24 UTC (rev 29) @@ -7,7 +7,7 @@ import java.util.Date; @Entity -public class StorageMovement { +public class StorageMovement extends AbstractJpaEntity { @Id @GeneratedValue @@ -28,6 +28,7 @@ protected Date confirmDate; + @Override public String getId() { return id; } Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StoredArticle.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StoredArticle.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/entity/StoredArticle.java 2013-03-18 17:25:24 UTC (rev 29) @@ -5,19 +5,20 @@ import javax.persistence.ManyToOne; @Entity -public class StoredArticle { +public class StoredArticle extends AbstractJpaEntity { @Id protected String id; @ManyToOne - protected Site site; + protected Article article; @ManyToOne - protected Article article; + protected Site site; protected double quantity; + @Override public String getId() { return id; } Deleted: trunk/magalie-persistence/src/test/java/com/franciaflex/magalie/MagalieFixtures.java =================================================================== --- trunk/magalie-persistence/src/test/java/com/franciaflex/magalie/MagalieFixtures.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/test/java/com/franciaflex/magalie/MagalieFixtures.java 2013-03-18 17:25:24 UTC (rev 29) @@ -1,46 +0,0 @@ -package com.franciaflex.magalie; - -import com.esotericsoftware.yamlbeans.YamlException; -import com.esotericsoftware.yamlbeans.YamlReader; -import com.franciaflex.magalie.entity.Article; -import com.franciaflex.magalie.entity.MagalieUser; -import com.franciaflex.magalie.entity.RequestedArticle; -import com.franciaflex.magalie.entity.Site; -import com.franciaflex.magalie.entity.StoredArticle; -import org.apache.commons.io.Charsets; -import org.apache.commons.io.IOUtils; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; - -public class MagalieFixtures { - - private final Map<String,Object> fixtures; - - public MagalieFixtures(String fixturesName) { - String yamlPath = "/" + fixturesName + ".yaml"; - InputStream inputStream = getClass().getResourceAsStream(yamlPath); - String yaml; - try { - yaml = IOUtils.toString(inputStream, Charsets.UTF_8); - } catch (IOException e) { - throw new IllegalArgumentException(fixturesName + " is not a valid fixtures set name", e); - } - YamlReader reader = new YamlReader(yaml); - reader.getConfig().setClassTag("article", Article.class); - reader.getConfig().setClassTag("stored article", StoredArticle.class); - reader.getConfig().setClassTag("user", MagalieUser.class); - reader.getConfig().setClassTag("requested article", RequestedArticle.class); - reader.getConfig().setClassTag("site", Site.class); - try { - fixtures = (Map<String, Object>) reader.read(); - } catch (YamlException e) { - throw new MagalieTechnicalException("unable to read yaml file", e); - } - } - - public <E> E fixture(String id) throws Exception { - return (E) fixtures.get(id); - } -} Modified: trunk/magalie-persistence/src/test/java/com/franciaflex/magalie/PersistenceTest.java =================================================================== --- trunk/magalie-persistence/src/test/java/com/franciaflex/magalie/PersistenceTest.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/test/java/com/franciaflex/magalie/PersistenceTest.java 2013-03-18 17:25:24 UTC (rev 29) @@ -1,58 +1,48 @@ package com.franciaflex.magalie; -import com.franciaflex.magalie.entity.Article; -import com.franciaflex.magalie.entity.Site; -import org.junit.Ignore; import org.junit.Test; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; -import java.util.List; -import java.util.Map; - public class PersistenceTest { @Test - @Ignore public void testName() throws Exception { - MagalieFixtures fixtures = new MagalieFixtures("fixtures"); +// MagalieFixtures fixtures = new MagalieFixtures("fixtures"); +// +// Article article = fixtures.fixture("article2"); +// +// System.out.println(article); +// +// MagalieApplicationConfig applicationConfig = new MagalieApplicationConfig(); +// +// Map<String, Object> jpaParameters = applicationConfig.getJpaParameters(); +// +// EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("magaliePersistenceUnit", jpaParameters); +// +// EntityManager entityManager = entityManagerFactory.createEntityManager(); +// +// entityManager.getTransaction().begin(); +// +//// entityManager.persist(new MagalieUser()); +//// entityManager.persist(new Article()); +//// entityManager.persist(new StoredArticle()); +//// entityManager.persist(new Site()); +//// entityManager.persist(new RequestedArticle()); +// +//// entityManager.persist(new SiteError()); +//// entityManager.persist(new StorageMovement()); +// +// List<Site> sites = fixtures.fixture("sites"); +// +// for (Site site : sites) { +// +// entityManager.persist(site); +// +// } +// +// entityManager.getTransaction().commit(); +// +// entityManager.close(); - Article article = fixtures.fixture("article2"); - - System.out.println(article); - - MagalieApplicationConfig applicationConfig = new MagalieApplicationConfig(); - - Map<String, Object> jpaParameters = applicationConfig.getJpaParameters(); - - EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("magaliePersistenceUnit", jpaParameters); - - EntityManager entityManager = entityManagerFactory.createEntityManager(); - - entityManager.getTransaction().begin(); - -// entityManager.persist(new MagalieUser()); -// entityManager.persist(new Article()); -// entityManager.persist(new StoredArticle()); -// entityManager.persist(new Site()); -// entityManager.persist(new RequestedArticle()); - -// entityManager.persist(new SiteError()); -// entityManager.persist(new StorageMovement()); - - List<Site> sites = fixtures.fixture("sites"); - - for (Site site : sites) { - - entityManager.persist(site); - - } - - entityManager.getTransaction().commit(); - - entityManager.close(); - } } Deleted: trunk/magalie-persistence/src/test/resources/fixtures.yaml =================================================================== --- trunk/magalie-persistence/src/test/resources/fixtures.yaml 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-persistence/src/test/resources/fixtures.yaml 2013-03-18 17:25:24 UTC (rev 29) @@ -1,72 +0,0 @@ -site1: - &site1 !site - id: site1 - storeCode: UO1 - locationCode: A1 - requiredAccreditationLevel: 0 - -site2: - &site2 !site - id: site2 - storeCode: UO1 - locationCode: B2 - requiredAccreditationLevel: 9 - -site3: - &site3 !site - id: site3 - storeCode: UO1 - locationCode: C3 - requiredAccreditationLevel: 0 - -site4: - &site4 !site - id: site4 - storeCode: UO1 - locationCode: D4 - requiredAccreditationLevel: 0 - -site5: - &site5 !site - id: site5 - storeCode: UO2 - locationCode: A1 - requiredAccreditationLevel: 0 - -sites: - - *site1 - - *site2 - - *site3 - - *site4 - - *site5 - -article1: - &article1 !article - id: article1 - fixedSite: *site1 - code: 111111111 - quantityInKanban: 10 - unit: kg - description: very big screws - -article2: - &article2 !article - id: article2 - code: 222222222 - quantityInKanban: 2 - unit: box - description: little buttons - -article3: - &article3 !article - id: article3 - fixedSite: *site2 - code: 333333333 - quantityInKanban: 50 - unit: g - description: magic powder - -articles: - - *article1 - - *article2 - - *article3 Modified: trunk/magalie-services/pom.xml =================================================================== --- trunk/magalie-services/pom.xml 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-services/pom.xml 2013-03-18 17:25:24 UTC (rev 29) @@ -21,6 +21,16 @@ <dependencies> <dependency> + <groupId>com.esotericsoftware.yamlbeans</groupId> + <artifactId>yamlbeans</artifactId> + </dependency> + + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + </dependency> + + <dependency> <groupId>${project.groupId}</groupId> <artifactId>magalie-persistence</artifactId> <version>${project.version}</version> Added: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/ArticleStorageService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/ArticleStorageService.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/ArticleStorageService.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,150 @@ +package com.franciaflex.magalie.services; + +import com.franciaflex.magalie.StoredArticles; +import com.franciaflex.magalie.dao.StoredArticleDao; +import com.franciaflex.magalie.entity.Article; +import com.franciaflex.magalie.entity.MagalieUser; +import com.franciaflex.magalie.entity.StoredArticle; +import com.google.common.base.Preconditions; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Ordering; +import com.google.common.collect.Sets; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.List; +import java.util.Set; + +public class ArticleStorageService implements MagalieService { + + private static final Log log = LogFactory.getLog(ArticleStorageService.class); + + protected MagalieServiceContext serviceContext; + + public void setServiceContext(MagalieServiceContext serviceContext) { + this.serviceContext = serviceContext; + } + + public WithdrawTask withdrawArticle(MagalieUser magalieUser, Article article, double requestedQuantity) 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); + + Ordering<StoredArticle> storedArticlesOrdering = + Ordering.compound( + Lists.newArrayList( + StoredArticles.fixedSiteForArticleLastComparator(article), + StoredArticles.siteWithLowestQuantityFirstComparator(), + StoredArticles.articleStoredInSitesRequiringDriverLicenseFirstComparator() + ) + ); + + Set<StoredArticle> sortedStoredArticles = + Sets.newTreeSet(storedArticlesOrdering); + + Iterables.addAll( + sortedStoredArticles, + Iterables.filter( + storedArticles, + StoredArticles.articleStoredInAccessibleSitePredicate(magalieUser) + ) + ); + + WithdrawTask withdrawTask = new WithdrawTask(article, requestedQuantity); + + double quantity = 0; + + for (StoredArticle storedArticle : sortedStoredArticles) { + + double quantityLeft = requestedQuantity - quantity; + + double quantityInSite = storedArticle.getQuantity(); + + double quantityWithdrawn = Math.min(quantityLeft, quantityInSite); + + if (quantityWithdrawn > 0.) { + + quantity += quantityWithdrawn; + + // TODO brendan 18/03/13 enregistrer le mouvement + // quantityInSite -= quantityWithdrawn; + + } + + WithdrawArticleFromSiteTask withdrawArticleFromSiteTask = new WithdrawArticleFromSiteTask(storedArticle, quantityWithdrawn); + + withdrawTask.addWithdrawArticleFromSiteTask(withdrawArticleFromSiteTask); + + } + + return withdrawTask; + + } + + protected List<StoredArticle> getStoredArticles(Article article) { + + StoredArticleDao storedArticleDao = serviceContext.getStoredArticleDao(); + + // TODO brendan 18/03/13 remove storage movement, remove sites in error + + return storedArticleDao.findAllForArticle(article); + + } + + 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; + + } +} 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-15 17:34:28 UTC (rev 28) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/DefaultMagalieServiceContext.java 2013-03-18 17:25:24 UTC (rev 29) @@ -1,8 +1,10 @@ package com.franciaflex.magalie.services; import com.franciaflex.magalie.MagalieTechnicalException; -import com.franciaflex.magalie.dao.JpaMagalieUserDao; +import com.franciaflex.magalie.dao.StoredArticleDao; +import com.franciaflex.magalie.dao.jpa.JpaMagalieUserDao; import com.franciaflex.magalie.dao.MagalieUserDao; +import com.franciaflex.magalie.dao.jpa.JpaStoredArticleDao; import javax.persistence.EntityManager; import java.lang.reflect.Constructor; @@ -29,7 +31,7 @@ } catch (NoSuchMethodException e) { - throw new MagalieTechnicalException("all services must provide a non-argument contructor", e); + throw new MagalieTechnicalException("all services must provide a non-argument constructor", e); } catch (InvocationTargetException e) { @@ -57,4 +59,11 @@ return new JpaMagalieUserDao(entityManager); } + + @Override + public StoredArticleDao getStoredArticleDao() { + + return new JpaStoredArticleDao(entityManager); + + } } Added: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieException.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieException.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieException.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,20 @@ +package com.franciaflex.magalie.services; + +public class MagalieException extends Exception { + + public MagalieException() { + } + + public MagalieException(String message) { + super(message); + } + + public MagalieException(String message, Throwable cause) { + super(message, cause); + } + + public MagalieException(Throwable cause) { + super(cause); + } + +} 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-15 17:34:28 UTC (rev 28) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/MagalieServiceContext.java 2013-03-18 17:25:24 UTC (rev 29) @@ -24,6 +24,7 @@ */ import com.franciaflex.magalie.dao.MagalieUserDao; +import com.franciaflex.magalie.dao.StoredArticleDao; /** * @author bleny @@ -34,4 +35,5 @@ MagalieUserDao getMagalieUserDao(); + StoredArticleDao getStoredArticleDao(); } Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequestedItemService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequestedItemService.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequestedItemService.java 2013-03-18 17:25:24 UTC (rev 29) @@ -23,12 +23,6 @@ * #L% */ -import com.franciaflex.magalie.dao.MagalieUserDao; -import com.franciaflex.magalie.entity.MagalieUser; -import com.google.common.collect.ImmutableSet; - -import java.util.Set; - public class RequestedItemService implements MagalieService { protected MagalieServiceContext serviceContext; @@ -39,25 +33,30 @@ public WithdrawTask getWithdrawTask() { - MagalieUserDao magalieUserDao = serviceContext.getMagalieUserDao(); + ArticleStorageService articleStorageService = serviceContext.newService(ArticleStorageService.class); - magalieUserDao.persist(new MagalieUser()); + // articleStorageService.withdrawArticle(); - Set<Site> sites = ImmutableSet.of( - new Site("A1", "1", 5), - new Site("A2", "2", 5), - new Site("B3", "3", 10), - new Site("C4", "4", 15), - new Site("D5", "5", 15) - ); +// MagalieUserDao magalieUserDao = serviceContext.getMagalieUserDao(); +// +// magalieUserDao.persist(new MagalieUser()); +// +// Set<Site> sites = ImmutableSet.of( +// new Site("A1", "1", 5), +// new Site("A2", "2", 5), +// new Site("B3", "3", 10), +// new Site("C4", "4", 15), +// new Site("D5", "5", 15) +// ); +// +// WithdrawTask withdrawTask = new WithdrawTask(); +// +// withdrawTask.setQuantity(50); +// withdrawTask.setUnit("kg"); +// withdrawTask.setSites(sites); +// +// return withdrawTask; - WithdrawTask withdrawTask = new WithdrawTask(); - - withdrawTask.setQuantity(50); - withdrawTask.setUnit("kg"); - withdrawTask.setSites(sites); - - return withdrawTask; - + throw new UnsupportedOperationException(); } } Added: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequiredDriverLicenceException.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequiredDriverLicenceException.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/RequiredDriverLicenceException.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,58 @@ +package com.franciaflex.magalie.services; + +import com.franciaflex.magalie.entity.Article; +import com.franciaflex.magalie.entity.MagalieUser; + +public class RequiredDriverLicenceException extends MagalieException { + + protected Article article; + + protected MagalieUser magalieUser; + + protected double requestedQuantity; + + protected double accessibleQuantity; + + protected RequiredDriverLicenceException(String message) { + super(message); + } + + public static void throwIfRequestMoreThanAccessible(double requestedQuantity, double accessibleQuantity, MagalieUser magalieUser, Article article) throws RequiredDriverLicenceException { + + if (requestedQuantity > accessibleQuantity) { + + String message = "requested article " + article + + " 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.accessibleQuantity = accessibleQuantity; + + throw newException; + + } + } + + public Article getArticle() { + return article; + } + + public MagalieUser getMagalieUser() { + return magalieUser; + } + + public double getRequestedQuantity() { + return requestedQuantity; + } + + public double getAccessibleQuantity() { + return accessibleQuantity; + } +} Added: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/UnavailableArticleException.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/UnavailableArticleException.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/UnavailableArticleException.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,49 @@ +package com.franciaflex.magalie.services; + +import com.franciaflex.magalie.entity.Article; + +public class UnavailableArticleException extends MagalieException { + + protected Article article; + + protected double availableQuantity; + + protected double requestedQuantity; + + protected UnavailableArticleException(String message) { + super(message); + } + + public static void throwIfRequestMoreThanAvailable(double requestedQuantity, double availableQuantity, Article article) throws UnavailableArticleException { + + if (requestedQuantity > availableQuantity) { + + String message = "requested article " + article + + " is not available at expected quantity: requested = " + requestedQuantity + + " available = " + availableQuantity; + + UnavailableArticleException newException = new UnavailableArticleException(message); + + newException.article = article; + + newException.availableQuantity = availableQuantity; + + newException.requestedQuantity = requestedQuantity; + + throw newException; + + } + } + + public Article getArticle() { + return article; + } + + public double getAvailableQuantity() { + return availableQuantity; + } + + public double getRequestedQuantity() { + return requestedQuantity; + } +} Added: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawArticleFromSiteTask.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawArticleFromSiteTask.java (rev 0) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawArticleFromSiteTask.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,30 @@ +package com.franciaflex.magalie.services; + +import com.franciaflex.magalie.entity.*; +import com.franciaflex.magalie.entity.Site; +import org.apache.commons.lang3.builder.ToStringBuilder; + +public class WithdrawArticleFromSiteTask { + + protected StoredArticle storedArticle; + + protected double quantity; + + public WithdrawArticleFromSiteTask(StoredArticle storedArticle, double quantity) { + this.storedArticle = storedArticle; + this.quantity = quantity; + } + + public double getQuantity() { + return quantity; + } + + public Site getSite() { + return storedArticle.getSite(); + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawTask.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawTask.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/WithdrawTask.java 2013-03-18 17:25:24 UTC (rev 29) @@ -23,32 +23,41 @@ * #L% */ +import com.franciaflex.magalie.entity.Article; +import com.google.common.collect.Sets; +import org.apache.commons.lang3.builder.ToStringBuilder; + import java.util.Set; public class WithdrawTask { - protected Set<Site> sites; + protected Set<WithdrawArticleFromSiteTask> withdrawArticleFromSiteTasks; - protected String unit; + protected Article article; protected double quantity; - public Set<Site> getSites() { - return sites; + public WithdrawTask(Article article, double quantity) { + this.article = article; + this.quantity = quantity; } - public void setSites(Set<Site> sites) { - this.sites = sites; + public Set<WithdrawArticleFromSiteTask> getWithdrawArticleFromSiteTasks() { + return withdrawArticleFromSiteTasks; } - public String getUnit() { - return unit; + public void setWithdrawArticleFromSiteTasks(Set<WithdrawArticleFromSiteTask> withdrawArticleFromSiteTasks) { + this.withdrawArticleFromSiteTasks = withdrawArticleFromSiteTasks; } - public void setUnit(String unit) { - this.unit = unit; + public Article getArticle() { + return article; } + public void setArticle(Article article) { + this.article = article; + } + public double getQuantity() { return quantity; } @@ -56,4 +65,16 @@ public void setQuantity(double quantity) { this.quantity = quantity; } + + public void addWithdrawArticleFromSiteTask(WithdrawArticleFromSiteTask withdrawArticleFromSiteTask) { + if (withdrawArticleFromSiteTasks == null) { + withdrawArticleFromSiteTasks = Sets.newLinkedHashSet(); + } + withdrawArticleFromSiteTasks.add(withdrawArticleFromSiteTask); + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } } Copied: trunk/magalie-services/src/test/java/com/franciaflex/magalie/MagalieFixtures.java (from rev 28, trunk/magalie-persistence/src/test/java/com/franciaflex/magalie/MagalieFixtures.java) =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/MagalieFixtures.java (rev 0) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/MagalieFixtures.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,46 @@ +package com.franciaflex.magalie; + +import com.esotericsoftware.yamlbeans.YamlException; +import com.esotericsoftware.yamlbeans.YamlReader; +import com.franciaflex.magalie.entity.Article; +import com.franciaflex.magalie.entity.MagalieUser; +import com.franciaflex.magalie.entity.RequestedArticle; +import com.franciaflex.magalie.entity.Site; +import com.franciaflex.magalie.entity.StoredArticle; +import org.apache.commons.io.Charsets; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +public class MagalieFixtures { + + protected Map<String, Object> fixtures; + + public MagalieFixtures(String fixturesName) { + String yamlPath = "/" + fixturesName + ".yaml"; + InputStream inputStream = getClass().getResourceAsStream(yamlPath); + String yaml; + try { + yaml = IOUtils.toString(inputStream, Charsets.UTF_8); + } catch (IOException e) { + throw new IllegalArgumentException(fixturesName + " is not a valid fixtures set name", e); + } + YamlReader reader = new YamlReader(yaml); + reader.getConfig().setClassTag("article", Article.class); + reader.getConfig().setClassTag("stored-article", StoredArticle.class); + reader.getConfig().setClassTag("user", MagalieUser.class); + reader.getConfig().setClassTag("requested-article", RequestedArticle.class); + reader.getConfig().setClassTag("site", Site.class); + try { + fixtures = (Map<String, Object>) reader.read(); + } catch (YamlException e) { + throw new MagalieTechnicalException("unable to read yaml file", e); + } + } + + public <E> E fixture(String id) { + return (E) fixtures.get(id); + } +} Added: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java (rev 0) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,158 @@ +package com.franciaflex.magalie.services; + +import com.franciaflex.magalie.MagalieFixtures; +import com.franciaflex.magalie.dao.MagalieUserDao; +import com.franciaflex.magalie.dao.StoredArticleDao; +import com.franciaflex.magalie.entity.Article; +import com.franciaflex.magalie.entity.MagalieUser; +import com.franciaflex.magalie.entity.StoredArticle; +import com.google.common.collect.Iterables; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import java.util.List; + +public class ArticleStorageServiceTest { + + private static final Log log = LogFactory.getLog(ArticleStorageServiceTest.class); + + protected static final double DELTA = 0.0001; + + protected ArticleStorageService service; + + protected MagalieFixtures fixtures; + + @Before + public void setUp() throws Exception { + + service = new ArticleStorageService(); + + fixtures = new MagalieFixtures("fixtures"); + + service.setServiceContext(new MagalieServiceContext() { + + @Override + public <E extends MagalieService> E newService(Class<E> serviceClass) { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public MagalieUserDao getMagalieUserDao() { + throw new UnsupportedOperationException(); + } + + @Override + public StoredArticleDao getStoredArticleDao() { + StoredArticleDao storedArticleDaoMock = Mockito.mock(StoredArticleDao.class); + Mockito.when(storedArticleDaoMock.findAllForArticle(Mockito.<Article>any())).thenReturn( + fixtures.<List<StoredArticle>>fixture("storedArticlesForArticle1") + ); + return storedArticleDaoMock; + } + }); + } + + @Test + public void testThrowUnavailableArticle() throws Exception { + + MagalieUser basile = fixtures.fixture("basile"); + Article article = fixtures.fixture("article1"); + WithdrawTask withdrawTask; + + try { + withdrawTask = service.withdrawArticle(basile, article, 100.); + if (log.isDebugEnabled()) { + log.debug("withdrawTask = " + withdrawTask); + } + Assert.fail(); + } catch (UnavailableArticleException e) { + if (log.isDebugEnabled()) { + log.debug("exception raised = " + e); + } + Assert.assertEquals(70., e.getAvailableQuantity(), DELTA); + } + } + + @Test + public void testThrowRequiredDriverLicenceException() throws Exception { + + MagalieUser basile = fixtures.fixture("basile"); + Article article = fixtures.fixture("article1"); + WithdrawTask withdrawTask; + + try { + withdrawTask = service.withdrawArticle(basile, article, 70.); + if (log.isDebugEnabled()) { + log.debug("withdrawTask = " + withdrawTask); + } + Assert.fail(); + } catch (RequiredDriverLicenceException e) { + if (log.isDebugEnabled()) { + log.debug("exception raised = " + e); + } + Assert.assertEquals(50., e.getAccessibleQuantity(), DELTA); + } + } + + @Test + public void testWithdrawArticleWithoutDriverLicense() throws Exception { + + MagalieUser basile = fixtures.fixture("basile"); + Article article = fixtures.fixture("article1"); + WithdrawTask withdrawTask = null; + + try { + withdrawTask = service.withdrawArticle(basile, article, 50.); + if (log.isDebugEnabled()) { + log.debug("withdrawTask = " + withdrawTask); + } + } 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(); + } + + Assert.assertEquals(1, withdrawTask.getWithdrawArticleFromSiteTasks().size()); + } + + @Test + public void testWithdrawArticleWithDriverLicense() throws Exception { + + MagalieUser alexandre = fixtures.fixture("alexandre"); + Article article = fixtures.fixture("article1"); + WithdrawTask withdrawTask = null; + + try { + withdrawTask = service.withdrawArticle(alexandre, article, 50.); + if (log.isDebugEnabled()) { + log.debug("withdrawTask = " + withdrawTask); + } + } 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(); + } + + Assert.assertEquals(2, withdrawTask.getWithdrawArticleFromSiteTasks().size()); + WithdrawArticleFromSiteTask site1 = Iterables.get(withdrawTask.getWithdrawArticleFromSiteTasks(), 0, null); + Assert.assertEquals(20., site1.getQuantity(), DELTA); + WithdrawArticleFromSiteTask site2 = Iterables.get(withdrawTask.getWithdrawArticleFromSiteTasks(), 1, null); + Assert.assertEquals(30., site2.getQuantity(), DELTA); + } +} Modified: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/RequestedItemServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/RequestedItemServiceTest.java 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/RequestedItemServiceTest.java 2013-03-18 17:25:24 UTC (rev 29) @@ -1,10 +1,29 @@ package com.franciaflex.magalie.services; +import com.google.common.collect.Sets; import org.junit.Test; +import java.util.Comparator; +import java.util.Set; + public class RequestedItemServiceTest { @Test public void testGetWithdrawTask() throws Exception { + + 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); } } Copied: trunk/magalie-services/src/test/resources/fixtures.yaml (from rev 28, trunk/magalie-persistence/src/test/resources/fixtures.yaml) =================================================================== --- trunk/magalie-services/src/test/resources/fixtures.yaml (rev 0) +++ trunk/magalie-services/src/test/resources/fixtures.yaml 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,144 @@ +alexandre: + &alexandre !user + id: magalie_user_alexandre + login: ale + name: Alexandre + accreditationLevel: 9 + +basile: + &basile !user + id: magalie_user_basile + login: bas + name: Basile + accreditationLevel: 0 + +cathy: + &cathy !user + id: magalie_user_cathy + login: cat + name: Cathy + accreditationLevel: 9 + +david: + &david !user + id: magalie_user_david + login: dav + name: David + accreditationLevel: 0 + +users: + - *alexandre + - *basile + - *cathy + - *david + +site1: + &site1 !site + id: site1 + storeCode: UO1 + locationCode: A1 + requiredAccreditationLevel: 0 + +site2: + &site2 !site + id: site2 + storeCode: UO1 + locationCode: B2 + requiredAccreditationLevel: 9 + +site3: + &site3 !site + id: site3 + storeCode: UO1 + locationCode: C3 + requiredAccreditationLevel: 0 + +site4: + &site4 !site + id: site4 + storeCode: UO1 + locationCode: D4 + requiredAccreditationLevel: 9 + +site5: + &site5 !site + id: site5 + storeCode: UO2 + locationCode: A1 + requiredAccreditationLevel: 0 + +sites: + - *site1 + - *site2 + - *site3 + - *site4 + - *site5 + +article1: + &article1 !article + id: article1 + fixedSite: *site1 + code: 111111111 + quantityInKanban: 10 + unit: kg + description: very big screws + +article2: + &article2 !article + id: article2 + code: 222222222 + quantityInKanban: 2 + unit: box + description: little buttons + +article3: + &article3 !article + id: article3 + fixedSite: *site2 + code: 333333333 + quantityInKanban: 50 + unit: g + description: magic powder + +articles: + - *article1 + - *article2 + - *article3 + +storedArticle1: + &storedArticle1 !stored-article + id: storedArticle1 + article: *article1 + site: *site1 + quantity: 50 + +storedArticle2: + &storedArticle2 !stored-article + id: storedArticle2 + article: *article1 + site: *site2 + quantity: 20 + +storedArticle3: + &storedArticle3 !stored-article + id: storedArticle3 + article: *article2 + site: *site1 + quantity: 10 + +storedArticle4: + &storedArticle4 !stored-article + id: storedArticle4 + article: *article3 + site: *site4 + quantity: 1000 + +storedArticles: + - *storedArticle1 + - *storedArticle2 + - *storedArticle3 + - *storedArticle4 + +storedArticlesForArticle1: + - *storedArticle1 + - *storedArticle2 Copied: trunk/magalie-services/src/test/resources/log4j.properties (from rev 23, trunk/magalie-web/src/main/resources/log4j.properties) =================================================================== --- trunk/magalie-services/src/test/resources/log4j.properties (rev 0) +++ trunk/magalie-services/src/test/resources/log4j.properties 2013-03-18 17:25:24 UTC (rev 29) @@ -0,0 +1,8 @@ +log4j.rootCategory=ERROR, console + +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern=%d [%p] %c %m%n + +log4j.logger.com.franciaflex.magalie=TRACE + Modified: trunk/magalie-web/pom.xml =================================================================== --- trunk/magalie-web/pom.xml 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-web/pom.xml 2013-03-18 17:25:24 UTC (rev 29) @@ -32,6 +32,12 @@ <dependency> <groupId>${project.groupId}</groupId> + <artifactId>magalie-persistence</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>${project.groupId}</groupId> <artifactId>magalie-services</artifactId> <version>${project.version}</version> </dependency> Modified: trunk/magalie-web/src/main/resources/log4j.properties =================================================================== --- trunk/magalie-web/src/main/resources/log4j.properties 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/magalie-web/src/main/resources/log4j.properties 2013-03-18 17:25:24 UTC (rev 29) @@ -26,7 +26,7 @@ log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d [%p] %c %m%n -# FileAppender : need to have pollen.log.dir in system properties at application startup +# FileAppender : need to have magalie.log.dir in system properties at application startup log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=${magalie.log.dir}/magalie.log log4j.appender.file.MaxFileSize=10MB Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2013-03-15 17:34:28 UTC (rev 28) +++ trunk/pom.xml 2013-03-18 17:25:24 UTC (rev 29) @@ -262,6 +262,13 @@ <scope>test</scope> </dependency> + <dependency> + <groupId>com.esotericsoftware.yamlbeans</groupId> + <artifactId>yamlbeans</artifactId> + <version>1.06</version> + <scope>test</scope> + </dependency> + </dependencies> </dependencyManagement>
participants (1)
-
bleny@users.forge.codelutin.com