ItEr37S12CUAdministracionCategoriaCosteItEr36S14: implemented the relation between ResourcesCostCategoryAssignment and Resource

The relation was implemented in both sides.
A test has been added to check the navigation.
DAO.remove() method was overwritten to "cut" the relation before
removing (otherwise, a exception is thrown).
This commit is contained in:
Jacobo Aragunde Pérez 2009-12-04 20:05:25 +01:00 committed by Javier Moran Rua
parent 359022813f
commit 25c192f713
7 changed files with 82 additions and 0 deletions

View file

@ -21,6 +21,7 @@
package org.navalplanner.business.costcategories.daos;
import org.navalplanner.business.common.daos.GenericDAOHibernate;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.navalplanner.business.costcategories.entities.ResourcesCostCategoryAssignment;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
@ -34,4 +35,17 @@ import org.springframework.stereotype.Repository;
public class ResourcesCostCategoryAssignmentDAO extends
GenericDAOHibernate<ResourcesCostCategoryAssignment, Long> implements
IResourcesCostCategoryAssignmentDAO {
@Override
public void remove(Long id) throws InstanceNotFoundException {
try {
ResourcesCostCategoryAssignment assignment = find(id);
assignment.getResource().removeResourcesCostCategoryAssignment(assignment);
}
catch(InstanceNotFoundException e) {
//it was already deleted from its parent
//we do nothing
}
super.remove(id);
}
}

View file

