OSDN Git Service

クラスメンバ定義順統一
[jindolf/Jindolf.git] / src / main / java / jp / sourceforge / jindolf / json / JsArray.java
1 /*\r
2  * JSON array value\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2009 olyutorskii\r
6  */\r
7 \r
8 package jp.sourceforge.jindolf.json;\r
9 \r
10 import java.io.IOException;\r
11 import java.util.ArrayList;\r
12 import java.util.Collection;\r
13 import java.util.Collections;\r
14 import java.util.Iterator;\r
15 import java.util.List;\r
16 \r
17 /**\r
18  * JSON 配列Value。\r
19  */\r
20 public class JsArray\r
21         extends AbstractJsValue\r
22         implements Iterable<JsValue> {\r
23 \r
24     private final List<JsValue> valueList = new ArrayList<JsValue>();\r
25     private boolean changed = false;\r
26 \r
27 \r
28     /**\r
29      * コンストラクタ。\r
30      */\r
31     public JsArray(){\r
32         super();\r
33         return;\r
34     }\r
35 \r
36 \r
37     /**\r
38      * JSON Arrayを文字ストリームからパースする。\r
39      * @param reader 文字入力\r
40      * @return JSON Array。入力終了ならnull\r
41      * @throws IOException 入力エラー\r
42      * @throws JsParseException パースエラー\r
43      */\r
44     static JsArray parseArray(JsonReader reader)\r
45             throws IOException,\r
46                    JsParseException {\r
47         int chData;\r
48 \r
49         Json.skipWhiteSpace(reader);\r
50         chData = reader.read();\r
51         if(chData < '\u0000') return null;\r
52         if(chData != '[') throw new JsParseException();\r
53 \r
54         JsArray result = new JsArray();\r
55 \r
56         for(;;){\r
57             Json.skipWhiteSpace(reader);\r
58             chData = reader.read();\r
59             if(chData < '\u0000') throw new JsParseException();\r
60             if(chData == ']') break;\r
61 \r
62             if(result.size() <= 0){\r
63                 reader.unread(chData);\r
64             }else{\r
65                 if(chData != ',') throw new JsParseException();\r
66                 Json.skipWhiteSpace(reader);\r
67             }\r
68 \r
69             JsValue value = Json.parseValue(reader);\r
70             if(value == null){\r
71                 throw new JsParseException();\r
72             }\r
73 \r
74             result.add(value);\r
75         }\r
76 \r
77         return result;\r
78     }\r
79 \r
80 \r
81     /**\r
82      * JSON Valueを追加する。\r
83      * @param value JSON Value\r
84      */\r
85     public void add(JsValue value){\r
86         this.valueList.add(value);\r
87         this.changed = true;\r
88         return;\r
89     }\r
90 \r
91     /**\r
92      * 指定された位置のValueを返す。\r
93      * @param index 0で始まる位置\r
94      * @return Value\r
95      * @throws IndexOutOfBoundsException 不正な位置指定\r
96      */\r
97     public JsValue get(int index) throws IndexOutOfBoundsException{\r
98         return this.valueList.get(index);\r
99     }\r
100 \r
101     /**\r
102      * 空にする。\r
103      */\r
104     public void clear(){\r
105         if(this.valueList.size() > 0) this.changed = true;\r
106         this.valueList.clear();\r
107         return;\r
108     }\r
109 \r
110     /**\r
111      * JSON Valueを削除する。\r
112      * @param value JSON Value\r
113      * @return 既存のValueが削除されたならtrue\r
114      */\r
115     public boolean remove(JsValue value){\r
116         boolean removed = this.valueList.remove(value);\r
117         if(removed) this.changed = true;\r
118         return removed;\r
119     }\r
120 \r
121     /**\r
122      * Value総数を返す。\r
123      * @return 総数\r
124      */\r
125     public int size(){\r
126         return this.valueList.size();\r
127     }\r
128 \r
129     /**\r
130      * Valueにアクセスするための反復子を提供する。\r
131      * この反復子での削除作業はできない。\r
132      * @return 反復子イテレータ\r
133      */\r
134     public Iterator<JsValue> iterator(){\r
135         Collection<JsValue> unmodColl =\r
136                 Collections.unmodifiableCollection(this.valueList);\r
137         return unmodColl.iterator();\r
138     }\r
139 \r
140     /**\r
141      * {@inheritDoc}\r
142      * @return {@inheritDoc}\r
143      */\r
144     @Override\r
145     public int hashCode(){\r
146         return this.valueList.hashCode();\r
147     }\r
148 \r
149     /**\r
150      * {@inheritDoc}\r
151      * @param obj {@inheritDoc}\r
152      * @return {@inheritDoc}\r
153      */\r
154     @Override\r
155     public boolean equals(Object obj){\r
156         if(obj == null) return false;\r
157         if(this == obj) return true;\r
158 \r
159         if( ! (obj instanceof JsArray) ) return false;\r
160         JsArray array = (JsArray) obj;\r
161 \r
162         return this.valueList.equals(array.valueList);\r
163     }\r
164 \r
165     /**\r
166      * {@inheritDoc}\r
167      * @return {@inheritDoc}\r
168      */\r
169     @Override\r
170     public String toString(){\r
171         StringBuilder text = new StringBuilder();\r
172 \r
173         text.append("[");\r
174         boolean hasElem = false;\r
175         for(JsValue value : this.valueList){\r
176             if(hasElem) text.append(',');\r
177             text.append(value);\r
178             hasElem = true;\r
179         }\r
180         text.append("]");\r
181 \r
182         return text.toString();\r
183     }\r
184 \r
185     /**\r
186      * {@inheritDoc}\r
187      * @param visitor {@inheritDoc}\r
188      * @throws JsVisitException {@inheritDoc}\r
189      */\r
190     @Override\r
191     public void traverse(ValueVisitor visitor) throws JsVisitException{\r
192         visitor.visitValue(this);\r
193 \r
194         for(JsValue value : this.valueList){\r
195             value.traverse(visitor);\r
196         }\r
197 \r
198         visitor.visitCollectionClose(this);\r
199 \r
200         return;\r
201     }\r
202 \r
203     /**\r
204      * {@inheritDoc}\r
205      * @return {@inheritDoc}\r
206      */\r
207     @Override\r
208     public boolean hasChanged(){\r
209         if(this.changed) return true;\r
210 \r
211         for(JsValue value : this.valueList){\r
212             if(value.hasChanged()) return true;\r
213         }\r
214 \r
215         return false;\r
216     }\r
217 \r
218     /**\r
219      * {@inheritDoc}\r
220      */\r
221     @Override\r
222     public void setUnchanged(){\r
223         this.changed = false;\r
224 \r
225         for(JsValue value : this.valueList){\r
226             value.setUnchanged();\r
227         }\r
228 \r
229         return;\r
230     }\r
231 \r
232 }\r