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/_list.zul b/navalplanner-webapp/src/main/webapp/resources/worker/_list.zul
new file mode 100644
index 000000000..70ef4f65b
--- /dev/null
+++ b/navalplanner-webapp/src/main/webapp/resources/worker/_list.zul
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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}
-
+
-
+