From 571f814b640c9737c9a3998416c4ba3b428d8b80 Mon Sep 17 00:00:00 2001 From: Fernando Bellas Permuy Date: Thu, 4 Feb 2010 21:38:25 +0100 Subject: [PATCH] ItEr46S13CUImportacionRecursosProductivosItEr45S11: code added to entities imported by ResourceService. IMPORTANT: "code" column has been added to tables of the following entitites: Resource, CriterionSatisfaction, and ResourcesCostCategoryAssignment. "code" column has been removed from Machine's table. In consequence, it is better to remove all the database when applying this patch (navaldev, navaldevtest, navalprod, and navaprodtest). This change is compatible with the current Web user interface. The only thing you will notice is that when creating a machine, the form containing the code automatically displays a value in the code field (which, of course, can be changed by the user). Of course, the user interface should be improved to set a blank value or propose a more meaningful code to the user (probably this second option). The service has not been adpated to GenericRESTService yet and duplicate codes in resources *being* imported are not detected yet (GenericRESTService will make this automatically). --- .../business/common/IntegrationEntity.java | 5 +- .../business/common/Registry.java | 28 ++++++++ .../IResourcesCostCategoryAssignmentDAO.java | 5 +- .../ResourcesCostCategoryAssignmentDAO.java | 8 +-- .../ResourcesCostCategoryAssignment.java | 17 +++-- .../daos/CriterionSatisfactionDAO.java | 8 +-- .../daos/ICriterionSatisfactionDAO.java | 6 +- .../business/resources/daos/IResourceDAO.java | 4 +- .../business/resources/daos/ResourceDAO.java | 6 +- .../entities/CriterionSatisfaction.java | 32 +++++---- .../business/resources/entities/Machine.java | 69 ++---------------- .../business/resources/entities/Resource.java | 21 +++++- .../business/resources/entities/Worker.java | 21 +++--- .../entities/CostCategories.hbm.xml | 2 + .../resources/entities/Resources.hbm.xml | 3 +- .../api/CriterionSatisfactionDTO.java | 28 +++++++- .../ws/resources/api/MachineDTO.java | 19 ++++- .../ws/resources/api/ResourceDTO.java | 10 ++- .../ResourcesCostCategoryAssignmentDTO.java | 31 +++++++- .../ws/resources/api/WorkerDTO.java | 22 +++++- .../ws/resources/impl/ResourceConverter.java | 14 +++- .../resources/impl/ResourceServiceREST.java | 17 +++-- .../navalplanner/web/test/ws/common/Util.java | 9 +++ .../ws/resources/api/ResourceServiceTest.java | 3 +- .../rest-clients/resources-sample-mini.xml | 9 ++- scripts/rest-clients/resources-sample.xml | 71 +++++++++++++------ 26 files changed, 305 insertions(+), 163 deletions(-) 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 @@ - + - + - + - + - + + + +