ItEr41S20CUGravacionModelosUnidadesTraballoItEr40S25: Creating template from order element

This commit is contained in:
Óscar González Fernández 2010-01-03 17:18:31 +01:00
parent f21c59eefa
commit d30bad1994
12 changed files with 154 additions and 2 deletions

View file

@ -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;
}
}

View file

@ -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. <br />
@ -233,4 +234,9 @@ public class Order extends OrderLineGroup {
return true;
}
@Override
public OrderTemplate createTemplate() {
return OrderTemplate.create(this);
}
}

View file

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

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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 <ogonzalez@igalia.com>
@ -30,6 +37,48 @@ import org.navalplanner.business.orders.entities.InfoComponent;
*/
public abstract class OrderElementTemplate extends BaseEntity {
public static <T extends OrderElementTemplate> 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 extends OrderElementTemplate> 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) {

View file

@ -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 <ogonzalez@igalia.com>
*
*/
public class OrderLineGroupTemplate extends OrderElementTemplate {
public static OrderLineGroupTemplate create(OrderLineGroup group) {
return create(new OrderLineGroupTemplate(), group);
}
protected static <T extends OrderLineGroupTemplate> T create(T beingBuilt,
OrderLineGroup group) {
List<OrderElementTemplate> result = buildChildrenTemplates(beingBuilt,
group.getChildren());
beingBuilt.children = result;
return OrderElementTemplate.create(beingBuilt, group);
}
private static List<OrderElementTemplate> buildChildrenTemplates(
OrderLineGroupTemplate parent, List<OrderElement> children) {
List<OrderElementTemplate> result = new ArrayList<OrderElementTemplate>();
for (OrderElement each : children) {
OrderElementTemplate template = each.createTemplate();
template.setParent(parent);
result.add(template);
}
return result;
}
private List<OrderElementTemplate> children = new ArrayList<OrderElementTemplate>();
}

View file

@ -19,10 +19,16 @@
*/
package org.navalplanner.business.templates.entities;
import org.navalplanner.business.orders.entities.OrderLine;
/**
* @author Óscar González Fernández <ogonzalez@igalia.com>
*
*/
public class OrderLineTemplate extends OrderElementTemplate {
public static OrderLineTemplate create(OrderLine orderLine) {
return create(new OrderLineTemplate(), orderLine);
}
}

View file

@ -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 <ogonzalez@igalia.com>
@ -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;

View file

@ -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<OrderElementTemplate> getTemplates();
OrderElementTemplate createTemplateFrom(OrderElement orderElement);
}

View file

@ -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

View file

@ -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 <ogonzalez@igalia.com>
@ -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);
}
}
}