예제 #1
0
        /// <summary>
        /// OutputFormatの設定を登録または更新する.
        /// 実際にファイルに反映するにはSaveメソッドを呼び出す必要がある.
        /// </summary>
        /// <param name="outputFormat">対象となる設定</param>
        /// <returns>更新または登録が許可された場合はtrue、許可されない場合はfalse</returns>
        public virtual bool Update(OutputFormat outputFormat)
        {
            if (outputFormat == null) throw new ArgumentException("nullは指定できません");

            string name = outputFormat.Name ?? "";

            OutputFormatHolder holder;
            PersistentDirectoryInfo nextWritableDir;
            if (dict.TryGetValue(name, out holder))
            {
                // すでに読み込み済みのものがある場合
                if (holder.directoryInfo.Writable)
                {
                    // 書き込み可能なディレクトリのものである場合は更新する
                    holder.current = outputFormat;
                    return true;
                }
                else
                {
                    // 書き込み可能でない場合、後続の書き込み可能な
                    // 末端のディレクトリを探す
                    var curdir = holder.directoryInfo;
                    nextWritableDir = GetAfterDirectories(curdir)
                        .Where(dir => dir.Writable).LastOrDefault();
                    if (nextWritableDir == null)
                    {
                        // 後続に書き込み可能なディレクトリがなければ更新不可能
                        return false;
                    }
                }
            }
            else
            {
                // 既存にない新しい名前の場合、もっとも末端の書込み可能なディレクトリを選択し、
                // 新規にエントリを作成する
                nextWritableDir = dirs.Where(dir => dir.Writable).LastOrDefault();
            }

            // 後続の末端ディレクトリにエントリを書き込む
            var newHolder = new OutputFormatHolder()
            {
                directoryInfo = nextWritableDir,
                original = null,
                current = outputFormat
            };
            caches.Add(newHolder);
            dict[name] = newHolder;

            return false;
        }
예제 #2
0
        /// <summary>
        /// 対象ディレクトリの登録順に、そのディレクトリに存在する設定を
        /// すべて読み込みキャッシュする.
        /// </summary>
        public virtual void Load()
        {
            Clear();

            // すべてのディレクトリから存在する設定をすべて取り込む
            // (ディレクトリの登録順に格納する)
            foreach (var dirInfo in Directories)
            {
                string dir = dirInfo.Path;
                foreach (var outputFormat in OutputFormatPersistent.Load(dir))
                {
                    var cache = new OutputFormatHolder()
                    {
                        original = outputFormat,
                        current = outputFormat.duplicate(),
                        directoryInfo = dirInfo
                    };
                    caches.Add(cache);
                }
            }

            // 埋め込み設定を登録する
            caches.Add(CreateDefaultFormat("text"));
            caches.Add(CreateDefaultFormat("xml"));

            // 名前で設定をまとめる
            // 同一名がある場合は後方のもので上書きする.
            foreach (var cache in caches)
            {
                OutputFormat of = cache.original;
                string name = of.Name ?? "";

                dict[name] = cache;
            }
        }