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