1 package charactermanaj.model;
\r
3 import java.sql.Timestamp;
\r
4 import java.util.AbstractCollection;
\r
5 import java.util.ArrayList;
\r
6 import java.util.Collection;
\r
7 import java.util.Collections;
\r
8 import java.util.HashMap;
\r
9 import java.util.Iterator;
\r
10 import java.util.Map;
\r
14 * パーツ識別子のかわりに、パーツキーを用いる.<br>
\r
15 * パーツキーは、CategoryIdがnullであることを許可している.<br>
\r
16 * カテゴリを省略し、パーツ名だけでパーツ管理情報を検索できるようにするためのもの.<br>
\r
20 public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey> {
\r
24 * パーツ識別子 {@link PartsIdentifier} とほぼ同等であるが、カテゴリがnullであることを許可している点が異なる.<br>
\r
28 public static final class PartsKey implements Comparable<PartsKey> {
\r
30 private final String partsName;
\r
32 private final String categoryId;
\r
34 public PartsKey(String partsName) {
\r
35 this(partsName, null);
\r
38 public PartsKey(String partsName, String categoryId) {
\r
39 if (partsName == null || partsName.length() == 0) {
\r
40 throw new IllegalArgumentException();
\r
42 if (categoryId != null && categoryId.trim().length() == 0) {
\r
45 this.partsName = partsName;
\r
46 this.categoryId = categoryId;
\r
49 public PartsKey(PartsIdentifier partsIdentifier) {
\r
50 if (partsIdentifier == null) {
\r
51 throw new IllegalArgumentException();
\r
53 this.partsName = partsIdentifier.getPartsName();
\r
54 this.categoryId = partsIdentifier.getPartsCategory().getCategoryId();
\r
57 public int compareTo(PartsKey o) {
\r
58 int ret = partsName.compareTo(o.partsName);
\r
60 if (categoryId == null || o.categoryId == null) {
\r
61 ret = (categoryId == o.categoryId) ? 0 : (categoryId == null ? -1 : 1);
\r
67 public String getCategoryId() {
\r
71 public String getPartsName() {
\r
76 public int hashCode() {
\r
77 return partsName.hashCode();
\r
81 public boolean equals(Object obj) {
\r
85 if (obj != null && obj instanceof PartsKey) {
\r
86 PartsKey o = (PartsKey) obj;
\r
87 if (partsName.equals(o.partsName)) {
\r
88 return categoryId == null ? (o.categoryId == null)
\r
89 : categoryId.equals(o.categoryId);
\r
97 * パーツごとのバージョンとダウンロードURL情報を保持するホルダークラス.<br>
\r
101 public static final class PartsVersionInfo {
\r
103 private double version;
\r
105 private String downloadURL;
\r
107 private Timestamp lastModified;
\r
109 public PartsVersionInfo() {
\r
113 public PartsVersionInfo(double version, String downloadURL) {
\r
114 this(version, downloadURL, null);
\r
117 public PartsVersionInfo(double version, String downloadURL,
\r
118 Timestamp lastModified) {
\r
119 this.version = version;
\r
120 this.downloadURL = downloadURL;
\r
121 this.lastModified = lastModified;
\r
124 public double getVersion() {
\r
128 public String getDownloadURL() {
\r
129 return downloadURL;
\r
132 public void setVersion(double version) {
\r
133 this.version = version;
\r
136 public void setDownloadURL(String downloadURL) {
\r
137 this.downloadURL = downloadURL;
\r
140 public Timestamp getLastModified() {
\r
141 return lastModified;
\r
144 public void setLastModified(Timestamp lastModified) {
\r
145 this.lastModified = lastModified;
\r
151 * パーツキーと、それに対する作者情報
\r
153 private HashMap<PartsKey, PartsAuthorInfo> partsAuthorInfoMap = new HashMap<PartsKey, PartsAuthorInfo>();
\r
156 * パーツキーと、それに対するローカライズ名
\r
158 private HashMap<PartsKey, String> partsLocalizedNameMap = new HashMap<PartsKey, String>();
\r
161 * パーツキーと、それに対するバージョン情報
\r
163 private HashMap<PartsKey, PartsVersionInfo> partsVersionInfoMap = new HashMap<PartsKey, PartsVersionInfo>();
\r
170 public void clear() {
\r
171 partsAuthorInfoMap.clear();
\r
172 partsLocalizedNameMap.clear();
\r
173 partsVersionInfoMap.clear();
\r
177 * パーツキーに結びつく、各種情報を登録する.<br>
\r
181 * @param localizedName
\r
182 * ローカライズ名(なければnull)
\r
183 * @param partsAuthorInfo
\r
185 * @param versionInfo
\r
186 * バージョン情報 (なければnull)
\r
188 public void putPartsInfo(PartsKey partsKey, String localizedName, PartsAuthorInfo partsAuthorInfo, PartsVersionInfo versionInfo) {
\r
189 if (partsKey == null) {
\r
190 throw new IllegalArgumentException();
\r
192 partsAuthorInfoMap.put(partsKey, partsAuthorInfo);
\r
193 partsLocalizedNameMap.put(partsKey, localizedName);
\r
194 partsVersionInfoMap.put(partsKey, versionInfo);
\r
198 * パーツキーを指定して該当する作者情報を取得する.<br>
\r
199 * 完全に一致する作者情報がない場合は、カテゴリを無視して、パーツキーのパーツ名(ID)の一致する、いずれかの作者情報を返す.<br>
\r
203 * @return 作者情報、完全に一致するものがなく、且つ、パーツ名(ID)に一致する情報もない場合はnull
\r
205 public PartsAuthorInfo getPartsAuthorInfo(PartsKey partsKey) {
\r
206 if (partsKey == null) {
\r
209 PartsAuthorInfo authorInfo = partsAuthorInfoMap.get(partsKey);
\r
210 if (authorInfo == null) {
\r
211 for (Map.Entry<PartsKey, PartsAuthorInfo> entry : partsAuthorInfoMap.entrySet()) {
\r
212 PartsKey key = entry.getKey();
\r
213 if (key.getPartsName().equals(partsKey.getPartsName())) {
\r
214 authorInfo = entry.getValue();
\r
223 * パーツキーと完全に一致する作者情報を取得する.<br>
\r
224 * 存在しない場合はnullを返す.<br>
\r
228 * @return 作者情報、もしくはnull
\r
230 public PartsAuthorInfo getPartsAuthorInfoStrict(PartsKey partsKey) {
\r
231 if (partsKey == null) {
\r
234 return partsAuthorInfoMap.get(partsKey);
\r
238 * パーツキーを指定して該当するバージョン情報を取得する.<br>
\r
239 * 完全に一致するバージョン情報がない場合は、カテゴリを無視して、パーツキーのパーツ名(ID)の一致する、いずれかのバージョン情報を返す.<br>
\r
243 * @return バージョン情報、完全に一致するものがなく、且つ、パーツ名(ID)に一致する情報もない場合はnull
\r
245 public PartsVersionInfo getVersion(PartsKey partsKey) {
\r
246 if (partsKey == null) {
\r
249 PartsVersionInfo versionInfo = partsVersionInfoMap.get(partsKey);
\r
250 if (versionInfo == null) {
\r
251 for (Map.Entry<PartsKey, PartsVersionInfo> entry : partsVersionInfoMap.entrySet()) {
\r
252 PartsKey key = entry.getKey();
\r
253 if (key.getPartsName().equals(partsKey.getPartsName())) {
\r
254 versionInfo = entry.getValue();
\r
259 return versionInfo;
\r
263 * パーツキーを指定して該当するローカライズ名を取得する.<br>
\r
264 * 完全に一致するバージョン情報がない場合は、カテゴリを無視して、パーツキーのパーツ名(ID)の一致する、いずれかのローカライズ名を返す.<br>
\r
268 * @return バージョン情報、完全に一致するものがなく、且つ、パーツ名(ID)に一致する情報もない場合はnull
\r
270 public String getLocalizedName(PartsKey partsKey) {
\r
271 if (partsKey == null) {
\r
274 String localizedName = partsLocalizedNameMap.get(partsKey);
\r
275 if (localizedName == null) {
\r
276 for (Map.Entry<PartsKey, String> entry : partsLocalizedNameMap.entrySet()) {
\r
277 PartsKey key = entry.getKey();
\r
278 if (key.getPartsName().equals(partsKey.getPartsName())) {
\r
279 localizedName = entry.getValue();
\r
284 return localizedName;
\r
288 * パーツキーと完全に一致するバージョン情報を取得する.<br>
\r
292 * @return パーツキーに完全に一致するバージョン情報、該当がなければnull
\r
294 public PartsVersionInfo getVersionStrict(PartsKey partsKey) {
\r
295 if (partsKey == null) {
\r
298 return partsVersionInfoMap.get(partsKey);
\r
302 * パーツキーと完全に一致するローカライズ名を取得する.<br>
\r
306 * @return パーツキーに完全に一致するローカライズ名、該当がなければnull
\r
308 public String getLocalizedNameStrict(PartsKey partsKey) {
\r
309 if (partsKey == null) {
\r
312 return partsLocalizedNameMap.get(partsKey);
\r
318 * @return 作者情報のコレクション
\r
320 public Collection<PartsAuthorInfo> getAuthorInfos() {
\r
321 HashMap<String, PartsAuthorInfo> authorInfos = new HashMap<String, PartsAuthorInfo>();
\r
322 for (PartsAuthorInfo authorInfo : partsAuthorInfoMap.values()) {
\r
323 if (authorInfo != null) {
\r
324 String author = authorInfo.getAuthor();
\r
325 if (author != null && author.length() > 0) {
\r
326 authorInfos.put(author, authorInfo);
\r
330 return authorInfos.values();
\r
334 * 指定した作者に該当する登録されているパーツキーの一覧を返す.<Br>
\r
338 * @return 作者に該当するパーツキー
\r
340 public Collection<PartsKey> getPartsKeysByAuthor(String author) {
\r
341 if (author == null) {
\r
342 return Collections.emptyList();
\r
344 ArrayList<PartsKey> partsKeys = new ArrayList<PartsKey>();
\r
345 for (Map.Entry<PartsKey, PartsAuthorInfo> entry : partsAuthorInfoMap.entrySet()) {
\r
346 PartsKey partsKey = entry.getKey();
\r
347 PartsAuthorInfo partsAuthorInfo = entry.getValue();
\r
348 if (partsAuthorInfo != null) {
\r
349 String author2 = partsAuthorInfo.getAuthor();
\r
350 if (author2 == null) {
\r
353 if (author2.equals(author)) {
\r
354 partsKeys.add(partsKey);
\r
362 public Iterator<PartsKey> iterator() {
\r
363 return partsAuthorInfoMap.keySet().iterator();
\r
367 public int size() {
\r
368 return partsAuthorInfoMap.size();
\r