/// <summary> /// Returns an instance of an ldml in folder writing system reposistory. /// </summary> /// <param name="basePath">base location of the global writing system repository</param> /// <param name="customDataMappers">The custom data mappers.</param> /// <param name="globalRepository">The global repository.</param> /// <param name="migrationHandler">Callback if during the initialization any writing system id's are changed</param> /// <param name="loadProblemHandler">Callback if during the initialization any writing systems cannot be loaded</param> /// <returns></returns> public static LdmlInFolderWritingSystemRepository Initialize( string basePath, IEnumerable <ICustomDataMapper <WritingSystemDefinition> > customDataMappers, GlobalWritingSystemRepository globalRepository = null, Action <int, IEnumerable <LdmlMigrationInfo> > migrationHandler = null, Action <IEnumerable <WritingSystemRepositoryProblem> > loadProblemHandler = null ) { var migrator = new LdmlInFolderWritingSystemRepositoryMigrator(basePath, migrationHandler); migrator.Migrate(); var instance = new LdmlInFolderWritingSystemRepository(basePath, customDataMappers, globalRepository); migrator.ResetRemovedProperties(instance); // Call the loadProblemHandler with both migration problems and load problems var loadProblems = new List <WritingSystemRepositoryProblem>(); loadProblems.AddRange(migrator.MigrationProblems); loadProblems.AddRange(instance.LoadProblems); if (loadProblems.Count > 0 && loadProblemHandler != null) { loadProblemHandler(loadProblems); } return(instance); }
public void PerformMigration(IDomainObjectDTORepository repoDto) { DataMigrationServices.CheckVersionNumber(repoDto, 7000070); // Skip migrating the global repository if we're just running tests. Slow and may not be wanted. // In a real project we do this first; thus if by any chance a WS is differently renamed in // the two folders, the renaming that is right for this project wins. if (!repoDto.ProjectFolder.StartsWith(Path.GetTempPath())) { var globalMigrator = new GlobalWritingSystemRepositoryMigrator(GlobalWritingSystemRepository.DefaultBasePath, versionToMigrateTo: 3); // first migrate any existing global writing systems in the new global writing system directory if (globalMigrator.NeedsMigration()) { globalMigrator.Migrate(); } string migratedFilePath = Path.Combine(LcmFileHelper.OldGlobalWritingSystemStoreDirectory, ".migrated"); if (Directory.Exists(LcmFileHelper.OldGlobalWritingSystemStoreDirectory) && !File.Exists(migratedFilePath)) { // copy over all FW global writing systems from the old directory to the new directory and migrate string globalRepoPath = Path.Combine(GlobalWritingSystemRepository.DefaultBasePath, "3"); if (!Directory.Exists(globalRepoPath)) { GlobalWritingSystemRepository.CreateGlobalWritingSystemRepositoryDirectory(globalRepoPath); } CopyDirectoryContents(LcmFileHelper.OldGlobalWritingSystemStoreDirectory, globalRepoPath); globalMigrator.Migrate(); // add ".migrated" file to indicate that this folder has been migrated already File.WriteAllText(migratedFilePath, string.Format("The writing systems in this directory have been migrated to {0}.", globalRepoPath)); } } string ldmlFolder = Path.Combine(repoDto.ProjectFolder, LcmFileHelper.ksWritingSystemsDir); var migrator = new LdmlInFolderWritingSystemRepositoryMigrator(ldmlFolder, NoteMigration, 3); migrator.Migrate(); string sharedSettingsPath = LexiconSettingsFileHelper.GetSharedSettingsPath(repoDto.ProjectFolder); if (!Directory.Exists(sharedSettingsPath)) { Directory.CreateDirectory(sharedSettingsPath); } var projectSettingsStore = new FileSettingsStore(LexiconSettingsFileHelper.GetProjectLexiconSettingsPath(repoDto.ProjectFolder)); var userSettingsStore = new FileSettingsStore(LexiconSettingsFileHelper.GetUserLexiconSettingsPath(repoDto.ProjectFolder)); var repo = new CoreLdmlInFolderWritingSystemRepository(ldmlFolder, projectSettingsStore, userSettingsStore); migrator.ResetRemovedProperties(repo); // migrate local keyboard settings from CoreImpl application settings to new lexicon user settings file // skip if we're running unit tests, could interfere with the test results string localKeyboards; if (!repoDto.ProjectFolder.StartsWith(Path.GetTempPath()) && TryGetLocalKeyboardsSetting(out localKeyboards)) { if (localKeyboards.Length > 0) { XElement keyboardsElem = XElement.Parse(localKeyboards); foreach (XElement keyboardElem in keyboardsElem.Elements("keyboard")) { var wsId = (string)keyboardElem.Attribute("ws"); CoreWritingSystemDefinition ws; if (repo.TryGet(wsId, out ws)) { var layout = (string)keyboardElem.Attribute("layout"); var locale = (string)keyboardElem.Attribute("locale"); string keyboardId = string.IsNullOrEmpty(locale) ? layout : $"{locale}_{layout}"; IKeyboardDefinition keyboard; if (!Keyboard.Controller.TryGetKeyboard(keyboardId, out keyboard)) { keyboard = Keyboard.Controller.CreateKeyboard(keyboardId, KeyboardFormat.Unknown, Enumerable.Empty <string>()); } ws.LocalKeyboard = keyboard; } } } repo.Save(); } var wsIdMigrator = new WritingSystemIdMigrator(repoDto, TryGetNewLangTag, "*.fwlayout"); wsIdMigrator.Migrate(); DataMigrationServices.IncrementVersionNumber(repoDto); }