From d5bb95e4901182baecedaa110b96192eb150fe58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Wed, 6 May 2009 19:36:37 +0200 Subject: [PATCH] ItEr07S05CUCreacionRecursoTraballadorItEr06S07: Creates, edits and lists workers. Test for WorkerCRUDController. EasyMock is added as dependency. --- navalplanner-business/pom.xml | 14 +- .../business/common/daos/IGenericDao.java | 11 +- .../common/daos/impl/GenericDaoHibernate.java | 61 +++--- .../impl/GenericDaoHibernateTemplate.java | 35 +-- .../resources/services/ResourceService.java | 29 +-- .../services/impl/ResourceServiceImpl.java | 55 ++--- .../services/ResourceServiceTest.java | 162 +++++++------- navalplanner-webapp/pom.xml | 21 +- .../web/common/OnlyOneVisible.java | 27 +++ .../org/navalplanner/web/common/Util.java | 23 ++ .../web/resources/IWorkerModel.java | 19 ++ .../web/resources/WorkerCRUDController.java | 99 +++++++++ .../web/resources/WorkerModel.java | 39 ++++ .../navalplanner-webapp-spring-config.xml | 21 +- .../main/webapp/resources/worker/_edition.zul | 31 +++ .../main/webapp/resources/worker/_list.zul | 28 +++ .../main/webapp/resources/worker/worker.zul | 17 ++ .../resources/WorkerCRUDControllerTest.java | 95 +++++++++ pom.xml | 201 ++++++++++-------- 19 files changed, 718 insertions(+), 270 deletions(-) create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/common/OnlyOneVisible.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/common/Util.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/resources/IWorkerModel.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerCRUDController.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerModel.java create mode 100644 navalplanner-webapp/src/main/webapp/resources/worker/_edition.zul create mode 100644 navalplanner-webapp/src/main/webapp/resources/worker/_list.zul create mode 100644 navalplanner-webapp/src/main/webapp/resources/worker/worker.zul create mode 100644 navalplanner-webapp/src/test/java/org/navalplanner/web/resources/WorkerCRUDControllerTest.java diff --git a/navalplanner-business/pom.xml b/navalplanner-business/pom.xml index 607464a77..d83513774 100644 --- a/navalplanner-business/pom.xml +++ b/navalplanner-business/pom.xml @@ -1,7 +1,6 @@ - - + 4.0.0 org.navalplanner @@ -11,7 +10,7 @@ navalplanner-business jar Naval Planner Business Module - + @@ -37,6 +36,11 @@ org.springframework spring-test + + org.easymock + easymock + test + - + diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/IGenericDao.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/IGenericDao.java index 7cbac99cc..219e79bdf 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/IGenericDao.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/IGenericDao.java @@ -1,6 +1,7 @@ -package org.navalplanner.business.common.daos; +package org.navalplanner.business.common.daos; import java.io.Serializable; +import java.util.List; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; @@ -20,11 +21,13 @@ public interface IGenericDao { * It updates and inserts the object passed as a parameter. */ public void save(E entity); - + public E find(PK id) throws InstanceNotFoundException; - + public boolean exists(PK id); public void remove(PK id) throws InstanceNotFoundException; - + + public List list(Class klass); + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/impl/GenericDaoHibernate.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/impl/GenericDaoHibernate.java index d232a8d36..3ce190c4c 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/impl/GenericDaoHibernate.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/impl/GenericDaoHibernate.java @@ -2,13 +2,13 @@ package org.navalplanner.business.common.daos.impl; import java.io.Serializable; import java.lang.reflect.ParameterizedType; +import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; - import org.navalplanner.business.common.daos.IGenericDao; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.springframework.beans.factory.annotation.Autowired; @@ -33,54 +33,54 @@ import org.springframework.orm.hibernate3.SessionFactoryUtils; * @param Entity class * @param Primary key class */ -public class GenericDaoHibernate - implements IGenericDao { +public class GenericDaoHibernate implements + IGenericDao { private Class entityClass; - + @Autowired private SessionFactory sessionFactory; @SuppressWarnings("unchecked") public GenericDaoHibernate() { - this.entityClass = (Class) ((ParameterizedType) getClass(). - getGenericSuperclass()).getActualTypeArguments()[0]; + this.entityClass = (Class) ((ParameterizedType) getClass() + .getGenericSuperclass()).getActualTypeArguments()[0]; } - + protected Session getSession() { return sessionFactory.getCurrentSession(); } protected DataAccessException convertHibernateAccessException( - HibernateException e) { - - return SessionFactoryUtils.convertHibernateAccessException(e); - + HibernateException e) { + + return SessionFactoryUtils.convertHibernateAccessException(e); + } - + public void save(E entity) { - + try { getSession().saveOrUpdate(entity); } catch (HibernateException e) { throw convertHibernateAccessException(e); } - + } - + @SuppressWarnings("unchecked") public E find(PK id) throws InstanceNotFoundException { - + try { E entity = (E) getSession().get(entityClass, id); - + if (entity == null) { throw new InstanceNotFoundException(id, entityClass.getName()); } - + return entity; - + } catch (HibernateException e) { throw convertHibernateAccessException(e); } @@ -88,14 +88,13 @@ public class GenericDaoHibernate } public boolean exists(final PK id) { - + try { - return getSession().createCriteria(entityClass). - add(Restrictions.idEq(id)). - setProjection(Projections.id()). - uniqueResult() != null; - + return getSession().createCriteria(entityClass).add( + Restrictions.idEq(id)).setProjection(Projections.id()) + .uniqueResult() != null; + } catch (HibernateException e) { throw convertHibernateAccessException(e); } @@ -103,13 +102,19 @@ public class GenericDaoHibernate } public void remove(PK id) throws InstanceNotFoundException { - + try { getSession().delete(find(id)); } catch (HibernateException e) { throw convertHibernateAccessException(e); } - + } -} \ No newline at end of file + @SuppressWarnings("unchecked") + @Override + public List list(Class klass) { + return getSession().createCriteria(klass).list(); + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/impl/GenericDaoHibernateTemplate.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/impl/GenericDaoHibernateTemplate.java index 362c6351a..a12009d90 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/impl/GenericDaoHibernateTemplate.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/daos/impl/GenericDaoHibernateTemplate.java @@ -2,12 +2,12 @@ package org.navalplanner.business.common.daos.impl; import java.io.Serializable; import java.lang.reflect.ParameterizedType; +import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; - import org.navalplanner.business.common.daos.IGenericDao; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.springframework.beans.factory.annotation.Autowired; @@ -33,23 +33,23 @@ import org.springframework.orm.hibernate3.HibernateTemplate; * @param Entity class * @param Primary key class */ -public class GenericDaoHibernateTemplate - implements IGenericDao { +public class GenericDaoHibernateTemplate implements + IGenericDao { private Class entityClass; - + private HibernateTemplate hibernateTemplate; @SuppressWarnings("unchecked") public GenericDaoHibernateTemplate() { - this.entityClass = (Class) ((ParameterizedType) getClass(). - getGenericSuperclass()).getActualTypeArguments()[0]; + this.entityClass = (Class) ((ParameterizedType) getClass() + .getGenericSuperclass()).getActualTypeArguments()[0]; } - + protected HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } - + @Autowired public void setSessionFactory(SessionFactory sessionFactory) { hibernateTemplate = new HibernateTemplate(sessionFactory); @@ -58,7 +58,7 @@ public class GenericDaoHibernateTemplate public void save(E entity) { hibernateTemplate.saveOrUpdate(entity); } - + @SuppressWarnings("unchecked") public E find(PK id) throws InstanceNotFoundException { @@ -73,13 +73,12 @@ public class GenericDaoHibernateTemplate } public boolean exists(final PK id) { - + return (Boolean) hibernateTemplate.execute(new HibernateCallback() { public Object doInHibernate(Session session) { - return session.createCriteria(entityClass). - add(Restrictions.idEq(id)). - setProjection(Projections.id()). - uniqueResult() != null; + return session.createCriteria(entityClass).add( + Restrictions.idEq(id)).setProjection(Projections.id()) + .uniqueResult() != null; } }); @@ -89,4 +88,10 @@ public class GenericDaoHibernateTemplate hibernateTemplate.delete(find(id)); } -} \ No newline at end of file + @SuppressWarnings("unchecked") + @Override + public List list(Class klass) { + return hibernateTemplate.loadAll(klass); + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/ResourceService.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/ResourceService.java index 4d74c8c45..cca0af797 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/ResourceService.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/ResourceService.java @@ -1,7 +1,10 @@ package org.navalplanner.business.resources.services; +import java.util.List; + import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.resources.entities.Resource; +import org.navalplanner.business.resources.entities.Worker; /** * Interface for the resource management service. @@ -10,19 +13,19 @@ import org.navalplanner.business.resources.entities.Resource; * */ public interface ResourceService { - + /** - * It updates or inserts the resource passed as a parameter. If the - * resource is a composite resource, updating or inserting is cascaded to - * the resources contained in it. + * It updates or inserts the resource passed as a parameter. If the resource + * is a composite resource, updating or inserting is cascaded to the + * resources contained in it. */ public void saveResource(Resource resource); - - public Resource findResource(Long resourceId) - throws InstanceNotFoundException; - + + public Resource findResource(Long resourceId) + throws InstanceNotFoundException; + /** - * It adds a resource to a resource group. It the resource already belongs + * It adds a resource to a resource group. It the resource already belongs * to a resource group, the resource is moved to the new group. */ public void addResourceToResourceGroup(Long resourceId, @@ -32,10 +35,12 @@ public interface ResourceService { throws InstanceNotFoundException; /** - * It removes a resource. If the resource is a composite resource, the + * It removes a resource. If the resource is a composite resource, the * resources contained in it are not removed. */ - public void removeResource(Long resourceId) - throws InstanceNotFoundException; + public void removeResource(Long resourceId) + throws InstanceNotFoundException; + + public List getWorkers(); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/ResourceServiceImpl.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/ResourceServiceImpl.java index 5731d8fb2..1db5bc9a0 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/ResourceServiceImpl.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/services/impl/ResourceServiceImpl.java @@ -1,10 +1,13 @@ package org.navalplanner.business.resources.services.impl; +import java.util.List; + import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.resources.daos.IResourceDao; import org.navalplanner.business.resources.daos.IResourceGroupDao; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.ResourceGroup; +import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.business.resources.services.ResourceService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; @@ -18,46 +21,50 @@ import org.springframework.transaction.annotation.Transactional; */ @Transactional public class ResourceServiceImpl implements ResourceService { - + @Autowired private IResourceDao resourceDao; - + @Autowired - private IResourceGroupDao resourceGroupDao; - + private IResourceGroupDao resourceGroupDao; + public void saveResource(Resource resource) { resourceDao.save(resource); } @Transactional(readOnly = true) public Resource findResource(Long resourceId) - throws InstanceNotFoundException { - + throws InstanceNotFoundException { + return resourceDao.find(resourceId); } - - public void addResourceToResourceGroup(Long resourceId, - Long resourceGroupId) throws InstanceNotFoundException { - + + public void addResourceToResourceGroup(Long resourceId, Long resourceGroupId) + throws InstanceNotFoundException { + ResourceGroup resourceGroup = resourceGroupDao.find(resourceGroupId); - + resourceGroup.addResource(resourceId); - - } - - @Transactional(readOnly = true) - public int getResourceDailyCapacity(Long resourceId) - throws InstanceNotFoundException { - - return resourceDao.find(resourceId).getDailyCapacity(); - + } - public void removeResource(Long resourceId) - throws InstanceNotFoundException { - + @Transactional(readOnly = true) + public int getResourceDailyCapacity(Long resourceId) + throws InstanceNotFoundException { + + return resourceDao.find(resourceId).getDailyCapacity(); + + } + + public void removeResource(Long resourceId) + throws InstanceNotFoundException { + resourceDao.find(resourceId).remove(); } - + + @Override + public List getWorkers() { + return resourceDao.list(Worker.class); + } } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/ResourceServiceTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/ResourceServiceTest.java index ba4e4776a..10cf4f72d 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/ResourceServiceTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/resources/services/ResourceServiceTest.java @@ -27,77 +27,76 @@ import org.springframework.transaction.annotation.Transactional; * */ @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations={BUSINESS_SPRING_CONFIG_FILE, - BUSINESS_SPRING_CONFIG_TEST_FILE}) +@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, + BUSINESS_SPRING_CONFIG_TEST_FILE }) @Transactional public class ResourceServiceTest { - + @Autowired private ResourceService resourceService; - + @Autowired private IResourceDao resourceDao; - + @Test - public void testAddResourceToResourceGroup() - throws InstanceNotFoundException { - + public void testAddResourceToResourceGroup() + throws InstanceNotFoundException { + /* Two workers. One of them belongs to a resource group. */ - Worker worker1 = new Worker("worker-1", "worker-1-surname", - "11111111A", 8); - Worker worker2 = new Worker("worker-2", "worker-2-surname", - "22222222B", 7); + Worker worker1 = new Worker("worker-1", "worker-1-surname", + "11111111A", 8); + Worker worker2 = new Worker("worker-2", "worker-2-surname", + "22222222B", 7); ResourceGroup resourceGroup1 = new ResourceGroup(); resourceGroup1.addResource(worker1); resourceService.saveResource(resourceGroup1); // worker1 is also saved. resourceService.saveResource(worker2); - + /* A resource group. */ ResourceGroup resourceGroup2 = new ResourceGroup(); resourceService.saveResource(resourceGroup2); - + /* Add workers to resource group. */ resourceService.addResourceToResourceGroup(worker1.getId(), - resourceGroup2.getId()); + resourceGroup2.getId()); resourceService.addResourceToResourceGroup(worker2.getId(), - resourceGroup2.getId()); - + resourceGroup2.getId()); + /* Check resource group. */ - ResourceGroup resourceGroup = (ResourceGroup) - resourceService.findResource(resourceGroup2.getId()); - + ResourceGroup resourceGroup = (ResourceGroup) resourceService + .findResource(resourceGroup2.getId()); + assertEquals(2, resourceGroup.getResources().size()); assertTrue(resourceGroup.getResources().contains(worker1)); assertTrue(resourceGroup.getResources().contains(worker2)); - + /* Check worker1 is no longer in group 1. */ assertFalse(resourceGroup1.getResources().contains(worker1)); - + } - + @Test - public void testGetResourceDailyCapacity() - throws InstanceNotFoundException { - + public void testGetResourceDailyCapacity() throws InstanceNotFoundException { + /* Three workers. */ - Worker worker1 = new Worker("worker-1", "worker-1-surname", - "11111111A", 8); - Worker worker2 = new Worker("worker-2", "worker-2-surname", - "22222222B", 7); - Worker worker3 = new Worker("worker-3", "worker-3-surname", - "33333333C", 6); - + Worker worker1 = new Worker("worker-1", "worker-1-surname", + "11111111A", 8); + Worker worker2 = new Worker("worker-2", "worker-2-surname", + "22222222B", 7); + Worker worker3 = new Worker("worker-3", "worker-3-surname", + "33333333C", 6); + /* A group of two workers. */ ResourceGroup resourceGroup1 = new ResourceGroup(); - Worker worker4 = new Worker("worker-4", "worker-4-surname", - "44444444D", 5); - Worker worker5 = new Worker("worker-5", "worker-5-surname", - "55555555E", 4); + Worker worker4 = new Worker("worker-4", "worker-4-surname", + "44444444D", 5); + Worker worker5 = new Worker("worker-5", "worker-5-surname", + "55555555E", 4); resourceGroup1.addResource(worker4); resourceGroup1.addResource(worker5); - - /* - * A complex group containing the first three workers and a group with + + /* + * A complex group containing the first three workers and a group with * the last two workers. */ ResourceGroup resourceGroup2 = new ResourceGroup(); @@ -105,76 +104,95 @@ public class ResourceServiceTest { resourceGroup2.addResource(worker2); resourceGroup2.addResource(worker3); resourceGroup2.addResource(resourceGroup1); - + /* Calculate total daily capacity. */ - int totalDailyCapacity = - worker1.getDailyCapacity() + worker2.getDailyCapacity() + - worker3.getDailyCapacity() + worker4.getDailyCapacity() + - worker5.getDailyCapacity(); - + int totalDailyCapacity = worker1.getDailyCapacity() + + worker2.getDailyCapacity() + worker3.getDailyCapacity() + + worker4.getDailyCapacity() + worker5.getDailyCapacity(); + /* Save the second group (and in consequence all resources). */ resourceService.saveResource(resourceGroup2); - + /* Test ResourceService's getResourceDailyCapacity. */ - int resourceGroupDailyCapacity = - resourceService.getResourceDailyCapacity(resourceGroup2.getId()); - - assertEquals(totalDailyCapacity, resourceGroupDailyCapacity); - + int resourceGroupDailyCapacity = resourceService + .getResourceDailyCapacity(resourceGroup2.getId()); + + assertEquals(totalDailyCapacity, resourceGroupDailyCapacity); + } - + @Test public void testRemoveResource() throws InstanceNotFoundException { - + /* A group of three workers. */ ResourceGroup resourceGroup = new ResourceGroup(); - Worker worker1 = new Worker("worker-1", "worker-2-surname", - "11111111A", 8); - Worker worker2 = new Worker("worker-2", "worker-3-surname", - "22222222B", 6); - Worker worker3 = new Worker("worker-3", "worker-3-surname", - "33333333C", 4); + Worker worker1 = new Worker("worker-1", "worker-2-surname", + "11111111A", 8); + Worker worker2 = new Worker("worker-2", "worker-3-surname", + "22222222B", 6); + Worker worker3 = new Worker("worker-3", "worker-3-surname", + "33333333C", 4); resourceGroup.addResource(worker1); resourceGroup.addResource(worker2); resourceGroup.addResource(worker3); resourceService.saveResource(resourceGroup); - + /* Remove worker 3. */ resourceService.removeResource(worker3.getId()); - + /* Check worker 3 does not exist. */ assertFalse(resourceDao.exists(worker3.getId())); - - /* - * Check worker 3 is not in resource group and the other workers - * are still in the group. + + /* + * Check worker 3 is not in resource group and the other workers are + * still in the group. */ assertFalse(resourceGroup.getResources().contains(worker3)); assertTrue(resourceGroup.getResources().contains(worker1)); assertTrue(resourceGroup.getResources().contains(worker2)); - + /* Remove the group. */ resourceService.removeResource(resourceGroup.getId()); - + /* Check the resource group does not exist. */ assertFalse(resourceDao.exists(resourceGroup.getId())); - + /* Check workers still exist. */ assertTrue(resourceDao.exists(worker1.getId())); assertTrue(resourceDao.exists(worker2.getId())); - + /* Check workers do not belong to any resource group. */ assertNull(worker1.getResourceGroup()); assertNull(worker2.getResourceGroup()); - + /* Remove workers. */ resourceService.removeResource(worker1.getId()); resourceService.removeResource(worker2.getId()); - + /* Check workers do not exist. */ assertFalse(resourceDao.exists(worker1.getId())); assertFalse(resourceDao.exists(worker2.getId())); } + @Test + public void testListWorkers() throws Exception { + ResourceGroup resourceGroup = new ResourceGroup(); + Worker worker1 = new Worker("worker-1", "worker-2-surname", + "11111111A", 8); + Worker worker2 = new Worker("worker-2", "worker-3-surname", + "22222222B", 6); + Worker worker3 = new Worker("worker-3", "worker-3-surname", + "33333333C", 4); + resourceGroup.addResource(worker1); + resourceGroup.addResource(worker2); + resourceService.saveResource(resourceGroup); + assertEquals( + "Two workers has been created when saving the resource group", + 2, resourceService.getWorkers().size()); + resourceService.saveResource(worker3); + assertEquals("Three workers has been created", 3, resourceService + .getWorkers().size()); + } + } diff --git a/navalplanner-webapp/pom.xml b/navalplanner-webapp/pom.xml index be6bed60c..d45d7e7ea 100644 --- a/navalplanner-webapp/pom.xml +++ b/navalplanner-webapp/pom.xml @@ -1,7 +1,6 @@ - - + 4.0.0 org.navalplanner @@ -15,7 +14,7 @@ navalplanner-webapp - + @@ -44,17 +43,25 @@ org.zkoss.zk zk - + org.navalplanner navalplanner-gantt-zk - + org.navalplanner navalplanner-business + + org.easymock + easymock + + + junit + junit + - + diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/OnlyOneVisible.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/OnlyOneVisible.java new file mode 100644 index 000000000..d5d26924a --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/OnlyOneVisible.java @@ -0,0 +1,27 @@ +package org.navalplanner.web.common; + +import java.util.Arrays; +import java.util.List; + +import org.zkoss.zk.ui.Component; + +/** + * Utility for enforcing that only one of the supplied component is visible.
+ * @author Óscar González Fernández + */ +public class OnlyOneVisible { + + private List components; + + public OnlyOneVisible(Component... components) { + this.components = Arrays.asList(components); + showOnly(null); + } + + public void showOnly(Component component) { + for (Component c : components) { + c.setVisible(component != null && c.equals(component)); + } + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/Util.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/Util.java new file mode 100644 index 000000000..8ad475500 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/Util.java @@ -0,0 +1,23 @@ +package org.navalplanner.web.common; + +import org.zkoss.zk.ui.Component; +import org.zkoss.zkplus.databind.DataBinder; + +/** + * Utilities class.
+ * @author Óscar González Fernández + */ +public class Util { + + public static void reloadBindings(Component reload) { + DataBinder binder = Util.getBinder(reload); + if (binder != null) { + binder.loadComponent(reload); + } + } + + public static DataBinder getBinder(Component component) { + return (DataBinder) component.getVariable("binder", false); + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/IWorkerModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/IWorkerModel.java new file mode 100644 index 000000000..3813d3d7a --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/IWorkerModel.java @@ -0,0 +1,19 @@ +package org.navalplanner.web.resources; + +import java.util.List; + +import org.navalplanner.business.resources.entities.Worker; + +/** + * Interface for workerModel.
+ * @author Óscar González Fernández + */ +public interface IWorkerModel { + + Worker createNewInstance(); + + void save(Worker worker); + + List getWorkers(); + +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerCRUDController.java new file mode 100644 index 000000000..99ac2cde9 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerCRUDController.java @@ -0,0 +1,99 @@ +package org.navalplanner.web.resources; + +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.navalplanner.business.resources.entities.Worker; +import org.navalplanner.web.common.OnlyOneVisible; +import org.navalplanner.web.common.Util; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.api.Window; + +/** + * Controller for {@link Worker} resource
+ * @author Óscar González Fernández + */ +public class WorkerCRUDController extends GenericForwardComposer { + + private static final Log LOG = LogFactory + .getLog(WorkerCRUDController.class); + + private Window createWindow; + + private Window listWindow; + + private Window editWindow; + + private IWorkerModel workerModel; + + private Worker worker; + + private OnlyOneVisible visibility; + + public WorkerCRUDController() { + + } + + public WorkerCRUDController(Window createWindow, Window listWindow, + Window editWindow, IWorkerModel workerModel) { + this.createWindow = createWindow; + this.listWindow = listWindow; + this.editWindow = editWindow; + this.workerModel = workerModel; + } + + public Worker getWorker() { + if (worker == null) { + worker = workerModel.createNewInstance(); + } + return worker; + } + + public List getWorkers() { + return workerModel.getWorkers(); + } + + public void save() { + workerModel.save(worker); + getVisibility().showOnly(listWindow); + Util.reloadBindings(listWindow); + worker = null; + } + + public void cancel() { + getVisibility().showOnly(listWindow); + worker = null; + } + + public void goToEditForm(Worker worker) { + if (worker == null) + throw new IllegalArgumentException("worker cannot be null"); + this.worker = worker; + getVisibility().showOnly(editWindow); + Util.reloadBindings(editWindow); + } + + public void goToCreateForm() { + worker = workerModel.createNewInstance(); + getVisibility().showOnly(createWindow); + Util.reloadBindings(createWindow); + } + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + comp.setVariable("controller", this, true); + getVisibility().showOnly(listWindow); + } + + private OnlyOneVisible getVisibility() { + if (visibility == null) { + visibility = new OnlyOneVisible(listWindow, editWindow, + createWindow); + } + return visibility; + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerModel.java new file mode 100644 index 000000000..e7368e75c --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerModel.java @@ -0,0 +1,39 @@ +package org.navalplanner.web.resources; + +import java.util.List; + +import org.navalplanner.business.resources.entities.Worker; +import org.navalplanner.business.resources.services.ResourceService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Model for worker
+ * @author Óscar González Fernández + */ +public class WorkerModel implements IWorkerModel { + + private final ResourceService resourceService; + + @Autowired + public WorkerModel(ResourceService resourceService) { + if (resourceService == null) + throw new IllegalArgumentException("resourceService cannot be null"); + this.resourceService = resourceService; + } + + @Override + public Worker createNewInstance() { + return new Worker(); + } + + @Override + public void save(Worker worker) { + resourceService.saveResource(worker); + } + + @Override + public List getWorkers() { + return resourceService.getWorkers(); + } + +} diff --git a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml index 67c2e2d4d..c29ea6bf0 100644 --- a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml +++ b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml @@ -1,16 +1,19 @@ - - - + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> + + + + + \ No newline at end of file diff --git a/navalplanner-webapp/src/main/webapp/resources/worker/_edition.zul b/navalplanner-webapp/src/main/webapp/resources/worker/_edition.zul new file mode 100644 index 000000000..3b570f87a --- /dev/null +++ b/navalplanner-webapp/src/main/webapp/resources/worker/_edition.zul @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul b/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul new file mode 100644 index 000000000..2516c2b67 --- /dev/null +++ b/navalplanner-webapp/src/main/webapp/resources/worker/worker.zul @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/resources/WorkerCRUDControllerTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/resources/WorkerCRUDControllerTest.java new file mode 100644 index 000000000..b05a5813f --- /dev/null +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/resources/WorkerCRUDControllerTest.java @@ -0,0 +1,95 @@ +package org.navalplanner.web.resources; + +import static junit.framework.Assert.assertEquals; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.createNiceMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; +import org.navalplanner.business.resources.entities.Worker; +import org.zkoss.zul.api.Window; + +/** + * Tests for {@link WorkerCRUDController}
+ * @author Óscar González Fernández + */ +public class WorkerCRUDControllerTest { + + private Window createWindow; + private Window listWindow; + private Window editWindow; + + private WorkerCRUDController createControllerForModel( + IWorkerModel workerModel) { + createWindow = createNiceMock(Window.class); + listWindow = createNiceMock(Window.class); + editWindow = createNiceMock(Window.class); + + WorkerCRUDController workerCRUDController = new WorkerCRUDController( + createWindow, listWindow, editWindow, workerModel); + return workerCRUDController; + } + + @Test + public void testSave() throws Exception { + IWorkerModel workerModel = createMock(IWorkerModel.class); + Worker workerToReturn = new Worker(); + + WorkerCRUDController workerCRUDController = createControllerForModel(workerModel); + replay(createWindow, listWindow, editWindow); + // expectations + expect(workerModel.createNewInstance()).andReturn(workerToReturn); + workerModel.save(workerToReturn); + replay(workerModel); + // action + workerCRUDController.goToCreateForm(); + workerCRUDController.save(); + // verify + verify(workerModel); + } + + @Test + public void testGoToSaveAndThenCancel() { + IWorkerModel workerModel = createMock(IWorkerModel.class); + Worker workerToReturn = new Worker(); + // expectations + WorkerCRUDController workerCRUDController = createControllerForModel(workerModel); + expect(workerModel.createNewInstance()).andReturn(workerToReturn); + expect(createWindow.setVisible(true)).andReturn(false); + expect(createWindow.setVisible(false)).andReturn(true); + expect(listWindow.setVisible(true)).andReturn(false); + replay(createWindow, listWindow, editWindow, workerModel); + // actions + workerCRUDController.goToCreateForm(); + workerCRUDController.cancel(); + // verify + verify(workerModel); + } + + @Test + public void testEditWorker() throws Exception { + IWorkerModel workerModel = createMock(IWorkerModel.class); + WorkerCRUDController workerCRUDController = createControllerForModel(workerModel); + List workersToReturn = new ArrayList(Arrays.asList( + new Worker("firstName", "surname", "nif", 4), new Worker( + "firstName", "surname", "nif", 4))); + // expectations + expect(workerModel.getWorkers()).andReturn(workersToReturn); + expect(editWindow.setVisible(true)).andReturn(false); + workerModel.save(workersToReturn.get(0)); + replay(createWindow, listWindow, editWindow, workerModel); + // perform actions + List workers = workerCRUDController.getWorkers(); + assertEquals(workersToReturn, workers); + workerCRUDController.goToEditForm(workers.get(0)); + workerCRUDController.save(); + // verify + verify(workerModel, editWindow); + } +} diff --git a/pom.xml b/pom.xml index 163c8623b..f5639cd2d 100644 --- a/pom.xml +++ b/pom.xml @@ -1,28 +1,32 @@ - - + 4.0.0 org.navalplanner navalplanner pom 1.0.0 Naval Planner - - + + navalplanner-business navalplanner-gantt-zk navalplanner-webapp - - - - + + naval naval @@ -30,50 +34,38 @@ ${dataSource.user} ${dataSource.password} - - - - - + + + dev @@ -90,7 +82,7 @@ update - + prod @@ -103,7 +95,7 @@ false update - + @@ -123,8 +115,8 @@ org.hibernate.dialect.PostgreSQLDialect - - + + mysql @@ -141,7 +133,7 @@ org.hibernate.dialect.MySQLDialect - + hsqldb @@ -153,17 +145,19 @@ org.hsqldb.jdbcDriver sa - + jdbc:hsqldb:${java.io.tmpdir}/naval${navalplanner.mode};shutdown=true jdbc:hsqldb:${java.io.tmpdir}/naval${navalplanner.mode}test;shutdown=true org.hibernate.dialect.HSQLDialect - - + + - + @@ -181,14 +175,25 @@ 3.2.6.ga - + junit junit 4.4 test + + + + org.easymock + easymock + 2.4 + test + + org.springframework @@ -257,15 +262,17 @@ - + - + - - + + src/main/resources true @@ -274,13 +281,15 @@ *hibernate.cfg.xml - - + + src/main/resources - + ../src/main/jetty @@ -291,11 +300,13 @@ true - + - - + + src/test/resources true @@ -305,12 +316,14 @@ - + src/test/resources - - + + @@ -324,7 +337,7 @@ true 1.6 1.6 - UTF-8 + UTF-8 @@ -338,11 +351,11 @@ - + - + org.mortbay.jetty maven-jetty-plugin @@ -361,17 +374,17 @@ - + true @@ -382,11 +395,11 @@ ${jdbcDriver.version} - + - +