/// <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; }
/// <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; } }