http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/json/JSONObject.java ---------------------------------------------------------------------- diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/json/JSONObject.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/json/JSONObject.java deleted file mode 100644 index ce1053f..0000000 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/json/JSONObject.java +++ /dev/null @@ -1,1540 +0,0 @@ -/* -Copyright (c) 2002 JSON.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -The Software shall be used for Good, not Evil. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ -package org.apache.activemq.artemis.utils.json; - -import java.io.IOException; -import java.io.Writer; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.TreeSet; - -/** - * A JSONObject is an unordered collection of name/value pairs. - * <p> - * Its external form is a string wrapped in curly braces with colons between the names and values, - * and commas between the values and names. The internal form is an object having <code>get</code> - * and <code>opt</code> methods for accessing the values by name, and <code>put</code> methods for - * adding or replacing values by name. - * <p> - * The values can be any of these types: <code>Boolean</code>, <code>JSONArray</code>, - * <code>JSONObject</code>, <code>Number</code>, {@code string}, or the - * <code>JSONObject.NULL</code> object. A JSONObject constructor can be used to convert an external - * form JSON text into an internal form whose values can be retrieved with the <code>get</code> and - * <code>opt</code> methods, or to convert values into a JSON text using the <code>put</code> and - * <code>toString</code> methods. A <code>get</code> method returns a value if one can be found, and - * throws an exception if one cannot be found. An <code>opt</code> method returns a default value - * instead of throwing an exception, and so is useful for obtaining optional values. - * <p> - * The generic <code>get()</code> and <code>opt()</code> methods return an object, which you can - * cast or query for type. There are also typed <code>get</code> and <code>opt</code> methods that - * do type checking and type coercion for you. - * <p> - * The <code>put</code> methods adds values to an object. For example, - * - * <pre> - * myString = new JSONObject().put("JSON", "Hello, World!").toString(); - * </pre> - * - * produces the string <code>{"JSON": "Hello, World"}</code>. - * <p> - * The texts produced by the <code>toString</code> methods strictly conform to the JSON syntax - * rules. The constructors are more forgiving in the texts they will accept: - * <ul> - * <li>An extra <code>,</code> <small>(comma)</small> may appear just before the closing brace. - * </li> - * <li>Strings may be quoted with <code>'</code> <small>(single quote)</small>.</li> - * <li>Strings do not need to be quoted at all if they do not begin with a quote or single quote, - * and if they do not contain leading or trailing spaces, and if they do not contain any of these - * characters: <code>{ } [ ] / \ : , = ; #</code> and if they do not look like numbers and if they - * are not the reserved words <code>true</code>, <code>false</code>, or {@code null}.</li> - * <li>Keys can be followed by <code>=</code> or <code>=></code> as well as by <code>:</code>.</li> - * <li>Values can be followed by <code>;</code> <small>(semicolon)</small> as well as by - * <code>,</code> <small>(comma)</small>.</li> - * <li>Numbers may have the <code>0-</code> <small>(octal)</small> or <code>0x-</code> - * <small>(hex)</small> prefix.</li> - * </ul> - */ -public class JSONObject { - - /** - * JSONObject.NULL is equivalent to the value that JavaScript calls null, - * whilst Java's null is equivalent to the value that JavaScript calls - * undefined. - */ - private static final class Null { - - /** - * There is only intended to be a single instance of the NULL object, - * so the clone method returns itself. - * - * @return NULL. - */ - @Override - protected Object clone() { - return this; - } - - /** - * A Null object is equal to the null value and to itself. - * - * @param object An object to test for nullness. - * @return true if the object parameter is the JSONObject.NULL object - * or null. - */ - @Override - public boolean equals(final Object object) { - return object == null || object == this; - } - - @Override - public int hashCode() { - // TODO - return 0; - } - - /** - * Get the "null" string value. - * - * @return The string "null". - */ - @Override - public String toString() { - return "null"; - } - } - - /** - * The map where the JSONObject's properties are kept. - */ - private final Map map; - - /** - * It is sometimes more convenient and less ambiguous to have a - * {@code null} object than to use Java's {@code null} value. - * <code>JSONObject.NULL.equals(null)</code> returns <code>true</code>. - * <code>JSONObject.NULL.toString()</code> returns <code>"null"</code>. - */ - public static final Object NULL = new Null(); - - /** - * Construct an empty JSONObject. - */ - public JSONObject() { - map = new HashMap(); - } - - /** - * Construct a JSONObject from a subset of another JSONObject. - * An array of strings is used to identify the keys that should be copied. - * Missing keys are ignored. - * - * @param jo A JSONObject. - * @param names An array of strings. - * @throws JSONException If a value is a non-finite number or if a name is duplicated. - */ - public JSONObject(final JSONObject jo, final String[] names) throws JSONException { - this(); - for (String name : names) { - putOnce(name, jo.opt(name)); - } - } - - /** - * Construct a JSONObject from a JSONTokener. - * - * @param x A JSONTokener object containing the source string. - * @throws JSONException If there is a syntax error in the source string - * or a duplicated key. - */ - public JSONObject(final JSONTokener x) throws JSONException { - this(); - char c; - String key; - - if (x.nextClean() != '{') { - throw x.syntaxError("A JSONObject text must begin with '{'"); - } - for (;;) { - c = x.nextClean(); - switch (c) { - case 0: - throw x.syntaxError("A JSONObject text must end with '}'"); - case '}': - return; - default: - x.back(); - key = x.nextValue().toString(); - } - - /* - * The key is followed by ':'. We will also tolerate '=' or '=>'. - */ - - c = x.nextClean(); - if (c == '=') { - if (x.next() != '>') { - x.back(); - } - } - else if (c != ':') { - throw x.syntaxError("Expected a ':' after a key"); - } - putOnce(key, x.nextValue()); - - /* - * Pairs are separated by ','. We will also tolerate ';'. - */ - - switch (x.nextClean()) { - case ';': - case ',': - if (x.nextClean() == '}') { - return; - } - x.back(); - break; - case '}': - return; - default: - throw x.syntaxError("Expected a ',' or '}'"); - } - } - } - - /** - * Construct a JSONObject from a Map. - * - * @param map A map object that can be used to initialize the contents of - * the JSONObject. - */ - public JSONObject(final Map map) { - this.map = map == null ? new HashMap() : map; - } - - /** - * Construct a JSONObject from a Map. - * - * Note: Use this constructor when the map contains <key,bean>. - * - * @param map - A map with Key-Bean data. - * @param includeSuperClass - Tell whether to include the super class properties. - */ - public JSONObject(final Map map, final boolean includeSuperClass) { - this.map = new HashMap(); - if (map != null) { - Iterator<Map.Entry> i = map.entrySet().iterator(); - while (i.hasNext()) { - Map.Entry e = i.next(); - if (JSONObject.isStandardProperty(e.getValue().getClass())) { - this.map.put(e.getKey(), e.getValue()); - } - else { - this.map.put(e.getKey(), new JSONObject(e.getValue(), includeSuperClass)); - } - } - } - } - - /** - * Construct a JSONObject from an Object using bean getters. - * It reflects on all of the public methods of the object. - * For each of the methods with no parameters and a name starting - * with <code>"get"</code> or <code>"is"</code> followed by an uppercase letter, - * the method is invoked, and a key and the value returned from the getter method - * are put into the new JSONObject. - * - * The key is formed by removing the <code>"get"</code> or <code>"is"</code> prefix. - * If the second remaining character is not upper case, then the first - * character is converted to lower case. - * - * For example, if an object has a method named <code>"getName"</code>, and - * if the result of calling <code>object.getName()</code> is <code>"Larry Fine"</code>, - * then the JSONObject will contain <code>"name": "Larry Fine"</code>. - * - * @param bean An object that has getter methods that should be used - * to make a JSONObject. - */ - public JSONObject(final Object bean) { - this(); - populateInternalMap(bean, false); - } - - /** - * Construct a JSONObject from an Object using bean getters. - * It reflects on all of the public methods of the object. - * For each of the methods with no parameters and a name starting - * with <code>"get"</code> or <code>"is"</code> followed by an uppercase letter, - * the method is invoked, and a key and the value returned from the getter method - * are put into the new JSONObject. - * - * The key is formed by removing the <code>"get"</code> or <code>"is"</code> prefix. - * If the second remaining character is not upper case, then the first - * character is converted to lower case. - * - * @param bean An object that has getter methods that should be used - * to make a JSONObject. - * @param includeSuperClass If true, include the super class properties. - */ - public JSONObject(final Object bean, final boolean includeSuperClass) { - this(); - populateInternalMap(bean, includeSuperClass); - } - - private void populateInternalMap(final Object bean, boolean includeSuperClass) { - Class klass = bean.getClass(); - - /* If klass.getSuperClass is System class then force includeSuperClass to false. */ - - if (klass.getClassLoader() == null) { - includeSuperClass = false; - } - - Method[] methods = includeSuperClass ? klass.getMethods() : klass.getDeclaredMethods(); - for (Method method : methods) { - try { - if (Modifier.isPublic(method.getModifiers())) { - String name = method.getName(); - String key = ""; - if (name.startsWith("get")) { - key = name.substring(3); - } - else if (name.startsWith("is")) { - key = name.substring(2); - } - if (key.length() > 0 && Character.isUpperCase(key.charAt(0)) && method.getParameterTypes().length == 0) { - if (key.length() == 1) { - key = key.toLowerCase(); - } - else if (!Character.isUpperCase(key.charAt(1))) { - key = key.substring(0, 1).toLowerCase() + key.substring(1); - } - - Object result = method.invoke(bean, (Object[]) null); - if (result == null) { - map.put(key, JSONObject.NULL); - } - else if (result.getClass().isArray()) { - map.put(key, new JSONArray(result, includeSuperClass)); - } - else if (result instanceof Collection) { // List or Set - map.put(key, new JSONArray((Collection) result, includeSuperClass)); - } - else if (result instanceof Map) { - map.put(key, new JSONObject((Map) result, includeSuperClass)); - } - else if (JSONObject.isStandardProperty(result.getClass())) { // Primitives, String and Wrapper - map.put(key, result); - } - else { - if (result.getClass().getPackage().getName().startsWith("java") || result.getClass().getClassLoader() == null) { - map.put(key, result.toString()); - } - else { // User defined Objects - map.put(key, new JSONObject(result, includeSuperClass)); - } - } - } - } - } - catch (IllegalAccessException | InvocationTargetException | JSONException e) { - throw new RuntimeException(e); - } - } - } - - static boolean isStandardProperty(final Class<? extends Object> clazz) { - return clazz.isPrimitive() || clazz.isAssignableFrom(Byte.class) || - clazz.isAssignableFrom(Short.class) || - clazz.isAssignableFrom(Integer.class) || - clazz.isAssignableFrom(Long.class) || - clazz.isAssignableFrom(Float.class) || - clazz.isAssignableFrom(Double.class) || - clazz.isAssignableFrom(Character.class) || - clazz.isAssignableFrom(String.class) || - clazz.isAssignableFrom(Boolean.class); - } - - /** - * Construct a JSONObject from an Object, using reflection to find the - * public members. The resulting JSONObject's keys will be the strings - * from the names array, and the values will be the field values associated - * with those keys in the object. If a key is not found or not visible, - * then it will not be copied into the new JSONObject. - * - * @param object An object that has fields that should be used to make a - * JSONObject. - * @param names An array of strings, the names of the fields to be obtained - * from the object. - */ - public JSONObject(final Object object, final String[] names) { - this(); - Class c = object.getClass(); - for (String name : names) { - try { - putOpt(name, c.getField(name).get(object)); - } - catch (Exception e) { - /* forget about it */ - } - } - } - - /** - * Construct a JSONObject from a source JSON text string. - * This is the most commonly used JSONObject constructor. - * - * @param source A string beginning - * with <code>{</code> <small>(left brace)</small> and ending - * with <code>}</code> <small>(right brace)</small>. - * @throws JSONException If there is a syntax error in the source - * string or a duplicated key. - */ - public JSONObject(final String source) throws JSONException { - this(new JSONTokener(source)); - } - - /** - * Accumulate values under a key. It is similar to the put method except - * that if there is already an object stored under the key then a - * JSONArray is stored under the key to hold all of the accumulated values. - * If there is already a JSONArray, then the new value is appended to it. - * In contrast, the put method replaces the previous value. - * - * @param key A key string. - * @param value An object to be accumulated under the key. - * @return this. - * @throws JSONException If the value is an invalid number - * or if the key is null. - */ - public JSONObject accumulate(final String key, final Object value) throws JSONException { - JSONObject.testValidity(value); - Object o = opt(key); - if (o == null) { - put(key, value instanceof JSONArray ? new JSONArray().put(value) : value); - } - else if (o instanceof JSONArray) { - ((JSONArray) o).put(value); - } - else { - put(key, new JSONArray().put(o).put(value)); - } - return this; - } - - /** - * Append values to the array under a key. If the key does not exist in the - * JSONObject, then the key is put in the JSONObject with its value being a - * JSONArray containing the value parameter. If the key was already - * associated with a JSONArray, then the value parameter is appended to it. - * - * @param key A key string. - * @param value An object to be accumulated under the key. - * @return this. - * @throws JSONException If the key is null or if the current value - * associated with the key is not a JSONArray. - */ - public JSONObject append(final String key, final Object value) throws JSONException { - JSONObject.testValidity(value); - Object o = opt(key); - if (o == null) { - put(key, new JSONArray().put(value)); - } - else if (o instanceof JSONArray) { - put(key, ((JSONArray) o).put(value)); - } - else { - throw new JSONException("JSONObject[" + key + "] is not a JSONArray."); - } - return this; - } - - /** - * Produce a string from a double. The string "null" will be returned if - * the number is not finite. - * - * @param d A double. - * @return A String. - */ - public static String doubleToString(final double d) { - if (Double.isInfinite(d) || Double.isNaN(d)) { - return "null"; - } - - // Shave off trailing zeros and decimal point, if possible. - - String s = Double.toString(d); - if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) { - while (s.endsWith("0")) { - s = s.substring(0, s.length() - 1); - } - if (s.endsWith(".")) { - s = s.substring(0, s.length() - 1); - } - } - return s; - } - - /** - * Get the value object associated with a key. - * - * @param key A key string. - * @return The object associated with the key. - * @throws JSONException if the key is not found. - */ - public Object get(final String key) throws JSONException { - Object o = opt(key); - if (o == null) { - throw new JSONException("JSONObject[" + JSONObject.quote(key) + "] not found."); - } - return o; - } - - /** - * Get the boolean value associated with a key. - * - * @param key A key string. - * @return The truth. - * @throws JSONException if the value is not a Boolean or the String "true" or "false". - */ - public boolean getBoolean(final String key) throws JSONException { - Object o = get(key); - if (o.equals(Boolean.FALSE) || o instanceof String && ((String) o).equalsIgnoreCase("false")) { - return false; - } - else if (o.equals(Boolean.TRUE) || o instanceof String && ((String) o).equalsIgnoreCase("true")) { - return true; - } - throw new JSONException("JSONObject[" + JSONObject.quote(key) + "] is not a Boolean."); - } - - /** - * Get the double value associated with a key. - * - * @param key A key string. - * @return The numeric value. - * @throws JSONException if the key is not found or - * if the value is not a Number object and cannot be converted to a number. - */ - public double getDouble(final String key) throws JSONException { - Object o = get(key); - try { - return o instanceof Number ? ((Number) o).doubleValue() : Double.valueOf((String) o).doubleValue(); - } - catch (Exception e) { - throw new JSONException("JSONObject[" + JSONObject.quote(key) + "] is not a number."); - } - } - - /** - * Get the int value associated with a key. If the number value is too - * large for an int, it will be clipped. - * - * @param key A key string. - * @return The integer value. - * @throws JSONException if the key is not found or if the value cannot - * be converted to an integer. - */ - public int getInt(final String key) throws JSONException { - Object o = get(key); - return o instanceof Number ? ((Number) o).intValue() : (int) getDouble(key); - } - - /** - * Get the JSONArray value associated with a key. - * - * @param key A key string. - * @return A JSONArray which is the value. - * @throws JSONException if the key is not found or - * if the value is not a JSONArray. - */ - public JSONArray getJSONArray(final String key) throws JSONException { - Object o = get(key); - if (o instanceof JSONArray) { - return (JSONArray) o; - } - throw new JSONException("JSONObject[" + JSONObject.quote(key) + "] is not a JSONArray."); - } - - /** - * Get the JSONObject value associated with a key. - * - * @param key A key string. - * @return A JSONObject which is the value. - * @throws JSONException if the key is not found or - * if the value is not a JSONObject. - */ - public JSONObject getJSONObject(final String key) throws JSONException { - Object o = get(key); - if (o instanceof JSONObject) { - return (JSONObject) o; - } - throw new JSONException("JSONObject[" + JSONObject.quote(key) + "] is not a JSONObject."); - } - - /** - * Get the long value associated with a key. If the number value is too - * long for a long, it will be clipped. - * - * @param key A key string. - * @return The long value. - * @throws JSONException if the key is not found or if the value cannot - * be converted to a long. - */ - public long getLong(final String key) throws JSONException { - Object o = get(key); - return o instanceof Number ? ((Number) o).longValue() : (long) getDouble(key); - } - - /** - * Get an array of field names from a JSONObject. - * - * @return An array of field names, or null if there are no names. - */ - public static String[] getNames(final JSONObject jo) { - int length = jo.length(); - if (length == 0) { - return null; - } - Iterator i = jo.keys(); - String[] names = new String[length]; - int j = 0; - while (i.hasNext()) { - names[j] = (String) i.next(); - j += 1; - } - return names; - } - - /** - * Get an array of field names from an Object. - * - * @return An array of field names, or null if there are no names. - */ - public static String[] getNames(final Object object) { - if (object == null) { - return null; - } - Class klass = object.getClass(); - Field[] fields = klass.getFields(); - int length = fields.length; - if (length == 0) { - return null; - } - String[] names = new String[length]; - for (int i = 0; i < length; i += 1) { - names[i] = fields[i].getName(); - } - return names; - } - - /** - * Get the string associated with a key. - * - * @param key A key string. - * @return A string which is the value. - * @throws JSONException if the key is not found. - */ - public String getString(final String key) throws JSONException { - return get(key).toString(); - } - - /** - * Determine if the JSONObject contains a specific key. - * - * @param key A key string. - * @return true if the key exists in the JSONObject. - */ - public boolean has(final String key) { - return map.containsKey(key); - } - - /** - * Determine if the value associated with the key is null or if there is - * no value. - * - * @param key A key string. - * @return true if there is no value associated with the key or if - * the value is the JSONObject.NULL object. - */ - public boolean isNull(final String key) { - return JSONObject.NULL.equals(opt(key)); - } - - /** - * Get an enumeration of the keys of the JSONObject. - * - * @return An iterator of the keys. - */ - public Iterator keys() { - return map.keySet().iterator(); - } - - /** - * Get the number of keys stored in the JSONObject. - * - * @return The number of keys in the JSONObject. - */ - public int length() { - return map.size(); - } - - /** - * Produce a JSONArray containing the names of the elements of this - * JSONObject. - * - * @return A JSONArray containing the key strings, or null if the JSONObject - * is empty. - */ - public JSONArray names() { - JSONArray ja = new JSONArray(); - Iterator keys = keys(); - while (keys.hasNext()) { - ja.put(keys.next()); - } - return ja.length() == 0 ? null : ja; - } - - /** - * Produce a string from a Number. - * - * @param n A Number - * @return A String. - * @throws JSONException If n is a non-finite number. - */ - public static String numberToString(final Number n) throws JSONException { - if (n == null) { - throw new JSONException("Null pointer"); - } - JSONObject.testValidity(n); - - // Shave off trailing zeros and decimal point, if possible. - - String s = n.toString(); - if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) { - while (s.endsWith("0")) { - s = s.substring(0, s.length() - 1); - } - if (s.endsWith(".")) { - s = s.substring(0, s.length() - 1); - } - } - return s; - } - - /** - * Get an optional value associated with a key. - * - * @param key A key string. - * @return An object which is the value, or null if there is no value. - */ - public Object opt(final String key) { - return key == null ? null : map.get(key); - } - - /** - * Get an optional boolean associated with a key. - * It returns false if there is no such key, or if the value is not - * Boolean.TRUE or the String "true". - * - * @param key A key string. - * @return The truth. - */ - public boolean optBoolean(final String key) { - return optBoolean(key, false); - } - - /** - * Get an optional boolean associated with a key. - * It returns the defaultValue if there is no such key, or if it is not - * a Boolean or the String "true" or "false" (case insensitive). - * - * @param key A key string. - * @param defaultValue The default. - * @return The truth. - */ - public boolean optBoolean(final String key, final boolean defaultValue) { - try { - return getBoolean(key); - } - catch (Exception e) { - return defaultValue; - } - } - - /** - * Put a key/value pair in the JSONObject, where the value will be a - * JSONArray which is produced from a Collection. - * - * @param key A key string. - * @param value A Collection value. - * @return this. - * @throws JSONException - */ - public JSONObject put(final String key, final Collection value) throws JSONException { - put(key, new JSONArray(value)); - return this; - } - - /** - * Get an optional double associated with a key, - * or NaN if there is no such key or if its value is not a number. - * If the value is a string, an attempt will be made to evaluate it as - * a number. - * - * @param key A string which is the key. - * @return An object which is the value. - */ - public double optDouble(final String key) { - return optDouble(key, Double.NaN); - } - - /** - * Get an optional double associated with a key, or the - * defaultValue if there is no such key or if its value is not a number. - * If the value is a string, an attempt will be made to evaluate it as - * a number. - * - * @param key A key string. - * @param defaultValue The default. - * @return An object which is the value. - */ - public double optDouble(final String key, final double defaultValue) { - try { - Object o = opt(key); - return o instanceof Number ? ((Number) o).doubleValue() : new Double((String) o).doubleValue(); - } - catch (Exception e) { - return defaultValue; - } - } - - /** - * Get an optional int value associated with a key, - * or zero if there is no such key or if the value is not a number. - * If the value is a string, an attempt will be made to evaluate it as - * a number. - * - * @param key A key string. - * @return An object which is the value. - */ - public int optInt(final String key) { - return optInt(key, 0); - } - - /** - * Get an optional int value associated with a key, - * or the default if there is no such key or if the value is not a number. - * If the value is a string, an attempt will be made to evaluate it as - * a number. - * - * @param key A key string. - * @param defaultValue The default. - * @return An object which is the value. - */ - public int optInt(final String key, final int defaultValue) { - try { - return getInt(key); - } - catch (Exception e) { - return defaultValue; - } - } - - /** - * Get an optional JSONArray associated with a key. - * It returns null if there is no such key, or if its value is not a - * JSONArray. - * - * @param key A key string. - * @return A JSONArray which is the value. - */ - public JSONArray optJSONArray(final String key) { - Object o = opt(key); - return o instanceof JSONArray ? (JSONArray) o : null; - } - - /** - * Get an optional JSONObject associated with a key. - * It returns null if there is no such key, or if its value is not a - * JSONObject. - * - * @param key A key string. - * @return A JSONObject which is the value. - */ - public JSONObject optJSONObject(final String key) { - Object o = opt(key); - return o instanceof JSONObject ? (JSONObject) o : null; - } - - /** - * Get an optional long value associated with a key, - * or zero if there is no such key or if the value is not a number. - * If the value is a string, an attempt will be made to evaluate it as - * a number. - * - * @param key A key string. - * @return An object which is the value. - */ - public long optLong(final String key) { - return optLong(key, 0); - } - - /** - * Get an optional long value associated with a key, - * or the default if there is no such key or if the value is not a number. - * If the value is a string, an attempt will be made to evaluate it as - * a number. - * - * @param key A key string. - * @param defaultValue The default. - * @return An object which is the value. - */ - public long optLong(final String key, final long defaultValue) { - try { - return getLong(key); - } - catch (Exception e) { - return defaultValue; - } - } - - /** - * Get an optional string associated with a key. - * It returns an empty string if there is no such key. If the value is not - * a string and is not null, then it is converted to a string. - * - * @param key A key string. - * @return A string which is the value. - */ - public String optString(final String key) { - return optString(key, ""); - } - - /** - * Get an optional string associated with a key. - * It returns the defaultValue if there is no such key. - * - * @param key A key string. - * @param defaultValue The default. - * @return A string which is the value. - */ - public String optString(final String key, final String defaultValue) { - Object o = opt(key); - return o != null ? o.toString() : defaultValue; - } - - /** - * Put a key/boolean pair in the JSONObject. - * - * @param key A key string. - * @param value A boolean which is the value. - * @return this. - * @throws JSONException If the key is null. - */ - public JSONObject put(final String key, final boolean value) throws JSONException { - put(key, value ? Boolean.TRUE : Boolean.FALSE); - return this; - } - - /** - * Put a key/double pair in the JSONObject. - * - * @param key A key string. - * @param value A double which is the value. - * @return this. - * @throws JSONException If the key is null or if the number is invalid. - */ - public JSONObject put(final String key, final double value) throws JSONException { - put(key, Double.valueOf(value)); - return this; - } - - /** - * Put a key/int pair in the JSONObject. - * - * @param key A key string. - * @param value An int which is the value. - * @return this. - * @throws JSONException If the key is null. - */ - public JSONObject put(final String key, final int value) throws JSONException { - put(key, Integer.valueOf(value)); - return this; - } - - /** - * Put a key/long pair in the JSONObject. - * - * @param key A key string. - * @param value A long which is the value. - * @return this. - * @throws JSONException If the key is null. - */ - public JSONObject put(final String key, final long value) throws JSONException { - put(key, Long.valueOf(value)); - return this; - } - - /** - * Put a key/value pair in the JSONObject, where the value will be a - * JSONObject which is produced from a Map. - * - * @param key A key string. - * @param value A Map value. - * @return this. - * @throws JSONException - */ - public JSONObject put(final String key, final Map value) throws JSONException { - put(key, new JSONObject(value)); - return this; - } - - /** - * Put a key/value pair in the JSONObject. If the value is null, - * then the key will be removed from the JSONObject if it is present. - * - * @param key A key string. - * @param value An object which is the value. It should be of one of these - * types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String, - * or the JSONObject.NULL object. - * @return this. - * @throws JSONException If the value is non-finite number - * or if the key is null. - */ - public JSONObject put(final String key, final Object value) throws JSONException { - if (key == null) { - throw new JSONException("Null key."); - } - if (value != null) { - JSONObject.testValidity(value); - map.put(key, value); - } - else { - remove(key); - } - return this; - } - - /** - * Put a key/value pair in the JSONObject, but only if the key and the - * value are both non-null, and only if there is not already a member - * with that name. - * - * @param key - * @param value - * @return his. - * @throws JSONException if the key is a duplicate - */ - public JSONObject putOnce(final String key, final Object value) throws JSONException { - if (key != null && value != null) { - if (opt(key) != null) { - throw new JSONException("Duplicate key \"" + key + "\""); - } - put(key, value); - } - return this; - } - - /** - * Put a key/value pair in the JSONObject, but only if the - * key and the value are both non-null. - * - * @param key A key string. - * @param value An object which is the value. It should be of one of these - * types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String, - * or the JSONObject.NULL object. - * @return this. - * @throws JSONException If the value is a non-finite number. - */ - public JSONObject putOpt(final String key, final Object value) throws JSONException { - if (key != null && value != null) { - put(key, value); - } - return this; - } - - /** - * Produce a string in double quotes with backslash sequences in all the - * right places. A backslash will be inserted within </, allowing JSON - * text to be delivered in HTML. In JSON text, a string cannot contain a - * control character or an unescaped quote or backslash. - * - * @param string A String - * @return A String correctly formatted for insertion in a JSON text. - */ - public static String quote(final String string) { - if (string == null || string.length() == 0) { - return "\"\""; - } - - char b; - char c = 0; - int i; - int len = string.length(); - StringBuffer sb = new StringBuffer(len + 4); - String t; - - sb.append('"'); - for (i = 0; i < len; i += 1) { - b = c; - c = string.charAt(i); - switch (c) { - case '\\': - case '"': - sb.append('\\'); - sb.append(c); - break; - case '/': - if (b == '<') { - sb.append('\\'); - } - sb.append(c); - break; - case '\b': - sb.append("\\b"); - break; - case '\t': - sb.append("\\t"); - break; - case '\n': - sb.append("\\n"); - break; - case '\f': - sb.append("\\f"); - break; - case '\r': - sb.append("\\r"); - break; - default: - if (c < ' ' || c >= '\u0080' && c < '\u00a0' || c >= '\u2000' && c < '\u2100') { - t = "000" + Integer.toHexString(c); - sb.append("\\u" + t.substring(t.length() - 4)); - } - else { - sb.append(c); - } - } - } - sb.append('"'); - return sb.toString(); - } - - /** - * Remove a name and its value, if present. - * - * @param key The name to be removed. - * @return The value that was associated with the name, - * or null if there was no value. - */ - public Object remove(final String key) { - return map.remove(key); - } - - /** - * Get an enumeration of the keys of the JSONObject. - * The keys will be sorted alphabetically. - * - * @return An iterator of the keys. - */ - public Iterator sortedKeys() { - return new TreeSet(map.keySet()).iterator(); - } - - /** - * Try to convert a string into a number, boolean, or null. If the string - * can't be converted, return the string. - * - * @param s A String. - * @return A simple JSON value. - */ - public static Object stringToValue(final String s) { - if (s.equals("")) { - return s; - } - if (s.equalsIgnoreCase("true")) { - return Boolean.TRUE; - } - if (s.equalsIgnoreCase("false")) { - return Boolean.FALSE; - } - if (s.equalsIgnoreCase("null")) { - return JSONObject.NULL; - } - - /* - * If it might be a number, try converting it. We support the 0- and 0x- - * conventions. If a number cannot be produced, then the value will just - * be a string. Note that the 0-, 0x-, plus, and implied string - * conventions are non-standard. A JSON parser is free to accept - * non-JSON forms as long as it accepts all correct JSON forms. - */ - - char b = s.charAt(0); - if (b >= '0' && b <= '9' || b == '.' || b == '-' || b == '+') { - if (b == '0') { - if (s.length() > 2 && (s.charAt(1) == 'x' || s.charAt(1) == 'X')) { - try { - return Integer.valueOf(Integer.parseInt(s.substring(2), 16)); - } - catch (Exception e) { - /* Ignore the error */ - } - } - else { - try { - return Integer.valueOf(Integer.parseInt(s, 8)); - } - catch (Exception e) { - /* Ignore the error */ - } - } - } - try { - if (s.indexOf('.') > -1 || s.indexOf('e') > -1 || s.indexOf('E') > -1) { - return Double.valueOf(s); - } - else { - Long myLong = Long.valueOf(s); - if (myLong.longValue() == myLong.intValue()) { - return Integer.valueOf(myLong.intValue()); - } - else { - return myLong; - } - } - } - catch (Exception f) { - /* Ignore the error */ - } - } - return s; - } - - /** - * Throw an exception if the object is a NaN or infinite number. - * - * @param o The object to test. - * @throws JSONException If o is a non-finite number. - */ - static void testValidity(final Object o) throws JSONException { - if (o != null) { - if (o instanceof Double) { - if (((Double) o).isInfinite() || ((Double) o).isNaN()) { - throw new JSONException("JSON does not allow non-finite numbers."); - } - } - else if (o instanceof Float) { - if (((Float) o).isInfinite() || ((Float) o).isNaN()) { - throw new JSONException("JSON does not allow non-finite numbers."); - } - } - } - } - - /** - * Produce a JSONArray containing the values of the members of this - * JSONObject. - * - * @param names A JSONArray containing a list of key strings. This - * determines the sequence of the values in the result. - * @return A JSONArray of values. - * @throws JSONException If any of the values are non-finite numbers. - */ - public JSONArray toJSONArray(final JSONArray names) throws JSONException { - if (names == null || names.length() == 0) { - return null; - } - JSONArray ja = new JSONArray(); - for (int i = 0; i < names.length(); i += 1) { - ja.put(opt(names.getString(i))); - } - return ja; - } - - /** - * Make a JSON text of this JSONObject. For compactness, no whitespace - * is added. If this would not result in a syntactically correct JSON text, - * then null will be returned instead. - * <p> - * Warning: This method assumes that the data structure is acyclical. - * - * @return a printable, displayable, portable, transmittable - * representation of the object, beginning - * with <code>{</code> <small>(left brace)</small> and ending - * with <code>}</code> <small>(right brace)</small>. - */ - @Override - public String toString() { - try { - Iterator keys = keys(); - StringBuilder sb = new StringBuilder("{"); - - while (keys.hasNext()) { - if (sb.length() > 1) { - sb.append(','); - } - Object o = keys.next(); - sb.append(JSONObject.quote(o.toString())); - sb.append(':'); - sb.append(JSONObject.valueToString(map.get(o))); - } - sb.append('}'); - return sb.toString(); - } - catch (JSONException e) { - return null; - } - } - - /** - * Make a prettyprinted JSON text of this JSONObject. - * <p> - * Warning: This method assumes that the data structure is acyclical. - * - * @param indentFactor The number of spaces to add to each level of - * indentation. - * @return a printable, displayable, portable, transmittable - * representation of the object, beginning - * with <code>{</code> <small>(left brace)</small> and ending - * with <code>}</code> <small>(right brace)</small>. - * @throws JSONException If the object contains an invalid number. - */ - public String toString(final int indentFactor) throws JSONException { - return toString(indentFactor, 0); - } - - /** - * Make a prettyprinted JSON text of this JSONObject. - * <p> - * Warning: This method assumes that the data structure is acyclical. - * - * @param indentFactor The number of spaces to add to each level of - * indentation. - * @param indent The indentation of the top level. - * @return a printable, displayable, transmittable - * representation of the object, beginning - * with <code>{</code> <small>(left brace)</small> and ending - * with <code>}</code> <small>(right brace)</small>. - * @throws JSONException If the object contains an invalid number. - */ - String toString(final int indentFactor, final int indent) throws JSONException { - int j; - int n = length(); - if (n == 0) { - return "{}"; - } - Iterator keys = sortedKeys(); - StringBuffer sb = new StringBuffer("{"); - int newindent = indent + indentFactor; - Object o; - if (n == 1) { - o = keys.next(); - sb.append(JSONObject.quote(o.toString())); - sb.append(": "); - sb.append(JSONObject.valueToString(map.get(o), indentFactor, indent)); - } - else { - while (keys.hasNext()) { - o = keys.next(); - if (sb.length() > 1) { - sb.append(",\n"); - } - else { - sb.append('\n'); - } - for (j = 0; j < newindent; j += 1) { - sb.append(' '); - } - sb.append(JSONObject.quote(o.toString())); - sb.append(": "); - sb.append(JSONObject.valueToString(map.get(o), indentFactor, newindent)); - } - if (sb.length() > 1) { - sb.append('\n'); - for (j = 0; j < indent; j += 1) { - sb.append(' '); - } - } - } - sb.append('}'); - return sb.toString(); - } - - /** - * Make a JSON text of an Object value. If the object has an - * value.toJSONString() method, then that method will be used to produce - * the JSON text. The method is required to produce a strictly - * conforming text. If the object does not contain a toJSONString - * method (which is the most common case), then a text will be - * produced by other means. If the value is an array or Collection, - * then a JSONArray will be made from it and its toJSONString method - * will be called. If the value is a MAP, then a JSONObject will be made - * from it and its toJSONString method will be called. Otherwise, the - * value's toString method will be called, and the result will be quoted. - * - * <p> - * Warning: This method assumes that the data structure is acyclical. - * - * @param value The value to be serialized. - * @return a printable, displayable, transmittable - * representation of the object, beginning - * with <code>{</code> <small>(left brace)</small> and ending - * with <code>}</code> <small>(right brace)</small>. - * @throws JSONException If the value is or contains an invalid number. - */ - static String valueToString(final Object value) throws JSONException { - if (value == null || JSONObject.NULL == value) { - return "null"; - } - if (value instanceof JSONString) { - String o; - try { - o = ((JSONString) value).toJSONString(); - } - catch (RuntimeException e) { - throw new JSONException(e); - } - if (o == null) - throw new JSONException("Bad value from toJSONString: " + o); - return o; - } - if (value instanceof Number) { - return JSONObject.numberToString((Number) value); - } - if (value instanceof Boolean || value instanceof JSONObject || value instanceof JSONArray) { - return value.toString(); - } - if (value instanceof Map) { - return new JSONObject((Map) value).toString(); - } - if (value instanceof Collection) { - return new JSONArray((Collection) value).toString(); - } - if (value.getClass().isArray()) { - return new JSONArray(value).toString(); - } - return JSONObject.quote(value.toString()); - } - - /** - * Make a prettyprinted JSON text of an object value. - * <p> - * Warning: This method assumes that the data structure is acyclical. - * - * @param value The value to be serialized. - * @param indentFactor The number of spaces to add to each level of - * indentation. - * @param indent The indentation of the top level. - * @return a printable, displayable, transmittable - * representation of the object, beginning - * with <code>{</code> <small>(left brace)</small> and ending - * with <code>}</code> <small>(right brace)</small>. - * @throws JSONException If the object contains an invalid number. - */ - static String valueToString(final Object value, final int indentFactor, final int indent) throws JSONException { - if (value == null || JSONObject.NULL == value) { - return "null"; - } - try { - if (value instanceof JSONString) { - String o = ((JSONString) value).toJSONString(); - if (o != null) - return o; - } - } - catch (RuntimeException e) { - /* forget about it */ - } - if (value instanceof Number) { - return JSONObject.numberToString((Number) value); - } - if (value instanceof Boolean) { - return value.toString(); - } - if (value instanceof JSONObject) { - return ((JSONObject) value).toString(indentFactor, indent); - } - if (value instanceof JSONArray) { - return ((JSONArray) value).toString(indentFactor, indent); - } - if (value instanceof Map) { - return new JSONObject((Map) value).toString(indentFactor, indent); - } - if (value instanceof Collection) { - return new JSONArray((Collection) value).toString(indentFactor, indent); - } - if (value.getClass().isArray()) { - return new JSONArray(value).toString(indentFactor, indent); - } - return JSONObject.quote(value.toString()); - } - - /** - * Write the contents of the JSONObject as JSON text to a writer. - * For compactness, no whitespace is added. - * <p> - * Warning: This method assumes that the data structure is acyclical. - * - * @return The writer. - * @throws JSONException - */ - public Writer write(final Writer writer) throws JSONException { - try { - boolean b = false; - Iterator keys = keys(); - writer.write('{'); - - while (keys.hasNext()) { - if (b) { - writer.write(','); - } - Object k = keys.next(); - writer.write(JSONObject.quote(k.toString())); - writer.write(':'); - Object v = map.get(k); - if (v instanceof JSONObject) { - ((JSONObject) v).write(writer); - } - else if (v instanceof JSONArray) { - ((JSONArray) v).write(writer); - } - else { - writer.write(JSONObject.valueToString(v)); - } - b = true; - } - writer.write('}'); - return writer; - } - catch (IOException e) { - throw new JSONException(e); - } - } -}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/json/JSONString.java ---------------------------------------------------------------------- diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/json/JSONString.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/json/JSONString.java deleted file mode 100644 index 07ec907..0000000 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/json/JSONString.java +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright (c) 2002 JSON.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -The Software shall be used for Good, not Evil. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ -package org.apache.activemq.artemis.utils.json; - -/** - * The <code>JSONString</code> interface allows a <code>toJSONString()</code> - * method so that a class can change the behavior of - * <code>JSONObject.toString()</code>, <code>JSONArray.toString()</code>, - * and <code>JSONWriter.value(</code>Object<code>)</code>. The - * <code>toJSONString</code> method will be used instead of the default behavior - * of using the Object's <code>toString()</code> method and quoting the result. - */ -public interface JSONString { - - /** - * The <code>toJSONString</code> method allows a class to produce its own JSON - * serialization. - * - * @return A strictly syntactically correct JSON text. - */ - String toJSONString(); -} http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/json/JSONTokener.java ---------------------------------------------------------------------- diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/json/JSONTokener.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/json/JSONTokener.java deleted file mode 100644 index 5f5153b..0000000 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/json/JSONTokener.java +++ /dev/null @@ -1,414 +0,0 @@ -/* -Copyright (c) 2002 JSON.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -The Software shall be used for Good, not Evil. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ -package org.apache.activemq.artemis.utils.json; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; - -/** - * A JSONTokener takes a source string and extracts characters and tokens from - * it. It is used by the JSONObject and JSONArray constructors to parse - * JSON source strings. - */ -public class JSONTokener { - - private int index; - - private final Reader reader; - - private char lastChar; - - private boolean useLastChar; - - /** - * Construct a JSONTokener from a string. - * - * @param reader A reader. - */ - public JSONTokener(final Reader reader) { - this.reader = reader.markSupported() ? reader : new BufferedReader(reader); - useLastChar = false; - index = 0; - } - - /** - * Construct a JSONTokener from a string. - * - * @param s A source string. - */ - public JSONTokener(final String s) { - this(new StringReader(s)); - } - - /** - * Back up one character. This provides a sort of lookahead capability, - * so that you can test for a digit or letter before attempting to parse - * the next number or identifier. - */ - public void back() throws JSONException { - if (useLastChar || index <= 0) { - throw new JSONException("Stepping back two steps is not supported"); - } - index -= 1; - useLastChar = true; - } - - /** - * Get the hex value of a character (base16). - * - * @param c A character between '0' and '9' or between 'A' and 'F' or - * between 'a' and 'f'. - * @return An int between 0 and 15, or -1 if c was not a hex digit. - */ - public static int dehexchar(final char c) { - if (c >= '0' && c <= '9') { - return c - '0'; - } - if (c >= 'A' && c <= 'F') { - return c - ('A' - 10); - } - if (c >= 'a' && c <= 'f') { - return c - ('a' - 10); - } - return -1; - } - - /** - * Determine if the source string still contains characters that next() - * can consume. - * - * @return true if not yet at the end of the source. - */ - public boolean more() throws JSONException { - char nextChar = next(); - if (nextChar == 0) { - return false; - } - back(); - return true; - } - - /** - * Get the next character in the source string. - * - * @return The next character, or 0 if past the end of the source string. - */ - public char next() throws JSONException { - if (useLastChar) { - useLastChar = false; - if (lastChar != 0) { - index += 1; - } - return lastChar; - } - int c; - try { - c = reader.read(); - } - catch (IOException exc) { - throw new JSONException(exc); - } - - if (c <= 0) { // End of stream - lastChar = 0; - return 0; - } - index += 1; - lastChar = (char) c; - return lastChar; - } - - /** - * Consume the next character, and check that it matches a specified - * character. - * - * @param c The character to match. - * @return The character. - * @throws JSONException if the character does not match. - */ - public char next(final char c) throws JSONException { - char n = next(); - if (n != c) { - throw syntaxError("Expected '" + c + "' and instead saw '" + n + "'"); - } - return n; - } - - /** - * Get the next n characters. - * - * @param n The number of characters to take. - * @return A string of n characters. - * @throws JSONException Substring bounds error if there are not - * n characters remaining in the source string. - */ - public String next(final int n) throws JSONException { - if (n == 0) { - return ""; - } - - char[] buffer = new char[n]; - int pos = 0; - - if (useLastChar) { - useLastChar = false; - buffer[0] = lastChar; - pos = 1; - } - - try { - int len; - while (pos < n && (len = reader.read(buffer, pos, n - pos)) != -1) { - pos += len; - } - } - catch (IOException exc) { - throw new JSONException(exc); - } - index += pos; - - if (pos < n) { - throw syntaxError("Substring bounds error"); - } - - lastChar = buffer[n - 1]; - return new String(buffer); - } - - /** - * Get the next char in the string, skipping whitespace. - * - * @return A character, or 0 if there are no more characters. - * @throws JSONException - */ - public char nextClean() throws JSONException { - for (;;) { - char c = next(); - if (c == 0 || c > ' ') { - return c; - } - } - } - - /** - * Return the characters up to the next close quote character. - * Backslash processing is done. The formal JSON format does not - * allow strings in single quotes, but an implementation is allowed to - * accept them. - * - * @param quote The quoting character, either - * <code>"</code> <small>(double quote)</small> or - * <code>'</code> <small>(single quote)</small>. - * @return A String. - * @throws JSONException Unterminated string. - */ - public String nextString(final char quote) throws JSONException { - char c; - StringBuffer sb = new StringBuffer(); - for (;;) { - c = next(); - switch (c) { - case 0: - case '\n': - case '\r': - throw syntaxError("Unterminated string"); - case '\\': - c = next(); - switch (c) { - case 'b': - sb.append('\b'); - break; - case 't': - sb.append('\t'); - break; - case 'n': - sb.append('\n'); - break; - case 'f': - sb.append('\f'); - break; - case 'r': - sb.append('\r'); - break; - case 'u': - sb.append((char) Integer.parseInt(next(4), 16)); - break; - case 'x': - sb.append((char) Integer.parseInt(next(2), 16)); - break; - default: - sb.append(c); - } - break; - default: - if (c == quote) { - return sb.toString(); - } - sb.append(c); - } - } - } - - /** - * Get the text up but not including the specified character or the - * end of line, whichever comes first. - * - * @param d A delimiter character. - * @return A string. - */ - public String nextTo(final char d) throws JSONException { - StringBuffer sb = new StringBuffer(); - for (;;) { - char c = next(); - if (c == d || c == 0 || c == '\n' || c == '\r') { - if (c != 0) { - back(); - } - return sb.toString().trim(); - } - sb.append(c); - } - } - - /** - * Get the text up but not including one of the specified delimiter - * characters or the end of line, whichever comes first. - * - * @param delimiters A set of delimiter characters. - * @return A string, trimmed. - */ - public String nextTo(final String delimiters) throws JSONException { - char c; - StringBuffer sb = new StringBuffer(); - for (;;) { - c = next(); - if (delimiters.indexOf(c) >= 0 || c == 0 || c == '\n' || c == '\r') { - if (c != 0) { - back(); - } - return sb.toString().trim(); - } - sb.append(c); - } - } - - /** - * Get the next value. The value can be a Boolean, Double, Integer, - * JSONArray, JSONObject, Long, or String, or the JSONObject.NULL object. - * - * @return An object. - * @throws JSONException If syntax error. - */ - public Object nextValue() throws JSONException { - char c = nextClean(); - String s; - - switch (c) { - case '"': - case '\'': - return nextString(c); - case '{': - back(); - return new JSONObject(this); - case '[': - case '(': - back(); - return new JSONArray(this); - } - - /* - * Handle unquoted text. This could be the values true, false, or - * null, or it can be a number. An implementation (such as this one) - * is allowed to also accept non-standard forms. - * - * Accumulate characters until we reach the end of the text or a - * formatting character. - */ - - StringBuffer sb = new StringBuffer(); - while (c >= ' ' && ",:]}/\\\"[{;=#".indexOf(c) < 0) { - sb.append(c); - c = next(); - } - back(); - - s = sb.toString().trim(); - if (s.equals("")) { - throw syntaxError("Missing value"); - } - return JSONObject.stringToValue(s); - } - - /** - * Skip characters until the next character is the requested character. - * If the requested character is not found, no characters are skipped. - * - * @param to A character to skip to. - * @return The requested character, or zero if the requested character - * is not found. - */ - public char skipTo(final char to) throws JSONException { - char c; - try { - int startIndex = index; - reader.mark(Integer.MAX_VALUE); - do { - c = next(); - if (c == 0) { - reader.reset(); - index = startIndex; - return c; - } - } while (c != to); - } - catch (IOException exc) { - throw new JSONException(exc); - } - - back(); - return c; - } - - /** - * Make a JSONException to signal a syntax error. - * - * @param message The error message. - * @return A JSONException object, suitable for throwing - */ - public JSONException syntaxError(final String message) { - return new JSONException(message + toString()); - } - - /** - * Make a printable string of this JSONTokener. - * - * @return " at character [this.index]" - */ - @Override - public String toString() { - return " at character " + index; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-core-client/src/test/java/org/apache/activemq/artemis/api/core/management/AddressSettingsInfoTest.java ---------------------------------------------------------------------- diff --git a/artemis-core-client/src/test/java/org/apache/activemq/artemis/api/core/management/AddressSettingsInfoTest.java b/artemis-core-client/src/test/java/org/apache/activemq/artemis/api/core/management/AddressSettingsInfoTest.java new file mode 100644 index 0000000..f477879 --- /dev/null +++ b/artemis-core-client/src/test/java/org/apache/activemq/artemis/api/core/management/AddressSettingsInfoTest.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.activemq.artemis.api.core.management; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class AddressSettingsInfoTest { + + @Test + public void shouldLoadFromJSON() { + String json = "{\n" + + "\"addressFullMessagePolicy\":\"fullPolicy\",\n" + + "\"maxSizeBytes\":500,\n" + + "\"pageSizeBytes\":200,\n" + + "\"pageCacheMaxSize\":3,\n" + + "\"maxDeliveryAttempts\":3,\n" + + "\"redeliveryDelay\":70000,\n" + + "\"redeliveryMultiplier\":1.5,\n" + + "\"maxRedeliveryDelay\":100000,\n" + + "\"DLA\":\"deadLettersGoHere\",\n" + + "\"expiryAddress\":\"\",\n" + + "\"lastValueQueue\":true,\n" + + "\"redistributionDelay\":10004,\n" + + "\"sendToDLAOnNoRoute\":true,\n" + + "\"slowConsumerThreshold\":200,\n" + + "\"slowConsumerCheckPeriod\":300,\n" + + "\"slowConsumerPolicy\":\"retire\",\n" + + "\"autoCreateJmsQueues\":true,\n" + + "\"autoDeleteJmsQueues\":false,\n" + + "\"autoCreateJmsTopics\":true,\n" + + "\"autoDeleteJmsTopics\":false\n" + + "}"; + AddressSettingsInfo addressSettingsInfo = AddressSettingsInfo.from(json); + assertEquals("fullPolicy", addressSettingsInfo.getAddressFullMessagePolicy()); + assertEquals(500L, addressSettingsInfo.getMaxSizeBytes()); + assertEquals(200L, addressSettingsInfo.getPageSizeBytes()); + assertEquals(3, addressSettingsInfo.getPageCacheMaxSize()); + assertEquals(3, addressSettingsInfo.getMaxDeliveryAttempts()); + assertEquals(70000, addressSettingsInfo.getRedeliveryDelay()); + assertEquals(1.5, addressSettingsInfo.getRedeliveryMultiplier(), 0); + assertEquals(100000, addressSettingsInfo.getMaxRedeliveryDelay()); + assertEquals("deadLettersGoHere", addressSettingsInfo.getDeadLetterAddress()); + assertEquals("", addressSettingsInfo.getExpiryAddress()); + assertTrue(addressSettingsInfo.isLastValueQueue()); + assertEquals(10004L, addressSettingsInfo.getRedistributionDelay()); + assertTrue(addressSettingsInfo.isSendToDLAOnNoRoute()); + assertEquals(200L, addressSettingsInfo.getSlowConsumerThreshold()); + assertEquals(300L, addressSettingsInfo.getSlowConsumerCheckPeriod()); + assertEquals("retire", addressSettingsInfo.getSlowConsumerPolicy()); + assertTrue(addressSettingsInfo.isAutoCreateJmsQueues()); + assertTrue(addressSettingsInfo.isAutoCreateJmsTopics()); + assertFalse(addressSettingsInfo.isAutoDeleteJmsQueues()); + assertFalse(addressSettingsInfo.isAutoDeleteJmsTopics()); + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-distribution/pom.xml ---------------------------------------------------------------------- diff --git a/artemis-distribution/pom.xml b/artemis-distribution/pom.xml index 0faa449..33e59a3 100644 --- a/artemis-distribution/pom.xml +++ b/artemis-distribution/pom.xml @@ -188,6 +188,14 @@ <groupId>io.netty</groupId> <artifactId>netty-codec-mqtt</artifactId> </dependency> + <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-json_1.0_spec</artifactId> + </dependency> + <dependency> + <groupId>org.apache.johnzon</groupId> + <artifactId>johnzon-core</artifactId> + </dependency> </dependencies> <build> http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-distribution/src/main/assembly/dep.xml ---------------------------------------------------------------------- diff --git a/artemis-distribution/src/main/assembly/dep.xml b/artemis-distribution/src/main/assembly/dep.xml index 0feb531..a62ef25 100644 --- a/artemis-distribution/src/main/assembly/dep.xml +++ b/artemis-distribution/src/main/assembly/dep.xml @@ -93,6 +93,8 @@ <include>org.fusesource.hawtbuf:hawtbuf</include> <include>org.jgroups:jgroups</include> <include>io.netty:netty-codec-mqtt</include> + <include>org.apache.geronimo.specs:geronimo-json_1.0_spec</include> + <include>org.apache.johnzon:johnzon-core</include> </includes> <!--excludes> <exclude>org.apache.activemq:artemis-website</exclude> http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-features/src/main/resources/features.xml ---------------------------------------------------------------------- diff --git a/artemis-features/src/main/resources/features.xml b/artemis-features/src/main/resources/features.xml index c6cd831..2677626 100644 --- a/artemis-features/src/main/resources/features.xml +++ b/artemis-features/src/main/resources/features.xml @@ -51,6 +51,9 @@ <bundle>mvn:org.jboss.logging/jboss-logging/${jboss.logging.version}</bundle> <bundle>mvn:org.jgroups/jgroups/${jgroups.version}</bundle> + <bundle>mvn:org.apache.geronimo.specs/geronimo-json_1.0_spec/${json-p.spec.version}</bundle> + <bundle>mvn:org.apache.johnzon/johnzon-core/${johnzon.version}</bundle> + <bundle>mvn:org.apache.activemq/artemis-native/${pom.version}</bundle> <bundle>mvn:org.apache.activemq/artemis-server-osgi/${pom.version}</bundle> </feature> http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-jms-client/pom.xml ---------------------------------------------------------------------- diff --git a/artemis-jms-client/pom.xml b/artemis-jms-client/pom.xml index 6a06d41..0c50418 100644 --- a/artemis-jms-client/pom.xml +++ b/artemis-jms-client/pom.xml @@ -69,7 +69,6 @@ <artifactId>junit</artifactId> <scope>test</scope> </dependency> - </dependencies> <profiles> http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSConnectionInfo.java ---------------------------------------------------------------------- diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSConnectionInfo.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSConnectionInfo.java index e184c01..120610c 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSConnectionInfo.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSConnectionInfo.java @@ -16,8 +16,10 @@ */ package org.apache.activemq.artemis.api.jms.management; -import org.apache.activemq.artemis.utils.json.JSONArray; -import org.apache.activemq.artemis.utils.json.JSONObject; +import org.apache.activemq.artemis.api.core.JsonUtil; + +import javax.json.JsonArray; +import javax.json.JsonObject; public class JMSConnectionInfo { @@ -34,14 +36,16 @@ public class JMSConnectionInfo { // Static -------------------------------------------------------- public static JMSConnectionInfo[] from(final String jsonString) throws Exception { - JSONArray array = new JSONArray(jsonString); - JMSConnectionInfo[] infos = new JMSConnectionInfo[array.length()]; - for (int i = 0; i < array.length(); i++) { - JSONObject obj = array.getJSONObject(i); + JsonArray array = JsonUtil.readJsonArray(jsonString); + JMSConnectionInfo[] infos = new JMSConnectionInfo[array.size()]; + for (int i = 0; i < array.size(); i++) { + JsonObject obj = array.getJsonObject(i); String cid = obj.isNull("clientID") ? null : obj.getString("clientID"); String uname = obj.isNull("principal") ? null : obj.getString("principal"); - JMSConnectionInfo info = new JMSConnectionInfo(obj.getString("connectionID"), obj.getString("clientAddress"), obj.getLong("creationTime"), cid, uname); + JMSConnectionInfo info = new JMSConnectionInfo(obj.getString("connectionID"), obj.getString("clientAddress"), + obj.getJsonNumber("creationTime").longValue(), + cid, uname); infos[i] = info; } return infos; http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSConsumerInfo.java ---------------------------------------------------------------------- diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSConsumerInfo.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSConsumerInfo.java index 7f4be56..10b8ba0 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSConsumerInfo.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSConsumerInfo.java @@ -16,8 +16,10 @@ */ package org.apache.activemq.artemis.api.jms.management; -import org.apache.activemq.artemis.utils.json.JSONArray; -import org.apache.activemq.artemis.utils.json.JSONObject; +import org.apache.activemq.artemis.api.core.JsonUtil; + +import javax.json.JsonArray; +import javax.json.JsonObject; /** * Helper class to create Java Objects from the @@ -48,11 +50,14 @@ public class JMSConsumerInfo { * by {@link TopicControl#listAllSubscriptionsAsJSON()} and related methods. */ public static JMSConsumerInfo[] from(final String jsonString) throws Exception { - JSONArray array = new JSONArray(jsonString); - JMSConsumerInfo[] infos = new JMSConsumerInfo[array.length()]; - for (int i = 0; i < array.length(); i++) { - JSONObject sub = array.getJSONObject(i); - JMSConsumerInfo info = new JMSConsumerInfo(sub.getString("consumerID"), sub.getString("connectionID"), sub.getString("destinationName"), sub.getString("destinationType"), sub.getBoolean("browseOnly"), sub.getLong("creationTime"), sub.getBoolean("durable"), sub.optString("filter", null)); + JsonArray array = JsonUtil.readJsonArray(jsonString); + JMSConsumerInfo[] infos = new JMSConsumerInfo[array.size()]; + for (int i = 0; i < array.size(); i++) { + JsonObject sub = array.getJsonObject(i); + JMSConsumerInfo info = new JMSConsumerInfo(sub.getString("consumerID"), sub.getString("connectionID"), + sub.getString("destinationName"), sub.getString("destinationType"), sub.getBoolean("browseOnly"), + sub.getJsonNumber("creationTime").longValue(), + sub.getBoolean("durable"), sub.getString("filter", null)); infos[i] = info; } http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSSessionInfo.java ---------------------------------------------------------------------- diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSSessionInfo.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSSessionInfo.java index 56829c9..b5f0d08 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSSessionInfo.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSSessionInfo.java @@ -16,9 +16,10 @@ */ package org.apache.activemq.artemis.api.jms.management; -import org.apache.activemq.artemis.utils.json.JSONArray; -import org.apache.activemq.artemis.utils.json.JSONException; -import org.apache.activemq.artemis.utils.json.JSONObject; +import org.apache.activemq.artemis.api.core.JsonUtil; + +import javax.json.JsonArray; +import javax.json.JsonObject; public class JMSSessionInfo { @@ -31,13 +32,14 @@ public class JMSSessionInfo { this.creationTime = creationTime; } - public static JMSSessionInfo[] from(final String jsonString) throws JSONException { - JSONArray array = new JSONArray(jsonString); - JMSSessionInfo[] infos = new JMSSessionInfo[array.length()]; - for (int i = 0; i < array.length(); i++) { - JSONObject obj = array.getJSONObject(i); + public static JMSSessionInfo[] from(final String jsonString) { + JsonArray array = JsonUtil.readJsonArray(jsonString); + JMSSessionInfo[] infos = new JMSSessionInfo[array.size()]; + for (int i = 0; i < array.size(); i++) { + JsonObject obj = array.getJsonObject(i); - JMSSessionInfo info = new JMSSessionInfo(obj.getString("sessionID"), obj.getLong("creationTime")); + JMSSessionInfo info = new JMSSessionInfo(obj.getString("sessionID"), + obj.getJsonNumber("creationTime").longValue()); infos[i] = info; } return infos; http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/SubscriptionInfo.java ---------------------------------------------------------------------- diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/SubscriptionInfo.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/SubscriptionInfo.java index 66d04b6..1728d4f 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/SubscriptionInfo.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/SubscriptionInfo.java @@ -16,8 +16,11 @@ */ package org.apache.activemq.artemis.api.jms.management; -import org.apache.activemq.artemis.utils.json.JSONArray; -import org.apache.activemq.artemis.utils.json.JSONObject; + +import org.apache.activemq.artemis.api.core.JsonUtil; + +import javax.json.JsonArray; +import javax.json.JsonObject; /** * Helper class to create Java Objects from the @@ -46,11 +49,13 @@ public class SubscriptionInfo { * by {@link TopicControl#listAllSubscriptionsAsJSON()} and related methods. */ public static SubscriptionInfo[] from(final String jsonString) throws Exception { - JSONArray array = new JSONArray(jsonString); - SubscriptionInfo[] infos = new SubscriptionInfo[array.length()]; - for (int i = 0; i < array.length(); i++) { - JSONObject sub = array.getJSONObject(i); - SubscriptionInfo info = new SubscriptionInfo(sub.getString("queueName"), sub.optString("clientID", null), sub.optString("name", null), sub.getBoolean("durable"), sub.optString("selector", null), sub.getInt("messageCount"), sub.getInt("deliveringCount")); + JsonArray array = JsonUtil.readJsonArray(jsonString); + SubscriptionInfo[] infos = new SubscriptionInfo[array.size()]; + for (int i = 0; i < array.size(); i++) { + JsonObject sub = array.getJsonObject(i); + SubscriptionInfo info = new SubscriptionInfo(sub.getString("queueName"), sub.getString("clientID", null), + sub.getString("name", null), sub.getBoolean("durable"), sub.getString("selector", null), + sub.getInt("messageCount"), sub.getInt("deliveringCount")); infos[i] = info; } http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-jms-server/pom.xml ---------------------------------------------------------------------- diff --git a/artemis-jms-server/pom.xml b/artemis-jms-server/pom.xml index 0603955..3aa293c 100644 --- a/artemis-jms-server/pom.xml +++ b/artemis-jms-server/pom.xml @@ -71,6 +71,14 @@ <artifactId>geronimo-jta_1.1_spec</artifactId> <version>1.1.1</version> </dependency> + <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-json_1.0_spec</artifactId> + </dependency> + <dependency> + <groupId>org.apache.johnzon</groupId> + <artifactId>johnzon-core</artifactId> + </dependency> </dependencies> <profiles> http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d0ecf0f3/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/management/impl/JMSQueueControlImpl.java ---------------------------------------------------------------------- diff --git a/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/management/impl/JMSQueueControlImpl.java b/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/management/impl/JMSQueueControlImpl.java index f41b85e..0516182 100644 --- a/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/management/impl/JMSQueueControlImpl.java +++ b/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/management/impl/JMSQueueControlImpl.java @@ -17,6 +17,8 @@ package org.apache.activemq.artemis.jms.management.impl; import javax.jms.InvalidSelectorException; +import javax.json.Json; +import javax.json.JsonArrayBuilder; import javax.management.MBeanInfo; import javax.management.StandardMBean; import javax.management.openmbean.CompositeData; @@ -33,6 +35,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQInvalidFilterExpressionExcep import org.apache.activemq.artemis.api.core.FilterConstants; import org.apache.activemq.artemis.api.core.Message; import org.apache.activemq.artemis.api.core.SimpleString; +import org.apache.activemq.artemis.api.core.JsonUtil; import org.apache.activemq.artemis.api.core.management.MessageCounterInfo; import org.apache.activemq.artemis.api.core.management.Operation; import org.apache.activemq.artemis.api.core.management.QueueControl; @@ -47,8 +50,6 @@ import org.apache.activemq.artemis.jms.server.JMSServerManager; import org.apache.activemq.artemis.utils.Base64; import org.apache.activemq.artemis.utils.SelectorTranslator; import org.apache.activemq.artemis.utils.UUIDGenerator; -import org.apache.activemq.artemis.utils.json.JSONArray; -import org.apache.activemq.artemis.utils.json.JSONObject; public class JMSQueueControlImpl extends StandardMBean implements JMSQueueControl { @@ -74,11 +75,11 @@ public class JMSQueueControlImpl extends StandardMBean implements JMSQueueContro } static String toJSON(final Map<String, Object>[] messages) { - JSONArray array = new JSONArray(); + JsonArrayBuilder array = Json.createArrayBuilder(); for (Map<String, Object> message : messages) { - array.put(new JSONObject(message)); + array.add(JsonUtil.toJsonObject(message)); } - return array.toString(); + return array.build().toString(); } // Constructors --------------------------------------------------