package org.sigmah.server.servlet.importer;
/*
* #%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 com.google.inject.Inject;
import com.google.inject.Injector;
import com.extjs.gxt.ui.client.data.BaseModelData;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import javax.persistence.EntityTransaction;
import org.sigmah.server.dao.AbstractDaoTest;
import org.sigmah.server.dao.UserDAO;
import org.sigmah.server.dispatch.impl.UserDispatch;
import org.sigmah.server.domain.*;
import org.sigmah.server.domain.base.Entity;
import org.sigmah.server.domain.element.DefaultFlexibleElement;
import org.sigmah.server.domain.element.TextAreaElement;
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.VariableFlexibleElement;
import org.sigmah.server.domain.layout.Layout;
import org.sigmah.server.domain.profile.GlobalPermission;
import org.sigmah.server.domain.profile.OrgUnitProfile;
import org.sigmah.server.domain.profile.Profile;
import org.sigmah.server.domain.value.Value;
import org.sigmah.server.mapper.Mapper;
import org.sigmah.server.security.Authenticator;
import org.sigmah.shared.Language;
import org.sigmah.shared.command.AutomatedImport;
import org.sigmah.shared.dispatch.CommandException;
import org.sigmah.shared.dto.ProjectDTO;
import org.sigmah.shared.dto.importation.ImportationSchemeDTO;
import org.sigmah.shared.dto.referential.AmendmentState;
import org.sigmah.shared.dto.referential.AutomatedImportStatus;
import org.sigmah.shared.dto.referential.DefaultFlexibleElementType;
import org.sigmah.shared.dto.referential.GlobalPermissionEnum;
import org.sigmah.shared.dto.referential.ImportationSchemeFileFormat;
import org.sigmah.shared.dto.referential.ImportationSchemeImportType;
import org.sigmah.shared.dto.referential.ProjectModelStatus;
import org.sigmah.shared.dto.referential.TextAreaType;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Test class for <code>AutomatedImporter</code>.
*
* @author Raphaël Calabro (raphael.calabro@netapsys.fr)
*/
public class AutomatedImporterUnlockTest extends AbstractDaoTest {
private static final String EMAIL_ADDRESS = "urd-sigmah+test@ideia.fr";
@Inject
private Injector injector;
@Inject
private Mapper mapper;
@Inject
private Authenticator authenticator;
@Inject
private UserDAO userDAO;
@Inject
private UserDispatch dispatch;
private Entity[] entities = new Entity[0];
private int projectId;
private int schemeId;
private int introductionElementId;
private int phaseModelId;
@Before
public void before() {
persistEntities();
}
@After
public void after() {
removeEntities();
}
/**
* Test of importCorrespondances method, of class AutomatedImporter.
*/
@Test
public void testImportCorrespondances() throws CommandException, IOException {
final CsvImporter importer = new CsvImporter();
importer.setInjector(injector);
importer.setScheme(getImportationScheme());
importer.setExecutionContext(getExecutionContext());
importer.initialize();
importer.setInputStream(getClass().getResourceAsStream("import.csv"));
final AutomatedImport configuration = new AutomatedImport("1234", "import.csv", getImportationScheme(), true, true, false);
final AutomatedImporter instance = new AutomatedImporter(importer);
final List<BaseModelData> result = instance.importCorrespondances(configuration);
Assert.assertEquals(2, result.size());
Assert.assertEquals(projectId, result.get(0).get(ProjectDTO.ID));
Assert.assertEquals("I1", result.get(0).get(ProjectDTO.NAME));
Assert.assertEquals("TestProject", result.get(0).get(ProjectDTO.FULL_NAME));
Assert.assertEquals(AutomatedImportStatus.UNLOCKED_AND_UPDATED, result.get(0).get("status"));
Assert.assertNotEquals(0, result.get(1).get(ProjectDTO.ID));
Assert.assertEquals("I8", result.get(1).get(ProjectDTO.NAME));
Assert.assertEquals("Mon projet qui n'existe pas", result.get(1).get(ProjectDTO.FULL_NAME));
Assert.assertEquals(AutomatedImportStatus.CREATED_AND_UPDATED, result.get(1).get("status"));
final Project project = em().find(Project.class, projectId);
Assert.assertEquals("I1", project.getName());
Assert.assertEquals("Mon projet d’import", project.getFullName());
Assert.assertEquals("Ce projet incroyable, efficace et plein d'avenir devrait sauver beaucoup de personnes", em().createQuery(
"SELECT v.value from Value AS v WHERE v.containerId = :projectId AND v.element.id = :elementId", String.class)
.setParameter("projectId", projectId)
.setParameter("elementId", introductionElementId)
.getSingleResult());
final Project project2 = em().find(Project.class, result.get(1).get(ProjectDTO.ID));
Assert.assertEquals("I8", project2.getName());
Assert.assertEquals("Mon projet qui n'existe pas", project2.getFullName());
Assert.assertEquals("Rien", em().createQuery(
"SELECT v.value from Value AS v WHERE v.containerId = :projectId AND v.element.id = :elementId", String.class)
.setParameter("projectId", project2.getId())
.setParameter("elementId", introductionElementId)
.getSingleResult());
}
private ImportationSchemeDTO getImportationScheme() {
return mapper.map(em().find(ImportationScheme.class, schemeId), new ImportationSchemeDTO());
}
private UserDispatch.UserExecutionContext getExecutionContext() {
return dispatch.createContext(getUser(), null, null);
}
private User getUser() {
return userDAO.findUserByEmail(EMAIL_ADDRESS);
}
private void persistEntities() {
final EntityTransaction transaction = em().getTransaction();
transaction.begin();
// Project Model
final DefaultFlexibleElement codeElement = new DefaultFlexibleElement();
codeElement.setType(DefaultFlexibleElementType.CODE);
codeElement.setAmendable(true);
em().persist(codeElement);
final DefaultFlexibleElement titleElement = new DefaultFlexibleElement();
titleElement.setAmendable(true);
titleElement.setType(DefaultFlexibleElementType.TITLE);
em().persist(titleElement);
final TextAreaElement introductionElement = new TextAreaElement();
introductionElement.setType(TextAreaType.TEXT.getCode());
em().persist(introductionElement);
introductionElementId = introductionElement.getId();
final Layout detailsLayout = new Layout(3, 1);
detailsLayout.addConstraint(0, 0, codeElement, 0);
detailsLayout.addConstraint(1, 0, titleElement, 0);
detailsLayout.addConstraint(2, 0, introductionElement, 0);
final Layout bannerLayout = new Layout(0, 0);
final Layout phaseModelLayout = new Layout(0, 0);
final ProjectModel model = new ProjectModel();
model.setName("TestModel");
model.setStatus(ProjectModelStatus.READY);
model.setPhaseModels(new ArrayList<PhaseModel>());
model.setVisibilities(new ArrayList<ProjectModelVisibility>());
final PhaseModel phaseModel = new PhaseModel();
phaseModel.setName("TestPhaseModel");
phaseModel.setDisplayOrder(0);
phaseModel.setParentProjectModel(model);
phaseModel.setLayout(phaseModelLayout);
model.getPhaseModels().add(phaseModel);
final ProjectDetails details = new ProjectDetails();
details.setLayout(detailsLayout);
details.setProjectModel(model);
em().persist(details);
final ProjectBanner banner = new ProjectBanner();
banner.setProjectModel(model);
banner.setLayout(bannerLayout);
em().persist(banner);
model.setProjectDetails(details);
model.setProjectBanner(banner);
em().persist(model);
phaseModelId = model.getPhaseModels().get(0).getId();
// User
final User user = new User();
user.setActive(Boolean.TRUE);
user.setEmail(EMAIL_ADDRESS);
user.setName("TestLastName");
user.setFirstName("TestFirstName");
user.setHashedPassword(authenticator.hashPassword("sigmah"));
user.setLocale(Language.FR.getLocale());
em().persist(user);
// OrgUnit
final OrgUnit orgUnit = new OrgUnit();
orgUnit.setName("TOU");
orgUnit.setFullName("Test Org Unit");
orgUnit.setCanContainProjects(true);
em().persist(orgUnit);
// Profile
final Profile profile = new Profile();
profile.setName("Test Profile");
profile.setGlobalPermissions(new ArrayList<GlobalPermission>());
profile.getGlobalPermissions().add(globalPermission(GlobalPermissionEnum.LOCK_PROJECT, profile));
em().persist(profile);
final OrgUnitProfile orgUnitProfile = new OrgUnitProfile();
orgUnitProfile.setType(OrgUnitProfile.OrgUnitProfileType.MAIN);
orgUnitProfile.setUser(user);
orgUnitProfile.setOrgUnit(orgUnit);
orgUnitProfile.setProfiles(new ArrayList<Profile>());
orgUnitProfile.getProfiles().add(profile);
em().persist(orgUnitProfile);
List<OrgUnitProfile> orgUnitsProfiles = new ArrayList<>();
orgUnitsProfiles.add(orgUnitProfile);
user.setOrgUnitsWithProfiles(orgUnitsProfiles);
em().merge(user);
// Importation Scheme
final ArrayList<Variable> variables = new ArrayList<>();
final ImportationScheme scheme = new ImportationScheme();
scheme.setName("Test scheme");
scheme.setFileFormat(ImportationSchemeFileFormat.CSV);
scheme.setFirstRow(2);
scheme.setImportType(ImportationSchemeImportType.ROW);
scheme.setVariables(variables);
final Variable codeVariable = new Variable();
codeVariable.setImportationScheme(scheme);
codeVariable.setName("Code");
codeVariable.setReference("0");
final Variable titleVariable = new Variable();
titleVariable.setImportationScheme(scheme);
titleVariable.setName("Title");
titleVariable.setReference("1");
final Variable introductionVariable = new Variable();
introductionVariable.setImportationScheme(scheme);
introductionVariable.setName("Introduction");
introductionVariable.setReference("5");
variables.add(codeVariable);
variables.add(titleVariable);
variables.add(introductionVariable);
em().persist(scheme);
schemeId = scheme.getId();
// Importation Scheme Model
final ArrayList<VariableFlexibleElement> variableFlexibleElements = new ArrayList<>();
final ImportationSchemeModel importationSchemeModel = new ImportationSchemeModel();
importationSchemeModel.setImportationScheme(scheme);
importationSchemeModel.setProjectModel(model);
importationSchemeModel.setVariableFlexibleElements(variableFlexibleElements);
final VariableFlexibleElement codeVariableFlexibleElement = new VariableFlexibleElement();
codeVariableFlexibleElement.setImportationSchemeModel(importationSchemeModel);
codeVariableFlexibleElement.setIsKey(Boolean.TRUE);
codeVariableFlexibleElement.setFlexibleElement(codeElement);
codeVariableFlexibleElement.setVariable(codeVariable);
final VariableFlexibleElement titleVariableFlexibleElement = new VariableFlexibleElement();
titleVariableFlexibleElement.setImportationSchemeModel(importationSchemeModel);
titleVariableFlexibleElement.setFlexibleElement(titleElement);
titleVariableFlexibleElement.setVariable(titleVariable);
final VariableFlexibleElement introductionVariableFlexibleElement = new VariableFlexibleElement();
introductionVariableFlexibleElement.setImportationSchemeModel(importationSchemeModel);
introductionVariableFlexibleElement.setFlexibleElement(introductionElement);
introductionVariableFlexibleElement.setVariable(introductionVariable);
variableFlexibleElements.add(codeVariableFlexibleElement);
variableFlexibleElements.add(titleVariableFlexibleElement);
variableFlexibleElements.add(introductionVariableFlexibleElement);
em().persist(importationSchemeModel);
// Project, country and values
final Country country = new Country();
country.setName("Testry");
country.setCodeISO("_t");
country.setBounds(new Bounds());
em().persist(country);
final Project project = new Project();
project.setProjectModel(model);
project.setName("I1");
project.setFullName("TestProject");
project.setAmendmentState(AmendmentState.LOCKED);
project.setPhases(new ArrayList<Phase>());
project.setStartDate(new Date());
project.setOwner(user);
project.setLastSchemaUpdate(new Date());
project.setCountry(country);
project.setPartners(new HashSet<OrgUnit>());
project.getPartners().add(orgUnit);
em().persist(project);
this.projectId = project.getId();
final Value introductionValue = new Value();
introductionValue.setValue("Pas d'introduction");
introductionValue.setContainerId(project.getId());
introductionValue.setElement(introductionElement);
introductionValue.setLastModificationAction('C');
introductionValue.setLastModificationDate(new Date());
introductionValue.setLastModificationUser(user);
em().persist(introductionValue);
transaction.commit();
this.entities = new Entity[] {
banner,
details,
codeVariableFlexibleElement,
titleVariableFlexibleElement,
introductionVariableFlexibleElement,
importationSchemeModel,
codeVariable,
titleVariable,
introductionVariable,
scheme,
model,
bannerLayout,
detailsLayout,
phaseModelLayout,
introductionElement,
titleElement,
codeElement,
profile,
orgUnit,
country
};
}
private void removeEntities() {
final EntityTransaction transaction = em().getTransaction();
transaction.begin();
User user = getUser();
em().createQuery("DELETE FROM HistoryToken AS ht WHERE ht.user = :user")
.setParameter("user", user)
.executeUpdate();
em().createQuery("DELETE FROM Value AS v WHERE v.lastModificationUser = :user")
.setParameter("user", user)
.executeUpdate();
for (final Project project : em().createQuery("SELECT p FROM Project AS p WHERE p.owner = :user", Project.class)
.setParameter("user", user)
.getResultList()) {
project.setPartners(new HashSet<OrgUnit>());
em().persist(project);
em().remove(project);
}
for (OrgUnitProfile orgUnitProfile : em().createQuery("SELECT oup FROM OrgUnitProfile AS oup WHERE oup.user = :user", OrgUnitProfile.class)
.setParameter("user", user)
.getResultList()) {
em().remove(orgUnitProfile);
}
user.setOrgUnitsWithProfiles(new ArrayList<OrgUnitProfile>());
em().persist(user);
for (final Entity entity : entities) {
em().remove(entity);
}
em().remove(user);
this.entities = new Entity[0];
transaction.commit();
}
private GlobalPermission globalPermission(GlobalPermissionEnum permission, Profile profile) {
final GlobalPermission globalPermission = new GlobalPermission();
globalPermission.setProfile(profile);
globalPermission.setPermission(permission);
return globalPermission;
}
}