diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/IntegrationEntity.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/IntegrationEntity.java index 8c070e774..87587ae11 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/IntegrationEntity.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/IntegrationEntity.java @@ -99,7 +99,7 @@ public abstract class IntegrationEntity extends BaseEntity { * the private method findIntegrationEntityDAO, which in turn * calls on the abstract method getIntegrationEntityDAO(). */ - @AssertTrue(message="code is already being used") + @AssertTrue(message="code is already used") public boolean checkConstraintUniqueCode() { /* Check if it makes sense to check the constraint .*/ @@ -166,7 +166,8 @@ public abstract class IntegrationEntity extends BaseEntity { IIntegrationEntityDAO integrationEntityDAO = getIntegrationEntityDAO(); - if (!integrationEntityDAO.getEntityClass().equals(this.getClass())) { + if (!integrationEntityDAO.getEntityClass().isAssignableFrom( + this.getClass())) { throw new RuntimeException(this.getClass().getName() + "::" + "getIntegrationEntityDAO returns an incompatible " + "DAO: " + integrationEntityDAO.getClass().getName()); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java index 79253baef..7ca8705b9 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java @@ -24,6 +24,7 @@ import org.navalplanner.business.advance.daos.IAdvanceTypeDAO; import org.navalplanner.business.calendars.daos.IBaseCalendarDAO; import org.navalplanner.business.common.daos.IConfigurationDAO; import org.navalplanner.business.costcategories.daos.ICostCategoryDAO; +import org.navalplanner.business.costcategories.daos.IResourcesCostCategoryAssignmentDAO; import org.navalplanner.business.costcategories.daos.ITypeOfWorkHoursDAO; import org.navalplanner.business.externalcompanies.daos.IExternalCompanyDAO; import org.navalplanner.business.labels.daos.ILabelDAO; @@ -35,8 +36,10 @@ import org.navalplanner.business.orders.daos.IOrderDAO; import org.navalplanner.business.orders.daos.IOrderElementDAO; import org.navalplanner.business.qualityforms.daos.IQualityFormDAO; 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.IMachineDAO; +import org.navalplanner.business.resources.daos.IResourceDAO; import org.navalplanner.business.resources.daos.IWorkerDAO; import org.navalplanner.business.users.daos.IProfileDAO; import org.navalplanner.business.users.daos.IUserDAO; @@ -132,6 +135,16 @@ public class Registry { @Autowired private IWorkReportDAO workReportDAO; + @Autowired + private IResourceDAO resourceDAO; + + @Autowired + private ICriterionSatisfactionDAO criterionSatisfactionDAO; + + @Autowired + private IResourcesCostCategoryAssignmentDAO + resourcesCostCategoryAssignmentDAO; + private Registry() { } @@ -230,4 +243,19 @@ public class Registry { return getInstance().workReportDAO; } + public static IResourceDAO getResourceDAO() { + return getInstance().resourceDAO; + } + + public static ICriterionSatisfactionDAO getCriterionSatisfactionDAO() { + return getInstance().criterionSatisfactionDAO; + } + + public static IResourcesCostCategoryAssignmentDAO + getResourcesCostCategoryAssignmentDAO() { + + return getInstance().resourcesCostCategoryAssignmentDAO; + + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/IResourcesCostCategoryAssignmentDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/IResourcesCostCategoryAssignmentDAO.java index ffd351b4a..c73b8e43f 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/IResourcesCostCategoryAssignmentDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/IResourcesCostCategoryAssignmentDAO.java @@ -20,12 +20,13 @@ package org.navalplanner.business.costcategories.daos; -import org.navalplanner.business.common.daos.IGenericDAO; +import org.navalplanner.business.common.daos.IIntegrationEntityDAO; import org.navalplanner.business.costcategories.entities.ResourcesCostCategoryAssignment; /** * @author Jacobo Aragunde Perez */ -public interface IResourcesCostCategoryAssignmentDAO extends IGenericDAO { +public interface IResourcesCostCategoryAssignmentDAO + extends IIntegrationEntityDAO { } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/ResourcesCostCategoryAssignmentDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/ResourcesCostCategoryAssignmentDAO.java index 9cc02ddf9..326b11805 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/ResourcesCostCategoryAssignmentDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/ResourcesCostCategoryAssignmentDAO.java @@ -20,7 +20,7 @@ package org.navalplanner.business.costcategories.daos; -import org.navalplanner.business.common.daos.GenericDAOHibernate; +import org.navalplanner.business.common.daos.IntegrationEntityDAO; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.costcategories.entities.ResourcesCostCategoryAssignment; import org.springframework.beans.factory.config.BeanDefinition; @@ -32,9 +32,9 @@ import org.springframework.stereotype.Repository; */ @Repository @Scope(BeanDefinition.SCOPE_SINGLETON) -public class ResourcesCostCategoryAssignmentDAO extends - GenericDAOHibernate implements - IResourcesCostCategoryAssignmentDAO { +public class ResourcesCostCategoryAssignmentDAO + extends IntegrationEntityDAO + implements IResourcesCostCategoryAssignmentDAO { @Override public void remove(Long id) throws InstanceNotFoundException { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/ResourcesCostCategoryAssignment.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/ResourcesCostCategoryAssignment.java index 342e747fe..334ef67c2 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/ResourcesCostCategoryAssignment.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/ResourcesCostCategoryAssignment.java @@ -26,17 +26,18 @@ import org.apache.commons.lang.StringUtils; import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotNull; import org.joda.time.LocalDate; -import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.common.IntegrationEntity; import org.navalplanner.business.common.Registry; import org.navalplanner.business.common.exceptions.CreateUnvalidatedException; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.costcategories.daos.IResourcesCostCategoryAssignmentDAO; import org.navalplanner.business.resources.entities.Resource; /** * @author Jacobo Aragunde Perez * @author Fernando Bellas Permuy */ -public class ResourcesCostCategoryAssignment extends BaseEntity { +public class ResourcesCostCategoryAssignment extends IntegrationEntity { private LocalDate initDate; @@ -56,8 +57,9 @@ public class ResourcesCostCategoryAssignment extends BaseEntity { } public static ResourcesCostCategoryAssignment createUnvalidated( - String costCategoryName, Resource resource, LocalDate initDate, - LocalDate endDate) throws CreateUnvalidatedException { + String code, String costCategoryName, Resource resource, + LocalDate initDate, LocalDate endDate) + throws CreateUnvalidatedException { /* Get CostCategory. */ if (StringUtils.isBlank(costCategoryName)) { @@ -76,7 +78,7 @@ public class ResourcesCostCategoryAssignment extends BaseEntity { /* Create instance of ResourcesCostCategoryAssignment. */ ResourcesCostCategoryAssignment assignment = - create(new ResourcesCostCategoryAssignment()); + create(new ResourcesCostCategoryAssignment(), code); assignment.initDate = initDate; assignment.endDate = endDate; @@ -150,4 +152,9 @@ public class ResourcesCostCategoryAssignment extends BaseEntity { return initDate != null; } + @Override + protected IResourcesCostCategoryAssignmentDAO getIntegrationEntityDAO() { + return Registry.getResourcesCostCategoryAssignmentDAO(); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/CriterionSatisfactionDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/CriterionSatisfactionDAO.java index 309e09f0f..67b386d8c 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/CriterionSatisfactionDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/CriterionSatisfactionDAO.java @@ -20,7 +20,7 @@ package org.navalplanner.business.resources.daos; -import org.navalplanner.business.common.daos.GenericDAOHibernate; +import org.navalplanner.business.common.daos.IntegrationEntityDAO; import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; @@ -33,7 +33,7 @@ import org.springframework.stereotype.Repository; */ @Repository @Scope(BeanDefinition.SCOPE_SINGLETON) -public class CriterionSatisfactionDAO extends - GenericDAOHibernate implements - ICriterionSatisfactionDAO { +public class CriterionSatisfactionDAO + extends IntegrationEntityDAO + implements ICriterionSatisfactionDAO { } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionSatisfactionDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionSatisfactionDAO.java index 1bef1ddf9..ee01e3320 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionSatisfactionDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ICriterionSatisfactionDAO.java @@ -20,14 +20,14 @@ package org.navalplanner.business.resources.daos; -import org.navalplanner.business.common.daos.IGenericDAO; +import org.navalplanner.business.common.daos.IIntegrationEntityDAO; import org.navalplanner.business.resources.entities.CriterionSatisfaction; /** * DAO for {@link CriterionSatisfaction}
* @author Óscar González Fernández */ -public interface ICriterionSatisfactionDAO extends - IGenericDAO { +public interface ICriterionSatisfactionDAO + extends IIntegrationEntityDAO { } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IResourceDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IResourceDAO.java index e7df3a938..79821a6d6 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IResourceDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IResourceDAO.java @@ -23,7 +23,7 @@ package org.navalplanner.business.resources.daos; import java.util.Collection; import java.util.List; -import org.navalplanner.business.common.daos.IGenericDAO; +import org.navalplanner.business.common.daos.IIntegrationEntityDAO; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.Machine; @@ -36,7 +36,7 @@ import org.navalplanner.business.resources.entities.Worker; * @author Fernando Bellas Permuy * @author Diego Pino Garcia */ -public interface IResourceDAO extends IGenericDAO { +public interface IResourceDAO extends IIntegrationEntityDAO { public List getWorkers(); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ResourceDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ResourceDAO.java index 08aa08c70..46d4f7704 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ResourceDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ResourceDAO.java @@ -29,7 +29,7 @@ import java.util.Set; import org.apache.commons.lang.Validate; import org.hibernate.Query; -import org.navalplanner.business.common.daos.GenericDAOHibernate; +import org.navalplanner.business.common.daos.IntegrationEntityDAO; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.Machine; @@ -48,8 +48,8 @@ import org.springframework.transaction.annotation.Transactional; @Repository @Scope(BeanDefinition.SCOPE_SINGLETON) @Transactional -public class ResourceDAO extends GenericDAOHibernate implements - IResourceDAO { +public class ResourceDAO extends IntegrationEntityDAO implements + IResourceDAO { @Override public List getWorkers() { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java index 5bade1167..6381764e4 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/CriterionSatisfaction.java @@ -30,17 +30,18 @@ import org.apache.commons.lang.Validate; import org.apache.commons.lang.builder.ToStringBuilder; import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotNull; -import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.common.IntegrationEntity; import org.navalplanner.business.common.Registry; import org.navalplanner.business.common.exceptions.CreateUnvalidatedException; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.resources.daos.ICriterionSatisfactionDAO; import org.navalplanner.business.resources.daos.ICriterionTypeDAO; /** * Declares a interval of time in which the criterion is satisfied
* @author Óscar González Fernández * @author Fernando Bellas Permuy */ -public class CriterionSatisfaction extends BaseEntity { +public class CriterionSatisfaction extends IntegrationEntity { public static final Comparator BY_START_COMPARATOR; @@ -56,28 +57,26 @@ public class CriterionSatisfaction extends BaseEntity { } public static CriterionSatisfaction create() { - CriterionSatisfaction criterionSatisfaction = new CriterionSatisfaction(); - criterionSatisfaction.setNewObject(true); - return criterionSatisfaction; + return create(new CriterionSatisfaction()); } public static CriterionSatisfaction create(Date startDate, Criterion criterion, Resource resource) { - CriterionSatisfaction criterionSatisfaction = new CriterionSatisfaction( - startDate, criterion, resource); - criterionSatisfaction.setNewObject(true); - return criterionSatisfaction; + + return create( + new CriterionSatisfaction(startDate, criterion, resource)); + } public static CriterionSatisfaction create(Criterion criterion, Resource resource, Interval interval) { - CriterionSatisfaction criterionSatisfaction = new CriterionSatisfaction(criterion, resource, interval); - criterionSatisfaction.setNewObject(true); - return criterionSatisfaction; + + return create(new CriterionSatisfaction(criterion, resource, interval)); + } public static CriterionSatisfaction createUnvalidated( - String criterionTypeName, String criterionName, + String code, String criterionTypeName, String criterionName, Resource resource, Date startDate, Date finishDate) throws CreateUnvalidatedException { @@ -117,7 +116,7 @@ public class CriterionSatisfaction extends BaseEntity { /* Create instance of CriterionSatisfaction. */ CriterionSatisfaction criterionSatisfaction = - create(new CriterionSatisfaction()); + create(new CriterionSatisfaction(), code); criterionSatisfaction.criterion = criterion; criterionSatisfaction.resource = resource; @@ -301,4 +300,9 @@ public class CriterionSatisfaction extends BaseEntity { return startDate != null; } + @Override + protected ICriterionSatisfactionDAO getIntegrationEntityDAO() { + return Registry.getCriterionSatisfactionDAO(); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Machine.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Machine.java index e543352b5..7509154c0 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Machine.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Machine.java @@ -25,13 +25,8 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; -import org.apache.commons.lang.StringUtils; -import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotEmpty; import org.hibernate.validator.Valid; -import org.navalplanner.business.common.Registry; -import org.navalplanner.business.common.exceptions.InstanceNotFoundException; -import org.navalplanner.business.resources.daos.IMachineDAO; /** * Entity @@ -41,8 +36,6 @@ import org.navalplanner.business.resources.daos.IMachineDAO; */ public class Machine extends Resource { - private String code; - private String name; private String description; @@ -67,9 +60,8 @@ public class Machine extends Resource { public static Machine createUnvalidated(String code, String name, String description) { - Machine machine = create(new Machine()); + Machine machine = create(new Machine(), code); - machine.code = code; machine.name = name; machine.description = description; @@ -77,29 +69,17 @@ public class Machine extends Resource { } + /** + * Used by Hibernate. Do not use! + */ protected Machine() { } - protected Machine(String code, String name, String description) { - this.code = code; - this.name = name; - this.description = description; - } - public static Machine create() { return create(new Machine()); } - @NotEmpty(message="machine code not specified") - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - @NotEmpty(message="machine name not specified") public String getName() { return name; @@ -114,7 +94,7 @@ public class Machine extends Resource { } public String getShortDescription() { - return code + " :: " + name; + return getCode() + " :: " + name; } public void setDescription(String description) { @@ -127,45 +107,6 @@ public class Machine extends Resource { return compositedCriterion.isSatisfiedBy(this); } - @AssertTrue(message="machine code has to be unique. It is already used") - public boolean checkConstraintUniqueCode() { - - /* Check if it makes sense to check the constraint .*/ - if (!isCodeSpecified()) { - return true; - } - - /* Check the constraint. */ - boolean result; - if (isNewObject()) { - result = !existsMachineWithTheCode(); - } else { - result = isIfExistsTheExistentMachineThisOne(); - } - return result; - - } - - private boolean isCodeSpecified() { - return !StringUtils.isBlank(code); - } - - private boolean existsMachineWithTheCode() { - IMachineDAO machineDAO = Registry.getMachineDAO(); - return machineDAO.existsMachineWithCodeInAnotherTransaction(code); - } - - private boolean isIfExistsTheExistentMachineThisOne() { - IMachineDAO machineDAO = Registry.getMachineDAO(); - try { - Machine machine = - machineDAO.findUniqueByCodeInAnotherTransaction(code); - return machine.getId().equals(getId()); - } catch (InstanceNotFoundException e) { - return true; - } - } - @Override protected boolean isCriterionSatisfactionOfCorrectType( CriterionSatisfaction c) { 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 e9b03d990..1b55943d1 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 @@ -43,13 +43,14 @@ import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.calendars.entities.IWorkHours; import org.navalplanner.business.calendars.entities.ResourceCalendar; import org.navalplanner.business.calendars.entities.SameWorkHoursEveryDay; -import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.common.IntegrationEntity; import org.navalplanner.business.common.Registry; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.MultipleInstancesException; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.costcategories.entities.ResourcesCostCategoryAssignment; import org.navalplanner.business.planner.entities.DayAssignment; +import org.navalplanner.business.resources.daos.IResourceDAO; /** * This class acts as the base class for all resources. @@ -57,7 +58,7 @@ import org.navalplanner.business.planner.entities.DayAssignment; * @author Susana Montes Pedreira * @author Jacobo Aragunde Perez */ -public abstract class Resource extends BaseEntity{ +public abstract class Resource extends IntegrationEntity { public static List machines( Collection resources) { @@ -941,6 +942,18 @@ public abstract class Resource extends BaseEntity{ } + @AssertTrue(message="criterion satisfaction codes must be unique inside " + + "a resource") + public boolean checkConstraintNonRepeatedCriterionSatisfactionCodes() { + return getFirstRepeatedCode(criterionSatisfactions) == null; + } + + @AssertTrue(message="resources cost category assignment codes must be " + + "unique inside a resource") + public boolean checkConstraintNonRepeatedResourcesCostCategoryAssignmentCodes() { + return getFirstRepeatedCode(resourcesCostCategoryAssignments) == null; + } + protected boolean isCriterionSatisfactionOfCorrectType( CriterionSatisfaction c) { @@ -948,4 +961,8 @@ public abstract class Resource extends BaseEntity{ } + protected IResourceDAO getIntegrationEntityDAO() { + return Registry.getResourceDAO(); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java index 4b6d0545e..b5103ef92 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java @@ -36,21 +36,20 @@ import org.navalplanner.business.common.Registry; public class Worker extends Resource { public static Worker create() { - Worker worker = new Worker(); - worker.setNewObject(true); - return worker; + return create(new Worker()); } - public static Worker create(String firstName, String surname, String nif) { - Worker worker = new Worker(firstName, surname, nif); - worker.setNewObject(true); - return worker; - } - - public static Worker createUnvalidated(String firstName, String surname, + public static Worker create(String firstName, String surname, String nif) { - Worker worker = create(new Worker()); + return create(new Worker(firstName, surname, nif)); + + } + + public static Worker createUnvalidated(String code, String firstName, + String surname, String nif) { + + Worker worker = create(new Worker(), code); worker.firstName = firstName; worker.surname = surname; diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/costcategories/entities/CostCategories.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/costcategories/entities/CostCategories.hbm.xml index a9b29706d..abde01e03 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/costcategories/entities/CostCategories.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/costcategories/entities/CostCategories.hbm.xml @@ -70,6 +70,8 @@ + + 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 cdabb89b8..e560a00ec 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 @@ -12,6 +12,7 @@ Hibernate infers type="integer". --> + @@ -46,7 +47,6 @@ - @@ -98,6 +98,7 @@ + diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/CriterionSatisfactionDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/CriterionSatisfactionDTO.java index 748099fdc..1924bfde1 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/CriterionSatisfactionDTO.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/CriterionSatisfactionDTO.java @@ -24,12 +24,16 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlSchemaType; import javax.xml.datatype.XMLGregorianCalendar; +import org.navalplanner.ws.common.api.IntegrationEntityDTO; + /** * DTO for CriterionSatisfaction entity. * * @author Fernando Bellas Permuy */ -public class CriterionSatisfactionDTO { +public class CriterionSatisfactionDTO extends IntegrationEntityDTO { + + public final static String ENTITY_TYPE = "criterion-satisfaction"; @XmlAttribute(name="criterion-type-name") public String criterionTypeName; @@ -47,10 +51,11 @@ public class CriterionSatisfactionDTO { public CriterionSatisfactionDTO() {} - public CriterionSatisfactionDTO( + public CriterionSatisfactionDTO(String code, String criterionTypeName, String criterionName, XMLGregorianCalendar startDate, XMLGregorianCalendar endDate) { + super(code); this.criterionTypeName = criterionTypeName; this.criterionName = criterionName; this.startDate = startDate; @@ -58,4 +63,23 @@ public class CriterionSatisfactionDTO { } + /** + * This constructor automatically generates a unique code. It is intended + * to facilitate the implementation of test cases that add new instances + * (such instances will have a unique code). + */ + public CriterionSatisfactionDTO( + String criterionTypeName, String criterionName, + XMLGregorianCalendar startDate, XMLGregorianCalendar endDate) { + + this(generateCode(), criterionTypeName, criterionName, startDate, + endDate); + + } + + @Override + public String getEntityType() { + return ENTITY_TYPE; + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/MachineDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/MachineDTO.java index 246a3477c..23f97238c 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/MachineDTO.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/MachineDTO.java @@ -29,8 +29,7 @@ import javax.xml.bind.annotation.XmlAttribute; */ public class MachineDTO extends ResourceDTO { - @XmlAttribute - public String code; + public final static String ENTITY_TYPE = "machine"; @XmlAttribute public String name; @@ -41,9 +40,23 @@ public class MachineDTO extends ResourceDTO { public MachineDTO() {} public MachineDTO(String code, String name, String description) { - this.code = code; + super(code); this.name = name; this.description = description; } + /** + * This constructor automatically generates a unique code. It is intended + * to facilitate the implementation of test cases that add new instances + * (such instances will have a unique code). + */ + public MachineDTO(String name, String description) { + this(generateCode(), name, description); + } + + @Override + public String getEntityType() { + return ENTITY_TYPE; + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/ResourceDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/ResourceDTO.java index e1ba48f83..a7ba4656d 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/ResourceDTO.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/ResourceDTO.java @@ -27,12 +27,14 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; +import org.navalplanner.ws.common.api.IntegrationEntityDTO; + /** * DTO for Resource entity. * * @author Fernando Bellas Permuy */ -public abstract class ResourceDTO { +public abstract class ResourceDTO extends IntegrationEntityDTO { @XmlAttribute(name="calendar-name") public String calendarName; @@ -48,4 +50,10 @@ public abstract class ResourceDTO { resourcesCostCategoryAssignments = new ArrayList(); + protected ResourceDTO() {} + + protected ResourceDTO(String code) { + super(code); + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/ResourcesCostCategoryAssignmentDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/ResourcesCostCategoryAssignmentDTO.java index b3004e7ea..a40eb2141 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/ResourcesCostCategoryAssignmentDTO.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/ResourcesCostCategoryAssignmentDTO.java @@ -23,12 +23,17 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlSchemaType; import javax.xml.datatype.XMLGregorianCalendar; +import org.navalplanner.ws.common.api.IntegrationEntityDTO; + /** * DTO for ResourcesCostCategoryAssignment entity. * * @author Fernando Bellas Permuy */ -public class ResourcesCostCategoryAssignmentDTO { +public class ResourcesCostCategoryAssignmentDTO extends IntegrationEntityDTO { + + public final static String ENTITY_TYPE = + "resources-cost-category-assignment"; @XmlAttribute(name="cost-category-name") public String costCategoryName; @@ -43,13 +48,33 @@ public class ResourcesCostCategoryAssignmentDTO { public ResourcesCostCategoryAssignmentDTO() {} - public ResourcesCostCategoryAssignmentDTO(String costCategoryName, - XMLGregorianCalendar startDate, XMLGregorianCalendar endDate) { + public ResourcesCostCategoryAssignmentDTO(String code, + String costCategoryName, XMLGregorianCalendar startDate, + XMLGregorianCalendar endDate) { + super(code); this.costCategoryName = costCategoryName; this.startDate = startDate; this.endDate = endDate; } + /** + * This constructor automatically generates a unique code. It is intended + * to facilitate the implementation of test cases that add new instances + * (such instances will have a unique code). + */ + public ResourcesCostCategoryAssignmentDTO( + String costCategoryName, XMLGregorianCalendar startDate, + XMLGregorianCalendar endDate) { + + this(generateCode(), costCategoryName, startDate, endDate); + + } + + @Override + public String getEntityType() { + return ENTITY_TYPE; + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/WorkerDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/WorkerDTO.java index 5aea49125..cdeb73eb1 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/WorkerDTO.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/api/WorkerDTO.java @@ -29,6 +29,8 @@ import javax.xml.bind.annotation.XmlAttribute; */ public class WorkerDTO extends ResourceDTO { + public final static String ENTITY_TYPE = "worker"; + @XmlAttribute(name="first-name") public String firstName; @@ -40,10 +42,28 @@ public class WorkerDTO extends ResourceDTO { public WorkerDTO() {} - public WorkerDTO(String firstName, String surname, String nif) { + public WorkerDTO(String code, String firstName, String surname, + String nif) { + + super(code); this.firstName = firstName; this.surname = surname; this.nif = nif; + + } + + /** + * This constructor automatically generates a unique code. It is intended + * to facilitate the implementation of test cases that add new instances + * (such instances will have a unique code). + */ + public WorkerDTO(String firstName, String surname, String nif) { + this(generateCode(), firstName, surname, nif); + } + + @Override + public String getEntityType() { + return ENTITY_TYPE; } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceConverter.java index 4da3d47c4..a255570ea 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceConverter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceConverter.java @@ -76,16 +76,23 @@ public class ResourceConverter { private final static Machine createResourceWithBasicData( MachineDTO machineDTO) { - return Machine.createUnvalidated(StringUtils.trim(machineDTO.code), + + return Machine.createUnvalidated + (StringUtils.trim(machineDTO.code), StringUtils.trim(machineDTO.name), StringUtils.trim(machineDTO.description)); + } private final static Worker createResourceWithBasicData( WorkerDTO workerDTO) { - return Worker.createUnvalidated(StringUtils.trim(workerDTO.firstName), + + return Worker.createUnvalidated( + StringUtils.trim(workerDTO.code), + StringUtils.trim(workerDTO.firstName), StringUtils.trim(workerDTO.surname), StringUtils.trim(workerDTO.nif)); + } private static void addCriterionSatisfactions(Resource resource, @@ -109,6 +116,7 @@ public class ResourceConverter { throws CreateUnvalidatedException { return CriterionSatisfaction.createUnvalidated( + StringUtils.trim(criterionSatisfactionDTO.code), StringUtils.trim(criterionSatisfactionDTO.criterionTypeName), StringUtils.trim(criterionSatisfactionDTO.criterionName), resource, @@ -154,7 +162,7 @@ public class ResourceConverter { throws CreateUnvalidatedException { return ResourcesCostCategoryAssignment.createUnvalidated( - assignmentDTO.costCategoryName, resource, + assignmentDTO.code, assignmentDTO.costCategoryName, resource, DateConverter.toLocalDate(assignmentDTO.startDate), DateConverter.toLocalDate(assignmentDTO.endDate)); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceServiceREST.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceServiceREST.java index fcaadb28f..c7609cfa7 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceServiceREST.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/resources/impl/ResourceServiceREST.java @@ -88,8 +88,8 @@ public class ResourceServiceREST implements IResourceService { } catch (CreateUnvalidatedException e) { instanceConstraintViolationsDTO = InstanceConstraintViolationsDTO.create( - Util.generateInstanceId(instanceNumber, - getUserProvidedId(resourceDTO)), + Util.generateInstanceConstraintViolationsDTOId( + (long) instanceNumber, resourceDTO), e.getMessage()); } @@ -102,10 +102,10 @@ public class ResourceServiceREST implements IResourceService { instanceConstraintViolationsDTO = InstanceConstraintViolationsDTO.create( - Util.generateInstanceId(instanceNumber, - getUserProvidedId(resourceDTO)), - getDuplicatedImportedResourceErrorMessage( - resourceDTO)); + Util.generateInstanceConstraintViolationsDTOId( + (long) instanceNumber, resourceDTO), + getDuplicatedImportedResourceErrorMessage( + resourceDTO)); } else { @@ -125,9 +125,8 @@ public class ResourceServiceREST implements IResourceService { } catch (ValidationException e) { instanceConstraintViolationsDTO = ConstraintViolationConverter.toDTO( - Util.generateInstanceId(instanceNumber, - getUserProvidedId(resourceDTO)), - e.getInvalidValues()); + Util.generateInstanceConstraintViolationsDTOId( + (long) instanceNumber, resourceDTO), e); } } diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/common/Util.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/common/Util.java index 0934aaefd..2922c349f 100644 --- a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/common/Util.java +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/common/Util.java @@ -20,6 +20,7 @@ package org.navalplanner.web.test.ws.common; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.List; @@ -66,6 +67,8 @@ public class Util { InstanceConstraintViolationsListDTO instanceConstraintViolationsListDTO) { + assertNotNull(instanceConstraintViolationsListDTO. + instanceConstraintViolationsList); assertTrue( instanceConstraintViolationsListDTO. instanceConstraintViolationsList.toString(), @@ -82,9 +85,13 @@ public class Util { instanceConstraintViolationsListDTO. instanceConstraintViolationsList; + assertNotNull(instanceConstraintViolationsListDTO. + instanceConstraintViolationsList); assertTrue( instanceConstraintViolationsList.toString(), instanceConstraintViolationsList.size() == 1); + assertNotNull(instanceConstraintViolationsList.get(0). + constraintViolations); assertTrue( instanceConstraintViolationsList.get(0). constraintViolations.toString(), @@ -101,12 +108,14 @@ public class Util { instanceConstraintViolationsListDTO. instanceConstraintViolationsList; + assertNotNull(instanceConstraintViolationsList); assertTrue( instanceConstraintViolationsList.toString(), instanceConstraintViolationsList.size() == numberOfInstances); for (InstanceConstraintViolationsDTO i : instanceConstraintViolationsList) { + assertNotNull(i.constraintViolations); assertTrue( i.constraintViolations.toString(), i.constraintViolations.size() == 1); diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java index 45fed1158..709796b85 100644 --- a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/resources/api/ResourceServiceTest.java @@ -193,7 +193,8 @@ public class ResourceServiceTest { public void testAddWorkerWithExistingFirstNameSurnameAndNif() { /* Create a worker. */ - Worker w1 = Worker.createUnvalidated(getUniqueName(), "surname", "nif"); + Worker w1 = Worker.createUnvalidated(getUniqueName(), getUniqueName(), + "surname", "nif"); saveResource(w1); /* diff --git a/scripts/rest-clients/resources-sample-mini.xml b/scripts/rest-clients/resources-sample-mini.xml index a07fd00d4..3c17bdb59 100644 --- a/scripts/rest-clients/resources-sample-mini.xml +++ b/scripts/rest-clients/resources-sample-mini.xml @@ -7,6 +7,7 @@ @@ -24,15 +27,17 @@ - diff --git a/scripts/rest-clients/resources-sample.xml b/scripts/rest-clients/resources-sample.xml index 61f691e97..ef71f7cd7 100644 --- a/scripts/rest-clients/resources-sample.xml +++ b/scripts/rest-clients/resources-sample.xml @@ -12,13 +12,11 @@ - - - @@ -50,6 +50,7 @@ @@ -59,6 +60,7 @@ @@ -69,27 +71,34 @@ + + + - + - - - - + @@ -111,9 +118,10 @@ - + - + - + @@ -143,33 +153,35 @@ - + - - + + - - @@ -187,9 +201,10 @@ - + - + - + - + - + + + +