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).
This commit is contained in:
Fernando Bellas Permuy 2010-02-04 21:38:25 +01:00 committed by Javier Moran Rua
parent be368f6b83
commit 571f814b64
26 changed files with 305 additions and 163 deletions

View file

@ -99,7 +99,7 @@ public abstract class IntegrationEntity extends BaseEntity {
* the private method <code>findIntegrationEntityDAO</code>, which in turn
* calls on the abstract method <code>getIntegrationEntityDAO()</code>.
*/
@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<? extends IntegrationEntity>
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());

View file

@ -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;
}
}

View file

@ -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 <jaragunde@igalia.com>
*/
public interface IResourcesCostCategoryAssignmentDAO extends IGenericDAO<ResourcesCostCategoryAssignment, Long> {
public interface IResourcesCostCategoryAssignmentDAO
extends IIntegrationEntityDAO<ResourcesCostCategoryAssignment> {
}

View file

@ -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<ResourcesCostCategoryAssignment, Long> implements
IResourcesCostCategoryAssignmentDAO {
public class ResourcesCostCategoryAssignmentDAO
extends IntegrationEntityDAO<ResourcesCostCategoryAssignment>
implements IResourcesCostCategoryAssignmentDAO {
@Override
public void remove(Long id) throws InstanceNotFoundException {

View file

@ -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 <jaragunde@igalia.com>
* @author Fernando Bellas Permuy <fbellas@udc.es>
*/
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();
}
}

View file

@ -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<CriterionSatisfaction, Long> implements
ICriterionSatisfactionDAO {
public class CriterionSatisfactionDAO
extends IntegrationEntityDAO<CriterionSatisfaction>
implements ICriterionSatisfactionDAO {
}

View file

@ -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} <br />
* @author Óscar González Fernández <ogonzalez@igalia.com>
*/
public interface ICriterionSatisfactionDAO extends
IGenericDAO<CriterionSatisfaction, Long> {
public interface ICriterionSatisfactionDAO
extends IIntegrationEntityDAO<CriterionSatisfaction> {
}

View file

@ -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 <fbellas@udc.es>
* @author Diego Pino Garcia <dpino@igalia.com>
*/
public interface IResourceDAO extends IGenericDAO<Resource, Long> {
public interface IResourceDAO extends IIntegrationEntityDAO<Resource> {
public List<Worker> getWorkers();

View file

@ -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<Resource, Long> implements
IResourceDAO {
public class ResourceDAO extends IntegrationEntityDAO<Resource> implements
IResourceDAO {
@Override
public List<Worker> getWorkers() {

View file

@ -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 <br />
* @author Óscar González Fernández <ogonzalez@igalia.com>
* @author Fernando Bellas Permuy <fbellas@udc.es>
*/
public class CriterionSatisfaction extends BaseEntity {
public class CriterionSatisfaction extends IntegrationEntity {
public static final Comparator<CriterionSatisfaction> 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();
}
}

View file

@ -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) {

View file

@ -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 <smontes@wirelessgalicia.com>
* @author Jacobo Aragunde Perez <jaragunde@igalia.com>
*/
public abstract class Resource extends BaseEntity{
public abstract class Resource extends IntegrationEntity {
public static List<Machine> machines(
Collection<? extends Resource> 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();
}
}

View file

@ -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;

View file

@ -70,6 +70,8 @@
</id>
<version name="version" access="property" type="long" />
<property name="code" access="property" not-null="true" unique="true"/>
<property name="initDate" type="org.joda.time.contrib.hibernate.PersistentLocalDate"/>
<property name="endDate" type="org.joda.time.contrib.hibernate.PersistentLocalDate"/>

View file

@ -12,6 +12,7 @@
Hibernate infers type="integer".
-->
<version name="version" access="property" type="long" />
<property name="code" access="property" not-null="true" unique="true"/>
<set access="field" cascade="all-delete-orphan" inverse="true" name="criterionSatisfactions">
<key column="resource" not-null="true"/>
<one-to-many class="CriterionSatisfaction"/>
@ -46,7 +47,6 @@
<joined-subclass name="org.navalplanner.business.resources.entities.Machine">
<key column="MACHINE_ID"/>
<property name="code"/>
<property name="name"/>
<property name="description"/>
<set inverse="true" name="configurationUnits" cascade="all-delete-orphan">
@ -98,6 +98,7 @@
</generator>
</id>
<version name="version" access="property" type="long" />
<property name="code" access="property" not-null="true" unique="true"/>
<property access="field" name="startDate" not-null="true"/>
<property access="field" name="finishDate"/>
<property access="field" name="isDeleted"/>

View file

@ -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 <code>CriterionSatisfaction</code> entity.
*
* @author Fernando Bellas Permuy <fbellas@udc.es>
*/
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;
}
}

View file

@ -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;
}
}

View file

@ -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 <code>Resource</code> entity.
*
* @author Fernando Bellas Permuy <fbellas@udc.es>
*/
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<ResourcesCostCategoryAssignmentDTO>();
protected ResourceDTO() {}
protected ResourceDTO(String code) {
super(code);
}
}

View file

@ -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 <code>ResourcesCostCategoryAssignment</code> entity.
*
* @author Fernando Bellas Permuy <fbellas@udc.es>
*/
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;
}
}

View file

@ -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;
}
}

