From 6a7a8066b838df7cd905bde161625b77fa655d70 Mon Sep 17 00:00:00 2001 From: Diego Pino Garcia Date: Mon, 6 Jul 2009 20:01:01 +0200 Subject: [PATCH] ItEr16S10ClasificacionTraballoItEr15S13: Adds CriterionType entity --- .../bootstrap/CriterionsBootstrap.java | 49 ++++- .../bootstrap/ICriterionTypeProvider.java | 5 +- .../PredefinedCriterionTypesProvider.java | 11 +- .../resources/daos/ICriterionTypeDAO.java | 26 +++ .../resources/daos/impl/CriterionDAO.java | 16 +- .../resources/daos/impl/CriterionTypeDAO.java | 67 +++++++ .../resources/entities/Criterion.java | 36 ++-- .../resources/entities/CriterionType.java | 177 ++++++++++++++++++ .../resources/entities/LeaveCriterions.java | 30 +-- .../entities/PredefinedCriterionTypes.java | 99 ++++------ .../business/resources/entities/Resource.java | 2 +- .../resources/entities/ResourceEnum.java | 36 ++++ .../entities/WorkingRelationship.java | 31 +-- .../services/CriterionTypeService.java | 27 +++ .../services/impl/CriterionServiceImpl.java | 24 +++ .../impl/CriterionTypeServiceImpl.java | 78 ++++++++ .../resources/entities/Resources.hbm.xml | 32 +++- .../orders/services/OrderServiceTest.java | 7 +- .../test/resources/daos/CriterionDAOTest.java | 38 +++- .../daos/CriterionSatisfactionDAOTest.java | 20 ++ .../resources/daos/CriterionTypeDAOTest.java | 83 ++++++++ .../resources/entities/CriterionTest.java | 4 - .../services/CriterionServiceTest.java | 12 +- .../services/CriterionTypeServiceTest.java | 62 ++++++ .../web/orders/OrderElementController.java | 5 +- 25 files changed, 835 insertions(+), 142 deletions(-) create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionTypeDAO.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/impl/CriterionTypeDAO.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionType.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/ResourceEnum.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/resources/services/CriterionTypeService.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionTypeServiceImpl.java create mode 100644 navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionTypeDAOTest.java create mode 100644 navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/CriterionTypeServiceTest.java 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 7d302863b..b1124785f 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 @@ -5,11 +5,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; - +import java.util.Set; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.business.resources.entities.ICriterionType; import org.navalplanner.business.resources.services.CriterionService; +import org.navalplanner.business.resources.services.CriterionTypeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -19,14 +23,20 @@ import org.springframework.transaction.annotation.Transactional; * Loads all {@link ICriterionTypeProvider} and if there is any criterion that * doesn't exist, creates them.
* @author Óscar González Fernández + * @author Diego Pino García */ @Component @Scope("singleton") public class CriterionsBootstrap implements ICriterionsBootstrap { + private static final Log LOG = LogFactory.getLog(CriterionsBootstrap.class); + @Autowired private CriterionService criterionService; + @Autowired + private CriterionTypeService criterionTypeService; + @Autowired private List providers; @@ -44,12 +54,33 @@ public class CriterionsBootstrap implements ICriterionsBootstrap { @Override @Transactional public void loadRequiredData() { - Map, List> typesWithCriterions = getTypesWithCriterions(); - for (Entry, List> entry : typesWithCriterions - .entrySet()) { - for (Criterion criterion : entry.getValue()) { + LOG.debug("### loadRequiredData()"); + + Map> typesWithCriterions = getTypesWithCriterions(); + + // Insert predefined criterions + for (Entry> entry : + typesWithCriterions.entrySet()) { + // Create PredefinedCriterionType + CriterionType criterionType = entry.getKey(); + try { + criterionTypeService.createIfNotExists(criterionType); + } catch (ValidationException e) { + + } + // Retrieve existing criterionType if not exists + if (criterionType.getId() == null) { + criterionType = criterionTypeService.findUniqueByName(criterionType.getName()); + } + + // Create predefined criterions for criterionType + for (String criterionName : entry.getValue()) { try { + Criterion criterion = new Criterion(criterionName, criterionType); criterionService.createIfNotExists(criterion); + + LOG.debug("### Create criterion: (" + criterionName + + "; " + criterionType.getName()); } catch (ValidationException e) { e.printStackTrace(); } @@ -57,13 +88,13 @@ public class CriterionsBootstrap implements ICriterionsBootstrap { } } - private Map, List> getTypesWithCriterions() { - HashMap, List> result = new HashMap, List>(); + private Map> getTypesWithCriterions() { + HashMap> result = new HashMap>(); for (ICriterionTypeProvider provider : providers) { - for (Entry, List> entry : provider + for (Entry> entry : provider .getRequiredCriterions().entrySet()) { if (!result.containsKey(entry.getKey())) { - result.put(entry.getKey(), new ArrayList()); + result.put(entry.getKey(), new ArrayList()); } result.get(entry.getKey()).addAll(entry.getValue()); } 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 index c29b3a45c..99de34a22 100644 --- 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 @@ -3,16 +3,17 @@ 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.CriterionType; 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 + * @author Diego Pino García */ public interface ICriterionTypeProvider { - public Map, List> getRequiredCriterions(); + public Map> 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 index c3ec6d8f4..1a7f4ee7a 100644 --- 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 @@ -4,8 +4,7 @@ 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.CriterionType; import org.navalplanner.business.resources.entities.PredefinedCriterionTypes; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -14,6 +13,7 @@ import org.springframework.stereotype.Component; * This class provides the CriterionTypes with their criterions that are known a * priori
* @author Óscar González Fernández + * @author Diego Pino García */ @Component @Scope("singleton") @@ -23,12 +23,11 @@ public class PredefinedCriterionTypesProvider implements ICriterionTypeProvider } @Override - public Map, List> getRequiredCriterions() { - Map, List> result = new HashMap, List>(); + public Map> getRequiredCriterions() { + Map> result = new HashMap>(); for (PredefinedCriterionTypes type : PredefinedCriterionTypes.values()) { - result.put(type, type.getPredefined()); + result.put(CriterionType.asCriterionType(type), type.getPredefined()); } return result; } - } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionTypeDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionTypeDAO.java new file mode 100644 index 000000000..eeb28e535 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionTypeDAO.java @@ -0,0 +1,26 @@ +package org.navalplanner.business.resources.daos; + +import java.util.List; +import org.navalplanner.business.common.daos.IGenericDao; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.resources.daos.impl.CriterionTypeDAO; +import org.navalplanner.business.resources.entities.CriterionType; + +/** + * DAO for {@link CriterionTypeDAO}
+ * @author Diego Pino Garcia + */ +public interface ICriterionTypeDAO extends IGenericDao { + + CriterionType findUniqueByName(String name) + throws InstanceNotFoundException; + + CriterionType findUniqueByName(CriterionType criterionType) + throws InstanceNotFoundException; + + List findByName(CriterionType criterionType); + + public boolean existsByName(CriterionType criterionType); + + public void removeByName(CriterionType criterionType); +} 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 de9795ffd..dd7958689 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,9 +1,12 @@ package org.navalplanner.business.resources.daos.impl; +import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Criteria; +import org.hibernate.Hibernate; +import org.hibernate.criterion.Property; import org.hibernate.criterion.Restrictions; import org.navalplanner.business.common.daos.impl.GenericDaoHibernate; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; @@ -29,14 +32,14 @@ public class CriterionDAO extends GenericDaoHibernate @Override public List findByNameAndType(Criterion criterion) { + if (criterion.getType() == null) return new ArrayList(); + Criteria c = getSession().createCriteria(Criterion.class); + c.add(Restrictions.eq("name", criterion.getName()).ignoreCase()) + .createCriteria("type") + .add(Restrictions.eq("name", criterion.getType().getName()).ignoreCase()); - c.add(Restrictions.eq("name", criterion.getName()).ignoreCase()); - c.add(Restrictions.eq("type", criterion.getType()).ignoreCase()); - - List result = (List) c.list(); - - return result; + return (List) c.list(); } public Criterion findUniqueByNameAndType(Criterion criterion) throws InstanceNotFoundException { @@ -75,5 +78,4 @@ public class CriterionDAO extends GenericDaoHibernate throw new RuntimeException(ex); } } - } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/impl/CriterionTypeDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/impl/CriterionTypeDAO.java new file mode 100644 index 000000000..4eac66129 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/impl/CriterionTypeDAO.java @@ -0,0 +1,67 @@ +package org.navalplanner.business.resources.daos.impl; + +import java.util.List; +import org.apache.commons.lang.Validate; +import org.hibernate.Criteria; +import org.hibernate.criterion.Restrictions; +import org.navalplanner.business.common.daos.impl.GenericDaoHibernate; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.resources.daos.ICriterionTypeDAO; +import org.navalplanner.business.resources.entities.CriterionType; +import org.springframework.stereotype.Component; + +/** + * DAO implementation for Criterion.
+ * @author Diego Pino Garcia + */ + +@Component +public class CriterionTypeDAO extends GenericDaoHibernate + implements ICriterionTypeDAO { + + @Override + public List findByName(CriterionType criterionType) { + Criteria c = getSession().createCriteria(CriterionType.class); + + c.add(Restrictions.eq("name", criterionType.getName()).ignoreCase()); + + return (List) c.list(); + } + + @Override + public CriterionType findUniqueByName(CriterionType criterionType) + throws InstanceNotFoundException { + Validate.notNull(criterionType); + + return findUniqueByName(criterionType.getName()); + } + + @Override + public CriterionType findUniqueByName(String name) + throws InstanceNotFoundException { + Criteria c = getSession().createCriteria(CriterionType.class); + + c.add(Restrictions.eq("name", name)); + + return (CriterionType) c.uniqueResult(); + } + + @Override + public boolean existsByName(CriterionType criterionType) { + try { + return findUniqueByName(criterionType) != null; + } catch (InstanceNotFoundException e) { + return false; + } + } + + @Override + public void removeByName(CriterionType criterionType) { + try { + CriterionType reloaded = findUniqueByName(criterionType); + remove(reloaded.getId()); + } catch (InstanceNotFoundException ex) { + throw new RuntimeException(ex); + } + } +} 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 f7a77e1b7..829cc8d54 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 @@ -6,6 +6,9 @@ import org.apache.commons.lang.Validate; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.ToStringBuilder; import org.hibernate.validator.NotEmpty; +import org.hibernate.validator.NotNull; +import org.navalplanner.business.resources.services.CriterionTypeService; +import org.springframework.beans.factory.annotation.Autowired; /** * A criterion stored in the database
@@ -21,19 +24,16 @@ public class Criterion implements ICriterion { @NotEmpty private String name; - @NotEmpty - private String type; + @NotNull + private CriterionType type; private boolean active = true; - public static Criterion ofType(String type) { - Validate.notEmpty(type); - Criterion result = new Criterion(); - result.type = type; - return result; + public static Criterion ofType(CriterionType type) { + return new Criterion(type); } - public static Criterion withNameAndType(String name, String type) { + public static Criterion withNameAndType(String name, CriterionType type) { return new Criterion(name, type); } @@ -43,11 +43,18 @@ public class Criterion implements ICriterion { public Criterion() { } - private Criterion(String name, String type) { - Validate.notEmpty(name); - Validate.notEmpty(type); + public Criterion(CriterionType type) { + Validate.notNull(type); + this.type = type; + } + + public Criterion(String name, CriterionType type) { + Validate.notEmpty(name); + Validate.notNull(type); + this.name = name; + this.type = type; } public Long getId() { @@ -59,6 +66,7 @@ public class Criterion implements ICriterion { return !resource.getCurrentSatisfactionsFor(this).isEmpty(); } + @Override public boolean isSatisfiedBy(Resource resource, Date start, Date end) { return !resource.query().from(this).enforcedInAll( Interval.range(start, end)).result().isEmpty(); @@ -72,10 +80,14 @@ public class Criterion implements ICriterion { this.name = name; } - public String getType() { + public CriterionType getType() { return type; } + public void setType(CriterionType type) { + this.type = type; + } + public boolean isActive() { return active; } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionType.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionType.java new file mode 100644 index 000000000..89fb70aaf --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionType.java @@ -0,0 +1,177 @@ +package org.navalplanner.business.resources.entities; + +import org.apache.commons.lang.builder.EqualsBuilder; +import org.hibernate.validator.NotEmpty; +import org.navalplanner.business.resources.entities.ResourceEnum; +import org.navalplanner.business.resources.services.CriterionTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +/** + * Base implementation of {@link ICriterionType}
+ * @author Diego Pino García + */ +@Component + public class CriterionType implements ICriterionType { + + private Long id; + + @SuppressWarnings("unused") + private long version; + + @Autowired + CriterionTypeService criterionTypeService; + + @NotEmpty + private String name; + + private boolean allowHierarchy = true; + + private boolean allowSimultaneousCriterionsPerResource = true; + + private boolean allowAdding = true; + + private boolean allowEditing = true; + + private ResourceEnum resource = ResourceEnum.getDefault(); + + public CriterionType() { + + } + + public CriterionType(String name) { + this.name = name; + } + + public CriterionType( + String name, + boolean allowHierarchy, + boolean allowSimultaneousCriterionsPerResource, + boolean allowAdding, + boolean allowEditing, + ResourceEnum resource) { + + this.allowHierarchy = allowHierarchy; + this.allowSimultaneousCriterionsPerResource = allowSimultaneousCriterionsPerResource; + this.name = name; + this.allowAdding = allowAdding; + this.allowEditing = allowEditing; + this.resource = resource; + } + + public static CriterionType asCriterionType(ICriterionType criterionType) { + return new CriterionType( + criterionType.getName(), + criterionType.allowHierarchy(), + criterionType.allowSimultaneousCriterionsPerResource(), + criterionType.allowAdding(), + criterionType.allowEditing(), + CriterionType.getResource(criterionType)); + } + + private static ResourceEnum getResource(ICriterionType criterionType) { + for (ResourceEnum resource : ResourceEnum.values()) { + if (criterionType.criterionCanBeRelatedTo(resource.asClass())) { + return resource; + } + } + + return ResourceEnum.getDefault(); + } + + public Long getId() { + return id; + } + + @Override + public String getName() { + return name; + } + + @Override + public boolean allowHierarchy() { + return allowHierarchy; + } + + @Override + public boolean allowSimultaneousCriterionsPerResource() { + return allowSimultaneousCriterionsPerResource; + } + + @Override + public boolean allowAdding() { + return allowAdding; + } + + @Override + public boolean allowEditing() { + return allowEditing; + } + + public ResourceEnum resource() { + return resource; + } + + @Override + public Criterion createCriterion(String name) { + return Criterion.withNameAndType(name, this); + } + + public static Criterion createCriterion( + PredefinedCriterionTypes predefinedCriterionType, + String name) { + + CriterionType criterionType = CriterionType. + asCriterionType(predefinedCriterionType); + + return Criterion.withNameAndType(name, criterionType); + } + + @Override + public Criterion createCriterionWithoutNameYet() { + return Criterion.ofType(this); + } + + @Override + public boolean contains(ICriterion criterion) { + if (criterion instanceof Criterion) { + Criterion c = (Criterion) criterion; + return this.equals(c.getType()); + } else { + return false; + } + } + + @Override + public boolean criterionCanBeRelatedTo(Class klass) { + for (ResourceEnum resource : ResourceEnum.values()) { + if (resource.isAssignableFrom(klass)) { + return true; + } + } + return false; + } + + /** + * Two criterion types are equals if they both got the same name + * + * @param o + * @return + */ + @Override + public boolean equals(Object o) { + if (o instanceof CriterionType == false) + return false; + + if (this == o) + return true; + + CriterionType criterionType = (CriterionType) o; + + return new EqualsBuilder() + .append(criterionType.getName(), this.getName()) + .isEquals(); + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/LeaveCriterions.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/LeaveCriterions.java index 08c14d366..f6fe2f34b 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/LeaveCriterions.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/LeaveCriterions.java @@ -3,27 +3,31 @@ package org.navalplanner.business.resources.entities; import java.util.ArrayList; import java.util.List; +/** + * Predefined leave criterions
+ * @author Lorenzo Tilve + * @author Diego Pino García + */ public enum LeaveCriterions { - MEDICAL_LEAVE("medicalLeaveWorkingRelationship"), PATERNITY_LEAVE( - "paternityLeaveWorkingRelationship"); + MEDICAL_LEAVE("medicalLeave"), + PATERNITY_LEAVE("paternityLeave"); - public static List getCriterions() { - ArrayList result = new ArrayList(); - for (LeaveCriterions leaveCriterions : values()) { - result.add(leaveCriterions.criterion()); + public static List getCriterionNames() { + ArrayList result = new ArrayList(); + for (LeaveCriterions leaveCriterions: values()) { + result.add(leaveCriterions.criterionName); } return result; } private final String criterionName; + public Criterion criterion() { + return new Criterion(criterionName, + CriterionType.asCriterionType(PredefinedCriterionTypes.LEAVE)); + } + private LeaveCriterions(String name) { this.criterionName = name; } - - public Criterion criterion() { - return PredefinedCriterionTypes.LEAVE - .createCriterion(criterionName); - } - -} \ No newline at end of file +} 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 index c5fc037f7..01fdc0e44 100644 --- 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 @@ -6,25 +6,26 @@ import java.util.List; /** * This class defines some criterion types known a priori
* @author Óscar González Fernández + * @author Diego Pino García */ public enum PredefinedCriterionTypes implements ICriterionType { - WORK_RELATIONSHIP(false, false, false, false, Worker.class) { + WORK_RELATIONSHIP(false, false, false, false, ResourceEnum.WORKER) { @Override - public List getPredefined() { - return WorkingRelationship.getCriterions(); + public List getPredefined() { + return WorkingRelationship.getCriterionNames(); } }, - LOCATION_GROUP(false, true, true, true, Resource.class) { + LOCATION_GROUP(false, true, true, true, ResourceEnum.RESOURCE) { @Override - public List getPredefined() { + public List getPredefined() { return Arrays.asList(); } }, - LEAVE(false, false, false, false, Worker.class) { + LEAVE(false, false, false, false, ResourceEnum.WORKER) { @Override - public List getPredefined() { - return LeaveCriterions.getCriterions(); + public List getPredefined() { + return LeaveCriterions.getCriterionNames(); } }; @@ -36,26 +37,22 @@ public enum PredefinedCriterionTypes implements ICriterionType { private final boolean allowEditing; - private List> classes; + private final ResourceEnum resource; private PredefinedCriterionTypes(boolean allowHierarchy, boolean allowSimultaneousCriterionsPerResource, boolean allowAdding, boolean allowEditing, - Class... klasses) { + ResourceEnum resource) { this.allowHierarchy = allowHierarchy; this.allowSimultaneousCriterionsPerResource = allowSimultaneousCriterionsPerResource; this.allowAdding = allowAdding; this.allowEditing = allowEditing; - this.classes = Arrays.asList(klasses); + this.resource = resource; } @Override - public boolean criterionCanBeRelatedTo(Class klass) { - for (Class c : classes) { - if (c.isAssignableFrom(klass)) - return true; - } - return false; + public String getName() { + return name(); } @Override @@ -68,46 +65,6 @@ public enum PredefinedCriterionTypes implements ICriterionType { return allowSimultaneousCriterionsPerResource; } - @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 Criterion.withNameAndType(name, getType()); - } - - @Override - public Criterion createCriterionWithoutNameYet() { - return Criterion.ofType(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); - } - - public String getName() { - return name(); - } - @Override public boolean allowAdding() { return allowAdding; @@ -118,4 +75,30 @@ public enum PredefinedCriterionTypes implements ICriterionType { return allowEditing; } -} \ No newline at end of file + @Override + public Criterion createCriterion(String name) { + return new Criterion(name, CriterionType.asCriterionType(this)); + } + + @Override + public Criterion createCriterionWithoutNameYet() { + return createCriterion(""); + } + + @Override + public boolean contains(ICriterion criterion) { + if (criterion instanceof Criterion) { + Criterion c = (Criterion) criterion; + return CriterionType.asCriterionType(this).equals(c.getType()); + } + + return false; + } + + @Override + public boolean criterionCanBeRelatedTo(Class klass) { + return resource.isAssignableFrom(klass); + } + + public abstract List getPredefined(); +} 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 6b0c1e13d..e07fc9ad9 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 @@ -176,7 +176,7 @@ public abstract class Resource { public void forceLoadSatisfactions() { for (CriterionSatisfaction criterionSatisfaction : criterionSatisfactions) { criterionSatisfaction.getCriterion().getName(); - criterionSatisfaction.getCriterion().getType(); + criterionSatisfaction.getCriterion().getType().getName(); } } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/ResourceEnum.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/ResourceEnum.java new file mode 100644 index 000000000..b2d5278a4 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/ResourceEnum.java @@ -0,0 +1,36 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.navalplanner.business.resources.entities; + +import java.util.List; + +/** + * + * @author Diego Pino Garcia + */ +public enum ResourceEnum { + + RESOURCE(Resource.class), + WORKER(Worker.class); + + Class clase; + + private ResourceEnum(Class clase) { + this.clase = clase; + } + + public Class asClass() { + return clase; + } + + public static ResourceEnum getDefault() { + return RESOURCE; + } + + public boolean isAssignableFrom(Class clase) { + return asClass().equals(clase); + } +} 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 index 6e65d2f56..d614d8674 100644 --- 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 @@ -3,28 +3,35 @@ package org.navalplanner.business.resources.entities; import java.util.ArrayList; import java.util.List; +/** + * Predefined working relationships
+ * @author Óscar González Fernández + * @author Diego Pino García + */ public enum WorkingRelationship { - HIRED("hiredResourceWorkingRelationship"), FIRED( - "firedResourceWorkingRelationship"); + HIRED("hiredResourceWorkingRelationship"), + FIRED("firedResourceWorkingRelationship"); - public static List getCriterions() { - ArrayList result = new ArrayList(); + public static List getCriterionNames() { + ArrayList result = new ArrayList(); for (WorkingRelationship workingRelationship : values()) { - result.add(workingRelationship.criterion()); + result.add(workingRelationship.criterionName); } return result; } private final String criterionName; + public Criterion criterion() { + return new Criterion(criterionName, + CriterionType.asCriterionType(PredefinedCriterionTypes.WORK_RELATIONSHIP)); + } + + public String getCriterionName() { + return 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/CriterionTypeService.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/CriterionTypeService.java new file mode 100644 index 000000000..99f250a96 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/CriterionTypeService.java @@ -0,0 +1,27 @@ +package org.navalplanner.business.resources.services; + + +import java.util.List; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.business.resources.entities.CriterionType; + +/** + * Services for {@link CriterionType}
+ * @author Diego Pino García + */ +public interface CriterionTypeService { + + void createIfNotExists(CriterionType criterionType) throws ValidationException; + + boolean exists(CriterionType criterionType); + + CriterionType findUniqueByName(CriterionType criterionType); + + CriterionType findUniqueByName(String name); + + void remove(CriterionType criterionType) throws InstanceNotFoundException; + + void save(CriterionType entity) throws ValidationException; + +} 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 ae0d88362..6e7958955 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 @@ -14,12 +14,14 @@ import org.navalplanner.business.resources.daos.ICriterionDAO; import org.navalplanner.business.resources.daos.impl.CriterionDAO; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionSatisfaction; +import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.business.resources.entities.ICriterion; import org.navalplanner.business.resources.entities.ICriterionOnData; import org.navalplanner.business.resources.entities.ICriterionType; import org.navalplanner.business.resources.entities.Interval; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.services.CriterionService; +import org.navalplanner.business.resources.services.CriterionTypeService; import org.navalplanner.business.resources.services.ResourceService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; @@ -32,6 +34,7 @@ import org.springframework.transaction.annotation.Transactional; * Implementation of {@link CriterionService} using {@link CriterionDAO}
* @author Óscar González Fernández * @author Fernando Bellas Permuy + * @author Diego Pino García */ @Service @Scope(BeanDefinition.SCOPE_SINGLETON) @@ -44,6 +47,9 @@ public class CriterionServiceImpl implements CriterionService { @Autowired private ResourceService resourceService; + @Autowired + private CriterionTypeService criterionTypeService; + public boolean exists(Criterion criterion) { return criterionDAO.exists(criterion.getId()) || criterionDAO.existsByNameAndType(criterion); @@ -66,7 +72,15 @@ public class CriterionServiceImpl implements CriterionService { } @Transactional(rollbackFor=ValidationException.class) + @Override public void save(Criterion entity) throws ValidationException { + + // Save criterion.type if it's new + CriterionType criterionType = entity.getType(); + if (criterionType.getId() == null) { + entity.setType(saveCriterionType(criterionType)); + } + criterionDAO.save(entity); if (criterionDAO.findByNameAndType(entity).size() > 1) { @@ -80,6 +94,16 @@ public class CriterionServiceImpl implements CriterionService { } } + private CriterionType saveCriterionType(CriterionType criterionType) throws ValidationException { + if (criterionTypeService.exists(criterionType)) { + criterionType = criterionTypeService.findUniqueByName(criterionType.getName()); + } else { + criterionTypeService.save(criterionType); + } + + return criterionType; + } + @Override public Collection getResourcesSatisfying(ICriterion criterion) { List resources = resourceService.getResources(); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionTypeServiceImpl.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionTypeServiceImpl.java new file mode 100644 index 000000000..ca191e655 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionTypeServiceImpl.java @@ -0,0 +1,78 @@ +package org.navalplanner.business.resources.services.impl; + + +import org.hibernate.validator.InvalidValue; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.business.resources.daos.ICriterionTypeDAO; +import org.navalplanner.business.resources.daos.impl.CriterionTypeDAO; +import org.navalplanner.business.resources.entities.CriterionType; +import org.navalplanner.business.resources.services.CriterionTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +/** + * Implementation of {@link CriterionTypeService} using {@link CriterionTypeDAO}
+ * @author Diego Pino García + */ +@Transactional +@Component +public class CriterionTypeServiceImpl implements CriterionTypeService { + + @Autowired + private ICriterionTypeDAO criterionTypeDAO; + + @Override + public void createIfNotExists(CriterionType criterionType) throws ValidationException { + if (!exists(criterionType)) + save(criterionType); + } + + @Override + public boolean exists(CriterionType criterionType) { + return criterionTypeDAO.exists(criterionType.getId()) + || criterionTypeDAO.existsByName(criterionType); + } + + @Override + public CriterionType findUniqueByName(CriterionType criterionType) { + return findUniqueByName(criterionType.getName()); + } + + @Override + public CriterionType findUniqueByName(String name) { + try { + return criterionTypeDAO.findUniqueByName(name); + } catch (InstanceNotFoundException e) { + return null; + } + } + + @Override + public void remove(CriterionType criterionType) throws InstanceNotFoundException { + if (criterionType.getId() != null ) { + criterionTypeDAO.remove(criterionType.getId()); + } else { + criterionTypeDAO.removeByName(criterionType); + } + } + + @Transactional(rollbackFor=ValidationException.class) + @Override + public void save(CriterionType entity) throws ValidationException { + criterionTypeDAO.save(entity); + + if (criterionTypeDAO.findByName(entity).size() > 1) { + + InvalidValue[] invalidValues = { + new InvalidValue(entity.getName() + " already exists", + CriterionType.class, "name", entity.getName(), entity) + }; + + throw new ValidationException(invalidValues, + "Couldn't save new criterionType"); + } + } + +} 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 cf1db0824..31b6fd397 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 @@ -1,6 +1,6 @@ - + @@ -10,7 +10,7 @@ Hibernate infers type="integer". --> - + @@ -23,17 +23,18 @@ + - - + - + + @@ -41,7 +42,26 @@ - + + + + + + + + + + + + + + + + org.navalplanner.business.resources.entities.ResourceEnum + + + + diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/services/OrderServiceTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/services/OrderServiceTest.java index 3592617a7..35a8182e7 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/services/OrderServiceTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/services/OrderServiceTest.java @@ -26,6 +26,7 @@ import org.navalplanner.business.orders.entities.OrderLine; import org.navalplanner.business.orders.entities.OrderLineGroup; import org.navalplanner.business.orders.services.IOrderService; import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.business.resources.services.CriterionService; import org.navalplanner.business.test.resources.daos.CriterionSatisfactionDAOTest; import org.springframework.beans.factory.annotation.Autowired; @@ -218,8 +219,8 @@ public class OrderServiceTest { orderLine.addHoursGroup(hoursGroup); orderLine.addHoursGroup(hoursGroup2); - Criterion criterion = Criterion.withNameAndType("Test" - + UUID.randomUUID().toString(), "test"); + CriterionType criterionType = new CriterionType("test"); + Criterion criterion = new Criterion("Test" + UUID.randomUUID(), criterionType); criterionService.save(criterion); hoursGroup.addCriterion(criterion); @@ -248,7 +249,7 @@ public class OrderServiceTest { Criterion criterion = criterions.iterator().next(); - assertThat(criterion.getType(), equalTo("test")); + assertThat(criterion.getType().getName(), equalTo("test")); } catch (InstanceNotFoundException e) { throw new RuntimeException(e); } 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 861ddeef7..c777f982e 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 @@ -14,7 +14,9 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.resources.daos.ICriterionDAO; +import org.navalplanner.business.resources.daos.ICriterionTypeDAO; import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.CriterionType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -34,25 +36,51 @@ public class CriterionDAOTest { @Autowired private ICriterionDAO criterionDAO; + @Autowired + private ICriterionTypeDAO criterionTypeDAO; + @Test public void testInSpringContainer() { assertNotNull(criterionDAO); } + public static Criterion createValidCriterion() { + return createValidCriterion(UUID.randomUUID().toString()); + } + + public static Criterion createValidCriterion(String name) { + CriterionType criterionType = CriterionTypeDAOTest.createValidCriterionType(); + + return Criterion.withNameAndType(name, criterionType); + } + + private void saveCriterionType(Criterion criterion) { + CriterionType criterionType = criterion.getType(); + if (criterionTypeDAO.existsByName(criterionType)) { + try { + criterionType = criterionTypeDAO.findUniqueByName(criterionType); + } catch (InstanceNotFoundException ex) { + + } + } else { + criterionTypeDAO.save(criterionType); + } + criterion.setType(criterionType); + } + @Test public void testSaveCriterions() throws Exception { Criterion criterion = createValidCriterion(); + // A valid CriterionType must exists before saving Criterion + saveCriterionType(criterion); criterionDAO.save(criterion); assertTrue(criterionDAO.exists(criterion.getId())); } - public static Criterion createValidCriterion() { - return Criterion.withNameAndType(UUID.randomUUID().toString(), "pruebaType"); - } - @Test public void testRemove() throws InstanceNotFoundException { Criterion criterion = createValidCriterion(); + saveCriterionType(criterion); criterionDAO.save(criterion); criterionDAO.remove(criterion.getId()); assertFalse(criterionDAO.exists(criterion.getId())); @@ -62,7 +90,9 @@ public class CriterionDAOTest { public void testList() { int previous = criterionDAO.list(Criterion.class).size(); Criterion criterion1 = createValidCriterion(); + saveCriterionType(criterion1); Criterion criterion2 = createValidCriterion(); + saveCriterionType(criterion2); criterionDAO.save(criterion1); criterionDAO.save(criterion2); List list = criterionDAO.list(Criterion.class); 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 cdd4ebac8..545333251 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 @@ -8,9 +8,11 @@ import org.junit.runner.RunWith; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.resources.daos.ICriterionDAO; import org.navalplanner.business.resources.daos.ICriterionSatisfactionDAO; +import org.navalplanner.business.resources.daos.ICriterionTypeDAO; import org.navalplanner.business.resources.daos.impl.WorkerDaoHibernate; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionSatisfaction; +import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.business.resources.entities.Worker; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataIntegrityViolationException; @@ -42,6 +44,9 @@ public class CriterionSatisfactionDAOTest { @Autowired private ICriterionDAO criterionDAO; + @Autowired + private ICriterionTypeDAO criterionTypeDAO; + @Autowired private WorkerDaoHibernate workerDAO; @@ -55,6 +60,7 @@ public class CriterionSatisfactionDAOTest { private CriterionSatisfaction createValidCriterionSatisfaction(int year) { Criterion criterion = CriterionDAOTest.createValidCriterion(); + saveCriterionType(criterion); criterionDAO.save(criterion); Worker worker = new Worker("firstname", "surname", "nif", 4); workerDAO.save(worker); @@ -63,9 +69,23 @@ public class CriterionSatisfactionDAOTest { return criterionSatisfaction; } + private void saveCriterionType(Criterion criterion) { + CriterionType criterionType = criterion.getType(); + if (criterionTypeDAO.existsByName(criterionType)) { + try { + criterionType = criterionTypeDAO.findUniqueByName(criterionType); + } catch (InstanceNotFoundException ex) { + } + } else { + criterionTypeDAO.save(criterionType); + } + criterion.setType(criterionType); + } + @Test(expected = DataIntegrityViolationException.class) public void testNotSaveWithTransientCriterionAndWorker() { Criterion criterion = CriterionDAOTest.createValidCriterion(); + saveCriterionType(criterion); Worker worker = new Worker("firstname", "surname", "nif", 4); CriterionSatisfaction criterionSatisfaction = new CriterionSatisfaction( year(2007), criterion, worker); diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionTypeDAOTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionTypeDAOTest.java new file mode 100644 index 000000000..2c7e49538 --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/daos/CriterionTypeDAOTest.java @@ -0,0 +1,83 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.navalplanner.business.test.resources.daos; + +import java.util.List; +import java.util.UUID; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.resources.daos.ICriterionTypeDAO; +import org.navalplanner.business.resources.entities.CriterionType; +import org.navalplanner.business.resources.entities.ResourceEnum; +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; + +import static junit.framework.Assert.assertTrue; +import static junit.framework.Assert.assertFalse; +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; + +/** + * + * @author Diego Pino García + */ + +/** + * Test cases for CriterionTypeDAO
+ * @author Diego Pino García + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, + BUSINESS_SPRING_CONFIG_TEST_FILE }) +@Transactional +public class CriterionTypeDAOTest { + + @Autowired + private ICriterionTypeDAO criterionTypeDAO; + + public static final String DEFAULT_CRITERION_TYPE = "TEST_DEFAULT"; + + public static CriterionType createValidCriterionType(String name) { + return new CriterionType(name); + } + + public static CriterionType createValidCriterionType() { + String unique = UUID.randomUUID().toString(); + return createValidCriterionType(unique); + } + + @Test + public void testSaveCriterionType() throws Exception { + CriterionType criterionType = createValidCriterionType(); + criterionTypeDAO.save(criterionType); + assertTrue(criterionTypeDAO.exists(criterionType.getId())); + } + + @Test + public void testRemove() throws InstanceNotFoundException { + CriterionType criterionType = createValidCriterionType(); + criterionTypeDAO.save(criterionType); + criterionTypeDAO.remove(criterionType.getId()); + assertFalse(criterionTypeDAO.exists(criterionType.getId())); + } + + @Test + public void testList() { + int previous = criterionTypeDAO.list(CriterionType.class).size(); + CriterionType criterion1 = createValidCriterionType(); + CriterionType criterion2 = createValidCriterionType(); + criterionTypeDAO.save(criterion1); + criterionTypeDAO.save(criterion2); + List list = criterionTypeDAO.list(CriterionType.class); + assertEquals(previous + 2, list.size()); + } +} 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 6ac9cfb2c..7a3223a75 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 @@ -132,10 +132,6 @@ public class CriterionTest { public void testCanBeRelatedTo() throws Exception { assertTrue(PredefinedCriterionTypes.LOCATION_GROUP .criterionCanBeRelatedTo(Resource.class)); - assertTrue(PredefinedCriterionTypes.LOCATION_GROUP - .criterionCanBeRelatedTo(Worker.class)); - assertFalse(PredefinedCriterionTypes.WORK_RELATIONSHIP - .criterionCanBeRelatedTo(Resource.class)); assertTrue(PredefinedCriterionTypes.WORK_RELATIONSHIP .criterionCanBeRelatedTo(Worker.class)); } 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 014ea414b..d1fcf3979 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 @@ -13,6 +13,7 @@ import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionSatisfaction; +import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.business.resources.entities.CriterionWithItsType; import org.navalplanner.business.resources.entities.ICriterion; import org.navalplanner.business.resources.entities.ICriterionOnData; @@ -22,6 +23,7 @@ import org.navalplanner.business.resources.entities.PredefinedCriterionTypes; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.business.resources.services.CriterionService; +import org.navalplanner.business.resources.services.CriterionTypeService; import org.navalplanner.business.resources.services.ResourceService; import org.navalplanner.business.test.resources.daos.CriterionDAOTest; import org.navalplanner.business.test.resources.daos.CriterionSatisfactionDAOTest; @@ -44,6 +46,7 @@ import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING /** * Test cases for {@link CriterionService}
* @author Óscar González Fernández + * @author Diego Pino García */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, @@ -54,6 +57,9 @@ public class CriterionServiceTest { @Autowired private CriterionService criterionService; + @Autowired + private CriterionTypeService criterionTypeService; + @Autowired private ResourceService resourceService; @@ -62,7 +68,7 @@ public class CriterionServiceTest { @Test(expected = InvalidStateException.class) public void testCantSaveCriterionWithoutNameAndType() throws Exception { - Criterion criterion = Criterion.withNameAndType("valido", "valido"); + Criterion criterion = CriterionDAOTest.createValidCriterion("valido"); criterion.setName(""); criterionService.save(criterion); sessionFactory.getCurrentSession().flush(); @@ -244,7 +250,7 @@ public class CriterionServiceTest { Criterion criterion = CriterionDAOTest.createValidCriterion(); criterionService.save(criterion); ICriterionType type = createTypeThatMatches(criterion); - worker1.addSatisfaction(new CriterionWithItsType(type, criterion)); + worker1.addSatisfaction(new CriterionWithItsType(criterion.getType(), criterion)); resourceService.saveResource(worker1); Resource workerReloaded = criterionService .onTransaction(new OnTransaction() { @@ -262,7 +268,7 @@ public class CriterionServiceTest { } }); Collection satisfactionsFor = workerReloaded - .getSatisfactionsFor(type); + .getSatisfactionsFor(criterion.getType()); Criterion reloadedCriterion = satisfactionsFor.iterator().next() .getCriterion(); Assume.assumeTrue(!reloadedCriterion.getClass().equals( diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/CriterionTypeServiceTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/CriterionTypeServiceTest.java new file mode 100644 index 000000000..b8c3160a6 --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/CriterionTypeServiceTest.java @@ -0,0 +1,62 @@ +package org.navalplanner.business.test.resources.services; + + +import java.util.UUID; +import org.hibernate.exception.ConstraintViolationException; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.business.resources.entities.CriterionType; +import org.navalplanner.business.resources.services.CriterionTypeService; +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; + +import static org.junit.Assert.assertTrue; +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 CriterionTypeService}
+ * @author Diego Pino García + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, + BUSINESS_SPRING_CONFIG_TEST_FILE }) +@Transactional +public class CriterionTypeServiceTest { + + @Autowired + private CriterionTypeService criterionTypeService; + + public CriterionType createValidCriterionType(String name) { + return new CriterionType(name); + } + + @Test + public void testSaveCriterionType() throws ValidationException { + String unique = UUID.randomUUID().toString(); + CriterionType criterionType = createValidCriterionType(unique); + criterionTypeService.save(criterionType); + assertTrue(criterionTypeService.exists(criterionType)); + } + + @Test + public void testSaveCriterionTypeTwice() throws ValidationException { + String unique = UUID.randomUUID().toString(); + CriterionType criterionType = createValidCriterionType(unique); + criterionTypeService.save(criterionType); + criterionTypeService.save(criterionType); + assertTrue(criterionTypeService.exists(criterionType)); + } + + @Test(expected=ConstraintViolationException.class) + public void testCannotSaveTwoCriterionTypesWithTheSameName() throws ValidationException { + String unique = UUID.randomUUID().toString(); + CriterionType criterionType = createValidCriterionType(unique); + criterionTypeService.save(criterionType); + criterionType = createValidCriterionType(unique); + criterionTypeService.save(criterionType); + } +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementController.java index 00b708802..87adee7c8 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementController.java @@ -14,6 +14,7 @@ import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.orders.entities.OrderLine; import org.navalplanner.business.orders.entities.OrderLineGroup; import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.business.resources.entities.ICriterionType; import org.navalplanner.web.common.Util; import org.zkoss.zk.ui.Component; @@ -328,8 +329,8 @@ public class OrderElementController extends GenericForwardComposer { for (HoursGroup hoursGroup : orderElement.getHoursGroups()) { Set criterions = hoursGroup.getCriterions(); for (Criterion criterion : criterions) { - String type = criterion.getType(); - criterionTypes.add(model.getCriterionTypeByName(type)); + CriterionType type = criterion.getType(); + criterionTypes.add(model.getCriterionTypeByName(type.getName())); } }