From 36a8654bdd05383a2a0c8c720a6bc48cb46e867a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Tue, 7 Jul 2009 21:37:11 +0200 Subject: [PATCH] ItEr16S12CreacionProxectoPlanificacion: Creating hibernate mappings, service, dao classes and associated tests. Moving entities test classes to the right package. --- .../planner/daos/ITaskElementDao.java | 11 ++ .../business/planner/daos/TaskElementDao.java | 17 +++ .../business/planner/entities/Dependency.java | 12 ++ .../business/planner/entities/Task.java | 2 + .../planner/entities/TaskElement.java | 13 ++ .../planner/services/ITaskElementService.java | 14 ++ .../planner/services/TaskElementService.java | 37 +++++ .../navalplanner-business-spring-config.xml | 3 + .../business/planner/entities/Tasks.hbm.xml | 53 +++++++ .../{ => entities}/DependencyTest.java | 2 +- .../{ => entities}/TaskElementTest.java | 2 +- .../planner/{ => entities}/TaskGroupTest.java | 2 +- .../test/planner/{ => entities}/TaskTest.java | 2 +- .../services/TaskElementServiceTest.java | 129 ++++++++++++++++++ ...valplanner-business-spring-config-test.xml | 3 + 15 files changed, 298 insertions(+), 4 deletions(-) create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ITaskElementDao.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/TaskElementDao.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/planner/services/ITaskElementService.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/planner/services/TaskElementService.java create mode 100644 navalplanner-business/src/main/resources/org/navalplanner/business/planner/entities/Tasks.hbm.xml rename navalplanner-business/src/test/java/org/navalplanner/business/test/planner/{ => entities}/DependencyTest.java (97%) rename navalplanner-business/src/test/java/org/navalplanner/business/test/planner/{ => entities}/TaskElementTest.java (97%) rename navalplanner-business/src/test/java/org/navalplanner/business/test/planner/{ => entities}/TaskGroupTest.java (96%) rename navalplanner-business/src/test/java/org/navalplanner/business/test/planner/{ => entities}/TaskTest.java (95%) create mode 100644 navalplanner-business/src/test/java/org/navalplanner/business/test/planner/services/TaskElementServiceTest.java diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ITaskElementDao.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ITaskElementDao.java new file mode 100644 index 000000000..3e1e93656 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/ITaskElementDao.java @@ -0,0 +1,11 @@ +package org.navalplanner.business.planner.daos; + +import org.navalplanner.business.common.daos.IGenericDao; +import org.navalplanner.business.planner.entities.TaskElement; + +/** + * @author Óscar González Fernández + */ +public interface ITaskElementDao extends IGenericDao { + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/TaskElementDao.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/TaskElementDao.java new file mode 100644 index 000000000..03e89a273 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/daos/TaskElementDao.java @@ -0,0 +1,17 @@ +package org.navalplanner.business.planner.daos; + +import org.navalplanner.business.common.daos.impl.GenericDaoHibernate; +import org.navalplanner.business.planner.entities.TaskElement; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Repository; + +/** + * @author Óscar González Fernández + */ +@Repository +@Scope(BeanDefinition.SCOPE_SINGLETON) +public class TaskElementDao extends GenericDaoHibernate + implements ITaskElementDao { + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Dependency.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Dependency.java index d98a83e2b..58083fbb7 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Dependency.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Dependency.java @@ -19,6 +19,10 @@ public class Dependency { return dependency; } + private Long id; + + private Long version; + private TaskElement origin; private TaskElement destination; @@ -53,4 +57,12 @@ public class Dependency { public Type getType() { return type; } + + public Long getId() { + return id; + } + + public Long getVersion() { + return version; + } } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java index 9adf6c86f..5dc03afe1 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java @@ -1,6 +1,7 @@ package org.navalplanner.business.planner.entities; import org.apache.commons.lang.Validate; +import org.hibernate.validator.NotNull; import org.navalplanner.business.orders.entities.HoursGroup; /** @@ -12,6 +13,7 @@ public class Task extends TaskElement { return new Task(hoursGroup); } + @NotNull private HoursGroup hoursGroup; /** diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java index 45d1cf83d..e5e57c205 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java @@ -12,6 +12,11 @@ import org.navalplanner.business.orders.entities.OrderElement; * @author Óscar González Fernández */ public abstract class TaskElement { + + private Long id; + + private Long version; + private Date startDate; private Date endDate; @@ -68,4 +73,12 @@ public abstract class TaskElement { } } + public Long getVersion() { + return version; + } + + public Long getId() { + return id; + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/ITaskElementService.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/ITaskElementService.java new file mode 100644 index 000000000..4144eb46c --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/ITaskElementService.java @@ -0,0 +1,14 @@ +package org.navalplanner.business.planner.services; + +import org.navalplanner.business.planner.entities.TaskElement; + +/** + * @author Óscar González Fernández + */ +public interface ITaskElementService { + + void save(TaskElement task); + + TaskElement findById(Long id); + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/TaskElementService.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/TaskElementService.java new file mode 100644 index 000000000..580eff280 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/TaskElementService.java @@ -0,0 +1,37 @@ +package org.navalplanner.business.planner.services; + +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.planner.daos.ITaskElementDao; +import org.navalplanner.business.planner.entities.TaskElement; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author Óscar González Fernández + */ +@Service +@Scope(BeanDefinition.SCOPE_SINGLETON) +@Transactional +public class TaskElementService implements ITaskElementService { + + @Autowired + private ITaskElementDao taskElementDao; + + @Override + public void save(TaskElement task) { + taskElementDao.save(task); + } + + @Override + public TaskElement findById(Long id) { + try { + return taskElementDao.find(id); + } catch (InstanceNotFoundException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml b/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml index 49673e414..9cd482d7f 100644 --- a/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml +++ b/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml @@ -26,6 +26,9 @@ org/navalplanner/business/orders/entities/Orders.hbm.xml + + org/navalplanner/business/planner/entities/Tasks.hbm.xml + diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/planner/entities/Tasks.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/planner/entities/Tasks.hbm.xml new file mode 100644 index 000000000..efc21eb55 --- /dev/null +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/planner/entities/Tasks.hbm.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.navalplanner.business.planner.entities.Dependency$Type + + + + + \ No newline at end of file diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/DependencyTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/DependencyTest.java similarity index 97% rename from navalplanner-business/src/test/java/org/navalplanner/business/test/planner/DependencyTest.java rename to navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/DependencyTest.java index 4644defdb..32ae0b68f 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/DependencyTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/DependencyTest.java @@ -1,4 +1,4 @@ -package org.navalplanner.business.test.planner; +package org.navalplanner.business.test.planner.entities; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertFalse; diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskElementTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskElementTest.java similarity index 97% rename from navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskElementTest.java rename to navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskElementTest.java index d44d536b7..5416cecdc 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskElementTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskElementTest.java @@ -1,4 +1,4 @@ -package org.navalplanner.business.test.planner; +package org.navalplanner.business.test.planner.entities; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertSame; diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskGroupTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskGroupTest.java similarity index 96% rename from navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskGroupTest.java rename to navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskGroupTest.java index acbc58b9b..7b292c3a6 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskGroupTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskGroupTest.java @@ -1,4 +1,4 @@ -package org.navalplanner.business.test.planner; +package org.navalplanner.business.test.planner.entities; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskTest.java similarity index 95% rename from navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskTest.java rename to navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskTest.java index 70de8019d..4d5e57c4f 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskTest.java @@ -1,4 +1,4 @@ -package org.navalplanner.business.test.planner; +package org.navalplanner.business.test.planner.entities; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertNotNull; diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/services/TaskElementServiceTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/services/TaskElementServiceTest.java new file mode 100644 index 000000000..e79fe98dc --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/services/TaskElementServiceTest.java @@ -0,0 +1,129 @@ +package org.navalplanner.business.test.planner.services; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; +import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE; + +import java.util.List; + +import org.hibernate.SessionFactory; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.navalplanner.business.orders.entities.HoursGroup; +import org.navalplanner.business.planner.entities.Dependency; +import org.navalplanner.business.planner.entities.Task; +import org.navalplanner.business.planner.entities.TaskElement; +import org.navalplanner.business.planner.entities.TaskGroup; +import org.navalplanner.business.planner.entities.Dependency.Type; +import org.navalplanner.business.planner.services.ITaskElementService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author Óscar González Fernández + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, + BUSINESS_SPRING_CONFIG_TEST_FILE }) +@Transactional +public class TaskElementServiceTest { + + @Autowired + private ITaskElementService taskElementService; + + @Autowired + private SessionFactory sessionFactory; + + @Test + public void canSaveTask() { + Task task = createValidTask(); + taskElementService.save(task); + flushAndEvict(task); + TaskElement fromDB = taskElementService.findById(task.getId()); + assertThat(fromDB.getId(), equalTo(task.getId())); + assertThat(fromDB, is(Task.class)); + checkProperties(task, fromDB); + } + + private Task createValidTask() { + return Task.createTask(new HoursGroup()); + } + + @Test + public void afterSavingTheVersionIsIncreased() { + Task task = createValidTask(); + assertNull(task.getVersion()); + taskElementService.save(task); + assertNotNull(task.getVersion()); + } + + @Test + public void canSaveTaskGroup() { + TaskGroup taskGroup = new TaskGroup(); + taskElementService.save(taskGroup); + flushAndEvict(taskGroup); + TaskElement reloaded = taskElementService.findById(taskGroup.getId()); + assertThat(reloaded.getId(), equalTo(taskGroup.getId())); + assertThat(reloaded, is(TaskGroup.class)); + checkProperties(taskGroup, reloaded); + } + + private void checkProperties(TaskElement inMemory, TaskElement fromDB) { + assertThat(fromDB.getStartDate(), equalTo(inMemory.getStartDate())); + assertThat(fromDB.getEndDate(), equalTo(inMemory.getEndDate())); + } + + private void flushAndEvict(Object entity) { + sessionFactory.getCurrentSession().flush(); + sessionFactory.getCurrentSession().evict(entity); + } + + @Test + public void savingGroupSavesAssociatedTaskElements() { + Task child1 = createValidTask(); + Task child2 = createValidTask(); + TaskGroup taskGroup = new TaskGroup(); + taskGroup.addTaskElement(child1); + taskGroup.addTaskElement(child2); + taskElementService.save(taskGroup); + flushAndEvict(taskGroup); + TaskGroup reloaded = (TaskGroup) taskElementService.findById(taskGroup + .getId()); + List taskElements = reloaded.getTaskElements(); + assertThat(taskElements.size(), equalTo(2)); + assertThat(taskElements.get(0).getId(), equalTo(child1.getId())); + assertThat(taskElements.get(1).getId(), equalTo(child2.getId())); + + } + + @Test + public void savingTaskElementSavesAssociatedDependencies() { + Task child1 = createValidTask(); + Task child2 = createValidTask(); + TaskGroup taskGroup = new TaskGroup(); + taskGroup.addTaskElement(child1); + taskGroup.addTaskElement(child2); + Dependency dependency = Dependency.createDependency(child1, child2, + Type.START_END); + taskElementService.save(taskGroup); + flushAndEvict(taskGroup); + TaskGroup reloaded = (TaskGroup) taskElementService.findById(taskGroup + .getId()); + assertThat(reloaded.getTaskElements().get(0) + .getDependenciesWithThisOrigin().size(), equalTo(1)); + assertTrue(reloaded.getTaskElements().get(0) + .getDependenciesWithThisDestination().isEmpty()); + + assertThat(reloaded.getTaskElements().get(1) + .getDependenciesWithThisDestination().size(), equalTo(1)); + assertTrue(reloaded.getTaskElements().get(1) + .getDependenciesWithThisOrigin().isEmpty()); + } +} diff --git a/navalplanner-business/src/test/resources/navalplanner-business-spring-config-test.xml b/navalplanner-business/src/test/resources/navalplanner-business-spring-config-test.xml index adcc5daf8..c74d6dc69 100644 --- a/navalplanner-business/src/test/resources/navalplanner-business-spring-config-test.xml +++ b/navalplanner-business/src/test/resources/navalplanner-business-spring-config-test.xml @@ -36,6 +36,9 @@ org/navalplanner/business/orders/entities/Orders.hbm.xml + + + org/navalplanner/business/planner/entities/Tasks.hbm.xml TestEntities.hbm.xml