From d30bad1994d8755ed09f0fb6e875467d7179fbcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Sun, 3 Jan 2010 17:18:31 +0100 Subject: [PATCH] ItEr41S20CUGravacionModelosUnidadesTraballoItEr40S25: Creating template from order element --- .../orders/entities/InfoComponent.java | 8 +++ .../business/orders/entities/Order.java | 6 ++ .../orders/entities/OrderElement.java | 5 +- .../business/orders/entities/OrderLine.java | 6 ++ .../orders/entities/OrderLineGroup.java | 7 +++ .../entities/OrderElementTemplate.java | 57 +++++++++++++++++++ .../entities/OrderLineGroupTemplate.java | 26 +++++++++ .../templates/entities/OrderLineTemplate.java | 6 ++ .../templates/entities/OrderTemplate.java | 7 +++ .../web/templates/IOrderTemplatesModel.java | 3 + .../templates/OrderTemplatesController.java | 2 +- .../web/templates/OrderTemplatesModel.java | 23 ++++++++ 12 files changed, 154 insertions(+), 2 deletions(-) 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); + } + } + }