Exemplo n.º 1
0
        /// <summary>
        /// Получает ссылку на удаленный репозиторий, хранящийся на FTP сервере
        /// </summary>
        /// <param name="ftpHost">Адрес узла (IP-адрес или доменное имя)</param>
        /// <param name="ftpPort">TCP порт, на котором расположен FTP сервер</param>
        /// <param name="ftpUsername">Имя пользователя FTP сервера</param>
        /// <param name="ftpPassword">Пароль пользователя FTP сервера</param>
        /// <param name="deviceNumber">Номер устройства</param>
        /// <param name="locomotiveName">Название локомотива</param>
        /// <param name="sectionName">Название сервера</param>
        /// <param name="psnConfiguration">Конфигурация магистрали ПСН</param>
        /// <returns>Ссылка на репозиторий</returns>
        /// <exception cref="Exception">Может возникнуть исключение, если не удается открыть репозиторий</exception>
        public IRepository GetFtpClientRepository(string ftpHost, int ftpPort, string ftpUsername, string ftpPassword, int deviceNumber, string locomotiveName, string sectionName, IPsnProtocolConfig psnConfiguration)
        {
            var bw       = new BackgroundQueueWorker <Action>(a => a());
            var deviceId = new IdentifierGuidBased(Guid.NewGuid());

            return(new RelayRepository(_psnInternalConfigurations.Value,
                                       () =>
            {
                try
                {
                    if (psnConfiguration == null)
                    {
                        throw new Exception("Ошибка, при обращении к устройству необходимо вручную указать конфигурацию ПСН");
                    }
                    var deviceInformationStorage = new DeviceInformationStorageCustomSingle(locomotiveName, sectionName, deviceId.ToString());
                    var deviceInformationStorageCache = new DeviceInformationStorageRelayMemoryCache(deviceInformationStorage);

                    var ftpFilesStorage = new FtpFilesStorageLazyCached(
                        new FtpFilesStorageSimple(
                            ftpHost, ftpPort, ftpUsername, ftpPassword, deviceNumber + "/"));

                    var psnDataStorage = new StreamReadableDataStorageFtpUrl(ftpFilesStorage, deviceNumber);
                    var psnDataStorageCache = new StreamedDataStorageRelayMemoryCache(psnDataStorage);

                    var psnDataInfosStorage = new PsnDataInformationStorageFtpUrl(ftpFilesStorage, deviceNumber, deviceId.ToString());
                    var psnDataInfosStorageCache = new PsnDataInformationStorageRelayMemoryCache(psnDataInfosStorage);

                    var psnDataCustomInfoStorage = new PsnDataCustomConfigurationsStoragePredefined(
                        psnDataInfosStorageCache.PsnDataInformations.Select(
                            pdi => new PsnDataCustomConfigurationSimple(pdi.Id, new IdentifierStringBased(psnConfiguration.Id.ToString()), string.Empty)));
                    var psnDataCustomInfoStorageCache = new PsnDataCustomConfigurationsStorageRelayMemoryCache(psnDataCustomInfoStorage);

                    return new ReposetoryOpenedResultSimple(
                        psnDataStorageCache,
                        psnDataInfosStorageCache,
                        deviceInformationStorageCache,
                        psnDataCustomInfoStorageCache,
                        new PsnInternalConfigurationsStorageRelay(_psnInternalConfigurations.Value));
                }
                catch (Exception ex)
                {
                    throw new Exception("Не удалось открыть устройство по указанному пути: " + ftpHost + ":" + ftpPort, ex);
                }
            }
                                       , new KeyValueStorageHolderMemory()
                                       , bw
                                       , bw
                                       , "FtpClient@" + ftpHost + ":" + ftpPort + "[deviceNumber=" + deviceNumber + "]"));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Получает ссылку на репозиторий устройства РПД
        /// </summary>
        /// <param name="nandPath">Путь к устройству РПД</param>
        /// <param name="psnConfiguration">Конфигурация ПСН применяемая ко всем данным NAND</param>
        /// <returns>Ссылка на репозиторий</returns>
        public IRepository GetNandFlashRepository(string nandPath, IPsnProtocolConfig psnConfiguration)
        {
            var bw       = new BackgroundQueueWorker <Action>(a => a());
            var deviceId = new IdentifierGuidBased(Guid.NewGuid());

            return(new RelayRepository(_psnInternalConfigurations.Value,
                                       () => {
                try {
                    if (psnConfiguration == null)
                    {
                        throw new Exception("Ошибка, при обращении к устройству необходимо вручную указать конфигурацию ПСН");
                    }
                    var deviceInformationStorage = new DeviceInformationStorageNand(nandPath, deviceId.ToString());
                    var deviceInformationStorageCache = new DeviceInformationStorageRelayMemoryCache(deviceInformationStorage);

                    var psnDataStorage = new StreamReadableDataStorageNand(nandPath);
                    var psnDataStorageCache = new StreamedDataStorageRelayMemoryCache(psnDataStorage);

                    var psnDataInfosStorage = new PsnDataInformationStorageNand(nandPath, deviceId.ToString());
                    var psnDataInfosStorageCache = new PsnDataInformationStorageRelayMemoryCache(psnDataInfosStorage);

                    var psnDataCustomInfoStorage = new PsnDataCustomConfigurationsStoragePredefined(
                        psnDataInfosStorageCache.PsnDataInformations.Select(
                            pdi => new PsnDataCustomConfigurationSimple(pdi.Id, new IdentifierStringBased(psnConfiguration.Id.ToString()), string.Empty)));
                    var psnDataCustomInfoStorageCache = new PsnDataCustomConfigurationsStorageRelayMemoryCache(psnDataCustomInfoStorage);

                    return new ReposetoryOpenedResultSimple(
                        psnDataStorageCache,
                        psnDataInfosStorageCache,
                        deviceInformationStorageCache,
                        psnDataCustomInfoStorageCache,
                        new PsnInternalConfigurationsStorageRelay(_psnInternalConfigurations.Value));
                }
                catch (Exception ex) {
                    throw new Exception("Не удалось открыть устройство по указанному пути: " + nandPath, ex);
                }
            }
                                       , new KeyValueStorageHolderMemory()
                                       , bw
                                       , bw
                                       , "NAND@" + nandPath));
        }