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(); + } + +}