/* * This file is part of LibrePlan * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia * Copyright (C) 2010-2011 Igalia, S.L. * * 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 <http://www.gnu.org/licenses/>. */ package org.libreplan.business.templates.entities; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.libreplan.business.orders.entities.CriterionRequirementHandler; import org.libreplan.business.orders.entities.HoursGroup; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.requirements.entities.CriterionRequirement; import org.libreplan.business.requirements.entities.DirectCriterionRequirement; import org.libreplan.business.requirements.entities.IndirectCriterionRequirement; import org.libreplan.business.resources.entities.Criterion; /** * * @author Diego Pino Garcia <dpino@igalia.com> * */ public class CriterionRequirementTemplateHandler extends CriterionRequirementHandler<OrderElementTemplate, OrderLineTemplate, OrderLineGroupTemplate>{ private static final CriterionRequirementTemplateHandler singleton = new CriterionRequirementTemplateHandler(); private CriterionRequirementTemplateHandler() { } public static CriterionRequirementTemplateHandler getInstance() { return singleton; } @Override protected void addIndirectCriterionRequirementToOrderLine( OrderLineTemplate orderLine, IndirectCriterionRequirement indirect) { orderLine.addIndirectCriterionRequirement(indirect); } @Override protected void basicAddCriterionRequirement( OrderElementTemplate orderElement, CriterionRequirement criterionRequirement) { orderElement.basicAddCriterionRequirement(criterionRequirement); } @Override protected void basicAddCriterionRequirementIntoOrderLineGroup( OrderLineGroupTemplate orderLineGroup, CriterionRequirement criterionRequirement) { orderLineGroup.basicAddCriterionRequirement(criterionRequirement); } @Override protected List<OrderElementTemplate> getAllChildren( OrderElementTemplate orderElement) { return orderElement.getAllChildren(); } @Override protected List<OrderElementTemplate> getChildren( OrderElementTemplate orderElement) { return orderElement.getChildren(); } @Override protected Set<CriterionRequirement> getCriterionRequirements( OrderElementTemplate orderElement) { return orderElement.getCriterionRequirements(); } @Override protected Set<DirectCriterionRequirement> getDirectCriterionRequirement( OrderElementTemplate orderElement) { return orderElement.getDirectCriterionRequirements(); } @Override protected Set<DirectCriterionRequirement> getDirectCriterionRequirementFromOrderLine( OrderLineTemplate orderLine) { return orderLine.getDirectCriterionRequirements(); } @Override protected Set<DirectCriterionRequirement> getDirectCriterionRequirementFromOrderLineGroup( OrderLineGroupTemplate orderLineGroup) { return orderLineGroup.getDirectCriterionRequirements(); } @Override protected List<HoursGroup> getHoursGroups(OrderLineTemplate orderline) { return orderline.getHoursGroups(); } @Override protected Set<IndirectCriterionRequirement> getIndirectCriterionRequirement( OrderElementTemplate orderElement) { return orderElement.getIndirectCriterionRequirement(); } @Override protected Set<IndirectCriterionRequirement> getIndirectCriterionRequirementFromOrderLine( OrderLineTemplate orderLine) { return orderLine.getIndirectCriterionRequirement(); } @Override protected Set<IndirectCriterionRequirement> getIndirectCriterionRequirementFromOrderLineGroup( OrderLineGroupTemplate orderLineGroup) { return orderLineGroup.getIndirectCriterionRequirement(); } @Override protected List<OrderElementTemplate> getOrderLineGroupChildren( OrderLineGroupTemplate orderLineGroup) { return orderLineGroup.getChildren(); } @Override protected List<HoursGroup> getOrderLineHoursGroups( OrderLineTemplate orderLine) { return orderLine.getHoursGroups(); } @Override protected OrderElementTemplate getParent(OrderElementTemplate orderElement) { return orderElement.getParent(); } @Override protected boolean isOrderLine(OrderElementTemplate orderElement) { return (orderElement instanceof OrderLineTemplate); } @Override protected boolean isOrderLineGroup(OrderElementTemplate orderElement) { return (orderElement instanceof OrderLineGroupTemplate); } @Override protected void removeCriterionRequirement( OrderElementTemplate orderElement, CriterionRequirement criterionRequirement) { orderElement.removeCriterionRequirement(criterionRequirement); } @Override protected OrderElementTemplate toOrderElement(OrderLineTemplate orderLine) { return (OrderElementTemplate) orderLine; } @Override protected OrderLineTemplate toOrderLine(OrderElementTemplate orderElement) { return (OrderLineTemplate) orderElement; } @Override protected OrderLineGroupTemplate toOrderLineGroup( OrderElementTemplate orderElement) { return (OrderLineGroupTemplate) orderElement; } @Override protected Collection<HoursGroup> myHoursGroups(OrderLineTemplate orderline) { return orderline.myHoursGroups(); } @Override public void copyIndirectCriterionRequirementsFromOriginalToOrderLineGroupChildren( OrderLineGroupTemplate orderLineGroup, DirectCriterionRequirement parent) { final List<OrderElementTemplate> orderElements = orderLineGroup.getChildren(); final Criterion criterion = parent.getCriterion(); final Set<IndirectCriterionRequirement> originalIndirectCriterionRequirements = parent .getOrigin().getChildren(); final Map<OrderElement, Map<Criterion, Boolean>> mapTemplateCriterion = createOrderElementCriterionMap(originalIndirectCriterionRequirements); for (OrderElementTemplate each : orderElements) { Map<Criterion, Boolean> criterionMap = mapTemplateCriterion .get(each.getOrigin()); if (criterionMap != null) { IndirectCriterionRequirement indirect = IndirectCriterionRequirement .create(parent, criterion); indirect.setValid(criterionMap.get(criterion)); addIndirectCriterionRequirement(each, indirect); } if (isOrderLineGroup(each)) { copyIndirectCriterionRequirementsFromOriginalToOrderLineGroupChildren( toOrderLineGroup(each), parent); } } } private Map<OrderElement, Map<Criterion, Boolean>> createOrderElementCriterionMap( Set<IndirectCriterionRequirement> indirects) { Map<OrderElement, Map<Criterion, Boolean>> result = new HashMap<OrderElement, Map<Criterion, Boolean>>(); for (IndirectCriterionRequirement each: indirects) { final OrderElement orderElement = each.getOrderElement(); if (orderElement != null) { Map<Criterion, Boolean> value = result.get(orderElement); if (value == null) { value = new HashMap<Criterion, Boolean>(); } value.put(each.getCriterion(), each.isValid()); result.put(orderElement, value); } } return result; } }