示例#1
0
        public int Check(string[] keys)
        {
            if (keys == null)
            {
                return(-1);
            }

            Lock();
            try
            {
                IBindingCacheLevel cacheLevel = root;

                // follow the branch
                for (int i = 0; i < keys.Length - 1; i++)
                {
                    object level = cacheLevel[keys[i]];

                    // does the branch exist?
                    if (level == null)
                    {
                        return(i);
                    }

                    // next level
                    cacheLevel = (IBindingCacheLevel)level;
                }

                return(keys.Length);
            }
            finally
            {
                Unlock();
            }
        }
示例#2
0
        private IBindingCacheLevel CreateCacheLevel(int level)
        {
            if ((level < 0) || (level >= cacheLevels.Count))
            {
                throw new ArgumentException("Cache level doesn't fit the configuration!");
            }

            // get the class and create an instance
            Type levelType = cacheLevels[level];
            IBindingCacheLevel cacheLevel = null;

            try
            {
                cacheLevel = (IBindingCacheLevel)Activator.CreateInstance(levelType);
            }
            catch (Exception e)
            {
                throw new ArgumentException("Cache level problem?!", e);
            }

            // initialize it
            cacheLevel.Initialize(cacheLevelParameters[level]);

            return(cacheLevel);
        }
        public void Initialize(string[] cacheLevelConfig)
        {
            lock (cacheLock)
            {
                if (cacheLevels != null)
                {
                    throw new InvalidOperationException("Cache already initialize!");
                }

                if (cacheLevelConfig == null || cacheLevelConfig.Length == 0)
                {
                    throw new ArgumentException("Cache config must not be empty!", nameof(cacheLevelConfig));
                }
                cacheLevels          = new List <Type>();
                cacheLevelParameters = new List <IDictionary <string, string> >();

                // build level lists
                foreach (string config in cacheLevelConfig)
                {
                    int x = config.IndexOf(' ');
                    if (x == -1)
                    {
                        AddLevel(config, null);
                    }
                    else
                    {
                        AddLevel(config.Substring(0, x), config.Substring(x + 1));
                    }
                }

                root = CreateCacheLevel(0);
            }
        }
        public void Remove(string[] keys)
        {
            if (keys == null)
            {
                return;
            }

            lock (cacheLock)
            {
                IBindingCacheLevel cacheLevel = root;

                // follow the branch
                for (int i = 0; i < keys.Length - 1; i++)
                {
                    object level = cacheLevel[keys[i]];

                    // does the branch exist?
                    if (level == null)
                    {
                        return;
                    }

                    // next level
                    cacheLevel = (IBindingCacheLevel)level;
                }

                cacheLevel.Remove(keys[keys.Length - 1]);

                if (Logger.IsDebugEnabled)
                {
                    Logger.Debug("Binding Cache: " + name + ": removed [" + GetFormattedKeys(keys) + "]");
                }
            }
        }
示例#5
0
        public void Put(string[] keys, object value)
        {
            if (keys == null)
            {
                return;
            }

            if (keys.Length != cacheLevels.Count)
            {
                throw new ArgumentException("Wrong number of keys!");
            }

            Lock();
            try
            {
                IBindingCacheLevel cacheLevel = root;

                // follow the branch
                for (int i = 0; i < keys.Length - 1; i++)
                {
                    object level = cacheLevel[keys[i]];

                    // does the branch exist?
                    if (level == null)
                    {
                        level = CreateCacheLevel(i + 1);
                        cacheLevel[keys[i]] = level;
                    }

                    // next level
                    cacheLevel = (IBindingCacheLevel)level;
                }

                cacheLevel[keys[keys.Length - 1]] = value;

                if (DotCMISDebug.DotCMISSwitch.TraceVerbose)
                {
                    Trace.WriteLine(name + ": put [" + GetFormattedKeys(keys) + "] = " + value);
                }
            }
            finally
            {
                Unlock();
            }
        }
示例#6
0
        public object Get(string[] keys)
        {
            if (keys == null)
            {
                return(null);
            }

            if (keys.Length != cacheLevels.Count)
            {
                throw new ArgumentException("Wrong number of keys!");
            }

            object result = null;

            Lock();
            try
            {
                IBindingCacheLevel cacheLevel = root;

                // follow the branch
                for (int i = 0; i < keys.Length - 1; i++)
                {
                    object level = cacheLevel[keys[i]];

                    // does the branch exist?
                    if (level == null)
                    {
                        return(null);
                    }

                    // next level
                    cacheLevel = (IBindingCacheLevel)level;
                }

                // get the value
                result = cacheLevel[keys[keys.Length - 1]];
            }
            finally
            {
                Unlock();
            }

            return(result);
        }
        public void Put(string[] keys, object value)
        {
            if (keys == null)
            {
                return;
            }

            if (keys.Length != cacheLevels.Count)
            {
                throw new ArgumentException("Wrong number of keys!", nameof(keys));
            }

            lock (cacheLock)
            {
                IBindingCacheLevel cacheLevel = root;

                // follow the branch
                for (int i = 0; i < keys.Length - 1; i++)
                {
                    object level = cacheLevel[keys[i]];

                    // does the branch exist?
                    if (level == null)
                    {
                        level = CreateCacheLevel(i + 1);
                        cacheLevel[keys[i]] = level;
                    }

                    // next level
                    cacheLevel = (IBindingCacheLevel)level;
                }

                cacheLevel[keys[keys.Length - 1]] = value;

                if (Logger.IsDebugEnabled)
                {
                    Logger.Debug("Binding Cache: " + name + ": put [" + GetFormattedKeys(keys) + "] = " + value);
                }
            }
        }
示例#8
0
        public void Remove(string[] keys)
        {
            if (keys == null)
            {
                return;
            }

            Lock();
            try
            {
                IBindingCacheLevel cacheLevel = root;

                // follow the branch
                for (int i = 0; i < keys.Length - 1; i++)
                {
                    object level = cacheLevel[keys[i]];

                    // does the branch exist?
                    if (level == null)
                    {
                        return;
                    }

                    // next level
                    cacheLevel = (IBindingCacheLevel)level;
                }

                cacheLevel.Remove(keys[keys.Length - 1]);

                if (DotCMISDebug.DotCMISSwitch.TraceVerbose)
                {
                    Trace.WriteLine(name + ": removed [" + GetFormattedKeys(keys) + "]");
                }
            }
            finally
            {
                Unlock();
            }
        }
示例#9
0
        public void Initialize(string[] cacheLevelConfig)
        {
            if (cacheLevels != null)
            {
                throw new ApplicationException("Cache already initialize!");
            }

            if ((cacheLevelConfig == null) || (cacheLevelConfig.Length == 0))
            {
                throw new ArgumentException("Cache config must not be empty!");
            }

            Lock();
            try
            {
                cacheLevels = new List<Type>();
                cacheLevelParameters = new List<IDictionary<string, string>>();

                // build level lists
                foreach (string config in cacheLevelConfig)
                {
                    int x = config.IndexOf(' ');
                    if (x == -1)
                    {
                        AddLevel(config, null);
                    }
                    else
                    {
                        AddLevel(config.Substring(0, x), config.Substring(x + 1));
                    }
                }

                root = CreateCacheLevel(0);
            }
            finally
            {
                Unlock();
            }
        }