Mercurial Hosting > luan
changeset 804:9f5ba30722bb
remove org.eclipse.jetty.util.ajax
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 07 Sep 2016 21:28:02 -0600 |
parents | 166b16bda630 |
children | fc3e366caa51 |
files | src/org/eclipse/jetty/util/ajax/JSON.java src/org/eclipse/jetty/util/ajax/JSONCollectionConvertor.java src/org/eclipse/jetty/util/ajax/JSONDateConvertor.java src/org/eclipse/jetty/util/ajax/JSONEnumConvertor.java src/org/eclipse/jetty/util/ajax/JSONObjectConvertor.java src/org/eclipse/jetty/util/ajax/JSONPojoConvertor.java src/org/eclipse/jetty/util/ajax/JSONPojoConvertorFactory.java |
diffstat | 7 files changed, 0 insertions(+), 2546 deletions(-) [+] |
line wrap: on
line diff
diff -r 166b16bda630 -r 9f5ba30722bb src/org/eclipse/jetty/util/ajax/JSON.java --- a/src/org/eclipse/jetty/util/ajax/JSON.java Wed Sep 07 21:21:32 2016 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1640 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.eclipse.jetty.util.ajax; - -import java.io.Externalizable; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.eclipse.jetty.util.IO; -import org.eclipse.jetty.util.Loader; -import org.eclipse.jetty.util.QuotedStringTokenizer; -import org.eclipse.jetty.util.TypeUtil; -import org.eclipse.jetty.util.log.Log; -import org.eclipse.jetty.util.log.Logger; - -/** - * JSON Parser and Generator. - * <p /> - * This class provides some static methods to convert POJOs to and from JSON - * notation. The mapping from JSON to java is: - * - * <pre> - * object ==> Map - * array ==> Object[] - * number ==> Double or Long - * string ==> String - * null ==> null - * bool ==> Boolean - * </pre> - - * The java to JSON mapping is: - * - * <pre> - * String --> string - * Number --> number - * Map --> object - * List --> array - * Array --> array - * null --> null - * Boolean--> boolean - * Object --> string (dubious!) - * </pre> - * - * The interface {@link JSON.Convertible} may be implemented by classes that - * wish to externalize and initialize specific fields to and from JSON objects. - * Only directed acyclic graphs of objects are supported. - * <p /> - * The interface {@link JSON.Generator} may be implemented by classes that know - * how to render themselves as JSON and the {@link #toString(Object)} method - * will use {@link JSON.Generator#addJSON(Appendable)} to generate the JSON. - * The class {@link JSON.Literal} may be used to hold pre-generated JSON object. - * <p /> - * The interface {@link JSON.Convertor} may be implemented to provide static - * converters for objects that may be registered with - * {@link #registerConvertor(Class, Convertor)}. - * These converters are looked up by class, interface and super class by - * {@link #getConvertor(Class)}. - * <p /> - * If a JSON object has a "class" field, then a java class for that name is - * loaded and the method {@link #convertTo(Class,Map)} is used to find a - * {@link JSON.Convertor} for that class. - * <p /> - * If a JSON object has a "x-class" field then a direct lookup for a - * {@link JSON.Convertor} for that class name is done (without loading the class). - */ -public class JSON -{ - static final Logger LOG = Log.getLogger(JSON.class); - public final static JSON DEFAULT = new JSON(); - - private Map<String, Convertor> _convertors = new ConcurrentHashMap<String, Convertor>(); - private int _stringBufferSize = 1024; - - public JSON() - { - } - - /** - * @return the initial stringBuffer size to use when creating JSON strings - * (default 1024) - */ - public int getStringBufferSize() - { - return _stringBufferSize; - } - - /** - * @param stringBufferSize - * the initial stringBuffer size to use when creating JSON - * strings (default 1024) - */ - public void setStringBufferSize(int stringBufferSize) - { - _stringBufferSize = stringBufferSize; - } - - /** - * Register a {@link Convertor} for a class or interface. - * - * @param forClass - * The class or interface that the convertor applies to - * @param convertor - * the convertor - */ - public static void registerConvertor(Class forClass, Convertor convertor) - { - DEFAULT.addConvertor(forClass,convertor); - } - - public static JSON getDefault() - { - return DEFAULT; - } - - @Deprecated - public static void setDefault(JSON json) - { - } - - public static String toString(Object object) - { - StringBuilder buffer = new StringBuilder(DEFAULT.getStringBufferSize()); - DEFAULT.append(buffer,object); - return buffer.toString(); - } - - public static String toString(Map object) - { - StringBuilder buffer = new StringBuilder(DEFAULT.getStringBufferSize()); - DEFAULT.appendMap(buffer,object); - return buffer.toString(); - } - - public static String toString(Object[] array) - { - StringBuilder buffer = new StringBuilder(DEFAULT.getStringBufferSize()); - DEFAULT.appendArray(buffer,array); - return buffer.toString(); - } - - /** - * @param s - * String containing JSON object or array. - * @return A Map, Object array or primitive array parsed from the JSON. - */ - public static Object parse(String s) - { - return DEFAULT.parse(new StringSource(s),false); - } - - /** - * @param s - * String containing JSON object or array. - * @param stripOuterComment - * If true, an outer comment around the JSON is ignored. - * @return A Map, Object array or primitive array parsed from the JSON. - */ - public static Object parse(String s, boolean stripOuterComment) - { - return DEFAULT.parse(new StringSource(s),stripOuterComment); - } - - /** - * @param in - * Reader containing JSON object or array. - * @return A Map, Object array or primitive array parsed from the JSON. - */ - public static Object parse(Reader in) throws IOException - { - return DEFAULT.parse(new ReaderSource(in),false); - } - - /** - * @param in - * Reader containing JSON object or array. - * @param stripOuterComment - * If true, an outer comment around the JSON is ignored. - * @return A Map, Object array or primitive array parsed from the JSON. - */ - public static Object parse(Reader in, boolean stripOuterComment) throws IOException - { - return DEFAULT.parse(new ReaderSource(in),stripOuterComment); - } - - /** - * @deprecated use {@link #parse(Reader)} - * @param in - * Reader containing JSON object or array. - * @return A Map, Object array or primitive array parsed from the JSON. - */ - @Deprecated - public static Object parse(InputStream in) throws IOException - { - return DEFAULT.parse(new StringSource(IO.toString(in)),false); - } - - /** - * @deprecated use {@link #parse(Reader, boolean)} - * @param in - * Stream containing JSON object or array. - * @param stripOuterComment - * If true, an outer comment around the JSON is ignored. - * @return A Map, Object array or primitive array parsed from the JSON. - */ - @Deprecated - public static Object parse(InputStream in, boolean stripOuterComment) throws IOException - { - return DEFAULT.parse(new StringSource(IO.toString(in)),stripOuterComment); - } - - /** - * Convert Object to JSON - * - * @param object - * The object to convert - * @return The JSON String - */ - public String toJSON(Object object) - { - StringBuilder buffer = new StringBuilder(getStringBufferSize()); - append(buffer,object); - return buffer.toString(); - } - - /** - * Convert JSON to Object - * - * @param json - * The json to convert - * @return The object - */ - public Object fromJSON(String json) - { - Source source = new StringSource(json); - return parse(source); - } - - @Deprecated - public void append(StringBuffer buffer, Object object) - { - append((Appendable)buffer,object); - } - - /** - * Append object as JSON to string buffer. - * - * @param buffer - * the buffer to append to - * @param object - * the object to append - */ - public void append(Appendable buffer, Object object) - { - try - { - if (object == null) - { - buffer.append("null"); - } - // Most likely first - else if (object instanceof Map) - { - appendMap(buffer,(Map)object); - } - else if (object instanceof String) - { - appendString(buffer,(String)object); - } - else if (object instanceof Number) - { - appendNumber(buffer,(Number)object); - } - else if (object instanceof Boolean) - { - appendBoolean(buffer,(Boolean)object); - } - else if (object.getClass().isArray()) - { - appendArray(buffer,object); - } - else if (object instanceof Character) - { - appendString(buffer,object.toString()); - } - else if (object instanceof Convertible) - { - appendJSON(buffer,(Convertible)object); - } - else if (object instanceof Generator) - { - appendJSON(buffer,(Generator)object); - } - else - { - // Check Convertor before Collection to support JSONCollectionConvertor - Convertor convertor = getConvertor(object.getClass()); - if (convertor != null) - { - appendJSON(buffer,convertor,object); - } - else if (object instanceof Collection) - { - appendArray(buffer,(Collection)object); - } - else - { - appendString(buffer,object.toString()); - } - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - @Deprecated - public void appendNull(StringBuffer buffer) - { - appendNull((Appendable)buffer); - } - - public void appendNull(Appendable buffer) - { - try - { - buffer.append("null"); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - @Deprecated - public void appendJSON(final StringBuffer buffer, final Convertor convertor, final Object object) - { - appendJSON((Appendable)buffer,convertor,object); - } - - public void appendJSON(final Appendable buffer, final Convertor convertor, final Object object) - { - appendJSON(buffer,new Convertible() - { - public void fromJSON(Map object) - { - } - - public void toJSON(Output out) - { - convertor.toJSON(object,out); - } - }); - } - - @Deprecated - public void appendJSON(final StringBuffer buffer, Convertible converter) - { - appendJSON((Appendable)buffer,converter); - } - - public void appendJSON(final Appendable buffer, Convertible converter) - { - ConvertableOutput out=new ConvertableOutput(buffer); - converter.toJSON(out); - out.complete(); - } - - @Deprecated - public void appendJSON(StringBuffer buffer, Generator generator) - { - generator.addJSON(buffer); - } - - public void appendJSON(Appendable buffer, Generator generator) - { - generator.addJSON(buffer); - } - - @Deprecated - public void appendMap(StringBuffer buffer, Map<?,?> map) - { - appendMap((Appendable)buffer,map); - } - - public void appendMap(Appendable buffer, Map<?,?> map) - { - try - { - if (map == null) - { - appendNull(buffer); - return; - } - - buffer.append('{'); - Iterator<?> iter = map.entrySet().iterator(); - while (iter.hasNext()) - { - Map.Entry<?,?> entry = (Map.Entry<?,?>)iter.next(); - QuotedStringTokenizer.quote(buffer,entry.getKey().toString()); - buffer.append(':'); - append(buffer,entry.getValue()); - if (iter.hasNext()) - buffer.append(','); - } - - buffer.append('}'); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - @Deprecated - public void appendArray(StringBuffer buffer, Collection collection) - { - appendArray((Appendable)buffer,collection); - } - - public void appendArray(Appendable buffer, Collection collection) - { - try - { - if (collection == null) - { - appendNull(buffer); - return; - } - - buffer.append('['); - Iterator iter = collection.iterator(); - boolean first = true; - while (iter.hasNext()) - { - if (!first) - buffer.append(','); - - first = false; - append(buffer,iter.next()); - } - - buffer.append(']'); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - @Deprecated - public void appendArray(StringBuffer buffer, Object array) - { - appendArray((Appendable)buffer,array); - } - - public void appendArray(Appendable buffer, Object array) - { - try - { - if (array == null) - { - appendNull(buffer); - return; - } - - buffer.append('['); - int length = Array.getLength(array); - - for (int i = 0; i < length; i++) - { - if (i != 0) - buffer.append(','); - append(buffer,Array.get(array,i)); - } - - buffer.append(']'); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - @Deprecated - public void appendBoolean(StringBuffer buffer, Boolean b) - { - appendBoolean((Appendable)buffer,b); - } - - public void appendBoolean(Appendable buffer, Boolean b) - { - try - { - if (b == null) - { - appendNull(buffer); - return; - } - buffer.append(b?"true":"false"); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - @Deprecated - public void appendNumber(StringBuffer buffer, Number number) - { - appendNumber((Appendable)buffer,number); - } - - public void appendNumber(Appendable buffer, Number number) - { - try - { - if (number == null) - { - appendNull(buffer); - return; - } - buffer.append(String.valueOf(number)); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - @Deprecated - public void appendString(StringBuffer buffer, String string) - { - appendString((Appendable)buffer,string); - } - - public void appendString(Appendable buffer, String string) - { - if (string == null) - { - appendNull(buffer); - return; - } - - QuotedStringTokenizer.quote(buffer,string); - } - - // Parsing utilities - - protected String toString(char[] buffer, int offset, int length) - { - return new String(buffer,offset,length); - } - - protected Map<String, Object> newMap() - { - return new HashMap<String, Object>(); - } - - protected Object[] newArray(int size) - { - return new Object[size]; - } - - protected JSON contextForArray() - { - return this; - } - - protected JSON contextFor(String field) - { - return this; - } - - protected Object convertTo(Class type, Map map) - { - if (type != null && Convertible.class.isAssignableFrom(type)) - { - try - { - Convertible conv = (Convertible)type.newInstance(); - conv.fromJSON(map); - return conv; - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } - - Convertor convertor = getConvertor(type); - if (convertor != null) - { - return convertor.fromJSON(map); - } - return map; - } - - /** - * Register a {@link Convertor} for a class or interface. - * - * @param forClass - * The class or interface that the convertor applies to - * @param convertor - * the convertor - */ - public void addConvertor(Class forClass, Convertor convertor) - { - _convertors.put(forClass.getName(),convertor); - } - - /** - * Lookup a convertor for a class. - * <p> - * If no match is found for the class, then the interfaces for the class are - * tried. If still no match is found, then the super class and it's - * interfaces are tried recursively. - * - * @param forClass - * The class - * @return a {@link JSON.Convertor} or null if none were found. - */ - protected Convertor getConvertor(Class forClass) - { - Class cls = forClass; - Convertor convertor = _convertors.get(cls.getName()); - if (convertor == null && this != DEFAULT) - convertor = DEFAULT.getConvertor(cls); - - while (convertor == null && cls != Object.class) - { - Class[] ifs = cls.getInterfaces(); - int i = 0; - while (convertor == null && ifs != null && i < ifs.length) - convertor = _convertors.get(ifs[i++].getName()); - if (convertor == null) - { - cls = cls.getSuperclass(); - convertor = _convertors.get(cls.getName()); - } - } - return convertor; - } - - /** - * Register a {@link JSON.Convertor} for a named class or interface. - * - * @param name - * name of a class or an interface that the convertor applies to - * @param convertor - * the convertor - */ - public void addConvertorFor(String name, Convertor convertor) - { - _convertors.put(name,convertor); - } - - /** - * Lookup a convertor for a named class. - * - * @param name - * name of the class - * @return a {@link JSON.Convertor} or null if none were found. - */ - public Convertor getConvertorFor(String name) - { - Convertor convertor = _convertors.get(name); - if (convertor == null && this != DEFAULT) - convertor = DEFAULT.getConvertorFor(name); - return convertor; - } - - public Object parse(Source source, boolean stripOuterComment) - { - int comment_state = 0; // 0=no comment, 1="/", 2="/*", 3="/* *" -1="//" - if (!stripOuterComment) - return parse(source); - - int strip_state = 1; // 0=no strip, 1=wait for /*, 2= wait for */ - - Object o = null; - while (source.hasNext()) - { - char c = source.peek(); - - // handle // or /* comment - if (comment_state == 1) - { - switch (c) - { - case '/': - comment_state = -1; - break; - case '*': - comment_state = 2; - if (strip_state == 1) - { - comment_state = 0; - strip_state = 2; - } - } - } - // handle /* */ comment - else if (comment_state > 1) - { - switch (c) - { - case '*': - comment_state = 3; - break; - case '/': - if (comment_state == 3) - { - comment_state = 0; - if (strip_state == 2) - return o; - } - else - comment_state = 2; - break; - default: - comment_state = 2; - } - } - // handle // comment - else if (comment_state < 0) - { - switch (c) - { - case '\r': - case '\n': - comment_state = 0; - default: - break; - } - } - // handle unknown - else - { - if (!Character.isWhitespace(c)) - { - if (c == '/') - comment_state = 1; - else if (c == '*') - comment_state = 3; - else if (o == null) - { - o = parse(source); - continue; - } - } - } - - source.next(); - } - - return o; - } - - public Object parse(Source source) - { - int comment_state = 0; // 0=no comment, 1="/", 2="/*", 3="/* *" -1="//" - - while (source.hasNext()) - { - char c = source.peek(); - - // handle // or /* comment - if (comment_state == 1) - { - switch (c) - { - case '/': - comment_state = -1; - break; - case '*': - comment_state = 2; - } - } - // handle /* */ comment - else if (comment_state > 1) - { - switch (c) - { - case '*': - comment_state = 3; - break; - case '/': - if (comment_state == 3) - comment_state = 0; - else - comment_state = 2; - break; - default: - comment_state = 2; - } - } - // handle // comment - else if (comment_state < 0) - { - switch (c) - { - case '\r': - case '\n': - comment_state = 0; - break; - default: - break; - } - } - // handle unknown - else - { - switch (c) - { - case '{': - return parseObject(source); - case '[': - return parseArray(source); - case '"': - return parseString(source); - case '-': - return parseNumber(source); - - case 'n': - complete("null",source); - return null; - case 't': - complete("true",source); - return Boolean.TRUE; - case 'f': - complete("false",source); - return Boolean.FALSE; - case 'u': - complete("undefined",source); - return null; - case 'N': - complete("NaN",source); - return null; - - case '/': - comment_state = 1; - break; - - default: - if (Character.isDigit(c)) - return parseNumber(source); - else if (Character.isWhitespace(c)) - break; - return handleUnknown(source,c); - } - } - source.next(); - } - - return null; - } - - protected Object handleUnknown(Source source, char c) - { - throw new IllegalStateException("unknown char '" + c + "'(" + (int)c + ") in " + source); - } - - protected Object parseObject(Source source) - { - if (source.next() != '{') - throw new IllegalStateException(); - Map<String, Object> map = newMap(); - - char next = seekTo("\"}",source); - - while (source.hasNext()) - { - if (next == '}') - { - source.next(); - break; - } - - String name = parseString(source); - seekTo(':',source); - source.next(); - - Object value = contextFor(name).parse(source); - map.put(name,value); - - seekTo(",}",source); - next = source.next(); - if (next == '}') - break; - else - next = seekTo("\"}",source); - } - - String xclassname = (String)map.get("x-class"); - if (xclassname != null) - { - Convertor c = getConvertorFor(xclassname); - if (c != null) - return c.fromJSON(map); - LOG.warn("No Convertor for x-class '{}'", xclassname); - } - - String classname = (String)map.get("class"); - if (classname != null) - { - try - { - Class c = Loader.loadClass(JSON.class,classname); - return convertTo(c,map); - } - catch (ClassNotFoundException e) - { - LOG.warn("No Class for '{}'", classname); - } - } - - return map; - } - - protected Object parseArray(Source source) - { - if (source.next() != '[') - throw new IllegalStateException(); - - int size = 0; - ArrayList list = null; - Object item = null; - boolean coma = true; - - while (source.hasNext()) - { - char c = source.peek(); - switch (c) - { - case ']': - source.next(); - switch (size) - { - case 0: - return newArray(0); - case 1: - Object array = newArray(1); - Array.set(array,0,item); - return array; - default: - return list.toArray(newArray(list.size())); - } - - case ',': - if (coma) - throw new IllegalStateException(); - coma = true; - source.next(); - break; - - default: - if (Character.isWhitespace(c)) - source.next(); - else - { - coma = false; - if (size++ == 0) - item = contextForArray().parse(source); - else if (list == null) - { - list = new ArrayList(); - list.add(item); - item = contextForArray().parse(source); - list.add(item); - item = null; - } - else - { - item = contextForArray().parse(source); - list.add(item); - item = null; - } - } - } - - } - - throw new IllegalStateException("unexpected end of array"); - } - - protected String parseString(Source source) - { - if (source.next() != '"') - throw new IllegalStateException(); - - boolean escape = false; - - StringBuilder b = null; - final char[] scratch = source.scratchBuffer(); - - if (scratch != null) - { - int i = 0; - while (source.hasNext()) - { - if (i >= scratch.length) - { - // we have filled the scratch buffer, so we must - // use the StringBuffer for a large string - b = new StringBuilder(scratch.length * 2); - b.append(scratch,0,i); - break; - } - - char c = source.next(); - - if (escape) - { - escape = false; - switch (c) - { - case '"': - scratch[i++] = '"'; - break; - case '\\': - scratch[i++] = '\\'; - break; - case '/': - scratch[i++] = '/'; - break; - case 'b': - scratch[i++] = '\b'; - break; - case 'f': - scratch[i++] = '\f'; - break; - case 'n': - scratch[i++] = '\n'; - break; - case 'r': - scratch[i++] = '\r'; - break; - case 't': - scratch[i++] = '\t'; - break; - case 'u': - char uc = (char)((TypeUtil.convertHexDigit((byte)source.next()) << 12) + (TypeUtil.convertHexDigit((byte)source.next()) << 8) - + (TypeUtil.convertHexDigit((byte)source.next()) << 4) + (TypeUtil.convertHexDigit((byte)source.next()))); - scratch[i++] = uc; - break; - default: - scratch[i++] = c; - } - } - else if (c == '\\') - { - escape = true; - } - else if (c == '\"') - { - // Return string that fits within scratch buffer - return toString(scratch,0,i); - } - else - { - scratch[i++] = c; - } - } - - // Missing end quote, but return string anyway ? - if (b == null) - return toString(scratch,0,i); - } - else - b = new StringBuilder(getStringBufferSize()); - - // parse large string into string buffer - final StringBuilder builder=b; - while (source.hasNext()) - { - char c = source.next(); - - if (escape) - { - escape = false; - switch (c) - { - case '"': - builder.append('"'); - break; - case '\\': - builder.append('\\'); - break; - case '/': - builder.append('/'); - break; - case 'b': - builder.append('\b'); - break; - case 'f': - builder.append('\f'); - break; - case 'n': - builder.append('\n'); - break; - case 'r': - builder.append('\r'); - break; - case 't': - builder.append('\t'); - break; - case 'u': - char uc = (char)((TypeUtil.convertHexDigit((byte)source.next()) << 12) + (TypeUtil.convertHexDigit((byte)source.next()) << 8) - + (TypeUtil.convertHexDigit((byte)source.next()) << 4) + (TypeUtil.convertHexDigit((byte)source.next()))); - builder.append(uc); - break; - default: - builder.append(c); - } - } - else if (c == '\\') - { - escape = true; - } - else if (c == '\"') - { - break; - } - else - { - builder.append(c); - } - } - return builder.toString(); - } - - public Number parseNumber(Source source) - { - boolean minus = false; - long number = 0; - StringBuilder buffer = null; - - longLoop: while (source.hasNext()) - { - char c = source.peek(); - switch (c) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - number = number * 10 + (c - '0'); - source.next(); - break; - - case '-': - case '+': - if (number != 0) - throw new IllegalStateException("bad number"); - minus = true; - source.next(); - break; - - case '.': - case 'e': - case 'E': - buffer = new StringBuilder(16); - if (minus) - buffer.append('-'); - buffer.append(number); - buffer.append(c); - source.next(); - break longLoop; - - default: - break longLoop; - } - } - - if (buffer == null) - return minus ? -1 * number : number; - - doubleLoop: while (source.hasNext()) - { - char c = source.peek(); - switch (c) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '-': - case '.': - case '+': - case 'e': - case 'E': - buffer.append(c); - source.next(); - break; - - default: - break doubleLoop; - } - } - return new Double(buffer.toString()); - - } - - protected void seekTo(char seek, Source source) - { - while (source.hasNext()) - { - char c = source.peek(); - if (c == seek) - return; - - if (!Character.isWhitespace(c)) - throw new IllegalStateException("Unexpected '" + c + " while seeking '" + seek + "'"); - source.next(); - } - - throw new IllegalStateException("Expected '" + seek + "'"); - } - - protected char seekTo(String seek, Source source) - { - while (source.hasNext()) - { - char c = source.peek(); - if (seek.indexOf(c) >= 0) - { - return c; - } - - if (!Character.isWhitespace(c)) - throw new IllegalStateException("Unexpected '" + c + "' while seeking one of '" + seek + "'"); - source.next(); - } - - throw new IllegalStateException("Expected one of '" + seek + "'"); - } - - protected static void complete(String seek, Source source) - { - int i = 0; - while (source.hasNext() && i < seek.length()) - { - char c = source.next(); - if (c != seek.charAt(i++)) - throw new IllegalStateException("Unexpected '" + c + " while seeking \"" + seek + "\""); - } - - if (i < seek.length()) - throw new IllegalStateException("Expected \"" + seek + "\""); - } - - private final class ConvertableOutput implements Output - { - private final Appendable _buffer; - char c = '{'; - - private ConvertableOutput(Appendable buffer) - { - _buffer = buffer; - } - - public void complete() - { - try - { - if (c == '{') - _buffer.append("{}"); - else if (c != 0) - _buffer.append("}"); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - public void add(Object obj) - { - if (c == 0) - throw new IllegalStateException(); - append(_buffer,obj); - c = 0; - } - - public void addClass(Class type) - { - try - { - if (c == 0) - throw new IllegalStateException(); - _buffer.append(c); - _buffer.append("\"class\":"); - append(_buffer,type.getName()); - c = ','; - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - public void add(String name, Object value) - { - try - { - if (c == 0) - throw new IllegalStateException(); - _buffer.append(c); - QuotedStringTokenizer.quote(_buffer,name); - _buffer.append(':'); - append(_buffer,value); - c = ','; - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - public void add(String name, double value) - { - try - { - if (c == 0) - throw new IllegalStateException(); - _buffer.append(c); - QuotedStringTokenizer.quote(_buffer,name); - _buffer.append(':'); - appendNumber(_buffer, value); - c = ','; - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - public void add(String name, long value) - { - try - { - if (c == 0) - throw new IllegalStateException(); - _buffer.append(c); - QuotedStringTokenizer.quote(_buffer,name); - _buffer.append(':'); - appendNumber(_buffer, value); - c = ','; - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - public void add(String name, boolean value) - { - try - { - if (c == 0) - throw new IllegalStateException(); - _buffer.append(c); - QuotedStringTokenizer.quote(_buffer,name); - _buffer.append(':'); - appendBoolean(_buffer,value?Boolean.TRUE:Boolean.FALSE); - c = ','; - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - } - - public interface Source - { - boolean hasNext(); - - char next(); - - char peek(); - - char[] scratchBuffer(); - } - - public static class StringSource implements Source - { - private final String string; - private int index; - private char[] scratch; - - public StringSource(String s) - { - string = s; - } - - public boolean hasNext() - { - if (index < string.length()) - return true; - scratch = null; - return false; - } - - public char next() - { - return string.charAt(index++); - } - - public char peek() - { - return string.charAt(index); - } - - @Override - public String toString() - { - return string.substring(0,index) + "|||" + string.substring(index); - } - - public char[] scratchBuffer() - { - if (scratch == null) - scratch = new char[string.length()]; - return scratch; - } - } - - public static class ReaderSource implements Source - { - private Reader _reader; - private int _next = -1; - private char[] scratch; - - public ReaderSource(Reader r) - { - _reader = r; - } - - public void setReader(Reader reader) - { - _reader = reader; - _next = -1; - } - - public boolean hasNext() - { - getNext(); - if (_next < 0) - { - scratch = null; - return false; - } - return true; - } - - public char next() - { - getNext(); - char c = (char)_next; - _next = -1; - return c; - } - - public char peek() - { - getNext(); - return (char)_next; - } - - private void getNext() - { - if (_next < 0) - { - try - { - _next = _reader.read(); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - } - - public char[] scratchBuffer() - { - if (scratch == null) - scratch = new char[1024]; - return scratch; - } - - } - - /** - * JSON Output class for use by {@link Convertible}. - */ - public interface Output - { - public void addClass(Class c); - - public void add(Object obj); - - public void add(String name, Object value); - - public void add(String name, double value); - - public void add(String name, long value); - - public void add(String name, boolean value); - } - - /* ------------------------------------------------------------ */ - /** - * JSON Convertible object. Object can implement this interface in a similar - * way to the {@link Externalizable} interface is used to allow classes to - * provide their own serialization mechanism. - * <p> - * A JSON.Convertible object may be written to a JSONObject or initialized - * from a Map of field names to values. - * <p> - * If the JSON is to be convertible back to an Object, then the method - * {@link Output#addClass(Class)} must be called from within toJSON() - * - */ - public interface Convertible - { - public void toJSON(Output out); - - public void fromJSON(Map object); - } - - /** - * Static JSON Convertor. - * <p> - * may be implemented to provide static convertors for objects that may be - * registered with - * {@link JSON#registerConvertor(Class, org.eclipse.jetty.util.ajax.JSON.Convertor)} - * . These convertors are looked up by class, interface and super class by - * {@link JSON#getConvertor(Class)}. Convertors should be used when the - * classes to be converted cannot implement {@link Convertible} or - * {@link Generator}. - */ - public interface Convertor - { - public void toJSON(Object obj, Output out); - - public Object fromJSON(Map object); - } - - /** - * JSON Generator. A class that can add it's JSON representation directly to - * a StringBuffer. This is useful for object instances that are frequently - * converted and wish to avoid multiple Conversions - */ - public interface Generator - { - public void addJSON(Appendable buffer); - } - - /** - * A Literal JSON generator A utility instance of {@link JSON.Generator} - * that holds a pre-generated string on JSON text. - */ - public static class Literal implements Generator - { - private String _json; - - /** - * Construct a literal JSON instance for use by - * {@link JSON#toString(Object)}. If {@link Log#isDebugEnabled()} is - * true, the JSON will be parsed to check validity - * - * @param json - * A literal JSON string. - */ - public Literal(String json) - { - if (LOG.isDebugEnabled()) // TODO: Make this a configurable option on JSON instead! - parse(json); - _json = json; - } - - @Override - public String toString() - { - return _json; - } - - public void addJSON(Appendable buffer) - { - try - { - buffer.append(_json); - } - catch(IOException e) - { - throw new RuntimeException(e); - } - } - } -}
diff -r 166b16bda630 -r 9f5ba30722bb src/org/eclipse/jetty/util/ajax/JSONCollectionConvertor.java --- a/src/org/eclipse/jetty/util/ajax/JSONCollectionConvertor.java Wed Sep 07 21:21:32 2016 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.eclipse.jetty.util.ajax; - -import java.util.Collection; -import java.util.Collections; -import java.util.Map; - -import org.eclipse.jetty.util.Loader; - -public class JSONCollectionConvertor implements JSON.Convertor -{ - public void toJSON(Object obj, JSON.Output out) - { - out.addClass(obj.getClass()); - out.add("list", ((Collection)obj).toArray()); - } - - public Object fromJSON(Map object) - { - try - { - Collection result = (Collection)Loader.loadClass(getClass(), (String)object.get("class")).newInstance(); - Collections.addAll(result, (Object[])object.get("list")); - return result; - } - catch (Exception x) - { - if (x instanceof RuntimeException) - throw (RuntimeException)x; - throw new RuntimeException(x); - } - } -}
diff -r 166b16bda630 -r 9f5ba30722bb src/org/eclipse/jetty/util/ajax/JSONDateConvertor.java --- a/src/org/eclipse/jetty/util/ajax/JSONDateConvertor.java Wed Sep 07 21:21:32 2016 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.eclipse.jetty.util.ajax; - -import java.text.DateFormatSymbols; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import java.util.Map; -import java.util.TimeZone; - -import org.eclipse.jetty.util.DateCache; -import org.eclipse.jetty.util.ajax.JSON.Output; -import org.eclipse.jetty.util.log.Log; -import org.eclipse.jetty.util.log.Logger; - -/* ------------------------------------------------------------ */ -/** -* Convert a {@link Date} to JSON. -* If fromJSON is true in the constructor, the JSON generated will -* be of the form {class="java.util.Date",value="1/1/1970 12:00 GMT"} -* If fromJSON is false, then only the string value of the date is generated. -*/ -public class JSONDateConvertor implements JSON.Convertor -{ - private static final Logger LOG = Log.getLogger(JSONDateConvertor.class); - - private final boolean _fromJSON; - private final DateCache _dateCache; - private final SimpleDateFormat _format; - - public JSONDateConvertor() - { - this(false); - } - - public JSONDateConvertor(boolean fromJSON) - { - this(DateCache.DEFAULT_FORMAT,TimeZone.getTimeZone("GMT"),fromJSON); - } - - public JSONDateConvertor(String format,TimeZone zone,boolean fromJSON) - { - _dateCache=new DateCache(format); - _dateCache.setTimeZone(zone); - _fromJSON=fromJSON; - _format=new SimpleDateFormat(format); - _format.setTimeZone(zone); - } - - public JSONDateConvertor(String format, TimeZone zone, boolean fromJSON, Locale locale) - { - _dateCache = new DateCache(format, locale); - _dateCache.setTimeZone(zone); - _fromJSON = fromJSON; - _format = new SimpleDateFormat(format, new DateFormatSymbols(locale)); - _format.setTimeZone(zone); - } - - public Object fromJSON(Map map) - { - if (!_fromJSON) - throw new UnsupportedOperationException(); - try - { - synchronized(_format) - { - return _format.parseObject((String)map.get("value")); - } - } - catch(Exception e) - { - LOG.warn(e); - } - return null; - } - - public void toJSON(Object obj, Output out) - { - String date = _dateCache.format((Date)obj); - if (_fromJSON) - { - out.addClass(obj.getClass()); - out.add("value",date); - } - else - { - out.add(date); - } - } -}
diff -r 166b16bda630 -r 9f5ba30722bb src/org/eclipse/jetty/util/ajax/JSONEnumConvertor.java --- a/src/org/eclipse/jetty/util/ajax/JSONEnumConvertor.java Wed Sep 07 21:21:32 2016 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,93 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.eclipse.jetty.util.ajax; - -import java.lang.reflect.Method; -import java.util.Map; - -import org.eclipse.jetty.util.Loader; -import org.eclipse.jetty.util.ajax.JSON.Output; -import org.eclipse.jetty.util.log.Log; -import org.eclipse.jetty.util.log.Logger; - -/* ------------------------------------------------------------ */ -/** - * Convert an {@link Enum} to JSON. - * If fromJSON is true in the constructor, the JSON generated will - * be of the form {class="com.acme.TrafficLight",value="Green"} - * If fromJSON is false, then only the string value of the enum is generated. - * - * - */ -public class JSONEnumConvertor implements JSON.Convertor -{ - private static final Logger LOG = Log.getLogger(JSONEnumConvertor.class); - private boolean _fromJSON; - private Method _valueOf; - { - try - { - Class<?> e = Loader.loadClass(getClass(),"java.lang.Enum"); - _valueOf=e.getMethod("valueOf",Class.class,String.class); - } - catch(Exception e) - { - throw new RuntimeException("!Enums",e); - } - } - - public JSONEnumConvertor() - { - this(false); - } - - public JSONEnumConvertor(boolean fromJSON) - { - _fromJSON=fromJSON; - } - - public Object fromJSON(Map map) - { - if (!_fromJSON) - throw new UnsupportedOperationException(); - try - { - Class c=Loader.loadClass(getClass(),(String)map.get("class")); - return _valueOf.invoke(null,c,map.get("value")); - } - catch(Exception e) - { - LOG.warn(e); - } - return null; - } - - public void toJSON(Object obj, Output out) - { - if (_fromJSON) - { - out.addClass(obj.getClass()); - out.add("value",((Enum)obj).name()); - } - else - { - out.add(((Enum)obj).name()); - } - } -}
diff -r 166b16bda630 -r 9f5ba30722bb src/org/eclipse/jetty/util/ajax/JSONObjectConvertor.java --- a/src/org/eclipse/jetty/util/ajax/JSONObjectConvertor.java Wed Sep 07 21:21:32 2016 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,115 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.eclipse.jetty.util.ajax; - -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - -import org.eclipse.jetty.util.ajax.JSON.Output; - -/* ------------------------------------------------------------ */ -/** - * Convert an Object to JSON using reflection on getters methods. - * - * - * - */ -public class JSONObjectConvertor implements JSON.Convertor -{ - private boolean _fromJSON; - private Set _excluded=null; - - public JSONObjectConvertor() - { - _fromJSON=false; - } - - public JSONObjectConvertor(boolean fromJSON) - { - _fromJSON=fromJSON; - } - - /* ------------------------------------------------------------ */ - /** - * @param fromJSON - * @param excluded An array of field names to exclude from the conversion - */ - public JSONObjectConvertor(boolean fromJSON,String[] excluded) - { - _fromJSON=fromJSON; - if (excluded!=null) - _excluded=new HashSet(Arrays.asList(excluded)); - } - - public Object fromJSON(Map map) - { - if (_fromJSON) - throw new UnsupportedOperationException(); - return map; - } - - public void toJSON(Object obj, Output out) - { - try - { - Class c=obj.getClass(); - - if (_fromJSON) - out.addClass(obj.getClass()); - - Method[] methods = obj.getClass().getMethods(); - - for (int i=0;i<methods.length;i++) - { - Method m=methods[i]; - if (!Modifier.isStatic(m.getModifiers()) && - m.getParameterTypes().length==0 && - m.getReturnType()!=null && - m.getDeclaringClass()!=Object.class) - { - String name=m.getName(); - if (name.startsWith("is")) - name=name.substring(2,3).toLowerCase(Locale.ENGLISH)+name.substring(3); - else if (name.startsWith("get")) - name=name.substring(3,4).toLowerCase(Locale.ENGLISH)+name.substring(4); - else - continue; - - if (includeField(name,obj,m)) - out.add(name, m.invoke(obj,(Object[])null)); - } - } - } - catch (Throwable e) - { - throw new IllegalArgumentException(e); - } - } - - protected boolean includeField(String name, Object o, Method m) - { - return _excluded==null || !_excluded.contains(name); - } - -}
diff -r 166b16bda630 -r 9f5ba30722bb src/org/eclipse/jetty/util/ajax/JSONPojoConvertor.java --- a/src/org/eclipse/jetty/util/ajax/JSONPojoConvertor.java Wed Sep 07 21:21:32 2016 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,431 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.eclipse.jetty.util.ajax; - -import java.lang.reflect.Array; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - -import org.eclipse.jetty.util.ajax.JSON.Output; -import org.eclipse.jetty.util.log.Log; -import org.eclipse.jetty.util.log.Logger; -/** - * Converts POJOs to JSON and vice versa. - * The key difference: - * - returns the actual object from Convertor.fromJSON (JSONObjectConverter returns a Map) - * - the getters/setters are resolved at initialization (JSONObjectConverter resolves it at runtime) - * - correctly sets the number fields - * - */ -public class JSONPojoConvertor implements JSON.Convertor -{ - private static final Logger LOG = Log.getLogger(JSONPojoConvertor.class); - public static final Object[] GETTER_ARG = new Object[]{}, NULL_ARG = new Object[]{null}; - private static final Map<Class<?>, NumberType> __numberTypes = new HashMap<Class<?>, NumberType>(); - - public static NumberType getNumberType(Class<?> clazz) - { - return __numberTypes.get(clazz); - } - - protected boolean _fromJSON; - protected Class<?> _pojoClass; - protected Map<String,Method> _getters = new HashMap<String,Method>(); - protected Map<String,Setter> _setters = new HashMap<String,Setter>(); - protected Set<String> _excluded; - - /** - * @param pojoClass The class to convert - */ - public JSONPojoConvertor(Class<?> pojoClass) - { - this(pojoClass, (Set<String>)null, true); - } - - /** - * @param pojoClass The class to convert - * @param excluded The fields to exclude - */ - public JSONPojoConvertor(Class<?> pojoClass, String[] excluded) - { - this(pojoClass, new HashSet<String>(Arrays.asList(excluded)), true); - } - - /** - * @param pojoClass The class to convert - * @param excluded The fields to exclude - */ - public JSONPojoConvertor(Class<?> pojoClass, Set<String> excluded) - { - this(pojoClass, excluded, true); - } - - /** - * @param pojoClass The class to convert - * @param excluded The fields to exclude - * @param fromJSON If true, add a class field to the JSON - */ - public JSONPojoConvertor(Class<?> pojoClass, Set<String> excluded, boolean fromJSON) - { - _pojoClass = pojoClass; - _excluded = excluded; - _fromJSON = fromJSON; - init(); - } - - /** - * @param pojoClass The class to convert - * @param fromJSON If true, add a class field to the JSON - */ - public JSONPojoConvertor(Class<?> pojoClass, boolean fromJSON) - { - this(pojoClass, (Set<String>)null, fromJSON); - } - - /* ------------------------------------------------------------ */ - protected void init() - { - Method[] methods = _pojoClass.getMethods(); - for (int i=0;i<methods.length;i++) - { - Method m=methods[i]; - if (!Modifier.isStatic(m.getModifiers()) && m.getDeclaringClass()!=Object.class) - { - String name=m.getName(); - switch(m.getParameterTypes().length) - { - case 0: - - if(m.getReturnType()!=null) - { - if (name.startsWith("is") && name.length()>2) - name=name.substring(2,3).toLowerCase(Locale.ENGLISH)+name.substring(3); - else if (name.startsWith("get") && name.length()>3) - name=name.substring(3,4).toLowerCase(Locale.ENGLISH)+name.substring(4); - else - break; - if(includeField(name, m)) - addGetter(name, m); - } - break; - case 1: - if (name.startsWith("set") && name.length()>3) - { - name=name.substring(3,4).toLowerCase(Locale.ENGLISH)+name.substring(4); - if(includeField(name, m)) - addSetter(name, m); - } - break; - } - } - } - } - - /* ------------------------------------------------------------ */ - protected void addGetter(String name, Method method) - { - _getters.put(name, method); - } - - /* ------------------------------------------------------------ */ - protected void addSetter(String name, Method method) - { - _setters.put(name, new Setter(name, method)); - } - - /* ------------------------------------------------------------ */ - protected Setter getSetter(String name) - { - return _setters.get(name); - } - - /* ------------------------------------------------------------ */ - protected boolean includeField(String name, Method m) - { - return _excluded==null || !_excluded.contains(name); - } - - /* ------------------------------------------------------------ */ - protected int getExcludedCount() - { - return _excluded==null ? 0 : _excluded.size(); - } - - /* ------------------------------------------------------------ */ - public Object fromJSON(Map object) - { - Object obj = null; - try - { - obj = _pojoClass.newInstance(); - } - catch(Exception e) - { - // TODO return Map instead? - throw new RuntimeException(e); - } - - setProps(obj, object); - return obj; - } - - /* ------------------------------------------------------------ */ - public int setProps(Object obj, Map<?,?> props) - { - int count = 0; - for(Iterator<?> iterator = props.entrySet().iterator(); iterator.hasNext();) - { - Map.Entry<?, ?> entry = (Map.Entry<?,?>) iterator.next(); - Setter setter = getSetter((String)entry.getKey()); - if(setter!=null) - { - try - { - setter.invoke(obj, entry.getValue()); - count++; - } - catch(Exception e) - { - // TODO throw exception? - LOG.warn(_pojoClass.getName()+"#"+setter.getPropertyName()+" not set from "+ - (entry.getValue().getClass().getName())+"="+entry.getValue().toString()); - log(e); - } - } - } - return count; - } - - /* ------------------------------------------------------------ */ - public void toJSON(Object obj, Output out) - { - if(_fromJSON) - out.addClass(_pojoClass); - for(Map.Entry<String,Method> entry : _getters.entrySet()) - { - try - { - out.add(entry.getKey(), entry.getValue().invoke(obj, GETTER_ARG)); - } - catch(Exception e) - { - // TODO throw exception? - LOG.warn("{} property '{}' excluded. (errors)", _pojoClass.getName(), - entry.getKey()); - log(e); - } - } - } - - /* ------------------------------------------------------------ */ - protected void log(Throwable t) - { - LOG.ignore(t); - } - - /* ------------------------------------------------------------ */ - public static class Setter - { - protected String _propertyName; - protected Method _setter; - protected NumberType _numberType; - protected Class<?> _type; - protected Class<?> _componentType; - - public Setter(String propertyName, Method method) - { - _propertyName = propertyName; - _setter = method; - _type = method.getParameterTypes()[0]; - _numberType = __numberTypes.get(_type); - if(_numberType==null && _type.isArray()) - { - _componentType = _type.getComponentType(); - _numberType = __numberTypes.get(_componentType); - } - } - - public String getPropertyName() - { - return _propertyName; - } - - public Method getMethod() - { - return _setter; - } - - public NumberType getNumberType() - { - return _numberType; - } - - public Class<?> getType() - { - return _type; - } - - public Class<?> getComponentType() - { - return _componentType; - } - - public boolean isPropertyNumber() - { - return _numberType!=null; - } - - public void invoke(Object obj, Object value) throws IllegalArgumentException, - IllegalAccessException, InvocationTargetException - { - if(value==null) - _setter.invoke(obj, NULL_ARG); - else - invokeObject(obj, value); - } - - protected void invokeObject(Object obj, Object value) throws IllegalArgumentException, - IllegalAccessException, InvocationTargetException - { - - if (_type.isEnum()) - { - if (value instanceof Enum) - _setter.invoke(obj, new Object[]{value}); - else - _setter.invoke(obj, new Object[]{Enum.valueOf((Class<? extends Enum>)_type,value.toString())}); - } - else if(_numberType!=null && value instanceof Number) - { - _setter.invoke(obj, new Object[]{_numberType.getActualValue((Number)value)}); - } - else if (Character.TYPE.equals(_type) || Character.class.equals(_type)) - { - _setter.invoke(obj, new Object[]{String.valueOf(value).charAt(0)}); - } - else if(_componentType!=null && value.getClass().isArray()) - { - if(_numberType==null) - { - int len = Array.getLength(value); - Object array = Array.newInstance(_componentType, len); - try - { - System.arraycopy(value, 0, array, 0, len); - } - catch(Exception e) - { - // unusual array with multiple types - LOG.ignore(e); - _setter.invoke(obj, new Object[]{value}); - return; - } - _setter.invoke(obj, new Object[]{array}); - } - else - { - Object[] old = (Object[])value; - Object array = Array.newInstance(_componentType, old.length); - try - { - for(int i=0; i<old.length; i++) - Array.set(array, i, _numberType.getActualValue((Number)old[i])); - } - catch(Exception e) - { - // unusual array with multiple types - LOG.ignore(e); - _setter.invoke(obj, new Object[]{value}); - return; - } - _setter.invoke(obj, new Object[]{array}); - } - } - else - _setter.invoke(obj, new Object[]{value}); - } - } - - public interface NumberType - { - public Object getActualValue(Number number); - } - - public static final NumberType SHORT = new NumberType() - { - public Object getActualValue(Number number) - { - return new Short(number.shortValue()); - } - }; - - public static final NumberType INTEGER = new NumberType() - { - public Object getActualValue(Number number) - { - return new Integer(number.intValue()); - } - }; - - public static final NumberType FLOAT = new NumberType() - { - public Object getActualValue(Number number) - { - return new Float(number.floatValue()); - } - }; - - public static final NumberType LONG = new NumberType() - { - public Object getActualValue(Number number) - { - return number instanceof Long ? number : new Long(number.longValue()); - } - }; - - public static final NumberType DOUBLE = new NumberType() - { - public Object getActualValue(Number number) - { - return number instanceof Double ? number : new Double(number.doubleValue()); - } - }; - - static - { - __numberTypes.put(Short.class, SHORT); - __numberTypes.put(Short.TYPE, SHORT); - __numberTypes.put(Integer.class, INTEGER); - __numberTypes.put(Integer.TYPE, INTEGER); - __numberTypes.put(Long.class, LONG); - __numberTypes.put(Long.TYPE, LONG); - __numberTypes.put(Float.class, FLOAT); - __numberTypes.put(Float.TYPE, FLOAT); - __numberTypes.put(Double.class, DOUBLE); - __numberTypes.put(Double.TYPE, DOUBLE); - } -}
diff -r 166b16bda630 -r 9f5ba30722bb src/org/eclipse/jetty/util/ajax/JSONPojoConvertorFactory.java --- a/src/org/eclipse/jetty/util/ajax/JSONPojoConvertorFactory.java Wed Sep 07 21:21:32 2016 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.eclipse.jetty.util.ajax; - -import java.util.Map; - -import org.eclipse.jetty.util.Loader; -import org.eclipse.jetty.util.ajax.JSON.Convertor; -import org.eclipse.jetty.util.ajax.JSON.Output; - -public class JSONPojoConvertorFactory implements JSON.Convertor -{ - private final JSON _json; - private final boolean _fromJson; - - public JSONPojoConvertorFactory(JSON json) - { - if (json==null) - { - throw new IllegalArgumentException(); - } - _json=json; - _fromJson=true; - } - - /* ------------------------------------------------------------ */ - /** - * @param json The JSON instance to use - * @param fromJSON If true, the class name of the objects is included - * in the generated JSON and is used to instantiate the object when - * JSON is parsed (otherwise a Map is used). - */ - public JSONPojoConvertorFactory(JSON json,boolean fromJSON) - { - if (json==null) - { - throw new IllegalArgumentException(); - } - _json=json; - _fromJson=fromJSON; - } - - /* ------------------------------------------------------------ */ - public void toJSON(Object obj, Output out) - { - String clsName=obj.getClass().getName(); - Convertor convertor=_json.getConvertorFor(clsName); - if (convertor==null) - { - try - { - Class cls=Loader.loadClass(JSON.class,clsName); - convertor=new JSONPojoConvertor(cls,_fromJson); - _json.addConvertorFor(clsName, convertor); - } - catch (ClassNotFoundException e) - { - JSON.LOG.warn(e); - } - } - if (convertor!=null) - { - convertor.toJSON(obj, out); - } - } - - public Object fromJSON(Map object) - { - Map map=object; - String clsName=(String)map.get("class"); - if (clsName!=null) - { - Convertor convertor=_json.getConvertorFor(clsName); - if (convertor==null) - { - try - { - Class cls=Loader.loadClass(JSON.class,clsName); - convertor=new JSONPojoConvertor(cls,_fromJson); - _json.addConvertorFor(clsName, convertor); - } - catch (ClassNotFoundException e) - { - JSON.LOG.warn(e); - } - } - if (convertor!=null) - { - return convertor.fromJSON(object); - } - } - return map; - } -}