ItEr11S09CUCreacionDeOrganizacionsDeTraballoItEr10S10: Create skeleton of entities and mappings.

This commit is contained in:
Óscar González Fernández 2009-06-08 13:54:41 +02:00 committed by Javier Moran Rua
parent b06347a650
commit 5dea68fa30
17 changed files with 281 additions and 36 deletions

View file

@ -0,0 +1,9 @@
package org.navalplanner.business.common;
/**
* Represents some work done inside a transaction <br />
* @author oscar @param <T>
*/
public interface OnTransaction<T> {
public T execute();
}

View file

@ -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<T> {
public T execute();
}
<T> T onTransaction(OnTransaction<T> onTransaction);
}

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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<TaskWork> taskWorks = new HashSet<TaskWork>();
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<TaskWork> getTaskWorks() {
return new ArrayList<TaskWork>(taskWorks);
}
}

View file

@ -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<ActivityWork> activityWorks = new HashSet<ActivityWork>();
public int getWorkHours() {
int result = 0;
Set<ActivityWork> a = activityWorks;
for (ActivityWork activityWork : a) {
result += activityWork.getWorkingHours();
}
return result;
}
public void addActivity(ActivityWork activityWork) {
activityWorks.add(activityWork);
}
public List<ActivityWork> getActivities() {
return new ArrayList<ActivityWork>(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;
}
}

View file

@ -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<TaskWork> children = new HashSet<TaskWork>();
public List<TaskWork> getChildren() {
return new ArrayList<TaskWork>(children);
}
public void addTask(TaskWorkLeaf leaf) {
children.add(leaf);
}
}

View file

@ -0,0 +1,4 @@
package org.navalplanner.business.workorders.entities;
public class TaskWorkLeaf extends TaskWork {
}

View file

@ -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> T onTransaction(OnTransaction<T> onTransaction);
}

View file

@ -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> T onTransaction(OnTransaction<T> onTransaction) {
return onTransaction.execute();
}
}

View file

@ -24,7 +24,7 @@
org/navalplanner/business/resources/entities/Resources.hbm.xml
</value>
<value>
org/navalplanner/business/resources/entities/WorkOrders.hbm.xml
org/navalplanner/business/workorders/entities/WorkOrders.hbm.xml
</value>
</list>
</property>

View file

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.navalplanner.business.workorders.entities">
<class name="ProjectWork">
<id access="field" name="id">
<generator class="native" />
</id>
<version name="version" access="field" type="long"/>
<property name="initDate" access="field"></property>
<property name="endDate" access="field"></property>
<property name="name" access="field"></property>
<property name="description" access="field"></property>
<property name="responsible" access="field"></property>
<property name="customer" access="field"></property>
</class>
</hibernate-mapping>

View file

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.navalplanner.business.workorders.entities">
<class name="ProjectWork">
<id access="field" name="id">
<generator class="native" />
</id>
<version name="version" access="field" type="long" />
<property name="initDate" access="field"></property>
<property name="endDate" access="field"></property>
<property name="name" access="field"></property>
<property name="description" access="field"></property>
<property name="responsible" access="field"></property>
<property name="customer" access="field"></property>
<set name="taskWorks" access="field" cascade="all-delete-orphan">
<key column="projectId" not-null="false"></key>
<one-to-many class="TaskWork" />
</set>
</class>
<class name="TaskWork" abstract="true">
<id name="id" type="long" access="field">
<generator class="native" />
</id>
<set name="activityWorks" access="field" cascade="all-delete-orphan">
<key column="PARENT_TASK" not-null="false"></key>
<one-to-many class="ActivityWork" />
</set>
<property name="name" access="field" />
<property name="initDate" access="field" />
<property name="endDate" access="field" />
<joined-subclass name="TaskWorkContainer">
<key column="TASKWORKID"></key>
<set name="children" access="field" cascade="all-delete-orphan">
<key column="parent" not-null="false"></key>
<one-to-many class="TaskWork" />
</set>
</joined-subclass>
<joined-subclass name="TaskWorkLeaf">
<key column="TASKWORKID"></key>
</joined-subclass>
</class>
<class name="ActivityWork">
<id name="id" type="long" access="field">
<generator class="native" />
</id>
<property name="workingHours"></property>
</class>
</hibernate-mapping>

View file

@ -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;

View file

@ -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}. <br />
* @author Óscar González Fernández <ogonzalez@igalia.com>
*/
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));
}
}

View file

@ -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}. <br />
* @author Óscar González Fernández <ogonzalez@igalia.com>
@ -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<Void>() {
@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;
}
});
}
}

View file

@ -30,7 +30,7 @@
org/navalplanner/business/resources/entities/Resources.hbm.xml
</value>
<value>
org/navalplanner/business/resources/entities/WorkOrders.hbm.xml
org/navalplanner/business/workorders/entities/WorkOrders.hbm.xml
</value>
</list>
</property>