ItEr40S12RFSoporteRecursosVirtuaisItEr39S12: Added unicity constraint validations

This commit is contained in:
Lorenzo Tilve 2009-12-24 14:18:06 +01:00 committed by Javier Moran Rua
parent 1651ccbc66
commit 117e5b9d51
11 changed files with 132 additions and 9 deletions

View file

@ -20,6 +20,7 @@
package org.navalplanner.business.calendars.entities;
import org.hibernate.validator.AssertTrue;
import org.joda.time.LocalDate;
import org.navalplanner.business.resources.entities.Resource;
@ -65,4 +66,9 @@ public class ResourceCalendar extends BaseCalendar {
return super.getWorkableHours(date);
}
@AssertTrue(message = "Capacity must be a positive integer number")
public boolean checkCapacityPositiveIntegerNumber() {
return (capacity >= 1);
}
}

View file

@ -32,6 +32,7 @@ import org.navalplanner.business.orders.daos.IOrderElementDAO;
import org.navalplanner.business.qualityforms.daos.IQualityFormDAO;
import org.navalplanner.business.resources.daos.ICriterionTypeDAO;
import org.navalplanner.business.resources.daos.IMachineDAO;
import org.navalplanner.business.resources.daos.IWorkerDAO;
import org.navalplanner.business.users.daos.IProfileDAO;
import org.navalplanner.business.users.daos.IUserDAO;
import org.navalplanner.business.workreports.daos.IWorkReportTypeDAO;
@ -100,6 +101,9 @@ public class Registry {
@Autowired
private IOrderElementDAO orderElementDAO;
@Autowired
private IWorkerDAO workerDAO;
private Registry() {
}
@ -167,4 +171,8 @@ public class Registry {
return getInstance().orderElementDAO;
}
public static IWorkerDAO getWorkerDAO() {
return getInstance().workerDAO;
}
}

View file

@ -46,7 +46,7 @@ public interface IWorkerDAO extends IGenericDAO<Worker, Long> {
* search worker by name(firstname or surname)/NIF
*
*/
List<Worker> findByNameOrNif(String name);
List<Worker> findByNameSubpartOrNifCaseInsensitive(String name);
/**
* Finds a {@link Worker} with the NIF param that should be unique.
@ -74,4 +74,38 @@ public interface IWorkerDAO extends IGenericDAO<Worker, Long> {
*/
List<HoursWorkedPerWorkerDTO> getWorkingHoursPerWorker(List<Worker> workers, Date startingDate, Date endingDate);
/**
* Return list of workers with a particular firstName
* @param name
* The string with the name searched
* @return The list of {@link Worker} entities found
*/
List<Worker> findByFirstNameCaseInsensitive(String name);
/**
* Return list of workers with a particular firstName when called from
* inside an external transaction
* @param name
* The string with the name searched
* @return The list of {@link Worker} entities found
*/
List<Worker> findByFirstNameAnotherTransactionCaseInsensitive(String name);
/**
* Return list of workers with a particular set of firstName, surname and
* nif values
* @param firstname
* String value for firstname
* @param surname
* String value for surname
* @param nif
* String value for nif
* @return The list of {@link Worker} entities found
*/
List<Worker> findByFirstNameSecondNameAndNif(String firstname,
String surname, String nif);
List<Worker> findByFirstNameSecondNameAndNifAnotherTransaction(
String firstname, String surname, String nif);
}

View file

