/** * *************************************************************************** * Copyright (c) 2010 Qcadoo Limited * Project: Qcadoo MES * Version: 1.4 * * This file is part of Qcadoo. * * Qcadoo 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * *************************************************************************** */ package com.qcadoo.mes.technologies.tree.builder; import java.util.List; import com.google.common.collect.Lists; import com.qcadoo.mes.technologies.tree.builder.api.InternalOperationProductComponent; import com.qcadoo.mes.technologies.tree.builder.api.InternalTechnologyOperationComponent; import com.qcadoo.mes.technologies.tree.builder.api.ItemWithQuantity; import com.qcadoo.mes.technologies.tree.builder.api.OperationProductComponent; import com.qcadoo.mes.technologies.tree.builder.api.TechnologyOperationComponent; import com.qcadoo.mes.technologies.tree.builder.api.TechnologyTreeAdapter; import com.qcadoo.model.api.Entity; import com.qcadoo.model.api.NumberService; public class TechnologyTreeBuilder<T, P> { private final TechnologyTreeAdapter<T, P> adapter; private final TechnologyTreeComponentsFactory compsFactory; public TechnologyTreeBuilder(final TechnologyTreeComponentsFactory opBuilder, final TechnologyTreeAdapter<T, P> transformer) { this.adapter = transformer; this.compsFactory = opBuilder; } public Entity build(final T from, final NumberService numberService) { TechnologyOperationComponent root = buildOp(from, numberService); return root.getWrappedEntity(); } private TechnologyOperationComponent buildOp(final T from, final NumberService numberService) { InternalTechnologyOperationComponent toc = compsFactory.buildToc(); adapter.setOpCompCustomFields(toc, from); toc.addInputProducts(getProductComponents(OperationProductComponent.OperationCompType.INPUT, adapter.extractInputProducts(from), numberService)); toc.addOutputProducts(getProductComponents(OperationProductComponent.OperationCompType.OUTPUT, adapter.extractOutputProducts(from), numberService)); toc.setOperation(adapter.buildOperationEntity(from)); for (T subOperation : adapter.extractSubOperations(from)) { toc.addSubOperation(buildOp(subOperation, numberService)); } return toc; } private List<OperationProductComponent> getProductComponents(final OperationProductComponent.OperationCompType opcType, final Iterable<ItemWithQuantity<P>> productComponents, final NumberService numberService) { final List<OperationProductComponent> operationProductComponents = Lists.newArrayList(); for (ItemWithQuantity<P> productAndQuantity : productComponents) { InternalOperationProductComponent opc = compsFactory.buildOpc(opcType); adapter.setOpProductCompCustomFields(opc, productAndQuantity.getItem()); opc.setQuantity(numberService.setScale(productAndQuantity.getQuantity())); opc.setProduct(adapter.buildProductEntity(productAndQuantity.getItem())); opc.setPriority(productAndQuantity.getPriority()); operationProductComponents.add(opc); } return operationProductComponents; } }