Fixes #3385 Modernize jetty-util-ajax.

Added type parameter to methods that were using raw types.
Updated the implementation to use generics.
Deprecated static methods.
Updated usages.

Signed-off-by: Simone Bordet <simone.bordet@gmail.com>
This commit is contained in:
Simone Bordet 2020-01-14 12:03:18 +01:00
parent 51b97d5170
commit 9b5aa73f59
26 changed files with 1180 additions and 1415 deletions

View File

@ -101,19 +101,19 @@ public class AbstractRestServlet extends HttpServlet
}
}
protected String generateThumbs(Queue<Map<String, String>> results)
protected String generateThumbs(Queue<Map<String, Object>> results)
{
StringBuilder thumbs = new StringBuilder();
for (Map<String, String> m : results)
for (Map<String, Object> m : results)
{
if (!m.containsKey("GalleryURL"))
continue;
thumbs.append("<a href=\"" + m.get("ViewItemURLForNaturalSearch") + "\">");
thumbs.append("<img class='thumb' border='1px' height='25px'" +
" src='" + m.get("GalleryURL") + "'" +
" title='" + m.get("Title") + "'" +
"/>");
thumbs.append("<a href=\"").append(m.get("ViewItemURLForNaturalSearch")).append("\">");
thumbs.append("<img class='thumb' border='1px' height='25px' src='")
.append(m.get("GalleryURL")).append("'")
.append(" title='").append(m.get("Title")).append("'")
.append("/>");
thumbs.append("</a>&nbsp;");
}
return thumbs.toString();

View File

@ -77,17 +77,18 @@ public class AsyncRestServlet extends AbstractRestServlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
Long start = System.nanoTime();
long start = System.nanoTime();
// Do we have results yet?
Queue<Map<String, String>> results = (Queue<Map<String, String>>)request.getAttribute(RESULTS_ATTR);
@SuppressWarnings("unchecked")
Queue<Map<String, Object>> results = (Queue<Map<String, Object>>)request.getAttribute(RESULTS_ATTR);
// If no results, this must be the first dispatch, so send the REST request(s)
if (results == null)
{
// define results data structures
final Queue<Map<String, String>> resultsQueue = new ConcurrentLinkedQueue<>();
request.setAttribute(RESULTS_ATTR, results = resultsQueue);
results = new ConcurrentLinkedQueue<>();
request.setAttribute(RESULTS_ATTR, results);
// suspend the request
// This is done before scheduling async handling to avoid race of
@ -100,13 +101,14 @@ public class AsyncRestServlet extends AbstractRestServlet
final AtomicInteger outstanding = new AtomicInteger(keywords.length);
// Send request each keyword
Queue<Map<String, Object>> resultsQueue = results;
for (final String item : keywords)
{
_client.newRequest(restURL(item)).method(HttpMethod.GET).send(
new AsyncRestRequest()
{
@Override
void onAuctionFound(Map<String, String> auction)
void onAuctionFound(Map<String, Object> auction)
{
resultsQueue.add(auction);
}
@ -163,9 +165,9 @@ public class AsyncRestServlet extends AbstractRestServlet
out.close();
}
private abstract class AsyncRestRequest extends Response.Listener.Adapter
private abstract static class AsyncRestRequest extends Response.Listener.Adapter
{
final Utf8StringBuilder _content = new Utf8StringBuilder();
private final Utf8StringBuilder _content = new Utf8StringBuilder();
AsyncRestRequest()
{
@ -182,13 +184,16 @@ public class AsyncRestServlet extends AbstractRestServlet
public void onComplete(Result result)
{
// extract auctions from the results
Map<String, ?> query = (Map<String, ?>)JSON.parse(_content.toString());
@SuppressWarnings("unchecked")
Map<String, Object> query = (Map<String, Object>)new JSON().fromJSON(_content.toString());
Object[] auctions = (Object[])query.get("Item");
if (auctions != null)
{
for (Object o : auctions)
{
onAuctionFound((Map<String, String>)o);
@SuppressWarnings("unchecked")
Map<String, Object> auction = (Map<String, Object>)o;
onAuctionFound(auction);
}
}
onComplete();
@ -196,8 +201,7 @@ public class AsyncRestServlet extends AbstractRestServlet
abstract void onComplete();
abstract void onAuctionFound(Map<String, String> details);
abstract void onAuctionFound(Map<String, Object> details);
}
@Override

View File

@ -45,7 +45,7 @@ public class SerialRestServlet extends AbstractRestServlet
final long start = System.nanoTime();
String[] keywords = sanitize(request.getParameter(ITEMS_PARAM)).split(",");
Queue<Map<String, String>> results = new LinkedList<Map<String, String>>();
Queue<Map<String, Object>> results = new LinkedList<>();
// make all requests serially
for (String itemName : keywords)
@ -55,13 +55,16 @@ public class SerialRestServlet extends AbstractRestServlet
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
Map query = (Map)JSON.parse(new BufferedReader(new InputStreamReader(connection.getInputStream())));
@SuppressWarnings("unchecked")
Map<String, Object> query = (Map<String, Object>)new JSON().fromJSON(new BufferedReader(new InputStreamReader(connection.getInputStream())));
Object[] auctions = (Object[])query.get("Item");
if (auctions != null)
{
for (Object o : auctions)
{
results.add((Map)o);
@SuppressWarnings("unchecked")
Map<String, Object> auction = (Map<String, Object>)o;
results.add(auction);
}
}
}

View File

@ -83,7 +83,7 @@ public class ManyHandlers
if (!params.isEmpty())
{
response.setContentType("text/plain");
response.getWriter().println(JSON.toString(params));
response.getWriter().println(new JSON().toJSON(params));
baseRequest.setHandled(true);
}
}

View File

@ -72,8 +72,9 @@ public class ManyHandlersTest extends AbstractEmbeddedTest
// test response content
String responseBody = response.getContentAsString();
Object jsonObj = JSON.parse(responseBody);
Map jsonMap = (Map)jsonObj;
Object jsonObj = new JSON().fromJSON(responseBody);
@SuppressWarnings("unchecked")
Map<String, Object> jsonMap = (Map<String, Object>)jsonObj;
assertThat("Response JSON keys.size", jsonMap.keySet().size(), is(2));
}

View File

@ -68,11 +68,14 @@ public class HpackPerfTest
assertNotNull(files);
// Parse JSON
Map[] stories = new Map[files.length];
@SuppressWarnings("unchecked")
Map<String, Object>[] stories = new Map[files.length];
int i = 0;
for (String story : files)
for (String file : files)
{
stories[i++] = (Map)JSON.parse(new FileReader(new File(data, story)));
@SuppressWarnings("unchecked")
var story = (Map<String, Object>)new JSON().fromJSON(new FileReader(new File(data, file)));
stories[i++] = story;
}
ByteBuffer buffer = BufferUtil.allocate(256 * 1024);
@ -88,27 +91,27 @@ public class HpackPerfTest
encodeStories(buffer, stories, "response");
}
private void encodeStories(ByteBuffer buffer, Map[] stories, String type) throws Exception
private void encodeStories(ByteBuffer buffer, Map<String, Object>[] stories, String type) throws Exception
{
for (Map story : stories)
for (Map<String, Object> story : stories)
{
if (type.equals(story.get("context")))
{
HpackEncoder encoder = new HpackEncoder(_maxDynamicTableSize, _maxDynamicTableSize);
encoder.setValidateEncoding(false);
// System.err.println(story);
Object[] cases = (Object[])story.get("cases");
for (Object c : cases)
{
// System.err.println(" "+c);
Object[] headers = (Object[])((Map)c).get("headers");
@SuppressWarnings("unchecked")
var kase = (Map<String, Object>)c;
Object[] headers = (Object[])kase.get("headers");
// System.err.println(" "+headers);
HttpFields fields = new HttpFields();
for (Object header : headers)
{
@SuppressWarnings("unchecked")
Map<String, String> h = (Map)header;
var h = (Map<String, String>)header;
Map.Entry<String, String> e = h.entrySet().iterator().next();
fields.add(e.getKey(), e.getValue());
_unencodedSize += e.getKey().length() + e.getValue().length();

View File

@ -54,10 +54,13 @@ public class JwtDecoder
String jwtClaimString = new String(decoder.decode(padJWTSection(sections[1])), StandardCharsets.UTF_8);
String jwtSignature = sections[2];
Object parsedJwtHeader = JSON.parse(jwtHeaderString);
JSON json = new JSON();
Object parsedJwtHeader = json.fromJSON(jwtHeaderString);
if (!(parsedJwtHeader instanceof Map))
throw new IllegalStateException("Invalid JWT header");
Map<String, Object> jwtHeader = (Map)parsedJwtHeader;
@SuppressWarnings("unchecked")
Map<String, Object> jwtHeader = (Map<String, Object>)parsedJwtHeader;
if (LOG.isDebugEnabled())
LOG.debug("JWT Header: {}", jwtHeader);
@ -67,10 +70,10 @@ public class JwtDecoder
if (LOG.isDebugEnabled())
LOG.debug("JWT signature not validated {}", jwtSignature);
Object parsedClaims = JSON.parse(jwtClaimString);
Object parsedClaims = json.fromJSON(jwtClaimString);
if (!(parsedClaims instanceof Map))
throw new IllegalStateException("Could not decode JSON for JWT claims.");
return (Map)parsedClaims;
return (Map<String, Object>)parsedClaims;
}
static byte[] padJWTSection(String unpaddedEncodedJwtSection)

View File

@ -128,11 +128,11 @@ public class OpenIdConfiguration extends ContainerLifeCycle
Map<String, Object> result;
String responseBody = httpClient.GET(provider + CONFIG_PATH)
.getContentAsString();
Object parsedResult = JSON.parse(responseBody);
Object parsedResult = new JSON().fromJSON(responseBody);
if (parsedResult instanceof Map)
{
Map<?, ?> rawResult = (Map)parsedResult;
Map<?, ?> rawResult = (Map<?, ?>)parsedResult;
result = rawResult.entrySet().stream()
.collect(Collectors.toMap(it -> it.getKey().toString(), Map.Entry::getValue));
}

View File

@ -185,9 +185,9 @@ public class OpenIdCredentials implements Serializable
if (LOG.isDebugEnabled())
LOG.debug("Authentication response: {}", responseBody);
Object parsedResponse = JSON.parse(responseBody);
Object parsedResponse = new JSON().fromJSON(responseBody);
if (!(parsedResponse instanceof Map))
throw new IllegalStateException("Malformed response from OpenID Provider");
return (Map)parsedResponse;
return (Map<String, Object>)parsedResponse;
}
}

View File

@ -863,20 +863,21 @@ public class AsyncMiddleManServletTest
@Test
public void testAfterContentTransformer() throws Exception
{
final String key0 = "id";
String key0 = "id";
long value0 = 1;
final String key1 = "channel";
String key1 = "channel";
String value1 = "foo";
final String json = "{ \"" + key0 + "\":" + value0 + ", \"" + key1 + "\":\"" + value1 + "\" }";
String jsonString = "{ \"" + key0 + "\":" + value0 + ", \"" + key1 + "\":\"" + value1 + "\" }";
startServer(new HttpServlet()
{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException
{
response.getOutputStream().write(json.getBytes(StandardCharsets.UTF_8));
response.getOutputStream().write(jsonString.getBytes(StandardCharsets.UTF_8));
}
});
final String key2 = "c";
String key2 = "c";
JSON json = new JSON();
startProxy(new AsyncMiddleManServlet()
{
@Override
@ -889,12 +890,12 @@ public class AsyncMiddleManServletTest
{
InputStream input = source.getInputStream();
@SuppressWarnings("unchecked")
Map<String, Object> obj = (Map<String, Object>)JSON.parse(new InputStreamReader(input, StandardCharsets.UTF_8));
Map<String, Object> obj = (Map<String, Object>)json.fromJSON(new InputStreamReader(input, StandardCharsets.UTF_8));
// Transform the object.
obj.put(key2, obj.remove(key1));
try (OutputStream output = sink.getOutputStream())
{
output.write(JSON.toString(obj).getBytes(StandardCharsets.UTF_8));
output.write(json.toJSON(obj).getBytes(StandardCharsets.UTF_8));
return true;
}
}
@ -909,7 +910,7 @@ public class AsyncMiddleManServletTest
assertEquals(200, response.getStatus());
@SuppressWarnings("unchecked")
Map<String, Object> obj = (Map<String, Object>)JSON.parse(response.getContentAsString());
Map<String, Object> obj = (Map<String, Object>)json.fromJSON(response.getContentAsString());
assertNotNull(obj);
assertEquals(2, obj.size());
assertEquals(value0, obj.get(key0));
@ -984,24 +985,25 @@ public class AsyncMiddleManServletTest
public void testAfterContentTransformerOverflowingToDisk() throws Exception
{
// Make sure the temporary directory we use exists and it's empty.
final Path targetTestsDir = prepareTargetTestsDir();
Path targetTestsDir = prepareTargetTestsDir();
final String key0 = "id";
String key0 = "id";
long value0 = 1;
final String key1 = "channel";
String key1 = "channel";
String value1 = "foo";
final String json = "{ \"" + key0 + "\":" + value0 + ", \"" + key1 + "\":\"" + value1 + "\" }";
String jsonString = "{ \"" + key0 + "\":" + value0 + ", \"" + key1 + "\":\"" + value1 + "\" }";
startServer(new HttpServlet()
{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException
{
response.getOutputStream().write(json.getBytes(StandardCharsets.UTF_8));
response.getOutputStream().write(jsonString.getBytes(StandardCharsets.UTF_8));
}
});
final String inputPrefix = "in_";
final String outputPrefix = "out_";
final String key2 = "c";
String inputPrefix = "in_";
String outputPrefix = "out_";
String key2 = "c";
JSON json = new JSON();
startProxy(new AsyncMiddleManServlet()
{
@Override
@ -1014,18 +1016,18 @@ public class AsyncMiddleManServletTest
{
InputStream input = source.getInputStream();
@SuppressWarnings("unchecked")
Map<String, Object> obj = (Map<String, Object>)JSON.parse(new InputStreamReader(input, StandardCharsets.UTF_8));
Map<String, Object> obj = (Map<String, Object>)json.fromJSON(new InputStreamReader(input, StandardCharsets.UTF_8));
// Transform the object.
obj.put(key2, obj.remove(key1));
try (OutputStream output = sink.getOutputStream())
{
output.write(JSON.toString(obj).getBytes(StandardCharsets.UTF_8));
output.write(json.toJSON(obj).getBytes(StandardCharsets.UTF_8));
return true;
}
}
};
transformer.setOverflowDirectory(targetTestsDir);
int maxBufferSize = json.length() / 4;
int maxBufferSize = jsonString.length() / 4;
transformer.setMaxInputBufferSize(maxBufferSize);
transformer.setInputFilePrefix(inputPrefix);
transformer.setMaxOutputBufferSize(maxBufferSize);
@ -1041,7 +1043,7 @@ public class AsyncMiddleManServletTest
assertEquals(200, response.getStatus());
@SuppressWarnings("unchecked")
Map<String, Object> obj = (Map<String, Object>)JSON.parse(response.getContentAsString());
Map<String, Object> obj = (Map<String, Object>)json.fromJSON(response.getContentAsString());
assertNotNull(obj);
assertEquals(2, obj.size());
assertEquals(value0, obj.get(key0));
@ -1202,19 +1204,20 @@ public class AsyncMiddleManServletTest
private void testAfterContentTransformerDoNoTransform(final boolean readSource, final boolean useDisk) throws Exception
{
final String key0 = "id";
String key0 = "id";
long value0 = 1;
final String key1 = "channel";
String key1 = "channel";
String value1 = "foo";
final String json = "{ \"" + key0 + "\":" + value0 + ", \"" + key1 + "\":\"" + value1 + "\" }";
String jsonString = "{ \"" + key0 + "\":" + value0 + ", \"" + key1 + "\":\"" + value1 + "\" }";
startServer(new HttpServlet()
{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException
{
response.getOutputStream().write(json.getBytes(StandardCharsets.UTF_8));
response.getOutputStream().write(jsonString.getBytes(StandardCharsets.UTF_8));
}
});
JSON json = new JSON();
startProxy(new AsyncMiddleManServlet()
{
@Override
@ -1233,7 +1236,7 @@ public class AsyncMiddleManServletTest
if (readSource)
{
InputStream input = source.getInputStream();
JSON.parse(new InputStreamReader(input, StandardCharsets.UTF_8));
json.fromJSON(new InputStreamReader(input, StandardCharsets.UTF_8));
}
// No transformation.
return false;
@ -1249,7 +1252,7 @@ public class AsyncMiddleManServletTest
assertEquals(200, response.getStatus());
@SuppressWarnings("unchecked")
Map<String, Object> obj = (Map<String, Object>)JSON.parse(response.getContentAsString());
Map<String, Object> obj = (Map<String, Object>)json.fromJSON(response.getContentAsString());
assertNotNull(obj);
assertEquals(2, obj.size());
assertEquals(value0, obj.get(key0));

View File

@ -474,7 +474,8 @@ public class ErrorHandlerTest
}
else if (contentType.contains("text/json"))
{
Map jo = (Map)JSON.parse(response.getContent());
@SuppressWarnings("unchecked")
Map<String, Object> jo = (Map<String, Object>)new JSON().fromJSON(response.getContent());
Set<String> acceptableKeyNames = new HashSet<>();
acceptableKeyNames.add("url");

View File

@ -30,16 +30,18 @@ public class JSONCollectionConvertor implements JSON.Convertor
public void toJSON(Object obj, JSON.Output out)
{
out.addClass(obj.getClass());
out.add("list", ((Collection)obj).toArray());
Collection<?> collection = (Collection<?>)obj;
out.add("list", collection.toArray());
}
@Override
public Object fromJSON(Map object)
public Object fromJSON(Map<String, Object> object)
{
try
{
Collection result = (Collection)Loader.loadClass((String)object.get("class"))
.getDeclaredConstructor().newInstance();
Class<?> cls = Loader.loadClass((String)object.get("class"));
@SuppressWarnings("unchecked")
Collection<Object> result = (Collection<Object>)cls.getConstructor().newInstance();
Collections.addAll(result, (Object[])object.get("list"));
return result;
}

View File

@ -71,7 +71,7 @@ public class JSONDateConvertor implements JSON.Convertor
}
@Override
public Object fromJSON(Map map)
public Object fromJSON(Map<String, Object> map)
{
if (!_fromJSON)
throw new UnsupportedOperationException();

View File

@ -18,7 +18,6 @@
package org.eclipse.jetty.util.ajax;
import java.lang.reflect.Method;
import java.util.Map;
import org.eclipse.jetty.util.Loader;
@ -36,19 +35,6 @@ 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("java.lang.Enum");
_valueOf = e.getMethod("valueOf", Class.class, String.class);
}
catch (Exception e)
{
throw new RuntimeException("!Enums", e);
}
}
public JSONEnumConvertor()
{
@ -61,21 +47,22 @@ public class JSONEnumConvertor implements JSON.Convertor
}
@Override
public Object fromJSON(Map map)
public Object fromJSON(Map<String, Object> map)
{
if (!_fromJSON)
throw new UnsupportedOperationException();
try
{
Class c = Loader.loadClass((String)map.get("class"));
return _valueOf.invoke(null, c, map.get("value"));
@SuppressWarnings({"rawtypes", "unchecked"})
Class<? extends Enum> type = Loader.loadClass((String)map.get("class"));
return Enum.valueOf(type, (String)map.get("value"));
}
catch (Exception e)
{
LOG.warn(e);
}
return null;
}
}
@Override
public void toJSON(Object obj, Output out)
@ -83,11 +70,11 @@ public class JSONEnumConvertor implements JSON.Convertor
if (_fromJSON)
{
out.addClass(obj.getClass());
out.add("value", ((Enum)obj).name());
out.add("value", ((Enum<?>)obj).name());
}
else
{
out.add(((Enum)obj).name());
out.add(((Enum<?>)obj).name());
}
}
}

View File

@ -20,8 +20,6 @@ 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;
@ -29,36 +27,35 @@ import java.util.Set;
import org.eclipse.jetty.util.ajax.JSON.Output;
/**
* Convert an Object to JSON using reflection on getters methods.
* Converts an Object to JSON using reflection on getters methods.
*/
public class JSONObjectConvertor implements JSON.Convertor
{
private boolean _fromJSON;
private Set _excluded = null;
private final boolean _fromJSON;
private final Set<String> _excluded;
public JSONObjectConvertor()
{
_fromJSON = false;
this(false);
}
public JSONObjectConvertor(boolean fromJSON)
{
_fromJSON = fromJSON;
this(fromJSON, null);
}
/**
* @param fromJSON true to convert from JSON
* @param excluded An array of field names to exclude from the conversion
* @param excludedFieldNames An array of field names to exclude from the conversion
*/
public JSONObjectConvertor(boolean fromJSON, String[] excluded)
public JSONObjectConvertor(boolean fromJSON, String[] excludedFieldNames)
{
_fromJSON = fromJSON;
if (excluded != null)
_excluded = new HashSet(Arrays.asList(excluded));
_excluded = excludedFieldNames == null ? Set.of() : Set.of(excludedFieldNames);
}
@Override
public Object fromJSON(Map map)
public Object fromJSON(Map<String, Object> map)
{
if (_fromJSON)
throw new UnsupportedOperationException();
@ -70,16 +67,13 @@ public class JSONObjectConvertor implements JSON.Convertor
{
try
{
Class c = obj.getClass();
Class<?> c = obj.getClass();
if (_fromJSON)
out.addClass(obj.getClass());
out.addClass(c);
Method[] methods = obj.getClass().getMethods();
for (int i = 0; i < methods.length; i++)
for (Method m : c.getMethods())
{
Method m = methods[i];
if (!Modifier.isStatic(m.getModifiers()) &&
m.getParameterCount() == 0 &&
m.getReturnType() != null &&
@ -92,7 +86,6 @@ public class JSONObjectConvertor implements JSON.Convertor
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));
}
@ -106,6 +99,6 @@ public class JSONObjectConvertor implements JSON.Convertor
protected boolean includeField(String name, Object o, Method m)
{
return _excluded == null || !_excluded.contains(name);
return !_excluded.contains(name);
}
}

View File

@ -19,13 +19,11 @@
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;
@ -35,18 +33,37 @@ 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
* <p>Converts POJOs to JSON and vice versa.</p>
* <p>The key differences with respect to {@link JSONObjectConvertor} are:</p>
* <ul>
* <li>returns the actual object from Convertor.fromJSON (JSONObjectConverter returns a Map)</li>
* <li>the getters/setters are resolved at initialization (JSONObjectConverter resolves it at runtime)</li>
* <li>correctly sets the number fields</li>
* </ul>
*/
public class JSONPojoConvertor implements JSON.Convertor
{
private static final Logger LOG = Log.getLogger(JSONPojoConvertor.class);
public static final Object[] GETTER_ARG = new Object[]{};
public static final Object[] NULL_ARG = new Object[]{null};
private static final Map<Class<?>, NumberType> __numberTypes = new HashMap<>();
private static final NumberType SHORT = Number::shortValue;
private static final NumberType INTEGER = Number::intValue;
private static final NumberType FLOAT = Number::floatValue;
private static final NumberType LONG = Number::longValue;
private static final NumberType 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);
}
public static NumberType getNumberType(Class<?> clazz)
{
@ -55,8 +72,8 @@ public class JSONPojoConvertor implements JSON.Convertor
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 Map<String, Method> _getters = new HashMap<>();
protected Map<String, Setter> _setters = new HashMap<>();
protected Set<String> _excluded;
/**
@ -64,7 +81,16 @@ public class JSONPojoConvertor implements JSON.Convertor
*/
public JSONPojoConvertor(Class<?> pojoClass)
{
this(pojoClass, (Set<String>)null, true);
this(pojoClass, null, true);
}
/**
* @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, null, fromJSON);
}
/**
@ -73,7 +99,7 @@ public class JSONPojoConvertor implements JSON.Convertor
*/
public JSONPojoConvertor(Class<?> pojoClass, String[] excluded)
{
this(pojoClass, new HashSet<String>(Arrays.asList(excluded)), true);
this(pojoClass, new HashSet<>(Arrays.asList(excluded)));
}
/**
@ -98,21 +124,11 @@ public class JSONPojoConvertor implements JSON.Convertor
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++)
for (Method m : methods)
{
Method m = methods[i];
if (!Modifier.isStatic(m.getModifiers()) && m.getDeclaringClass() != Object.class)
{
String name = m.getName();
@ -167,53 +183,45 @@ public class JSONPojoConvertor implements JSON.Convertor
return _excluded == null || !_excluded.contains(name);
}
protected int getExcludedCount()
{
return _excluded == null ? 0 : _excluded.size();
}
@Override
public Object fromJSON(Map object)
public Object fromJSON(Map<String, Object> object)
{
Object obj = null;
try
{
obj = _pojoClass.getDeclaredConstructor().newInstance();
Object obj = _pojoClass.getConstructor().newInstance();
setProps(obj, object);
return obj;
}
catch (Exception e)
{
// TODO return Map instead?
throw new RuntimeException(e);
}
setProps(obj, object);
return obj;
}
public int setProps(Object obj, Map<?, ?> props)
private void setProps(Object obj, Map<String, Object> props)
{
int count = 0;
for (Iterator<?> iterator = props.entrySet().iterator(); iterator.hasNext(); )
for (Map.Entry<String, Object> entry : props.entrySet())
{
Map.Entry<?, ?> entry = (Map.Entry<?, ?>)iterator.next();
Setter setter = getSetter((String)entry.getKey());
Setter setter = getSetter(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);
LOG.warn("{}#{} not set from value {}={}: {}",
_pojoClass.getName(),
setter.getPropertyName(),
setter.getType().getName(),
entry.getValue(),
e.toString());
}
}
}
return count;
}
@Override
@ -225,23 +233,19 @@ public class JSONPojoConvertor implements JSON.Convertor
{
try
{
out.add(entry.getKey(), entry.getValue().invoke(obj, GETTER_ARG));
out.add(entry.getKey(), entry.getValue().invoke(obj));
}
catch (Exception e)
{
// TODO throw exception?
LOG.warn("{} property '{}' excluded. (errors)", _pojoClass.getName(),
entry.getKey());
log(e);
LOG.warn("{}#{} excluded: {}",
_pojoClass.getName(),
entry.getKey(),
e.toString());
}
}
}
protected void log(Throwable t)
{
LOG.ignore(t);
}
public static class Setter
{
protected String _propertyName;
@ -255,11 +259,11 @@ public class JSONPojoConvertor implements JSON.Convertor
_propertyName = propertyName;
_setter = method;
_type = method.getParameterTypes()[0];
_numberType = __numberTypes.get(_type);
_numberType = JSONPojoConvertor.getNumberType(_type);
if (_numberType == null && _type.isArray())
{
_componentType = _type.getComponentType();
_numberType = __numberTypes.get(_componentType);
_numberType = JSONPojoConvertor.getNumberType(_componentType);
}
}
@ -290,79 +294,84 @@ public class JSONPojoConvertor implements JSON.Convertor
public boolean isPropertyNumber()
{
return _numberType != null;
return getNumberType() != null;
}
public void invoke(Object obj, Object value) throws IllegalArgumentException,
IllegalAccessException, InvocationTargetException
public void invoke(Object obj, Object value) throws Exception
{
if (value == null)
_setter.invoke(obj, NULL_ARG);
_setter.invoke(obj, value);
else
invokeObject(obj, value);
}
protected void invokeObject(Object obj, Object value) throws IllegalArgumentException,
IllegalAccessException, InvocationTargetException
protected void invokeObject(Object obj, Object value) throws Exception
{
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)});
_setter.invoke(obj, value);
}
else
{
@SuppressWarnings({"rawtypes", "unchecked"})
Class<? extends Enum> enumType = (Class<? extends Enum>)_type;
@SuppressWarnings("unchecked")
Enum<?> enumValue = Enum.valueOf(enumType, value.toString());
_setter.invoke(obj, enumValue);
}
}
else if (isPropertyNumber() && value instanceof Number)
{
_setter.invoke(obj, _numberType.getActualValue((Number)value));
}
else if (Character.TYPE.equals(_type) || Character.class.equals(_type))
{
_setter.invoke(obj, new Object[]{String.valueOf(value).charAt(0)});
_setter.invoke(obj, 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);
Object array = Array.newInstance(getComponentType(), len);
try
{
System.arraycopy(value, 0, array, 0, len);
_setter.invoke(obj, array);
}
catch (Exception e)
{
// unusual array with multiple types
// Unusual array with multiple types.
LOG.ignore(e);
_setter.invoke(obj, new Object[]{value});
return;
_setter.invoke(obj, value);
}
_setter.invoke(obj, new Object[]{array});
}
else
{
Object[] old = (Object[])value;
Object array = Array.newInstance(_componentType, old.length);
Object array = Array.newInstance(getComponentType(), old.length);
try
{
for (int i = 0; i < old.length; i++)
{
Array.set(array, i, _numberType.getActualValue((Number)old[i]));
}
_setter.invoke(obj, array);
}
catch (Exception e)
{
// unusual array with multiple types
LOG.ignore(e);
_setter.invoke(obj, new Object[]{value});
return;
_setter.invoke(obj, value);
}
_setter.invoke(obj, new Object[]{array});
}
}
else
_setter.invoke(obj, new Object[]{value});
{
_setter.invoke(obj, value);
}
}
}
@ -370,63 +379,4 @@ public class JSONPojoConvertor implements JSON.Convertor
{
public Object getActualValue(Number number);
}
public static final NumberType SHORT = new NumberType()
{
@Override
public Object getActualValue(Number number)
{
return number.shortValue();
}
};
public static final NumberType INTEGER = new NumberType()
{
@Override
public Object getActualValue(Number number)
{
return number.intValue();
}
};
public static final NumberType FLOAT = new NumberType()
{
@Override
public Object getActualValue(Number number)
{
return number.floatValue();
}
};
public static final NumberType LONG = new NumberType()
{
@Override
public Object getActualValue(Number number)
{
return number instanceof Long ? number : (Long)number.longValue();
}
};
public static final NumberType DOUBLE = new NumberType()
{
@Override
public Object getActualValue(Number number)
{
return number instanceof Double ? number : (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);
}
}

View File

@ -31,12 +31,7 @@ public class JSONPojoConvertorFactory implements JSON.Convertor
public JSONPojoConvertorFactory(JSON json)
{
if (json == null)
{
throw new IllegalArgumentException();
}
_json = json;
_fromJson = true;
this(json, true);
}
/**
@ -48,9 +43,7 @@ public class JSONPojoConvertorFactory implements JSON.Convertor
public JSONPojoConvertorFactory(JSON json, boolean fromJSON)
{
if (json == null)
{
throw new IllegalArgumentException();
}
_json = json;
_fromJson = fromJSON;
}
@ -58,31 +51,20 @@ public class JSONPojoConvertorFactory implements JSON.Convertor
@Override
public void toJSON(Object obj, Output out)
{
String clsName = obj.getClass().getName();
Class<?> cls = obj.getClass();
String clsName = cls.getName();
Convertor convertor = _json.getConvertorFor(clsName);
if (convertor == null)
{
try
{
Class cls = Loader.loadClass(clsName);
convertor = new JSONPojoConvertor(cls, _fromJson);
_json.addConvertorFor(clsName, convertor);
}
catch (ClassNotFoundException e)
{
JSON.LOG.warn(e);
}
}
if (convertor != null)
{
convertor.toJSON(obj, out);
}
}
@Override
public Object fromJSON(Map object)
public Object fromJSON(Map<String, Object> map)
{
Map map = object;
String clsName = (String)map.get("class");
if (clsName != null)
{
@ -91,7 +73,7 @@ public class JSONPojoConvertorFactory implements JSON.Convertor
{
try
{
Class cls = Loader.loadClass(clsName);
Class<?> cls = Loader.loadClass(clsName);
convertor = new JSONPojoConvertor(cls, _fromJson);
_json.addConvertorFor(clsName, convertor);
}
@ -101,9 +83,7 @@ public class JSONPojoConvertorFactory implements JSON.Convertor
}
}
if (convertor != null)
{
return convertor.fromJSON(object);
}
return convertor.fromJSON(map);
}
return map;
}

View File

@ -0,0 +1,121 @@
//
// ========================================================================
// Copyright (c) 1995-2020 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under
// the terms of the Eclipse Public License 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0
//
// This Source Code may also be made available under the following
// Secondary Licenses when the conditions for such availability set
// forth in the Eclipse Public License, v. 2.0 are satisfied:
// the Apache License v2.0 which is available at
// https://www.apache.org/licenses/LICENSE-2.0
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//
package org.eclipse.jetty.util.ajax;
public class Bar
{
private String _title;
private String _nullTest;
private Baz _baz;
private boolean _boolean1;
private Baz[] _bazs;
private Color _color;
public Bar()
{
// Required by the POJO convertor.
}
public Bar(String title, boolean boolean1, Baz baz)
{
this(title, boolean1, baz, null);
}
public Bar(String title, boolean boolean1, Baz baz, Baz[] bazs)
{
setTitle(title);
setBoolean1(boolean1);
setBaz(baz);
setBazs(bazs);
}
// Getters and setters required by the POJO convertor.
public void setTitle(String title)
{
_title = title;
}
public String getTitle()
{
return _title;
}
public void setNullTest(String nullTest)
{
assert (nullTest == null);
_nullTest = nullTest;
}
public String getNullTest()
{
return _nullTest;
}
public void setBaz(Baz baz)
{
_baz = baz;
}
public Baz getBaz()
{
return _baz;
}
public void setBoolean1(boolean boolean1)
{
_boolean1 = boolean1;
}
public boolean isBoolean1()
{
return _boolean1;
}
public void setBazs(Baz[] bazs)
{
_bazs = bazs;
}
public Baz[] getBazs()
{
return _bazs;
}
public Color getColor()
{
return _color;
}
public void setColor(Color color)
{
_color = color;
}
@Override
public String toString()
{
return "\n=== " + getClass().getSimpleName() + " ===" +
"\ntitle: " + getTitle() +
"\nboolean1: " + isBoolean1() +
"\nnullTest: " + getNullTest() +
"\nbaz: " + getBaz() +
"\ncolor: " + getColor();
}
}

View File

@ -0,0 +1,79 @@
//
// ========================================================================
// Copyright (c) 1995-2020 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under
// the terms of the Eclipse Public License 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0
//
// This Source Code may also be made available under the following
// Secondary Licenses when the conditions for such availability set
// forth in the Eclipse Public License, v. 2.0 are satisfied:
// the Apache License v2.0 which is available at
// https://www.apache.org/licenses/LICENSE-2.0
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//
package org.eclipse.jetty.util.ajax;
public class Baz
{
private String _message;
private Foo _foo;
private Boolean _boolean2;
public Baz()
{
// Required by the POJO convertor.
}
public Baz(String message, Boolean boolean2, Foo foo)
{
setMessage(message);
setBoolean2(boolean2);
setFoo(foo);
}
// Getters and setters required by the POJO convertor.
public void setMessage(String message)
{
_message = message;
}
public String getMessage()
{
return _message;
}
public void setFoo(Foo foo)
{
_foo = foo;
}
public Foo getFoo()
{
return _foo;
}
public void setBoolean2(Boolean boolean2)
{
_boolean2 = boolean2;
}
public Boolean isBoolean2()
{
return _boolean2;
}
@Override
public String toString()
{
return "\n=== " + getClass().getSimpleName() + " ===" +
"\nmessage: " + getMessage() +
"\nboolean2: " + isBoolean2() +
"\nfoo: " + getFoo();
}
}

View File

@ -0,0 +1,24 @@
//
// ========================================================================
// Copyright (c) 1995-2020 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under
// the terms of the Eclipse Public License 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0
//
// This Source Code may also be made available under the following
// Secondary Licenses when the conditions for such availability set
// forth in the Eclipse Public License, v. 2.0 are satisfied:
// the Apache License v2.0 which is available at
// https://www.apache.org/licenses/LICENSE-2.0
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//
package org.eclipse.jetty.util.ajax;
public enum Color
{
Green, Blue
}

View File

@ -0,0 +1,164 @@
//
// ========================================================================
// Copyright (c) 1995-2020 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under
// the terms of the Eclipse Public License 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0
//
// This Source Code may also be made available under the following
// Secondary Licenses when the conditions for such availability set
// forth in the Eclipse Public License, v. 2.0 are satisfied:
// the Apache License v2.0 which is available at
// https://www.apache.org/licenses/LICENSE-2.0
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//
package org.eclipse.jetty.util.ajax;
public class Foo
{
private String _name;
private int _int1;
private Integer _int2;
private long _long1;
private Long _long2;
private float _float1;
private Float _float2;
private double _double1;
private Double _double2;
public Foo()
{
// Required by the POJO convertor.
}
// Getters and setters required by the POJO convertor.
public String getName()
{
return _name;
}
public void setName(String name)
{
_name = name;
}
public int getInt1()
{
return _int1;
}
public void setInt1(int int1)
{
_int1 = int1;
}
public Integer getInt2()
{
return _int2;
}
public void setInt2(Integer int2)
{
_int2 = int2;
}
public long getLong1()
{
return _long1;
}
public void setLong1(long long1)
{
_long1 = long1;
}
public Long getLong2()
{
return _long2;
}
public void setLong2(Long long2)
{
_long2 = long2;
}
public float getFloat1()
{
return _float1;
}
public void setFloat1(float float1)
{
_float1 = float1;
}
public Float getFloat2()
{
return _float2;
}
public void setFloat2(Float float2)
{
_float2 = float2;
}
public double getDouble1()
{
return _double1;
}
public void setDouble1(double double1)
{
_double1 = double1;
}
public Double getDouble2()
{
return _double2;
}
public void setDouble2(Double double2)
{
_double2 = double2;
}
@Override
public boolean equals(Object another)
{
if (another instanceof Foo)
{
Foo foo = (Foo)another;
return _name.equals(foo.getName()) &&
_int1 == foo.getInt1() &&
_int2.equals(foo.getInt2()) &&
_long1 == foo.getLong1() &&
_long2.equals(foo.getLong2()) &&
_float1 == foo.getFloat1() &&
_float2.equals(foo.getFloat2()) &&
_double1 == foo.getDouble1() &&
_double2.equals(foo.getDouble2());
}
return false;
}
@Override
public String toString()
{
return "\n=== " + getClass().getSimpleName() + " ===" +
"\nname: " + _name +
"\nint1: " + _int1 +
"\nint2: " + _int2 +
"\nlong1: " + _long1 +
"\nlong2: " + _long2 +
"\nfloat1: " + _float1 +
"\nfloat2: " + _float2 +
"\ndouble1: " + _double1 +
"\ndouble2: " + _double2;
}
}

View File

@ -39,35 +39,35 @@ import static org.junit.jupiter.api.Assertions.assertSame;
public class JSONCollectionConvertorTest
{
@Test
public void testArrayList() throws Exception
public void testArrayList()
{
List<String> list = new ArrayList<String>();
List<String> list = new ArrayList<>();
Collections.addAll(list, "one", "two");
testList(list);
}
@Test
public void testLinkedList() throws Exception
public void testLinkedList()
{
List<String> list = new LinkedList<String>();
List<String> list = new LinkedList<>();
Collections.addAll(list, "one", "two");
testList(list);
}
@Test
public void testCopyOnWriteArrayList() throws Exception
public void testCopyOnWriteArrayList()
{
List<String> list = new CopyOnWriteArrayList<String>();
List<String> list = new CopyOnWriteArrayList<>();
Collections.addAll(list, "one", "two");
testList(list);
}
private void testList(List<String> list1) throws Exception
private void testList(List<String> list1)
{
JSON json = new JSON();
json.addConvertor(List.class, new JSONCollectionConvertor());
Map<String, Object> object1 = new HashMap<String, Object>();
Map<String, Object> object1 = new HashMap<>();
String field = "field";
object1.put(field, list1);
@ -75,7 +75,7 @@ public class JSONCollectionConvertorTest
assertThat(string, containsString(list1.getClass().getName()));
@SuppressWarnings("unchecked")
Map<String, Object> object2 = (Map<String, Object>)json.parse(new JSON.StringSource(string));
Map<String, Object> object2 = (Map<String, Object>)json.fromJSON(string);
@SuppressWarnings("unchecked")
List<String> list2 = (List<String>)object2.get(field);
@ -84,17 +84,17 @@ public class JSONCollectionConvertorTest
}
@Test
public void testHashSet() throws Exception
public void testHashSet()
{
Set<String> set = new HashSet<String>();
Set<String> set = new HashSet<>();
Collections.addAll(set, "one", "two", "three");
testSet(set);
}
@Test
public void testTreeSet() throws Exception
public void testTreeSet()
{
Set<String> set = new TreeSet<String>();
Set<String> set = new TreeSet<>();
Collections.addAll(set, "one", "two", "three");
testSet(set);
}
@ -108,7 +108,7 @@ public class JSONCollectionConvertorTest
assertThat(string, containsString(set1.getClass().getName()));
@SuppressWarnings("unchecked")
Set<String> set2 = (Set<String>)json.parse(new JSON.StringSource(string));
Set<String> set2 = (Set<String>)json.fromJSON(string);
assertSame(set1.getClass(), set2.getClass());
assertEquals(set1, set2);

View File

@ -24,6 +24,8 @@ import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
@ -43,15 +45,15 @@ public class JSONPojoConvertorFactoryTest
jsonIn.addConvertor(Enum.class, new JSONEnumConvertor());
Foo foo = new Foo();
foo._name = "Foo @ " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
foo._int1 = 1;
foo._int2 = 2;
foo._long1 = 1000001L;
foo._long2 = 1000002L;
foo._float1 = 10.11f;
foo._float2 = 10.22f;
foo._double1 = 10000.11111d;
foo._double2 = 10000.22222d;
foo.setName("Foo @ " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime()));
foo.setInt1(1);
foo.setInt2(2);
foo.setLong1(1000001L);
foo.setLong2(1000002L);
foo.setFloat1(10.11f);
foo.setFloat2(10.22f);
foo.setDouble1(10000.11111d);
foo.setDouble2(10000.22222d);
Bar bar = new Bar("Hello", true, new Baz("World", Boolean.FALSE, foo), new Baz[]{
new Baz("baz0", Boolean.TRUE, null), new Baz("baz1", Boolean.FALSE, null)
@ -59,19 +61,16 @@ public class JSONPojoConvertorFactoryTest
bar.setColor(Color.Green);
String s = jsonOut.toJSON(bar);
Object obj = jsonIn.parse(new JSON.StringSource(s));
Object obj = jsonIn.fromJSON(s);
assertTrue(obj instanceof Bar);
Bar br = (Bar)obj;
Baz bz = br.getBaz();
Foo f = bz.getFoo();
assertEquals(f, foo);
assertTrue(br.getBazs().length == 2);
assertEquals(2, br.getBazs().length);
assertEquals(br.getBazs()[0].getMessage(), "baz0");
assertEquals(br.getBazs()[1].getMessage(), "baz1");
assertEquals(Color.Green, br.getColor());
@ -89,15 +88,15 @@ public class JSONPojoConvertorFactoryTest
jsonIn.addConvertor(Enum.class, new JSONEnumConvertor());
Foo foo = new Foo();
foo._name = "Foo @ " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
foo._int1 = 1;
foo._int2 = 2;
foo._long1 = 1000001L;
foo._long2 = 1000002L;
foo._float1 = 10.11f;
foo._float2 = 10.22f;
foo._double1 = 10000.11111d;
foo._double2 = 10000.22222d;
foo.setName("Foo @ " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime()));
foo.setInt1(1);
foo.setInt2(2);
foo.setLong1(1000001L);
foo.setLong2(1000002L);
foo.setFloat1(10.11f);
foo.setFloat2(10.22f);
foo.setDouble1(10000.11111d);
foo.setDouble2(10000.22222d);
Bar bar = new Bar("Hello", true, new Baz("World", Boolean.FALSE, foo), new Baz[]{
new Baz("baz0", Boolean.TRUE, null), new Baz("baz1", Boolean.FALSE, null)
@ -106,331 +105,28 @@ public class JSONPojoConvertorFactoryTest
String s = jsonOut.toJSON(bar);
assertTrue(s.indexOf("class") < 0);
assertFalse(s.contains("class"));
Object obj = jsonIn.parse(new JSON.StringSource(s));
assertTrue(obj instanceof Map);
@SuppressWarnings("unchecked")
Map<String, Object> br = (Map<String, Object>)obj;
@SuppressWarnings("unchecked")
Map<String, Object> bz = (Map<String, Object>)br.get("baz");
@SuppressWarnings("unchecked")
Map<String, Object> f = (Map<String, Object>)bz.get("foo");
assertTrue(f != null);
assertNotNull(f);
Object[] bazs = (Object[])br.get("bazs");
assertTrue(bazs.length == 2);
assertEquals(((Map)bazs[0]).get("message"), "baz0");
assertEquals(((Map)bazs[1]).get("message"), "baz1");
assertEquals(2, bazs.length);
@SuppressWarnings("unchecked")
Map<String, Object> map1 = (Map<String, Object>)bazs[0];
assertEquals(map1.get("message"), "baz0");
@SuppressWarnings("unchecked")
Map<String, Object> map2 = (Map<String, Object>)bazs[1];
assertEquals(map2.get("message"), "baz1");
assertEquals("Green", br.get("color"));
}
enum Color
{
Red, Green, Blue
}
;
public static class Bar
{
private String _title;
private String _nullTest;
private Baz _baz;
private boolean _boolean1;
private Baz[] _bazs;
private Color _color;
public Bar()
{
}
public Bar(String title, boolean boolean1, Baz baz)
{
setTitle(title);
setBoolean1(boolean1);
setBaz(baz);
}
public Bar(String title, boolean boolean1, Baz baz, Baz[] bazs)
{
this(title, boolean1, baz);
setBazs(bazs);
}
@Override
public String toString()
{
return new StringBuffer().append("\n=== ").append(getClass().getSimpleName()).append(" ===")
.append("\ntitle: ").append(getTitle())
.append("\nboolean1: ").append(isBoolean1())
.append("\nnullTest: ").append(getNullTest())
.append("\nbaz: ").append(getBaz())
.append("\ncolor: ").append(_color).toString();
}
public void setTitle(String title)
{
_title = title;
}
public String getTitle()
{
return _title;
}
public void setNullTest(String nullTest)
{
assert (nullTest == null);
_nullTest = nullTest;
}
public String getNullTest()
{
return _nullTest;
}
public void setBaz(Baz baz)
{
_baz = baz;
}
public Baz getBaz()
{
return _baz;
}
public void setBoolean1(boolean boolean1)
{
_boolean1 = boolean1;
}
public boolean isBoolean1()
{
return _boolean1;
}
public void setBazs(Baz[] bazs)
{
_bazs = bazs;
}
public Baz[] getBazs()
{
return _bazs;
}
public Color getColor()
{
return _color;
}
public void setColor(Color color)
{
_color = color;
}
}
public static class Baz
{
private String _message;
private Foo _foo;
private Boolean _boolean2;
public Baz()
{
}
public Baz(String message, Boolean boolean2, Foo foo)
{
setMessage(message);
setBoolean2(boolean2);
setFoo(foo);
}
@Override
public String toString()
{
return new StringBuffer().append("\n=== ").append(getClass().getSimpleName()).append(" ===")
.append("\nmessage: ").append(getMessage())
.append("\nboolean2: ").append(isBoolean2())
.append("\nfoo: ").append(getFoo()).toString();
}
public void setMessage(String message)
{
_message = message;
}
public String getMessage()
{
return _message;
}
public void setFoo(Foo foo)
{
_foo = foo;
}
public Foo getFoo()
{
return _foo;
}
public void setBoolean2(Boolean boolean2)
{
_boolean2 = boolean2;
}
public Boolean isBoolean2()
{
return _boolean2;
}
}
public static class Foo
{
private String _name;
private int _int1;
private Integer _int2;
private long _long1;
private Long _long2;
private float _float1;
private Float _float2;
private double _double1;
private Double _double2;
public Foo()
{
}
@Override
public String toString()
{
return new StringBuffer().append("\n=== ").append(getClass().getSimpleName()).append(" ===")
.append("\nname: ").append(_name)
.append("\nint1: ").append(_int1)
.append("\nint2: ").append(_int2)
.append("\nlong1: ").append(_long1)
.append("\nlong2: ").append(_long2)
.append("\nfloat1: ").append(_float1)
.append("\nfloat2: ").append(_float2)
.append("\ndouble1: ").append(_double1)
.append("\ndouble2: ").append(_double2)
.toString();
}
@Override
public boolean equals(Object another)
{
if (another instanceof Foo)
{
Foo foo = (Foo)another;
return getName().equals(foo.getName()) &&
getInt1() == foo.getInt1() &&
getInt2().equals(foo.getInt2()) &&
getLong1() == foo.getLong1() &&
getLong2().equals(foo.getLong2()) &&
getFloat1() == foo.getFloat1() &&
getFloat2().equals(foo.getFloat2()) &&
getDouble1() == foo.getDouble1() &&
getDouble2().equals(foo.getDouble2());
}
return false;
}
public String getName()
{
return _name;
}
public void setName(String name)
{
_name = name;
}
public int getInt1()
{
return _int1;
}
public void setInt1(int int1)
{
_int1 = int1;
}
public Integer getInt2()
{
return _int2;
}
public void setInt2(Integer int2)
{
_int2 = int2;
}
public long getLong1()
{
return _long1;
}
public void setLong1(long long1)
{
_long1 = long1;
}
public Long getLong2()
{
return _long2;
}
public void setLong2(Long long2)
{
_long2 = long2;
}
public float getFloat1()
{
return _float1;
}
public void setFloat1(float float1)
{
_float1 = float1;
}
public Float getFloat2()
{
return _float2;
}
public void setFloat2(Float float2)
{
_float2 = float2;
}
public double getDouble1()
{
return _double1;
}
public void setDouble1(double double1)
{
_double1 = double1;
}
public Double getDouble2()
{
return _double2;
}
public void setDouble2(Double double2)
{
_double2 = double2;
}
}
}

View File

@ -23,7 +23,7 @@ import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@ -39,20 +39,17 @@ public class JSONPojoConvertorTest
json.addConvertor(Foo.class, new JSONPojoConvertor(Foo.class));
json.addConvertor(Bar.class, new JSONPojoConvertor(Bar.class));
json.addConvertor(Baz.class, new JSONPojoConvertor(Baz.class));
// json.addConvertor(Enum.class, new JSONEnumConvertor(true));
Foo foo = new Foo();
foo._name = "Foo @ " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
foo._int1 = 1;
foo._int2 = 2;
foo._long1 = 1000001L;
foo._long2 = 1000002L;
foo._float1 = 10.11f;
foo._float2 = 10.22f;
foo._double1 = 10000.11111d;
foo._double2 = 10000.22222d;
foo._char1 = 'a';
foo._char2 = 'b';
foo.setName("Foo @ " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime()));
foo.setInt1(1);
foo.setInt2(2);
foo.setLong1(1000001L);
foo.setLong2(1000002L);
foo.setFloat1(10.11f);
foo.setFloat2(10.22f);
foo.setDouble1(10000.11111d);
foo.setDouble2(10000.22222d);
Bar bar = new Bar("Hello", true, new Baz("World", Boolean.FALSE, foo), new Baz[]{
new Baz("baz0", Boolean.TRUE, null), new Baz("baz1", Boolean.FALSE, null)
@ -60,19 +57,16 @@ public class JSONPojoConvertorTest
bar.setColor(Color.Green);
String s = json.toJSON(bar);
Object obj = json.parse(new JSON.StringSource(s));
assertTrue(obj instanceof Bar);
Bar br = (Bar)obj;
Baz bz = br.getBaz();
Foo f = bz.getFoo();
assertEquals(foo, f);
assertTrue(br.getBazs().length == 2);
assertEquals(2, br.getBazs().length);
assertEquals(br.getBazs()[0].getMessage(), "baz0");
assertEquals(br.getBazs()[1].getMessage(), "baz1");
assertEquals(Color.Green, br.getColor());
@ -82,28 +76,22 @@ public class JSONPojoConvertorTest
public void testExclude()
{
JSON json = new JSON();
json.addConvertor(Foo.class, new JSONPojoConvertor(Foo.class,
new String[]{"name", "long1", "int2"}));
json.addConvertor(Bar.class, new JSONPojoConvertor(Bar.class,
new String[]{"title", "boolean1"}));
json.addConvertor(Baz.class, new JSONPojoConvertor(Baz.class,
new String[]{"boolean2"}));
json.addConvertor(Foo.class, new JSONPojoConvertor(Foo.class, new String[]{"name", "long1", "int2"}));
json.addConvertor(Bar.class, new JSONPojoConvertor(Bar.class, new String[]{"title", "boolean1"}));
json.addConvertor(Baz.class, new JSONPojoConvertor(Baz.class, new String[]{"boolean2"}));
Foo foo = new Foo();
foo._name = "Foo @ " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
foo._int1 = 1;
foo._int2 = 2;
foo._long1 = 1000001L;
foo._long2 = 1000002L;
foo._float1 = 10.11f;
foo._float2 = 10.22f;
foo._double1 = 10000.11111d;
foo._double2 = 10000.22222d;
foo._char1 = 'a';
foo._char2 = 'b';
foo.setName("Foo @ " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime()));
foo.setInt1(1);
foo.setInt2(2);
foo.setLong1(1000001L);
foo.setLong2(1000002L);
foo.setFloat1(10.11f);
foo.setFloat2(10.22f);
foo.setDouble1(10000.11111d);
foo.setDouble2(10000.22222d);
Bar bar = new Bar("Hello", true, new Baz("World", Boolean.FALSE, foo));
// bar.setColor(Color.Blue);
String s = json.toJSON(bar);
Object obj = json.parse(new JSON.StringSource(s));
@ -115,350 +103,14 @@ public class JSONPojoConvertorTest
Foo f = bz.getFoo();
assertNull(br.getTitle());
assertFalse(bar.getTitle().equals(br.getTitle()));
assertFalse(br.isBoolean1() == bar.isBoolean1());
assertNotEquals(bar.getTitle(), br.getTitle());
assertNotEquals(br.isBoolean1(), bar.isBoolean1());
assertNull(bz.isBoolean2());
assertFalse(bar.getBaz().isBoolean2().equals(bz.isBoolean2()));
assertFalse(f.getLong1() == foo.getLong1());
assertNotEquals(bar.getBaz().isBoolean2(), bz.isBoolean2());
assertNotEquals(f.getLong1(), foo.getLong1());
assertNull(f.getInt2());
assertFalse(foo.getInt2().equals(f.getInt2()));
assertNotEquals(foo.getInt2(), f.getInt2());
assertNull(f.getName());
assertEquals(null, br.getColor());
}
enum Color
{
Red, Green, Blue
}
;
public static class Bar
{
private String _title;
private String _nullTest;
private Baz _baz;
private boolean _boolean1;
private Baz[] _bazs;
private Color _color;
public Bar()
{
}
public Bar(String title, boolean boolean1, Baz baz)
{
setTitle(title);
setBoolean1(boolean1);
setBaz(baz);
}
public Bar(String title, boolean boolean1, Baz baz, Baz[] bazs)
{
this(title, boolean1, baz);
setBazs(bazs);
}
@Override
public String toString()
{
return new StringBuffer()
.append("\n=== ").append(getClass().getSimpleName()).append(" ===")
.append("\ntitle: ").append(getTitle())
.append("\nboolean1: ").append(isBoolean1())
.append("\nnullTest: ").append(getNullTest())
.append("\nbaz: ").append(getBaz())
.append("\ncolor: ").append(_color).toString();
}
public void setTitle(String title)
{
_title = title;
}
public String getTitle()
{
return _title;
}
public void setNullTest(String nullTest)
{
assert (nullTest == null);
_nullTest = nullTest;
}
public String getNullTest()
{
return _nullTest;
}
public void setBaz(Baz baz)
{
_baz = baz;
}
public Baz getBaz()
{
return _baz;
}
public void setBoolean1(boolean boolean1)
{
_boolean1 = boolean1;
}
public boolean isBoolean1()
{
return _boolean1;
}
public void setBazs(Baz[] bazs)
{
_bazs = bazs;
}
public Baz[] getBazs()
{
return _bazs;
}
public Color getColor()
{
return _color;
}
public void setColor(Color color)
{
_color = color;
}
}
public static class Baz
{
private String _message;
private Foo _foo;
private Boolean _boolean2;
public Baz()
{
}
public Baz(String message, Boolean boolean2, Foo foo)
{
setMessage(message);
setBoolean2(boolean2);
setFoo(foo);
}
@Override
public String toString()
{
return new StringBuffer().append("\n=== ").append(getClass().getSimpleName()).append(" ===")
.append("\nmessage: ").append(getMessage())
.append("\nboolean2: ").append(isBoolean2())
.append("\nfoo: ").append(getFoo()).toString();
}
public void setMessage(String message)
{
_message = message;
}
public String getMessage()
{
return _message;
}
public void setFoo(Foo foo)
{
_foo = foo;
}
public Foo getFoo()
{
return _foo;
}
public void setBoolean2(Boolean boolean2)
{
_boolean2 = boolean2;
}
public Boolean isBoolean2()
{
return _boolean2;
}
}
public static class Foo
{
private String _name;
private int _int1;
private Integer _int2;
private long _long1;
private Long _long2;
private float _float1;
private Float _float2;
private double _double1;
private Double _double2;
private char _char1;
private Character _char2;
public Foo()
{
}
@Override
public String toString()
{
return new StringBuffer().append("\n=== ").append(getClass().getSimpleName()).append(" ===")
.append("\nname: ").append(_name)
.append("\nint1: ").append(_int1)
.append("\nint2: ").append(_int2)
.append("\nlong1: ").append(_long1)
.append("\nlong2: ").append(_long2)
.append("\nfloat1: ").append(_float1)
.append("\nfloat2: ").append(_float2)
.append("\ndouble1: ").append(_double1)
.append("\ndouble2: ").append(_double2)
.append("\nchar1: ").append(_char1)
.append("\nchar2: ").append(_char2)
.toString();
}
@Override
public boolean equals(Object another)
{
if (another instanceof Foo)
{
Foo foo = (Foo)another;
return getName().equals(foo.getName()) &&
getInt1() == foo.getInt1() &&
getInt2().equals(foo.getInt2()) &&
getLong1() == foo.getLong1() &&
getLong2().equals(foo.getLong2()) &&
getFloat1() == foo.getFloat1() &&
getFloat2().equals(foo.getFloat2()) &&
getDouble1() == foo.getDouble1() &&
getDouble2().equals(foo.getDouble2()) &&
getChar1() == foo.getChar1() &&
getChar2().equals(foo.getChar2());
}
return false;
}
public String getName()
{
return _name;
}
public void setName(String name)
{
_name = name;
}
public int getInt1()
{
return _int1;
}
public void setInt1(int int1)
{
_int1 = int1;
}
public Integer getInt2()
{
return _int2;
}
public void setInt2(Integer int2)
{
_int2 = int2;
}
public long getLong1()
{
return _long1;
}
public void setLong1(long long1)
{
_long1 = long1;
}
public Long getLong2()
{
return _long2;
}
public void setLong2(Long long2)
{
_long2 = long2;
}
public float getFloat1()
{
return _float1;
}
public void setFloat1(float float1)
{
_float1 = float1;
}
public Float getFloat2()
{
return _float2;
}
public void setFloat2(Float float2)
{
_float2 = float2;
}
public double getDouble1()
{
return _double1;
}
public void setDouble1(double double1)
{
_double1 = double1;
}
public Double getDouble2()
{
return _double2;
}
public void setDouble2(Double double2)
{
_double2 = double2;
}
public char getChar1()
{
return _char1;
}
public void setChar1(char char1)
{
_char1 = char1;
}
public Character getChar2()
{
return _char2;
}
public void setChar2(Character char2)
{
_char2 = char2;
}
assertNull(br.getColor());
}
}

View File

@ -19,7 +19,6 @@
package org.eclipse.jetty.util.ajax;
import java.io.IOException;
import java.io.StringReader;
import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.util.Date;
@ -38,11 +37,14 @@ import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class JSONTest
{
String test = "\n\n\n\t\t " +
private JSON json;
private String test = "\n\n\n\t\t " +
"// ignore this ,a [ \" \n" +
"/* and this \n" +
"/* and * // this \n" +
@ -62,17 +64,16 @@ public class JSONTest
@BeforeEach
public void resetJSON()
{
// Reset JSON configuration to default with each testcase
JSON.reset();
json = new JSON();
}
@Test
public void testToString()
{
JSON.registerConvertor(Gadget.class, new JSONObjectConvertor(false));
HashMap map = new HashMap();
HashMap obj6 = new HashMap();
HashMap obj7 = new HashMap();
json.addConvertor(Gadget.class, new JSONObjectConvertor(false));
Map<String, Object> map = new HashMap<>();
Map<String, Object> obj6 = new HashMap<>();
Map<String, Object> obj7 = new HashMap<>();
Woggle w0 = new Woggle();
Woggle w1 = new Woggle();
@ -97,26 +98,27 @@ public class JSONTest
obj7.put("x", "value");
String s = JSON.toString(map);
assertTrue(s.indexOf("\"n1\":null") >= 0);
assertTrue(s.indexOf("\"n2\":2") >= 0);
assertTrue(s.indexOf("\"n3\":-3.0E-11") >= 0);
assertTrue(s.indexOf("\"n4\":\"4\\n") >= 0);
assertTrue(s.indexOf("\"n5\":[\"a\",\"b\",") >= 0);
assertTrue(s.indexOf("\"n6\":{}") >= 0);
assertTrue(s.indexOf("\"n7\":{\"x\":\"value\"}") >= 0);
assertTrue(s.indexOf("\"n8\":[1,2,3,4]") >= 0);
assertTrue(s.indexOf("\"n9\":[{}, [], {}]") >= 0);
assertTrue(s.indexOf("\"w0\":{\"class\":\"org.eclipse.jetty.util.ajax.JSONTest$Woggle\",\"name\":\"woggle0\",\"nested\":{\"class\":\"org.eclipse.jetty.util.ajax.JSONTest$Woggle\",\"name\":\"woggle1\",\"nested\":null,\"number\":-101},\"number\":100}") >= 0);
String s = json.toJSON(map);
assertTrue(s.contains("\"n1\":null"));
assertTrue(s.contains("\"n2\":2"));
assertTrue(s.contains("\"n3\":-3.0E-11"));
assertTrue(s.contains("\"n4\":\"4\\n"));
assertTrue(s.contains("\"n5\":[\"a\",\"b\","));
assertTrue(s.contains("\"n6\":{}"));
assertTrue(s.contains("\"n7\":{\"x\":\"value\"}"));
assertTrue(s.contains("\"n8\":[1,2,3,4]"));
assertTrue(s.contains("\"n9\":[{}, [], {}]"));
assertTrue(s.contains("\"w0\":{\"class\":\"org.eclipse.jetty.util.ajax.JSONTest$Woggle\",\"name\":\"woggle0\",\"nested\":{\"class\":\"org.eclipse.jetty.util.ajax.JSONTest$Woggle\",\"name\":\"woggle1\",\"nested\":null,\"number\":-101},\"number\":100}"));
Gadget gadget = new Gadget();
gadget.setModulated(true);
gadget.setShields(42);
gadget.setWoggles(new Woggle[]{w0, w1});
s = JSON.toString(new Gadget[]{gadget});
s = json.toJSON(new Gadget[]{gadget});
assertThat(s, startsWith("["));
assertThat(s, containsString("\"modulated\":false"));
assertThat(s, containsString("\"shields\":42"));
assertThat(s, containsString("\"modulated\":" + gadget.isModulated()));
assertThat(s, containsString("\"shields\":" + gadget.getShields()));
assertThat(s, containsString("\"name\":\"woggle0\""));
assertThat(s, containsString("\"name\":\"woggle1\""));
}
@ -124,7 +126,8 @@ public class JSONTest
@Test
public void testParse()
{
Map map = (Map)JSON.parse(test);
@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>)json.fromJSON(test);
assertEquals((long)100, map.get("onehundred"));
assertEquals("fred", map.get("name"));
assertEquals(-0.2, map.get("small"));
@ -133,12 +136,9 @@ public class JSONTest
assertTrue(((Woggle)map.get("w0")).nested instanceof Woggle);
assertEquals(-101, ((Woggle)((Woggle)map.get("w0")).nested).number);
assertTrue(map.containsKey("NaN"));
assertEquals(null, map.get("NaN"));
assertNull(map.get("NaN"));
assertTrue(map.containsKey("undefined"));
assertEquals(null, map.get("undefined"));
test = "{\"data\":{\"source\":\"15831407eqdaawf7\",\"widgetId\":\"Magnet_8\"},\"channel\":\"/magnets/moveStart\",\"connectionId\":null,\"clientId\":\"15831407eqdaawf7\"}";
map = (Map)JSON.parse(test);
assertNull(map.get("undefined"));
}
@Test
@ -146,7 +146,7 @@ public class JSONTest
{
Map<String, String> map = new HashMap<>();
map.put("str", "line\nfeed");
String jsonStr = JSON.toString(map);
String jsonStr = json.toJSON(map);
assertThat(jsonStr, is("{\"str\":\"line\\nfeed\"}"));
}
@ -155,7 +155,7 @@ public class JSONTest
{
Map<String, String> map = new HashMap<>();
map.put("str", "tab\tchar");
String jsonStr = JSON.toString(map);
String jsonStr = json.toJSON(map);
assertThat(jsonStr, is("{\"str\":\"tab\\tchar\"}"));
}
@ -164,7 +164,7 @@ public class JSONTest
{
Map<String, String> map = new HashMap<>();
map.put("str", "ascii\u0007bel");
String jsonStr = JSON.toString(map);
String jsonStr = json.toJSON(map);
assertThat(jsonStr, is("{\"str\":\"ascii\\u0007bel\"}"));
}
@ -173,7 +173,7 @@ public class JSONTest
{
Map<String, String> map = new HashMap<>();
map.put("str", "japanese: 桟橋");
String jsonStr = JSON.toString(map);
String jsonStr = json.toJSON(map);
assertThat(jsonStr, is("{\"str\":\"japanese: 桟橋\"}"));
}
@ -199,7 +199,8 @@ public class JSONTest
public void testParse_Utf8_JsonEncoded()
{
String jsonStr = "{\"str\": \"japanese: \\u685f\\u6a4b\"}";
Map map = (Map)JSON.parse(jsonStr);
@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>)json.fromJSON(jsonStr);
assertThat(map.get("str"), is("japanese: 桟橋"));
}
@ -207,7 +208,8 @@ public class JSONTest
public void testParse_Utf8_JavaEncoded()
{
String jsonStr = "{\"str\": \"japanese: \u685f\u6a4b\"}";
Map map = (Map)JSON.parse(jsonStr);
@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>)json.fromJSON(jsonStr);
assertThat(map.get("str"), is("japanese: 桟橋"));
}
@ -215,23 +217,22 @@ public class JSONTest
public void testParse_Utf8_Raw()
{
String jsonStr = "{\"str\": \"japanese: 桟橋\"}";
Map map = (Map)JSON.parse(jsonStr);
@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>)json.fromJSON(jsonStr);
assertThat(map.get("str"), is("japanese: 桟橋"));
}
@Test
public void testParseReader() throws Exception
public void testParseReader()
{
Map map = (Map)JSON.parse(new StringReader(test));
@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>)json.fromJSON(test);
assertEquals((long)100, map.get("onehundred"));
assertEquals("fred", map.get("name"));
assertTrue(map.get("array").getClass().isArray());
assertTrue(map.get("w0") instanceof Woggle);
assertTrue(((Woggle)map.get("w0")).nested instanceof Woggle);
test = "{\"data\":{\"source\":\"15831407eqdaawf7\",\"widgetId\":\"Magnet_8\"},\"channel\":\"/magnets/moveStart\",\"connectionId\":null,\"clientId\":\"15831407eqdaawf7\"}";
map = (Map)JSON.parse(test);
}
@Test
@ -248,30 +249,31 @@ public class JSONTest
"\"array\" : [\"a\",-1.0e2,[],null,true,false] ," +
"} */";
Object o = JSON.parse(test, false);
assertTrue(o == null);
o = JSON.parse(test, true);
Object o = json.fromJSON(test);
assertNull(o);
o = json.parse(new JSON.StringSource(test), true);
assertTrue(o instanceof Map);
assertEquals("fred", ((Map)o).get("name"));
@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>)o;
assertEquals("fred", map.get("name"));
}
@Test
public void testQuote()
{
String test = "\"abc123|\\\"|\\\\|\\/|\\b|\\f|\\n|\\r|\\t|\\uaaaa|\"";
String result = (String)JSON.parse(test, false);
String result = (String)json.fromJSON(test);
assertEquals("abc123|\"|\\|/|\b|\f|\n|\r|\t|\uaaaa|", result);
}
@Test
public void testBigDecimal()
{
Object obj = JSON.parse("1.0E7");
Object obj = json.fromJSON("1.0E7");
assertTrue(obj instanceof Double);
BigDecimal bd = BigDecimal.valueOf(10000000d);
String string = JSON.toString(new Object[]{bd});
obj = Array.get(JSON.parse(string), 0);
String string = json.toJSON(new Object[]{bd});
obj = Array.get(json.fromJSON(string), 0);
assertTrue(obj instanceof Double);
}
@ -279,7 +281,7 @@ public class JSONTest
public void testZeroByte()
{
String withzero = "\u0000";
JSON.toString(withzero);
assertEquals("\"\\u0000\"", json.toJSON(withzero));
}
public static class Gadget
@ -288,6 +290,8 @@ public class JSONTest
private long shields;
private Woggle[] woggles;
// Getters and setters required by the POJO convertor.
/**
* @return the modulated
*/
@ -348,15 +352,15 @@ public class JSONTest
Woggle w0 = new Woggle();
Gizmo g0 = new Gizmo();
w0.name = "woggle0";
w0.nested = g0;
w0.number = 100;
g0.name = "woggle1";
g0.nested = null;
g0.number = -101;
g0.tested = true;
w0.setName("woggle0");
w0.setNested(g0);
w0.setNumber(100);
g0.setName("woggle1");
g0.setNested(null);
g0.setNumber(-101);
g0.setTested(true);
HashMap map = new HashMap();
Map<String, Object> map = new HashMap<>();
Date dummyDate = new Date(1);
map.put("date", dummyDate);
map.put("w0", w0);
@ -365,29 +369,24 @@ public class JSONTest
json.append(buf, map);
String js = buf.toString();
assertTrue(js.indexOf("\"date\":\"01/01/1970 00:00:00 GMT\"") >= 0);
assertTrue(js.indexOf("org.eclipse.jetty.util.ajax.JSONTest$Woggle") >= 0);
assertTrue(js.indexOf("org.eclipse.jetty.util.ajax.JSONTest$Gizmo") < 0);
assertTrue(js.indexOf("\"tested\":true") >= 0);
assertTrue(js.contains("\"date\":\"01/01/1970 00:00:00 GMT\""));
assertTrue(js.contains("org.eclipse.jetty.util.ajax.JSONTest$Woggle"));
assertFalse(js.contains("org.eclipse.jetty.util.ajax.JSONTest$Gizmo"));
assertTrue(js.contains("\"tested\":true"));
// test case#3
TimeZone tzone = TimeZone.getTimeZone("JST");
String tzone3Letter = tzone.getDisplayName(false, TimeZone.SHORT);
String format = "EEE MMMMM dd HH:mm:ss zzz yyyy";
Locale l = new Locale("ja", "JP");
if (l != null)
{
json.addConvertor(Date.class, new JSONDateConvertor(format, tzone, false, l));
buf = new StringBuffer();
json.append(buf, map);
js = buf.toString();
//assertTrue(js.indexOf("\"date\":\"\u6728 1\u6708 01 09:00:00 JST 1970\"")>=0);
assertTrue(js.indexOf(" 01 09:00:00 JST 1970\"") >= 0);
assertTrue(js.indexOf("org.eclipse.jetty.util.ajax.JSONTest$Woggle") >= 0);
assertTrue(js.indexOf("org.eclipse.jetty.util.ajax.JSONTest$Gizmo") < 0);
assertTrue(js.indexOf("\"tested\":true") >= 0);
}
assertTrue(js.contains(" 01 09:00:00 JST 1970\""));
assertTrue(js.contains("org.eclipse.jetty.util.ajax.JSONTest$Woggle"));
assertFalse(js.contains("org.eclipse.jetty.util.ajax.JSONTest$Gizmo"));
assertTrue(js.contains("\"tested\":true"));
// test case#4
json.addConvertor(Date.class, new JSONDateConvertor(true));
@ -395,23 +394,17 @@ public class JSONTest
buf = new StringBuffer();
json.append(buf, map);
js = buf.toString();
assertTrue(js.indexOf("\"date\":\"Thu Jan 01 00:00:00 GMT 1970\"") < 0);
assertTrue(js.indexOf("org.eclipse.jetty.util.ajax.JSONTest$Woggle") >= 0);
assertTrue(js.indexOf("org.eclipse.jetty.util.ajax.JSONTest$Gizmo") < 0);
assertFalse(js.contains("\"date\":\"Thu Jan 01 00:00:00 GMT 1970\""));
assertTrue(js.contains("org.eclipse.jetty.util.ajax.JSONTest$Woggle"));
assertFalse(js.contains("org.eclipse.jetty.util.ajax.JSONTest$Gizmo"));
map = (HashMap)json.parse(new JSON.StringSource(js));
@SuppressWarnings("unchecked")
Map<String, Object> map1 = (Map<String, Object>)json.fromJSON(js);
assertTrue(map.get("date") instanceof Date);
assertTrue(map.get("w0") instanceof Woggle);
assertTrue(map1.get("date") instanceof Date);
assertTrue(map1.get("w0") instanceof Woggle);
}
enum Color
{
Red, Green, Blue
}
;
@Test
public void testEnumConvertor()
{
@ -424,60 +417,66 @@ public class JSONTest
Woggle w0 = new Woggle();
Gizmo g0 = new Gizmo();
w0.name = "woggle0";
w0.nested = g0;
w0.number = 100;
w0.other = Color.Blue;
g0.name = "woggle1";
g0.nested = null;
g0.number = -101;
g0.tested = true;
g0.other = Color.Green;
w0.setName("woggle0");
w0.setNested(g0);
w0.setNumber(100);
w0.setOther(Color.Blue);
g0.setName("woggle1");
g0.setNested(null);
g0.setNumber(-101);
g0.setTested(true);
g0.setOther(Color.Green);
HashMap map = new HashMap();
Map<String, Object> map = new HashMap<>();
map.put("date", new Date(1));
map.put("w0", w0);
map.put("g0", g0);
StringBuffer buf = new StringBuffer();
json.append((Appendable)buf, map);
json.append(buf, map);
String js = buf.toString();
assertTrue(js.indexOf("\"date\":\"Thu Jan 01 00:00:00 GMT 1970\"") >= 0);
assertTrue(js.indexOf("org.eclipse.jetty.util.ajax.JSONTest$Woggle") >= 0);
assertTrue(js.indexOf("org.eclipse.jetty.util.ajax.JSONTest$Gizmo") < 0);
assertTrue(js.indexOf("\"tested\":true") >= 0);
assertTrue(js.indexOf("\"Green\"") >= 0);
assertTrue(js.indexOf("\"Blue\"") < 0);
assertTrue(js.contains("\"date\":\"Thu Jan 01 00:00:00 GMT 1970\""));
assertTrue(js.contains("org.eclipse.jetty.util.ajax.JSONTest$Woggle"));
assertFalse(js.contains("org.eclipse.jetty.util.ajax.JSONTest$Gizmo"));
assertTrue(js.contains("\"tested\":true"));
assertTrue(js.contains("\"Green\""));
assertFalse(js.contains("\"Blue\""));
json.addConvertor(Date.class, new JSONDateConvertor(DateCache.DEFAULT_FORMAT, TimeZone.getTimeZone("GMT"), true, l));
json.addConvertor(Enum.class, new JSONEnumConvertor(false));
w0.nested = null;
buf = new StringBuffer();
json.append((Appendable)buf, map);
json.append(buf, map);
js = buf.toString();
assertTrue(js.indexOf("\"date\":\"Thu Jan 01 00:00:00 GMT 1970\"") < 0);
assertTrue(js.indexOf("org.eclipse.jetty.util.ajax.JSONTest$Woggle") >= 0);
assertTrue(js.indexOf("org.eclipse.jetty.util.ajax.JSONTest$Gizmo") < 0);
assertFalse(js.contains("\"date\":\"Thu Jan 01 00:00:00 GMT 1970\""));
assertTrue(js.contains("org.eclipse.jetty.util.ajax.JSONTest$Woggle"));
assertFalse(js.contains("org.eclipse.jetty.util.ajax.JSONTest$Gizmo"));
Map map2 = (HashMap)json.parse(new JSON.StringSource(js));
@SuppressWarnings("unchecked")
Map<String, Object> map2 = (Map<String, Object>)json.fromJSON(js);
assertTrue(map2.get("date") instanceof Date);
assertTrue(map2.get("w0") instanceof Woggle);
assertEquals(null, ((Woggle)map2.get("w0")).getOther());
assertEquals(Color.Green.toString(), ((Map)map2.get("g0")).get("other"));
assertNull(((Woggle)map2.get("w0")).other);
@SuppressWarnings("unchecked")
Map<String, Object> map3 = (Map<String, Object>)map2.get("g0");
assertEquals(Color.Green.toString(), map3.get("other"));
json.addConvertor(Date.class, new JSONDateConvertor(DateCache.DEFAULT_FORMAT, TimeZone.getTimeZone("GMT"), true, l));
json.addConvertor(Enum.class, new JSONEnumConvertor(true));
buf = new StringBuffer();
json.append((Appendable)buf, map);
json.append(buf, map);
js = buf.toString();
map2 = (HashMap)json.parse(new JSON.StringSource(js));
@SuppressWarnings("unchecked")
Map<String, Object> map4 = (Map<String, Object>)json.fromJSON(js);
assertTrue(map2.get("date") instanceof Date);
assertTrue(map2.get("w0") instanceof Woggle);
assertEquals(null, ((Woggle)map2.get("w0")).getOther());
Object o = ((Map)map2.get("g0")).get("other");
assertTrue(map4.get("date") instanceof Date);
assertTrue(map4.get("w0") instanceof Woggle);
assertNull(((Woggle)map4.get("w0")).other);
@SuppressWarnings("unchecked")
Map<String, Object> map5 = (Map<String, Object>)map4.get("g0");
Object o = map5.get("other");
assertEquals(Color.Green, o);
}
@ -489,41 +488,67 @@ public class JSONTest
boolean tested;
Object other;
// Getters and setters required by the POJO convertor.
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Gizmo getNested()
{
return nested;
}
public void setNested(Gizmo nested)
{
this.nested = nested;
}
public long getNumber()
{
return number;
}
public void setNumber(long number)
{
this.number = number;
}
public boolean isTested()
{
return tested;
}
public void setTested(boolean tested)
{
this.tested = tested;
}
public Object getOther()
{
return other;
}
public void setOther(Object other)
{
this.other = other;
}
}
public static class Woggle extends Gizmo implements JSON.Convertible
{
public Woggle()
{
}
@Override
public void fromJSON(Map object)
public void fromJSON(Map<String, Object> object)
{
name = (String)object.get("name");
nested = (Gizmo)object.get("nested");