Jindolf 変更履歴
+3.206.5-SNAPSHOT (20XX-XX-XX)
+ ・JSON入出力処理を Jovsonz プロジェクトへ分離。
+
3.206.4 (2011-05-10)
・10億をこえる発言番号へのアンカー参照を抑止。(バグ報告#24477,#24946)
<scope>compile</scope>
</dependency>
+ <dependency>
+ <groupId>jp.sourceforge.jovsonz</groupId>
+ <artifactId>jovsonz</artifactId>
+ <version>1.101.2</version>
+ <scope>compile</scope>
+ </dependency>
+
</dependencies>
<repositories/>
import java.awt.Font;
import java.awt.font.FontRenderContext;
import java.io.File;
-import jp.sourceforge.jindolf.json.JsBoolean;
-import jp.sourceforge.jindolf.json.JsObject;
-import jp.sourceforge.jindolf.json.JsPair;
-import jp.sourceforge.jindolf.json.JsValue;
+import jp.sourceforge.jovsonz.JsBoolean;
+import jp.sourceforge.jovsonz.JsObject;
+import jp.sourceforge.jovsonz.JsPair;
+import jp.sourceforge.jovsonz.JsValue;
/**
* アプリケーションの各種設定。
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
-import jp.sourceforge.jindolf.json.JsParseException;
-import jp.sourceforge.jindolf.json.JsValue;
-import jp.sourceforge.jindolf.json.Json;
+import jp.sourceforge.jovsonz.JsComposition;
+import jp.sourceforge.jovsonz.JsParseException;
+import jp.sourceforge.jovsonz.JsVisitException;
+import jp.sourceforge.jovsonz.Json;
/**
* Jindolf設定格納ディレクトリに関するあれこれ。
* もしくはJSONファイルが存在しない、
* もしくは入力エラーがあればnull
*/
- public static JsValue loadJson(File file){
+ public static JsComposition loadJson(File file){
AppSetting setting = Jindolf.getAppSetting();
if( ! setting.useConfigPath() ) return null;
Reader reader = new InputStreamReader(istream, CHARSET_JSON);
- JsValue value;
+ JsComposition root;
try{
- value = Json.parseValue(reader);
+ root = Json.parseJson(reader);
}catch(IOException e){
Jindolf.logger().fatal(
"JSONファイル["
}
}
- return value;
+ return root;
}
/**
* 設定ディレクトリ上のJSONファイルに書き込む。
* @param file JSONファイルの相対パス
- * @param value JSON objectまたはarray
+ * @param root JSON objectまたはarray
* @return 正しくセーブが行われればtrue。
* 何らかの理由でセーブが完了できなければfalse
*/
- public static boolean saveJson(File file, JsValue value){
+ public static boolean saveJson(File file, JsComposition root){
AppSetting setting = Jindolf.getAppSetting();
if( ! setting.useConfigPath() ) return false;
File configPath = setting.getConfigPath();
Writer writer = new OutputStreamWriter(ostream, CHARSET_JSON);
try{
- Json.writeJsonTop(writer, value);
+ Json.dumpJson(writer, root);
+ }catch(JsVisitException e){
+ Jindolf.logger().fatal(
+ "JSONファイル["
+ + absFile.getPath()
+ + "]の出力処理で支障がありました。", e);
+ return false;
}catch(IOException e){
Jindolf.logger().fatal(
"JSONファイル["
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.text.JTextComponent;
-import jp.sourceforge.jindolf.json.JsArray;
-import jp.sourceforge.jindolf.json.JsObject;
-import jp.sourceforge.jindolf.json.JsValue;
+import jp.sourceforge.jovsonz.JsArray;
+import jp.sourceforge.jovsonz.JsObject;
+import jp.sourceforge.jovsonz.JsValue;
/**
* 検索パネルGUI。
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import java.text.CharacterIterator;
-import jp.sourceforge.jindolf.json.JsBoolean;
-import jp.sourceforge.jindolf.json.JsNumber;
-import jp.sourceforge.jindolf.json.JsObject;
-import jp.sourceforge.jindolf.json.JsPair;
-import jp.sourceforge.jindolf.json.JsString;
-import jp.sourceforge.jindolf.json.JsValue;
+import jp.sourceforge.jovsonz.JsBoolean;
+import jp.sourceforge.jovsonz.JsNumber;
+import jp.sourceforge.jovsonz.JsObject;
+import jp.sourceforge.jovsonz.JsPair;
+import jp.sourceforge.jovsonz.JsString;
+import jp.sourceforge.jovsonz.JsValue;
/**
* フォント描画に関する各種設定。
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.SocketAddress;
-import jp.sourceforge.jindolf.json.JsNumber;
-import jp.sourceforge.jindolf.json.JsObject;
-import jp.sourceforge.jindolf.json.JsPair;
-import jp.sourceforge.jindolf.json.JsString;
-import jp.sourceforge.jindolf.json.JsValue;
+import jp.sourceforge.jovsonz.JsNumber;
+import jp.sourceforge.jovsonz.JsObject;
+import jp.sourceforge.jovsonz.JsPair;
+import jp.sourceforge.jovsonz.JsString;
+import jp.sourceforge.jovsonz.JsValue;
/**
* プロクシ情報。
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
-import jp.sourceforge.jindolf.json.JsBoolean;
-import jp.sourceforge.jindolf.json.JsObject;
-import jp.sourceforge.jindolf.json.JsPair;
-import jp.sourceforge.jindolf.json.JsString;
-import jp.sourceforge.jindolf.json.JsValue;
+import jp.sourceforge.jovsonz.JsBoolean;
+import jp.sourceforge.jovsonz.JsObject;
+import jp.sourceforge.jovsonz.JsPair;
+import jp.sourceforge.jovsonz.JsString;
+import jp.sourceforge.jovsonz.JsValue;
/**
* 正規表現。
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.text.JTextComponent;
-import jp.sourceforge.jindolf.json.JsArray;
-import jp.sourceforge.jindolf.json.JsObject;
-import jp.sourceforge.jindolf.json.JsString;
-import jp.sourceforge.jindolf.json.JsValue;
+import jp.sourceforge.jovsonz.JsArray;
+import jp.sourceforge.jovsonz.JsObject;
+import jp.sourceforge.jovsonz.JsString;
+import jp.sourceforge.jovsonz.JsValue;
/**
* 発言エディットパネル。
+++ /dev/null
-/*
- * JSON abstract value
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-/**
- * JSON 各種Value共通実装。
- * 継承必須。
- */
-public class AbstractJsValue implements JsValue{
-
- /**
- * コンストラクタ。
- */
- protected AbstractJsValue(){
- super();
- return;
- }
-
- /**
- * {@inheritDoc}
- * @param visitor {@inheritDoc}
- * @throws JsVisitException {@inheritDoc}
- */
- @Override
- public void traverse(ValueVisitor visitor)
- throws JsVisitException{
- visitor.visitValue(this);
- return;
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public boolean hasChanged(){
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setUnchanged(){
- return;
- }
-
-}
+++ /dev/null
-/*
- * JSON array value
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * JSON 配列Value。
- */
-public class JsArray
- extends AbstractJsValue
- implements Iterable<JsValue> {
-
- private final List<JsValue> valueList = new ArrayList<JsValue>();
- private boolean changed = false;
-
-
- /**
- * コンストラクタ。
- */
- public JsArray(){
- super();
- return;
- }
-
-
- /**
- * JSON Arrayを文字ストリームからパースする。
- * @param reader 文字入力
- * @return JSON Array。入力終了ならnull
- * @throws IOException 入力エラー
- * @throws JsParseException パースエラー
- */
- static JsArray parseArray(JsonReader reader)
- throws IOException,
- JsParseException {
- int chData;
-
- Json.skipWhiteSpace(reader);
- chData = reader.read();
- if(chData < '\u0000') return null;
- if(chData != '[') throw new JsParseException();
-
- JsArray result = new JsArray();
-
- for(;;){
- Json.skipWhiteSpace(reader);
- chData = reader.read();
- if(chData < '\u0000') throw new JsParseException();
- if(chData == ']') break;
-
- if(result.size() <= 0){
- reader.unread(chData);
- }else{
- if(chData != ',') throw new JsParseException();
- Json.skipWhiteSpace(reader);
- }
-
- JsValue value = Json.parseValue(reader);
- if(value == null){
- throw new JsParseException();
- }
-
- result.add(value);
- }
-
- return result;
- }
-
-
- /**
- * JSON Valueを追加する。
- * @param value JSON Value
- */
- public void add(JsValue value){
- this.valueList.add(value);
- this.changed = true;
- return;
- }
-
- /**
- * 指定された位置のValueを返す。
- * @param index 0で始まる位置
- * @return Value
- * @throws IndexOutOfBoundsException 不正な位置指定
- */
- public JsValue get(int index) throws IndexOutOfBoundsException{
- return this.valueList.get(index);
- }
-
- /**
- * 空にする。
- */
- public void clear(){
- if(this.valueList.size() > 0) this.changed = true;
- this.valueList.clear();
- return;
- }
-
- /**
- * JSON Valueを削除する。
- * @param value JSON Value
- * @return 既存のValueが削除されたならtrue
- */
- public boolean remove(JsValue value){
- boolean removed = this.valueList.remove(value);
- if(removed) this.changed = true;
- return removed;
- }
-
- /**
- * Value総数を返す。
- * @return 総数
- */
- public int size(){
- return this.valueList.size();
- }
-
- /**
- * Valueにアクセスするための反復子を提供する。
- * この反復子での削除作業はできない。
- * @return 反復子イテレータ
- */
- public Iterator<JsValue> iterator(){
- Collection<JsValue> unmodColl =
- Collections.unmodifiableCollection(this.valueList);
- return unmodColl.iterator();
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public int hashCode(){
- return this.valueList.hashCode();
- }
-
- /**
- * {@inheritDoc}
- * @param obj {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public boolean equals(Object obj){
- if(obj == null) return false;
- if(this == obj) return true;
-
- if( ! (obj instanceof JsArray) ) return false;
- JsArray array = (JsArray) obj;
-
- return this.valueList.equals(array.valueList);
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public String toString(){
- StringBuilder text = new StringBuilder();
-
- text.append("[");
- boolean hasElem = false;
- for(JsValue value : this.valueList){
- if(hasElem) text.append(',');
- text.append(value);
- hasElem = true;
- }
- text.append("]");
-
- return text.toString();
- }
-
- /**
- * {@inheritDoc}
- * @param visitor {@inheritDoc}
- * @throws JsVisitException {@inheritDoc}
- */
- @Override
- public void traverse(ValueVisitor visitor) throws JsVisitException{
- visitor.visitValue(this);
-
- for(JsValue value : this.valueList){
- value.traverse(visitor);
- }
-
- visitor.visitCollectionClose(this);
-
- return;
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public boolean hasChanged(){
- if(this.changed) return true;
-
- for(JsValue value : this.valueList){
- if(value.hasChanged()) return true;
- }
-
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setUnchanged(){
- this.changed = false;
-
- for(JsValue value : this.valueList){
- value.setUnchanged();
- }
-
- return;
- }
-
-}
+++ /dev/null
-/*
- * JSON boolean value
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-/**
- * JSON 真偽Value。
- */
-public final class JsBoolean
- extends AbstractJsValue
- implements Comparable<JsBoolean> {
-
- /** 真。 */
- public static final JsBoolean TRUE = new JsBoolean();
- /** 偽。 */
- public static final JsBoolean FALSE = new JsBoolean();
-
-
- /**
- * コンストラクタ。
- * 2回しか呼ばれないはず。
- */
- private JsBoolean(){
- super();
- return;
- }
-
-
- /**
- * boolean値から真偽Valueを返す。
- * @param bool boolean値
- * @return TRUEかFALSE
- */
- public static JsBoolean valueOf(boolean bool){
- if(bool) return TRUE;
- return FALSE;
- }
-
- /**
- * boolean値を返す。
- * @return boolean値
- */
- public boolean booleanValue(){
- if(this == TRUE) return true;
- return false;
- }
-
- /**
- * 真か判定する。
- * @return 真ならtrue
- */
- public boolean isTrue(){
- if(this == TRUE) return true;
- return false;
- }
-
- /**
- * 偽か判定する。
- * @return 偽ならtrue
- */
- public boolean isFalse(){
- if(this == FALSE) return true;
- return false;
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public int hashCode(){
- if(this.isTrue()) return Boolean.TRUE.hashCode();
- return Boolean.FALSE.hashCode();
- }
-
- /**
- * {@inheritDoc}
- * @param obj {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public boolean equals(Object obj){
- if(obj == null) return false;
- if(this == obj) return true;
-
- if( ! (obj instanceof JsBoolean) ) return false;
-
- return false;
- }
-
- /**
- * {@inheritDoc}
- * @param value {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public int compareTo(JsBoolean value){
- if(value == null) throw new NullPointerException();
- if(this == value) return 0;
-
- if (this.isTrue() && value.isFalse()) return -1;
- else if(this.isFalse() && value.isTrue() ) return +1;
-
- return 0;
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public String toString(){
- if(this.isTrue()) return "true";
- return "false";
- }
-
-}
+++ /dev/null
-/*
- * JSON null value
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-/**
- * JSON Null Value。
- * その実体はシングルトン
- */
-public final class JsNull
- extends AbstractJsValue
- implements Comparable<JsNull> {
-
- /** ただ唯一のインスタンス。 */
- public static final JsNull NULL = new JsNull();
-
- /**
- * 隠しコンストラクタ。
- * 1回しか呼ばれないはず
- */
- private JsNull(){
- super();
- return;
- }
-
- /**
- * {@inheritDoc}
- * @param value {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public int compareTo(JsNull value){
- if(value == null) throw new NullPointerException();
- return 0;
- }
-
- /**
- * {@inheritDoc}
- * @param obj {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public boolean equals(Object obj){
- if( ! (obj instanceof JsNull) ) return false;
- if(obj != this) return false;
- return true;
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public int hashCode(){
- return 7777;
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public String toString(){
- return "null";
- }
-
-}
+++ /dev/null
-/*
- * JSON number value
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-/**
- * JSON 数値Value。
- * 10を基数としたjava.math.BigDecimalを実装ベースとする
- * IEEE754浮動小数ではない。
- */
-public class JsNumber
- extends AbstractJsValue
- implements Comparable<JsNumber> {
-
- private BigDecimal decimal;
-
-
- /**
- * コンストラクタ。
- * @param val 初期数値
- */
- public JsNumber(long val){
- this(BigDecimal.valueOf(val));
- return;
- }
-
- /**
- * コンストラクタ。
- * @param val 初期数値
- */
- public JsNumber(double val){
- this(BigDecimal.valueOf(val));
- return;
- }
-
- /**
- * コンストラクタ。
- * @param val 初期数値
- */
- public JsNumber(BigInteger val){
- this(new BigDecimal(val));
- return;
- }
-
- /**
- * コンストラクタ。
- * 書式はjava.math.BigDecinal#BigDecimal(String)に準ずる。
- * @param val 初期数値の文字列表記
- * @throws NumberFormatException 不正な数値表記
- */
- public JsNumber(CharSequence val) throws NumberFormatException{
- this(new BigDecimal(val.toString()));
- return;
- }
-
- /**
- * コンストラクタ。
- * @param val 初期数値
- * @throws NullPointerException 引数がnull
- */
- public JsNumber(BigDecimal val) throws NullPointerException{
- super();
- if(val == null) throw new NullPointerException();
- this.decimal = val;
- return;
- }
-
-
- /**
- * 文字ストリームから符号付きの数字並びを読み込む。
- * +符号は読み飛ばされる。
- * 冒頭の連続する0はそのまま読まれる。
- * @param reader 文字入力
- * @param app 出力先
- * @param allowZeroTrail 冒頭の2つ以上連続するゼロを許すならtrue
- * @return 引数と同じ出力先
- * @throws IOException 入出力エラー
- * @throws JsParseException パースエラーもしくは入力終了
- */
- private static Appendable appendDigitText(JsonReader reader,
- Appendable app,
- boolean allowZeroTrail)
- throws IOException, JsParseException{
- int chData;
-
- chData = reader.read();
- if (chData < '\u0000') throw new JsParseException();
- else if(chData == '-') app.append('-');
- else if(chData != '+') reader.unread(chData);
-
- boolean hasAppended = false;
- boolean zeroStarted = false;
- for(;;){
- chData = reader.read();
- if(chData < '\u0000') throw new JsParseException();
-
- if('0' <= chData && chData <= '9'){
- app.append((char)chData);
-
- if(zeroStarted && ! allowZeroTrail){
- throw new JsParseException();
- }
-
- if(chData == '0' && ! hasAppended ){
- zeroStarted = true;
- }
-
- hasAppended = true;
- }else{
- if( ! hasAppended ) throw new JsParseException();
- reader.unread(chData);
- break;
- }
- }
-
- return app;
- }
-
- /**
- * 文字ストリームから符号付きの数字並びを読み込む。
- * +符号はパースエラーとなる。
- * @param reader 文字入力
- * @param app 出力先
- * @return 引数と同じ出力先
- * @throws IOException 入出力エラー
- * @throws JsParseException パースエラーもしくは入力終了
- */
- private static Appendable appendIntegerPart(JsonReader reader,
- Appendable app )
- throws IOException, JsParseException{
- int chData;
-
- chData = reader.read();
- if(chData < '\u0000') throw new JsParseException();
- if(chData == '+') throw new JsParseException();
- reader.unread(chData);
-
- appendDigitText(reader, app, false);
-
- return app;
- }
-
- /**
- * 文字ストリームから「.」で始まる小数部を読み込む。
- * 小数部がなければなにもせずに戻る。
- * @param reader 文字入力
- * @param app 出力先
- * @return 引数と同じ出力先
- * @throws IOException 入出力エラー
- * @throws JsParseException パースエラーもしくは入力終了
- */
- private static Appendable appendFractionPart(JsonReader reader,
- Appendable app )
- throws IOException, JsParseException{
- int chData;
-
- chData = reader.read();
- if(chData < '\u0000') throw new JsParseException();
- if(chData != '.'){
- reader.unread(chData);
- return app;
- }
-
- app.append(".");
-
- boolean hasAppended = false;
- for(;;){
- chData = reader.read();
- if(chData < '\u0000') throw new JsParseException();
-
- if('0' <= chData && chData <= '9'){
- app.append((char)chData);
- hasAppended = true;
- }else{
- if( ! hasAppended ) throw new JsParseException();
- reader.unread(chData);
- break;
- }
- }
-
- return app;
- }
-
- /**
- * 文字ストリームから「e」もしくは「E」で始まる指数部を読み込む。
- * 指数部がなければなにもせずに戻る。
- * @param reader 文字入力
- * @param app 出力先
- * @return 引数と同じ出力先
- * @throws IOException 入出力エラー
- * @throws JsParseException パースエラーもしくは入力終了
- */
- private static Appendable appendExpPart(JsonReader reader,
- Appendable app )
- throws IOException, JsParseException{
- int chData;
-
- chData = reader.read();
- if(chData < '\u0000') throw new JsParseException();
- if(chData != 'e' && chData != 'E'){
- reader.unread(chData);
- return app;
- }
-
- app.append('E');
-
- appendDigitText(reader, app, true);
-
- return app;
- }
-
- /**
- * 文字ストリームからJSON数値Valueを読み込む。
- * @param reader 文字入力
- * @return 数値Value
- * @throws IOException 入力エラー
- * @throws JsParseException パースエラーもしくは入力終了
- */
- static JsNumber parseNumber(JsonReader reader)
- throws IOException, JsParseException{
- Json.skipWhiteSpace(reader);
-
- StringBuilder numText = new StringBuilder();
- appendIntegerPart (reader, numText);
- appendFractionPart(reader, numText);
- appendExpPart (reader, numText);
- JsNumber result = new JsNumber(numText);
-
- return result;
- }
-
- /**
- * BigDecimal型の数値を返す。
- * @return BigDecimal型数値
- */
- public BigDecimal getBigDecimal(){
- return this.decimal;
- }
-
- /**
- * int型の数値を返す。
- * @return int型数値
- */
- public int intValue(){
- return this.decimal.intValue();
- }
-
- /**
- * long型の数値を返す。
- * @return long型数値
- */
- public long longValue(){
- return this.decimal.longValue();
- }
-
- /**
- * float型の数値を返す。
- * @return float型数値
- */
- public float floatValue(){
- return this.decimal.floatValue();
- }
-
- /**
- * double型の数値を返す。
- * @return double型数値
- */
- public double doubleValue(){
- return this.decimal.doubleValue();
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public int hashCode(){
- return this.decimal.hashCode();
- }
-
- /**
- * {@inheritDoc}
- * 「1.2」と「0.12E+1」など、スケールの一致しない値は異なる値と見なされる。
- * @param obj {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public boolean equals(Object obj){
- if(obj == null) return false;
- if(this == obj) return true;
- if( ! (obj instanceof JsNumber) ) return false;
- JsNumber number = (JsNumber) obj;
- return this.decimal.equals(number.decimal);
- }
-
- /**
- * {@inheritDoc}
- * 「1.2」と「0.12E+1」など、スケールが異なっても値が同じであれば
- * 等しいと見なされる。
- * @param value {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public int compareTo(JsNumber value){
- if(this == value) return 0;
- return this.decimal.compareTo(value.decimal);
- }
-
- /**
- * {@inheritDoc}
- * java.math.BigDecimal#toString()に準ずる。
- * ※ JSON規格のパーサで解釈できるはず。
- * @return {@inheritDoc}
- */
- @Override
- public String toString(){
- return this.decimal.toString();
- }
-
-}
+++ /dev/null
-/*
- * JSON object value
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * JSON オブジェクト Value。
- */
-public class JsObject
- extends AbstractJsValue
- implements Iterable<JsPair> {
-
- private final Map<String, JsValue> valueMap =
- new TreeMap<String, JsValue>();
- private boolean changed = false;
-
-
- /**
- * コンストラクタ。
- */
- public JsObject(){
- super();
- return;
- }
-
-
- /**
- * JSON Objectを文字ストリームからパースする。
- * @param reader 文字入力
- * @return JSON Object。入力終了ならnull
- * @throws IOException 入力エラー
- * @throws JsParseException パースエラー
- */
- static JsObject parseObject(JsonReader reader)
- throws IOException, JsParseException{
- int chData;
-
- Json.skipWhiteSpace(reader);
- chData = reader.read();
- if(chData < '\u0000') return null;
- if(chData != '{') throw new JsParseException();
-
- JsObject result = new JsObject();
-
- for(;;){
- Json.skipWhiteSpace(reader);
- chData = reader.read();
- if(chData < '\u0000') throw new JsParseException();
- if(chData == '}') break;
-
- if(result.size() <= 0){
- reader.unread(chData);
- }else{
- if(chData != ',') throw new JsParseException();
- Json.skipWhiteSpace(reader);
- }
-
- JsString name = JsString.parseString(reader);
- if(name == null){
- throw new JsParseException();
- }
-
- Json.skipWhiteSpace(reader);
- chData = reader.read();
- if(chData < '\u0000') throw new JsParseException();
- if(chData != ':') throw new JsParseException();
- Json.skipWhiteSpace(reader);
-
- JsValue value = Json.parseValue(reader);
- if(value == null){
- throw new JsParseException();
- }
-
- result.putValue(name.toRawString(), value);
- }
-
- return result;
- }
-
-
- /**
- * 名前とValueからpairを登録する。
- * @param name 名前
- * @param value Value
- * @return 旧Value。同じ内容のpairがすでに存在していたらnull
- * @throws NullPointerException 引数のいずれかがnull
- */
- public JsValue putValue(String name, JsValue value)
- throws NullPointerException{
- if(name == null) throw new NullPointerException();
- if(value == null) throw new NullPointerException();
-
- JsValue oldValue = this.valueMap.get(name);
- if(value.equals(oldValue)) return null;
-
- JsValue old = this.valueMap.put(name, value);
- this.changed = true;
- return old;
- }
-
- /**
- * 名前からValueを取得する。
- * @param name 名前
- * @return 対応するValue。見つからなければnull
- */
- public JsValue getValue(String name){
- return this.valueMap.get(name);
- }
-
- /**
- * JSON pairを追加する。
- * @param pair JSON pair
- */
- public void putPair(JsPair pair){
- putValue(pair.getName(), pair.getValue());
- return;
- }
-
- /**
- * 名前からJSON pairを返す。
- * @param name 名前
- * @return JSON Pair。見つからなければnull
- */
- public JsPair getPair(String name){
- JsValue value = getValue(name);
- if(value == null) return null;
-
- return new JsPair(name, value);
- }
-
- /**
- * 空にする。
- */
- public void clear(){
- if(this.valueMap.size() > 0) this.changed = true;
- this.valueMap.clear();
- return;
- }
-
- /**
- * 指定した名前のpairを削除する。
- * @param name pairの名前
- * @return 消されたValue。該当するpairがなければnull
- */
- public JsValue remove(String name){
- JsValue old = this.valueMap.remove(name);
- if(old != null) this.changed = true;
- return old;
- }
-
- /**
- * 保持する全pairの名前の集合を返す。
- * @return すべての名前
- */
- public Set<String> nameSet(){
- return this.valueMap.keySet();
- }
-
- /**
- * pairのリストを返す。
- * 格納順は名前順。
- * @return pairリスト
- */
- public List<JsPair> getPairList(){
- List<JsPair> result = new ArrayList<JsPair>();
-
- for(String name : nameSet()){
- JsPair pair = getPair(name);
- result.add(pair);
- }
-
- return result;
- }
-
- /**
- * pairにアクセスするための反復子を提供する。
- * この反復子での削除作業はできない。
- * @return 反復子イテレータ
- */
- public Iterator<JsPair> iterator(){
- return getPairList().iterator();
- }
-
- /**
- * pair総数を返す。
- * @return pair総数
- */
- public int size(){
- return this.valueMap.size();
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public int hashCode(){
- return this.valueMap.hashCode();
- }
-
- /**
- * {@inheritDoc}
- * @param obj {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public boolean equals(Object obj){
- if(obj == null) return false;
- if(this == obj) return true;
-
- if( ! (obj instanceof JsObject) ) return false;
- JsObject composit = (JsObject) obj;
-
- return this.valueMap.equals(composit.valueMap);
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public String toString(){
- StringBuilder text = new StringBuilder();
-
- text.append("{");
- boolean hasElem = false;
- for(JsPair pair : this){
- if(hasElem) text.append(',');
- try{
- JsString.writeText(text, pair.getName());
- }catch(IOException e){
- assert false;
- }
- text.append(':')
- .append(pair.getValue());
- hasElem = true;
- }
- text.append("}");
-
- return text.toString();
- }
-
- /**
- * {@inheritDoc}
- * @param visitor {@inheritDoc}
- * @throws JsVisitException {@inheritDoc}
- */
- @Override
- public void traverse(ValueVisitor visitor) throws JsVisitException{
- visitor.visitValue(this);
-
- for(JsPair pair : this){
- String name = pair.getName();
- JsValue value = pair.getValue();
- visitor.visitPairName(name);
- value.traverse(visitor);
- }
-
- visitor.visitCollectionClose(this);
-
- return;
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public boolean hasChanged(){
- if(this.changed) return true;
-
- for(JsValue value : this.valueMap.values()){
- if(value.hasChanged()) return true;
- }
-
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setUnchanged(){
- this.changed = false;
-
- for(JsValue value : this.valueMap.values()){
- value.setUnchanged();
- }
-
- return;
- }
-
-}
+++ /dev/null
-/*
- * JSON pair in object
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import java.io.IOException;
-
-/**
- * JSON オブジェクトValue内に列挙される、名前の付いたValueとの組。
- * 後での変更は不可能。
- */
-public class JsPair{
-
- private final String name;
- private final JsValue value;
-
- /**
- * コンストラクタ。
- * @param name 名前
- * @param value JSON Value
- * @throws NullPointerException 名前もしくはValueがnull
- */
- public JsPair(String name, JsValue value)
- throws NullPointerException{
- super();
-
- if(name == null || value == null) throw new NullPointerException();
-
- this.name = name;
- this.value = value;
-
- return;
- }
-
- /**
- * コンストラクタ。
- * @param name 名前
- * @param text 文字列
- * @throws NullPointerException 名前がnull
- */
- public JsPair(String name, CharSequence text)
- throws NullPointerException{
- this(name, (JsValue) new JsString(text) );
- return;
- }
-
- /**
- * コンストラクタ。
- * @param name 名前
- * @param bool 真偽
- * @throws NullPointerException 名前がnull
- */
- public JsPair(String name, boolean bool)
- throws NullPointerException{
- this(name, JsBoolean.valueOf(bool));
- return;
- }
-
- /**
- * コンストラクタ。
- * @param name 名前
- * @param number 数値
- * @throws NullPointerException 名前がnull
- */
- public JsPair(String name, long number)
- throws NullPointerException{
- this(name, new JsNumber(number));
- return;
- }
-
- /**
- * コンストラクタ。
- * @param name 名前
- * @param number 数値
- * @throws NullPointerException 名前がnull
- */
- public JsPair(String name, double number)
- throws NullPointerException{
- this(name, new JsNumber(number));
- return;
- }
-
- /**
- * 名前を返す。
- * @return 名前
- */
- public String getName(){
- return this.name;
- }
-
- /**
- * JSON Valueを返す。
- * @return JSON Value
- */
- public JsValue getValue(){
- return this.value;
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public String toString(){
- StringBuilder text = new StringBuilder();
-
- try{
- JsString.writeText(text, this.name);
- }catch(IOException e){
- assert false; // NEVER!
- }
-
- text.append(':')
- .append(this.value);
-
- return text.toString();
- }
-
-}
+++ /dev/null
-/*
- * JSON parse error information
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-/**
- * JSON パースの異常系情報。
- */
-@SuppressWarnings("serial")
-public class JsParseException extends Exception{
-
- /**
- * コンストラクタ。
- */
- public JsParseException(){
- super();
- return;
- }
-
- /**
- * コンストラクタ。
- * @param th 原因となった例外
- */
- public JsParseException(Throwable th){
- super(th);
- return;
- }
-
-}
+++ /dev/null
-/*
- * JSON string value
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import java.io.IOException;
-
-/**
- * JSON 文字列Value。
- */
-public class JsString
- extends AbstractJsValue
- implements CharSequence, Comparable<JsString> {
-
- private final String text;
-
-
- /**
- * コンストラクタ。
- * 空文字が設定される。
- */
- public JsString(){
- this(null);
- return;
- }
-
- /**
- * コンストラクタ。
- * 引数はJSON書式ではない。
- * @param seq 文字列。nullなら空文字が設定される。
- */
- public JsString(CharSequence seq){
- super();
- if(seq == null){
- this.text = "";
- }else{
- this.text = seq.toString();
- }
- return;
- }
-
-
- /**
- * FFFF形式4桁で16進エスケープされた文字列を読み、
- * 1文字にデコードする。
- * @param reader 文字入力
- * @return 文字
- * @throws IOException 入力エラー
- * @throws JsParseException パースエラーもしくは入力終了
- */
- static char parseHexChar(JsonReader reader)
- throws IOException, JsParseException{
- int hex1 = reader.read();
- int hex2 = reader.read();
- int hex3 = reader.read();
- int hex4 = reader.read();
- if(hex4 < '\u0000') throw new JsParseException();
-
- char hex1Ch = (char) hex1;
- char hex2Ch = (char) hex2;
- char hex3Ch = (char) hex3;
- char hex4Ch = (char) hex4;
-
- int digit1 = Character.digit(hex1Ch, 16);
- int digit2 = Character.digit(hex2Ch, 16);
- int digit3 = Character.digit(hex3Ch, 16);
- int digit4 = Character.digit(hex4Ch, 16);
-
- if(digit1 < 0) throw new JsParseException();
- if(digit2 < 0) throw new JsParseException();
- if(digit3 < 0) throw new JsParseException();
- if(digit4 < 0) throw new JsParseException();
-
- int digit = 0;
- digit += digit1;
- digit <<= 4;
- digit += digit2;
- digit <<= 4;
- digit += digit3;
- digit <<= 4;
- digit += digit4;
-
- char result = (char) digit;
-
- return result;
- }
-
- /**
- * ダブルクォーテーションで囲まれた文字列を読み込む。
- * @param reader 文字入力
- * @return 文字列Value
- * @throws IOException 入力エラー
- * @throws JsParseException パースエラーもしくは入力終了
- */
- static JsString parseString(JsonReader reader)
- throws IOException, JsParseException{
- int chData;
-
- Json.skipWhiteSpace(reader);
- chData = reader.read();
- if(chData < '\u0000') return null;
- if(chData != '"') throw new JsParseException();
-
- StringBuilder text = new StringBuilder();
-
- for(;;){
- chData = reader.read();
- if(chData < '\u0000') throw new JsParseException();
- if(chData == '"') break;
-
- if(chData == '\\'){
- chData = reader.read();
- if(chData < '\u0000') throw new JsParseException();
- if (chData == '"' ) text.append('"');
- else if(chData == '\\') text.append('\\');
- else if(chData == '/' ) text.append('/');
- else if(chData == 'b' ) text.append('\b');
- else if(chData == 'f' ) text.append('\f');
- else if(chData == 'n' ) text.append('\n');
- else if(chData == 'r' ) text.append('\r');
- else if(chData == 't' ) text.append('\t');
- else if(chData == 'u') text.append(parseHexChar(reader));
- else throw new JsParseException();
- }else{
- text.append((char)chData);
- }
- }
-
- JsString result = new JsString(text);
-
- return result;
- }
-
- /**
- * JSON 文字列Value形式で文字列を出力する。
- * @param appout 文字出力
- * @param seq 文字列
- * @throws IOException 出力エラー
- */
- public static void writeText(Appendable appout, CharSequence seq)
- throws IOException{
- appout.append('"');
-
- int length = seq.length();
- for(int pos = 0; pos < length; pos++){
- char ch = seq.charAt(pos);
-
- switch(ch){
- case '"' : appout.append('\\').append('"'); break;
- case '\\': appout.append('\\').append('\\'); break;
- case '/' : appout.append('\\').append('/'); break;
- case '\b': appout.append('\\').append('b'); break;
- case '\f': appout.append('\\').append('f'); break;
- case '\n': appout.append('\\').append('n'); break;
- case '\r': appout.append('\\').append('r'); break;
- case '\t': appout.append('\\').append('t'); break;
- default:
- if(Character.isISOControl(ch)){
- String hex = "0000" + Integer.toHexString(ch);
- hex = hex.substring(hex.length() - 4);
- appout.append("\\u").append(hex);
- }else{
- appout.append(ch);
- }
- break;
- }
- }
-
- appout.append('"');
-
- return;
- }
-
- /**
- * {@inheritDoc}
- * @param index {@inheritDoc}
- * @return {@inheritDoc}
- * @throws IndexOutOfBoundsException {@inheritDoc}
- */
- @Override
- public char charAt(int index)
- throws IndexOutOfBoundsException{
- return this.text.charAt(index);
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public int length(){
- return this.text.length();
- }
-
- /**
- * {@inheritDoc}
- * @param start {@inheritDoc}
- * @param end {@inheritDoc}
- * @return {@inheritDoc}
- * @throws IndexOutOfBoundsException {@inheritDoc}
- */
- @Override
- public CharSequence subSequence(int start, int end)
- throws IndexOutOfBoundsException{
- return this.text.subSequence(start, end);
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public int hashCode(){
- return this.text.hashCode();
- }
-
- /**
- * {@inheritDoc}
- * @param obj {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public boolean equals(Object obj){
- if(obj == null) return false;
- if(this == obj) return true;
-
- if( ! (obj instanceof JsString) ) return false;
- JsString string = (JsString) obj;
-
- return this.text.equals(string.text);
- }
-
- /**
- * {@inheritDoc}
- * @param value {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public int compareTo(JsString value){
- if(this == value) return 0;
- if(value == null) return +1;
- return this.text.compareTo(value.text);
- }
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public String toString(){
- StringBuilder string = new StringBuilder();
- try{
- writeText(string, this.text);
- }catch(IOException e){
- assert false;
- }
- return string.toString();
- }
-
- /**
- * クォーテーションされていない生の文字列を返す。
- * @return 生の文字列
- */
- public String toRawString(){
- return this.text;
- }
-
-}
+++ /dev/null
-/*
- * JSON value common interface
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-/**
- * JSON 各種Value共通インタフェース。
- */
-public interface JsValue{
-
- /**
- * 深さ優先探索を行い各種構造の出現をビジターに通知する。
- * @param visitor ビジター
- * @throws JsVisitException トラバース中断。
- */
- void traverse(ValueVisitor visitor) throws JsVisitException;
-
- /**
- * このValueおよび子孫に変更があったか判定する。
- * @return 変更があればtrue
- */
- boolean hasChanged();
-
- /**
- * このValueおよび子孫に変更がなかったことにする。
- */
- void setUnchanged();
-
-}
+++ /dev/null
-/*
- * JSON traverse error exception
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-/**
- * トラバース中断例外。
- */
-@SuppressWarnings("serial")
-public class JsVisitException extends Exception{
-
- /**
- * コンストラクタ。
- */
- public JsVisitException(){
- super();
- return;
- }
-
- /**
- * コンストラクタ。
- * @param th 原因となった例外
- */
- public JsVisitException(Throwable th){
- super(th);
- return;
- }
-
-}
+++ /dev/null
-/*
- * JSON utilities
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import java.io.IOException;
-import java.io.Reader;
-
-/**
- * JSON各種共通ユーティリティ。
- */
-public final class Json{
-
- /**
- * 隠しコンストラクタ。
- */
- private Json(){
- assert false;
- throw new AssertionError();
- }
-
-
- /**
- * JSON最上位構造から文字出力を開始する。
- * @param appout 出力先
- * @param value JSONのObjectかArray
- * @throws IOException 出力エラー
- * @throws IllegalArgumentException 出力対象がObjectでもArrayでもない。
- */
- public static void writeJsonTop(Appendable appout, JsValue value)
- throws IOException,
- IllegalArgumentException {
- if( ! (value instanceof JsObject) && ! (value instanceof JsArray) ){
- throw new IllegalArgumentException();
- }
-
- JsonAppender appender = new JsonAppender(appout);
-
- try{
- value.traverse(appender);
- }catch(JsVisitException e){
- Throwable cause = e.getCause();
- if(cause instanceof IOException){
- throw (IOException) cause;
- }else if(cause instanceof RuntimeException){
- throw (RuntimeException) cause;
- }else if(cause instanceof Error){
- throw (Error) cause;
- }else{
- assert false;
- return;
- }
- }
-
- appender.flush();
-
- return;
- }
-
- /**
- * JSON規格のwhitespace文字を判定する。
- * @param ch 判定対象文字
- * @return whitespaceならtrue
- */
- public static boolean isWhitespace(char ch){
- if(ch == '\t' ) return true;
- if(ch == '\r' ) return true;
- if(ch == '\n' ) return true;
- if(ch == '\u0020') return true;
- return false;
- }
-
- /**
- * whitespace文字を読み飛ばす。
- * @param reader 文字入力
- * @throws IOException 入力エラー
- */
- static void skipWhiteSpace(JsonReader reader)
- throws IOException{
- for(;;){
- int chData = reader.read();
- if(chData < '\u0000') break;
- if( ! isWhitespace((char)chData) ){
- reader.unread(chData);
- break;
- }
- }
- return;
- }
-
- /**
- * 各種定数(true,false,null)を文字ストリームから読み取る。
- * 長さ0の文字定数には無条件でfalseを返す。
- * @param reader 文字入力
- * @param text 文字定数
- * @return 文字定数が文字入力に現れればtrue。
- * 見つからないもしくはストリームの終わりに達したときはfalse
- * @throws IOException 入力エラー
- * @throws IllegalArgumentException 文字定数が長すぎる
- */
- static boolean parseConst(JsonReader reader,
- CharSequence text)
- throws IOException,
- IllegalArgumentException {
- int textLength = text.length();
- if(textLength <= 0) return false;
- if(textLength >= JsonReader.PUSHBACK_TOKENS){
- throw new IllegalArgumentException();
- }
-
- int[] backData = new int[textLength - 1];
- int readed = 0;
-
- for(;;){
- int chData = reader.read();
- if(chData != text.charAt(readed)){
- if(chData >= '\u0000') reader.unread(chData);
- for(int pos = readed - 1; pos >= 0; pos--){
- reader.unread(backData[pos]);
- }
- break;
- }
-
- if(readed >= backData.length) return true;
-
- backData[readed++] = chData;
- }
-
- return false;
- }
-
- /**
- * JSONの各種Valueを文字ストリームから読み取る。
- * @param reader 文字入力
- * @return 各種Value
- * @throws IOException 入力エラー
- * @throws JsParseException パースエラー
- */
- public static JsValue parseValue(Reader reader)
- throws IOException, JsParseException{
- JsonReader jsreader;
- if(reader instanceof JsonReader){
- jsreader = (JsonReader) reader;
- }else{
- jsreader = new JsonReader(reader);
- }
-
- return parseValue(jsreader);
- }
-
- /**
- * JSONの各種Valueを文字ストリームから読み取る。
- * @param reader 文字入力
- * @return 各種Value。ストリームの終わりに達したときはnull
- * @throws IOException 入力エラー
- * @throws JsParseException パースエラー
- */
- static JsValue parseValue(JsonReader reader)
- throws IOException, JsParseException{
- skipWhiteSpace(reader);
-
- if(parseConst(reader, JsNull.NULL.toString())){
- return JsNull.NULL;
- }else if(parseConst(reader, JsBoolean.TRUE.toString())){
- return JsBoolean.TRUE;
- }else if(parseConst(reader, JsBoolean.FALSE.toString())){
- return JsBoolean.FALSE;
- }
-
- int head = reader.read();
- if(head < '\u0000') return null;
-
- if( head == '-' || ('0' <= head && head <= '9') ){
- reader.unread(head);
- return JsNumber.parseNumber(reader);
- }else if(head == '{'){
- reader.unread(head);
- return JsObject.parseObject(reader);
- }else if(head == '['){
- reader.unread(head);
- return JsArray.parseArray(reader);
- }else if(head == '"'){
- reader.unread(head);
- return JsString.parseString(reader);
- }
-
- throw new JsParseException();
- }
-
-}
+++ /dev/null
-/*
- * JSON string output
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import java.io.Flushable;
-import java.io.IOException;
-import java.util.Stack;
-
-/**
- * JSON文字出力用ビジター。
- * JSON Valueのトラバース時にこのビジターを指定すると、
- * 事前に用意した文字出力先にJSONフォーマットで出力される
- */
-class JsonAppender
- implements ValueVisitor,
- Flushable {
-
- private static final String NEWLINE = "\n";
- private static final String INDENT_UNIT = "\u0020\u0020";
- private static final String HASH_SEPARATOR = "\u0020:\u0020";
- private static final String ELEM_DELIMITOR = "\u0020,";
-
-
- private final Appendable appout;
-
- private final Stack<JsValue> valueStack = new Stack<JsValue>();
- private final Stack<Boolean> hasChildStack = new Stack<Boolean>();
-
- private boolean afterPairName = false;
-
-
- /**
- * コンストラクタ。
- * @param appout 出力先
- */
- public JsonAppender(Appendable appout){
- super();
- this.appout = appout;
- return;
- }
-
- /**
- * 1文字出力。
- * @param ch 文字
- * @throws IOException 出力エラー
- */
- protected void append(char ch) throws IOException{
- this.appout.append(ch);
- return;
- }
-
- /**
- * 文字列出力。
- * @param seq 文字列
- * @throws IOException 出力エラー
- */
- protected void append(CharSequence seq) throws IOException{
- this.appout.append(seq);
- return;
- }
-
- /**
- * 最後の改行を出力した後、可能であれば出力先をフラッシュする。
- * @throws IOException 出力エラー
- */
- public void flush() throws IOException{
- putNewLine();
- if(this.appout instanceof Flushable){
- ((Flushable)this.appout).flush();
- }
- return;
- }
-
- /**
- * 改行を出力する。
- * @throws IOException 出力エラー
- */
- protected void putNewLine()
- throws IOException{
- append(NEWLINE);
- return;
- }
-
- /**
- * インデントを出力する。
- * @throws IOException 出力エラー
- */
- protected void indentOut() throws IOException{
- int level = stackLength();
- for(int ct = 1; ct <= level; ct++){
- append(INDENT_UNIT);
- }
- return;
- }
-
- /**
- * 要素間区切りコンマを出力する。
- * JSONでは最後の要素の後にコンマを出力してはいけない。
- * @throws IOException 出力エラー
- */
- protected void putElemDelimitor()
- throws IOException{
- append(ELEM_DELIMITOR);
- return;
- }
-
- /**
- * pairの名前を出力する。
- * @param name pair名
- * @throws IOException 出力エラー
- */
- protected void putPairName(String name)
- throws IOException{
- JsString.writeText(this.appout, name);
- return;
- }
-
- /**
- * pair区切りコロンを出力する。
- * @throws IOException 出力エラー
- */
- protected void putPairSeparator()
- throws IOException{
- append(HASH_SEPARATOR);
- return;
- }
-
- /**
- * 一段ネストする。
- * @param value JSON Value
- * @throws IllegalArgumentException 引数がObjectでもArrayでもなかった
- */
- protected void pushValue(JsValue value)
- throws IllegalArgumentException{
- if( ! (value instanceof JsObject) && ! (value instanceof JsArray) ){
- throw new IllegalArgumentException();
- }
-
- this.valueStack.push(value);
- this.hasChildStack.push(false);
-
- return;
- }
-
- /**
- * ネストを一段解除する。
- * @return 最後にネストしていたValue
- */
- protected JsValue popValue(){
- this.hasChildStack.pop();
- return this.valueStack.pop();
- }
-
- /**
- * ネストのスタック段数を返す。
- * @return 段数
- */
- protected int stackLength(){
- return this.valueStack.size();
- }
-
- /**
- * ネスト後、一つでも子要素が出力されたか判定する。
- * @return 子要素が出力されていればtrue
- */
- protected boolean hasChildOut(){
- if(stackLength() <= 0) return false;
- return this.hasChildStack.peek();
- }
-
- /**
- * 現時点でのネストに対し、子要素が一つ以上出力済みであると設定する。
- */
- protected void setChildOut(){
- if(stackLength() <= 0) return;
- this.hasChildStack.pop();
- this.hasChildStack.push(true);
- }
-
- /**
- * {@inheritDoc}
- * Valueの出力を行う。
- * @param value {@inheritDoc}
- * @throws JsVisitException {@inheritDoc}
- */
- @Override
- public void visitValue(JsValue value)
- throws JsVisitException{
- try{
- if( ! this.afterPairName ){
- if(hasChildOut()){
- putElemDelimitor();
- }
- putNewLine();
- indentOut();
- }
- this.afterPairName = false;
-
- setChildOut();
-
- if(value instanceof JsObject){
- append('{');
- pushValue(value);
- }else if(value instanceof JsArray){
- append('[');
- pushValue(value);
- }else{
- append(value.toString());
- }
- }catch(IOException e){
- throw new JsVisitException(e);
- }
-
- return;
- }
-
- /**
- * {@inheritDoc}
- * pairの名前を出力する。
- * @param name {@inheritDoc}
- * @throws JsVisitException {@inheritDoc}
- */
- @Override
- public void visitPairName(String name)
- throws JsVisitException{
- try{
- if(hasChildOut()){
- putElemDelimitor();
- }
- putNewLine();
- indentOut();
- putPairName(name);
- putPairSeparator();
- }catch(IOException e){
- throw new JsVisitException(e);
- }
-
- setChildOut();
- this.afterPairName = true;
-
- return;
- }
-
- /**
- * {@inheritDoc}
- * 閉じ括弧を出力する。
- * @param composite {@inheritDoc}
- * @throws JsVisitException {@inheritDoc}
- */
- @Override
- public void visitCollectionClose(JsValue composite)
- throws JsVisitException{
- boolean hasChild = hasChildOut();
-
- JsValue value = popValue();
-
- try{
- if(hasChild){
- putNewLine();
- indentOut();
- }else{
- append('\u0020');
- }
-
- if(value instanceof JsObject){
- append('}');
- }else if(value instanceof JsArray){
- append(']');
- }else{
- assert false;
- throw new JsVisitException();
- }
- }catch(IOException e){
- throw new JsVisitException(e);
- }
-
- return;
- }
-
-}
+++ /dev/null
-/*
- * JSON raeder
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import java.io.PushbackReader;
-import java.io.Reader;
-
-/**
- * JSONデータ用入力文字ストリーム。
- */
-class JsonReader extends PushbackReader{
-
- /** 入力ストリームに必要なプッシュバック文字数。 */
- public static final int PUSHBACK_TOKENS = 10;
-
- static{
- assert JsBoolean.TRUE .toString().length() < PUSHBACK_TOKENS;
- assert JsBoolean.FALSE.toString().length() < PUSHBACK_TOKENS;
- assert JsNull .NULL .toString().length() < PUSHBACK_TOKENS;
- assert "\\uXXXX" .length() < PUSHBACK_TOKENS;
- }
-
- /**
- * コンストラクタ。
- * @param reader 文字入力
- */
- public JsonReader(Reader reader){
- super(reader, PUSHBACK_TOKENS);
- return;
- }
-
- // TODO エラー報告用に行数、文字数をカウント
-}
+++ /dev/null
-/*
- * JSON value visitor
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-/**
- * Valueへのビジター共通インタフェース。
- */
-public interface ValueVisitor{
-
- /**
- * Value登場の通知を受け取る。
- * @param value JSON Value
- * @throws JsVisitException トラバース中止
- */
- void visitValue(JsValue value) throws JsVisitException;
-
- /**
- * pair名登場の通知を受け取る。
- * @param name pair名
- * @throws JsVisitException トラバース中止
- */
- void visitPairName(String name) throws JsVisitException;
-
- /**
- * 括弧終了の通知を受け取る。
- * @param composite JSON Object か JSON Array
- * @throws JsVisitException トラバース中止
- */
- void visitCollectionClose(JsValue composite) throws JsVisitException;
-
-}
+++ /dev/null
-/*
- * JSON Library パッケージコメント
- *
- * このファイルは、SunJDK5.0以降に含まれるJavadoc用に用意された、
- * 特別な名前を持つソースファイルです。
- * このファイルはソースコードを含まず、
- * パッケージコメントとパッケージ宣言のみが含まれます。
- *
- * License : The MIT License
- * Copyright(c) 2009 olyutorskii
- */
-
-/**
- * このライブラリは
- * JSON形式のデータファイルの読み書きを行うために作られました。
- *
- * <hr>
- *
- * <p>
- * The MIT License
- * </p>
- * <p>
- * Copyright(c) 2009 olyutorskii
- * </p>
- * <p>
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * </p>
- * <p>
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * </p>
- * <p>
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- * </p>
- *
- * <hr>
- *
- * @see <a href="http://json.org/json-ja.html">JSONの紹介</a>
- * @see <a href="http://www.ietf.org/rfc/rfc4627.txt">RFC4627</a>
- * @see <a href="http://ja.wikipedia.org/wiki/JavaScript_Object_Notation">
- * Wikipedia解説</a>
- */
-
-package jp.sourceforge.jindolf.json;
-
-/* EOF */
+++ /dev/null
-/*
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import java.io.StringReader;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- *
- */
-public class JsArrayTest {
-
- public JsArrayTest() {
- }
-
- @BeforeClass
- public static void setUpClass() throws Exception{
- }
-
- @AfterClass
- public static void tearDownClass() throws Exception{
- }
-
- @Before
- public void setUp() {
- }
-
- @After
- public void tearDown() {
- }
-
- /**
- * Test of parseArray method, of class JsArray.
- */
- @Test
- public void testParseArray() throws Exception{
- System.out.println("parseArray");
-
- JsonReader reader;
- JsArray array;
-
- reader = new JsonReader(new StringReader("[]"));
- array = JsArray.parseArray(reader);
- assertEquals(0, array.size());
-
- reader = new JsonReader(new StringReader("[true]"));
- array = JsArray.parseArray(reader);
- assertEquals(1, array.size());
- assertEquals(JsBoolean.TRUE, array.get(0));
-
- reader = new JsonReader(new StringReader("[true,false]"));
- array = JsArray.parseArray(reader);
- assertEquals(2, array.size());
- assertEquals(JsBoolean.TRUE, array.get(0));
- assertEquals(JsBoolean.FALSE, array.get(1));
-
- reader = new JsonReader(new StringReader("\n[\rtrue\t, false\n]\r"));
- array = JsArray.parseArray(reader);
- assertEquals(2, array.size());
- assertEquals(JsBoolean.TRUE, array.get(0));
- assertEquals(JsBoolean.FALSE, array.get(1));
-
- try{
- reader = new JsonReader(new StringReader("[,]"));
- array = JsArray.parseArray(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- try{
- reader = new JsonReader(new StringReader("[true,]"));
- array = JsArray.parseArray(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- try{
- reader = new JsonReader(new StringReader("[true"));
- array = JsArray.parseArray(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- try{
- reader = new JsonReader(new StringReader("true]"));
- array = JsArray.parseArray(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- return;
- }
-
- /**
- * Test of add method, of class JsArray.
- */
- @Test
- public void testAdd(){
- System.out.println("add");
-
- JsArray array = new JsArray();
-
- JsNumber number = new JsNumber("1.23");
- assertEquals(0, array.size());
- array.add(number);
- assertEquals(1, array.size());
- array.add(number);
- assertEquals(2, array.size());
-
- return;
- }
-
- /**
- * Test of get method, of class JsArray.
- */
- @Test
- public void testGet(){
- System.out.println("get");
-
- JsArray array = new JsArray();
-
- JsValue val1 = new JsNumber("1.23");
- JsValue val2 = new JsString("abc");
-
- array.add(val1);
- array.add(val2);
-
- assertEquals(val1, array.get(0));
- assertEquals(val2, array.get(1));
-
- try{
- array.get(2);
- fail();
- }catch(IndexOutOfBoundsException e){
- // NOTHING
- }
-
- return;
- }
-
- /**
- * Test of clear method, of class JsArray.
- */
- @Test
- public void testClear(){
- System.out.println("clear");
-
- JsArray array = new JsArray();
-
- JsValue val1 = new JsNumber("1.23");
- JsValue val2 = new JsString("abc");
-
- array.add(val1);
- array.add(val2);
- assertEquals(2, array.size());
-
- array.clear();
- assertEquals(0, array.size());
-
- try{
- array.get(0);
- fail();
- }catch(IndexOutOfBoundsException e){
- // NOTHING
- }
-
- return;
- }
-
- /**
- * Test of remove method, of class JsArray.
- */
- @Test
- public void testRemove(){
- System.out.println("remove");
-
- JsArray array = new JsArray();
-
- JsValue val1 = new JsNumber("1.23");
- JsValue val2 = new JsString("abc");
- JsValue val3 = JsBoolean.TRUE;
-
- array.add(val1);
- array.add(val2);
- assertEquals(2, array.size());
-
- assertTrue(array.remove(val1));
- assertEquals(1, array.size());
- assertEquals(val2, array.get(0));
-
- assertFalse(array.remove(val3));
- assertEquals(1, array.size());
-
- return;
- }
-
- /**
- * Test of size method, of class JsArray.
- */
- @Test
- public void testSize(){
- System.out.println("size");
-
- JsArray array = new JsArray();
- assertEquals(0, array.size());
-
- JsValue val1 = new JsNumber("1.23");
-
- array.add(val1);
- assertEquals(1, array.size());
-
- return;
- }
-
- /**
- * Test of iterator method, of class JsArray.
- */
- @Test
- public void testIterator(){
- System.out.println("iterator");
-
- JsArray array = new JsArray();
-
- JsValue val1 = new JsNumber("1.23");
- JsValue val2 = new JsString("abc");
-
- array.add(val1);
- array.add(val2);
-
- Iterator<JsValue> it = array.iterator();
-
- assertTrue(it.hasNext());
- assertEquals(val1, it.next());
-
- assertTrue(it.hasNext());
- assertEquals(val2, it.next());
-
- assertFalse(it.hasNext());
-
- return;
- }
-
- /**
- * Test of hashCode method, of class JsArray.
- */
- @Test
- public void testHashCode(){
- System.out.println("hashCode");
-
- JsArray array1 = new JsArray();
- JsArray array2 = new JsArray();
-
- assertEquals(array1.hashCode(), array2.hashCode());
-
- array1.add(new JsString("abc"));
- array2.add(new JsString("abc"));
-
- assertEquals(array1.hashCode(), array2.hashCode());
-
- return;
- }
-
- /**
- * Test of equals method, of class JsArray.
- */
- @Test
- public void testEquals(){
- System.out.println("equals");
-
- JsArray array1 = new JsArray();
- JsArray array2 = new JsArray();
-
- assertTrue(array1.equals(array2));
-
- array1.add(new JsString("abc"));
- array2.add(new JsString("abc"));
-
- assertTrue(array1.equals(array2));
-
- array1.add(new JsString("xyz"));
- array2.add(new JsString("XYZ"));
-
- assertFalse(array1.equals(array2));
-
- assertFalse(array1.equals(null));
-
- return;
- }
-
- /**
- * Test of toString method, of class JsArray.
- */
- @Test
- public void testToString(){
- System.out.println("toString");
-
- JsArray array = new JsArray();
-
- assertEquals("[]", array.toString());
-
- array.add(JsBoolean.TRUE);
- assertEquals("[true]", array.toString());
-
- array.add(JsBoolean.FALSE);
- assertEquals("[true,false]", array.toString());
-
- array.add(new JsArray());
- assertEquals("[true,false,[]]", array.toString());
-
- return;
- }
-
- /**
- * Test of traverse method, of class JsArray.
- */
- @Test
- public void testTraverse() throws Exception{
- System.out.println("traverse");
-
- JsArray array = new JsArray();
- JsValue val1 = new JsNumber("12");
- JsValue val2 = new JsString("AB");
- array.add(val1);
- array.add(val2);
-
- final List<Object> visited = new LinkedList<Object>();
-
- try{
- array.traverse(new ValueVisitor(){
- public void visitValue(JsValue value)
- throws JsVisitException{
- visited.add(value);
- return;
- }
-
- public void visitPairName(String name)
- throws JsVisitException{
- visited.add(name);
- return;
- }
-
- public void visitCollectionClose(JsValue composite)
- throws JsVisitException{
- visited.add(composite);
- return;
- }
- });
- }catch(JsVisitException e){
- fail();
- }
-
- assertEquals(4, visited.size());
- assertEquals(array, visited.get(0));
- assertEquals(val1, visited.get(1));
- assertEquals(val2, visited.get(2));
- assertEquals(array, visited.get(3));
-
- return;
- }
-
- /**
- * Test of hasChanged method, of class JsArray.
- */
- @Test
- public void testHasChanged(){
- System.out.println("hasChanged");
-
- JsArray array = new JsArray();
- assertFalse(array.hasChanged());
-
- array.add(new JsNumber("0"));
- assertTrue(array.hasChanged());
-
- array.setUnchanged();
- assertFalse(array.hasChanged());
-
- JsArray child = new JsArray();
- array.add(child);
- array.setUnchanged();
- assertFalse(array.hasChanged());
-
- child.add(JsNull.NULL);
- assertTrue(array.hasChanged());
- array.setUnchanged();
- assertFalse(array.hasChanged());
-
- return;
- }
-
- /**
- * Test of setUnchanged method, of class JsArray.
- */
- @Test
- public void testSetUnchanged(){
- System.out.println("setUnchanged");
-
- JsArray array = new JsArray();
- JsArray child = new JsArray();
- array.add(child);
-
- child.add(JsNull.NULL);
- assertTrue(child.hasChanged());
-
- array.setUnchanged();
- assertFalse(child.hasChanged());
-
- return;
- }
-
-}
+++ /dev/null
-/*
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import java.util.SortedSet;
-import java.util.TreeSet;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- *
- */
-public class JsBooleanTest {
-
- public JsBooleanTest() {
- }
-
- @BeforeClass
- public static void setUpClass() throws Exception{
- }
-
- @AfterClass
- public static void tearDownClass() throws Exception{
- }
-
- @Before
- public void setUp() {
- }
-
- @After
- public void tearDown() {
- }
-
- /**
- * Test of traverse method, of class JsBoolean.
- */
- @Test
- public void testTraverse(){
- System.out.println("traverse");
-
- try{
- JsBoolean.TRUE.traverse(new ValueVisitor(){
- int ct = 0;
-
- public void visitValue(JsValue value)
- throws JsVisitException{
- assertEquals(JsBoolean.TRUE, value);
- assertTrue(this.ct++ <= 0);
- }
-
- public void visitPairName(String name)
- throws JsVisitException{
- throw new JsVisitException();
- }
-
- public void visitCollectionClose(JsValue composite)
- throws JsVisitException{
- throw new JsVisitException();
- }
- });
- }catch(JsVisitException e){
- fail();
- }
-
- try{
- JsBoolean.FALSE.traverse(new ValueVisitor(){
- int ct = 0;
-
- public void visitValue(JsValue value)
- throws JsVisitException{
- assertEquals(JsBoolean.FALSE, value);
- assertTrue(this.ct++ <= 0);
- }
-
- public void visitPairName(String name)
- throws JsVisitException{
- throw new JsVisitException();
- }
-
- public void visitCollectionClose(JsValue composite)
- throws JsVisitException{
- throw new JsVisitException();
- }
- });
- }catch(JsVisitException e){
- fail();
- }
-
- return;
- }
-
- /**
- * Test of hasChanged method, of class JsBoolean.
- */
- @Test
- public void testHasChanged(){
- System.out.println("hasChanged");
-
- assertFalse(JsBoolean.TRUE.hasChanged());
- JsBoolean.TRUE.setUnchanged();
- assertFalse(JsBoolean.TRUE.hasChanged());
-
- assertFalse(JsBoolean.FALSE.hasChanged());
- JsBoolean.FALSE.setUnchanged();
- assertFalse(JsBoolean.FALSE.hasChanged());
-
- return;
- }
-
- /**
- * Test of setUnchanged method, of class JsBoolean.
- */
- @Test
- public void testSetUnchanged(){
- System.out.println("setUnchanged");
-
- JsBoolean.TRUE.setUnchanged();
- assertFalse(JsBoolean.TRUE.hasChanged());
-
- JsBoolean.FALSE.setUnchanged();
- assertFalse(JsBoolean.FALSE.hasChanged());
-
- return;
- }
-
- /**
- * Test of valueOf method, of class JsBoolean.
- */
- @Test
- public void testValueOf(){
- System.out.println("valueOf");
- assertEquals(JsBoolean.TRUE, JsBoolean.valueOf(true));
- assertEquals(JsBoolean.FALSE, JsBoolean.valueOf(false));
- return;
- }
-
- /**
- * Test of booleanValue method, of class JsBoolean.
- */
- @Test
- public void testBooleanValue(){
- System.out.println("booleanValue");
- assertTrue(JsBoolean.TRUE.booleanValue());
- assertFalse(JsBoolean.FALSE.booleanValue());
- return;
- }
-
- /**
- * Test of isTrue method, of class JsBoolean.
- */
- @Test
- public void testIsTrue(){
- System.out.println("isTrue");
- assertTrue(JsBoolean.TRUE.isTrue());
- assertFalse(JsBoolean.FALSE.isTrue());
- return;
- }
-
- /**
- * Test of isFalse method, of class JsBoolean.
- */
- @Test
- public void testIsFalse(){
- System.out.println("isFalse");
- assertFalse(JsBoolean.TRUE.isFalse());
- assertTrue(JsBoolean.FALSE.isFalse());
- return;
- }
-
- /**
- * Test of hashCode method, of class JsBoolean.
- */
- @Test
- public void testHashCode(){
- System.out.println("hashCode");
- // NOTHING
- return;
- }
-
- /**
- * Test of equals method, of class JsBoolean.
- */
- @Test
- public void testEquals(){
- System.out.println("equals");
-
- assertTrue(JsBoolean.TRUE.equals(JsBoolean.TRUE));
- assertFalse(JsBoolean.TRUE.equals(JsBoolean.FALSE));
-// assertFalse(JsBoolean.TRUE.equals(JsNull.NULL));
- assertFalse(JsBoolean.TRUE.equals(null));
-
- assertFalse(JsBoolean.FALSE.equals(JsBoolean.TRUE));
- assertTrue(JsBoolean.FALSE.equals(JsBoolean.FALSE));
-// assertFalse(JsBoolean.TRUE.equals(JsNull.NULL));
- assertFalse(JsBoolean.FALSE.equals(null));
-
- return;
- }
-
- /**
- * Test of compareTo method, of class JsBoolean.
- */
- @Test
- public void testCompareTo(){
- System.out.println("compareTo");
- assertEquals(0, JsBoolean.TRUE.compareTo(JsBoolean.TRUE));
- assertEquals(0, JsBoolean.FALSE.compareTo(JsBoolean.FALSE));
- assertTrue(0 > JsBoolean.TRUE.compareTo(JsBoolean.FALSE));
- assertTrue(0 < JsBoolean.FALSE.compareTo(JsBoolean.TRUE));
-
- try{
- JsBoolean.TRUE.compareTo(null);
- fail();
- }catch(NullPointerException e){
- // NOTHING
- }
-
- try{
- JsBoolean.FALSE.compareTo(null);
- fail();
- }catch(NullPointerException e){
- // NOTHING
- }
-
- SortedSet<JsBoolean> set = new TreeSet<JsBoolean>();
-
- set.clear();
- set.add(JsBoolean.TRUE);
- set.add(JsBoolean.FALSE);
- assertEquals(JsBoolean.TRUE, set.first());
- assertEquals(JsBoolean.FALSE, set.last());
- set.clear();
- set.add(JsBoolean.FALSE);
- set.add(JsBoolean.TRUE);
- assertEquals(JsBoolean.TRUE, set.first());
- assertEquals(JsBoolean.FALSE, set.last());
-
- return;
- }
-
- /**
- * Test of toString method, of class JsBoolean.
- */
- @Test
- public void testToString(){
- System.out.println("toString");
- assertEquals("true", JsBoolean.TRUE.toString());
- assertEquals("false", JsBoolean.FALSE.toString());
- return;
- }
-
- /**
- * Test of toString method, of class JsBoolean.
- */
- @Test
- public void testEtc(){
- System.out.println("etc.");
- assertNotNull(JsBoolean.TRUE);
- assertNotNull(JsBoolean.FALSE);
- assertTrue(JsBoolean.TRUE instanceof JsBoolean);
- assertTrue(JsBoolean.FALSE instanceof JsBoolean);
- return;
- }
-
-}
+++ /dev/null
-/*
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- *
- */
-public class JsNullTest {
-
- public JsNullTest() {
- }
-
- @BeforeClass
- public static void setUpClass() throws Exception{
- }
-
- @AfterClass
- public static void tearDownClass() throws Exception{
- }
-
- @Before
- public void setUp() {
- }
-
- @After
- public void tearDown() {
- }
-
- /**
- * Test of etc of class JsNull.
- */
- @Test
- public void testEtc(){
- System.out.println("etc");
- assertNotNull(JsNull.NULL);
- assertTrue(JsNull.NULL instanceof JsNull);
- return;
- }
-
- /**
- * Test of hasChanged method, of class JsNull.
- */
- @Test
- public void testHasChanged(){
- System.out.println("hasChanged");
- assertFalse(JsNull.NULL.hasChanged());
- JsNull.NULL.setUnchanged();
- assertFalse(JsNull.NULL.hasChanged());
- return;
- }
-
- /**
- * Test of setUnchanged method, of class JsNull.
- */
- @Test
- public void testSetUnchanged(){
- System.out.println("setUnchanged");
- JsNull.NULL.setUnchanged();
- assertFalse(JsNull.NULL.hasChanged());
- return;
- }
-
- /**
- * Test of traverse method, of class JsNull.
- */
- @Test
- public void testTraverse(){
- System.out.println("traverse");
- try{
- JsNull.NULL.traverse(new ValueVisitor(){
- int ct = 0;
-
- public void visitValue(JsValue value)
- throws JsVisitException{
- assertEquals(JsNull.NULL, value);
- assertTrue(this.ct++ <= 0);
- }
-
- public void visitPairName(String name)
- throws JsVisitException{
- throw new JsVisitException();
- }
-
- public void visitCollectionClose(JsValue composite)
- throws JsVisitException{
- throw new JsVisitException();
- }
- });
- }catch(JsVisitException e){
- fail();
- }
- return;
- }
-
- /**
- * Test of compareTo method, of class JsNull.
- */
- @Test
- public void testCompareTo(){
- System.out.println("compareTo");
- assertEquals(0, JsNull.NULL.compareTo(JsNull.NULL));
- try{
- JsNull.NULL.compareTo(null);
- fail();
- }catch(NullPointerException e){
- // NOTHING
- }
- return;
- }
-
- /**
- * Test of toString method, of class JsNull.
- */
- @Test
- public void testToString(){
- System.out.println("toString");
- assertEquals("null", JsNull.NULL.toString());
- return;
- }
-
-}
+++ /dev/null
-/*
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import java.io.StringReader;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- *
- */
-public class JsNumberTest {
-
- public JsNumberTest() {
- }
-
- @BeforeClass
- public static void setUpClass() throws Exception{
- }
-
- @AfterClass
- public static void tearDownClass() throws Exception{
- }
-
- @Before
- public void setUp() {
- }
-
- @After
- public void tearDown() {
- }
-
- /**
- * Test of parseNumber method, of class JsNumber.
- */
- @Test
- public void testParseNumber() throws Exception{
- System.out.println("parseNumber");
-
- JsonReader reader;
- JsNumber number;
-
- try{
- reader = new JsonReader(new StringReader("0"));
- number = JsNumber.parseNumber(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- reader = new JsonReader(new StringReader("0,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("0", number.toString());
-
- reader = new JsonReader(new StringReader("\n\r\t\u00200,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("0", number.toString());
-
- reader = new JsonReader(new StringReader("-0,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("0", number.toString());
-
- reader = new JsonReader(new StringReader("12,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("12", number.toString());
-
- reader = new JsonReader(new StringReader("-12,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("-12", number.toString());
-
- try{
- reader = new JsonReader(new StringReader("+12,"));
- number = JsNumber.parseNumber(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- try{
- reader = new JsonReader(new StringReader("12.,"));
- number = JsNumber.parseNumber(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- reader = new JsonReader(new StringReader("12.34,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("12.34", number.toString());
-
- reader = new JsonReader(new StringReader("12.0,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("12.0", number.toString());
-
- reader = new JsonReader(new StringReader("12.00,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("12.00", number.toString());
-
- reader = new JsonReader(new StringReader("12.003,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("12.003", number.toString());
-
- reader = new JsonReader(new StringReader("12.0030,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("12.0030", number.toString());
-
- try{
- reader = new JsonReader(new StringReader("09,"));
- number = JsNumber.parseNumber(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- reader = new JsonReader(new StringReader("12e34,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("1.2E+35", number.toString());
-
- reader = new JsonReader(new StringReader("12E34,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("1.2E+35", number.toString());
-
- reader = new JsonReader(new StringReader("12e+34,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("1.2E+35", number.toString());
-
- reader = new JsonReader(new StringReader("12e-34,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("1.2E-33", number.toString());
-
- reader = new JsonReader(new StringReader("12e0034,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("1.2E+35", number.toString());
-
- try{
- reader = new JsonReader(new StringReader("12e,"));
- number = JsNumber.parseNumber(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- try{
- reader = new JsonReader(new StringReader("12e+,"));
- number = JsNumber.parseNumber(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- try{
- reader = new JsonReader(new StringReader("12e-,"));
- number = JsNumber.parseNumber(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- reader = new JsonReader(new StringReader("-12.34e-056,"));
- number = JsNumber.parseNumber(reader);
- assertEquals("-1.234E-55", number.toString());
-
- return;
- }
-
- /**
- * Test of constructor, of class JsNumber.
- */
- @Test
- public void testConstructors() throws Exception{
- System.out.println("constructor");
-
- JsNumber number;
- BigDecimal decimal;
-
- number = new JsNumber(99L);
- decimal = number.getBigDecimal();
- assertEquals(new BigInteger("99"), decimal.unscaledValue());
- assertEquals(0, decimal.scale());
-
- number = new JsNumber(99.0);
- decimal = number.getBigDecimal();
- assertEquals(new BigInteger("990"), decimal.unscaledValue());
- assertEquals(1, decimal.scale());
-
- number = new JsNumber(new BigInteger("99"));
- decimal = number.getBigDecimal();
- assertEquals(new BigInteger("99"), decimal.unscaledValue());
- assertEquals(0, decimal.scale());
-
- number = new JsNumber("99.9");
- decimal = number.getBigDecimal();
- assertEquals(new BigInteger("999"), decimal.unscaledValue());
- assertEquals(1, decimal.scale());
-
- number = new JsNumber(new BigDecimal("99.9"));
- decimal = number.getBigDecimal();
- assertEquals(new BigInteger("999"), decimal.unscaledValue());
- assertEquals(1, decimal.scale());
-
- return;
- }
-
- /**
- * Test of traverse method, of class JsNumber.
- */
- @Test
- public void testTraverse(){
- System.out.println("traverse");
-
- JsNumber number = new JsNumber("0");
-
- try{
- number.traverse(new ValueVisitor(){
- int ct = 0;
-
- public void visitValue(JsValue value)
- throws JsVisitException{
- assertEquals(new JsNumber("0"), value);
- assertTrue(this.ct++ <= 0);
- }
-
- public void visitPairName(String name)
- throws JsVisitException{
- throw new JsVisitException();
- }
-
- public void visitCollectionClose(JsValue composite)
- throws JsVisitException{
- throw new JsVisitException();
- }
- });
- }catch(JsVisitException e){
- fail();
- }
-
- return;
- }
-
- /**
- * Test of hasChanged method, of class JsNumber.
- */
- @Test
- public void testHasChanged(){
- System.out.println("hasChanged");
-
- JsNumber number = new JsNumber("0");
-
- assertFalse(number.hasChanged());
- number.setUnchanged();
- assertFalse(number.hasChanged());
-
- return;
- }
-
- /**
- * Test of setUnchanged method, of class JsNumber.
- */
- @Test
- public void testSetUnchanged(){
- System.out.println("setUnchanged");
-
- JsNumber number = new JsNumber("0");
-
- number.setUnchanged();
- assertFalse(number.hasChanged());
-
- return;
- }
-
- /**
- * Test of getBigDecimal method, of class JsNumber.
- */
- @Test
- public void testGetBigDecimal(){
- System.out.println("getBigDecimal");
-
- JsNumber number = new JsNumber("-123.456e+1");
- BigDecimal decimal = number.getBigDecimal();
-
- assertEquals(new BigDecimal("-123.456e+1"), decimal);
- assertEquals(2, decimal.scale());
- assertEquals(new BigInteger("-123456"), decimal.unscaledValue());
-
- return;
- }
-
- /**
- * Test of intValue method, of class JsNumber.
- */
- @Test
- public void testIntValue(){
- System.out.println("intValue");
-
- assertEquals(0, new JsNumber("0").intValue());
- assertEquals(99, new JsNumber("99.9").intValue());
- assertEquals(-99, new JsNumber("-99.9").intValue());
- assertEquals(2147483647, new JsNumber("2147483647").intValue());
-
- return;
- }
-
- /**
- * Test of longValue method, of class JsNumber.
- */
- @Test
- public void testLongValue(){
- System.out.println("longValue");
-
- assertEquals(0L, new JsNumber("0").longValue());
- assertEquals(99L, new JsNumber("99.9").longValue());
- assertEquals(-99L, new JsNumber("-99.9").longValue());
- assertEquals(999999999999L, new JsNumber("999999999999").longValue());
-
- return;
- }
-
- /**
- * Test of floatValue method, of class JsNumber.
- */
- @Test
- public void testFloatValue(){
- System.out.println("floatValue");
-
- assertEquals(1.25f, new JsNumber("1.25").floatValue(), 0.0);
- assertEquals(1.25f, new JsNumber("125E-2").floatValue(), 0.0);
-
- return;
- }
-
- /**
- * Test of doubleValue method, of class JsNumber.
- */
- @Test
- public void testDoubleValue(){
- System.out.println("doubleValue");
-
- assertEquals(1.25, new JsNumber("1.25").doubleValue(), 0.0);
- assertEquals(1.25, new JsNumber("125E-2").doubleValue(), 0.0);
-
- return;
- }
-
- /**
- * Test of hashCode method, of class JsNumber.
- */
- @Test
- public void testHashCode(){
- System.out.println("hashCode");
-
- assertEquals(new JsNumber("1").hashCode(), new JsNumber("1").hashCode());
- assertEquals(new JsNumber("1.23").hashCode(), new JsNumber("123e-2").hashCode());
-
- return;
- }
-
- /**
- * Test of equals method, of class JsNumber.
- */
- @Test
- public void testEquals(){
- System.out.println("equals");
-
- assertTrue(new JsNumber("1").equals(new JsNumber("1")));
- assertFalse(new JsNumber("1").equals(new JsNumber("2")));
- assertFalse(new JsNumber("1").equals(null));
-
- assertTrue(new JsNumber("1.23").equals(new JsNumber("123e-2")));
- assertFalse(new JsNumber("1.0").equals(new JsNumber("1.00")));
-
- return;
- }
-
- /**
- * Test of compareTo method, of class JsNumber.
- */
- @Test
- public void testCompareTo(){
- System.out.println("compareTo");
-
- assertTrue(0 > new JsNumber("-1").compareTo(new JsNumber("1")));
- assertTrue(0 < new JsNumber("1").compareTo(new JsNumber("-1")));
- assertTrue(new JsNumber("1").compareTo(new JsNumber("1")) == 0);
-
- assertTrue(0 > new JsNumber("1").compareTo(new JsNumber("2")));
- assertTrue(0 < new JsNumber("9").compareTo(new JsNumber("8")));
-
- assertTrue(new JsNumber("1.23").compareTo(new JsNumber("123e-2")) == 0);
- assertTrue(new JsNumber("1.0").compareTo(new JsNumber("1.00")) == 0);
-
- return;
- }
-
- /**
- * Test of toString method, of class JsNumber.
- */
- @Test
- public void testToString(){
- System.out.println("toString");
-
- JsNumber number;
-
- number = new JsNumber("0");
- assertEquals("0", number.toString());
- number = new JsNumber("+0");
- assertEquals("0", number.toString());
- number = new JsNumber("-0");
- assertEquals("0", number.toString());
-
- number = new JsNumber("1");
- assertEquals("1", number.toString());
- number = new JsNumber("+1");
- assertEquals("1", number.toString());
- number = new JsNumber("-1");
- assertEquals("-1", number.toString());
-
- number = new JsNumber("0.0");
- assertEquals("0.0", number.toString());
-
- number = new JsNumber("1.0");
- assertEquals("1.0", number.toString());
-
- number = new JsNumber("1.00");
- assertEquals("1.00", number.toString());
-
- number = new JsNumber("0.1");
- assertEquals("0.1", number.toString());
-
- number = new JsNumber("0.10");
- assertEquals("0.10", number.toString());
-
- number = new JsNumber("0.000001");
- assertEquals("0.000001", number.toString());
-
- number = new JsNumber("0.0000001");
- assertEquals("1E-7", number.toString());
-
- number = new JsNumber("123e0");
- assertEquals("123", number.toString());
-
- number = new JsNumber("123e1");
- assertEquals("1.23E+3", number.toString());
-
- number = new JsNumber("123E1");
- assertEquals("1.23E+3", number.toString());
-
- number = new JsNumber("123e+1");
- assertEquals("1.23E+3", number.toString());
-
- number = new JsNumber("123e-1");
- assertEquals("12.3", number.toString());
-
- number = new JsNumber("123e-8");
- assertEquals("0.00000123", number.toString());
-
- number = new JsNumber("123e-9");
- assertEquals("1.23E-7", number.toString());
-
- return;
- }
-
-}
+++ /dev/null
-/*
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import java.io.StringReader;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- *
- */
-public class JsObjectTest {
-
- public JsObjectTest() {
- }
-
- @BeforeClass
- public static void setUpClass() throws Exception{
- }
-
- @AfterClass
- public static void tearDownClass() throws Exception{
- }
-
- @Before
- public void setUp() {
- }
-
- @After
- public void tearDown() {
- }
-
- /**
- * Test of parseObject method, of class JsObject.
- */
- @Test
- public void testParseObject() throws Exception{
- System.out.println("parseObject");
-
- JsonReader reader;
- JsObject object;
-
- reader = new JsonReader(new StringReader("{}"));
- object = JsObject.parseObject(reader);
- assertEquals(0, object.size());
-
- reader = new JsonReader(new StringReader("{\"A\":true}"));
- object = JsObject.parseObject(reader);
- assertEquals(1, object.size());
- assertEquals(JsBoolean.TRUE, object.getPair("A").getValue());
-
- reader = new JsonReader(new StringReader("{\"A\":true,\"B\":false}"));
- object = JsObject.parseObject(reader);
- assertEquals(2, object.size());
- assertEquals(JsBoolean.TRUE, object.getPair("A").getValue());
- assertEquals(JsBoolean.FALSE, object.getPair("B").getValue());
-
- reader = new JsonReader(new StringReader("\n{\r\"A\"\t: true,\"B\":false\n}\r"));
- object = JsObject.parseObject(reader);
- assertEquals(2, object.size());
- assertEquals(JsBoolean.TRUE, object.getPair("A").getValue());
- assertEquals(JsBoolean.FALSE, object.getPair("B").getValue());
-
- try{
- reader = new JsonReader(new StringReader("{,}"));
- object = JsObject.parseObject(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- try{
- reader = new JsonReader(new StringReader("{true,}"));
- object = JsObject.parseObject(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- try{
- reader = new JsonReader(new StringReader("{true"));
- object = JsObject.parseObject(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- try{
- reader = new JsonReader(new StringReader("true}"));
- object = JsObject.parseObject(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- return;
- }
-
- /**
- * Test of putValue method, of class JsObject.
- */
- @Test
- public void testPutGetValue(){
- System.out.println("putValue");
-
- JsObject object = new JsObject();
- assertEquals(0, object.size());
-
- object.putValue("x", JsNull.NULL);
- assertEquals(1, object.size());
- assertEquals(JsNull.NULL, object.getValue("x"));
- assertEquals(null, object.getValue("y"));
-
- object.putValue("y", JsBoolean.TRUE);
- assertEquals(2, object.size());
- assertEquals(JsBoolean.TRUE, object.getValue("y"));
-
- object.putValue("x", JsBoolean.FALSE);
- assertEquals(2, object.size());
- assertEquals(JsBoolean.FALSE, object.getValue("x"));
-
- return;
- }
-
- /**
- * Test of putPair method, of class JsObject.
- */
- @Test
- public void testPutGetPair(){
- System.out.println("putPair");
-
- JsObject object = new JsObject();
- assertEquals(0, object.size());
-
- JsPair pair = new JsPair("x", JsNull.NULL);
- object.putPair(pair);
- assertEquals(1, object.size());
- assertEquals(JsNull.NULL, object.getValue("x"));
-
- JsPair pair2 = object.getPair("x");
- assertNotNull(pair2);
- assertEquals("x", pair2.getName());
- assertEquals(JsNull.NULL, pair2.getValue());
-
- assertNull(object.getPair("y"));
-
- return;
- }
-
- /**
- * Test of clear method, of class JsObject.
- */
- @Test
- public void testClear(){
- System.out.println("clear");
-
- JsObject object = new JsObject();
- assertEquals(0, object.size());
-
- object.putValue("x", JsNull.NULL);
- assertEquals(1, object.size());
-
- object.clear();
- assertEquals(0, object.size());
-
- return;
- }
-
- /**
- * Test of remove method, of class JsObject.
- */
- @Test
- public void testRemove(){
- System.out.println("remove");
-
- JsObject object = new JsObject();
-
- object.putValue("x", JsNull.NULL);
- assertEquals(1, object.size());
-
- assertNotNull(object.getValue("x"));
-
- assertEquals(JsNull.NULL, object.remove("x"));
- assertEquals(0, object.size());
- assertNull(object.getValue("x"));
-
- assertNull(object.remove("y"));
-
- return;
- }
-
- /**
- * Test of nameSet method, of class JsObject.
- */
- @Test
- public void testNameSet(){
- System.out.println("nameSet");
-
- JsObject object = new JsObject();
- Set<String> set;
-
- set = object.nameSet();
- assertEquals(0, set.size());
-
- object.putValue("y", JsNull.NULL);
- object.putValue("z", JsNull.NULL);
- object.putValue("x", JsNull.NULL);
-
- set = object.nameSet();
- assertEquals(3, set.size());
- Object[] names = set.toArray();
-
- assertEquals("x", names[0]);
- assertEquals("y", names[1]);
- assertEquals("z", names[2]);
-
- return;
- }
-
- /**
- * Test of getPairList method, of class JsObject.
- */
- @Test
- public void testGetPairList(){
- System.out.println("getPairList");
-
- JsObject object = new JsObject();
- List<JsPair> list;
-
- list = object.getPairList();
- assertEquals(0, list.size());
-
- object.putValue("y", JsNull.NULL);
- object.putValue("z", JsBoolean.TRUE);
- object.putValue("x", JsBoolean.FALSE);
-
- list = object.getPairList();
- assertEquals(3, list.size());
-
- assertEquals("x", list.get(0).getName());
- assertEquals("y", list.get(1).getName());
- assertEquals("z", list.get(2).getName());
- assertEquals(JsBoolean.FALSE, list.get(0).getValue());
- assertEquals(JsNull.NULL, list.get(1).getValue());
- assertEquals(JsBoolean.TRUE, list.get(2).getValue());
-
- return;
- }
-
- /**
- * Test of iterator method, of class JsObject.
- */
- @Test
- public void testIterator(){
- System.out.println("iterator");
-
- JsObject object = new JsObject();
- object.putValue("y", JsBoolean.FALSE);
- object.putValue("x", JsBoolean.TRUE);
-
- Iterator<JsPair> it = object.iterator();
-
- assertTrue(it.hasNext());
- assertEquals(JsBoolean.TRUE, it.next().getValue());
- assertTrue(it.hasNext());
- assertEquals(JsBoolean.FALSE, it.next().getValue());
- assertFalse(it.hasNext());
-
- return;
- }
-
- /**
- * Test of size method, of class JsObject.
- */
- @Test
- public void testSize(){
- System.out.println("size");
-
- JsObject object = new JsObject();
- assertEquals(0, object.size());
- object.putValue("x", JsBoolean.TRUE);
- assertEquals(1, object.size());
- object.putValue("y", JsBoolean.FALSE);
- assertEquals(2, object.size());
-
- return;
- }
-
- /**
- * Test of hashCode method, of class JsObject.
- */
- @Test
- public void testHashCode(){
- System.out.println("hashCode");
-
- JsObject obj1 = new JsObject();
- JsObject obj2 = new JsObject();
- assertEquals(obj1.hashCode(), obj2.hashCode());
-
- obj1.putValue("x", new JsNumber("99"));
- obj2.putValue("x", new JsNumber("99"));
- assertEquals(obj1.hashCode(), obj2.hashCode());
-
- return;
- }
-
- /**
- * Test of equals method, of class JsObject.
- */
- @Test
- public void testEquals(){
- System.out.println("equals");
-
- JsObject obj1 = new JsObject();
- JsObject obj2 = new JsObject();
- assertTrue(obj1.equals(obj2));
-
- obj1.putValue("x", new JsNumber("99"));
- obj2.putValue("x", new JsNumber("99"));
- assertTrue(obj1.equals(obj2));
-
- obj1.putValue("x", new JsNumber("99"));
- obj2.putValue("x", new JsNumber("999"));
- assertFalse(obj1.equals(obj2));
-
- assertFalse(obj1.equals(null));
-
- return;
- }
-
- /**
- * Test of toString method, of class JsObject.
- */
- @Test
- public void testToString(){
- System.out.println("toString");
-
- JsObject object = new JsObject();
-
- assertEquals("{}", object.toString());
-
- object.putValue("x", JsBoolean.TRUE);
- assertEquals("{\"x\":true}", object.toString());
-
- object.putValue("y", JsBoolean.FALSE);
- assertEquals("{\"x\":true,\"y\":false}", object.toString());
-
- object.putValue("z", new JsObject());
- assertEquals("{\"x\":true,\"y\":false,\"z\":{}}", object.toString());
-
- return;
- }
-
- /**
- * Test of traverse method, of class JsObject.
- */
- @Test
- public void testTraverse() throws Exception{
- System.out.println("traverse");
-
- JsObject obj = new JsObject();
- JsValue val1 = new JsNumber("12");
- JsValue val2 = new JsString("AB");
- obj.putValue("x", val1);
- obj.putValue("y", val2);
-
- final List<Object> visited = new LinkedList<Object>();
-
- try{
- obj.traverse(new ValueVisitor(){
- public void visitValue(JsValue value)
- throws JsVisitException{
- visited.add(value);
- return;
- }
-
- public void visitPairName(String name)
- throws JsVisitException{
- visited.add(name);
- return;
- }
-
- public void visitCollectionClose(JsValue composite)
- throws JsVisitException{
- visited.add(composite);
- return;
- }
- });
- }catch(JsVisitException e){
- fail();
- }
-
- assertEquals(6, visited.size());
- assertEquals(obj, visited.get(0));
- assertEquals("x", visited.get(1));
- assertEquals(val1, visited.get(2));
- assertEquals("y", visited.get(3));
- assertEquals(val2, visited.get(4));
- assertEquals(obj, visited.get(5));
-
- return;
- }
-
- /**
- * Test of hasChanged method, of class JsObject.
- */
- @Test
- public void testHasChanged(){
- System.out.println("hasChanged");
-
- JsObject obj = new JsObject();
- assertFalse(obj.hasChanged());
-
- obj.putValue("x", JsNull.NULL);
- assertTrue(obj.hasChanged());
-
- obj.setUnchanged();
- assertFalse(obj.hasChanged());
-
- JsObject child = new JsObject();
- obj.putValue("y", child);
- obj.setUnchanged();
- assertFalse(obj.hasChanged());
-
- child.putValue("z", JsBoolean.TRUE);
- assertTrue(obj.hasChanged());
- obj.setUnchanged();
- assertFalse(obj.hasChanged());
-
- return;
- }
-
- /**
- * Test of setUnchanged method, of class JsObject.
- */
- @Test
- public void testSetUnchanged(){
- System.out.println("setUnchanged");
-
- JsObject obj = new JsObject();
- JsObject child = new JsObject();
- obj.putValue("x", child);
-
- child.putValue("y", JsNull.NULL);
- assertTrue(child.hasChanged());
-
- obj.setUnchanged();
- assertFalse(child.hasChanged());
-
- return;
- }
-
-}
+++ /dev/null
-/*
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- *
- */
-public class JsPairTest {
-
- public JsPairTest() {
- }
-
- @BeforeClass
- public static void setUpClass() throws Exception{
- }
-
- @AfterClass
- public static void tearDownClass() throws Exception{
- }
-
- @Before
- public void setUp() {
- }
-
- @After
- public void tearDown() {
- }
-
- /**
- * Test of getName method, of class JsPair.
- */
- @Test
- public void testGetName(){
- System.out.println("getName");
-
- JsPair pair;
-
- pair = new JsPair("", JsNull.NULL);
- assertEquals("", pair.getName());
-
- pair = new JsPair("a", JsNull.NULL);
- assertEquals("a", pair.getName());
-
- return;
- }
-
- /**
- * Test of getValue method, of class JsPair.
- */
- @Test
- public void testGetValue(){
- System.out.println("getValue");
-
- JsPair pair;
-
- pair = new JsPair("x", JsNull.NULL);
- assertEquals(JsNull.NULL, pair.getValue());
-
- pair = new JsPair("x", "abc");
- assertEquals(new JsString("abc"), pair.getValue());
-
- pair = new JsPair("x", true);
- assertEquals(JsBoolean.TRUE, pair.getValue());
-
- pair = new JsPair("x", false);
- assertEquals(JsBoolean.FALSE, pair.getValue());
-
- pair = new JsPair("x", 999999999999L);
- assertEquals(new JsNumber("999999999999"), pair.getValue());
-
- pair = new JsPair("x", 1.25);
- assertEquals(new JsNumber("1.25"), pair.getValue());
-
- return;
- }
-
- /**
- * Test of toString method, of class JsPair.
- */
- @Test
- public void testToString(){
- System.out.println("toString");
-
- JsPair pair;
-
- pair = new JsPair("x", JsNull.NULL);
- assertEquals("\"x\":null", pair.toString());
-
- pair = new JsPair("", JsNull.NULL);
- assertEquals("\"\":null", pair.toString());
-
- return;
- }
-
-}
+++ /dev/null
-/*
- * Copyright(c) 2009 olyutorskii
- */
-
-package jp.sourceforge.jindolf.json;
-
-import java.io.StringReader;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- *
- */
-public class JsStringTest {
-
- public JsStringTest() {
- }
-
- @BeforeClass
- public static void setUpClass() throws Exception{
- }
-
- @AfterClass
- public static void tearDownClass() throws Exception{
- }
-
- @Before
- public void setUp() {
- }
-
- @After
- public void tearDown() {
- }
-
- /**
- * Test of parseHexChar method, of class JsString.
- */
- @Test
- public void testParseHexChar() throws Exception{
- System.out.println("parseHexChar");
-
- JsonReader reader;
- char ch;
-
- reader = new JsonReader(new StringReader("0000"));
- ch = JsString.parseHexChar(reader);
- assertEquals('\u0000', ch);
-
- reader = new JsonReader(new StringReader("ffff"));
- ch = JsString.parseHexChar(reader);
- assertEquals('\uffff', ch);
-
- reader = new JsonReader(new StringReader("FFFF"));
- ch = JsString.parseHexChar(reader);
- assertEquals('\uffff', ch);
-
- reader = new JsonReader(new StringReader("dead"));
- ch = JsString.parseHexChar(reader);
- assertEquals('\udead', ch);
-
- reader = new JsonReader(new StringReader("abcde"));
- ch = JsString.parseHexChar(reader);
- assertEquals('\uabcd', ch);
-
- try{
- reader = new JsonReader(new StringReader("000,"));
- ch = JsString.parseHexChar(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- return;
- }
-
- /**
- * Test of parseString method, of class JsString.
- */
- @Test
- public void testParseString() throws Exception{
- System.out.println("parseString");
-
- JsonReader reader;
- JsString string;
-
- reader = new JsonReader(new StringReader("\"abc\""));
- string = JsString.parseString(reader);
- assertEquals("abc", string.toRawString());
-
- reader = new JsonReader(new StringReader("\"あいう\""));
- string = JsString.parseString(reader);
- assertEquals("あいう", string.toRawString());
-
- reader = new JsonReader(new StringReader("\"\\\"\\\\\\/\""));
- string = JsString.parseString(reader);
- assertEquals("\"\\/", string.toRawString());
-
- reader = new JsonReader(new StringReader("\"\\b\\f\\n\\r\\t\""));
- string = JsString.parseString(reader);
- assertEquals("\b\f\n\r\t", string.toRawString());
-
- reader = new JsonReader(new StringReader("\"\\uabcd\\uCDEF\""));
- string = JsString.parseString(reader);
- assertEquals("\uabcd\ucdef", string.toRawString());
-
- try{
- reader = new JsonReader(new StringReader("abc\""));
- string = JsString.parseString(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- try{
- reader = new JsonReader(new StringReader("\"abc"));
- string = JsString.parseString(reader);
- fail();
- }catch(JsParseException e){
- // NOTHING
- }
-
- return;
- }
-
- /**
- * Test of writeText method, of class JsString.
- */
- @Test
- public void testWriteText() throws Exception{
- System.out.println("writeText");
-
- Appendable appout;
- JsString string;
-
- appout = new StringBuilder();
- string = new JsString();
- JsString.writeText(appout, string);
- assertEquals("\"\"", appout.toString());
-
- appout = new StringBuilder();
- string = new JsString("abc");
- JsString.writeText(appout, string);
- assertEquals("\"abc\"", appout.toString());
-
- appout = new StringBuilder();
- string = new JsString("\"");
- JsString.writeText(appout, string);
- assertEquals("\"\\\"\"", appout.toString());
-
- appout = new StringBuilder();
- string = new JsString("\\");
- JsString.writeText(appout, string);
- assertEquals("\"\\\\\"", appout.toString());
-
- appout = new StringBuilder();
- string = new JsString("/");
- JsString.writeText(appout, string);
- assertEquals("\"\\/\"", appout.toString());
-
- appout = new StringBuilder();
- string = new JsString("\b");
- JsString.writeText(appout, string);
- assertEquals("\"\\b\"", appout.toString());
-
- appout = new StringBuilder();
- string = new JsString("\f");
- JsString.writeText(appout, string);
- assertEquals("\"\\f\"", appout.toString());
-
- appout = new StringBuilder();
- string = new JsString("\n");
- JsString.writeText(appout, string);
- assertEquals("\"\\n\"", appout.toString());
-
- appout = new StringBuilder();
- string = new JsString("\r");
- JsString.writeText(appout, string);
- assertEquals("\"\\r\"", appout.toString());
-
- appout = new StringBuilder();
- string = new JsString("\t");
- JsString.writeText(appout, string);
- assertEquals("\"\\t\"", appout.toString());
-
- appout = new StringBuilder();
- string = new JsString("\u0001");
- JsString.writeText(appout, string);
- assertEquals("\"\\u0001\"", appout.toString());
-
- appout = new StringBuilder();
- string = new JsString("あ");
- JsString.writeText(appout, string);
- assertEquals("\"あ\"", appout.toString());
-
- return;
- }
-
- /**
- * Test of traverse method, of class JsString.
- */
- @Test
- public void testTraverse(){
- System.out.println("traverse");
-
- JsString string = new JsString("A");
-
- try{
- string.traverse(new ValueVisitor(){
- int ct = 0;
-
- public void visitValue(JsValue value)
- throws JsVisitException{
- assertEquals(new JsString("A"), value);
- assertTrue(this.ct++ <= 0);
- }
-
- public void visitPairName(String name)
- throws JsVisitException{
- throw new JsVisitException();
- }
-
- public void visitCollectionClose(JsValue composite)
- throws JsVisitException{
- throw new JsVisitException();
- }
- });
- }catch(JsVisitException e){
- fail();
- }
-
- return;
- }
-
- /**
- * Test of hasChanged method, of class JsString.
- */
- @Test
- public void testHasChanged(){
- System.out.println("hasChanged");
-
- JsString string = new JsString("A");
-
- assertFalse(string.hasChanged());
- string.setUnchanged();
- assertFalse(string.hasChanged());
-
- return;
- }
-
- /**
- * Test of setUnchanged method, of class JsString.
- */
- @Test
- public void testSetUnchanged(){
- System.out.println("setUnchanged");
-
- JsString string = new JsString("A");
-
- string.setUnchanged();
- assertFalse(string.hasChanged());
-
- return;
- }
-
- /**
- * Test of charAt method, of class JsString.
- */
- @Test
- public void testCharAt(){
- System.out.println("charAt");
-
- JsString string;
-
- string = new JsString("abcde");
- assertEquals('b', string.charAt(1));
-
- try{
- string.charAt(999);
- fail();
- }catch(IndexOutOfBoundsException e){
- // NOTHING
- }
-
- return;
- }
-
- /**
- * Test of length method, of class JsString.
- */
- @Test
- public void testLength(){
- System.out.println("length");
-
- assertEquals(0, new JsString().length());
- assertEquals(0, new JsString("").length());
- assertEquals(1, new JsString("A").length());
- assertEquals(2, new JsString("AB").length());
- assertEquals(3, new JsString("A\"B").length());
-
- return;
- }
-
- /**
- * Test of subSequence method, of class JsString.
- */
- @Test
- public void testSubSequence(){
- System.out.println("subSequence");
-
- JsString string;
-
- string = new JsString("abcde");
- assertEquals("bcd", string.subSequence(1, 4).toString());
- assertEquals("", string.subSequence(1, 1).toString());
-
- try{
- string.subSequence(1,999);
- fail();
- }catch(IndexOutOfBoundsException e){
- // NOTHING
- }
-
- return;
- }
-
- /**
- * Test of hashCode method, of class JsString.
- */
- @Test
- public void testHashCode(){
- System.out.println("hashCode");
- assertEquals(new JsString("A").hashCode(), new JsString("A").hashCode());
- return;
- }
-
- /**
- * Test of equals method, of class JsString.
- */
- @Test
- public void testEquals(){
- System.out.println("equals");
-
- assertTrue(new JsString("A").equals(new JsString("A")));
- assertFalse(new JsString("A").equals(new JsString("a")));
- assertFalse(new JsString("A").equals(null));
-
- return;
- }
-
- /**
- * Test of compareTo method, of class JsString.
- */
- @Test
- public void testCompareTo(){
- System.out.println("compareTo");
-
- assertTrue(0 == new JsString("A").compareTo(new JsString("A")));
- assertTrue(0 > new JsString("A").compareTo(new JsString("a")));
- assertTrue(0 < new JsString("a").compareTo(new JsString("A")));
- assertTrue(0 < new JsString("A").compareTo(null));
-
- SortedSet<JsString> set = new TreeSet<JsString>();
-
- set.clear();
- set.add(new JsString("A"));
- set.add(new JsString("a"));
- assertEquals(new JsString("A"), set.first());
- assertEquals(new JsString("a"), set.last());
-
- set.clear();
- set.add(new JsString("a"));
- set.add(new JsString("A"));
- assertEquals(new JsString("A"), set.first());
- assertEquals(new JsString("a"), set.last());
-
- return;
- }
-
- /**
- * Test of toString method, of class JsString.
- */
- @Test
- public void testToString(){
- System.out.println("toString");
-
- assertEquals("\"\"", new JsString("").toString());
- assertEquals("\"abc\"", new JsString("abc").toString());
- assertEquals("\"\\\"\"", new JsString("\"").toString());
- assertEquals("\"\\\\\"", new JsString("\\").toString());
- assertEquals("\"\\/\"", new JsString("/").toString());
- assertEquals("\"\\b\"", new JsString("\b").toString());
- assertEquals("\"\\f\"", new JsString("\f").toString());
- assertEquals("\"\\n\"", new JsString("\n").toString());
- assertEquals("\"\\r\"", new JsString("\r").toString());
- assertEquals("\"\\t\"", new JsString("\t").toString());
- assertEquals("\"\\u0001\"", new JsString("\u0001").toString());
- assertEquals("\"あ\"", new JsString("あ").toString());
-
- return;
- }
-
- /**
- * Test of toRawString method, of class JsString.
- */
- @Test
- public void testToRawString(){
- System.out.println("toRawString");
-
- assertEquals("", new JsString("").toRawString());
- assertEquals("abc", new JsString("abc").toRawString());
- assertEquals("\"", new JsString("\"").toRawString());
- assertEquals("\\", new JsString("\\").toRawString());
- assertEquals("/", new JsString("/").toRawString());
- assertEquals("\b", new JsString("\b").toRawString());
- assertEquals("\f", new JsString("\f").toRawString());
- assertEquals("\n", new JsString("\n").toRawString());
- assertEquals("\r", new JsString("\r").toRawString());
- assertEquals("\t", new JsString("\t").toRawString());
- assertEquals("\u0001", new JsString("\u0001").toRawString());
- assertEquals("あ", new JsString("あ").toRawString());
-
- return;
- }
-
-}