diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/bootstrap/CriterionsBootstrap.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/bootstrap/CriterionsBootstrap.java index d042cc8c7..aa8b1e3fb 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/bootstrap/CriterionsBootstrap.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/bootstrap/CriterionsBootstrap.java @@ -1,26 +1,45 @@ package org.navalplanner.business.resources.bootstrap; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import java.util.List; +import java.util.Map.Entry; + import org.navalplanner.business.IDataBootstrap; -import org.navalplanner.business.resources.services.ResourceService; +import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.ICriterionType; +import org.navalplanner.business.resources.services.CriterionService; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +/** + * Loads all {@link ICriterionTypeProvider} and if there is any criterion that + * doesn't exist, creates them.
+ * @author Óscar González Fernández + */ @Component @Scope("singleton") public class CriterionsBootstrap implements IDataBootstrap { - private static final Log LOG = LogFactory.getLog(CriterionsBootstrap.class); - @Autowired - private ResourceService resourceService; + private CriterionService criterionService; + + @Autowired + private List providers; @Override public void loadRequiredData() { - LOG.info("TODO: load criterions"); - assert resourceService != null; - } - + for (ICriterionTypeProvider provider: providers) { + for (Entry, List> entry : provider + .getRequiredCriterions() + .entrySet()) { + for (Criterion criterion : entry.getValue()) { + criterionService.createIfNotExists(criterion); + } + } + } + } } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/bootstrap/ICriterionTypeProvider.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/bootstrap/ICriterionTypeProvider.java new file mode 100644 index 000000000..c29b3a45c --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/bootstrap/ICriterionTypeProvider.java @@ -0,0 +1,18 @@ +package org.navalplanner.business.resources.bootstrap; + +import java.util.List; +import java.util.Map; + +import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.ICriterionType; + +/** + * Defines a class that can provide some known {@link ICriterionType} along with + * their associated Criterion
+ * @author Óscar González Fernández + */ +public interface ICriterionTypeProvider { + + public Map, List> getRequiredCriterions(); + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/bootstrap/PredefinedCriterionTypesProvider.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/bootstrap/PredefinedCriterionTypesProvider.java new file mode 100644 index 000000000..c3ec6d8f4 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/bootstrap/PredefinedCriterionTypesProvider.java @@ -0,0 +1,34 @@ +package org.navalplanner.business.resources.bootstrap; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.ICriterionType; +import org.navalplanner.business.resources.entities.PredefinedCriterionTypes; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +/** + * This class provides the CriterionTypes with their criterions that are known a + * priori
+ * @author Óscar González Fernández + */ +@Component +@Scope("singleton") +public class PredefinedCriterionTypesProvider implements ICriterionTypeProvider { + + public PredefinedCriterionTypesProvider() { + } + + @Override + public Map, List> getRequiredCriterions() { + Map, List> result = new HashMap, List>(); + for (PredefinedCriterionTypes type : PredefinedCriterionTypes.values()) { + result.put(type, type.getPredefined()); + } + return result; + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionDAO.java index 1f39a06a0..b572373f2 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionDAO.java @@ -7,6 +7,6 @@ import org.navalplanner.business.resources.entities.Criterion; * Description goes here.
* @author Óscar González Fernández */ -public interface ICriterionDAO extends IGenericDao { +public interface ICriterionDAO extends IGenericDao { } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/impl/CriterionDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/impl/CriterionDAO.java index 62ef28c17..557f02b57 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/impl/CriterionDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/impl/CriterionDAO.java @@ -1,14 +1,23 @@ package org.navalplanner.business.resources.daos.impl; +import org.hibernate.criterion.Restrictions; import org.navalplanner.business.common.daos.impl.GenericDaoHibernate; import org.navalplanner.business.resources.daos.ICriterionDAO; import org.navalplanner.business.resources.entities.Criterion; /** - * Description goes here.
+ * DAO implementation for Criterion.
* @author Óscar González Fernández */ -public class CriterionDAO extends GenericDaoHibernate +public class CriterionDAO extends GenericDaoHibernate implements ICriterionDAO { + @Override + public boolean exists(Criterion criterion) { + return getSession().createCriteria(Criterion.class).add( + Restrictions.eq("name", criterion.getName())).add( + Restrictions.eq("type", criterion.getType())) + .uniqueResult() != null; + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java index 55d3c2743..9a043c67b 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Criterion.java @@ -1,24 +1,41 @@ package org.navalplanner.business.resources.entities; +import java.io.Serializable; import java.util.Date; +import org.apache.commons.lang.Validate; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.hibernate.validator.NotEmpty; + /** * A criterion stored in the database
* @author Óscar González Fernández */ -public class Criterion implements ICriterion { - - private Long id; +public class Criterion implements ICriterion, Serializable { @SuppressWarnings("unused") private long version; + @NotEmpty + private String name; + + @NotEmpty private String type; - private boolean active; + private boolean active = true; - public Long getId() { - return id; + /** + * Constructor for hibernate. Do not use! + */ + public Criterion() { + } + + public Criterion(String name, String type) { + Validate.notNull(name); + Validate.notNull(type); + this.type = type; + this.name = name; } @Override @@ -31,4 +48,28 @@ public class Criterion implements ICriterion { .isEmpty(); } + public String getName() { + return name; + } + + public String getType() { + return type; + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(name) + .append(type).toHashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Criterion) { + Criterion other = (Criterion) obj; + return new EqualsBuilder().append(name, other.name).append(type, + other.type).isEquals(); + } + return false; + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionTypeBase.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionTypeBase.java index 4f56e8c2c..e0de3d86c 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionTypeBase.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionTypeBase.java @@ -4,7 +4,7 @@ package org.navalplanner.business.resources.entities; * Base implementation of {@link ICriterionType}
* @author Óscar González Fernández */ -public abstract class CriterionTypeBase implements ICriterionType { +public abstract class CriterionTypeBase implements ICriterionType { private final boolean allowHierarchy; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/ICriterionType.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/ICriterionType.java index 5e623817f..f06352422 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/ICriterionType.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/ICriterionType.java @@ -4,13 +4,13 @@ package org.navalplanner.business.resources.entities; * Parametrizes the behaviour of some criterions
* @author Óscar González Fernández */ -public interface ICriterionType { +public interface ICriterionType { public boolean allowMultipleActiveCriterionsPerResource(); public boolean allowHierarchy(); - public ICriterion createCriterion(); + public C createCriterion(String name); public boolean contains(ICriterion criterion); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/PredefinedCriterionTypes.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/PredefinedCriterionTypes.java new file mode 100644 index 000000000..ce0ecf524 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/PredefinedCriterionTypes.java @@ -0,0 +1,70 @@ + +package org.navalplanner.business.resources.entities; + +import java.util.List; + +/** + * This class defines some criterion types known a priori
+ * @author Óscar González Fernández + */ +public enum PredefinedCriterionTypes implements ICriterionType { + + WORK_RELATIONSHIP(false, false) { + @Override + public List getPredefined() { + return WorkingRelationship.getCriterions(); + } + }; + + private final boolean allowHierarchy; + + private final boolean allowMultipleActiveCriterionsPerResource; + + private PredefinedCriterionTypes(boolean allowHierarchy, + boolean allowMultipleActiveCriterionsPerResource) { + this.allowHierarchy = allowHierarchy; + this.allowMultipleActiveCriterionsPerResource = allowMultipleActiveCriterionsPerResource; + } + + @Override + public boolean allowHierarchy() { + return allowHierarchy; + } + + @Override + public boolean allowMultipleActiveCriterionsPerResource() { + return allowMultipleActiveCriterionsPerResource; + } + + @Override + public boolean contains(ICriterion criterion) { + if (criterion instanceof Criterion) { + Criterion c = (Criterion) criterion; + return this.getType().equals(c.getType()); + } else + return false; + } + + @Override + public Criterion createCriterion(String name) { + return new Criterion(name, getType()); + } + + public abstract List getPredefined(); + + private String getType() { + return name(); + } + + public static ICriterionType getType(String type) { + for (PredefinedCriterionTypes predefinedType : PredefinedCriterionTypes + .values()) { + if (predefinedType.name().equals(type)) + return predefinedType; + } + throw new RuntimeException("not found " + + PredefinedCriterionTypes.class.getName() + " type for " + + type); + } + +} \ No newline at end of file diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java index 9c6be64e0..0dcd68520 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java @@ -58,7 +58,7 @@ public abstract class Resource { } public Collection getSatisfactionsFor( - ICriterionType type) { + ICriterionType type) { Set allSatisfactions = getAllSatisfactions(); ArrayList result = new ArrayList(); for (CriterionSatisfaction criterionSatisfaction : allSatisfactions) { @@ -70,7 +70,7 @@ public abstract class Resource { } public Collection getActiveSatisfactionsFor( - ICriterionType criterionType) { + ICriterionType criterionType) { Collection satisfactionsFor = getSatisfactionsFor(criterionType); ArrayList result = new ArrayList(); for (CriterionSatisfaction criterionSatisfaction : satisfactionsFor) { @@ -82,7 +82,7 @@ public abstract class Resource { } public Collection getActiveSatisfactionsForIn( - ICriterionType criterionType, Date start, Date end) { + ICriterionType criterionType, Date start, Date end) { Validate.notNull(criterionType); Validate.isTrue(start.before(end)); Collection satisfactionsFor = getSatisfactionsFor(criterionType); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/WorkingRelationship.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/WorkingRelationship.java new file mode 100644 index 000000000..6e65d2f56 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/WorkingRelationship.java @@ -0,0 +1,30 @@ +package org.navalplanner.business.resources.entities; + +import java.util.ArrayList; +import java.util.List; + +public enum WorkingRelationship { + HIRED("hiredResourceWorkingRelationship"), FIRED( + "firedResourceWorkingRelationship"); + + public static List getCriterions() { + ArrayList result = new ArrayList(); + for (WorkingRelationship workingRelationship : values()) { + result.add(workingRelationship.criterion()); + } + return result; + } + + private final String criterionName; + + private WorkingRelationship(String name) { + this.criterionName = name; + } + + public Criterion criterion() { + return PredefinedCriterionTypes.WORK_RELATIONSHIP + .createCriterion(criterionName); + } + + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/CriterionService.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/CriterionService.java index a0079b4d7..0b33c5dfb 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/CriterionService.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/CriterionService.java @@ -17,16 +17,10 @@ import org.navalplanner.business.resources.entities.Resource; */ public interface CriterionService { - boolean exists(Long id); - - Criterion find(Long id) throws InstanceNotFoundException; - List list(); void remove(Criterion criterion) throws InstanceNotFoundException; - void remove(Long id) throws InstanceNotFoundException; - void save(Criterion entity); void add(CriterionSatisfaction criterionSatisfaction); @@ -37,9 +31,13 @@ public interface CriterionService { Date begin, Date end); Collection getSatisfactionsFor( - ICriterionType criterionType); + ICriterionType criterionType); Collection getSatisfactionsFor( - ICriterionType criterionType, Date begin, Date end); + ICriterionType criterionType, Date begin, Date end); + + void createIfNotExists(Criterion criterion); + + boolean exists(Criterion criterion); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionServiceImpl.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionServiceImpl.java index 23c7fc47a..cec2a72d6 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionServiceImpl.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionServiceImpl.java @@ -35,12 +35,12 @@ public class CriterionServiceImpl implements CriterionService { @Autowired private ResourceService resourceService; - public boolean exists(Long id) { - return criterionDAO.exists(id); + public boolean exists(Criterion criterion) { + return criterionDAO.exists(criterion); } - public Criterion find(Long id) throws InstanceNotFoundException { - return criterionDAO.find(id); + public Criterion find(Criterion criterion) throws InstanceNotFoundException { + return criterionDAO.find(criterion); } public List list() { @@ -48,11 +48,7 @@ public class CriterionServiceImpl implements CriterionService { } public void remove(Criterion criterion) throws InstanceNotFoundException { - criterionDAO.remove(criterion.getId()); - } - - public void remove(Long id) throws InstanceNotFoundException { - criterionDAO.remove(id); + criterionDAO.remove(criterion); } public void save(Criterion entity) { @@ -92,7 +88,7 @@ public class CriterionServiceImpl implements CriterionService { @Override public Collection getSatisfactionsFor( - ICriterionType criterionType) { + ICriterionType criterionType) { ArrayList result = new ArrayList(); for (Resource resource : resourceService.getResources()) { result.addAll(resource.getActiveSatisfactionsFor(criterionType)); @@ -102,7 +98,7 @@ public class CriterionServiceImpl implements CriterionService { @Override public Collection getSatisfactionsFor( - ICriterionType criterionType, Date start, Date end) { + ICriterionType criterionType, Date start, Date end) { ArrayList result = new ArrayList(); for (Resource resource : resourceService.getResources()) { result.addAll(resource.getActiveSatisfactionsForIn(criterionType, @@ -110,4 +106,10 @@ public class CriterionServiceImpl implements CriterionService { } return result; } + + @Override + public void createIfNotExists(Criterion criterion) { + if (!exists(criterion)) + save(criterion); + } } diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml index 36ad692de..9119e2262 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/Resources.hbm.xml @@ -22,14 +22,16 @@ + - - - + + + + - + @@ -37,7 +39,10 @@ - + + + + diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/bootstrap/CriterionsBootstrapTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/bootstrap/CriterionsBootstrapTest.java new file mode 100644 index 000000000..048742010 --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/bootstrap/CriterionsBootstrapTest.java @@ -0,0 +1,44 @@ +package org.navalplanner.business.test.resources.bootstrap; + +import static junit.framework.Assert.assertTrue; +import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; +import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.navalplanner.business.resources.bootstrap.CriterionsBootstrap; +import org.navalplanner.business.resources.entities.WorkingRelationship; +import org.navalplanner.business.resources.services.CriterionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, + BUSINESS_SPRING_CONFIG_TEST_FILE }) +@Transactional +public class CriterionsBootstrapTest { + + @Autowired + private CriterionsBootstrap criterionsBootstrap; + + @Autowired + private CriterionService criterionService; + + @Test + public void testBootstrap() throws Exception { + if (criterionService.exists(WorkingRelationship.FIRED.criterion())) { + criterionService.remove(WorkingRelationship.FIRED.criterion()); + } + if (criterionService.exists(WorkingRelationship.HIRED.criterion())) { + criterionService.remove(WorkingRelationship.HIRED.criterion()); + } + criterionsBootstrap.loadRequiredData(); + assertTrue(criterionService.exists(WorkingRelationship.FIRED + .criterion())); + assertTrue(criterionService.exists(WorkingRelationship.HIRED + .criterion())); + } + +} diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionDAOTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionDAOTest.java index ae7a3379a..afceb8289 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionDAOTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionDAOTest.java @@ -1,6 +1,7 @@ package org.navalplanner.business.test.resources.daos; import java.util.List; +import java.util.UUID; import org.junit.Test; import org.junit.runner.RunWith; @@ -16,6 +17,7 @@ import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; + import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE; @@ -42,26 +44,20 @@ public class CriterionDAOTest { public void testSaveCriterions() throws Exception { Criterion criterion = createValidCriterion(); criterionDAO.save(criterion); - assertNotNull(criterion.getId()); - assertTrue(criterionDAO.exists(criterion.getId())); + assertTrue(criterionDAO.exists(criterion)); } public static Criterion createValidCriterion() { - return new Criterion(); - } - - @Test(expected = InstanceNotFoundException.class) - public void testRemoveNotExistent() throws InstanceNotFoundException { - criterionDAO.remove(Long.MAX_VALUE); + return new Criterion(UUID.randomUUID().toString(), "pruebaType"); } @Test public void testRemove() throws InstanceNotFoundException { Criterion criterion = createValidCriterion(); criterionDAO.save(criterion); - assertTrue(criterionDAO.exists(criterion.getId())); - criterionDAO.remove(criterion.getId()); - assertFalse(criterionDAO.exists(criterion.getId())); + assertTrue(criterionDAO.exists(criterion)); + criterionDAO.remove(criterion); + assertFalse(criterionDAO.exists(criterion)); } @Test diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionSatisfactionDAOTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionSatisfactionDAOTest.java index e6cd638f7..cdd4ebac8 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionSatisfactionDAOTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionSatisfactionDAOTest.java @@ -22,6 +22,7 @@ import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; + import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE; @@ -84,7 +85,7 @@ public class CriterionSatisfactionDAOTest { satisfactionDAO.save(satisfaction); assertTrue(satisfactionDAO.exists(satisfaction.getId())); satisfactionDAO.remove(satisfaction.getId()); - assertFalse(criterionDAO.exists(satisfaction.getId())); + assertFalse(satisfactionDAO.exists(satisfaction.getId())); } @Test diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/CriterionTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/CriterionTest.java index a9afd9f30..9776ccacd 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/CriterionTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/CriterionTest.java @@ -1,21 +1,24 @@ package org.navalplanner.business.test.resources.entities; +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; +import static org.navalplanner.business.resources.entities.CriterionCompounder.atom; +import static org.navalplanner.business.resources.entities.CriterionCompounder.build; +import static org.navalplanner.business.resources.entities.CriterionCompounder.not; + import java.util.Arrays; import java.util.Date; import java.util.HashSet; import org.junit.Test; +import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionCompounder; import org.navalplanner.business.resources.entities.ICriterion; +import org.navalplanner.business.resources.entities.PredefinedCriterionTypes; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Worker; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; -import static org.navalplanner.business.resources.entities.CriterionCompounder.atom; -import static org.navalplanner.business.resources.entities.CriterionCompounder.build; -import static org.navalplanner.business.resources.entities.CriterionCompounder.not; - /** * Tests for criterion.
* Created at May 12, 2009 @@ -23,6 +26,23 @@ import static org.navalplanner.business.resources.entities.CriterionCompounder.n */ public class CriterionTest { + @Test + public void testCreateWithAType() throws Exception { + Criterion firedCriterion = PredefinedCriterionTypes.WORK_RELATIONSHIP + .createCriterion("fired"); + assertTrue(PredefinedCriterionTypes.WORK_RELATIONSHIP + .contains(firedCriterion)); + } + + + @Test + public void testCriterionNameAndTypeIsInmutableBusinessKey() + throws Exception { + Criterion criterion = new Criterion("name", "type"); + Criterion other = new Criterion("name", "type"); + assertEquals(criterion.hashCode(), other.hashCode()); + } + @Test public void testCompounding() throws Exception { Worker worker1 = new Worker(); diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/ResourceTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/ResourceTest.java index ab5825117..bfba8d3a4 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/ResourceTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/entities/ResourceTest.java @@ -83,7 +83,7 @@ public class ResourceTest { otherCriterion, worker); new CriterionSatisfaction(CriterionSatisfactionDAOTest.year(4000), criterion, worker); - ICriterionType criterionType = createTypeThatMatches(criterion); + ICriterionType criterionType = createTypeThatMatches(criterion); assertEquals(2, worker.getSatisfactionsFor(criterionType).size()); assertEquals(1, worker.getActiveSatisfactionsFor(criterionType).size()); } @@ -100,7 +100,7 @@ public class ResourceTest { } @Override - public ICriterion createCriterion() { + public Criterion createCriterion(String name) { return null; } }; @@ -119,7 +119,7 @@ public class ResourceTest { new CriterionSatisfaction(CriterionSatisfactionDAOTest.year(2000), otherCriterion, worker); - ICriterionType criterionType = createTypeThatMatches(criterion); + ICriterionType criterionType = createTypeThatMatches(criterion); assertEquals(2, worker.getSatisfactionsFor(criterionType).size()); assertEquals(1, worker.getActiveSatisfactionsForIn(criterionType, diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/CriterionServiceTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/CriterionServiceTest.java index c952bf762..e33b22932 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/CriterionServiceTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/CriterionServiceTest.java @@ -1,11 +1,20 @@ package org.navalplanner.business.test.resources.services; +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertTrue; +import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; +import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE; + +import java.util.UUID; + import org.hibernate.SessionFactory; +import org.hibernate.validator.InvalidStateException; import org.junit.Test; import org.junit.runner.RunWith; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.ICriterionType; +import org.navalplanner.business.resources.entities.PredefinedCriterionTypes; import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.business.resources.services.CriterionService; import org.navalplanner.business.resources.services.ResourceService; @@ -18,10 +27,6 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; -import static junit.framework.Assert.assertEquals; -import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; -import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE; - /** * Test cases for {@link CriterionService}
* @author Óscar González Fernández @@ -41,6 +46,54 @@ public class CriterionServiceTest { @Autowired private SessionFactory sessionFactory; + @Test(expected = InvalidStateException.class) + public void testCantSaveCriterionWithoutNameAndType() throws Exception { + Criterion criterion = new Criterion("", ""); + criterionService.save(criterion); + sessionFactory.getCurrentSession().flush(); + } + + @Test + public void testAddCriterion() throws Exception { + String unique = UUID.randomUUID().toString(); + Criterion criterion = PredefinedCriterionTypes.WORK_RELATIONSHIP + .createCriterion(unique); + criterionService.save(criterion); + } + + @Test(expected = Exception.class) + public void testUniqueNameForCriterion() { + String unique = UUID.randomUUID().toString(); + Criterion criterion = PredefinedCriterionTypes.WORK_RELATIONSHIP + .createCriterion(unique); + criterionService.save(criterion); + criterionService.save(PredefinedCriterionTypes.WORK_RELATIONSHIP + .createCriterion(unique)); + } + + @Test + public void testCreateIfNotExists() { + String unique = UUID.randomUUID().toString(); + Criterion criterion = PredefinedCriterionTypes.WORK_RELATIONSHIP + .createCriterion(unique); + criterionService.createIfNotExists(criterion); + assertTrue(criterionService.exists(criterion)); + criterionService.createIfNotExists(PredefinedCriterionTypes.WORK_RELATIONSHIP + .createCriterion(unique)); + } + + @Test + public void testPersistingDoesNotChangeEquality() throws Exception { + String unique = UUID.randomUUID().toString(); + Criterion criterion = PredefinedCriterionTypes.WORK_RELATIONSHIP + .createCriterion(unique); + Criterion other = PredefinedCriterionTypes.WORK_RELATIONSHIP + .createCriterion(unique); + assertEquals(criterion, other); + criterionService.save(criterion); + assertEquals(criterion, other); + } + @Test public void testCreateCriterionSatisfactionButNotSave() { Criterion criterion = CriterionDAOTest.createValidCriterion(); @@ -54,7 +107,7 @@ public class CriterionServiceTest { /* * It sends a dataIntegrityViolationException when adding a - * criterionSatisfaction with a resource that doesn't exist yet + * criterionSatisfaction with a criterion that doesn't exist yet */ @Test(expected = DataIntegrityViolationException.class) public void testCreateCriterionSatisfactionOnTransientCriterion() @@ -83,7 +136,7 @@ public class CriterionServiceTest { Criterion criterion = CriterionDAOTest.createValidCriterion(); criterionService.save(criterion); Worker worker = new Worker("firstName", "surName", "2333232", 10); - CriterionSatisfaction criterionSatisfaction = new CriterionSatisfaction( + new CriterionSatisfaction( CriterionSatisfactionDAOTest.year(2000), criterion, worker); resourceService.saveResource(worker); assertEquals(1, criterionService.getResourcesSatisfying(criterion) @@ -154,7 +207,7 @@ public class CriterionServiceTest { criterionService.add(new CriterionSatisfaction( CriterionSatisfactionDAOTest.year(1998), criterion, worker)); - ICriterionType criterionType = ResourceTest + ICriterionType criterionType = ResourceTest .createTypeThatMatches(criterion); assertEquals(2, criterionService.getSatisfactionsFor(criterionType, diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/ResourceServiceTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/ResourceServiceTest.java index 7b781b9d5..b8af91a52 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/ResourceServiceTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/ResourceServiceTest.java @@ -1,6 +1,5 @@ package org.navalplanner.business.test.resources.services; -import org.hibernate.SessionFactory; import org.hibernate.validator.ClassValidator; import org.hibernate.validator.InvalidStateException; import org.hibernate.validator.InvalidValue; @@ -43,9 +42,6 @@ public class ResourceServiceTest { @Autowired private IResourceDao resourceDao; - @Autowired - private SessionFactory sessionFactory; - @Test public void testRemoveResource() throws InstanceNotFoundException {