diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/OnTransaction.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/OnTransaction.java new file mode 100644 index 000000000..8312799f2 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/OnTransaction.java @@ -0,0 +1,9 @@ +package org.navalplanner.business.common; + +/** + * Represents some work done inside a transaction
+ * @author oscar @param + */ +public interface OnTransaction { + public T execute(); +} \ No newline at end of file diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/CriterionService.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/CriterionService.java index 7131e5882..47f7fd15e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/CriterionService.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/CriterionService.java @@ -4,6 +4,7 @@ import java.util.Collection; import java.util.Date; import java.util.List; +import org.navalplanner.business.common.OnTransaction; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionSatisfaction; @@ -48,10 +49,6 @@ public interface CriterionService { Criterion load(Criterion criterion); - interface OnTransaction { - public T execute(); - } - T onTransaction(OnTransaction onTransaction); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionServiceImpl.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionServiceImpl.java index e812f74f2..96bbde5fd 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionServiceImpl.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/CriterionServiceImpl.java @@ -6,6 +6,7 @@ import java.util.Date; import java.util.List; import org.apache.commons.lang.Validate; +import org.navalplanner.business.common.OnTransaction; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.resources.daos.ICriterionDAO; import org.navalplanner.business.resources.daos.impl.CriterionDAO; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/ActivityWork.java b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/ActivityWork.java new file mode 100644 index 000000000..843f16589 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/ActivityWork.java @@ -0,0 +1,24 @@ +package org.navalplanner.business.workorders.entities; + +import org.hibernate.validator.NotNull; + +public class ActivityWork { + + private Long id; + + public Long getId() { + return id; + } + + @NotNull + private Integer workingHours; + + public void setWorkingHours(Integer workingHours) { + this.workingHours = workingHours; + } + + public int getWorkingHours() { + return workingHours; + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/ProjectWork.java b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/ProjectWork.java index c71c7d372..6c33a431f 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/ProjectWork.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/ProjectWork.java @@ -1,6 +1,10 @@ package org.navalplanner.business.workorders.entities; +import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import org.hibernate.validator.NotEmpty; import org.hibernate.validator.NotNull; @@ -34,6 +38,8 @@ public class ProjectWork { // TODO turn into a many to one relationship when Customer entity is defined private String customer; + private Set taskWorks = new HashSet(); + public Long getId() { return id; } @@ -94,4 +100,12 @@ public class ProjectWork { return endDate != null && endDate.before(initDate); } + public void add(TaskWork task) { + taskWorks.add(task); + } + + public List getTaskWorks() { + return new ArrayList(taskWorks); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/TaskWork.java b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/TaskWork.java new file mode 100644 index 000000000..6a37c3b93 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/TaskWork.java @@ -0,0 +1,58 @@ +package org.navalplanner.business.workorders.entities; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.hibernate.validator.NotNull; + +public abstract class TaskWork { + private long id; + + @NotNull + private String name; + + private Date initDate; + + private Date endDate; + + private Set activityWorks = new HashSet(); + + public int getWorkHours() { + int result = 0; + Set a = activityWorks; + for (ActivityWork activityWork : a) { + result += activityWork.getWorkingHours(); + } + return result; + } + + public void addActivity(ActivityWork activityWork) { + activityWorks.add(activityWork); + } + + public List getActivities() { + return new ArrayList(activityWorks); + } + + public long getId() { + return id; + } + + /** + * @return the duration in milliseconds + */ + public long getDuration() { + return endDate.getTime() - initDate.getTime(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/TaskWorkContainer.java b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/TaskWorkContainer.java new file mode 100644 index 000000000..38e081806 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/TaskWorkContainer.java @@ -0,0 +1,20 @@ +package org.navalplanner.business.workorders.entities; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class TaskWorkContainer extends TaskWork { + + private Set children = new HashSet(); + + public List getChildren() { + return new ArrayList(children); + } + + public void addTask(TaskWorkLeaf leaf) { + children.add(leaf); + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/TaskWorkLeaf.java b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/TaskWorkLeaf.java new file mode 100644 index 000000000..f7cbb6baa --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/entities/TaskWorkLeaf.java @@ -0,0 +1,4 @@ +package org.navalplanner.business.workorders.entities; + +public class TaskWorkLeaf extends TaskWork { +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workorders/services/IProjectWorkService.java b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/services/IProjectWorkService.java index 6e7db2ba3..90b7dbafd 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/workorders/services/IProjectWorkService.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/services/IProjectWorkService.java @@ -2,6 +2,7 @@ package org.navalplanner.business.workorders.services; import java.util.List; +import org.navalplanner.business.common.OnTransaction; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.workorders.entities.ProjectWork; @@ -22,4 +23,6 @@ public interface IProjectWorkService { ProjectWork find(Long workerId) throws InstanceNotFoundException; + public T onTransaction(OnTransaction onTransaction); + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workorders/services/ProjectWorkService.java b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/services/ProjectWorkService.java index 650b00515..3706ab39a 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/workorders/services/ProjectWorkService.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workorders/services/ProjectWorkService.java @@ -4,6 +4,7 @@ import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; +import org.navalplanner.business.common.OnTransaction; import org.navalplanner.business.common.daos.impl.GenericDaoHibernate; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; @@ -70,4 +71,9 @@ public class ProjectWorkService implements IProjectWorkService { dao.remove(projectWork.getId()); } + @Override + public T onTransaction(OnTransaction onTransaction) { + return onTransaction.execute(); + } + } 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 760900fee..b123d34ac 100644 --- a/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml +++ b/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml @@ -24,7 +24,7 @@ org/navalplanner/business/resources/entities/Resources.hbm.xml - org/navalplanner/business/resources/entities/WorkOrders.hbm.xml + org/navalplanner/business/workorders/entities/WorkOrders.hbm.xml diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/WorkOrders.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/WorkOrders.hbm.xml deleted file mode 100644 index f6c5dab2b..000000000 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/resources/entities/WorkOrders.hbm.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/workorders/entities/WorkOrders.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/workorders/entities/WorkOrders.hbm.xml new file mode 100644 index 000000000..974c7d57e --- /dev/null +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/workorders/entities/WorkOrders.hbm.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/CriterionServiceTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/CriterionServiceTest.java index dc2f18222..b3653d38d 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/CriterionServiceTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/CriterionServiceTest.java @@ -8,6 +8,7 @@ import org.hibernate.validator.InvalidStateException; import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; +import org.navalplanner.business.common.OnTransaction; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionSatisfaction; @@ -21,7 +22,6 @@ import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.business.resources.services.CriterionService; import org.navalplanner.business.resources.services.ResourceService; -import org.navalplanner.business.resources.services.CriterionService.OnTransaction; import org.navalplanner.business.test.resources.daos.CriterionDAOTest; import org.navalplanner.business.test.resources.daos.CriterionSatisfactionDAOTest; import org.navalplanner.business.test.resources.entities.ResourceTest; diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/workorders/entities/ProjectWorkTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/workorders/entities/ProjectWorkTest.java new file mode 100644 index 000000000..a9ebe84c6 --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/workorders/entities/ProjectWorkTest.java @@ -0,0 +1,26 @@ +package org.navalplanner.business.test.workorders.entities; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +import org.junit.Test; +import org.navalplanner.business.workorders.entities.ProjectWork; +import org.navalplanner.business.workorders.entities.TaskWorkContainer; +import org.navalplanner.business.workorders.entities.TaskWorkLeaf; + +/** + * Tests for {@link ProjectWork}.
+ * @author Óscar González Fernández + */ +public class ProjectWorkTest { + + @Test + public void testAddingTaskWork() throws Exception { + ProjectWork projectWork = new ProjectWork(); + TaskWorkContainer container = new TaskWorkContainer(); + TaskWorkLeaf leaf = new TaskWorkLeaf(); + container.addTask(leaf); + projectWork.add(container); + assertThat(projectWork.getTaskWorks().size(), equalTo(1)); + } +} diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/workorders/services/ProjectWorkServiceTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/workorders/services/ProjectWorkServiceTest.java index 27f9e7f36..208ba0ee5 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/workorders/services/ProjectWorkServiceTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/workorders/services/ProjectWorkServiceTest.java @@ -1,18 +1,5 @@ package org.navalplanner.business.test.workorders.services; -import java.util.List; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.navalplanner.business.common.exceptions.ValidationException; -import org.navalplanner.business.test.resources.daos.CriterionSatisfactionDAOTest; -import org.navalplanner.business.workorders.entities.ProjectWork; -import org.navalplanner.business.workorders.services.IProjectWorkService; -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; - import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertFalse; @@ -21,6 +8,26 @@ 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.junit.Test; +import org.junit.runner.RunWith; +import org.navalplanner.business.common.OnTransaction; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.business.test.resources.daos.CriterionSatisfactionDAOTest; +import org.navalplanner.business.workorders.entities.ActivityWork; +import org.navalplanner.business.workorders.entities.ProjectWork; +import org.navalplanner.business.workorders.entities.TaskWork; +import org.navalplanner.business.workorders.entities.TaskWorkContainer; +import org.navalplanner.business.workorders.entities.TaskWorkLeaf; +import org.navalplanner.business.workorders.services.IProjectWorkService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.NotTransactional; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + /** * Tests for {@link ProjectWork}.
* @author Óscar González Fernández @@ -83,4 +90,43 @@ public class ProjectWorkServiceTest { assertThat(projectWorkService.find(projectWork.getId()), notNullValue()); } + @Test + @NotTransactional + public void testAddingTaskWork() throws Exception { + final ProjectWork projectWork = createValidProjectWork(); + TaskWorkContainer container = new TaskWorkContainer(); + container.setName("bla"); + TaskWorkLeaf leaf = new TaskWorkLeaf(); + leaf.setName("leaf"); + container.addTask(leaf); + projectWork.add(container); + ActivityWork activityWork = new ActivityWork(); + activityWork.setWorkingHours(3); + leaf.addActivity(activityWork); + projectWorkService.save(projectWork); + projectWorkService.onTransaction(new OnTransaction() { + + @Override + public Void execute() { + try { + ProjectWork reloaded = projectWorkService.find(projectWork + .getId()); + assertFalse(projectWork == reloaded); + assertThat(reloaded.getTaskWorks().size(), equalTo(1)); + TaskWorkContainer containerReloaded = (TaskWorkContainer) reloaded + .getTaskWorks().get(0); + assertThat(containerReloaded.getActivities().size(), + equalTo(0)); + assertThat(containerReloaded.getChildren().size(), + equalTo(1)); + TaskWork leaf = containerReloaded.getChildren().get(0); + assertThat(leaf.getActivities().size(), equalTo(1)); + projectWorkService.remove(projectWork); + } catch (InstanceNotFoundException e) { + throw new RuntimeException(e); + } + return null; + } + }); + } } 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 9e6419d39..161c5d40a 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 @@ -30,7 +30,7 @@ org/navalplanner/business/resources/entities/Resources.hbm.xml - org/navalplanner/business/resources/entities/WorkOrders.hbm.xml + org/navalplanner/business/workorders/entities/WorkOrders.hbm.xml