还原修改: DUBBO-64 去掉commons-dubbo模块中JSON实现,使用FastJson
git-svn-id: http://code.alibabatech.com/svn/dubbo/trunk@265 1a56cb94-b969-4eaa-88fa-be21384802f2
This commit is contained in:
parent
f5fa3f55d3
commit
2cbe04261c
|
|
@ -0,0 +1,470 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Array;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import com.alibaba.dubbo.common.bytecode.Wrapper;
|
||||
import com.alibaba.dubbo.common.io.Bytes;
|
||||
|
||||
public class GenericJSONConverter implements JSONConverter
|
||||
{
|
||||
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
||||
|
||||
protected interface Encoder{ void encode(Object obj, JSONWriter jb) throws IOException; }
|
||||
|
||||
protected interface Decoder{ Object decode(Object jv) throws IOException; }
|
||||
|
||||
private static final Map<Class<?>, Encoder> GlobalEncoderMap = new HashMap<Class<?>, Encoder>();
|
||||
|
||||
private static final Map<Class<?>, Decoder> GlobalDecoderMap = new HashMap<Class<?>, Decoder>();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void writeValue(Object obj, JSONWriter jb, boolean writeClass) throws IOException
|
||||
{
|
||||
if (obj == null) {
|
||||
jb.valueNull();
|
||||
return;
|
||||
}
|
||||
Class<?> c = obj.getClass();
|
||||
Encoder encoder = GlobalEncoderMap.get(c);
|
||||
|
||||
if( encoder != null )
|
||||
{
|
||||
encoder.encode(obj, jb);
|
||||
}
|
||||
else if( obj instanceof JSONNode )
|
||||
{
|
||||
((JSONNode)obj).writeJSON(this, jb, writeClass);
|
||||
}
|
||||
else if( c.isEnum() )
|
||||
{
|
||||
jb.valueString(((Enum<?>)obj).name());
|
||||
}
|
||||
else if( c.isArray() )
|
||||
{
|
||||
int len = Array.getLength(obj);
|
||||
jb.arrayBegin();
|
||||
for(int i=0;i<len;i++)
|
||||
writeValue(Array.get(obj, i), jb, writeClass);
|
||||
jb.arrayEnd();
|
||||
}
|
||||
else if( Map.class.isAssignableFrom(c) )
|
||||
{
|
||||
Object key, value;
|
||||
jb.objectBegin();
|
||||
for( Map.Entry<Object, Object> entry : ((Map<Object, Object>)obj).entrySet() )
|
||||
{
|
||||
key = entry.getKey();
|
||||
if( key == null )
|
||||
continue;
|
||||
jb.objectItem(key.toString());
|
||||
|
||||
value = entry.getValue();
|
||||
if( value == null )
|
||||
jb.valueNull();
|
||||
else
|
||||
writeValue(value, jb, writeClass);
|
||||
}
|
||||
jb.objectEnd();
|
||||
}
|
||||
else if( Collection.class.isAssignableFrom(c) )
|
||||
{
|
||||
jb.arrayBegin();
|
||||
for( Object item : (Collection<Object>)obj )
|
||||
{
|
||||
if( item == null )
|
||||
jb.valueNull();
|
||||
else
|
||||
writeValue(item, jb, writeClass);
|
||||
}
|
||||
jb.arrayEnd();
|
||||
}
|
||||
else
|
||||
{
|
||||
jb.objectBegin();
|
||||
|
||||
Wrapper w = Wrapper.getWrapper(c);
|
||||
String pns[] = w.getPropertyNames();
|
||||
|
||||
for( String pn : pns )
|
||||
{
|
||||
if ((obj instanceof Throwable) && (
|
||||
"localizedMessage".equals(pn)
|
||||
|| "cause".equals(pn)
|
||||
|| "stackTrace".equals(pn))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
jb.objectItem(pn);
|
||||
|
||||
Object value = w.getPropertyValue(obj,pn);
|
||||
if( value == null || value == obj)
|
||||
jb.valueNull();
|
||||
else
|
||||
writeValue(value, jb, writeClass);
|
||||
}
|
||||
if (writeClass) {
|
||||
jb.objectItem(JSONVisitor.CLASS_PROPERTY);
|
||||
writeValue(obj.getClass().getName(), jb, writeClass);
|
||||
}
|
||||
jb.objectEnd();
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public Object readValue(Class<?> c, Object jv) throws IOException
|
||||
{
|
||||
if (jv == null) {
|
||||
return null;
|
||||
}
|
||||
Decoder decoder = GlobalDecoderMap.get(c);
|
||||
if( decoder != null ) {
|
||||
return decoder.decode(jv);
|
||||
}
|
||||
if (c.isEnum()) {
|
||||
return Enum.valueOf((Class<Enum>)c, String.valueOf(jv));
|
||||
}
|
||||
return jv;
|
||||
}
|
||||
|
||||
static
|
||||
{
|
||||
// init encoder map.
|
||||
Encoder e = new Encoder(){
|
||||
public void encode(Object obj, JSONWriter jb) throws IOException
|
||||
{
|
||||
jb.valueBoolean((Boolean)obj);
|
||||
}
|
||||
};
|
||||
GlobalEncoderMap.put(boolean.class, e);
|
||||
GlobalEncoderMap.put(Boolean.class, e);
|
||||
|
||||
e = new Encoder(){
|
||||
public void encode(Object obj, JSONWriter jb) throws IOException
|
||||
{
|
||||
jb.valueInt(((Number)obj).intValue());
|
||||
}
|
||||
};
|
||||
GlobalEncoderMap.put(int.class, e);
|
||||
GlobalEncoderMap.put(Integer.class, e);
|
||||
GlobalEncoderMap.put(short.class, e);
|
||||
GlobalEncoderMap.put(Short.class, e);
|
||||
GlobalEncoderMap.put(byte.class, e);
|
||||
GlobalEncoderMap.put(Byte.class, e);
|
||||
GlobalEncoderMap.put(AtomicInteger.class, e);
|
||||
|
||||
e = new Encoder(){
|
||||
public void encode(Object obj, JSONWriter jb) throws IOException
|
||||
{
|
||||
jb.valueString(Character.toString((Character)obj));
|
||||
}
|
||||
};
|
||||
GlobalEncoderMap.put(char.class, e);
|
||||
GlobalEncoderMap.put(Character.class, e);
|
||||
|
||||
e = new Encoder(){
|
||||
public void encode(Object obj, JSONWriter jb) throws IOException
|
||||
{
|
||||
jb.valueLong(((Number)obj).longValue());
|
||||
}
|
||||
};
|
||||
GlobalEncoderMap.put(long.class, e);
|
||||
GlobalEncoderMap.put(Long.class, e);
|
||||
GlobalEncoderMap.put(AtomicLong.class, e);
|
||||
GlobalEncoderMap.put(BigInteger.class, e);
|
||||
|
||||
e = new Encoder(){
|
||||
public void encode(Object obj, JSONWriter jb) throws IOException
|
||||
{
|
||||
jb.valueFloat(((Number)obj).floatValue());
|
||||
}
|
||||
};
|
||||
GlobalEncoderMap.put(float.class, e);
|
||||
GlobalEncoderMap.put(Float.class, e);
|
||||
|
||||
e = new Encoder(){
|
||||
public void encode(Object obj, JSONWriter jb) throws IOException
|
||||
{
|
||||
jb.valueDouble(((Number)obj).doubleValue());
|
||||
}
|
||||
};
|
||||
GlobalEncoderMap.put(double.class, e);
|
||||
GlobalEncoderMap.put(Double.class, e);
|
||||
GlobalEncoderMap.put(BigDecimal.class, e);
|
||||
|
||||
e = new Encoder(){
|
||||
public void encode(Object obj, JSONWriter jb) throws IOException
|
||||
{
|
||||
jb.valueString(obj.toString());
|
||||
}
|
||||
};
|
||||
GlobalEncoderMap.put(String.class, e);
|
||||
GlobalEncoderMap.put(StringBuilder.class, e);
|
||||
GlobalEncoderMap.put(StringBuffer.class, e);
|
||||
|
||||
e = new Encoder(){
|
||||
public void encode(Object obj, JSONWriter jb) throws IOException
|
||||
{
|
||||
jb.valueString(Bytes.bytes2base64((byte[])obj));
|
||||
}
|
||||
};
|
||||
GlobalEncoderMap.put(byte[].class, e);
|
||||
|
||||
e = new Encoder(){
|
||||
public void encode(Object obj, JSONWriter jb) throws IOException
|
||||
{
|
||||
jb.valueString(new SimpleDateFormat(DATE_FORMAT).format((Date)obj));
|
||||
}
|
||||
};
|
||||
GlobalEncoderMap.put(Date.class, e);
|
||||
|
||||
// init decoder map.
|
||||
Decoder d = new Decoder(){
|
||||
public Object decode(Object jv){
|
||||
return jv.toString();
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(String.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Boolean ) return ((Boolean)jv).booleanValue();
|
||||
return false;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(boolean.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Boolean ) return (Boolean)jv;
|
||||
return (Boolean)null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(Boolean.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof String && ((String)jv).length() > 0) return ((String)jv).charAt(0);
|
||||
return (char)0;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(char.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof String && ((String)jv).length() > 0) return ((String)jv).charAt(0);
|
||||
return (Character)null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(Character.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Number ) return ((Number)jv).intValue();
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(int.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Number ) return Integer.valueOf(((Number)jv).intValue());
|
||||
return (Integer)null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(Integer.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Number ) return ((Number)jv).shortValue();
|
||||
return (short)0;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(short.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Number ) return Short.valueOf(((Number)jv).shortValue());
|
||||
return (Short)null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(Short.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Number ) return ((Number)jv).longValue();
|
||||
return (long)0;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(long.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Number ) return Long.valueOf(((Number)jv).longValue());
|
||||
return (Long)null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(Long.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Number ) return ((Number)jv).floatValue();
|
||||
return (float)0;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(float.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Number ) return new Float(((Number)jv).floatValue());
|
||||
return (Float)null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(Float.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Number ) return ((Number)jv).doubleValue();
|
||||
return (double)0;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(double.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Number ) return new Double(((Number)jv).doubleValue());
|
||||
return (Double)null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(Double.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Number ) return ((Number)jv).byteValue();
|
||||
return (byte)0;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(byte.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv)
|
||||
{
|
||||
if( jv instanceof Number ) return Byte.valueOf(((Number)jv).byteValue());
|
||||
return (Byte)null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(Byte.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv) throws IOException
|
||||
{
|
||||
if( jv instanceof String ) return Bytes.base642bytes((String)jv);
|
||||
return (byte[])null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(byte[].class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv) throws IOException{ return new StringBuilder(jv.toString()); }
|
||||
};
|
||||
GlobalDecoderMap.put(StringBuilder.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv) throws IOException{ return new StringBuffer(jv.toString()); }
|
||||
};
|
||||
GlobalDecoderMap.put(StringBuffer.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv) throws IOException
|
||||
{
|
||||
if( jv instanceof Number ) return BigInteger.valueOf(((Number)jv).longValue());
|
||||
return (BigInteger)null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(BigInteger.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv) throws IOException
|
||||
{
|
||||
if( jv instanceof Number ) return BigDecimal.valueOf(((Number)jv).doubleValue());
|
||||
return (BigDecimal)null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(BigDecimal.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv) throws IOException
|
||||
{
|
||||
if( jv instanceof Number ) return new AtomicInteger(((Number)jv).intValue());
|
||||
return (AtomicInteger)null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(AtomicInteger.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv) throws IOException
|
||||
{
|
||||
if( jv instanceof Number ) return new AtomicLong(((Number)jv).longValue());
|
||||
return (AtomicLong)null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(AtomicLong.class, d);
|
||||
|
||||
d = new Decoder(){
|
||||
public Object decode(Object jv) throws IOException
|
||||
{
|
||||
if( jv instanceof String ) {
|
||||
try {
|
||||
return new SimpleDateFormat(DATE_FORMAT).parse((String) jv);
|
||||
} catch (ParseException e) {
|
||||
throw new IllegalArgumentException(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
if( jv instanceof Number )
|
||||
return new Date(((Number)jv).longValue());
|
||||
return (Date)null;
|
||||
}
|
||||
};
|
||||
GlobalDecoderMap.put(Date.class, d);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,408 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Array;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
import com.alibaba.dubbo.common.bytecode.Wrapper;
|
||||
import com.alibaba.dubbo.common.utils.Stack;
|
||||
import com.alibaba.dubbo.common.utils.StringUtils;
|
||||
|
||||
/**
|
||||
* JSON to Object visitor.
|
||||
*
|
||||
* @author qian.lei.
|
||||
*/
|
||||
|
||||
class J2oVisitor implements JSONVisitor
|
||||
{
|
||||
public static final boolean[] EMPTY_BOOL_ARRAY = new boolean[0];
|
||||
|
||||
public static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
|
||||
|
||||
public static final char[] EMPTY_CHAR_ARRAY = new char[0];
|
||||
|
||||
public static final short[] EMPTY_SHORT_ARRAY = new short[0];
|
||||
|
||||
public static final int[] EMPTY_INT_ARRAY = new int[0];
|
||||
|
||||
public static final long[] EMPTY_LONG_ARRAY = new long[0];
|
||||
|
||||
public static final float[] EMPTY_FLOAT_ARRAY = new float[0];
|
||||
|
||||
public static final double[] EMPTY_DOUBLE_ARRAY = new double[0];
|
||||
|
||||
public static final String[] EMPTY_STRING_ARRAY = new String[0];
|
||||
|
||||
private Class<?>[] mTypes;
|
||||
|
||||
private Class<?> mType = Object[].class;
|
||||
|
||||
private Object mValue;
|
||||
|
||||
private Wrapper mWrapper;
|
||||
|
||||
private JSONConverter mConverter;
|
||||
|
||||
private Stack<Object> mStack = new Stack<Object>();
|
||||
|
||||
J2oVisitor(Class<?> type, JSONConverter jc)
|
||||
{
|
||||
mType = type;
|
||||
mConverter = jc;
|
||||
}
|
||||
|
||||
J2oVisitor(Class<?>[] types, JSONConverter jc)
|
||||
{
|
||||
mTypes = types;
|
||||
mConverter = jc;
|
||||
}
|
||||
|
||||
public void begin()
|
||||
{}
|
||||
|
||||
public Object end(Object obj, boolean isValue) throws ParseException
|
||||
{
|
||||
mStack.clear();
|
||||
try {
|
||||
return mConverter.readValue(mType, obj);
|
||||
} catch (IOException e) {
|
||||
throw new IllegalStateException(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
public void objectBegin() throws ParseException
|
||||
{
|
||||
mStack.push(mValue);
|
||||
mStack.push(mType);
|
||||
mStack.push(mWrapper);
|
||||
|
||||
if( mType == Object.class || Map.class.isAssignableFrom(mType) )
|
||||
{
|
||||
if (! mType.isInterface() && mType != Object.class) {
|
||||
try {
|
||||
mValue = mType.newInstance();
|
||||
} catch (Exception e) {
|
||||
throw new IllegalStateException(e.getMessage(), e);
|
||||
}
|
||||
} else if (mType == ConcurrentMap.class) {
|
||||
mValue = new ConcurrentHashMap<String, Object>();
|
||||
} else {
|
||||
mValue = new HashMap<String, Object>();
|
||||
}
|
||||
mWrapper = null;
|
||||
} else {
|
||||
try {
|
||||
mValue = mType.newInstance();
|
||||
mWrapper = Wrapper.getWrapper(mType);
|
||||
} catch(IllegalAccessException e){
|
||||
throw new ParseException(StringUtils.toString(e));
|
||||
} catch(InstantiationException e){
|
||||
throw new ParseException(StringUtils.toString(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Object objectEnd(int count)
|
||||
{
|
||||
Object ret = mValue;
|
||||
mWrapper = (Wrapper)mStack.pop();
|
||||
mType = (Class<?>)mStack.pop();
|
||||
mValue = mStack.pop();
|
||||
return ret;
|
||||
}
|
||||
|
||||
public void objectItem(String name)
|
||||
{
|
||||
mStack.push(name); // push name.
|
||||
mType = ( mWrapper == null ? Object.class : mWrapper.getPropertyType(name) );
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void objectItemValue(Object obj, boolean isValue) throws ParseException
|
||||
{
|
||||
String name = (String)mStack.pop(); // pop name.
|
||||
if( mWrapper == null )
|
||||
{
|
||||
((Map<String, Object>)mValue).put(name, obj);
|
||||
}
|
||||
else
|
||||
{
|
||||
if( mType != null )
|
||||
{
|
||||
if( isValue && obj != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
obj = mConverter.readValue(mType, obj);
|
||||
}
|
||||
catch(IOException e)
|
||||
{
|
||||
throw new ParseException(StringUtils.toString(e));
|
||||
}
|
||||
}
|
||||
if (mValue instanceof Throwable && "message".equals(name)) {
|
||||
try {
|
||||
Field field = Throwable.class.getDeclaredField("detailMessage");
|
||||
if (! field.isAccessible()) {
|
||||
field.setAccessible(true);
|
||||
}
|
||||
field.set(mValue, obj);
|
||||
} catch (NoSuchFieldException e) {
|
||||
throw new ParseException(StringUtils.toString(e));
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new ParseException(StringUtils.toString(e));
|
||||
}
|
||||
} else if (! CLASS_PROPERTY.equals(name)) {
|
||||
mWrapper.setPropertyValue(mValue, name, obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void arrayBegin() throws ParseException
|
||||
{
|
||||
mStack.push(mType);
|
||||
|
||||
if( mType.isArray() )
|
||||
mType = mType.getComponentType();
|
||||
else if( mType == Object.class || Collection.class.isAssignableFrom(mType) )
|
||||
mType = Object.class;
|
||||
else
|
||||
throw new ParseException("Convert error, can not load json array data into class [" + mType.getName() + "].");
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Object arrayEnd(int count) throws ParseException
|
||||
{
|
||||
Object ret;
|
||||
mType = (Class<?>)mStack.get(-1-count);
|
||||
|
||||
if( mType.isArray() )
|
||||
{
|
||||
ret = toArray(mType.getComponentType(), mStack, count);
|
||||
}
|
||||
else
|
||||
{
|
||||
Collection<Object> items;
|
||||
if( mType == Object.class || Collection.class.isAssignableFrom(mType)) {
|
||||
if (! mType.isInterface() && mType != Object.class) {
|
||||
try {
|
||||
items = (Collection<Object>) mType.newInstance();
|
||||
} catch (Exception e) {
|
||||
throw new IllegalStateException(e.getMessage(), e);
|
||||
}
|
||||
} else if (mType.isAssignableFrom(ArrayList.class)) { // List
|
||||
items = new ArrayList<Object>(count);
|
||||
} else if (mType.isAssignableFrom(HashSet.class)) { // Set
|
||||
items = new HashSet<Object>(count);
|
||||
} else if (mType.isAssignableFrom(LinkedList.class)) { // Queue
|
||||
items = new LinkedList<Object>();
|
||||
} else { // Other
|
||||
items = new ArrayList<Object>(count);
|
||||
}
|
||||
} else {
|
||||
throw new ParseException("Convert error, can not load json array data into class [" + mType.getName() + "].");
|
||||
}
|
||||
for(int i=0;i<count;i++)
|
||||
items.add(mStack.remove(i-count));
|
||||
ret = items;
|
||||
}
|
||||
mStack.pop();
|
||||
return ret;
|
||||
}
|
||||
|
||||
public void arrayItem(int index) throws ParseException
|
||||
{
|
||||
if( mTypes != null && mStack.size() == index+1 )
|
||||
{
|
||||
if( index < mTypes.length )
|
||||
mType = mTypes[index];
|
||||
else
|
||||
throw new ParseException("Can not load json array data into [" + name(mTypes) + "].");
|
||||
}
|
||||
}
|
||||
|
||||
public void arrayItemValue(int index, Object obj, boolean isValue) throws ParseException
|
||||
{
|
||||
if( isValue && obj != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
obj = mConverter.readValue(mType, obj);
|
||||
}
|
||||
catch(IOException e)
|
||||
{
|
||||
throw new ParseException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
mStack.push(obj);
|
||||
}
|
||||
|
||||
private static Object toArray(Class<?> c, Stack<Object> list, int len) throws ParseException
|
||||
{
|
||||
if( c == String.class )
|
||||
{
|
||||
if( len == 0 )
|
||||
{
|
||||
return EMPTY_STRING_ARRAY;
|
||||
}
|
||||
else
|
||||
{
|
||||
Object o;
|
||||
String ss[] = new String[len];
|
||||
for(int i=len-1;i>=0;i--)
|
||||
{
|
||||
o = list.pop();
|
||||
ss[i] = ( o == null ? null : o.toString() );
|
||||
}
|
||||
return ss;
|
||||
}
|
||||
}
|
||||
if( c == boolean.class )
|
||||
{
|
||||
if( len == 0 ) return EMPTY_BOOL_ARRAY;
|
||||
Object o;
|
||||
boolean[] ret = new boolean[len];
|
||||
for(int i=len-1;i>=0;i--)
|
||||
{
|
||||
o = list.pop();
|
||||
if( o instanceof Boolean )
|
||||
ret[i] = ((Boolean)o).booleanValue();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
if( c == int.class )
|
||||
{
|
||||
if( len == 0 ) return EMPTY_INT_ARRAY;
|
||||
Object o;
|
||||
int[] ret = new int[len];
|
||||
for(int i=len-1;i>=0;i--)
|
||||
{
|
||||
o = list.pop();
|
||||
if( o instanceof Number )
|
||||
ret[i] = ((Number)o).intValue();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
if( c == long.class )
|
||||
{
|
||||
if( len == 0 ) return EMPTY_LONG_ARRAY;
|
||||
Object o;
|
||||
long[] ret = new long[len];
|
||||
for(int i=len-1;i>=0;i--)
|
||||
{
|
||||
o = list.pop();
|
||||
if( o instanceof Number )
|
||||
ret[i] = ((Number)o).longValue();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
if( c == float.class )
|
||||
{
|
||||
if( len == 0 ) return EMPTY_FLOAT_ARRAY;
|
||||
Object o;
|
||||
float[] ret = new float[len];
|
||||
for(int i=len-1;i>=0;i--)
|
||||
{
|
||||
o = list.pop();
|
||||
if( o instanceof Number )
|
||||
ret[i] = ((Number)o).floatValue();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
if( c == double.class )
|
||||
{
|
||||
if( len == 0 ) return EMPTY_DOUBLE_ARRAY;
|
||||
Object o;
|
||||
double[] ret = new double[len];
|
||||
for(int i=len-1;i>=0;i--)
|
||||
{
|
||||
o = list.pop();
|
||||
if( o instanceof Number )
|
||||
ret[i] = ((Number)o).doubleValue();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
if( c == byte.class )
|
||||
{
|
||||
if( len == 0 ) return EMPTY_BYTE_ARRAY;
|
||||
Object o;
|
||||
byte[] ret = new byte[len];
|
||||
for(int i=len-1;i>=0;i--)
|
||||
{
|
||||
o = list.pop();
|
||||
if( o instanceof Number )
|
||||
ret[i] = ((Number)o).byteValue();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
if( c == char.class )
|
||||
{
|
||||
if( len == 0 ) return EMPTY_CHAR_ARRAY;
|
||||
Object o;
|
||||
char[] ret = new char[len];
|
||||
for(int i=len-1;i>=0;i--)
|
||||
{
|
||||
o = list.pop();
|
||||
if( o instanceof Character )
|
||||
ret[i] = ((Character)o).charValue();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
if( c == short.class )
|
||||
{
|
||||
if( len == 0 ) return EMPTY_SHORT_ARRAY;
|
||||
Object o;
|
||||
short[] ret = new short[len];
|
||||
for(int i=len-1;i>=0;i--)
|
||||
{
|
||||
o = list.pop();
|
||||
if( o instanceof Number )
|
||||
ret[i] = ((Number)o).shortValue();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
Object ret = Array.newInstance(c, len);
|
||||
for(int i=len-1;i>=0;i--)
|
||||
Array.set(ret, i, list.pop());
|
||||
return ret;
|
||||
}
|
||||
|
||||
private static String name(Class<?>[] types)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for(int i=0;i<types.length;i++)
|
||||
{
|
||||
if( i > 0 )
|
||||
sb.append(", ");
|
||||
sb.append(types[i].getName());
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,761 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import java.io.Reader;
|
||||
import java.io.StringReader;
|
||||
import java.io.StringWriter;
|
||||
import java.io.Writer;
|
||||
|
||||
import com.alibaba.dubbo.common.bytecode.Wrapper;
|
||||
import com.alibaba.dubbo.common.utils.Stack;
|
||||
|
||||
/**
|
||||
* JSON.
|
||||
*
|
||||
* @author qian.lei
|
||||
*/
|
||||
|
||||
public class JSON
|
||||
{
|
||||
public static final char LBRACE = '{', RBRACE = '}';
|
||||
|
||||
public static final char LSQUARE = '[', RSQUARE = ']';
|
||||
|
||||
public static final char COMMA = ',', COLON = ':', QUOTE = '"';
|
||||
|
||||
public static final String NULL = "null";
|
||||
|
||||
static final JSONConverter DEFAULT_CONVERTER = new GenericJSONConverter();
|
||||
|
||||
// state.
|
||||
public static final byte END = 0, START = 1, OBJECT_ITEM = 2, OBJECT_VALUE = 3, ARRAY_ITEM = 4;
|
||||
|
||||
private static class Entry
|
||||
{
|
||||
byte state;
|
||||
Object value;
|
||||
Entry(byte s, Object v){ state = s; value = v; }
|
||||
}
|
||||
|
||||
private JSON(){}
|
||||
|
||||
/**
|
||||
* json string.
|
||||
*
|
||||
* @param obj object.
|
||||
* @return json string.
|
||||
* @throws IOException.
|
||||
*/
|
||||
public static String json(Object obj) throws IOException
|
||||
{
|
||||
if( obj == null ) return NULL;
|
||||
StringWriter sw = new StringWriter();
|
||||
try
|
||||
{
|
||||
json(obj, sw);
|
||||
return sw.getBuffer().toString();
|
||||
}
|
||||
finally{ sw.close(); }
|
||||
}
|
||||
|
||||
/**
|
||||
* write json.
|
||||
*
|
||||
* @param obj object.
|
||||
* @param writer writer.
|
||||
* @throws IOException.
|
||||
*/
|
||||
public static void json(Object obj, Writer writer) throws IOException
|
||||
{
|
||||
json(obj, writer, false);
|
||||
}
|
||||
|
||||
public static void json(Object obj, Writer writer, boolean writeClass) throws IOException
|
||||
{
|
||||
if( obj == null )
|
||||
writer.write(NULL);
|
||||
else
|
||||
json(obj, new JSONWriter(writer), writeClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* json string.
|
||||
*
|
||||
* @param obj object.
|
||||
* @param properties property name array.
|
||||
* @return json string.
|
||||
* @throws IOException.
|
||||
*/
|
||||
public static String json(Object obj, String[] properties) throws IOException
|
||||
{
|
||||
if( obj == null ) return NULL;
|
||||
StringWriter sw = new StringWriter();
|
||||
try
|
||||
{
|
||||
json(obj, properties, sw);
|
||||
return sw.getBuffer().toString();
|
||||
}
|
||||
finally{ sw.close(); }
|
||||
}
|
||||
|
||||
public static void json(Object obj, final String[] properties, Writer writer) throws IOException
|
||||
{
|
||||
json(obj, properties, writer, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* write json.
|
||||
*
|
||||
* @param obj object.
|
||||
* @param properties property name array.
|
||||
* @param writer writer.
|
||||
* @throws IOException.
|
||||
*/
|
||||
public static void json(Object obj, final String[] properties, Writer writer, boolean writeClass) throws IOException
|
||||
{
|
||||
if( obj == null )
|
||||
writer.write(NULL);
|
||||
else
|
||||
json(obj, properties, new JSONWriter(writer), writeClass);
|
||||
}
|
||||
|
||||
private static void json(Object obj, JSONWriter jb, boolean writeClass) throws IOException
|
||||
{
|
||||
if( obj == null )
|
||||
jb.valueNull();
|
||||
else
|
||||
DEFAULT_CONVERTER.writeValue(obj, jb, writeClass);
|
||||
}
|
||||
|
||||
private static void json(Object obj, String[] properties, JSONWriter jb, boolean writeClass) throws IOException
|
||||
{
|
||||
if( obj == null )
|
||||
{
|
||||
jb.valueNull();
|
||||
}
|
||||
else
|
||||
{
|
||||
Wrapper wrapper = Wrapper.getWrapper(obj.getClass());
|
||||
|
||||
Object value;
|
||||
jb.objectBegin();
|
||||
for( String prop : properties )
|
||||
{
|
||||
jb.objectItem(prop);
|
||||
value = wrapper.getPropertyValue(obj, prop);
|
||||
if( value == null )
|
||||
jb.valueNull();
|
||||
else
|
||||
DEFAULT_CONVERTER.writeValue(value, jb, writeClass);
|
||||
}
|
||||
jb.objectEnd();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* parse json.
|
||||
*
|
||||
* @param json json source.
|
||||
* @return JSONObject or JSONArray or Boolean or Long or Double or String or null
|
||||
* @throws ParseException
|
||||
*/
|
||||
public static Object parse(String json) throws ParseException
|
||||
{
|
||||
StringReader reader = new StringReader(json);
|
||||
try{ return parse(reader); }
|
||||
catch(IOException e){ throw new ParseException(e.getMessage()); }
|
||||
finally{ reader.close(); }
|
||||
}
|
||||
|
||||
/**
|
||||
* parse json.
|
||||
*
|
||||
* @param reader reader.
|
||||
* @return JSONObject or JSONArray or Boolean or Long or Double or String or null
|
||||
* @throws IOException
|
||||
* @throws ParseException
|
||||
*/
|
||||
public static Object parse(Reader reader) throws IOException, ParseException
|
||||
{
|
||||
return parse(reader, JSONToken.ANY);
|
||||
}
|
||||
|
||||
/**
|
||||
* parse json.
|
||||
*
|
||||
* @param json json string.
|
||||
* @param type target type.
|
||||
* @return result.
|
||||
* @throws ParseException
|
||||
*/
|
||||
public static <T> T parse(String json, Class<T> type) throws ParseException
|
||||
{
|
||||
StringReader reader = new StringReader(json);
|
||||
try{ return parse(reader, type); }
|
||||
catch(IOException e){ throw new ParseException(e.getMessage()); }
|
||||
finally{ reader.close(); }
|
||||
}
|
||||
|
||||
/**
|
||||
* parse json
|
||||
*
|
||||
* @param reader json source.
|
||||
* @param type target type.
|
||||
* @return result.
|
||||
* @throws IOException
|
||||
* @throws ParseException
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> T parse(Reader reader, Class<T> type) throws IOException, ParseException
|
||||
{
|
||||
return (T)parse(reader, new J2oVisitor(type, DEFAULT_CONVERTER), JSONToken.ANY);
|
||||
}
|
||||
|
||||
/**
|
||||
* parse json.
|
||||
*
|
||||
* @param json json string.
|
||||
* @param types target type array.
|
||||
* @return result.
|
||||
* @throws ParseException
|
||||
*/
|
||||
public static Object[] parse(String json, Class<?>[] types) throws ParseException
|
||||
{
|
||||
StringReader reader = new StringReader(json);
|
||||
try{ return (Object[])parse(reader, types); }
|
||||
catch(IOException e){ throw new ParseException(e.getMessage()); }
|
||||
finally{ reader.close(); }
|
||||
}
|
||||
|
||||
/**
|
||||
* parse json.
|
||||
*
|
||||
* @param reader json source.
|
||||
* @param types target type array.
|
||||
* @return result.
|
||||
* @throws IOException
|
||||
* @throws ParseException
|
||||
*/
|
||||
public static Object[] parse(Reader reader, Class<?>[] types) throws IOException, ParseException
|
||||
{
|
||||
return (Object[])parse(reader, new J2oVisitor(types, DEFAULT_CONVERTER), JSONToken.LSQUARE);
|
||||
}
|
||||
|
||||
/**
|
||||
* parse json.
|
||||
*
|
||||
* @param json json string.
|
||||
* @param handler handler.
|
||||
* @return result.
|
||||
* @throws ParseException
|
||||
*/
|
||||
public static Object parse(String json, JSONVisitor handler) throws ParseException
|
||||
{
|
||||
StringReader reader = new StringReader(json);
|
||||
try{ return parse(reader, handler); }
|
||||
catch(IOException e){ throw new ParseException(e.getMessage()); }
|
||||
finally{ reader.close(); }
|
||||
}
|
||||
|
||||
/**
|
||||
* parse json.
|
||||
*
|
||||
* @param reader json source.
|
||||
* @param handler handler.
|
||||
* @return resule.
|
||||
* @throws IOException
|
||||
* @throws ParseException
|
||||
*/
|
||||
public static Object parse(Reader reader, JSONVisitor handler) throws IOException, ParseException
|
||||
{
|
||||
return parse(reader, handler, JSONToken.ANY);
|
||||
}
|
||||
|
||||
private static Object parse(Reader reader, int expect) throws IOException, ParseException
|
||||
{
|
||||
JSONReader jr = new JSONReader(reader);
|
||||
JSONToken token = jr.nextToken(expect);
|
||||
|
||||
byte state = START;
|
||||
Object value = null, tmp;
|
||||
Stack<Entry> stack = new Stack<Entry>();
|
||||
|
||||
do
|
||||
{
|
||||
switch( state )
|
||||
{
|
||||
case END:
|
||||
throw new ParseException("JSON source format error.");
|
||||
case START:
|
||||
{
|
||||
switch( token.type )
|
||||
{
|
||||
case JSONToken.NULL: case JSONToken.BOOL: case JSONToken.INT: case JSONToken.FLOAT: case JSONToken.STRING:
|
||||
{
|
||||
state = END;
|
||||
value = token.value;
|
||||
break;
|
||||
}
|
||||
case JSONToken.LSQUARE:
|
||||
{
|
||||
state = ARRAY_ITEM;
|
||||
value = new JSONArray();
|
||||
break;
|
||||
}
|
||||
case JSONToken.LBRACE:
|
||||
{
|
||||
state = OBJECT_ITEM;
|
||||
value = new JSONObject();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new ParseException("Unexcepted token expect [ VALUE or '[' or '{' ] get '" + JSONToken.token2string(token.type) + "'");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ARRAY_ITEM:
|
||||
{
|
||||
switch( token.type )
|
||||
{
|
||||
case JSONToken.COMMA:
|
||||
break;
|
||||
case JSONToken.NULL: case JSONToken.BOOL: case JSONToken.INT: case JSONToken.FLOAT: case JSONToken.STRING:
|
||||
{
|
||||
((JSONArray)value).add(token.value);
|
||||
break;
|
||||
}
|
||||
case JSONToken.RSQUARE: // end of array.
|
||||
{
|
||||
if( stack.isEmpty() )
|
||||
{
|
||||
state = END;
|
||||
}
|
||||
else
|
||||
{
|
||||
Entry entry = stack.pop();
|
||||
state = entry.state;
|
||||
value = entry.value;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JSONToken.LSQUARE: // array begin.
|
||||
{
|
||||
tmp = new JSONArray();
|
||||
((JSONArray)value).add(tmp);
|
||||
stack.push(new Entry(state, value));
|
||||
|
||||
state = ARRAY_ITEM;
|
||||
value = tmp;
|
||||
break;
|
||||
}
|
||||
case JSONToken.LBRACE: // object begin.
|
||||
{
|
||||
tmp = new JSONObject();
|
||||
((JSONArray)value).add(tmp);
|
||||
stack.push(new Entry(state, value));
|
||||
|
||||
state = OBJECT_ITEM;
|
||||
value = tmp;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new ParseException("Unexcepted token expect [ VALUE or ',' or ']' or '[' or '{' ] get '" + JSONToken.token2string(token.type) + "'");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OBJECT_ITEM:
|
||||
{
|
||||
switch( token.type )
|
||||
{
|
||||
case JSONToken.COMMA:
|
||||
break;
|
||||
case JSONToken.IDENT: // item name.
|
||||
{
|
||||
stack.push(new Entry(OBJECT_ITEM, (String)token.value));
|
||||
state = OBJECT_VALUE;
|
||||
break;
|
||||
}
|
||||
case JSONToken.NULL:
|
||||
{
|
||||
stack.push(new Entry(OBJECT_ITEM, "null"));
|
||||
state = OBJECT_VALUE;
|
||||
break;
|
||||
}
|
||||
case JSONToken.BOOL: case JSONToken.INT: case JSONToken.FLOAT: case JSONToken.STRING:
|
||||
{
|
||||
stack.push(new Entry(OBJECT_ITEM, token.value.toString()));
|
||||
state = OBJECT_VALUE;
|
||||
break;
|
||||
}
|
||||
case JSONToken.RBRACE: // end of object.
|
||||
{
|
||||
if( stack.isEmpty() )
|
||||
{
|
||||
state = END;
|
||||
}
|
||||
else
|
||||
{
|
||||
Entry entry = stack.pop();
|
||||
state = entry.state;
|
||||
value = entry.value;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new ParseException("Unexcepted token expect [ IDENT or VALUE or ',' or '}' ] get '" + JSONToken.token2string(token.type) + "'");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OBJECT_VALUE:
|
||||
{
|
||||
switch( token.type )
|
||||
{
|
||||
case JSONToken.COLON:
|
||||
break;
|
||||
case JSONToken.NULL: case JSONToken.BOOL: case JSONToken.INT: case JSONToken.FLOAT: case JSONToken.STRING:
|
||||
{
|
||||
((JSONObject)value).put((String)stack.pop().value, token.value);
|
||||
state = OBJECT_ITEM;
|
||||
break;
|
||||
}
|
||||
case JSONToken.LSQUARE: // array begin.
|
||||
{
|
||||
tmp = new JSONArray();
|
||||
((JSONObject)value).put((String)stack.pop().value, tmp);
|
||||
stack.push(new Entry(OBJECT_ITEM, value));
|
||||
|
||||
state = ARRAY_ITEM;
|
||||
value = tmp;
|
||||
break;
|
||||
}
|
||||
case JSONToken.LBRACE: // object begin.
|
||||
{
|
||||
tmp = new JSONObject();
|
||||
((JSONObject)value).put((String)stack.pop().value, tmp);
|
||||
stack.push(new Entry(OBJECT_ITEM, value));
|
||||
|
||||
state = OBJECT_ITEM;
|
||||
value = tmp;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new ParseException("Unexcepted token expect [ VALUE or '[' or '{' ] get '" + JSONToken.token2string(token.type) + "'");
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new ParseException("Unexcepted state.");
|
||||
}
|
||||
}
|
||||
while( ( token = jr.nextToken() ) != null );
|
||||
stack.clear();
|
||||
return value;
|
||||
}
|
||||
|
||||
private static Object parse(Reader reader, JSONVisitor handler, int expect) throws IOException, ParseException
|
||||
{
|
||||
JSONReader jr = new JSONReader(reader);
|
||||
JSONToken token = jr.nextToken(expect);
|
||||
|
||||
Object value = null;
|
||||
int state = START, index = 0;
|
||||
Stack<int[]> states = new Stack<int[]>();
|
||||
boolean pv = false;
|
||||
|
||||
handler.begin();
|
||||
do
|
||||
{
|
||||
switch( state )
|
||||
{
|
||||
case END:
|
||||
throw new ParseException("JSON source format error.");
|
||||
case START:
|
||||
{
|
||||
switch( token.type )
|
||||
{
|
||||
case JSONToken.NULL:
|
||||
{
|
||||
value = token.value;
|
||||
state = END;
|
||||
pv = true;
|
||||
break;
|
||||
}
|
||||
case JSONToken.BOOL:
|
||||
{
|
||||
value = token.value;
|
||||
state = END;
|
||||
pv = true;
|
||||
break;
|
||||
}
|
||||
case JSONToken.INT:
|
||||
{
|
||||
value = token.value;
|
||||
state = END;
|
||||
pv = true;
|
||||
break;
|
||||
}
|
||||
case JSONToken.FLOAT:
|
||||
{
|
||||
value = token.value;
|
||||
state = END;
|
||||
pv = true;
|
||||
break;
|
||||
}
|
||||
case JSONToken.STRING:
|
||||
{
|
||||
value = token.value;
|
||||
state = END;
|
||||
pv = true;
|
||||
break;
|
||||
}
|
||||
case JSONToken.LSQUARE:
|
||||
{
|
||||
handler.arrayBegin();
|
||||
state = ARRAY_ITEM;
|
||||
break;
|
||||
}
|
||||
case JSONToken.LBRACE:
|
||||
{
|
||||
handler.objectBegin();
|
||||
state = OBJECT_ITEM;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new ParseException("Unexcepted token expect [ VALUE or '[' or '{' ] get '" + JSONToken.token2string(token.type) + "'");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ARRAY_ITEM:
|
||||
{
|
||||
switch( token.type )
|
||||
{
|
||||
case JSONToken.COMMA:
|
||||
break;
|
||||
case JSONToken.NULL:
|
||||
{
|
||||
handler.arrayItem(index++);
|
||||
handler.arrayItemValue(index, token.value, true);
|
||||
break;
|
||||
}
|
||||
case JSONToken.BOOL:
|
||||
{
|
||||
handler.arrayItem(index++);
|
||||
handler.arrayItemValue(index, token.value, true);
|
||||
break;
|
||||
}
|
||||
case JSONToken.INT:
|
||||
{
|
||||
handler.arrayItem(index++);
|
||||
handler.arrayItemValue(index, token.value, true);
|
||||
break;
|
||||
}
|
||||
case JSONToken.FLOAT:
|
||||
{
|
||||
handler.arrayItem(index++);
|
||||
handler.arrayItemValue(index, token.value, true);
|
||||
break;
|
||||
}
|
||||
case JSONToken.STRING:
|
||||
{
|
||||
handler.arrayItem(index++);
|
||||
handler.arrayItemValue(index, token.value, true);
|
||||
break;
|
||||
}
|
||||
case JSONToken.LSQUARE:
|
||||
{
|
||||
handler.arrayItem(index++);
|
||||
states.push(new int[]{state, index});
|
||||
|
||||
index = 0;
|
||||
state = ARRAY_ITEM;
|
||||
handler.arrayBegin();
|
||||
break;
|
||||
}
|
||||
case JSONToken.LBRACE:
|
||||
{
|
||||
handler.arrayItem(index++);
|
||||
states.push(new int[]{state, index});
|
||||
|
||||
index = 0;
|
||||
state = OBJECT_ITEM;
|
||||
handler.objectBegin();
|
||||
break;
|
||||
}
|
||||
case JSONToken.RSQUARE:
|
||||
{
|
||||
if( states.isEmpty() )
|
||||
{
|
||||
value = handler.arrayEnd(index);
|
||||
state = END;
|
||||
}
|
||||
else
|
||||
{
|
||||
value = handler.arrayEnd(index);
|
||||
int[] tmp = states.pop();
|
||||
state = tmp[0];
|
||||
index = tmp[1];
|
||||
|
||||
switch( state )
|
||||
{
|
||||
case ARRAY_ITEM:
|
||||
{
|
||||
handler.arrayItemValue(index, value, false);
|
||||
break;
|
||||
}
|
||||
case OBJECT_ITEM:
|
||||
{
|
||||
handler.objectItemValue(value, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new ParseException("Unexcepted token expect [ VALUE or ',' or ']' or '[' or '{' ] get '" + JSONToken.token2string(token.type) + "'");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OBJECT_ITEM:
|
||||
{
|
||||
switch( token.type )
|
||||
{
|
||||
case JSONToken.COMMA:
|
||||
break;
|
||||
case JSONToken.IDENT:
|
||||
{
|
||||
handler.objectItem((String)token.value);
|
||||
state = OBJECT_VALUE;
|
||||
break;
|
||||
}
|
||||
case JSONToken.NULL:
|
||||
{
|
||||
handler.objectItem("null");
|
||||
state = OBJECT_VALUE;
|
||||
break;
|
||||
}
|
||||
case JSONToken.BOOL: case JSONToken.INT: case JSONToken.FLOAT: case JSONToken.STRING:
|
||||
{
|
||||
handler.objectItem(token.value.toString());
|
||||
state = OBJECT_VALUE;
|
||||
break;
|
||||
}
|
||||
case JSONToken.RBRACE:
|
||||
{
|
||||
if( states.isEmpty() )
|
||||
{
|
||||
value = handler.objectEnd(index);
|
||||
state = END;
|
||||
}
|
||||
else
|
||||
{
|
||||
value = handler.objectEnd(index);
|
||||
int[] tmp = states.pop();
|
||||
state = tmp[0];
|
||||
index = tmp[1];
|
||||
|
||||
switch( state )
|
||||
{
|
||||
case ARRAY_ITEM:
|
||||
{
|
||||
handler.arrayItemValue(index, value, false);
|
||||
break;
|
||||
}
|
||||
case OBJECT_ITEM:
|
||||
{
|
||||
handler.objectItemValue(value, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new ParseException("Unexcepted token expect [ IDENT or VALUE or ',' or '}' ] get '" + JSONToken.token2string(token.type) + "'");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OBJECT_VALUE:
|
||||
{
|
||||
switch( token.type )
|
||||
{
|
||||
case JSONToken.COLON:
|
||||
break;
|
||||
case JSONToken.NULL:
|
||||
{
|
||||
handler.objectItemValue(token.value, true);
|
||||
state = OBJECT_ITEM;
|
||||
break;
|
||||
}
|
||||
case JSONToken.BOOL:
|
||||
{
|
||||
handler.objectItemValue(token.value, true);
|
||||
state = OBJECT_ITEM;
|
||||
break;
|
||||
}
|
||||
case JSONToken.INT:
|
||||
{
|
||||
handler.objectItemValue(token.value, true);
|
||||
state = OBJECT_ITEM;
|
||||
break;
|
||||
}
|
||||
case JSONToken.FLOAT:
|
||||
{
|
||||
handler.objectItemValue(token.value, true);
|
||||
state = OBJECT_ITEM;
|
||||
break;
|
||||
}
|
||||
case JSONToken.STRING:
|
||||
{
|
||||
handler.objectItemValue(token.value, true);
|
||||
state = OBJECT_ITEM;
|
||||
break;
|
||||
}
|
||||
case JSONToken.LSQUARE:
|
||||
{
|
||||
states.push(new int[]{OBJECT_ITEM, index});
|
||||
|
||||
index = 0;
|
||||
state = ARRAY_ITEM;
|
||||
handler.arrayBegin();
|
||||
break;
|
||||
}
|
||||
case JSONToken.LBRACE:
|
||||
{
|
||||
states.push(new int[]{OBJECT_ITEM, index});
|
||||
|
||||
index = 0;
|
||||
state = OBJECT_ITEM;
|
||||
handler.objectBegin();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new ParseException("Unexcepted token expect [ VALUE or '[' or '{' ] get '" + JSONToken.token2string(token.type) + "'");
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new ParseException("Unexcepted state.");
|
||||
}
|
||||
}
|
||||
while( ( token = jr.nextToken() ) != null );
|
||||
states.clear();
|
||||
return handler.end(value, pv);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,202 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* JSONArray.
|
||||
*
|
||||
* @author qian.lei
|
||||
*/
|
||||
|
||||
public class JSONArray implements JSONNode
|
||||
{
|
||||
private List<Object> mArray = new ArrayList<Object>();
|
||||
|
||||
/**
|
||||
* get.
|
||||
*
|
||||
* @param index index.
|
||||
* @return boolean or long or double or String or JSONArray or JSONObject or null.
|
||||
*/
|
||||
public Object get(int index)
|
||||
{
|
||||
return mArray.get(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* get boolean value.
|
||||
*
|
||||
* @param index index.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public boolean getBoolean(int index, boolean def)
|
||||
{
|
||||
Object tmp = mArray.get(index);
|
||||
return tmp != null && tmp instanceof Boolean ? ((Boolean)tmp).booleanValue() : def;
|
||||
}
|
||||
|
||||
/**
|
||||
* get int value.
|
||||
*
|
||||
* @param index index.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public int getInt(int index, int def)
|
||||
{
|
||||
Object tmp = mArray.get(index);
|
||||
return tmp != null && tmp instanceof Number ? ((Number)tmp).intValue() : def;
|
||||
}
|
||||
|
||||
/**
|
||||
* get long value.
|
||||
*
|
||||
* @param index index.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public long getLong(int index, long def)
|
||||
{
|
||||
Object tmp = mArray.get(index);
|
||||
return tmp != null && tmp instanceof Number ? ((Number)tmp).longValue() : def;
|
||||
}
|
||||
|
||||
/**
|
||||
* get float value.
|
||||
*
|
||||
* @param index index.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public float getFloat(int index, float def)
|
||||
{
|
||||
Object tmp = mArray.get(index);
|
||||
return tmp != null && tmp instanceof Number ? ((Number)tmp).floatValue() : def;
|
||||
}
|
||||
|
||||
/**
|
||||
* get double value.
|
||||
*
|
||||
* @param index index.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public double getDouble(int index, double def)
|
||||
{
|
||||
Object tmp = mArray.get(index);
|
||||
return tmp != null && tmp instanceof Number ? ((Number)tmp).doubleValue() : def;
|
||||
}
|
||||
|
||||
/**
|
||||
* get string value.
|
||||
*
|
||||
* @param index index.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public String getString(int index)
|
||||
{
|
||||
Object tmp = mArray.get(index);
|
||||
return tmp == null ? null : tmp.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* get JSONArray value.
|
||||
*
|
||||
* @param index index.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public JSONArray getArray(int index)
|
||||
{
|
||||
Object tmp = mArray.get(index);
|
||||
return tmp == null ? null : tmp instanceof JSONArray ? (JSONArray)tmp : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* get JSONObject value.
|
||||
*
|
||||
* @param index index.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public JSONObject getObject(int index)
|
||||
{
|
||||
Object tmp = mArray.get(index);
|
||||
return tmp == null ? null : tmp instanceof JSONObject ? (JSONObject)tmp : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* get array length.
|
||||
*
|
||||
* @return length.
|
||||
*/
|
||||
public int length()
|
||||
{
|
||||
return mArray.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* add item.
|
||||
*/
|
||||
public void add(Object ele)
|
||||
{
|
||||
mArray.add(ele);
|
||||
}
|
||||
|
||||
/**
|
||||
* add items.
|
||||
*/
|
||||
public void addAll(Object[] eles)
|
||||
{
|
||||
for( Object ele : eles )
|
||||
mArray.add(ele);
|
||||
}
|
||||
|
||||
/**
|
||||
* add items.
|
||||
*/
|
||||
public void addAll(Collection<?> c)
|
||||
{
|
||||
mArray.addAll(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* write json.
|
||||
*
|
||||
* @param jc json converter
|
||||
* @param jb json builder.
|
||||
* @return json string.
|
||||
*/
|
||||
public void writeJSON(JSONConverter jc, JSONWriter jb, boolean writeClass) throws IOException
|
||||
{
|
||||
jb.arrayBegin();
|
||||
for( Object item : mArray )
|
||||
{
|
||||
if( item == null )
|
||||
jb.valueNull();
|
||||
else
|
||||
jc.writeValue(item, jb, writeClass);
|
||||
}
|
||||
jb.arrayEnd();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* JSON converter.
|
||||
*
|
||||
* @author qianlei
|
||||
*/
|
||||
|
||||
public interface JSONConverter
|
||||
{
|
||||
/**
|
||||
* write object.
|
||||
*
|
||||
* @param obj obj.
|
||||
* @param builder builder.
|
||||
* @throws IOException
|
||||
*/
|
||||
void writeValue(Object obj, JSONWriter builder, boolean writeClass) throws IOException;
|
||||
|
||||
/**
|
||||
* convert json value to target class.
|
||||
*
|
||||
* @param type target type.
|
||||
* @param jv json value.
|
||||
* @return target object.
|
||||
* @throws IOException.
|
||||
*/
|
||||
Object readValue(Class<?> type, Object jv) throws IOException;
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* JSONSerializable.
|
||||
*
|
||||
* @author qian.lei
|
||||
*/
|
||||
|
||||
interface JSONNode
|
||||
{
|
||||
/**
|
||||
* write json string.
|
||||
*
|
||||
* @param jc json converter.
|
||||
* @param jb json builder.
|
||||
* @throws IOException
|
||||
*/
|
||||
void writeJSON(JSONConverter jc, JSONWriter jb, boolean writeClass) throws IOException;
|
||||
}
|
||||
|
|
@ -0,0 +1,227 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* JSONObject.
|
||||
*
|
||||
* @author qian.lei
|
||||
*/
|
||||
|
||||
public class JSONObject implements JSONNode
|
||||
{
|
||||
private Map<String,Object> mMap = new HashMap<String,Object>();
|
||||
|
||||
/**
|
||||
* get.
|
||||
*
|
||||
* @param key key.
|
||||
* @return boolean or long or double or String or JSONArray or JSONObject or null.
|
||||
*/
|
||||
public Object get(String key)
|
||||
{
|
||||
return mMap.get(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* get boolean value.
|
||||
*
|
||||
* @param key key.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public boolean getBoolean(String key, boolean def)
|
||||
{
|
||||
Object tmp = mMap.get(key);
|
||||
return tmp != null && tmp instanceof Boolean ? (Boolean)tmp : def;
|
||||
}
|
||||
|
||||
/**
|
||||
* get int value.
|
||||
*
|
||||
* @param key key.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public int getInt(String key, int def)
|
||||
{
|
||||
Object tmp = mMap.get(key);
|
||||
return tmp != null && tmp instanceof Number ? ((Number)tmp).intValue() : def;
|
||||
}
|
||||
|
||||
/**
|
||||
* get long value.
|
||||
*
|
||||
* @param key key.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public long getLong(String key, long def)
|
||||
{
|
||||
Object tmp = mMap.get(key);
|
||||
return tmp != null && tmp instanceof Number ? ((Number)tmp).longValue() : def;
|
||||
}
|
||||
|
||||
/**
|
||||
* get float value.
|
||||
*
|
||||
* @param key key.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public float getFloat(String key, float def)
|
||||
{
|
||||
Object tmp = mMap.get(key);
|
||||
return tmp != null && tmp instanceof Number ? ((Number)tmp).floatValue() : def;
|
||||
}
|
||||
|
||||
/**
|
||||
* get double value.
|
||||
*
|
||||
* @param key key.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public double getDouble(String key, double def)
|
||||
{
|
||||
Object tmp = mMap.get(key);
|
||||
return tmp != null && tmp instanceof Number ? ((Number)tmp).doubleValue() : def;
|
||||
}
|
||||
|
||||
/**
|
||||
* get string value.
|
||||
*
|
||||
* @param key key.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public String getString(String key)
|
||||
{
|
||||
Object tmp = mMap.get(key);
|
||||
return tmp == null ? null : tmp.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* get JSONArray value.
|
||||
*
|
||||
* @param key key.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public JSONArray getArray(String key)
|
||||
{
|
||||
Object tmp = mMap.get(key);
|
||||
return tmp == null ? null : tmp instanceof JSONArray ? (JSONArray)tmp : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* get JSONObject value.
|
||||
*
|
||||
* @param key key.
|
||||
* @param def default value.
|
||||
* @return value or default value.
|
||||
*/
|
||||
public JSONObject getObject(String key)
|
||||
{
|
||||
Object tmp = mMap.get(key);
|
||||
return tmp == null ? null : tmp instanceof JSONObject ? (JSONObject)tmp : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* get key iterator.
|
||||
*
|
||||
* @return key iterator.
|
||||
*/
|
||||
public Iterator<String> keys()
|
||||
{
|
||||
return mMap.keySet().iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* contains key.
|
||||
*
|
||||
* @param key key.
|
||||
* @return contains or not.
|
||||
*/
|
||||
public boolean contains(String key)
|
||||
{
|
||||
return mMap.containsKey(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* put value.
|
||||
*
|
||||
* @param name name.
|
||||
* @param value value.
|
||||
*/
|
||||
public void put(String name, Object value)
|
||||
{
|
||||
mMap.put(name, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* put all.
|
||||
*
|
||||
* @param names name array.
|
||||
* @param values value array.
|
||||
*/
|
||||
public void putAll(String[] names, Object[] values)
|
||||
{
|
||||
for(int i=0,len=Math.min(names.length, values.length);i<len;i++)
|
||||
mMap.put(names[i], values[i]);
|
||||
}
|
||||
|
||||
/**
|
||||
* put all.
|
||||
*
|
||||
* @param map map.
|
||||
*/
|
||||
public void putAll(Map<String, Object> map)
|
||||
{
|
||||
for( Map.Entry<String, Object> entry : map.entrySet() )
|
||||
mMap.put(entry.getKey(), entry.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* write json.
|
||||
*
|
||||
* @param jc json converter.
|
||||
* @param jb json builder.
|
||||
* @return json string.
|
||||
*/
|
||||
public void writeJSON(JSONConverter jc, JSONWriter jb, boolean writeClass) throws IOException
|
||||
{
|
||||
String key;
|
||||
Object value;
|
||||
jb.objectBegin();
|
||||
for( Map.Entry<String,Object> entry : mMap.entrySet() )
|
||||
{
|
||||
key = entry.getKey();
|
||||
jb.objectItem(key);
|
||||
value = entry.getValue();
|
||||
if( value == null )
|
||||
jb.valueNull();
|
||||
else
|
||||
jc.writeValue(value, jb, writeClass);
|
||||
}
|
||||
jb.objectEnd();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
/**
|
||||
* JSON reader.
|
||||
*
|
||||
* @author qian.lei
|
||||
*/
|
||||
|
||||
public class JSONReader
|
||||
{
|
||||
private static ThreadLocal<Yylex> LOCAL_LEXER = new ThreadLocal<Yylex>(){};
|
||||
|
||||
private Yylex mLex;
|
||||
|
||||
public JSONReader(InputStream is, String charset) throws UnsupportedEncodingException
|
||||
{
|
||||
this(new InputStreamReader(is, charset));
|
||||
}
|
||||
|
||||
public JSONReader(Reader reader)
|
||||
{
|
||||
mLex = getLexer(reader);
|
||||
}
|
||||
|
||||
public JSONToken nextToken() throws IOException, ParseException
|
||||
{
|
||||
return mLex.yylex();
|
||||
}
|
||||
|
||||
public JSONToken nextToken(int expect) throws IOException, ParseException
|
||||
{
|
||||
JSONToken ret = mLex.yylex();
|
||||
if( ret == null )
|
||||
throw new ParseException("EOF error.");
|
||||
if( expect != JSONToken.ANY && expect != ret.type )
|
||||
throw new ParseException("Unexcepted token.");
|
||||
return ret;
|
||||
}
|
||||
|
||||
private static Yylex getLexer(Reader reader)
|
||||
{
|
||||
Yylex ret = LOCAL_LEXER.get();
|
||||
if( ret == null )
|
||||
{
|
||||
ret = new Yylex(reader);
|
||||
LOCAL_LEXER.set(ret);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret.yyreset(reader);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
/**
|
||||
* JSONToken.
|
||||
*
|
||||
* @author qian.lei
|
||||
*/
|
||||
|
||||
public class JSONToken
|
||||
{
|
||||
// token type
|
||||
public static final int ANY = 0, IDENT = 0x01, LBRACE = 0x02, LSQUARE = 0x03, RBRACE = 0x04, RSQUARE = 0x05, COMMA = 0x06, COLON = 0x07;
|
||||
|
||||
public static final int NULL = 0x10, BOOL = 0x11, INT = 0x12, FLOAT = 0x13, STRING = 0x14, ARRAY = 0x15, OBJECT = 0x16;
|
||||
|
||||
public final int type;
|
||||
|
||||
public final Object value;
|
||||
|
||||
JSONToken(int t)
|
||||
{
|
||||
this(t, null);
|
||||
}
|
||||
|
||||
JSONToken(int t, Object v)
|
||||
{
|
||||
type = t;
|
||||
value = v;
|
||||
}
|
||||
|
||||
static String token2string(int t)
|
||||
{
|
||||
switch( t )
|
||||
{
|
||||
case LBRACE: return "{";
|
||||
case RBRACE: return "}";
|
||||
case LSQUARE: return "[";
|
||||
case RSQUARE: return "]";
|
||||
case COMMA: return ",";
|
||||
case COLON: return ":";
|
||||
case IDENT: return "IDENT";
|
||||
case NULL: return "NULL";
|
||||
case BOOL: return "BOOL VALUE";
|
||||
case INT: return "INT VALUE";
|
||||
case FLOAT: return "FLOAT VALUE";
|
||||
case STRING: return "STRING VALUE";
|
||||
default: return "ANY";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
/**
|
||||
* JSONVisitor.
|
||||
*
|
||||
* @author qian.lei
|
||||
*/
|
||||
|
||||
public interface JSONVisitor
|
||||
{
|
||||
public static final String CLASS_PROPERTY = "class";
|
||||
|
||||
/**
|
||||
* parse begin .
|
||||
*/
|
||||
void begin();
|
||||
|
||||
/**
|
||||
* parse end.
|
||||
*
|
||||
* @param obj root obj.
|
||||
* @param isValue is json value.
|
||||
* @return parse result.
|
||||
* @throws ParseException
|
||||
*/
|
||||
Object end(Object obj, boolean isValue) throws ParseException;
|
||||
|
||||
/**
|
||||
* object begin.
|
||||
*
|
||||
* @throws ParseException
|
||||
*/
|
||||
void objectBegin() throws ParseException;
|
||||
|
||||
/**
|
||||
* object end, return object value.
|
||||
*
|
||||
* @param count property count.
|
||||
* @return object value.
|
||||
* @throws ParseException
|
||||
*/
|
||||
Object objectEnd(int count) throws ParseException;
|
||||
|
||||
/**
|
||||
* object property name.
|
||||
*
|
||||
* @param name name.
|
||||
* @throws ParseException
|
||||
*/
|
||||
void objectItem(String name) throws ParseException;
|
||||
|
||||
/**
|
||||
* object property value.
|
||||
*
|
||||
* @param obj obj.
|
||||
* @param isValue is json value.
|
||||
* @throws ParseException
|
||||
*/
|
||||
void objectItemValue(Object obj, boolean isValue) throws ParseException;
|
||||
|
||||
/**
|
||||
* array begin.
|
||||
*
|
||||
* @throws ParseException
|
||||
*/
|
||||
void arrayBegin() throws ParseException;
|
||||
|
||||
/**
|
||||
* array end, return array value.
|
||||
*
|
||||
* @param count count.
|
||||
* @return array value.
|
||||
* @throws ParseException
|
||||
*/
|
||||
Object arrayEnd(int count) throws ParseException;
|
||||
|
||||
/**
|
||||
* array item.
|
||||
*
|
||||
* @param index index.
|
||||
* @throws ParseException
|
||||
*/
|
||||
void arrayItem(int index) throws ParseException;
|
||||
|
||||
/**
|
||||
* array item.
|
||||
*
|
||||
* @param index index.
|
||||
* @param obj item.
|
||||
* @param isValue is json value.
|
||||
* @throws ParseException
|
||||
*/
|
||||
void arrayItemValue(int index, Object obj, boolean isValue) throws ParseException;
|
||||
}
|
||||
|
|
@ -0,0 +1,325 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.io.Writer;
|
||||
|
||||
import com.alibaba.dubbo.common.utils.Stack;
|
||||
|
||||
/**
|
||||
* JSON Writer.
|
||||
*
|
||||
* w.objectBegin().objectItem("name").valueString("qianlei").objectEnd() = {name:"qianlei"}.
|
||||
*
|
||||
* @author qian.lei
|
||||
*/
|
||||
|
||||
public class JSONWriter
|
||||
{
|
||||
private static final byte UNKNOWN = 0, ARRAY = 1, OBJECT = 2, OBJECT_VALUE = 3;
|
||||
|
||||
private static class State
|
||||
{
|
||||
private byte type;
|
||||
private int itemCount = 0;
|
||||
|
||||
State(byte t){ type = t; }
|
||||
}
|
||||
|
||||
private Writer mWriter;
|
||||
|
||||
private State mState = new State(UNKNOWN);
|
||||
|
||||
private Stack<State> mStack = new Stack<State>();
|
||||
|
||||
public JSONWriter(Writer writer)
|
||||
{
|
||||
mWriter = writer;
|
||||
}
|
||||
|
||||
public JSONWriter(OutputStream is, String charset) throws UnsupportedEncodingException
|
||||
{
|
||||
mWriter = new OutputStreamWriter(is, charset);
|
||||
}
|
||||
|
||||
/**
|
||||
* object begin.
|
||||
*
|
||||
* @return this.
|
||||
* @throws IOException.
|
||||
*/
|
||||
public JSONWriter objectBegin() throws IOException
|
||||
{
|
||||
beforeValue();
|
||||
|
||||
mWriter.write(JSON.LBRACE);
|
||||
mStack.push(mState);
|
||||
mState = new State(OBJECT);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* object end.
|
||||
*
|
||||
* @return this.
|
||||
* @throws IOException.
|
||||
*/
|
||||
public JSONWriter objectEnd() throws IOException
|
||||
{
|
||||
mWriter.write(JSON.RBRACE);
|
||||
mState = mStack.pop();
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* object item.
|
||||
*
|
||||
* @param name name.
|
||||
* @return this.
|
||||
* @throws IOException.
|
||||
*/
|
||||
public JSONWriter objectItem(String name) throws IOException
|
||||
{
|
||||
beforeObjectItem();
|
||||
|
||||
mWriter.write(JSON.QUOTE);
|
||||
mWriter.write(escape(name));
|
||||
mWriter.write(JSON.QUOTE);
|
||||
mWriter.write(JSON.COLON);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* array begin.
|
||||
*
|
||||
* @return this.
|
||||
* @throws IOException.
|
||||
*/
|
||||
public JSONWriter arrayBegin() throws IOException
|
||||
{
|
||||
beforeValue();
|
||||
|
||||
mWriter.write(JSON.LSQUARE);
|
||||
mStack.push(mState);
|
||||
mState = new State(ARRAY);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* array end, return array value.
|
||||
*
|
||||
* @return this.
|
||||
* @throws IOException.
|
||||
*/
|
||||
public JSONWriter arrayEnd() throws IOException
|
||||
{
|
||||
mWriter.write(JSON.RSQUARE);
|
||||
mState = mStack.pop();
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* value.
|
||||
*
|
||||
* @return this.
|
||||
* @throws IOException.
|
||||
*/
|
||||
public JSONWriter valueNull() throws IOException
|
||||
{
|
||||
beforeValue();
|
||||
|
||||
mWriter.write(JSON.NULL);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* value.
|
||||
*
|
||||
* @param value value.
|
||||
* @return this.
|
||||
* @throws IOException
|
||||
*/
|
||||
public JSONWriter valueString(String value) throws IOException
|
||||
{
|
||||
beforeValue();
|
||||
|
||||
mWriter.write(JSON.QUOTE);
|
||||
mWriter.write(escape(value));
|
||||
mWriter.write(JSON.QUOTE);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* value.
|
||||
*
|
||||
* @param value value.
|
||||
* @return this.
|
||||
* @throws IOException
|
||||
*/
|
||||
public JSONWriter valueBoolean(boolean value) throws IOException
|
||||
{
|
||||
beforeValue();
|
||||
|
||||
mWriter.write(value ? "true" : "false");
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* value.
|
||||
*
|
||||
* @param value value.
|
||||
* @return this.
|
||||
* @throws IOException
|
||||
*/
|
||||
public JSONWriter valueInt(int value) throws IOException
|
||||
{
|
||||
beforeValue();
|
||||
|
||||
mWriter.write(String.valueOf(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* value.
|
||||
*
|
||||
* @param value value.
|
||||
* @return this.
|
||||
* @throws IOException
|
||||
*/
|
||||
public JSONWriter valueLong(long value) throws IOException
|
||||
{
|
||||
beforeValue();
|
||||
|
||||
mWriter.write(String.valueOf(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* value.
|
||||
*
|
||||
* @param value value.
|
||||
* @return this.
|
||||
* @throws IOException
|
||||
*/
|
||||
public JSONWriter valueFloat(float value) throws IOException
|
||||
{
|
||||
beforeValue();
|
||||
|
||||
mWriter.write(String.valueOf(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* value.
|
||||
*
|
||||
* @param value value.
|
||||
* @return this.
|
||||
* @throws IOException
|
||||
*/
|
||||
public JSONWriter valueDouble(double value) throws IOException
|
||||
{
|
||||
beforeValue();
|
||||
|
||||
mWriter.write(String.valueOf(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
private void beforeValue() throws IOException
|
||||
{
|
||||
switch( mState.type )
|
||||
{
|
||||
case ARRAY:
|
||||
if( mState.itemCount++ > 0 )
|
||||
mWriter.write(JSON.COMMA);
|
||||
return;
|
||||
case OBJECT:
|
||||
throw new IOException("Must call objectItem first.");
|
||||
case OBJECT_VALUE:
|
||||
mState.type = OBJECT;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private void beforeObjectItem() throws IOException
|
||||
{
|
||||
switch( mState.type )
|
||||
{
|
||||
case OBJECT_VALUE:
|
||||
mWriter.write(JSON.NULL);
|
||||
case OBJECT:
|
||||
mState.type = OBJECT_VALUE;
|
||||
if( mState.itemCount++ > 0 )
|
||||
mWriter.write(JSON.COMMA);
|
||||
return;
|
||||
default:
|
||||
throw new IOException("Must call objectBegin first.");
|
||||
}
|
||||
}
|
||||
|
||||
private static final String[] CONTROL_CHAR_MAP = new String[]{
|
||||
"\\u0000","\\u0001","\\u0002","\\u0003","\\u0004","\\u0005","\\u0006","\\u0007",
|
||||
"\\b","\\t","\\n","\\u000b","\\f","\\r","\\u000e","\\u000f",
|
||||
"\\u0010","\\u0011","\\u0012","\\u0013","\\u0014","\\u0015","\\u0016","\\u0017",
|
||||
"\\u0018","\\u0019","\\u001a","\\u001b","\\u001c","\\u001d","\\u001e","\\u001f"
|
||||
};
|
||||
|
||||
private static String escape(String str)
|
||||
{
|
||||
if( str == null )
|
||||
return str;
|
||||
int len = str.length();
|
||||
if( len == 0 )
|
||||
return str;
|
||||
|
||||
char c;
|
||||
StringBuilder sb = null;
|
||||
for(int i=0;i<len;i++)
|
||||
{
|
||||
c = str.charAt(i);
|
||||
if( c < ' ' ) // control char.
|
||||
{
|
||||
if( sb == null )
|
||||
{
|
||||
sb = new StringBuilder(len<<1);
|
||||
sb.append(str,0,i);
|
||||
}
|
||||
sb.append(CONTROL_CHAR_MAP[c]);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch( c )
|
||||
{
|
||||
case '\\': case '/': case '"':
|
||||
if( sb == null )
|
||||
{
|
||||
sb = new StringBuilder(len<<1);
|
||||
sb.append(str,0,i);
|
||||
}
|
||||
sb.append('\\').append(c);
|
||||
break;
|
||||
default:
|
||||
if( sb != null )
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
return sb == null ? str : sb.toString();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
/**
|
||||
* ParseException.
|
||||
*
|
||||
* @author qian.lei
|
||||
*/
|
||||
|
||||
public class ParseException extends Exception
|
||||
{
|
||||
private static final long serialVersionUID = 8611884051738966316L;
|
||||
|
||||
public ParseException()
|
||||
{
|
||||
super();
|
||||
}
|
||||
|
||||
public ParseException(String message)
|
||||
{
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,800 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
/**
|
||||
* This class is a scanner generated by
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.3
|
||||
* on 7/3/10 3:12 AM from the specification file
|
||||
* <tt>/Users/qianlei/dev/proj/dubbo-1.1/dubbo.common/src/main/java/com/alibaba/dubbo/common/json/json.flex</tt>
|
||||
*/
|
||||
public class Yylex {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
|
||||
/** initial size of the lookahead buffer */
|
||||
private static final int ZZ_BUFFERSIZE = 16384;
|
||||
|
||||
/** lexical states */
|
||||
public static final int STR2 = 4;
|
||||
public static final int STR1 = 2;
|
||||
public static final int YYINITIAL = 0;
|
||||
|
||||
/**
|
||||
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
|
||||
* ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
|
||||
* at the beginning of a line
|
||||
* l is of the form l = 2*k, k a non negative integer
|
||||
*/
|
||||
private static final int ZZ_LEXSTATE[] = {
|
||||
0, 0, 1, 1, 2, 2
|
||||
};
|
||||
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED =
|
||||
"\11\0\1\13\1\13\2\0\1\13\22\0\1\13\1\0\1\10\1\0"+
|
||||
"\1\2\2\0\1\11\3\0\1\7\1\43\1\4\1\5\1\14\12\1"+
|
||||
"\1\44\6\0\1\33\3\3\1\6\1\32\5\2\1\34\1\2\1\36"+
|
||||
"\3\2\1\25\1\35\1\24\1\26\5\2\1\41\1\12\1\42\1\0"+
|
||||
"\1\2\1\0\1\27\1\15\2\3\1\23\1\16\5\2\1\30\1\2"+
|
||||
"\1\17\3\2\1\20\1\31\1\21\1\22\5\2\1\37\1\0\1\40"+
|
||||
"\uff82\0";
|
||||
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||
|
||||
/**
|
||||
* Translates DFA states to action switch labels.
|
||||
*/
|
||||
private static final int [] ZZ_ACTION = zzUnpackAction();
|
||||
|
||||
private static final String ZZ_ACTION_PACKED_0 =
|
||||
"\3\0\1\1\1\2\1\3\1\1\1\4\1\5\1\6"+
|
||||
"\6\3\1\7\1\10\1\11\1\12\1\13\1\14\1\15"+
|
||||
"\1\16\1\0\1\15\3\0\6\3\1\17\1\20\1\21"+
|
||||
"\1\22\1\23\1\24\1\25\1\26\1\0\1\27\2\30"+
|
||||
"\1\0\6\3\1\0\1\3\1\31\1\32\1\3\1\0"+
|
||||
"\1\33\1\0\1\34";
|
||||
|
||||
private static int [] zzUnpackAction() {
|
||||
int [] result = new int[63];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAction(String packed, int offset, int [] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do result[j++] = value; while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Translates a state to a row index in the transition table
|
||||
*/
|
||||
private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
|
||||
private static final String ZZ_ROWMAP_PACKED_0 =
|
||||
"\0\0\0\45\0\112\0\157\0\224\0\271\0\336\0\157"+
|
||||
"\0\157\0\u0103\0\u0128\0\u014d\0\u0172\0\u0197\0\u01bc\0\u01e1"+
|
||||
"\0\157\0\157\0\157\0\157\0\157\0\157\0\u0206\0\157"+
|
||||
"\0\u022b\0\u0250\0\u0275\0\u029a\0\u02bf\0\u02e4\0\u0309\0\u032e"+
|
||||
"\0\u0353\0\u0378\0\u039d\0\157\0\157\0\157\0\157\0\157"+
|
||||
"\0\157\0\157\0\157\0\u03c2\0\157\0\u03e7\0\u040c\0\u040c"+
|
||||
"\0\u0431\0\u0456\0\u047b\0\u04a0\0\u04c5\0\u04ea\0\u050f\0\u0534"+
|
||||
"\0\271\0\271\0\u0559\0\u057e\0\271\0\u05a3\0\157";
|
||||
|
||||
private static int [] zzUnpackRowMap() {
|
||||
int [] result = new int[63];
|
||||
int offset = 0;
|
||||
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackRowMap(String packed, int offset, int [] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int high = packed.charAt(i++) << 16;
|
||||
result[j++] = high | packed.charAt(i++);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int ZZ_TRANS [] = {
|
||||
3, 4, 5, 5, 6, 3, 5, 3, 7, 8,
|
||||
3, 9, 3, 5, 10, 11, 5, 12, 5, 5,
|
||||
13, 5, 5, 5, 5, 5, 14, 5, 5, 5,
|
||||
15, 16, 17, 18, 19, 20, 21, 22, 22, 22,
|
||||
22, 22, 22, 22, 22, 23, 22, 24, 22, 22,
|
||||
22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
|
||||
22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
|
||||
22, 22, 22, 22, 25, 25, 25, 25, 25, 25,
|
||||
25, 25, 25, 23, 26, 25, 25, 25, 25, 25,
|
||||
25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
|
||||
25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
|
||||
25, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, 4,
|
||||
-1, -1, -1, 27, 28, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, 28, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, 5, 5, 5, -1,
|
||||
-1, 5, -1, -1, -1, -1, -1, -1, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, -1, -1, -1, -1,
|
||||
-1, -1, -1, 4, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
9, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, 5, 5, 5,
|
||||
-1, -1, 5, -1, -1, -1, -1, -1, -1, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 29,
|
||||
5, 5, 5, 5, 5, 5, 5, -1, -1, -1,
|
||||
-1, -1, -1, -1, 5, 5, 5, -1, -1, 5,
|
||||
-1, -1, -1, -1, -1, -1, 5, 5, 5, 5,
|
||||
5, 30, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, -1, -1, -1, -1, -1, -1,
|
||||
-1, 5, 5, 5, -1, -1, 5, -1, -1, -1,
|
||||
-1, -1, -1, 5, 5, 5, 31, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, -1, -1, -1, -1, -1, -1, -1, 5, 5,
|
||||
5, -1, -1, 5, -1, -1, -1, -1, -1, -1,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 32, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, -1, -1,
|
||||
-1, -1, -1, -1, -1, 5, 5, 5, -1, -1,
|
||||
5, -1, -1, -1, -1, -1, -1, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 33, 5, 5, 5, -1, -1, -1, -1, -1,
|
||||
-1, -1, 5, 5, 5, -1, -1, 5, -1, -1,
|
||||
-1, -1, -1, -1, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 34, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, -1, -1, -1, -1, -1, -1, 22, 22,
|
||||
22, 22, 22, 22, 22, 22, -1, 22, -1, 22,
|
||||
22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
|
||||
22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
|
||||
22, 22, 22, 22, 22, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, 35, -1, 36, -1, 37, 38, 39,
|
||||
40, 41, 42, 43, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, 25, 25, 25, 25, 25, 25, 25, 25,
|
||||
25, -1, -1, 25, 25, 25, 25, 25, 25, 25,
|
||||
25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
|
||||
25, 25, 25, 25, 25, 25, 25, 25, 25, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, 44, 36,
|
||||
-1, 37, 38, 39, 40, 41, 42, 43, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, 45, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, 46, -1, -1, 47, -1, -1,
|
||||
47, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, 5, 5, 5, -1, -1, 5, -1, -1, -1,
|
||||
-1, -1, -1, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 48, 5, 5, 5, 5, 5,
|
||||
5, -1, -1, -1, -1, -1, -1, -1, 5, 5,
|
||||
5, -1, -1, 5, -1, -1, -1, -1, -1, -1,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 49, 5, 5, 5, 5, 5, 5, -1, -1,
|
||||
-1, -1, -1, -1, -1, 5, 5, 5, -1, -1,
|
||||
5, -1, -1, -1, -1, -1, -1, 5, 5, 5,
|
||||
5, 5, 50, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, -1, -1, -1, -1, -1,
|
||||
-1, -1, 5, 5, 5, -1, -1, 5, -1, -1,
|
||||
-1, -1, -1, -1, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 51, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, -1, -1, -1, -1, -1, -1, -1, 5,
|
||||
5, 5, -1, -1, 5, -1, -1, -1, -1, -1,
|
||||
-1, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 52, 5, 5, -1,
|
||||
-1, -1, -1, -1, -1, -1, 5, 5, 5, -1,
|
||||
-1, 5, -1, -1, -1, -1, -1, -1, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 53, 5, 5, -1, -1, -1, -1,
|
||||
-1, -1, -1, 54, -1, 54, -1, -1, 54, -1,
|
||||
-1, -1, -1, -1, -1, 54, 54, -1, -1, -1,
|
||||
-1, 54, -1, -1, -1, 54, -1, -1, 54, 54,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
45, -1, -1, -1, -1, 28, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, 28, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, 46, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, 5, 5, 5, -1, -1, 5,
|
||||
-1, -1, -1, -1, -1, -1, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 55, 5,
|
||||
5, 5, 5, 5, -1, -1, -1, -1, -1, -1,
|
||||
-1, 5, 5, 5, -1, -1, 5, -1, -1, -1,
|
||||
-1, -1, -1, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 56, 5, 5, 5, 5, 5,
|
||||
5, -1, -1, -1, -1, -1, -1, -1, 5, 5,
|
||||
5, -1, -1, 5, -1, -1, -1, -1, -1, -1,
|
||||
5, 5, 5, 5, 5, 5, 57, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, -1, -1,
|
||||
-1, -1, -1, -1, -1, 5, 5, 5, -1, -1,
|
||||
57, -1, -1, -1, -1, -1, -1, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, -1, -1, -1, -1, -1,
|
||||
-1, -1, 5, 5, 5, -1, -1, 5, -1, -1,
|
||||
-1, -1, -1, -1, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
58, 5, -1, -1, -1, -1, -1, -1, -1, 5,
|
||||
5, 5, -1, -1, 5, -1, -1, -1, -1, -1,
|
||||
-1, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 56, 5, 5, -1,
|
||||
-1, -1, -1, -1, -1, -1, 59, -1, 59, -1,
|
||||
-1, 59, -1, -1, -1, -1, -1, -1, 59, 59,
|
||||
-1, -1, -1, -1, 59, -1, -1, -1, 59, -1,
|
||||
-1, 59, 59, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, 5, 5, 5, -1, -1, 5, -1,
|
||||
-1, -1, -1, -1, -1, 5, 5, 5, 5, 5,
|
||||
5, 60, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, -1, -1, -1, -1, -1, -1, -1,
|
||||
5, 5, 5, -1, -1, 60, -1, -1, -1, -1,
|
||||
-1, -1, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
-1, -1, -1, -1, -1, -1, -1, 61, -1, 61,
|
||||
-1, -1, 61, -1, -1, -1, -1, -1, -1, 61,
|
||||
61, -1, -1, -1, -1, 61, -1, -1, -1, 61,
|
||||
-1, -1, 61, 61, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, 62, -1, 62, -1, -1, 62,
|
||||
-1, -1, -1, -1, -1, -1, 62, 62, -1, -1,
|
||||
-1, -1, 62, -1, -1, -1, 62, -1, -1, 62,
|
||||
62, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
};
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = {
|
||||
"Unkown internal scanner error",
|
||||
"Error: could not match input",
|
||||
"Error: pushback value was too large"
|
||||
};
|
||||
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
*/
|
||||
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 =
|
||||
"\3\0\1\11\3\1\2\11\7\1\6\11\1\1\1\11"+
|
||||
"\1\0\1\1\3\0\6\1\10\11\1\0\1\11\2\1"+
|
||||
"\1\0\6\1\1\0\4\1\1\0\1\1\1\0\1\11";
|
||||
|
||||
private static int [] zzUnpackAttribute() {
|
||||
int [] result = new int[63];
|
||||
int offset = 0;
|
||||
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int [] result) {
|
||||
int i = 0; /* index in packed string */
|
||||
int j = offset; /* index in unpacked array */
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do result[j++] = value; while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
|
||||
/** this buffer contains the current text to be matched and is
|
||||
the source of the yytext() string */
|
||||
private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
|
||||
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
|
||||
/** endRead marks the last character in the buffer, that has been read
|
||||
from input */
|
||||
private int zzEndRead;
|
||||
|
||||
/** number of newlines encountered up to the start of the matched text */
|
||||
//private int yyline;
|
||||
|
||||
/** the number of characters up to the start of the matched text */
|
||||
//private int yychar;
|
||||
|
||||
/**
|
||||
* the number of characters from the last newline up to the start of the
|
||||
* matched text
|
||||
*/
|
||||
//private int yycolumn;
|
||||
|
||||
/**
|
||||
* zzAtBOL == true <=> the scanner is currently at the beginning of a line
|
||||
*/
|
||||
//private boolean zzAtBOL = true;
|
||||
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
|
||||
/** denotes if the user-EOF-code has already been executed */
|
||||
//private boolean zzEOFDone;
|
||||
|
||||
/* user code: */
|
||||
private StringBuffer sb;
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new scanner
|
||||
* There is also a java.io.InputStream version of this constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
Yylex(java.io.Reader in) {
|
||||
this.zzReader = in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner.
|
||||
* There is also java.io.Reader version of this constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
*/
|
||||
Yylex(java.io.InputStream in) {
|
||||
this(new java.io.InputStreamReader(in));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unpacks the compressed character translation table.
|
||||
*
|
||||
* @param packed the packed character translation table
|
||||
* @return the unpacked character translation table
|
||||
*/
|
||||
private static char [] zzUnpackCMap(String packed) {
|
||||
char [] map = new char[0x10000];
|
||||
int i = 0; /* index in packed string */
|
||||
int j = 0; /* index in unpacked array */
|
||||
while (i < 122) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do map[j++] = value; while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>false</code>, iff there was new input.
|
||||
*
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
private boolean zzRefill() throws java.io.IOException {
|
||||
|
||||
/* first: make room (if you can) */
|
||||
if (zzStartRead > 0) {
|
||||
System.arraycopy(zzBuffer, zzStartRead,
|
||||
zzBuffer, 0,
|
||||
zzEndRead-zzStartRead);
|
||||
|
||||
/* translate stored positions */
|
||||
zzEndRead-= zzStartRead;
|
||||
zzCurrentPos-= zzStartRead;
|
||||
zzMarkedPos-= zzStartRead;
|
||||
zzStartRead = 0;
|
||||
}
|
||||
|
||||
/* is the buffer big enough? */
|
||||
if (zzCurrentPos >= zzBuffer.length) {
|
||||
/* if not: blow it up */
|
||||
char newBuffer[] = new char[zzCurrentPos*2];
|
||||
System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
|
||||
zzBuffer = newBuffer;
|
||||
}
|
||||
|
||||
/* finally: fill the buffer with new input */
|
||||
int numRead = zzReader.read(zzBuffer, zzEndRead,
|
||||
zzBuffer.length-zzEndRead);
|
||||
|
||||
if (numRead > 0) {
|
||||
zzEndRead+= numRead;
|
||||
return false;
|
||||
}
|
||||
// unlikely but not impossible: read 0 characters, but not at end of stream
|
||||
if (numRead == 0) {
|
||||
int c = zzReader.read();
|
||||
if (c == -1) {
|
||||
return true;
|
||||
} else {
|
||||
zzBuffer[zzEndRead++] = (char) c;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// numRead < 0
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>ZZ_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(java.io.Reader reader) {
|
||||
zzReader = reader;
|
||||
//zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
//zzEOFDone = false;
|
||||
zzEndRead = zzStartRead = 0;
|
||||
zzCurrentPos = zzMarkedPos = 0;
|
||||
//yyline = yychar = yycolumn = 0;
|
||||
zzLexicalState = YYINITIAL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the current lexical state.
|
||||
*/
|
||||
public final int yystate() {
|
||||
return zzLexicalState;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the
|
||||
* matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch.
|
||||
* A value from 0 to yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead+pos];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos-zzStartRead;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of
|
||||
* yypushback(int) and a match-all fallback rule) this method
|
||||
* will only be called with things that "Can't Possibly Happen".
|
||||
* If this method is called, something is seriously wrong
|
||||
* (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done
|
||||
* in error fallback rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
private void zzScanError(int errorCode) {
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
}
|
||||
catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
|
||||
throw new Error(message);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again.
|
||||
* This number must not be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if ( number > yylength() )
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched,
|
||||
* the end of input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
public JSONToken yylex() throws java.io.IOException, ParseException {
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char [] zzBufferL = zzBuffer;
|
||||
char [] zzCMapL = ZZ_CMAP;
|
||||
|
||||
int [] zzTransL = ZZ_TRANS;
|
||||
int [] zzRowMapL = ZZ_ROWMAP;
|
||||
int [] zzAttrL = ZZ_ATTRIBUTE;
|
||||
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
|
||||
zzAction = -1;
|
||||
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
|
||||
zzState = ZZ_LEXSTATE[zzLexicalState];
|
||||
|
||||
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
|
||||
if (zzCurrentPosL < zzEndReadL)
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
}
|
||||
else {
|
||||
// store back cached positions
|
||||
zzCurrentPos = zzCurrentPosL;
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
boolean eof = zzRefill();
|
||||
// get translated positions and possibly new buffer
|
||||
zzCurrentPosL = zzCurrentPos;
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
zzBufferL = zzBuffer;
|
||||
zzEndReadL = zzEndRead;
|
||||
if (eof) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
}
|
||||
else {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
|
||||
if (zzNext == -1) break zzForAction;
|
||||
zzState = zzNext;
|
||||
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ( (zzAttributes & 1) == 1 ) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ( (zzAttributes & 8) == 8 ) break zzForAction;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 25:
|
||||
{ return new JSONToken(JSONToken.NULL, null);
|
||||
}
|
||||
case 29: break;
|
||||
case 13:
|
||||
{ sb.append(yytext());
|
||||
}
|
||||
case 30: break;
|
||||
case 18:
|
||||
{ sb.append('\b');
|
||||
}
|
||||
case 31: break;
|
||||
case 9:
|
||||
{ return new JSONToken(JSONToken.LSQUARE);
|
||||
}
|
||||
case 32: break;
|
||||
case 2:
|
||||
{ Long val = Long.valueOf(yytext()); return new JSONToken(JSONToken.INT, val);
|
||||
}
|
||||
case 33: break;
|
||||
case 16:
|
||||
{ sb.append('\\');
|
||||
}
|
||||
case 34: break;
|
||||
case 8:
|
||||
{ return new JSONToken(JSONToken.RBRACE);
|
||||
}
|
||||
case 35: break;
|
||||
case 26:
|
||||
{ return new JSONToken(JSONToken.BOOL, Boolean.TRUE);
|
||||
}
|
||||
case 36: break;
|
||||
case 23:
|
||||
{ sb.append('\'');
|
||||
}
|
||||
case 37: break;
|
||||
case 5:
|
||||
{ sb = new StringBuffer(); yybegin(STR2);
|
||||
}
|
||||
case 38: break;
|
||||
case 27:
|
||||
{ return new JSONToken(JSONToken.BOOL, Boolean.FALSE);
|
||||
}
|
||||
case 39: break;
|
||||
case 12:
|
||||
{ return new JSONToken(JSONToken.COLON);
|
||||
}
|
||||
case 40: break;
|
||||
case 21:
|
||||
{ sb.append('\r');
|
||||
}
|
||||
case 41: break;
|
||||
case 3:
|
||||
{ return new JSONToken(JSONToken.IDENT, yytext());
|
||||
}
|
||||
case 42: break;
|
||||
case 28:
|
||||
{ try{ sb.append((char)Integer.parseInt(yytext().substring(2),16)); }catch(Exception e){ throw new ParseException(e.getMessage()); }
|
||||
}
|
||||
case 43: break;
|
||||
case 10:
|
||||
{ return new JSONToken(JSONToken.RSQUARE);
|
||||
}
|
||||
case 44: break;
|
||||
case 17:
|
||||
{ sb.append('/');
|
||||
}
|
||||
case 45: break;
|
||||
case 11:
|
||||
{ return new JSONToken(JSONToken.COMMA);
|
||||
}
|
||||
case 46: break;
|
||||
case 15:
|
||||
{ sb.append('"');
|
||||
}
|
||||
case 47: break;
|
||||
case 24:
|
||||
{ Double val = Double.valueOf(yytext()); return new JSONToken(JSONToken.FLOAT, val);
|
||||
}
|
||||
case 48: break;
|
||||
case 1:
|
||||
{ throw new ParseException("Unexpected char [" + yytext() +"]");
|
||||
}
|
||||
case 49: break;
|
||||
case 19:
|
||||
{ sb.append('\f');
|
||||
}
|
||||
case 50: break;
|
||||
case 7:
|
||||
{ return new JSONToken(JSONToken.LBRACE);
|
||||
}
|
||||
case 51: break;
|
||||
case 14:
|
||||
{ yybegin(YYINITIAL); return new JSONToken(JSONToken.STRING, sb.toString());
|
||||
}
|
||||
case 52: break;
|
||||
case 22:
|
||||
{ sb.append('\t');
|
||||
}
|
||||
case 53: break;
|
||||
case 4:
|
||||
{ sb = new StringBuffer(); yybegin(STR1);
|
||||
}
|
||||
case 54: break;
|
||||
case 20:
|
||||
{ sb.append('\n');
|
||||
}
|
||||
case 55: break;
|
||||
case 6:
|
||||
{
|
||||
}
|
||||
case 56: break;
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
return null;
|
||||
}
|
||||
else {
|
||||
zzScanError(ZZ_NO_MATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
package com.alibaba.dubbo.common.json;
|
||||
%%
|
||||
|
||||
%{
|
||||
private StringBuffer sb;
|
||||
%}
|
||||
|
||||
%table
|
||||
%unicode
|
||||
%state STR1,STR2
|
||||
|
||||
%yylexthrow ParseException
|
||||
|
||||
HEX = [a-fA-F0-9]
|
||||
HEX4 = {HEX}{HEX}{HEX}{HEX}
|
||||
|
||||
IDENT = [a-zA-Z_$] [a-zA-Z0-9_$]*
|
||||
INT_LITERAL = [-]? [0-9]+
|
||||
FLOAT_LITERAL = {INT_LITERAL} ( ( \.[0-9]+ ) ? ( [eE][-+]? [0-9]+ )? )
|
||||
|
||||
ESC1 = [^\"\\]
|
||||
ESC2 = [^\'\\]
|
||||
|
||||
SKIP = [ \t\r\n]
|
||||
OTHERS = .
|
||||
%%
|
||||
|
||||
<STR1>{
|
||||
\" { yybegin(YYINITIAL); return new JSONToken(JSONToken.STRING, sb.toString()); }
|
||||
{ESC1}+ { sb.append(yytext()); }
|
||||
\\\" { sb.append('"'); }
|
||||
}
|
||||
|
||||
<STR2>{
|
||||
\' { yybegin(YYINITIAL); return new JSONToken(JSONToken.STRING, sb.toString()); }
|
||||
{ESC2}+ { sb.append(yytext()); }
|
||||
\\\' { sb.append('\''); }
|
||||
}
|
||||
|
||||
<STR1,STR2>{
|
||||
\\\\ { sb.append('\\'); }
|
||||
\\\/ { sb.append('/'); }
|
||||
\\b { sb.append('\b'); }
|
||||
\\f { sb.append('\f'); }
|
||||
\\n { sb.append('\n'); }
|
||||
\\r { sb.append('\r'); }
|
||||
\\t { sb.append('\t'); }
|
||||
\\u{HEX4} { try{ sb.append((char)Integer.parseInt(yytext().substring(2),16)); }catch(Exception e){ throw new ParseException(e.getMessage()); } }
|
||||
}
|
||||
|
||||
<YYINITIAL>{
|
||||
\" { sb = new StringBuffer(); yybegin(STR1); }
|
||||
\' { sb = new StringBuffer(); yybegin(STR2); }
|
||||
{INT_LITERAL} { Long val = Long.valueOf(yytext()); return new JSONToken(JSONToken.INT, val); }
|
||||
{FLOAT_LITERAL} { Double val = Double.valueOf(yytext()); return new JSONToken(JSONToken.FLOAT, val); }
|
||||
"true"|"TRUE" { return new JSONToken(JSONToken.BOOL, Boolean.TRUE); }
|
||||
"false"|"FALSE" { return new JSONToken(JSONToken.BOOL, Boolean.FALSE); }
|
||||
"null"|"NULL" { return new JSONToken(JSONToken.NULL, null); }
|
||||
{IDENT} { return new JSONToken(JSONToken.IDENT, yytext()); }
|
||||
"{" { return new JSONToken(JSONToken.LBRACE); }
|
||||
"}" { return new JSONToken(JSONToken.RBRACE); }
|
||||
"[" { return new JSONToken(JSONToken.LSQUARE); }
|
||||
"]" { return new JSONToken(JSONToken.RSQUARE); }
|
||||
"," { return new JSONToken(JSONToken.COMMA); }
|
||||
":" { return new JSONToken(JSONToken.COLON); }
|
||||
{SKIP}+ {}
|
||||
{OTHERS} { throw new ParseException("Unexpected char [" + yytext() +"]"); }
|
||||
}
|
||||
|
|
@ -30,7 +30,7 @@ import com.alibaba.dubbo.common.serialize.Serialization;
|
|||
*
|
||||
* @author william.liangf
|
||||
*/
|
||||
@Extension("fastjson,json")
|
||||
@Extension("fastjson")
|
||||
public class FastJsonSerialization implements Serialization {
|
||||
|
||||
public byte getContentTypeId() {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.serialize.support.json;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.EOFException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
import java.util.Map;
|
||||
|
||||
import com.alibaba.dubbo.common.json.JSON;
|
||||
import com.alibaba.dubbo.common.json.ParseException;
|
||||
import com.alibaba.dubbo.common.serialize.ObjectInput;
|
||||
|
||||
/**
|
||||
* JsonObjectInput
|
||||
*
|
||||
* @author william.liangf
|
||||
* @author ding.lid
|
||||
*/
|
||||
public class JsonObjectInput implements ObjectInput {
|
||||
|
||||
private final BufferedReader reader;
|
||||
|
||||
public JsonObjectInput(InputStream in){
|
||||
this(new InputStreamReader(in));
|
||||
}
|
||||
|
||||
public JsonObjectInput(Reader reader){
|
||||
this.reader = new BufferedReader(reader);
|
||||
}
|
||||
|
||||
public boolean readBool() throws IOException {
|
||||
try {
|
||||
return readObject(boolean.class);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public byte readByte() throws IOException {
|
||||
try {
|
||||
return readObject( byte.class);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public short readShort() throws IOException {
|
||||
try {
|
||||
return readObject(short.class);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public int readInt() throws IOException {
|
||||
try {
|
||||
return readObject(int.class);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public long readLong() throws IOException {
|
||||
try {
|
||||
return readObject(long.class);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public float readFloat() throws IOException {
|
||||
try {
|
||||
return readObject(float.class);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public double readDouble() throws IOException {
|
||||
try {
|
||||
return readObject(double.class);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public String readUTF() throws IOException {
|
||||
try {
|
||||
return readObject(String.class);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] readBytes() throws IOException {
|
||||
return readLine().getBytes();
|
||||
}
|
||||
|
||||
public Object readObject() throws IOException, ClassNotFoundException {
|
||||
try {
|
||||
String json = readLine();
|
||||
if (json.startsWith("{")) {
|
||||
return JSON.parse(json, Map.class);
|
||||
} else {
|
||||
json = "{\"value\":" + json + "}";
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> map = JSON.parse(json, Map.class);
|
||||
return map.get("value");
|
||||
}
|
||||
} catch (ParseException e) {
|
||||
throw new IOException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public <T> T readObject(Class<T> cls) throws IOException, ClassNotFoundException {
|
||||
try {
|
||||
return JSON.parse(readLine(), cls);
|
||||
} catch (ParseException e) {
|
||||
throw new IOException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private String readLine() throws IOException, EOFException {
|
||||
String line = reader.readLine();
|
||||
if(line == null || line.trim().length() == 0) throw new EOFException();
|
||||
return line;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.serialize.support.json;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.Writer;
|
||||
|
||||
import com.alibaba.dubbo.common.json.JSON;
|
||||
import com.alibaba.dubbo.common.serialize.ObjectOutput;
|
||||
|
||||
/**
|
||||
* JsonObjectOutput
|
||||
*
|
||||
* @author william.liangf
|
||||
*/
|
||||
public class JsonObjectOutput implements ObjectOutput {
|
||||
|
||||
private final PrintWriter writer;
|
||||
|
||||
private final boolean writeClass;
|
||||
|
||||
public JsonObjectOutput(OutputStream out) {
|
||||
this(new OutputStreamWriter(out), false);
|
||||
}
|
||||
|
||||
public JsonObjectOutput(Writer writer) {
|
||||
this(writer, false);
|
||||
}
|
||||
|
||||
public JsonObjectOutput(OutputStream out, boolean writeClass) {
|
||||
this(new OutputStreamWriter(out), writeClass);
|
||||
}
|
||||
|
||||
public JsonObjectOutput(Writer writer, boolean writeClass) {
|
||||
this.writer = new PrintWriter(writer);
|
||||
this.writeClass = writeClass;
|
||||
}
|
||||
|
||||
public void writeBool(boolean v) throws IOException {
|
||||
writeObject(v);
|
||||
}
|
||||
|
||||
public void writeByte(byte v) throws IOException {
|
||||
writeObject(v);
|
||||
}
|
||||
|
||||
public void writeShort(short v) throws IOException {
|
||||
writeObject(v);
|
||||
}
|
||||
|
||||
public void writeInt(int v) throws IOException {
|
||||
writeObject(v);
|
||||
}
|
||||
|
||||
public void writeLong(long v) throws IOException {
|
||||
writeObject(v);
|
||||
}
|
||||
|
||||
public void writeFloat(float v) throws IOException {
|
||||
writeObject(v);
|
||||
}
|
||||
|
||||
public void writeDouble(double v) throws IOException {
|
||||
writeObject(v);
|
||||
}
|
||||
|
||||
public void writeUTF(String v) throws IOException {
|
||||
writeObject(v);
|
||||
}
|
||||
|
||||
public void writeBytes(byte[] b) throws IOException {
|
||||
writer.println(new String(b));
|
||||
}
|
||||
|
||||
public void writeBytes(byte[] b, int off, int len) throws IOException {
|
||||
writer.println(new String(b, off, len));
|
||||
}
|
||||
|
||||
public void writeObject(Object obj) throws IOException {
|
||||
JSON.json(obj, writer, writeClass);
|
||||
writer.println();
|
||||
writer.flush();
|
||||
}
|
||||
|
||||
public void flushBuffer() throws IOException {
|
||||
writer.flush();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.serialize.support.json;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
import com.alibaba.dubbo.common.Extension;
|
||||
import com.alibaba.dubbo.common.URL;
|
||||
import com.alibaba.dubbo.common.serialize.ObjectInput;
|
||||
import com.alibaba.dubbo.common.serialize.ObjectOutput;
|
||||
import com.alibaba.dubbo.common.serialize.Serialization;
|
||||
|
||||
/**
|
||||
* JsonSerialization
|
||||
*
|
||||
* @author william.liangf
|
||||
*/
|
||||
@Extension("json")
|
||||
public class JsonSerialization implements Serialization {
|
||||
|
||||
public byte getContentTypeId() {
|
||||
return 5;
|
||||
}
|
||||
|
||||
public String getContentType() {
|
||||
return "text/json";
|
||||
}
|
||||
|
||||
public ObjectOutput serialize(URL url, OutputStream output) throws IOException {
|
||||
return new JsonObjectOutput(output, url.getParameter("with.class", true));
|
||||
}
|
||||
|
||||
public ObjectInput deserialize(URL url, InputStream input) throws IOException {
|
||||
return new JsonObjectInput(input);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -15,39 +15,36 @@
|
|||
*/
|
||||
package com.alibaba.dubbo.common.extensionloader;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.allOf;
|
||||
import static org.hamcrest.CoreMatchers.anyOf;
|
||||
import static org.hamcrest.CoreMatchers.instanceOf;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
import static org.junit.matchers.JUnitMatchers.containsString;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.dubbo.common.ExtensionLoader;
|
||||
import com.alibaba.dubbo.common.URL;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext1.Ext1;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext1.impl.Ext1Impl1;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext1.impl.Ext1Impl2;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext1.impl.Ext1Impl3;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext2.Ext2;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext2.UrlHolder;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext3.Ext3;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext4.Ext4;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext5.Ext5NoAdaptiveMethod;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext5.impl.Ext5Wrapper1;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext5.impl.Ext5Wrapper2;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext6_inject.Ext6;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext6_inject.impl.Ext6Impl2;
|
||||
import static org.hamcrest.CoreMatchers.anyOf;
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.matchers.JUnitMatchers.containsString;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.dubbo.common.ExtensionLoader;
|
||||
import com.alibaba.dubbo.common.URL;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext1.Ext1;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext1.impl.Ext1Impl1;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext1.impl.Ext1Impl2;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext2.Ext2;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext2.UrlHolder;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext3.Ext3;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext4.Ext4;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext5.Ext5NoAdaptiveMethod;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext5.impl.Ext5Wrapper1;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext5.impl.Ext5Wrapper2;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext6_inject.Ext6;
|
||||
import com.alibaba.dubbo.common.extensionloader.ext6_inject.impl.Ext6Impl2;
|
||||
|
||||
/**
|
||||
* @author ding.lid
|
||||
|
|
@ -75,8 +72,6 @@ public class ExtensionLoaderTest {
|
|||
public void test_getExtension() throws Exception {
|
||||
assertTrue(ExtensionLoader.getExtensionLoader(Ext1.class).getExtension("impl1") instanceof Ext1Impl1);
|
||||
assertTrue(ExtensionLoader.getExtensionLoader(Ext1.class).getExtension("impl2") instanceof Ext1Impl2);
|
||||
assertTrue(ExtensionLoader.getExtensionLoader(Ext1.class).getExtension("impl3") instanceof Ext1Impl3);
|
||||
assertTrue(ExtensionLoader.getExtensionLoader(Ext1.class).getExtension("impl88") instanceof Ext1Impl3);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -156,7 +151,6 @@ public class ExtensionLoaderTest {
|
|||
expected.add("impl1");
|
||||
expected.add("impl2");
|
||||
expected.add("impl3");
|
||||
expected.add("impl88");
|
||||
|
||||
assertEquals(expected, exts);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import com.alibaba.dubbo.common.extensionloader.ext1.Ext1;
|
|||
* @author ding.lid
|
||||
*
|
||||
*/
|
||||
@Extension("impl3,impl88")
|
||||
@Extension("impl3")
|
||||
public class Ext1Impl3 implements Ext1 {
|
||||
public String echo(URL url, String s) {
|
||||
return "Ext1Impl3-echo";
|
||||
|
|
|
|||
|
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
import com.alibaba.dubbo.common.io.UnsafeStringReader;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
public class JSONReaderTest extends TestCase
|
||||
{
|
||||
public void testMain() throws Exception
|
||||
{
|
||||
String json = "{ name: 'name', friends: [ 1, null, 3.2, ] }";
|
||||
JSONReader reader = new JSONReader(new UnsafeStringReader(json));
|
||||
assertEquals(reader.nextToken().type, JSONToken.LBRACE);
|
||||
assertEquals(reader.nextToken().type, JSONToken.IDENT);
|
||||
assertEquals(reader.nextToken().type, JSONToken.COLON);
|
||||
assertEquals(reader.nextToken().type, JSONToken.STRING);
|
||||
assertEquals(reader.nextToken().type, JSONToken.COMMA);
|
||||
assertEquals(reader.nextToken().type, JSONToken.IDENT);
|
||||
assertEquals(reader.nextToken().type, JSONToken.COLON);
|
||||
assertEquals(reader.nextToken().type, JSONToken.LSQUARE);
|
||||
assertEquals(reader.nextToken().type, JSONToken.INT);
|
||||
assertEquals(reader.nextToken().type, JSONToken.COMMA);
|
||||
assertEquals(reader.nextToken().type, JSONToken.NULL);
|
||||
assertEquals(reader.nextToken().type, JSONToken.COMMA);
|
||||
assertEquals(reader.nextToken().type, JSONToken.FLOAT);
|
||||
assertEquals(reader.nextToken().type, JSONToken.COMMA);
|
||||
assertEquals(reader.nextToken().type, JSONToken.RSQUARE);
|
||||
assertEquals(reader.nextToken().type, JSONToken.RBRACE);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,217 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
import java.io.StringReader;
|
||||
import java.io.StringWriter;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import junit.framework.Assert;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
public class JSONTest extends TestCase
|
||||
{
|
||||
public void testException() throws Exception {
|
||||
MyException e = new MyException("001", "AAAAAAAA");
|
||||
|
||||
StringWriter writer = new StringWriter();
|
||||
JSON.json(e, writer);
|
||||
String json = writer.getBuffer().toString();
|
||||
System.out.println(json);
|
||||
// Assert.assertEquals("{\"code\":\"001\",\"message\":\"AAAAAAAA\"}", json);
|
||||
|
||||
StringReader reader = new StringReader(json);
|
||||
MyException result = JSON.parse(reader, MyException.class);
|
||||
Assert.assertEquals("001", result.getCode());
|
||||
Assert.assertEquals("AAAAAAAA", result.getMessage());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void testMap() throws Exception {
|
||||
Map<String, String> map = new HashMap<String, String>();
|
||||
map.put("aaa", "bbb");
|
||||
|
||||
StringWriter writer = new StringWriter();
|
||||
JSON.json(map, writer);
|
||||
String json = writer.getBuffer().toString();
|
||||
Assert.assertEquals("{\"aaa\":\"bbb\"}", json);
|
||||
|
||||
StringReader reader = new StringReader(json);
|
||||
Map<String, String> result = JSON.parse(reader, Map.class);
|
||||
Assert.assertEquals("bbb", result.get("aaa"));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void testMapArray() throws Exception {
|
||||
Map<String, String> map = new HashMap<String, String>();
|
||||
map.put("aaa", "bbb");
|
||||
|
||||
StringWriter writer = new StringWriter();
|
||||
JSON.json(new Object[] {map}, writer); // args
|
||||
String json = writer.getBuffer().toString();
|
||||
Assert.assertEquals("[{\"aaa\":\"bbb\"}]", json);
|
||||
|
||||
StringReader reader = new StringReader(json);
|
||||
Object[] result = JSON.parse(reader, new Class<?>[] { Map.class });
|
||||
Assert.assertEquals(1, result.length);
|
||||
Assert.assertEquals("bbb", ((Map<String, String>)result[0]).get("aaa"));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void testLinkedMap() throws Exception {
|
||||
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
|
||||
map.put("aaa", "bbb");
|
||||
|
||||
StringWriter writer = new StringWriter();
|
||||
JSON.json(map, writer);
|
||||
String json = writer.getBuffer().toString();
|
||||
Assert.assertEquals("{\"aaa\":\"bbb\"}", json);
|
||||
|
||||
StringReader reader = new StringReader(json);
|
||||
LinkedHashMap<String, String> result = JSON.parse(reader, LinkedHashMap.class);
|
||||
Assert.assertEquals("bbb", result.get("aaa"));
|
||||
}
|
||||
|
||||
public void testObject2Json() throws Exception
|
||||
{
|
||||
Bean bean = new Bean();
|
||||
bean.array = new int[]{1, 3, 4};
|
||||
bean.setName("ql");
|
||||
|
||||
String json = JSON.json(bean);
|
||||
bean = JSON.parse(json, Bean.class);
|
||||
assertEquals(bean.getName(), "ql");
|
||||
assertEquals(bean.getDisplayName(), "钱磊");
|
||||
assertEquals(bean.bytes.length, DEFAULT_BYTES.length);
|
||||
assertEquals(bean.$$, DEFAULT_$$);
|
||||
|
||||
assertEquals("{\"name\":\"ql\",\"array\":[1,3,4]}", JSON.json(bean, new String[]{"name", "array"}));
|
||||
}
|
||||
|
||||
public void testParse2JSONObject() throws Exception
|
||||
{
|
||||
JSONObject jo = (JSONObject)JSON.parse("{name:'qianlei',array:[1,2,3,4,98.123],b1:TRUE,$1:NULL,$2:FALSE,__3:NULL}");
|
||||
assertEquals(jo.getString("name"), "qianlei");
|
||||
assertEquals(jo.getArray("array").length(), 5);
|
||||
assertEquals(jo.get("$2"), Boolean.FALSE);
|
||||
assertEquals(jo.get("__3"), null);
|
||||
|
||||
for(int i=0;i<10000;i++)
|
||||
JSON.parse("{\"name\":\"qianlei\",\"array\":[1,2,3,4,98.123],\"displayName\":\"钱磊\"}");
|
||||
|
||||
long now = System.currentTimeMillis();
|
||||
for(int i=0;i<10000;i++)
|
||||
JSON.parse("{\"name\":\"qianlei\",\"array\":[1,2,3,4,98.123],\"displayName\":\"钱磊\"}");
|
||||
System.out.println("parse to JSONObject 10000 times in: " + ( System.currentTimeMillis()-now) );
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void testParse2Class() throws Exception
|
||||
{
|
||||
int[] o1 = {1,2,3,4,5}, o2 = JSON.parse("[1.2,2,3,4,5]", int[].class);
|
||||
assertEquals(o2.length, 5);
|
||||
for(int i=0;i<5;i++)
|
||||
assertEquals(o1[i], o2[i]);
|
||||
|
||||
List l1 = (List)JSON.parse("[1.2,2,3,4,5]", List.class);
|
||||
assertEquals(l1.size(), 5);
|
||||
for(int i=0;i<5;i++)
|
||||
assertEquals(o1[i], ((Number)l1.get(i)).intValue());
|
||||
|
||||
Bean bean = JSON.parse("{name:'qianlei',array:[1,2,3,4,98.123],displayName:'钱磊',$$:214726,$b:TRUE}", Bean.class);
|
||||
assertEquals(bean.getName(), "qianlei");
|
||||
assertEquals(bean.getDisplayName(), "钱磊");
|
||||
assertEquals(bean.array.length, 5);
|
||||
assertEquals(bean.$$, 214726);
|
||||
assertEquals(bean.$b, true);
|
||||
|
||||
for(int i=0;i<10000;i++)
|
||||
JSON.parse("{name:'qianlei',array:[1,2,3,4,98.123],displayName:'钱磊'}", Bean1.class);
|
||||
|
||||
long now = System.currentTimeMillis();
|
||||
for(int i=0;i<10000;i++)
|
||||
JSON.parse("{name:'qianlei',array:[1,2,3,4,98.123],displayName:'钱磊'}", Bean1.class);
|
||||
System.out.println("parse to Class 10000 times in: " + ( System.currentTimeMillis()-now) );
|
||||
}
|
||||
|
||||
public void testParse2Arguments() throws Exception
|
||||
{
|
||||
Object[] test = JSON.parse("[1.2, 2, {name:'qianlei',array:[1,2,3,4,98.123]} ]", new Class<?>[]{ int.class, int.class, Bean.class });
|
||||
assertEquals(test[1], 2);
|
||||
assertEquals(test[2].getClass(), Bean.class);
|
||||
test = JSON.parse("[1.2, 2]", new Class<?>[]{ int.class, int.class });
|
||||
assertEquals(test[0], 1);
|
||||
}
|
||||
|
||||
static byte[] DEFAULT_BYTES = {3,12,14,41,12,2,3,12,4,67,23};
|
||||
|
||||
static int DEFAULT_$$ = 152;
|
||||
|
||||
public static class Bean1
|
||||
{
|
||||
private String name,displayName;
|
||||
|
||||
public int[] array;
|
||||
|
||||
public String getDisplayName() {
|
||||
return displayName;
|
||||
}
|
||||
|
||||
public void setDisplayName(String displayName) {
|
||||
this.displayName = displayName;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Bean
|
||||
{
|
||||
private String name, displayName = "钱磊";
|
||||
|
||||
public int[] array;
|
||||
|
||||
public boolean $b;
|
||||
|
||||
public int $$ = DEFAULT_$$;
|
||||
|
||||
public byte[] bytes = DEFAULT_BYTES;
|
||||
|
||||
public String getDisplayName() {
|
||||
return displayName;
|
||||
}
|
||||
|
||||
public void setDisplayName(String displayName) {
|
||||
this.displayName = displayName;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
import java.io.StringWriter;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
public class JSONWriterTest extends TestCase
|
||||
{
|
||||
public void testWriteJson() throws Exception
|
||||
{
|
||||
StringWriter w = new StringWriter();
|
||||
JSONWriter writer = new JSONWriter(w);
|
||||
|
||||
writer.valueNull();
|
||||
assertEquals(w.getBuffer().toString(), "null");
|
||||
|
||||
// write array.
|
||||
w.getBuffer().setLength(0);
|
||||
writer.arrayBegin().valueNull().valueBoolean(false).valueInt(16).arrayEnd();
|
||||
assertEquals(w.getBuffer().toString(),"[null,false,16]");
|
||||
|
||||
// write object.
|
||||
w.getBuffer().setLength(0);
|
||||
writer.objectBegin().objectItem("type").valueString("com.alibaba.dubbo.TestService").objectItem("version").valueString("1.1.0").objectEnd();
|
||||
assertEquals(w.getBuffer().toString(),"{\"type\":\"com.alibaba.dubbo.TestService\",\"version\":\"1.1.0\"}");
|
||||
|
||||
w.getBuffer().setLength(0);
|
||||
writer.objectBegin();
|
||||
writer.objectItem("name").objectItem("displayName");
|
||||
writer.objectItem("emptyList").arrayBegin().arrayEnd();
|
||||
writer.objectItem("list").arrayBegin().valueNull().valueBoolean(false).valueInt(16).valueString("stri'''ng").arrayEnd();
|
||||
writer.objectItem("service").objectBegin().objectItem("type").valueString("com.alibaba.dubbo.TestService").objectItem("version").valueString("1.1.0").objectEnd();
|
||||
writer.objectEnd();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.json;
|
||||
|
||||
public class MyException extends Exception {
|
||||
|
||||
private static final long serialVersionUID = 2905707783883694687L;
|
||||
|
||||
private String code;
|
||||
|
||||
public MyException() {
|
||||
}
|
||||
|
||||
public MyException(String code, String message) {
|
||||
super(message);
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public String getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public void setCode(String code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,222 @@
|
|||
/*
|
||||
* Copyright 1999-2011 Alibaba Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.dubbo.common.serialize.serialization;
|
||||
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.dubbo.common.serialize.support.json.JsonSerialization;
|
||||
|
||||
/**
|
||||
* FIXME Json Serialization的失败,被暂时被忽略
|
||||
*
|
||||
* @author ding.lid
|
||||
*
|
||||
*/
|
||||
public class JsonSerializationTest extends AbstractSerializationPersionOkTest {
|
||||
{
|
||||
serialization = new JsonSerialization();
|
||||
}
|
||||
|
||||
// FIXME
|
||||
@Ignore
|
||||
@Test
|
||||
public void test_BytesRange() throws Exception {}
|
||||
|
||||
@Ignore("bool[] type missing to List<Boolean>")
|
||||
@Test
|
||||
public void test_boolArray() throws Exception {}
|
||||
|
||||
@Ignore("char[] type missing to List<Charator>")
|
||||
@Test
|
||||
public void test_charArray() throws Exception {}
|
||||
|
||||
@Ignore("short[] type missing to List<Short>")
|
||||
@Test
|
||||
public void test_shortArray() throws Exception {}
|
||||
|
||||
@Ignore("int[] type missing to List<Integer>")
|
||||
@Test
|
||||
public void test_intArray() throws Exception {}
|
||||
|
||||
@Ignore("long[] type missing to List<Long>")
|
||||
@Test
|
||||
public void test_longArray() throws Exception {}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void test_floatArray() throws Exception {}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void test_doubleArray() throws Exception {}
|
||||
|
||||
@Ignore("String[] type missing to List<String>")
|
||||
@Test
|
||||
public void test_StringArray() throws Exception {}
|
||||
|
||||
@Ignore("Integer[] type missing to List<Integer>")
|
||||
@Test
|
||||
public void test_IntegerArray() throws Exception {}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void test_EnumArray() throws Exception {}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void test_Date() throws Exception {}
|
||||
|
||||
@Ignore("毫秒部分丢失成0")
|
||||
@Test
|
||||
public void test_Date_withType() throws Exception {}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void test_Time() throws Exception {}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void test_Time_withType() throws Exception {}
|
||||
|
||||
@Ignore("Byte type missing to Long")
|
||||
@Test
|
||||
public void test_ByteWrap() throws Exception {}
|
||||
|
||||
@Ignore("BigInteger type missing to Long")
|
||||
@Test
|
||||
public void test_BigInteger() throws Exception {}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void test_BigDecimal() throws Exception {}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void test_BigDecimal_withType() throws Exception {}
|
||||
|
||||
@Ignore("BizException type missing")
|
||||
@Test
|
||||
public void test_BizException() throws Exception {}
|
||||
|
||||
@Ignore("BizExceptionNoDefaultConstructor type missing")
|
||||
@Test
|
||||
public void test_BizExceptionNoDefaultConstructor() throws Exception {}
|
||||
|
||||
@Ignore("NoDefaultConstructor")
|
||||
@Test
|
||||
public void test_BizExceptionNoDefaultConstructor_WithType() throws Exception {}
|
||||
|
||||
@Ignore("Enum type missing")
|
||||
@Test
|
||||
public void test_enum() throws Exception {}
|
||||
|
||||
@Ignore("Set type missing to Map")
|
||||
@Test
|
||||
public void test_StringSet() throws Exception {}
|
||||
|
||||
@Ignore("LinkedHashMap type missing to Map")
|
||||
@Test
|
||||
public void test_LinkedHashMap() throws Exception {}
|
||||
|
||||
//
|
||||
|
||||
@Ignore("SPerson type missing")
|
||||
@Test
|
||||
public void test_SPerson() throws Exception {}
|
||||
|
||||
@Ignore("SPerson type missing")
|
||||
@Test
|
||||
public void test_SPersonList() throws Exception {}
|
||||
|
||||
@Ignore("SPerson type missing")
|
||||
@Test
|
||||
public void test_SPersonSet() throws Exception {}
|
||||
|
||||
@Ignore("SPerson type missing")
|
||||
@Test
|
||||
public void test_IntSPersonMap() throws Exception {}
|
||||
|
||||
@Ignore("SPerson type missing")
|
||||
@Test
|
||||
public void test_StringSPersonMap() throws Exception {}
|
||||
|
||||
@Ignore("SPerson type missing")
|
||||
@Test
|
||||
public void test_StringSPersonListMap() throws Exception {}
|
||||
|
||||
@Ignore("SPerson type missing")
|
||||
@Test
|
||||
public void test_SPersonListList() throws Exception {}
|
||||
|
||||
@Ignore("type missing")
|
||||
@Test
|
||||
public void test_BigPerson() throws Exception {}
|
||||
|
||||
@Ignore("type missing")
|
||||
@Test
|
||||
public void test_BigPerson_WithType() throws Exception {}
|
||||
|
||||
@Ignore("type missing")
|
||||
@Test
|
||||
public void test_MediaContent() throws Exception {}
|
||||
|
||||
@Ignore("type missing")
|
||||
@Test
|
||||
public void test_MediaContent_WithType() throws Exception {}
|
||||
|
||||
@Ignore("type missing")
|
||||
@Test
|
||||
public void test_MultiObject() throws Exception {}
|
||||
|
||||
@Ignore("type missing")
|
||||
@Test
|
||||
public void test_MultiObject_WithType() throws Exception {}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void test_LoopReference() throws Exception {}
|
||||
|
||||
// Person
|
||||
|
||||
@Ignore("person type missing")
|
||||
@Test
|
||||
public void test_Person() throws Exception {}
|
||||
|
||||
@Ignore("person type missing")
|
||||
@Test
|
||||
public void test_PersonList() throws Exception {}
|
||||
|
||||
@Ignore("person type missing")
|
||||
@Test
|
||||
public void test_PersonSet() throws Exception {}
|
||||
|
||||
@Ignore("person type missing")
|
||||
@Test
|
||||
public void test_IntPersonMap() throws Exception {}
|
||||
|
||||
@Ignore("person type missing")
|
||||
@Test
|
||||
public void test_StringPersonMap() throws Exception {}
|
||||
|
||||
@Ignore("person type missing")
|
||||
@Test
|
||||
public void test_StringPersonListMap() throws Exception {}
|
||||
|
||||
@Ignore("person type missing")
|
||||
@Test
|
||||
public void test_PersonListList() throws Exception {}
|
||||
}
|
||||
Loading…
Reference in New Issue