OSDN Git Service

Complexity解決
[jindolf/JinCore.git] / src / main / java / jp / sourceforge / jindolf / corelib / PreDefAvatar.java
1 /*\r
2  * pre-defined avatar info\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2009 olyutorskii\r
6  */\r
7 \r
8 package jp.sourceforge.jindolf.corelib;\r
9 \r
10 import java.io.IOException;\r
11 import java.io.InputStream;\r
12 import java.util.ArrayList;\r
13 import java.util.Collections;\r
14 import java.util.List;\r
15 import javax.xml.parsers.DocumentBuilder;\r
16 import org.w3c.dom.Document;\r
17 import org.w3c.dom.Element;\r
18 import org.w3c.dom.Node;\r
19 import org.w3c.dom.NodeList;\r
20 import org.xml.sax.SAXException;\r
21 \r
22 /**\r
23  * プリセット済みAvatarに関する情報。\r
24  * F国運用の時点で20キャラクタ。\r
25  */\r
26 public final class PreDefAvatar{\r
27 \r
28     private final String avatarId;\r
29     private final String fullName;\r
30     private final String jobTitle;\r
31     private final String shortName;\r
32     private final int serialNo;\r
33 \r
34 \r
35     /**\r
36      * コンストラクタ。\r
37      * @param avatarId Avatar識別子\r
38      * @param fullName フルネーム\r
39      * @param jobTitle 職業名\r
40      * @param shortName 省略名\r
41      * @param serialNo 通し番号\r
42      */\r
43     private PreDefAvatar(String avatarId,\r
44                          String fullName,\r
45                          String jobTitle,\r
46                          String shortName,\r
47                          int serialNo ){\r
48         super();\r
49 \r
50         if(   avatarId  == null\r
51            || fullName  == null\r
52            || jobTitle  == null\r
53            || shortName == null ){\r
54             throw new NullPointerException();\r
55         }\r
56 \r
57         if(   avatarId.length() <= 0\r
58            || fullName.length() <= 0\r
59            || serialNo < 0 ){\r
60             throw new IllegalArgumentException();\r
61         }\r
62 \r
63         this.avatarId  = avatarId.intern();\r
64         this.fullName  = fullName.intern();\r
65         this.jobTitle  = jobTitle.intern();\r
66         this.shortName = shortName.intern();\r
67         this.serialNo  = serialNo;\r
68 \r
69         return;\r
70     }\r
71 \r
72 \r
73     /**\r
74      * プリセット済みAvatar一覧リストを生成する。\r
75      * @param builder DOMビルダ\r
76      * @return プリセット済みAvatar一覧リスト\r
77      * @throws IOException IOエラー\r
78      * @throws SAXException パースエラー\r
79      */\r
80     public static List<PreDefAvatar> buildPreDefAvatarList(\r
81             DocumentBuilder builder)\r
82             throws IOException,\r
83                    SAXException {\r
84         Element list = loadAvatarList(builder);\r
85         List<PreDefAvatar> result;\r
86         result = elemToAvatarList(list);\r
87         result = Collections.unmodifiableList(result);\r
88         return result;\r
89     }\r
90 \r
91     /**\r
92      * プリセットAvatarに関する定義をロードする。\r
93      * @see XmlResource#I_URL_AVATARDEF ロード対象となるXMLリソースのURL\r
94      * @param builder DOMビルダ\r
95      * @return Avatar定義情報のルート要素\r
96      * @throws IOException IOエラー\r
97      * @throws SAXException パースエラー\r
98      */\r
99     private static Element loadAvatarList(DocumentBuilder builder)\r
100             throws IOException,\r
101                    SAXException {\r
102         InputStream istream = XmlResource.I_URL_AVATARDEF.openStream();\r
103         Document document;\r
104         try{\r
105             document = builder.parse(istream);\r
106         }finally{\r
107             istream.close();\r
108         }\r
109 \r
110         Element root = document.getDocumentElement();\r
111         String tagName = root.getTagName();\r
112         if( ! "preDefinedAvatarList".equals(tagName) ){\r
113             throw new SAXException("illegal root " + tagName);\r
114         }\r
115 \r
116         return root;\r
117     }\r
118 \r
119     /**\r
120      * 要素内部を探索し、プリセットAvatarを登録する。\r
121      * @param list ルート要素\r
122      * @return プリセットAvatarが登録されたList\r
123      * @throws SAXException パースエラー\r
124      */\r
125     private static List<PreDefAvatar> elemToAvatarList(Element list)\r
126             throws SAXException {\r
127         NodeList elems = list.getElementsByTagName("preDefinedAvatar");\r
128         int avatarNum = elems.getLength();\r
129         if(avatarNum <= 0){\r
130             throw new SAXException("there is no <preDefinedAvatar>");\r
131         }\r
132         List<PreDefAvatar> avatarList =\r
133                 new ArrayList<PreDefAvatar>(avatarNum);\r
134 \r
135         for(int index = 0; index < avatarNum; index++){\r
136             Node node = elems.item(index);\r
137             Element elem = (Element) node;\r
138             PreDefAvatar avatar = buildAvatar(elem);\r
139             avatarList.add(avatar);\r
140         }\r
141 \r
142         return avatarList;\r
143     }\r
144 \r
145     /**\r
146      * 個々のプリセットAvatar定義をオブジェクトに変換する。\r
147      * @param avatarDef プリセットAvatar定義要素\r
148      * @return プリセットAvatar定義オブジェクト\r
149      * @throws SAXException パースエラー\r
150      */\r
151     private static PreDefAvatar buildAvatar(Element avatarDef)\r
152             throws SAXException {\r
153         String avatarId  = avatarDef.getAttribute("avatarId");\r
154         String jobTitle  = avatarDef.getAttribute("jobTitle");\r
155         String shortName = avatarDef.getAttribute("shortName");\r
156         String serialNum = avatarDef.getAttribute("serialNum");\r
157 \r
158         String fullName = jobTitle + "\u0020" + shortName;\r
159 \r
160         int serialNo;\r
161         try{\r
162             serialNo = Integer.parseInt(serialNum);\r
163         }catch(NumberFormatException e){\r
164             throw new SAXException("illegal number form", e);\r
165         }\r
166 \r
167         PreDefAvatar avatar = new PreDefAvatar(avatarId,\r
168                                                fullName,\r
169                                                jobTitle,\r
170                                                shortName,\r
171                                                serialNo );\r
172 \r
173         return avatar;\r
174     }\r
175 \r
176 \r
177     /**\r
178      * Avatar識別子を返す。\r
179      * @return Avatar識別子\r
180      */\r
181     public String getAvatarId(){\r
182         return this.avatarId;\r
183     }\r
184 \r
185     /**\r
186      * フルネームを返す。\r
187      * @return フルネーム\r
188      */\r
189     public String getFullName(){\r
190         return this.fullName;\r
191     }\r
192 \r
193     /**\r
194      * 職業名を返す。\r
195      * @return 職業名\r
196      */\r
197     public String getJobTitle(){\r
198         return this.jobTitle;\r
199     }\r
200 \r
201     /**\r
202      * 省略名を返す。\r
203      * @return 省略名\r
204      */\r
205     public String getShortName(){\r
206         return this.shortName;\r
207     }\r
208 \r
209     /**\r
210      * 通し番号を返す。\r
211      * @return 通し番号\r
212      */\r
213     public int getSerialNo(){\r
214         return this.serialNo;\r
215     }\r
216 \r
217 }\r