use of org.apache.pivot.collections.Map in project pivot by apache.
the class JSON method put.
/**
* Sets the value at the given path.
*
* @param <T> The type of value we're dealing with.
* @param root The root object.
* @param path The path to the desired location from the root.
* @param value The new value to set at the given path.
* @return The value previously associated with the path.
*/
@SuppressWarnings("unchecked")
public static <T> T put(Object root, String path, T value) {
Utils.checkNull(root, "root");
Sequence<String> keys = parse(path);
if (keys.getLength() == 0) {
throw new IllegalArgumentException("Path is empty.");
}
String key = keys.remove(keys.getLength() - 1, 1).get(0);
Object parent = get(root, keys);
if (parent == null) {
throw new IllegalArgumentException("Invalid path.");
}
Map<String, T> adapter = (Map<String, T>) (parent instanceof java.util.Map ? new MapAdapter<>((java.util.Map<String, T>) parent) : (parent instanceof Map ? ((Map<String, T>) parent) : new BeanAdapter(parent)));
Object previousValue;
if (adapter.containsKey(key)) {
previousValue = adapter.put(key, value);
} else if (parent instanceof Sequence<?>) {
Sequence<Object> sequence = (Sequence<Object>) parent;
previousValue = sequence.update(Integer.parseInt(key), value);
} else if (parent instanceof Dictionary<?, ?>) {
Dictionary<String, Object> dictionary = (Dictionary<String, Object>) parent;
previousValue = dictionary.put(key, value);
} else {
throw new IllegalArgumentException("Property \"" + key + "\" not found.");
}
return (T) previousValue;
}
use of org.apache.pivot.collections.Map in project pivot by apache.
the class JSON method containsKey.
/**
* Tests the existence of a path in a given object.
*
* @param <T> The type of value we're dealing with.
* @param root The root object.
* @param path The path to test (from the root).
* @return <tt>true</tt> if the path exists; <tt>false</tt>, otherwise.
*/
@SuppressWarnings("unchecked")
public static <T> boolean containsKey(Object root, String path) {
Utils.checkNull(root, "root");
Sequence<String> keys = parse(path);
if (keys.getLength() == 0) {
throw new IllegalArgumentException("Path is empty.");
}
String key = keys.remove(keys.getLength() - 1, 1).get(0);
Object parent = get(root, keys);
boolean containsKey;
if (parent == null) {
containsKey = false;
} else {
Map<String, T> adapter = (Map<String, T>) (parent instanceof java.util.Map ? new MapAdapter<>((java.util.Map<String, T>) parent) : (parent instanceof Map ? ((Map<String, T>) parent) : new BeanAdapter(parent)));
containsKey = adapter.containsKey(key);
if (!containsKey) {
if (parent instanceof Sequence<?>) {
Sequence<Object> sequence = (Sequence<Object>) parent;
containsKey = (sequence.getLength() > Integer.parseInt(key));
} else if (parent instanceof Dictionary<?, ?>) {
Dictionary<String, Object> dictionary = (Dictionary<String, Object>) parent;
containsKey = dictionary.containsKey(key);
} else {
throw new IllegalArgumentException("Property \"" + key + "\" not found.");
}
}
}
return containsKey;
}
use of org.apache.pivot.collections.Map in project pivot by apache.
the class JSONSerializer method writeObject.
/**
* Writes data to a JSON stream.
*
* @param object The object to serialize. Must be one of the following
* types: <ul> <li>pivot.collections.Map</li>
* <li>pivot.collections.List</li> <li>java.lang.String</li>
* <li>java.lang.Number</li> <li>java.lang.Boolean</li>
* <li><tt>null</tt></li> </ul>
* @param writer The writer to which data will be written.
* @throws IOException for any errors during the writing process.
* @throws SerializationException for any formatting errors in the data.
*/
@SuppressWarnings("unchecked")
public void writeObject(Object object, Writer writer) throws IOException, SerializationException {
Utils.checkNull(writer, "writer");
if (object == null) {
writer.append("null");
} else if (object instanceof String) {
String string = (String) object;
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0, n = string.length(); i < n; i++) {
char ci = string.charAt(i);
switch(ci) {
case '\t':
{
stringBuilder.append("\\t");
break;
}
case '\n':
{
stringBuilder.append("\\n");
break;
}
case '\r':
{
stringBuilder.append("\\r");
break;
}
case '\f':
{
stringBuilder.append("\\f");
break;
}
case '\b':
{
stringBuilder.append("\\b");
break;
}
case '\\':
case '\"':
case '\'':
{
stringBuilder.append("\\" + ci);
break;
}
default:
{
// and for other character sets if the value is an ASCII control character.
if ((charset.name().startsWith("UTF") && !Character.isISOControl(ci)) || (ci > 0x1F && ci != 0x7F && ci <= 0xFF)) {
stringBuilder.append(ci);
} else {
stringBuilder.append("\\u");
stringBuilder.append(String.format("%04x", (short) ci));
}
}
}
}
writer.append("\"" + stringBuilder.toString() + "\"");
} else if (object instanceof Number) {
Number number = (Number) object;
if (number instanceof Float) {
Float f = (Float) number;
if (f.isNaN() || f.isInfinite()) {
throw new SerializationException(number + " is not a valid value.");
}
} else if (number instanceof Double) {
Double d = (Double) number;
if (d.isNaN() || d.isInfinite()) {
throw new SerializationException(number + " is not a valid value.");
}
}
writer.append(number.toString());
} else if (object instanceof Boolean) {
writer.append(object.toString());
} else if (object instanceof List<?>) {
List<Object> list = (List<Object>) object;
writer.append("[");
int i = 0;
for (Object item : list) {
if (i > 0) {
writer.append(", ");
}
writeObject(item, writer);
i++;
}
writer.append("]");
} else {
Map<String, Object> map;
if (object instanceof Map<?, ?>) {
map = (Map<String, Object>) object;
} else if (object instanceof java.util.Map<?, ?>) {
map = new MapAdapter<>((java.util.Map<String, Object>) object);
} else {
map = new BeanAdapter(object, true);
}
writer.append("{");
int i = 0;
for (String key : map) {
Object value = map.get(key);
boolean identifier = true;
StringBuilder keyStringBuilder = new StringBuilder();
for (int j = 0, n = key.length(); j < n; j++) {
char cj = key.charAt(j);
identifier &= Character.isJavaIdentifierPart(cj);
if (cj == '"') {
keyStringBuilder.append('\\');
}
keyStringBuilder.append(cj);
}
key = keyStringBuilder.toString();
if (i > 0) {
writer.append(", ");
}
// Write the key
if (!identifier || alwaysDelimitMapKeys) {
writer.append('"');
}
writer.append(key);
if (!identifier || alwaysDelimitMapKeys) {
writer.append('"');
}
writer.append(": ");
// Write the value
writeObject(value, writer);
i++;
}
writer.append("}");
}
writer.flush();
}
use of org.apache.pivot.collections.Map in project pivot by apache.
the class PropertiesSerializerTest method readValues.
@Test
public // run writeValues before readValues, important
void readValues() throws IOException, SerializationException {
log("readValues()");
assertNotNull(testMap);
// prepare test data, but without using a static variable
byte[] testBytes = mapToPropertiesToBytes(testMap);
assertNotNull(testBytes);
Serializer<Map<?, ?>> serializer = new PropertiesSerializer();
log("serializer instance created: " + serializer);
ByteArrayInputStream inputStream = new ByteArrayInputStream(testBytes);
@SuppressWarnings("unchecked") Map<String, Object> readData = (Map<String, Object>) serializer.readObject(inputStream);
assertNotNull(readData);
log("Succesfully Read");
for (String key : readData) {
log(key + "=" + readData.get(key));
}
inputStream.close();
}
use of org.apache.pivot.collections.Map in project pivot by apache.
the class PropertiesSerializerTest method mapToPropertiesToBytes.
// utility method to transform the given Map to Properties,
// and then to byte array
protected byte[] mapToPropertiesToBytes(Map<String, Object> testMap2) throws IOException, SerializationException {
Serializer<Map<?, ?>> serializer = new PropertiesSerializer();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
serializer.writeObject(testMap2, outputStream);
outputStream.flush();
outputStream.close();
String result = outputStream.toString();
return result.getBytes();
}
Aggregations