package org.sigmah.server.service; /* * #%L * Sigmah * %% * Copyright (C) 2010 - 2016 URD * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import java.util.ArrayList; import java.util.List; import org.sigmah.client.util.AdminUtil; import org.sigmah.server.dispatch.impl.UserDispatch.UserExecutionContext; import org.sigmah.server.domain.OrgUnitModel; import org.sigmah.server.domain.ProjectModel; import org.sigmah.server.domain.element.BudgetElement; import org.sigmah.server.domain.element.BudgetSubField; import org.sigmah.server.domain.element.FlexibleElement; import org.sigmah.server.domain.importation.ImportationScheme; import org.sigmah.server.domain.importation.ImportationSchemeModel; import org.sigmah.server.domain.importation.Variable; import org.sigmah.server.domain.importation.VariableBudgetElement; import org.sigmah.server.domain.importation.VariableBudgetSubField; import org.sigmah.server.domain.importation.VariableBudgetSubFieldId; import org.sigmah.server.domain.importation.VariableFlexibleElement; import org.sigmah.server.service.base.AbstractEntityService; import org.sigmah.server.service.util.PropertyMap; import org.sigmah.shared.dto.OrgUnitModelDTO; import org.sigmah.shared.dto.ProjectModelDTO; import org.sigmah.shared.dto.element.BudgetElementDTO; import org.sigmah.shared.dto.element.FlexibleElementDTO; import org.sigmah.shared.dto.importation.ImportationSchemeDTO; import org.sigmah.shared.dto.importation.ImportationSchemeModelDTO; import org.sigmah.shared.dto.importation.VariableBudgetSubFieldDTO; import org.sigmah.shared.dto.importation.VariableDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Singleton; /** * {@link ImportationSchemeModel} entity policy. * * @author Maxime Lombard (mlombard@ideia.fr) * @author Denis Colliot (dcolliot@ideia.fr) */ @Singleton public class ImportationSchemeModelService extends AbstractEntityService<ImportationSchemeModel, Integer, ImportationSchemeModelDTO> { /** * Logger. */ @SuppressWarnings("unused") private static final Logger LOG = LoggerFactory.getLogger(ImportationSchemeModelService.class); /** * {@inheritDoc} */ @Override public ImportationSchemeModel create(final PropertyMap properties, final UserExecutionContext context) { final ImportationSchemeModel importationSchemeModel = new ImportationSchemeModel(); ImportationSchemeModelDTO importationSchemeModelDTO = (ImportationSchemeModelDTO) properties.get(AdminUtil.ADMIN_IMPORTATION_SCHEME_MODEL); ImportationSchemeDTO importationSchemeDTO = properties.get(AdminUtil.ADMIN_SCHEMA); ProjectModelDTO projectModelDTO = null; OrgUnitModelDTO orgUnitModelDTO = null; if (properties.get(AdminUtil.ADMIN_PROJECT_MODEL) != null) { projectModelDTO = properties.get(AdminUtil.ADMIN_PROJECT_MODEL); } else if (properties.get(AdminUtil.ADMIN_ORG_UNIT_MODEL) != null) { orgUnitModelDTO = properties.get(AdminUtil.ADMIN_ORG_UNIT_MODEL); } if (importationSchemeModelDTO.getId() != null) { update(importationSchemeModelDTO.getId(), properties, context); } else { if (importationSchemeDTO != null && (projectModelDTO != null || orgUnitModelDTO != null)) { ImportationScheme importationScheme = em().find(ImportationScheme.class, importationSchemeDTO.getId()); importationSchemeModel.setImportationScheme(importationScheme); if (projectModelDTO != null) { ProjectModel pm = em().find(ProjectModel.class, projectModelDTO.getId()); importationSchemeModel.setProjectModel(pm); } else { OrgUnitModel oum = em().find(OrgUnitModel.class, orgUnitModelDTO.getId()); importationSchemeModel.setOrgUnitModel(oum); } em().persist(importationSchemeModel); } } return importationSchemeModel; } /** * {@inheritDoc} */ @Override public ImportationSchemeModel update(final Integer entityId, final PropertyMap changes, final UserExecutionContext context) { if (changes.get(AdminUtil.ADMIN_IMPORTATION_SCHEME_MODEL) == null) { throw new IllegalArgumentException("No importation scheme model found into properties map."); } if (changes.get(AdminUtil.PROP_FX_FLEXIBLE_ELEMENT) == null) { throw new IllegalArgumentException("No flexible element found into properties map."); } // Retrieve the importationSchemeModel. ImportationSchemeModel importationSchemeModel = em().find(ImportationSchemeModel.class, entityId); FlexibleElementDTO flexibleElementDTO = (FlexibleElementDTO) changes.get(AdminUtil.PROP_FX_FLEXIBLE_ELEMENT); if (flexibleElementDTO instanceof BudgetElementDTO) { if (changes.get(AdminUtil.PROP_VAR_FLE_BUDGETSUBFIELDS) != null) { VariableBudgetElement varBe = new VariableBudgetElement(); BudgetElement fle = em().find(BudgetElement.class, flexibleElementDTO.getId()); varBe.setFlexibleElement(fle); final Boolean key = changes.get(AdminUtil.PROP_VAR_FLE_ID_KEY); varBe.setIsKey(key != null && key); varBe.setImportationSchemeModel(importationSchemeModel); em().persist(varBe); @SuppressWarnings("unchecked") List<VariableBudgetSubFieldDTO> varBfDTOs = (List<VariableBudgetSubFieldDTO>) changes.get(AdminUtil.PROP_VAR_FLE_BUDGETSUBFIELDS); List<VariableBudgetSubField> varBsfs = new ArrayList<VariableBudgetSubField>(); for (VariableBudgetSubFieldDTO vbsf : varBfDTOs) { VariableBudgetSubField varBsf = new VariableBudgetSubField(); BudgetSubField bsf = em().find(BudgetSubField.class, vbsf.getBudgetSubFieldDTO().getId()); varBsf.setBudgetSubField(bsf); Variable variable = em().find(Variable.class, vbsf.getVariableDTO().getId()); varBsf.setVariable(variable); varBsf.setVariableBudgetElement(varBe); VariableBudgetSubFieldId varbsfId = new VariableBudgetSubFieldId(); varbsfId.setBudgetSubFieldId(bsf.getId()); varbsfId.setVarId(variable.getId()); varbsfId.setVariableFlexibleId(varBe.getId()); varBsf.setId(varbsfId); varBsfs.add(varBsf); } varBe.setVariableBudgetSubFields(varBsfs); em().merge(varBe); importationSchemeModel.getVariableFlexibleElements().add(varBe); } } else { if (changes.get(AdminUtil.PROP_VAR_VARIABLE) != null) { VariableDTO variableDTO = (VariableDTO) changes.get(AdminUtil.PROP_VAR_VARIABLE); VariableFlexibleElement varfle = new VariableFlexibleElement(); Variable variable = em().find(Variable.class, variableDTO.getId()); varfle.setVariable(variable); FlexibleElement fle = em().find(FlexibleElement.class, flexibleElementDTO.getId()); varfle.setFlexibleElement(fle); final Boolean key = changes.get(AdminUtil.PROP_VAR_FLE_ID_KEY); varfle.setIsKey(key != null && key); varfle.setImportationSchemeModel(importationSchemeModel); em().persist(varfle); importationSchemeModel.getVariableFlexibleElements().add(varfle); } } return em().merge(importationSchemeModel); } }