2 * characters in village
\r
4 * License : The MIT License
\r
5 * Copyright(c) 2008 olyutorskii
\r
8 package jp.sourceforge.jindolf;
\r
10 import java.util.ArrayList;
\r
11 import java.util.Collections;
\r
12 import java.util.HashMap;
\r
13 import java.util.List;
\r
14 import java.util.Map;
\r
15 import java.util.RandomAccess;
\r
16 import java.util.regex.Matcher;
\r
17 import java.util.regex.Pattern;
\r
18 import javax.xml.parsers.DocumentBuilder;
\r
19 import jp.sourceforge.jindolf.corelib.PreDefAvatar;
\r
22 * Avatar またの名をキャラクター。
\r
24 public class Avatar implements Comparable<Avatar> {
\r
27 public static final Avatar AVATAR_GERD;
\r
29 private static final List<Avatar> AVATAR_LIST;
\r
30 private static final Map<String, Avatar> AVATAR_MAP;
\r
32 private static final Pattern AVATAR_PATTERN;
\r
35 List<PreDefAvatar> predefs;
\r
37 DocumentBuilder builder = XmlUtils.createDocumentBuilder();
\r
38 predefs = PreDefAvatar.buildPreDefAvatarList(builder);
\r
39 }catch(RuntimeException e){
\r
41 }catch(Exception e){
\r
42 throw new ExceptionInInitializerError(e);
\r
45 AVATAR_LIST = buildAvatarList(predefs);
\r
47 AVATAR_MAP = new HashMap<String, Avatar>();
\r
48 for(Avatar avatar : AVATAR_LIST){
\r
49 String fullName = avatar.getFullName();
\r
50 AVATAR_MAP.put(fullName, avatar);
\r
53 StringBuilder avatarGroupRegex = new StringBuilder();
\r
54 for(Avatar avatar : AVATAR_LIST){
\r
55 String fullName = avatar.getFullName();
\r
56 if(avatarGroupRegex.length() > 0){
\r
57 avatarGroupRegex.append('|');
\r
59 avatarGroupRegex.append('(')
\r
60 .append(Pattern.quote(fullName))
\r
63 AVATAR_PATTERN = Pattern.compile(avatarGroupRegex.toString());
\r
65 AVATAR_GERD = getPredefinedAvatar("楽天家 ゲルト");
\r
67 assert AVATAR_LIST instanceof RandomAccess;
\r
68 assert AVATAR_GERD != null;
\r
72 private final String name;
\r
73 private final String jobTitle;
\r
74 private final String fullName;
\r
75 private final int idNum;
\r
76 private final String identifier;
\r
77 private final int hashNum;
\r
83 * @param jobTitle 職業名
\r
85 * @param identifier 識別文字列
\r
87 private Avatar(String name,
\r
90 String identifier ){
\r
91 this.name = name.intern();
\r
92 this.jobTitle = jobTitle.intern();
\r
94 this.identifier = identifier.intern();
\r
96 this.fullName = (this.jobTitle + " " + this.name).intern();
\r
98 this.hashNum = this.fullName.hashCode() ^ this.idNum;
\r
105 * @param fullName フルネーム
\r
107 // TODO 当面は呼ばれないはず。Z国とか向け。
\r
108 public Avatar(String fullName){
\r
109 this.fullName = fullName.intern();
\r
112 String[] tokens = this.fullName.split("\\p{Blank}+", 2);
\r
113 if(tokens.length == 1){
\r
114 this.jobTitle = null;
\r
115 this.name = this.fullName;
\r
116 }else if(tokens.length == 2){
\r
117 this.jobTitle = tokens[0].intern();
\r
118 this.name = tokens[1].intern();
\r
120 this.jobTitle = null;
\r
125 this.identifier = "???".intern();
\r
127 this.hashNum = this.fullName.hashCode() ^ this.idNum;
\r
135 * @param predefs 定義済みAvatar元データ群
\r
136 * @return ソートされた定義済みAvatarのリスト
\r
138 private static List<Avatar> buildAvatarList(List<PreDefAvatar> predefs){
\r
139 List<Avatar> result = new ArrayList<Avatar>(predefs.size());
\r
141 for(PreDefAvatar preDefAvatar : predefs){
\r
142 String shortName = preDefAvatar.getShortName();
\r
143 String jobTitle = preDefAvatar.getJobTitle();
\r
144 int serialNo = preDefAvatar.getSerialNo();
\r
145 String avatarId = preDefAvatar.getAvatarId();
\r
146 Avatar avatar = new Avatar(shortName,
\r
150 result.add(avatar);
\r
153 Collections.sort(result);
\r
154 result = Collections.unmodifiableList(result);
\r
160 * 定義済みAvatar群のリストを返す。
\r
161 * @return Avatarのリスト
\r
163 public static List<Avatar> getPredefinedAvatarList(){
\r
164 return AVATAR_LIST;
\r
169 * @param fullName Avatarのフルネーム
\r
170 * @return Avatar。フルネームが一致するAvatarが無ければnull
\r
172 // TODO 20キャラ程度ならListをなめる方が早いか?
\r
173 public static Avatar getPredefinedAvatar(String fullName){
\r
174 return AVATAR_MAP.get(fullName);
\r
179 * @param fullName Avatarのフルネーム
\r
180 * @return Avatar。フルネームが一致するAvatarが無ければnull
\r
182 public static Avatar getPredefinedAvatar(CharSequence fullName){
\r
183 for(Avatar avatar : AVATAR_LIST){
\r
184 String avatarName = avatar.getFullName();
\r
185 if(avatarName.contentEquals(fullName)){
\r
193 * 定義済みAvatar名に一致しないか調べる。
\r
194 * @param matcher マッチャ
\r
195 * @return 一致したAvatar。一致しなければnull。
\r
197 public static Avatar lookingAtAvatar(Matcher matcher){
\r
198 matcher.usePattern(AVATAR_PATTERN);
\r
200 if( ! matcher.lookingAt() ) return null;
\r
201 int groupCt = matcher.groupCount();
\r
202 for(int group = 1; group <= groupCt; group++){
\r
203 if(matcher.start(group) >= 0){
\r
204 Avatar avatar = AVATAR_LIST.get(group - 1);
\r
216 public String getFullName(){
\r
217 return this.fullName;
\r
224 public String getJobTitle(){
\r
225 return this.jobTitle;
\r
232 public String getName(){
\r
240 public int getIdNum(){
\r
248 public String getIdentifier(){
\r
249 return this.identifier;
\r
254 * @param obj {@inheritDoc}
\r
255 * @return {@inheritDoc}
\r
258 public boolean equals(Object obj){
\r
263 if( ! (obj instanceof Avatar) ){
\r
266 Avatar other = (Avatar) obj;
\r
268 boolean nameMatch = this.fullName.equals(other.fullName);
\r
269 boolean idMatch = this.idNum == other.idNum;
\r
271 if(nameMatch && idMatch) return true;
\r
278 * @return {@inheritDoc}
\r
281 public int hashCode(){
\r
282 return this.hashNum;
\r
286 public String toString(){
\r
287 return getFullName();
\r
293 * @param avatar {@inheritDoc}
\r
294 * @return {@inheritDoc}
\r
297 public int compareTo(Avatar avatar){
\r
298 if(avatar == null) return +1;
\r
299 return this.idNum - avatar.idNum;
\r