ItEr09S12CUCreacioRecursoTraballadorItEr07S05: It keeps use case state in the model instead of the controller.

This commit is contained in:
Óscar González Fernández 2009-05-18 19:12:14 +02:00 committed by Javier Moran Rua
parent 802d60f312
commit 9891482fee
6 changed files with 170 additions and 83 deletions

View file

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

View file

@ -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<Worker> getWorkers();
Worker getWorker();
void prepareForCreate();
void prepareEditFor(Worker worker);
}

View file

@ -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<Worker> workerValidator = new ClassValidator<Worker>(
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<Worker> 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);
}

View file

@ -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<Worker> workerValidator;
@Autowired
public WorkerModel(ResourceService resourceService) {
if (resourceService == null)
throw new IllegalArgumentException("resourceService cannot be null");
this.resourceService = resourceService;
this.workerValidator = new ClassValidator<Worker>(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);
}
}
}

View file

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

View file

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