OSDN Git Service

初回インポート
[jovsonz/Jovsonz.git] / src / main / java / jp / sourceforge / jovsonz / JsBoolean.java
1 /*
2  * JSON boolean value
3  *
4  * License : The MIT License
5  * Copyright(c) 2009 olyutorskii
6  */
7
8 package jp.sourceforge.jovsonz;
9
10 import java.io.IOException;
11
12 /**
13  * JSON BOOLEAN型Valueを表す。
14  * 真偽値を反映する。
15  * インスタンスは2つしか存在しえない。
16  * <h1>表記例</h1>
17  * <pre>
18  * true
19  * false
20  * </pre>
21  */
22 public final class JsBoolean
23         implements JsValue, Comparable<JsBoolean> {
24
25     /** 唯一の真値。 */
26     public static final JsBoolean TRUE  = new JsBoolean();
27     /** 唯一の偽値。 */
28     public static final JsBoolean FALSE = new JsBoolean();
29
30     /** 真の文字列表現。 */
31     public static final String TEXT_TRUE  = "true";
32     /** 偽の文字列表現。 */
33     public static final String TEXT_FALSE = "false";
34
35     /** 真のハッシュ値。 */
36     public static final int HASH_TRUE = Boolean.TRUE.hashCode();
37     /** 偽のハッシュ値。 */
38     public static final int HASH_FALSE = Boolean.FALSE.hashCode();
39
40     /**
41      * 隠しコンストラクタ。
42      * 2回しか呼ばれないはず。
43      */
44     private JsBoolean(){
45         super();
46         return;
47     }
48
49     /**
50      * JSON文字列ソースからBOOLEAN型Valueを読み込む。
51      * 別型の可能性のある先頭文字を読み込んだ場合、
52      * ソースに文字を読み戻した後nullが返される。
53      * @param source 文字列ソース
54      * @return BOOLEAN型Value。別型の可能性がある場合はnull。
55      * @throws IOException 入力エラー
56      * @throws JsParseException 不正トークンもしくは意図しない入力終了
57      */
58     static JsBoolean parseBoolean(JsonSource source)
59             throws IOException, JsParseException{
60         JsBoolean result = null;
61         boolean hasError = false;
62
63         char charHead = source.readOrDie();
64         switch(charHead){
65         case 't':
66             if(source.matchOrDie("rue")){
67                 result = JsBoolean.TRUE;
68             }else{
69                 hasError = true;
70             }
71             break;
72         case 'f':
73             if(source.matchOrDie("alse")){
74                 result = JsBoolean.FALSE;
75             }else{
76                 hasError = true;
77             }
78             break;
79         default:
80             source.unread(charHead);
81             break;
82         }
83
84         if(hasError){
85             throw new JsParseException(JsParseException.ERRMSG_INVALIDTOKEN,
86                                        source.getLineNumber() );
87         }
88
89         return result;
90     }
91
92     /**
93      * {@inheritDoc}
94      * 常に{@link JsTypes#BOOLEAN}を返す。
95      * @return {@inheritDoc}
96      */
97     @Override
98     public JsTypes getJsTypes(){
99         return JsTypes.BOOLEAN;
100     }
101
102     /**
103      * 各種構造の出現をビジターに通知する。
104      * この実装ではthisの出現のみを通知する。
105      * @param visitor {@inheritDoc}
106      * @throws JsVisitException {@inheritDoc}
107      */
108     @Override
109     public void traverse(ValueVisitor visitor)
110             throws JsVisitException{
111         visitor.visitValue(this);
112         return;
113     }
114
115     /**
116      * {@inheritDoc}
117      * ハッシュ値を返す。
118      * 真なら{@link #HASH_TRUE}、偽なら{@link #HASH_FALSE}を返す。
119      * @return {@inheritDoc}
120      */
121     @Override
122     public int hashCode(){
123         int result;
124         if(this == TRUE) result = HASH_TRUE;
125         else             result = HASH_FALSE;
126         return result;
127     }
128
129     /**
130      * {@inheritDoc}
131      * 等価判定を行う。
132      * @param obj {@inheritDoc}
133      * @return {@inheritDoc}
134      */
135     @Override
136     public boolean equals(Object obj){
137         if(this == obj) return true;
138         if(obj instanceof JsBoolean) return false;
139         return false;
140     }
141
142     /**
143      * {@inheritDoc}
144      * BOOLEAN型Valueを順序付ける。
145      * ({@link #TRUE}、{@link #FALSE})の順に順序付けられる。
146      * @param value {@inheritDoc}
147      * @return {@inheritDoc}
148      * @throws NullPointerException 引数がnull
149      */
150     @Override
151     public int compareTo(JsBoolean value) throws NullPointerException{
152         if(value == null) throw new NullPointerException();
153
154         int result;
155         if(this == value)     result =  0;
156         else if(this == TRUE) result = -1;
157         else                  result = +1;
158
159         return result;
160     }
161
162     /**
163      * boolean値を反映したBOOLEAN型Valueを返す。
164      * @param bool boolean値
165      * @return BOOLEAN型Value
166      */
167     public static JsBoolean valueOf(boolean bool){
168         if(bool) return TRUE;
169         return FALSE;
170     }
171
172     /**
173      * boolean値を返す。
174      * @return boolean値
175      */
176     public boolean booleanValue(){
177         if(this == TRUE) return true;
178         return false;
179     }
180
181     /**
182      * 真か判定する。
183      * @return 真ならtrue
184      */
185     public boolean isTrue(){
186         if(this == TRUE) return true;
187         return false;
188     }
189
190     /**
191      * 偽か判定する。
192      * @return 偽ならtrue
193      */
194     public boolean isFalse(){
195         if(this != TRUE) return true;
196         return false;
197     }
198
199     /**
200      * 文字列表現を返す。
201      * JSON表記の一部としての利用も可能。
202      * @return {@inheritDoc}
203      */
204     @Override
205     public String toString(){
206         if(this == TRUE) return TEXT_TRUE;
207         return TEXT_FALSE;
208     }
209
210 }