private void SaveBackup(string languageId, string index, string[] synonymPairs)
        {
            var name = GetFilename(languageId, index);
            SynonymBackupFile contentFile = GetBackup(name);

            //TODO: Don't create new version for identical files.

            contentFile = contentFile == null
                ? _contentRepository.GetDefault <SynonymBackupFile>(GetBackupFolder().ContentLink)
                : contentFile.CreateWritableClone() as SynonymBackupFile;

            var content = String.Join("|", synonymPairs);

            var blob = _blobFactory.CreateBlob(contentFile.BinaryDataContainer, ".synonyms");

            using (var stream = blob.OpenWrite())
            {
                var writer = new StreamWriter(stream);
                writer.Write(content);
                writer.Flush();
            }
            contentFile.Name       = name;
            contentFile.BinaryData = blob;

            _contentRepository.Save(contentFile, SaveAction.Publish, AccessLevel.NoAccess);

            if (_logger.IsDebugEnabled())
            {
                _logger.Debug("SaveBackup -> Name: " + contentFile.Name);
                _logger.Debug("SaveBackup -> RouteSegment: " + contentFile.RouteSegment);
                _logger.Debug("SaveBackup -> MimeType: " + contentFile.MimeType);
                _logger.Debug("SaveBackup -> ContentLink: " + contentFile.ContentLink);
                _logger.Debug("SaveBackup -> Status: " + contentFile.Status);
            }
        }
        private SynonymBackupFile GetBackup(string name)
        {
            ContentReference backupFolder = GetBackupFolder().ContentLink;

            SynonymBackupFile backupFile = _contentRepository
                                           .GetChildren <SynonymBackupFile>(backupFolder)
                                           .FirstOrDefault(s => s.Name.Equals(name, StringComparison.OrdinalIgnoreCase));

            if (backupFile == null)
            {
                return(null);
            }

            if (backupFile.BinaryData is FileBlob fileBlob && !File.Exists(fileBlob.FilePath))
            {
                return(null);
            }

            return(backupFile);
        }
        public List <Synonym> GetSynonyms(string languageId, string index)
        {
            var synonyms = new List <Synonym>();

            if (String.IsNullOrWhiteSpace(index))
            {
                index = _settings.GetDefaultIndexName(languageId);
            }

            var indexing = new Indexing(_serverInfoService, _settings, _httpClientHelper);

            if (!indexing.IndexExists(index))
            {
                return(synonyms);
            }

            var json = _httpClientHelper.GetString(indexing.GetUri(index, "_settings"));

            var jpath = $"{index}.settings.index.analysis.filter.{Language.GetLanguageAnalyzer(languageId)}_synonym_filter.synonyms";

            JContainer settings     = JsonConvert.DeserializeObject <JContainer>(json);
            JToken     synonymPairs = settings.SelectToken(jpath);

            string[] parsedSynonyms;
            if (synonymPairs?.Any(s => s.ToString() != "example_from,example_to") == true)
            {
                parsedSynonyms = synonymPairs.Select(s => s.ToString()).ToArray();
            }
            else
            {
                SynonymBackupFile backup = GetBackup(GetFilename(languageId, index));
                if (backup?.BinaryData == null)
                {
                    return(synonyms);
                }

                using (var stream = backup.BinaryData.OpenRead())
                {
                    using (var reader = new StreamReader(stream))
                    {
                        string data = reader.ReadToEnd();
                        _logger.Debug("Synonym data: " + data);
                        parsedSynonyms = data.Split('|');
                    }
                }
            }

            foreach (string synonym in parsedSynonyms)
            {
                if (String.IsNullOrWhiteSpace(synonym))
                {
                    continue;
                }

                var arrowPos      = synonym.IndexOf("=>");
                var firstCommaPos = synonym.IndexOf(',');
                var isMultiword   = arrowPos > firstCommaPos;
                var splitToken    = new[] { isMultiword ? "=>" : "," };

                _logger.Debug("Synonym: " + synonym);

                var pair = synonym.Split(splitToken, StringSplitOptions.None);
                if (pair.Length > 1)
                {
                    synonyms.Add(new Synonym
                    {
                        From      = pair[0],
                        To        = pair[1],
                        TwoWay    = !isMultiword && !pair[0].Contains("=>"),
                        MultiWord = isMultiword
                    });
                }
            }

            return(synonyms);
        }