package com.constellio.app.services.migrations;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.LocalDateTime;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import com.constellio.app.conf.PropertiesAppLayerConfiguration.InMemoryAppLayerConfiguration;
import com.constellio.data.conf.IdGeneratorType;
import com.constellio.data.conf.PropertiesDataLayerConfiguration.InMemoryDataLayerConfiguration;
import com.constellio.data.dao.services.factories.DataLayerFactory;
import com.constellio.model.entities.records.wrappers.Collection;
import com.constellio.model.entities.records.wrappers.SolrAuthorizationDetails;
import com.constellio.model.entities.records.wrappers.UserDocument;
import com.constellio.model.entities.records.wrappers.UserFolder;
import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
import com.constellio.sdk.tests.AppLayerConfigurationAlteration;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.DataLayerConfigurationAlteration;
import com.constellio.sdk.tests.SolrSDKToolsServices;
import com.constellio.sdk.tests.SolrSDKToolsServices.VaultSnapshot;
public class ComboMigrationsAcceptanceTest extends ConstellioTest {
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Test
public void validateCoreMigrationHighway()
throws Exception {
validate(new SetupScript() {
@Override
public void setupCollection() {
givenCollection(zeCollection);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection,
SolrAuthorizationDetails.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserFolder.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserDocument.DEFAULT_SCHEMA);
}
});
}
@Test
public void validateCoreRMMigrationHighway()
throws Exception {
validate(new SetupScript() {
@Override
public void setupCollection() {
givenCollection(zeCollection).withConstellioRMModule();
getAppLayerFactory().getMetadataSchemasDisplayManager()
.resetSchema(zeCollection, SolrAuthorizationDetails.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserFolder.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserDocument.DEFAULT_SCHEMA);
}
});
}
@Test
public void validateCoreTasksMigrationHighway()
throws Exception {
validate(new SetupScript() {
@Override
public void setupCollection() {
givenCollection(zeCollection).withTaskModule();
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection,
SolrAuthorizationDetails.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserFolder.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserDocument.DEFAULT_SCHEMA);
}
});
}
@Test
public void validateCoreRobotsMigrationHighway()
throws Exception {
validate(new SetupScript() {
@Override
public void setupCollection() {
givenCollection(zeCollection).withRobotsModule();
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection,
SolrAuthorizationDetails.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserFolder.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserDocument.DEFAULT_SCHEMA);
}
});
}
@Test
public void validateCoreESMigrationHighway()
throws Exception {
validate(new SetupScript() {
@Override
public void setupCollection() {
givenCollection(zeCollection).withConstellioESModule();
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection,
SolrAuthorizationDetails.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserFolder.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserDocument.DEFAULT_SCHEMA);
}
});
}
@Test
public void validateCoreESRMMigrationHighway()
throws Exception {
validate(new SetupScript() {
@Override
public void setupCollection() {
givenCollection(zeCollection).withConstellioESModule().withConstellioRMModule();
getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
types.getMetadata("userTask_default_status").setDefaultValue(null);
}
});
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection,
SolrAuthorizationDetails.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserFolder.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserDocument.DEFAULT_SCHEMA);
}
});
}
@Test
public void validateCoreRMESMigrationHighway()
throws Exception {
validate(new SetupScript() {
@Override
public void setupCollection() {
givenCollection(zeCollection).withConstellioRMModule().withConstellioESModule();
getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
types.getMetadata("userTask_default_status").setDefaultValue(null);
}
});
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection,
SolrAuthorizationDetails.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserFolder.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserDocument.DEFAULT_SCHEMA);
}
});
}
@Test
public void validateCoreESRMRobotsMigrationHighway()
throws Exception {
validate(new SetupScript() {
@Override
public void setupCollection() {
givenCollection(zeCollection).withMockedAvailableModules(false).withConstellioRMModule().withConstellioESModule()
.withRobotsModule();
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection,
SolrAuthorizationDetails.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserFolder.DEFAULT_SCHEMA);
getAppLayerFactory().getMetadataSchemasDisplayManager().resetSchema(zeCollection, UserDocument.DEFAULT_SCHEMA);
}
});
}
// @Test
// public void validateCoreTasksRobotsRMESMigrationHighway()
// throws Exception {
//
// validate(new SetupScript() {
// @Override
// public void setupCollection() {
// givenCollection(zeCollection).withMockedAvailableModules(false).withTaskModule().withRobotsModule()
// .withConstellioRMModule()
// .withConstellioESModule();
// }
// });
//
// }
// @Test
// public void validateCoreESMigrationHighway()
// throws Exception {
//
// validate(new SetupScript() {
// @Override
// public void setupCollection() {
// givenCollection(zeCollection).withConstellioESModule();
// }
// });
//
// }
//
// @Test
// public void validateCoreRMESMigrationHighway()
// throws Exception {
//
// validate(new SetupScript() {
// @Override
// public void setupCollection() {
// givenCollection(zeCollection).withConstellioRMModule().withConstellioESModule();
// }
// });
//
// }
//
// @Test
// public void validateCoreRMESRobotsMigrationHighway()
// throws Exception {
//
// validate(new SetupScript() {
// @Override
// public void setupCollection() {
// givenCollection(zeCollection).withConstellioRMModule().withConstellioESModule().withRobotsModule();
// }
// });
//
// }
public void validate(SetupScript setupScript)
throws Exception {
System.out.println("\n\n---------- 1 ----------");
configure(new DataLayerConfigurationAlteration() {
@Override
public void alter(InMemoryDataLayerConfiguration configuration) {
configuration.setSecondaryIdGeneratorType(IdGeneratorType.SEQUENTIAL);
configuration.setUniqueKeyToBeCreated("123-456-789");
}
});
configure(new AppLayerConfigurationAlteration() {
@Override
public void alter(InMemoryAppLayerConfiguration configuration) {
configuration.setFastMigrationsEnabled(true);
}
});
LocalDateTime time = new LocalDateTime();
givenTimeIs(time);
setupScript.setupCollection();
getAppLayerFactory().getMetadataSchemasDisplayManager().rewriteInOrderAndGetCodes(zeCollection);
getAppLayerFactory().getMetadataSchemasDisplayManager().rewriteInOrderAndGetCodes(Collection.SYSTEM_COLLECTION);
DataLayerFactory dataLayerFactory = getAppLayerFactory().getModelLayerFactory().getDataLayerFactory();
String nextSequence1 = dataLayerFactory.getUniqueIdGenerator().next();
String nextSecondarySequence1 = dataLayerFactory.getSecondaryUniqueIdGenerator().next();
File settingsFolder = getDataLayerFactory().getDataLayerConfiguration().getSettingsFileSystemBaseFolder();
File settings1 = temporaryFolder.newFolder("settings1");
FileUtils.copyDirectory(settingsFolder, settings1);
SolrSDKToolsServices tools = new SolrSDKToolsServices(getDataLayerFactory().newRecordDao());
tools.flushAndDeleteContentMarkers();
VaultSnapshot snapshot1 = tools.snapshot();
resetTestSession();
System.out.println("\n\n---------- 2 ----------");
configure(new DataLayerConfigurationAlteration() {
@Override
public void alter(InMemoryDataLayerConfiguration configuration) {
configuration.setSecondaryIdGeneratorType(IdGeneratorType.SEQUENTIAL);
configuration.setUniqueKeyToBeCreated("123-456-789");
}
});
configure(new AppLayerConfigurationAlteration() {
@Override
public void alter(InMemoryAppLayerConfiguration configuration) {
configuration.setFastMigrationsEnabled(false);
}
});
givenTimeIs(time);
setupScript.setupCollection();
getAppLayerFactory().getMetadataSchemasDisplayManager().rewriteInOrderAndGetCodes(zeCollection);
getAppLayerFactory().getMetadataSchemasDisplayManager().rewriteInOrderAndGetCodes(Collection.SYSTEM_COLLECTION);
dataLayerFactory = getAppLayerFactory().getModelLayerFactory().getDataLayerFactory();
String nextSequence2 = dataLayerFactory.getUniqueIdGenerator().next();
String nextSecondarySequence2 = dataLayerFactory.getSecondaryUniqueIdGenerator().next();
settingsFolder = getDataLayerFactory().getDataLayerConfiguration().getSettingsFileSystemBaseFolder();
File settings2 = temporaryFolder.newFolder("settings2");
FileUtils.copyDirectory(settingsFolder, settings2);
tools = new SolrSDKToolsServices(getDataLayerFactory().newRecordDao());
tools.flushAndDeleteContentMarkers();
VaultSnapshot snapshot2 = tools.snapshot();
compareFolder(settings1, settings2);
tools.ensureSameSnapshots("", snapshot1, snapshot2);
assertThat(nextSequence1).isEqualTo(nextSequence2);
assertThat(nextSecondarySequence1).isEqualTo(nextSecondarySequence2);
}
private String contentExceptVersion(File file) {
try {
List<String> lines = new ArrayList<>(FileUtils.readLines(file));
if (file.getName().endsWith(".xml")) {
lines.remove(0);
if (lines.size() > 0) {
lines.remove(0);
}
}
return StringUtils.join(lines, "\n");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private void compareFolder(File folderOfSettings1, File folderOfSettings2) {
List<String> filesInFolder1 = getFilesInFolder(folderOfSettings1);
List<String> filesInFolder2 = getFilesInFolder(folderOfSettings2);
String folderAbsolutePath = "/settings/" + StringUtils.substringAfter(folderOfSettings1.getAbsolutePath(), "/settings1/");
assertThat(filesInFolder1).describedAs("Folder '" + folderAbsolutePath + "'").isEqualTo(filesInFolder2);
for (String file : filesInFolder1) {
File file1 = new File(folderOfSettings1, file);
File file2 = new File(folderOfSettings2, file);
String fileAbsolutePath = folderAbsolutePath + file;
//if (!file1.getName().contains("schemasDisplay.xml")) {
String contentOfComboMigrationFile = contentExceptVersion(file1);
String contentOfMigrationFile = contentExceptVersion(file2);
if (file.endsWith(".properties")) {
List<String> linesOfComboMigrationFile = asList(contentOfComboMigrationFile.split("\n"));
Collections.sort(linesOfComboMigrationFile);
List<String> linesOfMigrationFile = asList(contentOfMigrationFile.split("\n"));
Collections.sort(linesOfMigrationFile);
assertThat(linesOfComboMigrationFile).describedAs("Content of file '" + fileAbsolutePath + "")
.isEqualTo(linesOfMigrationFile);
} else {
assertThat(contentOfComboMigrationFile).describedAs("Content of file '" + fileAbsolutePath + "")
.isEqualTo(contentOfMigrationFile);
}
System.out.println(file1.getName() + " is OK");
//}
}
List<String> foldersInFolder1 = getFoldersInFolder(folderOfSettings1);
List<String> foldersInFolder2 = getFoldersInFolder(folderOfSettings2);
assertThat(foldersInFolder1).describedAs("Folder '" + folderAbsolutePath + "'")
.isEqualTo(foldersInFolder2);
for (String file : foldersInFolder1) {
File folder1 = new File(folderOfSettings1, file);
File folder2 = new File(folderOfSettings2, file);
compareFolder(folder1, folder2);
}
}
public interface SetupScript {
void setupCollection();
}
private static List<String> getFilesInFolder(File folder) {
String[] filenames = folder.list(onlyFile);
if (filenames == null) {
return new ArrayList<>();
}
List<String> files = new ArrayList<>(asList(filenames));
Collections.sort(files);
return files;
}
private static List<String> getFoldersInFolder(File folder) {
String[] filenames = folder.list(onlyFolder);
if (filenames == null) {
return new ArrayList<>();
}
List<String> files = new ArrayList<>(asList(filenames));
Collections.sort(files);
return files;
}
private static FilenameFilter onlyFile = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir, name).isFile();
}
};
private static FilenameFilter onlyFolder = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir, name).isDirectory();
}
};
}