/// <summary>
        /// Parse datafile string to create ProjectConfig instance.
        /// </summary>
        /// <param name="content">datafile</param>
        /// <param name="logger">Logger instance</param>
        /// <param name="errorHandler">ErrorHandler instance</param>
        /// <returns>ProjectConfig instance created from datafile string</returns>
        public static ProjectConfig Create(string content, ILogger logger, IErrorHandler errorHandler)
        {
            DatafileProjectConfig config = GetConfig(content);

            config.Logger       = logger ?? new NoOpLogger();
            config.ErrorHandler = errorHandler ?? new NoOpErrorHandler(logger);

            config.Initialize();

            return(config);
        }
示例#2
0
        protected override ProjectConfig Poll()
        {
            var datafile = GetRemoteDatafileResponse();

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

            return(DatafileProjectConfig.Create(datafile, Logger, ErrorHandler));
        }
示例#3
0
            /// <summary>
            /// HttpProjectConfigManager.Builder that builds and starts a HttpProjectConfigManager.
            /// </summary>
            /// <param name="defer">When true, we will not wait for the configuration to be available
            /// before returning the HttpProjectConfigManager instance.</param>
            /// <returns>HttpProjectConfigManager instance</returns>
            public HttpProjectConfigManager Build(bool defer)
            {
                HttpProjectConfigManager configManager = null;

                if (Logger == null)
                {
                    Logger = new DefaultLogger();
                }

                if (ErrorHandler == null)
                {
                    ErrorHandler = new DefaultErrorHandler(Logger, false);
                }

                if (string.IsNullOrEmpty(Format))
                {
                    if (string.IsNullOrEmpty(DatafileAccessToken))
                    {
                        Format = DEFAULT_FORMAT;
                    }
                    else
                    {
                        Format = DEFAULT_AUTHENTICATED_DATAFILE_FORMAT;
                    }
                }

                if (string.IsNullOrEmpty(Url))
                {
                    if (string.IsNullOrEmpty(SdkKey))
                    {
                        ErrorHandler.HandleError(new Exception("SdkKey cannot be null"));
                    }
                    Url = string.Format(Format, SdkKey);
                }

                if (IsPollingIntervalProvided && (Period.TotalMilliseconds <= 0 || Period.TotalMilliseconds > MAX_MILLISECONDS_LIMIT))
                {
                    Logger.Log(LogLevel.DEBUG, $"Polling interval is not valid for periodic calls, using default period {DEFAULT_PERIOD.TotalMilliseconds}ms");
                    Period = DEFAULT_PERIOD;
                }
                else if (!IsPollingIntervalProvided)
                {
                    Logger.Log(LogLevel.DEBUG, $"No polling interval provided, using default period {DEFAULT_PERIOD.TotalMilliseconds}ms");
                    Period = DEFAULT_PERIOD;
                }


                if (IsBlockingTimeoutProvided && (BlockingTimeoutSpan.TotalMilliseconds <= 0 || BlockingTimeoutSpan.TotalMilliseconds > MAX_MILLISECONDS_LIMIT))
                {
                    Logger.Log(LogLevel.DEBUG, $"Blocking timeout is not valid, using default blocking timeout {DEFAULT_BLOCKINGOUT_PERIOD.TotalMilliseconds}ms");
                    BlockingTimeoutSpan = DEFAULT_BLOCKINGOUT_PERIOD;
                }
                else if (!IsBlockingTimeoutProvided)
                {
                    Logger.Log(LogLevel.DEBUG, $"No Blocking timeout provided, using default blocking timeout {DEFAULT_BLOCKINGOUT_PERIOD.TotalMilliseconds}ms");
                    BlockingTimeoutSpan = DEFAULT_BLOCKINGOUT_PERIOD;
                }


                configManager = new HttpProjectConfigManager(Period, Url, BlockingTimeoutSpan, AutoUpdate, Logger, ErrorHandler, DatafileAccessToken);

                if (Datafile != null)
                {
                    try
                    {
                        var config = DatafileProjectConfig.Create(Datafile, Logger, ErrorHandler);
                        configManager.SetConfig(config);
                    }
                    catch (Exception ex)
                    {
                        Logger.Log(LogLevel.WARN, "Error parsing fallback datafile." + ex.Message);
                    }
                }

                configManager.NotifyOnProjectConfigUpdate += () => {
                    NotificationCenter?.SendNotifications(NotificationCenter.NotificationType.OptimizelyConfigUpdate);
                };


                if (StartByDefault)
                {
                    configManager.Start();
                }

                // Optionally block until config is available.
                if (!defer)
                {
                    configManager.GetConfig();
                }

                return(configManager);
            }