diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java index f1d4a317d..9e41b3a4f 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java @@ -17,17 +17,22 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ - package org.navalplanner.business.orders.entities; import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.hibernate.validator.NotNull; import org.navalplanner.business.common.BaseEntity; +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.resources.entities.ICriterionType; + public class HoursGroup extends BaseEntity implements Cloneable { @@ -44,7 +49,7 @@ public class HoursGroup extends BaseEntity implements Cloneable { private Boolean fixedPercentage = false; - private Set criterions = new HashSet(); + private Set criterionRequirements = new HashSet(); @NotNull private OrderLine parentOrderLine; @@ -105,62 +110,87 @@ public class HoursGroup extends BaseEntity implements Cloneable { return this.fixedPercentage; } - public void setCriterions(Set criterions) { - this.criterions = criterions; + public void setCriterionRequirements(Set criterionRequirements) { + this.criterionRequirements = criterionRequirements; + } + + public Set getCriterionRequirements() { + return criterionRequirements; } public Set getCriterions() { - return criterions; - } - - public void addCriterion(Criterion criterion) { - Criterion oldCriterion = getCriterionByType(criterion.getType()); - if (oldCriterion != null) { - removeCriterion(oldCriterion); + Set criterions = new HashSet(); + for(CriterionRequirement criterionRequirement: criterionRequirements){ + criterions.add(criterionRequirement.getCriterion()); } - - criterions.add(criterion); + return Collections.unmodifiableSet(criterions); } - public void removeCriterion(Criterion criterion) { - criterions.remove(criterion); + public void addCriterionRequirement(CriterionRequirement requirement) { + if (canAddCriterionRequirement(requirement)) { + requirement.setHoursGroup(this); + criterionRequirements.add(requirement); + } else { + throw new IllegalStateException( + " The " + + requirement.getCriterion().getName() + + " can not be assigned to this hoursGroup because it already exist in other hoursGroup"); + } } - public Criterion getCriterionByType(ICriterionType type) { - for (Criterion criterion : criterions) { - if (criterion.getType().equals(type)) { - return criterion; + private boolean canAddCriterionRequirement( + CriterionRequirement newRequirement) { + for (CriterionRequirement requirement : criterionRequirements) { + if (requirement.getCriterion() + .equals(newRequirement.getCriterion())) { + return false; } } + return true; + } + /* TO REMOVE */ + public void removeDirectCriterionRequirement(Criterion criterion){ + CriterionRequirement oldCriterionRequirement = + getDirectCriterionRequirementByCriterion(criterion); + if (oldCriterionRequirement != null) { + removeCriterionRequirement(oldCriterionRequirement); + } + } + + public void removeCriterionRequirement(CriterionRequirement criterionRequirement) { + criterionRequirements.remove(criterionRequirement); + } + + /* TO REMOVE */ + public CriterionRequirement getDirectCriterionRequirementByCriterion( + Criterion criterion) { + for (CriterionRequirement requirement : getDirectCriterionRequirement()) { + Criterion oldCriterion = requirement.getCriterion(); + if ((oldCriterion != null) + && (criterion.getId().equals(oldCriterion.getId()))) { + return requirement; + } + } return null; } - public Criterion getCriterionByType(String type) { - // TODO: Check if hoursgroup has criterions - for (Criterion criterion : criterions) { - if (criterion.getType().getName().equals(type)) { - return criterion; - } - } + /* TO REMOVE */ + public void addDirectRequirementCriterion(Criterion criterion) { + CriterionRequirement newCriterionRequirement = + DirectCriterionRequirement.create(criterion); + addCriterionRequirement(newCriterionRequirement); + } + /* TO REMOVE */ + public Criterion getDirectCriterion(Criterion criterion) { + CriterionRequirement requirement = getDirectCriterionRequirementByCriterion(criterion); + if (requirement != null) { + return requirement.getCriterion(); + } return null; } - public void removeCriterionByType(ICriterionType type) { - Criterion criterion = getCriterionByType(type); - if (criterion != null) { - removeCriterion(criterion); - } - } - - public void removeCriterionByType(String type) { - Criterion criterion = getCriterionByType(type); - if (criterion != null) { - removeCriterion(criterion); - } - } - public void setParentOrderLine(OrderLine parentOrderLine) { this.parentOrderLine = parentOrderLine; } @@ -169,4 +199,59 @@ public class HoursGroup extends BaseEntity implements Cloneable { return parentOrderLine; } + public void updateCriterionRequirements(){ + OrderLine newParent = getParentOrderLine(); + Set currentIndirects = + getCurrentRequirement(); + criterionRequirements.removeAll(getIndirectCriterionRequirement()); + criterionRequirements.addAll(currentIndirects); + } + + private Set getCurrentRequirement(){ + Set currentRequirements = + new HashSet(); + for(IndirectCriterionRequirement requirement :getIndirectRequirementParent()){ + IndirectCriterionRequirement newRequirement = findRequirementByParent(requirement + .getParent()); + if(newRequirement == null){ + newRequirement = IndirectCriterionRequirement. + create(requirement.getParent(),true); + } + currentRequirements.add(requirement); + } + return currentRequirements; + } + + private List getIndirectRequirementParent() { + return getParentOrderLine().getIndirectCriterionRequirement(); + } + + private IndirectCriterionRequirement findRequirementByParent( + CriterionRequirement newParent) { + for (IndirectCriterionRequirement requirement : getIndirectCriterionRequirement()) { + if (requirement.getParent().equals(newParent)) + return (IndirectCriterionRequirement) requirement; + } + return null; + } + + private List getIndirectCriterionRequirement() { + List list = new ArrayList(); + for(CriterionRequirement criterionRequirement : criterionRequirements ){ + if(criterionRequirement instanceof IndirectCriterionRequirement){ + list.add((IndirectCriterionRequirement) criterionRequirement); + } + } + return list; + } + + private List getDirectCriterionRequirement() { + List list = new ArrayList(); + for(CriterionRequirement criterionRequirement : criterionRequirements ){ + if(criterionRequirement instanceof DirectCriterionRequirement){ + list.add((DirectCriterionRequirement) criterionRequirement); + } + } + return list; + } } 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 d9ed8a08e..cf0a4584e 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 @@ -40,6 +40,9 @@ import org.navalplanner.business.advance.exceptions.DuplicateValueTrueReportGlob import org.navalplanner.business.common.BaseEntity; import org.navalplanner.business.labels.entities.Label; import org.navalplanner.business.planner.entities.TaskElement; +import org.navalplanner.business.requirements.entities.CriterionRequirement; +import org.navalplanner.business.requirements.entities.DirectCriterionRequirement; +import org.navalplanner.business.requirements.entities.IndirectCriterionRequirement; public abstract class OrderElement extends BaseEntity { @@ -65,6 +68,8 @@ public abstract class OrderElement extends BaseEntity { private Set taskElements = new HashSet(); + private Set criterionRequirements = new HashSet(); + protected OrderLineGroup parent; public OrderLineGroup getParent() { @@ -328,4 +333,85 @@ public abstract class OrderElement extends BaseEntity { return result; } + private void setCriterionRequirements(Set criterionRequirements) { + this.criterionRequirements = criterionRequirements; + } + + public Set getCriterionRequirements() { + return Collections.unmodifiableSet(criterionRequirements); + } + + public void updateCriterionRequirements(){ + updateCriterionRequirement(); + for(OrderElement orderElement : getChildren()){ + orderElement.updateCriterionRequirements(); + } + } + + protected void updateCriterionRequirement() { + OrderElement newParent = this.getParent(); + Set currentIndirects = + getCurrentIndirectRequirements(newParent); + criterionRequirements.removeAll(getIndirectCriterionRequirement()); + criterionRequirements.addAll(currentIndirects); + } + + protected Set getCurrentIndirectRequirements( + OrderElement newParent){ + Set currentIndirects = + new HashSet(); + if(newParent != null){ + for(CriterionRequirement requirement :newParent.getCriterionRequirements()){ + IndirectCriterionRequirement indirect = getCurrentIndirectRequirement(requirement); + currentIndirects.add(indirect); + } + } + return currentIndirects; + } + + protected IndirectCriterionRequirement getCurrentIndirectRequirement( + CriterionRequirement requirement){ + IndirectCriterionRequirement indirect; + DirectCriterionRequirement parent; + if(requirement instanceof DirectCriterionRequirement){ + parent = (DirectCriterionRequirement)requirement; + indirect = findIndirectRequirementByParent(parent); + }else{ + parent = ((IndirectCriterionRequirement)requirement).getParent(); + indirect = findIndirectRequirementByParent(parent); + } + if(indirect == null){ + indirect = IndirectCriterionRequirement.create(parent,true); + } + return (IndirectCriterionRequirement)indirect; + } + + private IndirectCriterionRequirement findIndirectRequirementByParent( + DirectCriterionRequirement newParent) { + for (IndirectCriterionRequirement requirement : getIndirectCriterionRequirement()) { + if (requirement.getParent().equals(newParent)) + return requirement; + } + return null; + } + + public void removeCriterionRequirement(CriterionRequirement criterionRequirement){ + //Remove the criterionRequirement into orderelement. + criterionRequirements.remove(criterionRequirement); + } + + public void addCriterionRequirement(CriterionRequirement criterionRequirement){ + criterionRequirement.setOrderElement(this); + this.criterionRequirements.add(criterionRequirement); + } + + protected List getIndirectCriterionRequirement() { + List list = new ArrayList(); + for (CriterionRequirement criterionRequirement : criterionRequirements) { + if (criterionRequirement instanceof IndirectCriterionRequirement) { + list.add((IndirectCriterionRequirement) criterionRequirement); + } + } + return list; + } } 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 e508f1c93..412197366 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 @@ -413,8 +413,13 @@ public class OrderLine extends OrderElement { return result; } } - return result; } + public void updateCriterionRequirements() { + updateCriterionRequirements(); + for (HoursGroup hoursGroup : this.getHoursGroups()) { + hoursGroup.updateCriterionRequirements(); + } + } } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/requirements/entities/CriterionRequirement.java b/navalplanner-business/src/main/java/org/navalplanner/business/requirements/entities/CriterionRequirement.java new file mode 100644 index 000000000..7550e335e --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/requirements/entities/CriterionRequirement.java @@ -0,0 +1,80 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.navalplanner.business.requirements.entities; + +import org.hibernate.validator.NotNull; +import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.orders.entities.HoursGroup; +import org.navalplanner.business.orders.entities.OrderElement; +import org.navalplanner.business.resources.entities.Criterion; + +/** + * + * @author Susana Montes Pedreira + */ +public class CriterionRequirement extends BaseEntity{ + + private HoursGroup hoursGroup; + + private OrderElement orderElement; + + @NotNull + private Criterion criterion; + + public CriterionRequirement(){ + + } + + public CriterionRequirement(Criterion criterion){ + this.criterion = criterion; + } + + public CriterionRequirement(Criterion criterion, + OrderElement orderElement,HoursGroup hoursGroup){ + this.criterion = criterion; + this.orderElement = orderElement; + this.hoursGroup = hoursGroup; + } + + public Criterion getCriterion() { + return criterion; + } + + public void setCriterion(Criterion criterion) { + this.criterion = criterion; + } + + public HoursGroup getHoursGroup() { + return hoursGroup; + } + + public void setHoursGroup(HoursGroup hoursGroup) { + this.hoursGroup = hoursGroup; + } + + public OrderElement getOrderElement() { + return orderElement; + } + + public void setOrderElement(OrderElement orderElement) { + this.orderElement = orderElement; + } +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/requirements/entities/DirectCriterionRequirement.java b/navalplanner-business/src/main/java/org/navalplanner/business/requirements/entities/DirectCriterionRequirement.java new file mode 100644 index 000000000..260636f04 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/requirements/entities/DirectCriterionRequirement.java @@ -0,0 +1,81 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.navalplanner.business.requirements.entities; + +import java.util.HashSet; +import java.util.Set; +import org.navalplanner.business.orders.entities.HoursGroup; +import org.navalplanner.business.orders.entities.OrderElement; +import org.navalplanner.business.resources.entities.Criterion; + +/** + * + * @author Susana Montes Pedreira + */ +public class DirectCriterionRequirement extends CriterionRequirement{ + + + Set children = + new HashSet(); + + public static DirectCriterionRequirement create(){ + DirectCriterionRequirement result = new DirectCriterionRequirement(); + result.setNewObject(true); + return result; + } + + public static DirectCriterionRequirement create(Criterion criterion){ + DirectCriterionRequirement result = new DirectCriterionRequirement(criterion); + result.setNewObject(true); + return result; + } + + public static DirectCriterionRequirement create(Criterion criterion, + OrderElement orderElement,HoursGroup hoursGroup){ + DirectCriterionRequirement result = new DirectCriterionRequirement(criterion, + orderElement,hoursGroup); + result.setNewObject(true); + return result; + } + + + public DirectCriterionRequirement(){ + } + + public DirectCriterionRequirement(Criterion criterion, + OrderElement orderElement,HoursGroup hoursGroup){ + super(criterion,orderElement,hoursGroup); + } + + public DirectCriterionRequirement(Criterion criterion){ + super(criterion); + } + + public Set getChildren() { + return children; + } + + public void setChildren(Set + children) { + this.children = children; + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/requirements/entities/IndirectCriterionRequirement.java b/navalplanner-business/src/main/java/org/navalplanner/business/requirements/entities/IndirectCriterionRequirement.java new file mode 100644 index 000000000..2962cf267 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/requirements/entities/IndirectCriterionRequirement.java @@ -0,0 +1,101 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.navalplanner.business.requirements.entities; +import org.hibernate.validator.NotNull; +import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.orders.entities.HoursGroup; +import org.navalplanner.business.orders.entities.OrderElement; + + +/** + * + * @author Susana Montes Pedreira + */ +public class IndirectCriterionRequirement extends CriterionRequirement{ + + @NotNull + private DirectCriterionRequirement parent; + + private Boolean isValid = true; + + public static IndirectCriterionRequirement create() { + IndirectCriterionRequirement result = new IndirectCriterionRequirement(); + result.setNewObject(true); + return result; + } + + public static IndirectCriterionRequirement create(DirectCriterionRequirement + parent,Criterion criterion) { + IndirectCriterionRequirement result = new IndirectCriterionRequirement(criterion); + result.setParent(parent); + return result; + } + + public static IndirectCriterionRequirement create(DirectCriterionRequirement + parent, Criterion criterion,OrderElement orderElement,HoursGroup hoursGroup){ + IndirectCriterionRequirement result = new IndirectCriterionRequirement(parent,criterion, + orderElement,hoursGroup); + result.setNewObject(true); + return result; + } + + public static IndirectCriterionRequirement create(DirectCriterionRequirement + parent,Boolean isValid) { + IndirectCriterionRequirement result = create(); + result.setParent(parent); + result.setIsValid(isValid); + return result; + } + + /** + * Constructor for hibernate. Do not use! + */ + public IndirectCriterionRequirement() { + + } + + public IndirectCriterionRequirement(Criterion criterion) { + super(criterion); + } + + public IndirectCriterionRequirement(DirectCriterionRequirement parent,Criterion criterion, + OrderElement orderElement,HoursGroup hoursGroup){ + super(criterion,orderElement,hoursGroup); + } + + public DirectCriterionRequirement getParent() { + return parent; + } + + public void setParent(DirectCriterionRequirement + directCriterionRequirement) { + this.parent = directCriterionRequirement; + } + + public boolean isIsValid() { + return isValid; + } + + public void setIsValid(boolean isValid) { + this.isValid = isValid; + } + +} diff --git a/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml b/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml index d2ffe38ad..0d6c68170 100644 --- a/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml +++ b/navalplanner-business/src/main/resources/navalplanner-business-spring-config.xml @@ -46,6 +46,9 @@ org/navalplanner/business/labels/entities/Labels.hbm.xml + + org/navalplanner/business/requirements/entities/Requirements.hbm.xml + diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/orders/entities/Orders.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/orders/entities/Orders.hbm.xml index 775432a91..a5da0eb23 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/orders/entities/Orders.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/orders/entities/Orders.hbm.xml @@ -30,6 +30,11 @@ + + + + + @@ -76,11 +81,9 @@ - - - + + + + + + + + + 100 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navalplanner-business/src/test/resources/navalplanner-business-spring-config-test.xml b/navalplanner-business/src/test/resources/navalplanner-business-spring-config-test.xml index 7a66d81d3..1fab6daf6 100644 --- a/navalplanner-business/src/test/resources/navalplanner-business-spring-config-test.xml +++ b/navalplanner-business/src/test/resources/navalplanner-business-spring-config-test.xml @@ -53,6 +53,9 @@ org/navalplanner/business/labels/entities/Labels.hbm.xml + + + org/navalplanner/business/requirements/entities/Requirements.hbm.xml TestEntities.hbm.xml diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IOrderModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IOrderModel.java index d68ce8863..0325679c0 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IOrderModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IOrderModel.java @@ -21,13 +21,15 @@ package org.navalplanner.web.orders; import java.util.List; - +import java.util.Map; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.labels.entities.Label; 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.planner.entities.TaskElement; +import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.CriterionType; /** * Contract for {@link OrderModel}
@@ -53,6 +55,10 @@ public interface IOrderModel { * * @return */ + List getCriterionsFor(CriterionType criterionType); + + Map> getMapCriterions(); + List