using System; using System.IO; using System.Collections.Generic; using System.Xml.Serialization; namespace NaGet.Packages { /// /// パッケージのリストの情報を示すクラス /// [XmlRoot("PackageList", Namespace="http://diffshare.tv/xmlns/2007/na-get/PackageList/")] public class PackageList where TPackage : Package { /// /// パッケージリスト自体の識別名 /// public string Name; /// /// パッケージの配列のリスト /// private List packageArrayList; /// /// コンストラクタ /// public PackageList() { packageArrayList = new List(); } /// /// 本リストが格納しているパッケージのリスト /// [XmlElement("Package", Namespace="http://diffshare.tv/xmlns/2007/na-get/PackageList/")] public TPackage[] Packages { get { return packageArrayList.ToArray(); } set { packageArrayList = new List(); if (value != null) { foreach (TPackage package in value) { packageArrayList.Add(package); } } } } /// /// 本リストが格納しているパッケージのイテレータを返す /// /// パッケージのイテレータ public IEnumerator GetEnumerator() { return packageArrayList.GetEnumerator(); } /// /// パッケージをリストに追加する /// /// 追加するパッケージ public void AddPackages(IEnumerable package) { packageArrayList.AddRange(package); } /// /// パッケージリストの各PackageListNameを設定する /// /// 設定するパッケージが入っているパッケージリスト public void FixPackageListName() { foreach (TPackage pkg in packageArrayList) { pkg.PackageListName = this.Name; } } /// /// パッケージをリストにマージ(追加)する /// /// 追加するパッケージ public void AddPackages(PackageList pkgList) { packageArrayList.AddRange(pkgList.packageArrayList); } /// /// パッケージをリストに追加する /// /// 追加するパッケージ public void AddPackage(TPackage package) { packageArrayList.Add(package); } /// /// パッケージをリストから削除 /// /// 削除するパッケージ public void RemovePackage(TPackage package) { packageArrayList.Remove(package); } #region パッケージ検索 #region 検索用Predicate /// /// パッケージを検索をする際のPredicateを返す /// /// 検索キー protected internal static Predicate GetPredicateForSearch(string key) { string lowerKey = key.ToLower(); return delegate(TPackage package) { return package.Name.ToLower().IndexOf(lowerKey) >= 0 || package.Summary.ToLower().IndexOf(lowerKey) >= 0 || ((package.Tags ?? string.Empty).ToLower().IndexOf(lowerKey) >= 0); }; } /// /// パッケージ名で検索をする際のPredicateを返す /// /// /// パッケージ名 /// /// /// Predicate /// protected internal static Predicate GetPredicateForPackageName(string name) { return delegate(TPackage package) { return package.Name == name; }; } /// /// エントリで検索をする際のPredicateを返す /// /// /// エントリ /// /// /// Predicate /// protected internal static Predicate GetPredicateForEntry(Entry entry) { return entry.Match; } #endregion /// /// パッケージを検索して、それにマッチしたパッケージをイテレータとして返す。 /// /// 検索条件のPredicate /// マッチしたパッケージのイテレータ protected internal IEnumerable Search(Predicate predicate) { return packageArrayList.FindAll(predicate); } /// /// パッケージを検索して、それにマッチしたパッケージをイテレータとして返す。 /// /// 検索キー /// マッチしたパッケージのイテレータ public IEnumerable Search(string key) { return Search(GetPredicateForSearch(key)); } /// /// 指定した名前に対応するパッケージを返す /// /// 検索にかけるパッケージ名 public TPackage GetPackageForName(string name) { return packageArrayList.Find(GetPredicateForPackageName(name)); } /// /// 指定した名前に対応するパッケージを返す /// /// 検索にかけるパッケージ名 public IEnumerable GetPackagesForName(string name) { return packageArrayList.FindAll(GetPredicateForPackageName(name)); } /// /// 名前・バージョンが対応するパッケージを返す /// /// 検索にかけるパッケージ名 /// 検索にかけるパッケージのバージョン public TPackage GetPackageForPackage(string name, string version) { return GetPackageForEntry(new Entry(name, null, version)); } /// /// パッケージ参照エントリが対応するパッケージを返す /// /// 検索にかけるパッケージ参照エントリ public TPackage GetPackageForEntry(Entry entry) { return packageArrayList.Find(GetPredicateForEntry(entry)); } /// /// パッケージ参照エントリが対応するパッケージをすべて返す /// /// 検索にかけるパッケージ参照エントリ public IEnumerable GetPackagesForEntry(Entry entry) { return packageArrayList.FindAll(GetPredicateForEntry(entry)); } #endregion } }