package com.constellio.app.services.schemas.bulkImport;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.File;
import java.util.*;
import org.junit.Before;
import org.junit.Test;
import com.constellio.app.entities.schemasDisplay.MetadataDisplayConfig;
import com.constellio.app.entities.schemasDisplay.SchemaDisplayConfig;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.Document;
import com.constellio.app.services.schemas.bulkImport.data.ImportDataProvider;
import com.constellio.app.services.schemas.bulkImport.data.xml.XMLImportDataProvider;
import com.constellio.app.services.schemas.bulkImport.data.xml.XMLImportSchemaTypesDataProvider;
import com.constellio.app.services.schemasDisplay.SchemasDisplayManager;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.Taxonomy;
import com.constellio.model.entities.calculators.CalculatorParameters;
import com.constellio.model.entities.calculators.MetadataValueCalculator;
import com.constellio.model.entities.calculators.dependencies.Dependency;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaType;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.entities.schemas.entries.CalculatedDataEntry;
import com.constellio.model.entities.schemas.entries.CopiedDataEntry;
import com.constellio.model.entities.schemas.entries.DataEntryType;
import com.constellio.model.services.schemas.MetadataList;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.users.UserServices;
import com.constellio.sdk.tests.ConstellioTest;
public class SchemaTypeImportServicesAcceptanceTest extends ConstellioTest {
RMSchemasRecordsServices rm;
RMTestRecords records = new RMTestRecords(zeCollection);
BulkImportProgressionListener progressionListener = new LoggerBulkImportProgressionListener();
SchemaTypeImportServices importServices;
SearchServices searchServices;
UserServices userServices;
SchemasDisplayManager schemasDisplayManager;
@Before
public void setUp()
throws Exception {
prepareSystem(
withZeCollection().withConstellioRMModule()
);
progressionListener = new LoggerBulkImportProgressionListener();
importServices = new SchemaTypeImportServices(getAppLayerFactory(), getModelLayerFactory(), zeCollection, 100);
searchServices = getModelLayerFactory().newSearchServices();
userServices = getModelLayerFactory().newUserServices();
schemasDisplayManager = getAppLayerFactory().getMetadataSchemasDisplayManager();
rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
}
@Test
public void whenImportingDDVXMLFileThenImportedCorrectly()
throws Exception {
File usersFile = getTestResourceFile("valueDomain.xml");
importDDVAndValidate(
XMLImportSchemaTypesDataProvider.forSingleXMLFile(getModelLayerFactory(), usersFile, usersFile.getName()));
}
@Test
public void whenImportingDocumentXMLFileThenImportedCorrectly()
throws Exception {
File usersFile = getTestResourceFile("documentSchemas.xml");
importDocumentAndValidate(
XMLImportSchemaTypesDataProvider.forSingleXMLFile(getModelLayerFactory(), usersFile, usersFile.getName()));
}
@Test
public void whenImportingDocumentWithMetadataReferencesThenImportedCorrectly()
throws Exception {
File ddvFile = getTestResourceFile("valueDomain.xml");
importDDV(ddvFile);
File documentFile = getTestResourceFile("documentSchemasWithReferences.xml");
importDocumentWithRefAndValidate(
XMLImportSchemaTypesDataProvider.forSingleXMLFile(getModelLayerFactory(), documentFile, documentFile.getName()));
}
@Test
public void whenImportingDocumentSchemaWithMetadataCopyingTheValueDomainTitleThenImportedCorrectly()
throws Exception {
File ddvFile = getTestResourceFile("valueDomain.xml");
importDDV(ddvFile);
File documentFile = getTestResourceFile("documentSchemasWithCopiedReference.xml");
importInZeCollection(
XMLImportSchemaTypesDataProvider.forSingleXMLFile(getModelLayerFactory(), documentFile, documentFile.getName()));
MetadataSchemaTypes types = getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(zeCollection);
MetadataSchema schema = types.getSchema(Document.DEFAULT_SCHEMA);
Metadata metadata = schema.getMetadata("USRcopiedTaxoDomaineTitle");
assertThat(metadata.getDataEntry().getType()).isEqualTo(DataEntryType.COPIED);
CopiedDataEntry dataEntry = (CopiedDataEntry) metadata.getDataEntry();
assertThat(dataEntry.getCopiedMetadata()).isEqualTo("taxoDomaineHierarchiqueType_default_title");
assertThat(dataEntry.getReferenceMetadata()).isEqualTo("document_default_USRreferenceToTaxoDomaineHierarchiqueType");
MetadataDisplayConfig metadataDisplayConfig = schemasDisplayManager.getMetadata(zeCollection,
"document_default_USRcopiedTaxoDomaineTitle");
assertThat(metadataDisplayConfig.isVisibleInAdvancedSearch()).isTrue();
assertThat(metadata.isSearchable()).isTrue();
SchemaDisplayConfig schemaDisplayConfig = schemasDisplayManager.getSchema(zeCollection, "document_default");
assertThat(schemaDisplayConfig.getDisplayMetadataCodes()).contains("document_default_USRcopiedTaxoDomaineTitle");
assertThat(schemaDisplayConfig.getFormMetadataCodes()).doesNotContain("document_default_USRcopiedTaxoDomaineTitle");
}
@Test
public void whenImportingDocumentSchemaWithCalculatedMetadataThenImportedCorrectly()
throws Exception {
File documentFile = getTestResourceFile("documentSchemasWithCalculatedMetadata.xml");
importInZeCollection(
XMLImportSchemaTypesDataProvider.forSingleXMLFile(getModelLayerFactory(), documentFile, documentFile.getName()));
MetadataSchemaTypes types = getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(zeCollection);
MetadataSchema schema = types.getSchema(Document.DEFAULT_SCHEMA);
Metadata calculatedMetadata = schema.getMetadata("USRcalculatedMD");
assertThat(calculatedMetadata.getDataEntry().getType()).isEqualTo(DataEntryType.CALCULATED);
assertThat(calculatedMetadata.isSearchable()).isFalse();
CalculatedDataEntry calculatedDataEntry = ((CalculatedDataEntry) calculatedMetadata.getDataEntry());
MetadataValueCalculator<?> calculator = calculatedDataEntry.getCalculator();
DummyCalculator expectedCalculator = new DummyCalculator();
assertThat(calculator.getReturnType()).isEqualTo(expectedCalculator.getReturnType());
assertThat(calculator.getDefaultValue()).isEqualTo(expectedCalculator.getDefaultValue());
assertThat(calculator.getDependencies()).isEqualTo(expectedCalculator.getDependencies());
assertThat(calculator.isMultiValue()).isEqualTo(expectedCalculator.isMultiValue());
assertThat(calculator.calculate(null)).isEqualTo(expectedCalculator.calculate(null));
CalculatorParameters params = new CalculatorParameters(new HashMap<Dependency, Object>(), "zeRecordId", null,
types.getSchemaType(Document.SCHEMA_TYPE), zeCollection);
assertThat(calculator.calculate(params)).isEqualTo(expectedCalculator.calculate(params));
SchemaDisplayConfig schemaDisplayConfigPapier = schemasDisplayManager.getSchema(zeCollection, "document_papier");
SchemaDisplayConfig schemaDisplayConfig = schemasDisplayManager.getSchema(zeCollection, "document_default");
assertThat(schemaDisplayConfig.getDisplayMetadataCodes()).contains("document_default_USRcalculatedMD");
assertThat(schemaDisplayConfigPapier.getDisplayMetadataCodes()).doesNotContain("document_default_USRcalculatedMD");
Metadata calculatedMetadata2 = schema.getMetadata("USRcalculatedMD");
assertThat(calculatedMetadata2.getDataEntry().getType()).isEqualTo(DataEntryType.CALCULATED);
assertThat(calculatedMetadata2.isSearchable()).isFalse();
assertThat(schemaDisplayConfig.getDisplayMetadataCodes()).contains("document_default_USRcalculatedMDDisplayedInSchemas");
assertThat(schemaDisplayConfigPapier.getDisplayMetadataCodes())
.contains("document_default_USRcalculatedMDDisplayedInSchemas");
}
private void importInZeCollection(XMLImportDataProvider importDataProvider) {
List<String> collections = new ArrayList<>();
collections.add(zeCollection);
BulkImportResults results = importServices.bulkImport(importDataProvider, null, null, collections);
assertThat(results.getImportErrors()).isEmpty();
}
private void importDocumentWithRefAndValidate(XMLImportDataProvider importDataProvider) {
importInZeCollection(importDataProvider);
MetadataSchemaTypes types = getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(zeCollection);
MetadataSchemaType schemaType = types.getSchemaType("document");
validateRefSchemaImport(schemaType);
}
private void validateRefSchemaImport(MetadataSchemaType schemaType) {
MetadataList metadataList = schemaType.getSchema("ref").getMetadatas();
ListIterator<Metadata> it = metadataList.listIterator();
List<String> metadataLocalCodes = new ArrayList<>();
while (it.hasNext()) {
Metadata metadata = it.next();
if (metadata.getLocalCode().equals("USRmdRefFolder")) {
assertThat(metadata.getType()).isEqualTo(MetadataValueType.REFERENCE);
assertThat(metadata.getLabel(Language.French)).isEqualTo("ref folder");
assertThat(metadata.isDefaultRequirement()).isTrue();
assertThat(metadata.isEnabled()).isTrue();
assertThat(metadata.isTaxonomyRelationship()).isFalse();
assertThat(metadata.getAllowedReferences().getAllowedSchemaType()).isEqualTo("folder");
} else if (metadata.getLocalCode().equals("USRmdRefTaxo")) {
assertThat(metadata.isTaxonomyRelationship()).isTrue();
assertThat(metadata.getAllowedReferences().getAllowedSchemaType()).isEqualTo("taxoDomaineHierarchiqueType");
}
metadataLocalCodes.add((metadata.getLocalCode()));
}
assertThat(metadataLocalCodes).contains("USRmdRefFolder");
assertThat(metadataLocalCodes).contains("USRmdRefTaxo");
}
private void importDDV(File ddvFile) {
XMLImportDataProvider importDataProvider = XMLImportSchemaTypesDataProvider
.forSingleXMLFile(getModelLayerFactory(), ddvFile, ddvFile.getName());
List<String> collections = new ArrayList<>();
collections.add(zeCollection);
BulkImportResults results = importServices.bulkImport(importDataProvider, null, null, collections);
for (ImportError importError : results.getImportErrors()) {
System.out.println(importError.getCompleteErrorMessage());
}
assertThat(results.getImportErrors()).hasSize(0);
}
private void importDocumentAndValidate(ImportDataProvider importDataProvider) {
List<String> collections = new ArrayList<>();
collections.add(zeCollection);
BulkImportResults results = importServices.bulkImport(importDataProvider, null, null, collections);
for (ImportError importError : results.getImportErrors()) {
System.out.println(importError.getCompleteErrorMessage());
}
assertThat(results.getImportErrors().size()).isEqualTo(0);
MetadataSchemaTypes types = getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(zeCollection);
MetadataSchemaType schemaType = types.getSchemaType("document");
assertThat(schemaType).isNotNull();
validateDefaultSchemaImport(schemaType);
validatePapierSchemaImport(schemaType);
}
private void validatePapierSchemaImport(MetadataSchemaType schemaType) {
MetadataList metadataList = schemaType.getSchema("papier").getMetadatas();
ListIterator<Metadata> it = metadataList.listIterator();
List<String> metadataLocalCodes = new ArrayList<>();
while (it.hasNext()) {
Metadata metadata = it.next();
if (metadata.getLocalCode().equals("USRcat1")) {
//<element code="regex" label="Regex" required="true" type="string"/>
assertThat(metadata.getType()).isEqualTo(MetadataValueType.STRING);
assertThat(metadata.getLabel(Language.French)).isEqualTo("cat 1");
assertThat(metadata.isDefaultRequirement()).isFalse();
assertThat(metadata.isEnabled()).isFalse();
} else if (metadata.getLocalCode().equals("USRmd2Papier")) {
assertThat(metadata.getType()).isEqualTo(MetadataValueType.STRING);
assertThat(metadata.getLabel(Language.French)).isEqualTo("md2 papier");
assertThat(metadata.isDefaultRequirement()).isTrue();
}
metadataLocalCodes.add((metadata.getLocalCode()));
}
assertThat(metadataLocalCodes).contains("USRcat1");
assertThat(metadataLocalCodes).contains("USRmd2Papier");
}
private void validateDefaultSchemaImport(MetadataSchemaType schemaType) {
MetadataList metadataList = schemaType.getDefaultSchema().getMetadatas();
ListIterator<Metadata> it = metadataList.listIterator();
List<String> metadataLocalCodes = new ArrayList<>();
while (it.hasNext()) {
Metadata metadata = it.next();
if (metadata.getLocalCode().equals("USRcat1")) {
//<element code="regex" label="Regex" required="true" type="string"/>
assertThat(metadata.getType()).isEqualTo(MetadataValueType.STRING);
Map<Language, String> labels = metadata.getLabels();
assertThat(metadata.getLabel(Language.French)).isEqualTo("cat 1");
assertThat(metadata.isDefaultRequirement()).isFalse();
assertThat(metadata.isEnabled()).isTrue();
}
metadataLocalCodes.add((metadata.getLocalCode()));
}
assertThat(metadataLocalCodes).contains("USRcat1");
}
private void importDDVAndValidate(ImportDataProvider importDataProvider) {
List<String> collections = new ArrayList<>();
collections.add(zeCollection);
BulkImportResults results = importServices.bulkImport(importDataProvider, null, null, collections);
for (ImportError importError : results.getImportErrors()) {
System.out.println(importError.getCompleteErrorMessage());
}
assertThat(results.getImportErrors()).hasSize(0);
MetadataSchemaTypes types = getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(zeCollection);
validateDDVImport(types);
validateTaxonomyImport(types);
validateDDVWithMetadata(types);
}
private void validateDDVWithMetadata(MetadataSchemaTypes types) {
MetadataSchemaType schemaType = types.getSchemaType("ddvMasqueSaisieLocalisation");
assertThat(schemaType).isNotNull();
assertThat(schemaType.getLabel(Language.French)).isEqualTo("Masque saisie");
MetadataList metadataList = schemaType.getAllMetadatas();
ListIterator<Metadata> it = metadataList.listIterator();
List<String> metadataLocalCodes = new ArrayList<>();
while (it.hasNext()) {
Metadata metadata = it.next();
if (metadata.getLocalCode().equals("USRregex")) {
//<element code="regex" label="Regex" required="true" type="string"/>
assertThat(metadata.getType()).isEqualTo(MetadataValueType.STRING);
assertThat(metadata.getLabel(Language.French)).isEqualTo("Regex");
assertThat(metadata.isDefaultRequirement()).isTrue();
}
metadataLocalCodes.add((metadata.getLocalCode()));
}
assertThat(metadataLocalCodes).containsAll(Arrays.asList(new String[] { "USRregex" }));
}
private void validateDDVImport(MetadataSchemaTypes types) {
MetadataSchemaType schemaType = types.getSchemaType("ddvCategoriesOrganisations");
assertThat(schemaType).isNotNull();
assertThat(schemaType.getLabel(Language.French)).isEqualTo("Catégories d'organisations");
}
private void validateTaxonomyImport(MetadataSchemaTypes types) {
MetadataSchemaType schemaType = types.getSchemaType("taxoDomaineHierarchiqueType");
assertThat(schemaType).isNotNull();
assertThat(schemaType.getLabel(Language.French)).isEqualTo("Nouvelle taxo");
MetadataList metadataList = schemaType.getAllMetadatas();
List<String> taxoDomaineHierarchiqueTypeLocalCodes = new ArrayList<>();
ListIterator<Metadata> it = metadataList.listIterator();
while (it.hasNext()) {
taxoDomaineHierarchiqueTypeLocalCodes.add((it.next().getLocalCode()));
}
assertThat(taxoDomaineHierarchiqueTypeLocalCodes).containsAll(Arrays.asList(new String[] { "USRmd1Taxo", "USRmd2Taxo" }));
Taxonomy taxonomy = getModelLayerFactory().getTaxonomiesManager()
.getTaxonomyFor(zeCollection, "taxoDomaineHierarchiqueType");
assertThat(taxonomy).isNotNull();
assertThat(taxonomy.getSchemaTypes()).containsOnly(schemaType.getCode());
}
}