View file

@ -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));

View file

@ -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);
}
}

View file

@ -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);

View file

@ -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);
/*

View file

@ -7,6 +7,7 @@
<machine code="machineA" name="name" description="desc">
<criterion-satisfaction-list>
<criterion-satisfaction
code="machineA-s1"
criterion-type-name="LOCATION_GROUP"
criterion-name="TestLocationGroupCriterion"
start-date="2009-01-01"
@ -14,9 +15,11 @@
</criterion-satisfaction-list>
<resources-cost-category-assignment-list>
<resources-cost-category-assignment
code="machineA-a1"
cost-category-name="TestCostCategory"
start-date="2001-01-01"/>
<resources-cost-category-assignment
code="machineA-a2"
cost-category-name="TestCostCategory"
start-date="2000-01-01"
end-date="2000-04-01"/>
@ -24,15 +27,17 @@
</machine>
<!-- [It assumes existence of "TestCalendar" and "TestCostCategory"] OK -->
<worker first-name="workerA" surname="surname" nif="nif"
<worker code="workerA" first-name="workerA" surname="surname" nif="nif"
calendar-name="TestCalendar">
<criterion-satisfaction-list>
<criterion-satisfaction
code="workerA-s1"
criterion-type-name="WORK_RELATIONSHIP"
criterion-name="hiredResourceWorkingRelationship"
start-date="2009-01-01"
end-date=""/>
<criterion-satisfaction
code="workerA-s2"
criterion-type-name="LEAVE"
criterion-name="paternityLeave"
start-date="2009-12-24"
@ -40,9 +45,11 @@
</criterion-satisfaction-list>
<resources-cost-category-assignment-list>
<resources-cost-category-assignment
code="workerA-a1"
cost-category-name="TestCostCategory"
start-date="2001-01-01"/>
<resources-cost-category-assignment
code="workerA-a2"
cost-category-name="TestCostCategory"
start-date="2000-01-01"
end-date="2000-04-01"/>

View file

@ -12,13 +12,11 @@
<!-- OK -->
<machine code="m1" name="m1-name" description="m1-desc"/>
<!-- Missing code and name (description is optional). -->
<machine code="" description=""/>
<!-- Criterion satisfaction of incorrect type. -->
<machine code="m2" name="m2-name" description="m2-desc">
<criterion-satisfaction-list>
<criterion-satisfaction
code="m2-a1"
criterion-type-name="WORK_RELATIONSHIP"
criterion-name="hiredResourceWorkingRelationship"
start-date="2009-01-01"
@ -37,9 +35,11 @@
<machine code="m5" name="m5-name" description="m5-desc">
<resources-cost-category-assignment-list>
<resources-cost-category-assignment
code="m5-a1"
cost-category-name="TestCostCategory"
start-date="2001-01-01"/>
<resources-cost-category-assignment
code="m5-a2"
cost-category-name="TestCostCategory"
start-date="2000-01-01"
end-date="2000-04-01"/>
@ -50,6 +50,7 @@
<machine code="m6" name="m6-name" description="m6-desc">
<resources-cost-category-assignment-list>
<resources-cost-category-assignment
code="m6-a1"
cost-category-name="TestCostCategory"
end-date="2000-01-01"/>
</resources-cost-category-assignment-list>
@ -59,6 +60,7 @@
<machine code="m7" name="m7-name" description="m7-desc">
<resources-cost-category-assignment-list>
<resources-cost-category-assignment
code="m7-a1"
cost-category-name="TestCostCategory"
start-date="2000-02-01"
end-date="2000-01-01"/>
@ -69,27 +71,34 @@
<machine code="m8" name="m8-name" description="m8-desc">
<resources-cost-category-assignment-list>
<resources-cost-category-assignment
code="m8-a1"
cost-category-name="TestCostCategory"
start-date="2000-02-01"
end-date="2000-05-01"/>
<resources-cost-category-assignment
code="m8-a2"
cost-category-name="TestCostCategory"
start-date="2000-01-01"
end-date="2000-03-01"/>
</resources-cost-category-assignment-list>
</machine>
<!-- Missing code and name (description is optional). -->
<machine code="" description=""/>
<!-- *** Workers *** -->
<!-- OK -->
<worker first-name="w1-firstName" surname="w1-surname" nif="w1-nif">
<worker code="w1" first-name="w1-firstName" surname="w1-surname" nif="w1-nif">
<criterion-satisfaction-list>
<criterion-satisfaction
code="w1-s1"
criterion-type-name="WORK_RELATIONSHIP"
criterion-name="hiredResourceWorkingRelationship"
start-date="2009-01-01"
end-date=""/>
<criterion-satisfaction
code="w1-s2"
criterion-type-name="LEAVE"
criterion-name="paternityLeave"
start-date="2009-12-24"
@ -97,13 +106,11 @@
</criterion-satisfaction-list>
</worker>
<!-- Missing first name, surname, and nif. -->
<worker first-name="" nif=""/>
<!-- Missing start date in criterion satisfaction. -->
<worker first-name="w2-firstName" surname="w2-surname" nif="w2-nif">
<worker code="w2" first-name="w2-firstName" surname="w2-surname" nif="w2-nif">
<criterion-satisfaction-list>
<criterion-satisfaction
code="w2-s1"
criterion-type-name="LEAVE"
criterion-name="paternityLeave"
end-date="2009-12-25"/>
@ -111,9 +118,10 @@
</worker>
<!-- Non-existent criterion type. -->
<worker first-name="w3-firstName" surname="w3-surname" nif="w3-nif">
<worker code="w3" first-name="w3-firstName" surname="w3-surname" nif="w3-nif">
<criterion-satisfaction-list>
<criterion-satisfaction
code="w3-s1"
criterion-type-name="WORK_RELATIONSHIP_XXX"
criterion-name="hiredResourceWorkingRelationship"
start-date="2009-01-01"
@ -122,9 +130,10 @@
</worker>
<!-- Non-existent criterion. -->
<worker first-name="w4-firstName" surname="w4-surname" nif="w4-nif">
<worker code="w4" first-name="w4-firstName" surname="w4-surname" nif="w4-nif">
<criterion-satisfaction-list>
<criterion-satisfaction
code="w4-s1"
criterion-type-name="WORK_RELATIONSHIP"
criterion-name="hiredResourceWorkingRelationshipXXX"
start-date="2009-01-01"
@ -133,9 +142,10 @@
</worker>
<!-- Criterion not specified. -->
<worker first-name="w5-firstName" surname="w5-surname" nif="w5-nif">
<worker code="w5" first-name="w5-firstName" surname="w5-surname" nif="w5-nif">
<criterion-satisfaction-list>
<criterion-satisfaction
code="w5-s1"
criterion-type-name="WORK_RELATIONSHIP"
start-date="2009-01-01"
end-date=""/>
@ -143,33 +153,35 @@
</worker>
<!-- Criterion type not specified. -->
<worker first-name="w6-firstName" surname="w6-surname" nif="w6-nif">
<worker code="w6" first-name="w6-firstName" surname="w6-surname" nif="w6-nif">
<criterion-satisfaction-list>
<criterion-satisfaction
code="w6-s1"
criterion-name="hiredResourceWorkingRelationship"
start-date="2009-01-01"
end-date=""/>
</criterion-satisfaction-list>
</worker>
<!-- Another worker is being imported with the same first name, surname,
and nif. -->
<worker first-name="w1-firstName" surname="w1-surname" nif="w1-nif"/>
<!-- Missing first name, surname, and nif. -->
<worker code="w7" first-name="" nif=""/>
<!-- OK or not OK depending on the existence of "TestCalendar". -->
<worker first-name="w8-firstName" surname="w8-surname" nif="w8-nif"
<worker code="w8" first-name="w8-firstName" surname="w8-surname" nif="w8-nif"
calendar-name="TestCalendar" />
<!-- [It assumes existence of "TestCalendar" and "TestCostCategory"] OK -->
<worker first-name="w9-firstName" surname="w9-surname" nif="w9-nif"
<worker code="w9" first-name="w9-firstName" surname="w9-surname" nif="w9-nif"
calendar-name="TestCalendar">
<criterion-satisfaction-list>
<criterion-satisfaction
code="w9-s1"
criterion-type-name="WORK_RELATIONSHIP"
criterion-name="hiredResourceWorkingRelationship"
start-date="2009-01-01"
end-date=""/>
<criterion-satisfaction
code="w9-s2"
criterion-type-name="LEAVE"
criterion-name="paternityLeave"
start-date="2009-12-24"
@ -177,9 +189,11 @@
</criterion-satisfaction-list>
<resources-cost-category-assignment-list>
<resources-cost-category-assignment
code="w9-a1"
cost-category-name="TestCostCategory"
start-date="2001-01-01"/>
<resources-cost-category-assignment
code="w9-a2"
cost-category-name="TestCostCategory"
start-date="2000-01-01"
end-date="2000-04-01"/>
@ -187,9 +201,10 @@
</worker>
<!-- Negative interval. -->
<worker first-name="w10-firstName" surname="w10-surname" nif="w10-nif">
<worker code="w10" first-name="w10-firstName" surname="w10-surname" nif="w10-nif">
<criterion-satisfaction-list>
<criterion-satisfaction
code="w10-s1"
criterion-type-name="LEAVE"
criterion-name="paternityLeave"
start-date="2000-02-01"
@ -198,14 +213,16 @@
</worker>
<!-- Criterion satisfaction overlapping in "LEAVE :: paternityLeave". -->
<worker first-name="w11-firstName" surname="w11-surname" nif="w11-nif">
<worker code="w11" first-name="w11-firstName" surname="w11-surname" nif="w11-nif">
<criterion-satisfaction-list>
<criterion-satisfaction
code="w11-s1"
criterion-type-name="LEAVE"
criterion-name="paternityLeave"
start-date="2000-01-01"
end-date="2000-02-01"/>
<criterion-satisfaction
code="w11-s2"
criterion-type-name="LEAVE"
criterion-name="paternityLeave"
start-date="2000-01-15"
@ -215,14 +232,16 @@
<!-- Criterion satisfaction overlapping (LEAVE does not allow
simultaneous criterion satisfactions in intervals that overlap). -->
<worker first-name="w12-firstName" surname="w12-surname" nif="w12-nif">
<worker code="w12" first-name="w12-firstName" surname="w12-surname" nif="w12-nif">
<criterion-satisfaction-list>
<criterion-satisfaction
code="w12-s1"
criterion-type-name="LEAVE"
criterion-name="paternityLeave"
start-date="2000-01-01"
end-date="2000-02-01"/>
<criterion-satisfaction
code="w12-s2"
criterion-type-name="LEAVE"
criterion-name="medicalLeave"
start-date="2000-01-15"
@ -234,14 +253,16 @@
"TestLocationGroupCriterion2"] OK
(LOCATION_GROUP allows simultaneous criterion satisfactions in
intervals that overlap). -->
<worker first-name="w13-firstName" surname="w13-surname" nif="w13-nif">
<worker code="w13" first-name="w13-firstName" surname="w13-surname" nif="w13-nif">
<criterion-satisfaction-list>
<criterion-satisfaction
code="w13-s1"
criterion-type-name="LOCATION_GROUP"
criterion-name="TestLocationGroupCriterion"
start-date="2000-01-01"
end-date="2000-02-01"/>
<criterion-satisfaction
code="w13-s2"
criterion-type-name="LOCATION_GROUP"
criterion-name="TestLocationGroupCriterion2"
start-date="2000-01-15"
@ -252,14 +273,16 @@
<!-- [It assumes existence of "TestLocationGroupCriterion" and
"TestLocationGroupCriterion2"] Criterion satisfaction overlapping in
"LOCATION_GROUP :: TestLocationGroupCriterion". -->
<worker first-name="w14-firstName" surname="w14-surname" nif="w14-nif">
<worker code="w14" first-name="w14-firstName" surname="w14-surname" nif="w14-nif">
<criterion-satisfaction-list>
<criterion-satisfaction
code="w14-s1"
criterion-type-name="LOCATION_GROUP"
criterion-name="TestLocationGroupCriterion"
start-date="2000-01-01"
end-date="2000-02-01"/>
<criterion-satisfaction
code="w14-s2"
criterion-type-name="LOCATION_GROUP"
criterion-name="TestLocationGroupCriterion"
start-date="2000-01-15"
@ -267,4 +290,8 @@
</criterion-satisfaction-list>
</worker>
<!-- Another worker is being imported with the same first name, surname,
and nif. -->
<worker code="w15" first-name="w1-firstName" surname="w1-surname" nif="w1-nif"/>
</resource-list>