@ -23,6 +23,7 @@ package org.navalplanner.business.costcategories.entities;
import org.hibernate.validator.NotNull;
import org.joda.time.LocalDate;
import org.navalplanner.business.common.BaseEntity;
import org.navalplanner.business.resources.entities.Resource;
/**
* @author Jacobo Aragunde Perez <jaragunde@igalia.com>
@ -37,6 +38,9 @@ public class ResourcesCostCategoryAssignment extends BaseEntity {
@NotNull
private CostCategory costCategory;
@NotNull
private Resource resource;
// Default constructor, needed by Hibernate
protected ResourcesCostCategoryAssignment() {
@ -69,4 +73,19 @@ public class ResourcesCostCategoryAssignment extends BaseEntity {
public void setCostCategory(CostCategory category) {
this.costCategory = category;
}
public Resource getResource() {
return resource;
}
public void setResource(Resource resource) {
Resource oldResource = this.resource;
this.resource = resource;
if(oldResource!=null)
oldResource.removeResourcesCostCategoryAssignment(this);
if(resource!=null &&
!resource.getResourcesCostCategoryAssignments().contains(this)) {
resource.addResourcesCostCategoryAssignment(this);
}
}
}

View file

@ -40,6 +40,7 @@ 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.exceptions.ValidationException;
import org.navalplanner.business.costcategories.entities.ResourcesCostCategoryAssignment;
import org.navalplanner.business.planner.entities.DayAssignment;
// FIXME: Alternatively, Resource can be modeled with the style:
@ -54,6 +55,7 @@ import org.navalplanner.business.planner.entities.DayAssignment;
* This class acts as the base class for all resources.
* @author Fernando Bellas Permuy <fbellas@udc.es>
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
* @author Jacobo Aragunde Perez <jaragunde@igalia.com>
*/
public abstract class Resource extends BaseEntity{
@ -65,6 +67,9 @@ public abstract class Resource extends BaseEntity{
private Map<LocalDate, List<DayAssignment>> assignmentsByDayCached = null;
private Set<ResourcesCostCategoryAssignment> resourcesCostCategoryAssignments =
new HashSet<ResourcesCostCategoryAssignment>();
private void clearCachedData() {
assignmentsByDayCached = null;
}
@ -727,4 +732,19 @@ public abstract class Resource extends BaseEntity{
return compositedCriterion.isSatisfiedBy(this);
}
public Set<ResourcesCostCategoryAssignment> getResourcesCostCategoryAssignments() {
return resourcesCostCategoryAssignments;
}
public void addResourcesCostCategoryAssignment(ResourcesCostCategoryAssignment assignment) {
resourcesCostCategoryAssignments.add(assignment);
if(assignment.getResource()!=this)
assignment.setResource(this);
}
public void removeResourcesCostCategoryAssignment(ResourcesCostCategoryAssignment assignment) {
resourcesCostCategoryAssignments.remove(assignment);
if(assignment.getResource()==this)
assignment.setResource(null);
}
}

View file

@ -76,5 +76,7 @@
<many-to-one name="costCategory" class="CostCategory" column="COST_CATEGORY_ID"/>
<many-to-one name="resource" class="org.navalplanner.business.resources.entities.Resource" column="RESOURCE_ID"/>
</class>
</hibernate-mapping>

View file

@ -26,6 +26,11 @@
class="org.navalplanner.business.calendars.entities.ResourceCalendar"
unique="true" />
<set name="resourcesCostCategoryAssignments" inverse="true" cascade="all-delete-orphan">
<key column="RESOURCE_ID"/>
<one-to-many class="org.navalplanner.business.costcategories.entities.ResourcesCostCategoryAssignment"/>
</set>
<joined-subclass name="org.navalplanner.business.resources.entities.Worker">
<key column="WORKER_ID"/>
<property name="firstName"/>

View file

@ -38,6 +38,9 @@ import org.navalplanner.business.costcategories.daos.ICostCategoryDAO;
import org.navalplanner.business.costcategories.daos.IResourcesCostCategoryAssignmentDAO;
import org.navalplanner.business.costcategories.entities.CostCategory;
import org.navalplanner.business.costcategories.entities.ResourcesCostCategoryAssignment;
import org.navalplanner.business.resources.daos.IWorkerDAO;
import org.navalplanner.business.resources.entities.Resource;
import org.navalplanner.business.resources.entities.Worker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ -61,6 +64,9 @@ public class ResourcesCostCategoryAssignmentDAOTest {
@Autowired
ICostCategoryDAO costCategoryDAO;
@Autowired
IWorkerDAO workerDAO;
@Test
public void testInSpringContainer() {
assertNotNull(resourcesCostCategoryAssignmentDAO);
@ -69,10 +75,13 @@ public class ResourcesCostCategoryAssignmentDAOTest {
private ResourcesCostCategoryAssignment createValidResourcesCostCategoryAssignment() {
CostCategory costCategory = createValidCostCategory();
costCategoryDAO.save(costCategory);
Worker worker = createValidWorker();
workerDAO.save(worker);
ResourcesCostCategoryAssignment assignment = ResourcesCostCategoryAssignment.create();
assignment.setInitDate(new LocalDate());
assignment.setCostCategory(costCategory);
assignment.setResource(worker);
return assignment;
}
@ -81,6 +90,11 @@ public class ResourcesCostCategoryAssignmentDAOTest {
return costCategory;
}
private Worker createValidWorker() {
return Worker.create(UUID.randomUUID().toString(),
UUID.randomUUID().toString(), UUID.randomUUID().toString());
}
@Test
public void testSaveResourcesCostCategoryAssignment() {
ResourcesCostCategoryAssignment assignment = createValidResourcesCostCategoryAssignment();
@ -109,7 +123,12 @@ public class ResourcesCostCategoryAssignmentDAOTest {
public void testNavigateRelations() {
ResourcesCostCategoryAssignment assignment = createValidResourcesCostCategoryAssignment();
resourcesCostCategoryAssignmentDAO.save(assignment);
Resource resource = assignment.getResource();
assertTrue(costCategoryDAO.list(CostCategory.class).contains(assignment.getCostCategory()));
assertTrue(resource.getResourcesCostCategoryAssignments().contains(assignment));
assignment.setResource(null);
assertFalse(resource.getResourcesCostCategoryAssignments().contains(assignment));
}
}

View file

@ -66,6 +66,9 @@
<value>
org/navalplanner/business/users/entities/Users.hbm.xml
</value>
<value>
org/navalplanner/business/costcategories/entities/CostCategories.hbm.xml
</value>
</list>
</property>