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