OSDN Git Service

initial build for opensource
[applistation/AppliStation.git] / na-get-lib / NaGet.Packages / PackageList.cs
1 using System;\r
2 using System.IO;\r
3 using System.Collections.Generic;\r
4 using System.Xml.Serialization;\r
5 \r
6 namespace NaGet.Packages\r
7 {\r
8         /// <summary>\r
9         /// パッケージのリストの情報を示すクラス\r
10         /// </summary>\r
11         [XmlRoot("PackageList", Namespace="http://diffshare.tv/xmlns/2007/na-get/PackageList/")]\r
12         public class PackageList<TPackage> where TPackage : Package\r
13         {\r
14                 /// <summary>\r
15                 /// パッケージリスト自体の識別名\r
16                 /// </summary>\r
17                 public string Name;\r
18 \r
19                 /// <summary>\r
20                 /// パッケージの配列のリスト\r
21                 /// </summary>\r
22                 private List<TPackage> packageArrayList;\r
23 \r
24                 /// <summary>\r
25                 /// コンストラクタ\r
26                 /// </summary>\r
27                 public PackageList()\r
28                 {\r
29                         packageArrayList = new List<TPackage>();\r
30                 }\r
31 \r
32                 /// <summary>\r
33                 /// 本リストが格納しているパッケージの配列\r
34                 /// </summary>\r
35                 [XmlElement("Package", Namespace="http://diffshare.tv/xmlns/2007/na-get/PackageList/")]\r
36                 public TPackage[] Packages\r
37                 {\r
38                         get\r
39                         {\r
40                                 return packageArrayList.ToArray();\r
41                         }\r
42                         set\r
43                         {\r
44                                 packageArrayList = new List<TPackage>();\r
45                                 if (value != null) {\r
46                                         foreach (TPackage package in value) {\r
47                                                 packageArrayList.Add(package);\r
48                                         }\r
49                                 }\r
50                         }\r
51                 }\r
52 \r
53                 /// <summary>\r
54                 /// パッケージをリストに追加する\r
55                 /// </summary>\r
56                 /// <param name="package">追加するパッケージ</param>\r
57                 public void AddPackages(IEnumerable<TPackage> package)\r
58                 {\r
59                         packageArrayList.AddRange(package);\r
60                 }\r
61                 \r
62                 /// <summary>\r
63                 /// パッケージをリストにマージ(追加)する\r
64                 /// </summary>\r
65                 /// <param name="package">追加するパッケージ</param>\r
66                 public void AddPackages(PackageList<TPackage> pkgList)\r
67                 {\r
68                         packageArrayList.AddRange(pkgList.packageArrayList);\r
69                 }\r
70                 \r
71                 /// <summary>\r
72                 /// パッケージをリストに追加する\r
73                 /// </summary>\r
74                 /// <param name="package">追加するパッケージ</param>\r
75                 public void AddPackage(TPackage package)\r
76                 {\r
77                         packageArrayList.Add(package);\r
78                 }\r
79                 \r
80                 /// <summary>\r
81                 /// パッケージをリストから削除\r
82                 /// </summary>\r
83                 /// <param name="package">削除するパッケージ</param>\r
84                 public void RemovePackage(TPackage package)\r
85                 {\r
86                         packageArrayList.Remove(package);\r
87                 }\r
88                 \r
89                 /// <summary>\r
90                 /// パッケージを検索をする際のPredicateを返す \r
91                 /// </summary>\r
92                 /// <param name="key">検索キー</param>\r
93                 protected static Predicate<TPackage> GetPredicateForSearch(string key)\r
94                 {\r
95                         string lowerKey = key.ToLower();\r
96                         return delegate(TPackage package) {\r
97                                 return package.Name.ToLower().IndexOf(lowerKey) >= 0 ||\r
98                                         package.Summary.ToLower().IndexOf(lowerKey) >= 0 ||\r
99                                         ((package.Tags ?? string.Empty).ToLower().IndexOf(lowerKey) >= 0);\r
100                         };\r
101                 }\r
102                 \r
103                 /// <summary>\r
104                 /// パッケージを検索して、それにマッチしたパッケージをイテレータとして返す。\r
105                 /// </summary>\r
106                 /// <param name="key">検索キー</param>\r
107                 public IEnumerable<TPackage> Search(string key)\r
108                 {\r
109                         return packageArrayList.FindAll(GetPredicateForSearch(key));\r
110                 }\r
111                 \r
112                 /// <summary>\r
113                 /// パッケージ名で検索をする際のPredicateを返す \r
114                 /// </summary>\r
115                 /// <param name="name">\r
116                 /// パッケージ名\r
117                 /// </param>\r
118                 /// <returns>\r
119                 /// Predicate\r
120                 /// </returns>\r
121                 protected static Predicate<TPackage> GetPredicateForPackageName(string name)\r
122                 {\r
123                         return delegate(TPackage package) {\r
124                                 return package.Name == name;\r
125                         };\r
126                 }\r
127                 \r
128                 /// <summary>\r
129                 /// 指定した名前に対応するパッケージを返す\r
130                 /// </summary>\r
131                 /// <param name="name">検索にかけるパッケージ名</param>\r
132                 public TPackage GetPackageForName(string name)\r
133                 {\r
134                         return packageArrayList.Find(GetPredicateForPackageName(name));\r
135                 }\r
136                 \r
137                 /// <summary>\r
138                 /// 指定した名前に対応するパッケージを返す\r
139                 /// </summary>\r
140                 /// <param name="name">検索にかけるパッケージ名</param>\r
141                 public TPackage[] GetPackagesForName(string name)\r
142                 {\r
143                         return packageArrayList.FindAll(GetPredicateForPackageName(name)).ToArray();\r
144                 }\r
145                 \r
146                 /// <summary>\r
147                 /// 名前・バージョンが対応するパッケージを返す\r
148                 /// </summary>\r
149                 /// <param name="name">検索にかけるパッケージ名</param>\r
150                 /// <param name="version">検索にかけるパッケージのバージョン</param>\r
151                 public TPackage GetPackageForPackage(string name, string version)\r
152                 {\r
153                         TPackage[] pkgs = GetPackagesForName(name);\r
154                         foreach (TPackage tpkg in pkgs) {\r
155                                 if (tpkg.Version == version) {\r
156                                         return tpkg;\r
157                                 }\r
158                         }\r
159                         return null;\r
160                 }\r
161         }\r
162 }\r