package com.constellio.app.services.migrations;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.constellio.app.entities.modules.Migration;
import com.constellio.model.entities.modules.Module;
import com.constellio.model.entities.modules.PluginUtil;
import com.constellio.model.utils.DependencyUtils;
public class MigrationScriptsComparator implements Comparator<Migration> {
private List<String> modulesInDependencyOrder;
private VersionsComparator versionsComparator;
public MigrationScriptsComparator(List<String> modulesInDependencyOrder) {
this.modulesInDependencyOrder = modulesInDependencyOrder;
this.versionsComparator = new VersionsComparator();
}
@Override
public int compare(Migration migration1, Migration migration2) {
String migration1Version = migration1.getVersion();
String migration2Version = migration2.getVersion();
int result = versionsComparator.compare(migration1Version, migration2Version);
if (result == 0) {
Integer script1ModuleIndex = modulesInDependencyOrder.indexOf(migration1.getModuleId());
Integer script2ModuleIndex = modulesInDependencyOrder.indexOf(migration2.getModuleId());
result = script1ModuleIndex.compareTo(script2ModuleIndex);
}
return result;
}
public static MigrationScriptsComparator forModules(List<? extends Module> modules) {
Map<String, Set<String>> dependencies = new HashMap<>();
for (Module module : modules) {
dependencies.put(module.getId(), new HashSet<>(getDependencies(module)));
}
List<String> modulesInDependencyOrder = new DependencyUtils<String>().sortByDependency(dependencies);
return new MigrationScriptsComparator(modulesInDependencyOrder);
}
private static List<String> getDependencies(Module module) {
return PluginUtil.getDependencies(module);
}
}