package fr.inria.atlanmod.collaboro.backend;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import fr.inria.atlanmod.collaboro.history.User;
public class CollaboroBackendFactory {
private static CollaboroBackendFactory instance;
private HashMap<String, CollaboroLanguageConfig> configs;
private HashMap<String, CollaboroBackend> backends;
private HashMap<String, ModelManager> modelManagers;
private CollaboroBackend lastBackendCreated;
private CollaboroBackendFactory() {
this.backends = new HashMap<>();
this.configs = new HashMap<>();
this.modelManagers = new HashMap<String, ModelManager>();
}
public static boolean isActive() {
return !(instance == null);
}
public static void init(List<CollaboroLanguageConfig> languages) {
instance = new CollaboroBackendFactory();
for(CollaboroLanguageConfig language : languages) {
instance.configs.put(language.getLanguageName().toLowerCase(), language);
}
}
private ModelManager getModelManager(String dsl) {
ModelManager modelManager = modelManagers.get(dsl);
if(modelManager == null) {
CollaboroLanguageConfig config = configs.get(dsl.toLowerCase());
if(config == null)
throw new IllegalArgumentException("There is no config for such DSL");
File ecoreFile = config.getEcoreFile();
modelManager = ModelManagerFactory.createModelManager(ecoreFile);
modelManagers.put(dsl, modelManager);
}
return modelManager;
}
public static User loginUser(String email, String password, String dsl) {
if(email == null || password == null || dsl == null)
throw new IllegalArgumentException("Parameters cannot be null");
User found = null;
ModelManager modelManager = instance.getModelManager(dsl);
if(modelManager.getHistory() != null)
for (User user : modelManager.getHistory().getUsers())
if(user.getEmail() != null && user.getEmail().equals(email) && user.getPasword() != null && user.getPasword().equals(password))
return user;
return found;
}
public static CollaboroBackend getBackend(String dsl, String user) {
if(instance == null)
instance = new CollaboroBackendFactory();
String dslUser = dsl + "-" + user;
CollaboroBackend backend = instance.backends.get(dslUser.toLowerCase());
CollaboroLanguageConfig config = instance.configs.get(dsl.toLowerCase());
if(backend == null && config != null) {
File historyFile = config.getHistoryFile();
File ecoreFile = config.getEcoreFile();
ModelManager modelManager = instance.getModelManager(dsl);
backend = new CollaboroBackend(modelManager);
backend.setPreviousEcores(config.getPreviousEcores());
backend.setPreviousModels(config.getPreviousModels());
backend.moveToLastVersion();
instance.backends.put(dslUser, backend);
instance.lastBackendCreated = backend;
}
return backend;
}
public static String[] getActiveLanguages() {
return instance.configs.keySet().toArray(new String[] { } );
}
public static CollaboroBackend getLastBackend() {
return instance.lastBackendCreated;
}
}