OSDN Git Service

na-get-lib,1.2.xまでサポートしていたテキストファイル形式の旧式レポジトリリストファイル(provider.list.txt)の対応コードを削除
[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                                 SetPackages(value);\r
45                         }\r
46                 }\r
47                 \r
48                 #region パッケージの追加/削除とイテレーション\r
49                 \r
50                 /// <summary>\r
51                 /// パッケージの中身を書き換える。\r
52                 /// </summary>\r
53                 /// <param name="pkgs"></param>\r
54                 public void SetPackages(IEnumerable<TPackage> pkgs)\r
55                 {\r
56                         packageArrayList.Clear();\r
57                         if (pkgs != null) {\r
58                                 packageArrayList.AddRange(pkgs);\r
59                         }\r
60                 }\r
61                 \r
62                 /// <summary>\r
63                 /// 本リストが格納しているパッケージのイテレータを返す\r
64                 /// </summary>\r
65                 /// <returns>パッケージのイテレータ</returns>\r
66                 public IEnumerator<TPackage> GetEnumerator()\r
67                 {\r
68                         return packageArrayList.GetEnumerator();\r
69                 }\r
70 \r
71                 /// <summary>\r
72                 /// パッケージをリストに追加する\r
73                 /// </summary>\r
74                 /// <param name="package">追加するパッケージ</param>\r
75                 public void AddPackages(IEnumerable<TPackage> package)\r
76                 {\r
77                         packageArrayList.AddRange(package);\r
78                 }\r
79                 \r
80                 /// <summary>\r
81                 /// パッケージをリストにマージ(追加)する\r
82                 /// </summary>\r
83                 /// <param name="package">追加するパッケージ</param>\r
84                 public void AddPackages(PackageList<TPackage> pkgList)\r
85                 {\r
86                         packageArrayList.AddRange(pkgList.packageArrayList);\r
87                 }\r
88                 \r
89                 /// <summary>\r
90                 /// パッケージをリストに追加する\r
91                 /// </summary>\r
92                 /// <param name="package">追加するパッケージ</param>\r
93                 public void AddPackage(TPackage package)\r
94                 {\r
95                         packageArrayList.Add(package);\r
96                 }\r
97                 \r
98                 /// <summary>\r
99                 /// パッケージをリストから削除\r
100                 /// </summary>\r
101                 /// <param name="package">削除するパッケージ</param>\r
102                 public void RemovePackage(TPackage package)\r
103                 {\r
104                         packageArrayList.Remove(package);\r
105                 }\r
106                 \r
107                 #endregion\r
108                 \r
109                 #region パッケージ検索\r
110                 \r
111                 #region 検索用Predicate\r
112                 \r
113                 /// <summary>\r
114                 /// パッケージを検索をする際のPredicateを返す \r
115                 /// </summary>\r
116                 /// <param name="key">検索キー</param>\r
117                 protected internal static Predicate<TPackage> GetPredicateForSearch(string key)\r
118                 {\r
119                         string lowerKey = key.ToLower();\r
120                         return delegate(TPackage package) {\r
121                                 return package.Name.ToLower().IndexOf(lowerKey) >= 0 ||\r
122                                         package.Summary.ToLower().IndexOf(lowerKey) >= 0 ||\r
123                                         ((package.Tags ?? string.Empty).ToLower().IndexOf(lowerKey) >= 0);\r
124                         };\r
125                 }\r
126                 \r
127                 /// <summary>\r
128                 /// パッケージ名で検索をする際のPredicateを返す \r
129                 /// </summary>\r
130                 /// <param name="name">\r
131                 /// パッケージ名\r
132                 /// </param>\r
133                 /// <returns>\r
134                 /// Predicate\r
135                 /// </returns>\r
136                 protected internal static Predicate<TPackage> GetPredicateForPackageName(string name)\r
137                 {\r
138                         return delegate(TPackage package) {\r
139                                 return package.Name == name;\r
140                         };\r
141                 }\r
142                 \r
143                 /// <summary>\r
144                 /// エントリで検索をする際のPredicateを返す \r
145                 /// </summary>\r
146                 /// <param name="entry">\r
147                 /// エントリ\r
148                 /// </param>\r
149                 /// <returns>\r
150                 /// Predicate\r
151                 /// </returns>\r
152                 protected internal static Predicate<TPackage> GetPredicateForEntry(Entry entry)\r
153                 {\r
154                         return entry.Match;\r
155                 }\r
156                 \r
157                 #endregion\r
158                                 \r
159                 /// <summary>\r
160                 /// パッケージを検索して、それにマッチしたパッケージをイテレータとして返す。\r
161                 /// </summary>\r
162                 /// <param name="predicate">検索条件のPredicate</param>\r
163                 /// <returns>マッチしたパッケージのイテレータ</returns>\r
164                 protected internal IEnumerable<TPackage> Search(Predicate<TPackage> predicate)\r
165                 {\r
166                         return packageArrayList.FindAll(predicate);\r
167                 }\r
168                 \r
169                 /// <summary>\r
170                 /// パッケージを検索して、それにマッチしたパッケージをイテレータとして返す。\r
171                 /// </summary>\r
172                 /// <param name="key">検索キー</param>\r
173                 /// <returns>マッチしたパッケージのイテレータ</returns>\r
174                 public IEnumerable<TPackage> Search(string key)\r
175                 {\r
176                         if (string.IsNullOrEmpty(key)) {\r
177                                 return packageArrayList.AsReadOnly();\r
178                         } else {\r
179                                 return Search(GetPredicateForSearch(key));\r
180                         }\r
181                 }\r
182                 \r
183                 /// <summary>\r
184                 /// 指定した名前に対応するパッケージを返す\r
185                 /// </summary>\r
186                 /// <param name="name">検索にかけるパッケージ名</param>\r
187                 public TPackage GetPackageForName(string name)\r
188                 {\r
189                         return packageArrayList.Find(GetPredicateForPackageName(name));\r
190                 }\r
191                 \r
192                 /// <summary>\r
193                 /// 指定した名前に対応するパッケージを返す\r
194                 /// </summary>\r
195                 /// <param name="name">検索にかけるパッケージ名</param>\r
196                 public IEnumerable<TPackage> GetPackagesForName(string name)\r
197                 {\r
198                         return packageArrayList.FindAll(GetPredicateForPackageName(name));\r
199                 }\r
200                 \r
201                 /// <summary>\r
202                 /// 名前・バージョンが対応するパッケージを返す\r
203                 /// </summary>\r
204                 /// <param name="name">検索にかけるパッケージ名</param>\r
205                 /// <param name="version">検索にかけるパッケージのバージョン</param>\r
206                 public TPackage GetPackageForPackage(string name, string version)\r
207                 {\r
208                         return GetPackageForEntry(new Entry(name, null, version));\r
209                 }\r
210                 \r
211                 /// <summary>\r
212                 /// パッケージ参照エントリが対応するパッケージを返す\r
213                 /// </summary>\r
214                 /// <param name="name">検索にかけるパッケージ参照エントリ</param>\r
215                 public TPackage GetPackageForEntry(Entry entry)\r
216                 {\r
217                         return packageArrayList.Find(GetPredicateForEntry(entry));\r
218                 }\r
219                 \r
220                 /// <summary>\r
221                 /// パッケージ参照エントリが対応するパッケージをすべて返す\r
222                 /// </summary>\r
223                 /// <param name="name">検索にかけるパッケージ参照エントリ</param>\r
224                 public IEnumerable<TPackage> GetPackagesForEntry(Entry entry)\r
225                 {\r
226                         return packageArrayList.FindAll(GetPredicateForEntry(entry));\r
227                 }\r
228                 \r
229                 #endregion\r
230                 \r
231                 /// <summary>\r
232                 /// パッケージリストの各PackageListNameを設定する\r
233                 /// </summary>\r
234                 /// <param name="pkgList">設定するパッケージが入っているパッケージリスト</param>\r
235                 public void FixPackageListName()\r
236                 {\r
237                         foreach (TPackage pkg in packageArrayList) {\r
238                                 pkg.PackageListName = this.Name;\r
239                         }\r
240                 }\r
241         }\r
242 }\r