OSDN Git Service

sanitize player URL.
[jindolf/JinArchiver.git] / src / main / java / jp / sourceforge / jindolf / archiver / EventData.java
1 /*
2  * system event
3  *
4  * License : The MIT License
5  * Copyright(c) 2008 olyutorskii
6  */
7
8 package jp.sourceforge.jindolf.archiver;
9
10 import java.io.IOException;
11 import java.util.LinkedList;
12 import java.util.List;
13 import jp.osdn.jindolf.parser.content.DecodedContent;
14 import jp.sourceforge.jindolf.corelib.GameRole;
15 import jp.sourceforge.jindolf.corelib.SysEventType;
16
17 /**
18  * システムイベント モデル。
19  */
20 public class EventData extends TopicData{
21
22     private SysEventType eventType = null;
23
24     private final List<AvatarData> avatarList = new LinkedList<>();
25     private final List<Integer> intList = new LinkedList<>();
26     private final List<GameRole> roleList = new LinkedList<>();
27     private final List<DecodedContent> strList =
28             new LinkedList<>();
29
30
31     /**
32      * コンストラクタ。
33      */
34     public EventData(){
35         super();
36         return;
37     }
38
39
40     /**
41      * イベント種別からXML要素名を取得する。
42      * @param type イベント種別
43      * @return 要素名
44      */
45     public static String getTagName(SysEventType type){
46         String tagName;
47
48         switch(type){
49         case STARTENTRY:   tagName = "startEntry";   break;
50         case ONSTAGE:      tagName = "onStage";      break;
51         case STARTMIRROR:  tagName = "startMirror";  break;
52         case OPENROLE:     tagName = "openRole";     break;
53         case MURDERED:     tagName = "murdered";     break;
54         case STARTASSAULT: tagName = "startAssault"; break;
55         case SURVIVOR:     tagName = "survivor";     break;
56         case COUNTING:     tagName = "counting";     break;
57         case NOMURDER:     tagName = "noMurder";     break;
58         case SUDDENDEATH:  tagName = "suddenDeath";  break;
59         case WINVILLAGE:   tagName = "winVillage";   break;
60         case WINWOLF:      tagName = "winWolf";      break;
61         case WINHAMSTER:   tagName = "winHamster";   break;
62         case PLAYERLIST:   tagName = "playerList";   break;
63         case PANIC:        tagName = "panic";        break;
64         case EXECUTION:    tagName = "execution";    break;
65         case VANISH:       tagName = "vanish";       break;
66         case CHECKOUT:     tagName = "checkout";     break;
67         case SHORTMEMBER:  tagName = "shortMember";  break;
68         case ASKENTRY:     tagName = "askEntry";     break;
69         case ASKCOMMIT:    tagName = "askCommit";    break;
70         case NOCOMMENT:    tagName = "noComment";    break;
71         case STAYEPILOGUE: tagName = "stayEpilogue"; break;
72         case GAMEOVER:     tagName = "gameOver";     break;
73         case GUARD:        tagName = "guard";        break;
74         case JUDGE:        tagName = "judge";        break;
75         case COUNTING2:    tagName = "counting2";    break;
76         case ASSAULT:      tagName = "assault";      break;
77         default: throw new IllegalArgumentException();
78         }
79
80         return tagName;
81     }
82
83     /**
84      * 役職からXMLシンボル名を取得する。
85      * @param role 役職
86      * @return XMLシンボル名
87      */
88     public static String getRoleAttrValue(GameRole role){
89         String roleName;
90
91         switch(role){
92         case INNOCENT: roleName = "innocent"; break;
93         case WOLF:     roleName = "wolf";     break;
94         case SEER:     roleName = "seer";     break;
95         case SHAMAN:   roleName = "shaman";   break;
96         case MADMAN:   roleName = "madman";   break;
97         case HUNTER:   roleName = "hunter";   break;
98         case FRATER:   roleName = "frater";   break;
99         case HAMSTER:  roleName = "hamster";  break;
100         default: throw new IllegalArgumentException();
101         }
102
103         return roleName;
104     }
105
106     /**
107      * avatarRef要素をXML出力する。
108      * @param writer 出力先
109      * @param avatar Avatar
110      * @throws IOException 出力エラー
111      */
112     public static void dumpAvatarRef(XmlOut writer, AvatarData avatar)
113             throws IOException{
114         writer.append("<avatarRef");
115         writer.sp();
116         writer.attrOut("avatarId", avatar.getAvatarId());
117         writer.append(" />");
118         writer.nl();
119         return;
120     }
121
122     /**
123      * システムイベント種別を取得する。
124      * @return システムイベント種別
125      */
126     public SysEventType getEventType(){
127         return this.eventType;
128     }
129
130     /**
131      * システムイベント種別を設定する。
132      * @param eventType システムイベント種別
133      */
134     public void setEventType(SysEventType eventType){
135         this.eventType = eventType;
136         return;
137     }
138
139     /**
140      * Avatar情報を追加する。
141      * @param avatarData Avatar情報
142      */
143     public void addAvatarData(AvatarData avatarData){
144         this.avatarList.add(avatarData);
145         return;
146     }
147
148     /**
149      * 整数情報を追加する。
150      * @param intVal 整数情報
151      */
152     public void addInteger(int intVal){
153         this.intList.add(intVal);
154         return;
155     }
156
157     /**
158      * 役職情報を追加する。
159      * @param role 役職情報
160      */
161     public void addGameRole(GameRole role){
162         this.roleList.add(role);
163         return;
164     }
165
166     /**
167      * 文字列情報を追加する。
168      * @param seq 文字列情報
169      */
170     public void addDecodedContent(DecodedContent seq){
171         this.strList.add(seq);
172         return;
173     }
174
175     /**
176      * ONSTAGE属性値をXML出力する。
177      * @param writer 出力先
178      * @throws IOException 出力エラー
179      */
180     public void dumpOnstageAttr(XmlOut writer) throws IOException{
181         int entryNo = this.intList.get(0);
182         AvatarData avatarData = this.avatarList.get(0);
183
184         writer.sp();
185         writer.attrOut("entryNo", Integer.toString(entryNo));
186         writer.sp();
187         writer.attrOut("avatarId", avatarData.getAvatarId());
188
189         return;
190     }
191
192     /**
193      * avatarId属性値をXML出力する。
194      * @param writer 出力先
195      * @throws IOException 出力エラー
196      */
197     public void dumpSingleAvatarAttr(XmlOut writer) throws IOException{
198         AvatarData avatarData = this.avatarList.get(0);
199
200         writer.sp();
201         writer.attrOut("avatarId", avatarData.getAvatarId());
202
203         return;
204     }
205
206     /**
207      * COUNTINGのvictim属性値をXML出力する。
208      * @param writer 出力先
209      * @throws IOException 出力エラー
210      */
211     public void dumpCountingAttr(XmlOut writer) throws IOException{
212         int total = this.avatarList.size();
213         if(total % 2 != 0){
214             AvatarData victim = this.avatarList.get(total - 1);
215             writer.sp();
216             writer.attrOut("victim", victim.getAvatarId());
217         }
218         return;
219     }
220
221     /**
222      * EXECUTIONのvictim属性値をXML出力する。
223      * @param writer 出力先
224      * @throws IOException 出力エラー
225      */
226     public void dumpExecutionAttr(XmlOut writer) throws IOException{
227         int totalAvatar = this.avatarList.size();
228         int totalVotes = this.intList.size();
229         if(totalAvatar != totalVotes){
230             AvatarData victim = this.avatarList.get(totalAvatar - 1);
231             writer.sp();
232             writer.attrOut("victim", victim.getAvatarId());
233         }
234         return;
235     }
236
237     /**
238      * ASKENTRY属性値をXML出力する。
239      * @param writer 出力先
240      * @throws IOException 出力エラー
241      */
242     public void dumpAskEntryAttr(XmlOut writer) throws IOException{
243         int hour     = this.intList.get(0);
244         int minute   = this.intList.get(1);
245         int minLimit = this.intList.get(2);
246         int maxLimit = this.intList.get(3);
247
248         writer.sp();
249         writer.timeAttrOut("commitTime", hour, minute);
250
251         writer.sp();
252         writer.attrOut("minMembers", Integer.toString(minLimit));
253
254         writer.sp();
255         writer.attrOut("maxMembers", Integer.toString(maxLimit));
256
257         return;
258     }
259
260     /**
261      * ASKCOMMIT属性値をXML出力する。
262      * @param writer 出力先
263      * @throws IOException 出力エラー
264      */
265     public void dumpAskCommitAttr(XmlOut writer) throws IOException{
266         int hour     = this.intList.get(0);
267         int minute   = this.intList.get(1);
268
269         writer.sp();
270         writer.timeAttrOut("limitVote", hour, minute);
271
272         writer.sp();
273         writer.timeAttrOut("limitSpecial", hour, minute);
274
275         return;
276     }
277
278     /**
279      * STAYEPILOGUE属性値をXML出力する。
280      * @param writer 出力先
281      * @throws IOException 出力エラー
282      */
283     public void dumpStayEpilogueAttr(XmlOut writer) throws IOException{
284         GameRole role = this.roleList.get(0);
285         int hour   = this.intList.get(0);
286         int minute = this.intList.get(1);
287
288         String winner;
289         switch(role){
290         case INNOCENT: winner = "village"; break;
291         case WOLF:     winner = "wolf";    break;
292         case HAMSTER:  winner = "hamster"; break;
293         default: throw new IllegalArgumentException();
294         }
295         writer.sp();
296         writer.attrOut("maxMembers", winner);
297
298         writer.sp();
299         writer.timeAttrOut("limitTime", hour, minute);
300
301         return;
302     }
303
304     /**
305      * openRole子要素をXML出力する。
306      * @param writer 出力先
307      * @throws IOException 出力エラー
308      */
309     public void dumpOpenroleElem(XmlOut writer) throws IOException{
310         int num = this.roleList.size();
311         for(int index = 0; index < num; index++){
312             int heads = this.intList.get(index);
313             GameRole role = this.roleList.get(index);
314             String roleName = getRoleAttrValue(role);
315
316             writer.append("<roleHeads");
317             writer.sp();
318             writer.attrOut("role", roleName);
319             writer.sp();
320             writer.attrOut("heads", Integer.toString(heads));
321             writer.append(" />");
322             writer.nl();
323         }
324         return;
325     }
326
327     /**
328      * murdered子要素をXML出力する。
329      * @param writer 出力先
330      * @throws IOException 出力エラー
331      */
332     public void dumpMurderedElem(XmlOut writer) throws IOException{
333         for(AvatarData avatar : this.avatarList){
334             dumpAvatarRef(writer, avatar);
335         }
336         return;
337     }
338
339     /**
340      * survivor子要素をXML出力する。
341      * @param writer 出力先
342      * @throws IOException 出力エラー
343      */
344     public void dumpSurvivorElem(XmlOut writer) throws IOException{
345         for(AvatarData avatar : this.avatarList){
346             dumpAvatarRef(writer, avatar);
347         }
348         return;
349     }
350
351     /**
352      * nocomment子要素をXML出力する。
353      * @param writer 出力先
354      * @throws IOException 出力エラー
355      */
356     public void dumpNoCommentElem(XmlOut writer) throws IOException{
357         for(AvatarData avatar : this.avatarList){
358             dumpAvatarRef(writer, avatar);
359         }
360         return;
361     }
362
363     /**
364      * counting子要素をXML出力する。
365      * @param writer 出力先
366      * @throws IOException 出力エラー
367      */
368     public void dumpCountingElem(XmlOut writer) throws IOException{
369         int total = this.avatarList.size();
370         total = total / 2 * 2;
371         for(int index = 0; index < total; index += 2){
372             AvatarData voteBy = this.avatarList.get(index);
373             AvatarData voteTo = this.avatarList.get(index + 1);
374             writer.append("<vote");
375             writer.sp();
376             writer.attrOut("byWhom", voteBy.getAvatarId());
377             writer.sp();
378             writer.attrOut("target", voteTo.getAvatarId());
379             writer.append(" />");
380             writer.nl();
381         }
382         return;
383     }
384
385     /**
386      * execution子要素をXML出力する。
387      * @param writer 出力先
388      * @throws IOException 出力エラー
389      */
390     public void dumpExecutionElem(XmlOut writer) throws IOException{
391         int total = this.intList.size();
392         for(int index = 0; index < total; index++){
393             AvatarData voteTo = this.avatarList.get(index);
394             int count = this.intList.get(index);
395             writer.append("<nominated");
396             writer.sp();
397             writer.attrOut("avatarId", voteTo.getAvatarId());
398             writer.sp();
399             writer.attrOut("count", "" + count);
400             writer.append(" />");
401             writer.nl();
402         }
403         return;
404     }
405
406     /**
407      * playerlist子要素をXML出力する。
408      * @param writer 出力先
409      * @throws IOException 出力エラー
410      */
411     public void dumpPlayerlistElem(XmlOut writer) throws IOException{
412         int num = this.avatarList.size();
413
414         for(int index = 0; index < num; index++){
415             AvatarData avatar = this.avatarList.get(index);
416             DecodedContent uri     = this.strList.get(index * 2);
417             DecodedContent account = this.strList.get(index * 2 + 1);
418             int isLiving = this.intList.get(index);
419             String survive;
420             if(isLiving == 0) survive = "false";
421             else              survive = "true";
422             GameRole role = this.roleList.get(index);
423             String roleName = getRoleAttrValue(role);
424
425             writer.append("<playerInfo");
426             writer.sp();
427             writer.attrOut("playerId", account.toString());
428             writer.sp();
429             writer.attrOut("avatarId", avatar.getAvatarId());
430             writer.sp();
431             writer.attrOut("survive", survive);
432             writer.sp();
433             writer.attrOut("role", roleName);
434
435             String uriStr = uri.toString();
436             uriStr = uriStr.replaceAll("^[\\s\\p{Cntrl}]+", "");
437             uriStr = uriStr.replaceAll("[\\s\\p{Cntrl}]+$", "");
438             uriStr = uriStr.replaceAll("[\\s]+", "\u0020");
439             if(uriStr.length() > 0){
440                 writer.sp();
441                 writer.attrOut("uri", uriStr);
442             }
443
444             writer.append(" />");
445             writer.nl();
446         }
447
448         return;
449     }
450
451     /**
452      * Avatar間関係の属性値をXML出力する。
453      * @param writer 出力先
454      * @throws IOException 出力エラー
455      */
456     public void dumpByWhomAttr(XmlOut writer) throws IOException{
457         AvatarData by = this.avatarList.get(0);
458         AvatarData to = this.avatarList.get(1);
459
460         writer.sp();
461         writer.attrOut("byWhom", by.getAvatarId());
462         writer.sp();
463         writer.attrOut("target", to.getAvatarId());
464
465         return;
466     }
467
468     /**
469      * ASSAULT属性値をXML出力する。
470      * @param writer 出力先
471      * @throws IOException 出力エラー
472      */
473     public void dumpAssaultAttr(XmlOut writer) throws IOException{
474         AvatarData by = this.avatarList.get(0);
475         AvatarData to = this.avatarList.get(1);
476
477         writer.nl();
478
479         writer.indent(1);
480         writer.attrOut("byWhom", by.getAvatarId());
481         writer.sp();
482         writer.attrOut("target", to.getAvatarId());
483         writer.nl();
484
485         DecodedContent xname = this.strList.get(0);
486         writer.indent(1);
487         writer.attrOut("xname", xname);
488
489         int hour = this.intList.get(0);
490         int minute = this.intList.get(1);
491         writer.sp();
492         writer.timeAttrOut("time", hour, minute);
493         writer.nl();
494
495         String icon = this.strList.get(1).toString();
496         if( ! icon.equals(by.getFaceIconUri()) ){
497             writer.indent(1);
498             writer.attrOut("faceIconURI", icon);
499             writer.nl();
500         }
501
502         return;
503     }
504
505     /**
506      * システムイベント各種要素のXML出力を行う。
507      * @param writer 出力先
508      * @throws IOException 出力エラー
509      */
510     @Override
511     public void dumpXml(XmlOut writer) throws IOException{
512         String tagName = getTagName(this.eventType);
513
514         writer.append("<");
515         writer.append(tagName);
516
517         boolean hasAttr = true;
518         switch(this.eventType){
519         case ONSTAGE:
520             dumpOnstageAttr(writer);
521             break;
522         case COUNTING:
523             dumpCountingAttr(writer);
524             break;
525         case EXECUTION:
526             dumpExecutionAttr(writer);
527             break;
528         case SUDDENDEATH:
529         case VANISH:
530         case CHECKOUT:
531             dumpSingleAvatarAttr(writer);
532             break;
533         case ASKENTRY:
534             dumpAskEntryAttr(writer);
535             break;
536         case ASKCOMMIT:
537             dumpAskCommitAttr(writer);
538             break;
539         case STAYEPILOGUE:
540             dumpStayEpilogueAttr(writer);
541             break;
542         case JUDGE:
543         case GUARD:
544             dumpByWhomAttr(writer);
545             break;
546         case ASSAULT:
547             dumpAssaultAttr(writer);
548             break;
549         default:
550             hasAttr = false;
551             break;
552         }
553
554         if(hasAttr) writer.sp();
555         writer.append(">");
556         writer.nl();
557
558         dumpLines(writer);
559
560         switch(this.eventType){
561         case OPENROLE:
562             dumpOpenroleElem(writer);
563             break;
564         case MURDERED:
565             dumpMurderedElem(writer);
566             break;
567         case SURVIVOR:
568             dumpSurvivorElem(writer);
569             break;
570         case COUNTING:
571         case COUNTING2:
572             dumpCountingElem(writer);
573             break;
574         case EXECUTION:
575             dumpExecutionElem(writer);
576             break;
577         case PLAYERLIST:
578             dumpPlayerlistElem(writer);
579             break;
580         case NOCOMMENT:
581             dumpNoCommentElem(writer);
582             break;
583         default:
584             break;
585         }
586
587         writer.append("</");
588         writer.append(tagName);
589         writer.append(">");
590         writer.nl();
591
592         return;
593     }
594
595 }