예제 #1
0
        public void CacheFlagsFromService(IDictionary <string, FeatureFlag> flags, User user)
        {
            readWriteLock.EnterWriteLock();
            try
            {
                var previousFlags = inMemoryCache.RetrieveFlags(user);
                deviceCache.CacheFlagsForUser(flags, user);
                inMemoryCache.CacheFlagsForUser(flags, user);

                foreach (var flag in flags)
                {
                    bool flagAlreadyExisted = previousFlags.ContainsKey(flag.Key);
                    bool flagValueChanged   = false;
                    if (flagAlreadyExisted)
                    {
                        var originalFlag = previousFlags[flag.Key];
                        flagValueChanged = originalFlag.value != flag.Value.value;
                    }

                    // only update the Listeners if the flag value changed
                    if (flagValueChanged)
                    {
                        flagListenerUpdater.FlagWasUpdated(flag.Key, flag.Value.value);
                    }
                }
            }
            finally
            {
                readWriteLock.ExitWriteLock();
            }
        }
예제 #2
0
        public void CanCacheFlagsInMemory()
        {
            var jsonFlags = @"{""flag1"":{""value"":1},""flag2"":{""value"":2}}";
            var flags     = TestUtil.DecodeFlagsJson(jsonFlags);

            inMemoryCache.CacheFlagsForUser(flags, user1);
            var flagsRetrieved = inMemoryCache.RetrieveFlags(user1);

            Assert.Equal(2, flagsRetrieved.Count);
            Assert.Equal(flags["flag1"], flagsRetrieved["flag1"]);
            Assert.Equal(flags["flag2"], flagsRetrieved["flag2"]);
        }
예제 #3
0
        public FlagCacheManager(IUserFlagCache inMemoryCache,
                                IUserFlagCache deviceCache,
                                IFlagListenerUpdater flagListenerUpdater,
                                User user)
        {
            this.inMemoryCache       = inMemoryCache;
            this.deviceCache         = deviceCache;
            this.flagListenerUpdater = flagListenerUpdater;

            var flagsFromDevice = deviceCache.RetrieveFlags(user);

            inMemoryCache.CacheFlagsForUser(flagsFromDevice, user);
        }
예제 #4
0
        public void CacheFlagsFromService(IDictionary <string, FeatureFlag> flags, User user)
        {
            List <Tuple <string, JToken, JToken> > changes = null;

            readWriteLock.EnterWriteLock();
            try
            {
                var previousFlags = inMemoryCache.RetrieveFlags(user);
                deviceCache.CacheFlagsForUser(flags, user);
                inMemoryCache.CacheFlagsForUser(flags, user);

                foreach (var flag in flags)
                {
                    if (previousFlags.TryGetValue(flag.Key, out var originalFlag))
                    {
                        if (!JToken.DeepEquals(originalFlag.value, flag.Value.value))
                        {
                            if (changes == null)
                            {
                                changes = new List <Tuple <string, JToken, JToken> >();
                            }
                            changes.Add(Tuple.Create(flag.Key, flag.Value.value, originalFlag.value));
                        }
                    }
                }
            }
            finally
            {
                readWriteLock.ExitWriteLock();
            }
            if (changes != null)
            {
                foreach (var c in changes)
                {
                    flagChangedEventManager.FlagWasUpdated(c.Item1, c.Item2, c.Item3);
                }
            }
        }
예제 #5
0
        public void CanCacheFlagsInMemory()
        {
            var text  = JSONReader.FeatureFlagJSON();
            var flags = JsonConvert.DeserializeObject <IDictionary <string, FeatureFlag> >(text);

            inMemoryCache.CacheFlagsForUser(flags, user1);
            var flagsRetrieved = inMemoryCache.RetrieveFlags(user1);

            Assert.Equal(flags.Count, flagsRetrieved.Count);
            var secondFlag          = flags.Values.ToList()[1];
            var secondFlagRetrieved = flagsRetrieved.Values.ToList()[1];

            Assert.Equal(secondFlag, secondFlagRetrieved);
        }
예제 #6
0
        public FlagCacheManager(IUserFlagCache inMemoryCache,
                                IUserFlagCache deviceCache,
                                IFlagChangedEventManager flagChangedEventManager,
                                User user)
        {
            this.inMemoryCache           = inMemoryCache;
            this.deviceCache             = deviceCache;
            this.flagChangedEventManager = flagChangedEventManager;

            var flagsFromDevice = deviceCache.RetrieveFlags(user);

            if (flagsFromDevice != null)
            {
                inMemoryCache.CacheFlagsForUser(flagsFromDevice, user);
            }
        }
 public void CacheFlagsFromService(IImmutableDictionary <string, FeatureFlag> flags, User user)
 {
     _flagCache.CacheFlagsForUser(flags, user);
 }