/// <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);
        }
示例#2
0
        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);
        }