diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/IValidable.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/IValidable.java
new file mode 100644
index 000000000..155645bff
--- /dev/null
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/IValidable.java
@@ -0,0 +1,21 @@
+package org.navalplanner.business.common;
+
+import org.navalplanner.business.common.exceptions.ValidationException;
+
+/**
+ * Entities implementing this interface have a method checkValid.
+ * This method validates the business rules of the entity.
+ *
+ * @author Manuel Rego Casasnovas
+ */
+public interface IValidable {
+
+ /**
+ * Checks if an entity is or not valid.
+ *
+ * @throws ValidationException
+ * if entity is not valid.
+ */
+ void checkValid() throws ValidationException;
+
+}
diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderDAO.java
index b6b5209db..8b277bd45 100644
--- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderDAO.java
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderDAO.java
@@ -1,5 +1,7 @@
package org.navalplanner.business.orders.daos;
+import java.util.List;
+
import org.navalplanner.business.common.daos.IGenericDAO;
import org.navalplanner.business.orders.entities.Order;
@@ -9,4 +11,11 @@ import org.navalplanner.business.orders.entities.Order;
*/
public interface IOrderDAO extends IGenericDAO {
-}
\ No newline at end of file
+ /**
+ * Gets all the orders.
+ *
+ * @return A {@link List} of {@link Order} objects
+ */
+ List getOrders();
+
+}
diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderDAO.java
index 374645591..61db0af9d 100644
--- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderDAO.java
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderDAO.java
@@ -1,5 +1,7 @@
package org.navalplanner.business.orders.daos;
+import java.util.List;
+
import org.navalplanner.business.common.daos.GenericDAOHibernate;
import org.navalplanner.business.orders.entities.Order;
import org.springframework.beans.factory.config.BeanDefinition;
@@ -14,4 +16,10 @@ import org.springframework.stereotype.Repository;
@Scope(BeanDefinition.SCOPE_SINGLETON)
public class OrderDAO extends GenericDAOHibernate implements
IOrderDAO {
+
+ @Override
+ public List getOrders() {
+ return list(Order.class);
+ }
+
}
\ No newline at end of file
diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java
index c31347e84..551176d7e 100644
--- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java
@@ -8,13 +8,15 @@ import org.hibernate.validator.NotEmpty;
import org.hibernate.validator.NotNull;
import org.hibernate.validator.Valid;
import org.navalplanner.business.common.BaseEntity;
+import org.navalplanner.business.common.IValidable;
+import org.navalplanner.business.common.exceptions.ValidationException;
import org.navalplanner.business.planner.entities.TaskElement;
/**
* It represents an {@link Order} with its related information.
* @author Óscar González Fernández
*/
-public class Order extends BaseEntity implements IOrderLineGroup {
+public class Order extends BaseEntity implements IOrderLineGroup, IValidable {
private static Date copy(Date date) {
return date != null ? new Date(date.getTime()) : date;
@@ -143,4 +145,18 @@ public class Order extends BaseEntity implements IOrderLineGroup {
return false;
}
+ @Override
+ public void checkValid() throws ValidationException {
+ if (this.isEndDateBeforeStart()) {
+ throw new ValidationException("endDate must be after startDate");
+ }
+
+ for (OrderElement orderElement : this.getOrderElements()) {
+ if (!orderElement.checkAtLeastOneHoursGroup()) {
+ throw new ValidationException(
+ "At least one HoursGroup is needed for each OrderElement");
+ }
+ }
+ }
+
}
diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/services/TaskElementServiceTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/services/TaskElementServiceTest.java
index 6580a69b7..9703139bd 100644
--- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/services/TaskElementServiceTest.java
+++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/services/TaskElementServiceTest.java
@@ -18,12 +18,12 @@ import org.junit.Test;
import org.junit.matchers.JUnitMatchers;
import org.junit.runner.RunWith;
import org.navalplanner.business.common.exceptions.ValidationException;
+import org.navalplanner.business.orders.daos.IOrderDAO;
import org.navalplanner.business.orders.entities.HoursGroup;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.orders.entities.OrderLine;
import org.navalplanner.business.orders.entities.OrderLineGroup;
-import org.navalplanner.business.orders.services.IOrderService;
import org.navalplanner.business.planner.entities.Dependency;
import org.navalplanner.business.planner.entities.Task;
import org.navalplanner.business.planner.entities.TaskElement;
@@ -51,7 +51,7 @@ public class TaskElementServiceTest {
private SessionFactory sessionFactory;
@Autowired
- private IOrderService orderService;
+ private IOrderDAO orderDAO;
private HoursGroup associatedHoursGroup;
@@ -87,7 +87,8 @@ public class TaskElementServiceTest {
order.setInitDate(new Date());
order.add(orderLine);
try {
- orderService.save(order);
+ order.checkValid();
+ orderDAO.save(order);
sessionFactory.getCurrentSession().flush();
} catch (ValidationException e) {
throw new RuntimeException(e);
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/converters/OrderConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/converters/OrderConverter.java
index 583284fa5..b3542a7e0 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/converters/OrderConverter.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/converters/OrderConverter.java
@@ -1,12 +1,13 @@
package org.navalplanner.web.common.converters;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
+import org.navalplanner.business.orders.daos.IOrderDAO;
import org.navalplanner.business.orders.entities.Order;
-import org.navalplanner.business.orders.services.IOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
/**
* A {@link IConverter} for {@link Order}
@@ -17,12 +18,13 @@ import org.springframework.stereotype.Component;
public class OrderConverter implements IConverter {
@Autowired
- private IOrderService orderService;
+ private IOrderDAO orderDAO;
@Override
+ @Transactional(readOnly = true)
public Order asObject(String stringRepresentation) {
try {
- return orderService.find(Long.parseLong(stringRepresentation));
+ return orderDAO.find(Long.parseLong(stringRepresentation));
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java
index 04a353de8..655d0cf01 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java
@@ -11,10 +11,10 @@ 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.orders.daos.IOrderDAO;
import org.navalplanner.business.orders.entities.IOrderLineGroup;
import org.navalplanner.business.orders.entities.Order;
import org.navalplanner.business.orders.entities.OrderElement;
-import org.navalplanner.business.orders.services.IOrderService;
import org.navalplanner.business.planner.services.ITaskElementService;
import org.navalplanner.business.resources.daos.ICriterionDAO;
import org.navalplanner.business.resources.entities.Criterion;
@@ -45,7 +45,8 @@ public class OrderModel implements IOrderModel {
private static final Map> mapCriterions = new HashMap>();
- private final IOrderService orderService;
+ @Autowired
+ private IOrderDAO orderDAO;
private Order order;
@@ -57,24 +58,22 @@ public class OrderModel implements IOrderModel {
@Autowired
private IOrderElementModel orderElementModel;
- private final ITaskElementService taskElementService;
-
@Autowired
private ICriterionDAO criterionDAO;
@Autowired
- public OrderModel(IOrderService orderService,
- ITaskElementService taskElementService) {
- Validate.notNull(orderService);
+ private ITaskElementService taskElementService;
+
+ @Autowired
+ public OrderModel(ITaskElementService taskElementService) {
Validate.notNull(taskElementService);
- this.orderService = orderService;
this.taskElementService = taskElementService;
}
@Override
@Transactional(readOnly = true)
public List getOrders() {
- return orderService.getOrders();
+ return orderDAO.getOrders();
}
private void loadCriterions() {
@@ -99,7 +98,7 @@ public class OrderModel implements IOrderModel {
private Order getFromDB(Order order) {
try {
- return orderService.find(order.getId());
+ return orderDAO.find(order.getId());
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
@@ -121,8 +120,7 @@ public class OrderModel implements IOrderModel {
InvalidValue[] invalidValues = orderValidator.getInvalidValues(order);
if (invalidValues.length > 0)
throw new ValidationException(invalidValues);
-
- this.orderService.save(order);
+ this.orderDAO.save(order);
}
private void reattachCriterions() {
@@ -139,9 +137,10 @@ public class OrderModel implements IOrderModel {
}
@Override
+ @Transactional
public void remove(Order order) {
try {
- this.orderService.remove(order);
+ this.orderDAO.remove(order.getId());
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java
index 0fcb4327a..49a8cfa72 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java
@@ -7,8 +7,8 @@ import java.util.List;
import java.util.Set;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
+import org.navalplanner.business.orders.daos.IOrderDAO;
import org.navalplanner.business.orders.entities.Order;
-import org.navalplanner.business.orders.services.IOrderService;
import org.navalplanner.business.planner.entities.TaskElement;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
@@ -26,7 +26,7 @@ import org.zkoss.ganttz.adapters.PlannerConfiguration;
public abstract class OrderPlanningModel implements IOrderPlanningModel {
@Autowired
- private IOrderService orderService;
+ private IOrderDAO orderDAO;
private PlanningState planningState;
@@ -160,7 +160,7 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel {
private Order reload(Order order) {
try {
- return orderService.find(order.getId());
+ return orderDAO.find(order.getId());
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}