diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/exceptions/ValidationException.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/exceptions/ValidationException.java
new file mode 100644
index 000000000..77ff08314
--- /dev/null
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/exceptions/ValidationException.java
@@ -0,0 +1,43 @@
+package org.navalplanner.business.common.exceptions;
+
+import org.apache.commons.lang.Validate;
+import org.hibernate.validator.InvalidValue;
+
+/**
+ * Encapsulates some validation failure
+ * @author Óscar González Fernández
+ */
+public class ValidationException extends Exception {
+
+ private InvalidValue[] invalidValues;
+
+ public InvalidValue[] getInvalidValues() {
+ return invalidValues;
+ }
+
+ public ValidationException(InvalidValue[] invalidValues) {
+ super();
+ Validate.noNullElements(invalidValues);
+ this.invalidValues = invalidValues;
+ }
+
+ public ValidationException(InvalidValue[] invalidValues, String message,
+ Throwable cause) {
+ super(message, cause);
+ Validate.noNullElements(invalidValues);
+ this.invalidValues = invalidValues;
+ }
+
+ public ValidationException(InvalidValue[] invalidValues, String message) {
+ super(message);
+ Validate.noNullElements(invalidValues);
+ this.invalidValues = invalidValues;
+ }
+
+ public ValidationException(InvalidValue[] invalidValues, Throwable cause) {
+ super(cause);
+ Validate.noNullElements(invalidValues);
+ this.invalidValues = invalidValues;
+ }
+
+}
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
index 3813d3d7a..961bb5932 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/IWorkerModel.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/IWorkerModel.java
@@ -2,6 +2,7 @@ package org.navalplanner.web.resources;
import java.util.List;
+import org.navalplanner.business.common.exceptions.ValidationException;
import org.navalplanner.business.resources.entities.Worker;
/**
@@ -10,10 +11,14 @@ import org.navalplanner.business.resources.entities.Worker;
*/
public interface IWorkerModel {
- Worker createNewInstance();
-
- void save(Worker worker);
+ void save() throws ValidationException;
List getWorkers();
+ Worker getWorker();
+
+ void prepareForCreate();
+
+ void prepareEditFor(Worker worker);
+
}
\ 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
index 91bc69c97..3a03ba08a 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerCRUDController.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerCRUDController.java
@@ -2,10 +2,8 @@ package org.navalplanner.web.resources;
import java.util.List;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.validator.ClassValidator;
import org.hibernate.validator.InvalidValue;
+import org.navalplanner.business.common.exceptions.ValidationException;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.web.common.IMessagesForUser;
import org.navalplanner.web.common.Level;
@@ -22,12 +20,6 @@ import org.zkoss.zul.api.Window;
*/
public class WorkerCRUDController extends GenericForwardComposer {
- private static final Log LOG = LogFactory
- .getLog(WorkerCRUDController.class);
-
- private ClassValidator workerValidator = new ClassValidator(
- Worker.class);
-
private Window createWindow;
private Window listWindow;
@@ -36,8 +28,6 @@ public class WorkerCRUDController extends GenericForwardComposer {
private IWorkerModel workerModel;
- private Worker worker;
-
private OnlyOneVisible visibility;
private IMessagesForUser messages;
@@ -58,10 +48,7 @@ public class WorkerCRUDController extends GenericForwardComposer {
}
public Worker getWorker() {
- if (worker == null) {
- worker = workerModel.createNewInstance();
- }
- return worker;
+ return workerModel.getWorker();
}
public List getWorkers() {
@@ -69,35 +56,30 @@ public class WorkerCRUDController extends GenericForwardComposer {
}
public void save() {
- InvalidValue[] invalidValues = workerValidator.getInvalidValues(worker);
- if (invalidValues.length > 0) {
- for (InvalidValue invalidValue : invalidValues) {
+ try {
+ workerModel.save();
+ getVisibility().showOnly(listWindow);
+ Util.reloadBindings(listWindow);
+ messages.showMessage(Level.INFO, "traballador gardado");
+ } catch (ValidationException e) {
+ for (InvalidValue invalidValue : e.getInvalidValues()) {
messages.invalidValue(invalidValue);
}
- return;
}
- workerModel.save(worker);
- getVisibility().showOnly(listWindow);
- Util.reloadBindings(listWindow);
- messages.showMessage(Level.INFO, "traballador gardado");
- 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;
+ workerModel.prepareEditFor(worker);
getVisibility().showOnly(editWindow);
Util.reloadBindings(editWindow);
}
public void goToCreateForm() {
- worker = workerModel.createNewInstance();
+ workerModel.prepareForCreate();
getVisibility().showOnly(createWindow);
Util.reloadBindings(createWindow);
}
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
index e7368e75c..14e4f0da2 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerModel.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/WorkerModel.java
@@ -2,6 +2,11 @@ package org.navalplanner.web.resources;
import java.util.List;
+import org.apache.commons.lang.Validate;
+import org.hibernate.validator.ClassValidator;
+import org.hibernate.validator.InvalidValue;
+import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
+import org.navalplanner.business.common.exceptions.ValidationException;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.business.resources.services.ResourceService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -13,21 +18,24 @@ import org.springframework.beans.factory.annotation.Autowired;
public class WorkerModel implements IWorkerModel {
private final ResourceService resourceService;
+ private Worker worker;
+ private ClassValidator workerValidator;
@Autowired
public WorkerModel(ResourceService resourceService) {
if (resourceService == null)
throw new IllegalArgumentException("resourceService cannot be null");
this.resourceService = resourceService;
+ this.workerValidator = new ClassValidator(Worker.class);
}
@Override
- public Worker createNewInstance() {
- return new Worker();
- }
-
- @Override
- public void save(Worker worker) {
+ public void save() throws ValidationException {
+ InvalidValue[] invalidValues = workerValidator
+ .getInvalidValues(getWorker());
+ if (invalidValues.length > 0) {
+ throw new ValidationException(invalidValues);
+ }
resourceService.saveResource(worker);
}
@@ -36,4 +44,24 @@ public class WorkerModel implements IWorkerModel {
return resourceService.getWorkers();
}
+ @Override
+ public Worker getWorker() {
+ return worker;
+ }
+
+ @Override
+ public void prepareForCreate() {
+ worker = new Worker();
+ }
+
+ @Override
+ public void prepareEditFor(Worker worker) {
+ Validate.notNull(worker, "worker is not null");
+ try {
+ this.worker = (Worker) resourceService.findResource(worker.getId());
+ } catch (InstanceNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
}
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
index fce3f8c36..b43746d91 100644
--- a/navalplanner-webapp/src/test/java/org/navalplanner/web/resources/WorkerCRUDControllerTest.java
+++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/resources/WorkerCRUDControllerTest.java
@@ -1,29 +1,24 @@
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.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.same;
+import static org.easymock.EasyMock.verify;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import org.hibernate.validator.ClassValidator;
-import org.hibernate.validator.InvalidValue;
import org.junit.Test;
import org.navalplanner.business.resources.entities.Worker;
import org.navalplanner.web.common.IMessagesForUser;
import org.navalplanner.web.common.Level;
import org.zkoss.zul.api.Window;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
-import static org.easymock.EasyMock.isA;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.same;
-import static org.easymock.EasyMock.verify;
-
/**
* Tests for {@link WorkerCRUDController}
* @author Óscar González Fernández
@@ -60,10 +55,10 @@ public class WorkerCRUDControllerTest {
workerModel, messagesForUser);
replay(createWindow, listWindow, editWindow);
// expectations
- expect(workerModel.createNewInstance()).andReturn(workerToReturn);
- workerModel.save(workerToReturn);
- messagesForUser.showMessage(same(Level.INFO),
- isA(String.class));
+ workerModel.prepareForCreate();
+ expect(workerModel.getWorker()).andReturn(workerToReturn).anyTimes();
+ workerModel.save();
+ messagesForUser.showMessage(same(Level.INFO), isA(String.class));
replay(workerModel, messagesForUser);
// action
workerCRUDController.goToCreateForm();
@@ -82,7 +77,8 @@ public class WorkerCRUDControllerTest {
Worker workerToReturn = new Worker();
// expectations
WorkerCRUDController workerCRUDController = createControllerForModel(workerModel);
- expect(workerModel.createNewInstance()).andReturn(workerToReturn);
+ workerModel.prepareForCreate();
+ expect(workerModel.getWorker()).andReturn(workerToReturn).anyTimes();
expect(createWindow.setVisible(true)).andReturn(false);
expect(createWindow.setVisible(false)).andReturn(true);
expect(listWindow.setVisible(true)).andReturn(false);
@@ -105,10 +101,12 @@ public class WorkerCRUDControllerTest {
"firstName", "surname", "nif", 4)));
// expectations
expect(workerModel.getWorkers()).andReturn(workersToReturn);
+ workerModel.prepareEditFor(workersToReturn.get(0));
expect(editWindow.setVisible(true)).andReturn(false);
- workerModel.save(workersToReturn.get(0));
- messagesForUser.showMessage(same(Level.INFO),
- isA(String.class));
+ expect(workerModel.getWorker()).andReturn(workersToReturn.get(0))
+ .anyTimes();
+ workerModel.save();
+ messagesForUser.showMessage(same(Level.INFO), isA(String.class));
replay(createWindow, listWindow, editWindow, workerModel,
messagesForUser);
// perform actions
@@ -120,27 +118,4 @@ public class WorkerCRUDControllerTest {
verify(workerModel, editWindow, messagesForUser);
}
- @Test
- public void testWorkerInvalid() {
- IWorkerModel workerModel = createMock(IWorkerModel.class);
- IMessagesForUser messages = createMock(IMessagesForUser.class);
- WorkerCRUDController workerCRUDController = createControllerForModel(
- workerModel, messages);
- Worker workerToReturn = new Worker();
- // expectations
- expect(workerModel.createNewInstance()).andReturn(workerToReturn);
- ClassValidator workerValidator = new ClassValidator(
- Worker.class);
- InvalidValue[] invalidValues = workerValidator
- .getInvalidValues(workerToReturn);
- assertFalse(invalidValues.length == 0);
- messages.invalidValue(isA(InvalidValue.class));
- expectLastCall().times(invalidValues.length);
- replay(createWindow, listWindow, editWindow, workerModel, messages);
- // perform actions
- workerCRUDController.goToCreateForm();
- workerCRUDController.save();
- // verify
- verify(messages);
- }
}
diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/resources/WorkerModelTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/resources/WorkerModelTest.java
new file mode 100644
index 000000000..bba842eb3
--- /dev/null
+++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/resources/WorkerModelTest.java
@@ -0,0 +1,54 @@
+package org.navalplanner.web.resources;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+import org.junit.Test;
+import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
+import org.navalplanner.business.common.exceptions.ValidationException;
+import org.navalplanner.business.resources.entities.Worker;
+import org.navalplanner.business.resources.services.ResourceService;
+
+/**
+ * Some test cases for {@link WorkerModel}.
+ * @author Óscar González Fernández
+ */
+public class WorkerModelTest {
+
+ @Test
+ public void testWorkerValid() throws ValidationException,
+ InstanceNotFoundException {
+ ResourceService resourceServiceMock = createMock(ResourceService.class);
+ WorkerModel workerModel = new WorkerModel(resourceServiceMock);
+ Worker workerToReturn = new Worker();
+ workerToReturn.setDailyHours(2);
+ workerToReturn.setFirstName("firstName");
+ workerToReturn.setSurname("surname");
+ workerToReturn.setNif("232344243");
+ // expectations
+ expect(resourceServiceMock.findResource(workerToReturn.getId()))
+ .andReturn(workerToReturn);
+ resourceServiceMock.saveResource(workerToReturn);
+ replay(resourceServiceMock);
+ // perform actions
+ workerModel.prepareEditFor(workerToReturn);
+ workerModel.save();
+ }
+
+ @Test(expected = ValidationException.class)
+ public void testWorkerInvalid() throws ValidationException,
+ InstanceNotFoundException {
+ ResourceService resourceServiceMock = createMock(ResourceService.class);
+ WorkerModel workerModel = new WorkerModel(resourceServiceMock);
+ Worker workerToReturn = new Worker();
+ // expectations
+ expect(resourceServiceMock.findResource(workerToReturn.getId()))
+ .andReturn(workerToReturn);
+ replay(resourceServiceMock);
+ // perform actions
+ workerModel.prepareEditFor(workerToReturn);
+ workerModel.save();
+ }
+
+}