OSDN Git Service

607cfd75ce608d0df8670a7a2b71c647be9e993d
[jindolf/JinArchiver.git] / src / main / java / jp / sourceforge / jindolf / archiver / PeriodData.java
1 /*\r
2  * period model\r
3  *\r
4  * Copyright(c) 2008 olyutorskii\r
5  */\r
6 \r
7 package jp.sourceforge.jindolf.archiver;\r
8 \r
9 import java.io.IOException;\r
10 import java.io.Writer;\r
11 import java.net.URI;\r
12 import java.util.LinkedList;\r
13 import java.util.List;\r
14 import jp.sourceforge.jindolf.corelib.DisclosureType;\r
15 import jp.sourceforge.jindolf.corelib.SysEventType;\r
16 import jp.sourceforge.jindolf.parser.DecodedContent;\r
17 \r
18 /**\r
19  * Periodモデル。\r
20  */\r
21 public class PeriodData{\r
22 \r
23     private final VillageData parent;\r
24     private final PeriodResource resource;\r
25     private DecodedContent loginName = new DecodedContent("");\r
26     private int commitMonth;\r
27     private int commitDay;\r
28     private int commitHour;\r
29     private int commitMinute;\r
30     private DisclosureType disclosureType = DisclosureType.HOT;\r
31     private boolean hasMurderResult = false;\r
32 \r
33     private final List<TopicData> topicList = new LinkedList<TopicData>();\r
34 \r
35     /**\r
36      * コンストラクタ。\r
37      * @param parent 所属村\r
38      * @param resource ロード元情報\r
39      */\r
40     public PeriodData(VillageData parent, PeriodResource resource){\r
41         super();\r
42         this.parent = parent;\r
43         this.resource = resource;\r
44         return;\r
45     }\r
46 \r
47     /**\r
48      * ロード時のログイン名を取得する。\r
49      * @return ログイン名\r
50      */\r
51     public DecodedContent getLoginName(){\r
52         return this.loginName;\r
53     }\r
54 \r
55     /**\r
56      * ロード時のログイン名を設定する。\r
57      * @param loginName ログイン名\r
58      */\r
59     public void setLoginName(DecodedContent loginName){\r
60         this.loginName = loginName;\r
61         return;\r
62     }\r
63 \r
64     /**\r
65      * コミット月を取得する。\r
66      * @return コミット月\r
67      */\r
68     public int getCommitMonth(){\r
69         return this.commitMonth;\r
70     }\r
71 \r
72     /**\r
73      * コミット月を設定する。\r
74      * @param commitMonth コミット月\r
75      */\r
76     public void setCommitMonth(int commitMonth){\r
77         this.commitMonth = commitMonth;\r
78         return;\r
79     }\r
80 \r
81     /**\r
82      * コミット日を取得する。\r
83      * @return コミット日\r
84      */\r
85     public int getCommitDay(){\r
86         return this.commitDay;\r
87     }\r
88 \r
89     /**\r
90      * コミット日を設定する。\r
91      * @param commitDay コミット日\r
92      */\r
93     public void setCommitDay(int commitDay){\r
94         this.commitDay = commitDay;\r
95         return;\r
96     }\r
97 \r
98     /**\r
99      * コミット時を取得する。\r
100      * @return コミット時\r
101      */\r
102     public int getCommitHour(){\r
103         return this.commitHour;\r
104     }\r
105 \r
106     /**\r
107      * コミット時を設定する。\r
108      * @param commitHour コミット時\r
109      */\r
110     public void setCommitHour(int commitHour){\r
111         this.commitHour = commitHour;\r
112         return;\r
113     }\r
114 \r
115     /**\r
116      * コミット分を取得する。\r
117      * @return コミット分\r
118      */\r
119     public int getCommitMinute(){\r
120         return this.commitMinute;\r
121     }\r
122 \r
123     /**\r
124      * コミット分を設定する。\r
125      * @param commitMinute コミット分\r
126      */\r
127     public void setCommitMinute(int commitMinute){\r
128         this.commitMinute = commitMinute;\r
129         return;\r
130     }\r
131 \r
132     /**\r
133      * 開示状況を取得する。\r
134      * @return 開示状況\r
135      */\r
136     public DisclosureType getDisclosureType(){\r
137         return this.disclosureType;\r
138     }\r
139 \r
140     /**\r
141      * 開示状況を設定する。\r
142      * @param type 開示状況\r
143      */\r
144     public void setDisclosureType(DisclosureType type){\r
145         this.disclosureType = type;\r
146         return;\r
147     }\r
148 \r
149     /**\r
150      * 襲撃結果イベントが既に格納されているか確認する。\r
151      * @return 襲撃結果があればtrue\r
152      */\r
153     public boolean hasMurderResult(){\r
154         return this.hasMurderResult;\r
155     }\r
156 \r
157     /**\r
158      * TopicDataを追加する。\r
159      * 襲撃結果の有無も判定される。\r
160      * @param topicData TopiData\r
161      */\r
162     public void addTopicData(TopicData topicData){\r
163         this.topicList.add(topicData);\r
164 \r
165         if(topicData instanceof EventData){\r
166             EventData event = (EventData) topicData;\r
167             SysEventType type = event.getEventType();\r
168             if(   type == SysEventType.MURDERED\r
169                || type == SysEventType.NOMURDER){\r
170                 this.hasMurderResult = true;\r
171             }\r
172         }\r
173 \r
174         return;\r
175     }\r
176 \r
177     /**\r
178      * period要素をXML出力する。\r
179      * @param writer 出力先\r
180      * @throws IOException 出力エラー\r
181      */\r
182     public void dumpXml(Writer writer) throws IOException{\r
183         writer.append("<period\n");\r
184 \r
185         String ptype;\r
186         switch(this.resource.getPeriodType()){\r
187         case PROLOGUE:\r
188             ptype = "prologue";\r
189             break;\r
190         case PROGRESS:\r
191             ptype = "progress";\r
192             break;\r
193         case EPILOGUE:\r
194             ptype = "epilogue";\r
195             break;\r
196         default:\r
197             throw new IllegalArgumentException();\r
198         }\r
199 \r
200         XmlUtils.indent(writer, 1);\r
201         XmlUtils.attrOut(writer, "type", ptype);\r
202 \r
203         writer.append(' ');\r
204         XmlUtils.attrOut(writer,\r
205                 "day", Integer.toString(this.resource.getDay()));\r
206         writer.append('\n');\r
207 \r
208         if(this.disclosureType != DisclosureType.COMPLETE){\r
209             XmlUtils.indent(writer, 1);\r
210             XmlUtils.attrOut(writer,\r
211                     "disclosure", this.disclosureType.getXmlName());\r
212             writer.append('\n');\r
213         }\r
214 \r
215         XmlUtils.indent(writer, 1);\r
216         XmlUtils.dateAttrOut(writer, "nextCommitDay",\r
217                              this.commitMonth, this.commitDay);\r
218 \r
219         writer.append(' ');\r
220         XmlUtils.timeAttrOut(writer,\r
221                              "commitTime",\r
222                              this.commitHour, this.commitMinute);\r
223         writer.append('\n');\r
224 \r
225         URI baseUri   = URI.create(this.parent.getBaseUri());\r
226         URI periodUri = URI.create(this.resource.getOrigUrlText());\r
227         URI relativeUri = baseUri.relativize(periodUri);\r
228         XmlUtils.indent(writer, 1);\r
229         XmlUtils.attrOut(writer, "sourceURI", relativeUri.toString());\r
230         writer.append('\n');\r
231 \r
232         long downTimeMs = this.resource.getDownTimeMs();\r
233         XmlUtils.indent(writer, 1);\r
234         XmlUtils.dateTimeAttr(writer, "loadedTime", downTimeMs);\r
235         writer.append('\n');\r
236 \r
237         if(this.loginName.length() > 0){\r
238             XmlUtils.indent(writer, 1);\r
239             XmlUtils.attrOut(writer, "loadedBy", this.loginName.toString());\r
240             writer.append('\n');\r
241         }\r
242 \r
243         writer.append(">\n\n");\r
244 \r
245         for(TopicData topic : this.topicList){\r
246             topic.dumpXml(writer);\r
247             writer.append('\n');\r
248             writer.flush();\r
249         }\r
250 \r
251         writer.append("</period>\n");\r
252 \r
253         return;\r
254     }\r
255 \r
256 }\r