@ -33,6 +33,7 @@ import org.navalplanner.business.resources.entities.Worker;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
@ -69,15 +70,47 @@ public class WorkerDAO extends GenericDAOHibernate<Worker, Long>
@SuppressWarnings("unchecked")
@Override
public List<Worker> findByNameOrNif(String name) {
public List<Worker> findByNameSubpartOrNifCaseInsensitive(String name) {
String containsName = "%" + name + "%";
return getSession().createCriteria(Worker.class).add(
return getSession().createCriteria(Worker.class)
.add(
Restrictions.or(Restrictions.or(Restrictions.ilike(
"firstName", containsName), Restrictions.ilike(
"surname", containsName)), Restrictions.like(
"nif", containsName))).list();
}
@SuppressWarnings("unchecked")
@Override
public List<Worker> findByFirstNameCaseInsensitive(String name) {
return getSession().createCriteria(Worker.class).add(
Restrictions.ilike("firstName", name)).list();
}
@Override
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
public List<Worker> findByFirstNameAnotherTransactionCaseInsensitive(String name) {
return findByFirstNameCaseInsensitive(name);
}
@SuppressWarnings("unchecked")
@Override
public List<Worker> findByFirstNameSecondNameAndNif(String firstname,
String secondname, String nif) {
return getSession().createCriteria(Worker.class).add(
Restrictions.and(Restrictions.ilike("firstName", firstname),
Restrictions.and(Restrictions.ilike("surname",
secondname), Restrictions.like("nif", nif))))
.list();
}
@Override
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
public List<Worker> findByFirstNameSecondNameAndNifAnotherTransaction(
String firstname, String secondname, String nif) {
return findByFirstNameSecondNameAndNif(firstname, secondname, nif);
}
@Override
@Transactional(readOnly = true)
public List<HoursWorkedPerWorkerDTO> getWorkingHoursPerWorker(List<Worker> workers, Date startingDate, Date endingDate) {

View file

@ -20,6 +20,11 @@
package org.navalplanner.business.resources.entities;
import java.util.List;
import org.hibernate.validator.AssertTrue;
import org.navalplanner.business.common.Registry;
/**
* This class models a VirtualWorker.
@ -67,4 +72,19 @@ public class VirtualWorker extends Worker {
this.observations = observations;
}
@AssertTrue(message = "Virtual worker group name must be unique")
public boolean checkConstraintUniqueVirtualGroupName() {
List<Worker> list = Registry.getWorkerDAO()
.findByFirstNameAnotherTransactionCaseInsensitive(
this.getFirstName());
if ((isNewObject() && list.isEmpty()) || list.isEmpty()) {
return true;
} else {
return list.get(0).getId().equals(getId());
}
}
}

View file

@ -21,8 +21,12 @@
package org.navalplanner.business.resources.entities;
import java.util.List;
import org.hibernate.validator.AssertTrue;
import org.hibernate.validator.NotEmpty;
import org.hibernate.validator.NotNull;
import org.navalplanner.business.common.Registry;
/**
* This class models a worker.
@ -111,4 +115,23 @@ public class Worker extends Resource {
return !isVirtual();
}
@AssertTrue(message = "Worker with the same firstname, surname and nif previously existed")
public boolean checkConstraintUniqueFirstName() {
if (this instanceof VirtualWorker) {
return true;
}
List<Worker> list = Registry.getWorkerDAO()
.findByFirstNameSecondNameAndNifAnotherTransaction(firstName,
surname, nif);
if ((isNewObject() && list.isEmpty()) || list.isEmpty()) {
return true;
} else {
return list.get(0).getId().equals(getId());
}
}
}

View file

@ -33,7 +33,7 @@
<joined-subclass name="ResourceCalendar">
<key column="BASE_CALENDAR_ID" />
<property name="capacity" />
<property name="capacity" not-null="true" />
</joined-subclass>
</class>

View file

@ -107,7 +107,7 @@ public class ResourceSearchModel implements IResourceSearchModel {
if (emptyName) {
return new ArrayList<Resource>(resourcesMatchingCriterions);
}
Set<Resource> result = intersect(workerDAO.findByNameOrNif(name),
Set<Resource> result = intersect(workerDAO.findByNameSubpartOrNifCaseInsensitive(name),
resourcesMatchingCriterions);
result.addAll(intersect(machineDAO.findByNameOrCode(name),
resourcesMatchingCriterions));

View file

@ -523,7 +523,6 @@ public class WorkerModel implements IWorkerModel {
public void setCapacity(Integer capacity) {
if (getCalendar() != null) {
getCalendar().setCapacity(capacity);
System.out.println("not null" + getCalendar().getCapacity());
}
}

View file

@ -62,7 +62,7 @@
</row>
<row visible="@{controller.isVirtualWorker}">
<label value="${i18n:_('Capacity')}" />
<intbox value="@{controller.virtualWorkerCapacity}" width="100px" constraint="no negative,no zero" />
<intbox value="@{controller.virtualWorkerCapacity}" width="100px" constraint="no negative,no zero,no empty" />
</row>
<row visible="@{controller.isVirtualWorker}">
<label value="${i18n:_('Observations')}" />

View file

@ -71,9 +71,9 @@ public class WorkerModelTest {
workerModel.save();
}
@Test(expected = ValidationException.class)
@Test(expected = IllegalStateException.class)
public void testWorkerInvalid() throws ValidationException,
InstanceNotFoundException {
InstanceNotFoundException, IllegalStateException {
IResourceDAO resourceDAOMock = createMock(IResourceDAO.class);
ICriterionDAO criterionServiceMock = createMock(ICriterionDAO.class);