diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/InfoComponent.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/InfoComponent.java
index cba21b174..d1209bca8 100644
--- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/InfoComponent.java
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/InfoComponent.java
@@ -60,4 +60,12 @@ public class InfoComponent {
public String getDescription() {
return description;
}
+
+ public InfoComponent copy() {
+ InfoComponent result = new InfoComponent();
+ result.setCode(getCode());
+ result.setName(getName());
+ result.setDescription(getDescription());
+ return result;
+ }
}
\ 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 f29cdc25c..8743b7ada 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
@@ -33,6 +33,7 @@ import org.navalplanner.business.planner.entities.Task;
import org.navalplanner.business.planner.entities.TaskElement;
import org.navalplanner.business.planner.entities.TaskGroup;
import org.navalplanner.business.resources.entities.Resource;
+import org.navalplanner.business.templates.entities.OrderTemplate;
/**
* It represents an {@link Order} with its related information.
@@ -233,4 +234,9 @@ public class Order extends OrderLineGroup {
return true;
}
+ @Override
+ public OrderTemplate createTemplate() {
+ return OrderTemplate.create(this);
+ }
+
}
diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java
index c316fac83..fed243126 100644
--- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java
@@ -60,6 +60,7 @@ import org.navalplanner.business.requirements.entities.CriterionRequirement;
import org.navalplanner.business.requirements.entities.DirectCriterionRequirement;
import org.navalplanner.business.requirements.entities.IndirectCriterionRequirement;
import org.navalplanner.business.resources.entities.Criterion;
+import org.navalplanner.business.templates.entities.OrderElementTemplate;
public abstract class OrderElement extends BaseEntity implements
ICriterionRequirable {
@@ -342,6 +343,8 @@ public abstract class OrderElement extends BaseEntity implements
return getInfoComponent().getCode();
}
+ public abstract OrderElementTemplate createTemplate();
+
public abstract DirectAdvanceAssignment getReportGlobalAdvanceAssignment();
public Set getDirectAdvanceAssignments() {
@@ -928,7 +931,7 @@ public abstract class OrderElement extends BaseEntity implements
}
@Valid
- private InfoComponent getInfoComponent() {
+ public InfoComponent getInfoComponent() {
if (infoComponent == null) {
infoComponent = new InfoComponent();
}
diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLine.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLine.java
index 7f1346ab1..3f067c86a 100644
--- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLine.java
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLine.java
@@ -36,6 +36,7 @@ import org.navalplanner.business.advance.entities.AdvanceType;
import org.navalplanner.business.advance.entities.DirectAdvanceAssignment;
import org.navalplanner.business.requirements.entities.CriterionRequirement;
import org.navalplanner.business.requirements.entities.DirectCriterionRequirement;
+import org.navalplanner.business.templates.entities.OrderLineTemplate;
public class OrderLine extends OrderElement {
@@ -529,4 +530,9 @@ public class OrderLine extends OrderElement {
return true;
}
+ @Override
+ public OrderLineTemplate createTemplate() {
+ return OrderLineTemplate.create(this);
+ }
+
}
\ No newline at end of file
diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLineGroup.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLineGroup.java
index e4132edd4..fc7ad95ac 100644
--- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLineGroup.java
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLineGroup.java
@@ -44,6 +44,8 @@ import org.navalplanner.business.advance.entities.DirectAdvanceAssignment;
import org.navalplanner.business.advance.entities.IndirectAdvanceAssignment;
import org.navalplanner.business.advance.exceptions.DuplicateAdvanceAssignmentForOrderElementException;
import org.navalplanner.business.advance.exceptions.DuplicateValueTrueReportGlobalAdvanceException;
+import org.navalplanner.business.templates.entities.OrderElementTemplate;
+import org.navalplanner.business.templates.entities.OrderLineGroupTemplate;
public class OrderLineGroup extends OrderElement implements IOrderLineGroup {
public static OrderLineGroup create() {
@@ -693,4 +695,9 @@ public class OrderLineGroup extends OrderElement implements IOrderLineGroup {
return null;
}
+ @Override
+ public OrderElementTemplate createTemplate() {
+ return OrderLineGroupTemplate.create(this);
+ }
+
}
diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderElementTemplate.java b/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderElementTemplate.java
index d45e5fa2c..d9759ab6f 100644
--- a/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderElementTemplate.java
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderElementTemplate.java
@@ -19,10 +19,17 @@
*/
package org.navalplanner.business.templates.entities;
+import java.util.Date;
+
+import org.apache.commons.lang.Validate;
import org.hibernate.validator.Min;
import org.hibernate.validator.Valid;
+import org.joda.time.DateTime;
+import org.joda.time.Days;
import org.navalplanner.business.common.BaseEntity;
import org.navalplanner.business.orders.entities.InfoComponent;
+import org.navalplanner.business.orders.entities.Order;
+import org.navalplanner.business.orders.entities.OrderElement;
/**
* @author Óscar González Fernández
@@ -30,6 +37,48 @@ import org.navalplanner.business.orders.entities.InfoComponent;
*/
public abstract class OrderElementTemplate extends BaseEntity {
+ public static T create(T beingBuilt,
+ OrderElement origin) {
+ InfoComponent infoComponentCopied = origin.getInfoComponent().copy();
+ Order order = origin.getOrder();
+ Days fromBeginningToStart = daysBetween(order.getInitDate(), origin
+ .getInitDate());
+ Days fromBeginningToEnd = daysBetween(order.getDeadline(), origin
+ .getDeadline());
+ return create(beingBuilt, infoComponentCopied,
+ fromBeginningToStart, fromBeginningToEnd);
+ }
+
+ private static T create(T beingBuilt,
+ InfoComponent infoComponentCopied, Days fromBeginningToStart,
+ Days fromBeginningToEnd) {
+ Validate.isTrue(isNullOrPositive(fromBeginningToStart));
+ Validate.isTrue(isNullOrPositive(fromBeginningToEnd));
+ beingBuilt.infoComponent = infoComponentCopied;
+ beingBuilt.startAsDaysFromBeginning = daysToInteger(fromBeginningToStart);
+ beingBuilt.deadlineAsDaysFromBeginning = daysToInteger(fromBeginningToEnd);
+ return create(beingBuilt);
+ }
+
+ private static Days daysBetween(Date start, Date end) {
+ if (start == null || end == null) {
+ return null;
+ }
+ return Days.daysBetween(asDateTime(start), asDateTime(end));
+ }
+
+ private static DateTime asDateTime(Date date) {
+ return new DateTime(date);
+ }
+
+ private static boolean isNullOrPositive(Days days) {
+ return days == null || days.getDays() >= 0;
+ }
+
+ private static Integer daysToInteger(Days days) {
+ return days != null ? days.getDays() : null;
+ }
+
private InfoComponent infoComponent;
private Integer startAsDaysFromBeginning;
@@ -38,6 +87,14 @@ public abstract class OrderElementTemplate extends BaseEntity {
private OrderLineGroupTemplate parent;
+ public OrderLineGroupTemplate getParent() {
+ return parent;
+ }
+
+ protected void setParent(OrderLineGroupTemplate parent) {
+ this.parent = parent;
+ }
+
@Valid
private InfoComponent getInfoComponent() {
if (infoComponent == null) {
diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderLineGroupTemplate.java b/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderLineGroupTemplate.java
index 390ccc917..3f276357a 100644
--- a/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderLineGroupTemplate.java
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderLineGroupTemplate.java
@@ -22,12 +22,38 @@ package org.navalplanner.business.templates.entities;
import java.util.ArrayList;
import java.util.List;
+import org.navalplanner.business.orders.entities.OrderElement;
+import org.navalplanner.business.orders.entities.OrderLineGroup;
+
/**
* @author Óscar González Fernández
*
*/
public class OrderLineGroupTemplate extends OrderElementTemplate {
+ public static OrderLineGroupTemplate create(OrderLineGroup group) {
+ return create(new OrderLineGroupTemplate(), group);
+ }
+
+ protected static T create(T beingBuilt,
+ OrderLineGroup group) {
+ List result = buildChildrenTemplates(beingBuilt,
+ group.getChildren());
+ beingBuilt.children = result;
+ return OrderElementTemplate.create(beingBuilt, group);
+ }
+
+ private static List buildChildrenTemplates(
+ OrderLineGroupTemplate parent, List children) {
+ List result = new ArrayList();
+ for (OrderElement each : children) {
+ OrderElementTemplate template = each.createTemplate();
+ template.setParent(parent);
+ result.add(template);
+ }
+ return result;
+ }
+
private List children = new ArrayList();
}
diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderLineTemplate.java b/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderLineTemplate.java
index 09c701dfe..a9b72c4f3 100644
--- a/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderLineTemplate.java
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderLineTemplate.java
@@ -19,10 +19,16 @@
*/
package org.navalplanner.business.templates.entities;
+import org.navalplanner.business.orders.entities.OrderLine;
+
/**
* @author Óscar González Fernández
*
*/
public class OrderLineTemplate extends OrderElementTemplate {
+ public static OrderLineTemplate create(OrderLine orderLine) {
+ return create(new OrderLineTemplate(), orderLine);
+ }
+
}
diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderTemplate.java b/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderTemplate.java
index 715e5b7e1..4bda4c9b0 100644
--- a/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderTemplate.java
+++ b/navalplanner-business/src/main/java/org/navalplanner/business/templates/entities/OrderTemplate.java
@@ -21,6 +21,7 @@ package org.navalplanner.business.templates.entities;
import org.hibernate.validator.NotNull;
import org.navalplanner.business.calendars.entities.BaseCalendar;
+import org.navalplanner.business.orders.entities.Order;
/**
* @author Óscar González Fernández
@@ -28,6 +29,12 @@ import org.navalplanner.business.calendars.entities.BaseCalendar;
*/
public class OrderTemplate extends OrderLineGroupTemplate {
+ public static OrderTemplate create(Order order) {
+ OrderTemplate beingBuilt = new OrderTemplate();
+ beingBuilt.calendar = order.getCalendar();
+ return create(beingBuilt, order);
+ }
+
@NotNull(message = "order calendar not specified")
private BaseCalendar calendar;
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/IOrderTemplatesModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/IOrderTemplatesModel.java
index 53f2d9ec7..33b4c5539 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/IOrderTemplatesModel.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/IOrderTemplatesModel.java
@@ -21,6 +21,7 @@ package org.navalplanner.web.templates;
import java.util.List;
+import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.templates.entities.OrderElementTemplate;
/**
@@ -30,4 +31,6 @@ import org.navalplanner.business.templates.entities.OrderElementTemplate;
public interface IOrderTemplatesModel {
List getTemplates();
+
+ OrderElementTemplate createTemplateFrom(OrderElement orderElement);
}
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/OrderTemplatesController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/OrderTemplatesController.java
index 076666a94..bf36443d7 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/OrderTemplatesController.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/OrderTemplatesController.java
@@ -65,7 +65,7 @@ public class OrderTemplatesController extends GenericForwardComposer implements
@Override
public void goToCreateTemplateFrom(OrderElement orderElement) {
- System.out.println("TODO: create template from " + orderElement);
+ OrderElementTemplate template = model.createTemplateFrom(orderElement);
}
@Override
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/OrderTemplatesModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/OrderTemplatesModel.java
index 226d91305..812a6697e 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/OrderTemplatesModel.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/OrderTemplatesModel.java
@@ -21,12 +21,15 @@ package org.navalplanner.web.templates;
import java.util.List;
+import org.navalplanner.business.orders.daos.IOrderElementDAO;
+import org.navalplanner.business.orders.entities.OrderElement;
import org.navalplanner.business.templates.daos.IOrderElementTemplateDAO;
import org.navalplanner.business.templates.entities.OrderElementTemplate;
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;
/**
* @author Óscar González Fernández
@@ -36,6 +39,9 @@ import org.springframework.stereotype.Component;
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class OrderTemplatesModel implements IOrderTemplatesModel {
+ @Autowired
+ private IOrderElementDAO orderElementDAO;
+
@Autowired
private IOrderElementTemplateDAO dao;
@@ -44,4 +50,21 @@ public class OrderTemplatesModel implements IOrderTemplatesModel {
return dao.list(OrderElementTemplate.class);
}
+ @Override
+ @Transactional(readOnly = true)
+ public OrderElementTemplate createTemplateFrom(OrderElement orderElement) {
+ loadParentsInOrderToAvoidProxies(orderElement);
+ OrderElement reloaded = orderElementDAO
+ .findExistingEntity(orderElement.getId());
+ OrderElementTemplate result = reloaded.createTemplate();
+ return result;
+ }
+
+ private void loadParentsInOrderToAvoidProxies(OrderElement orderElement) {
+ OrderElement current = orderElement;
+ while (current != null) {
+ current = orderElementDAO.findParent(current);
+ }
+ }
+
}