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 {