com.rt.storage.api.client.json.GenericJson Maven / Gradle / Ivy
package com.rt.storage.api.client.json;
import com.rt.storage.api.client.util.GenericData;
import com.rt.storage.api.client.util.Key;
import com.rt.storage.api.client.util.Throwables;
import java.io.IOException;
import java.util.concurrent.ConcurrentMap;
/**
* Generic JSON data that stores all unknown key name/value pairs.
*
* Subclasses can declare fields for known data keys using the {@link Key} annotation. Each field
* can be of any visibility (private, package private, protected, or public) and must not be static.
* {@code null} unknown data key names are not allowed, but {@code null} data values are allowed.
*
*
Implementation is not thread-safe. For a thread-safe choice instead use an implementation of
* {@link ConcurrentMap}.
*
* @since 1.0
* @author Yaniv Inbar
*/
public class GenericJson extends GenericData implements Cloneable {
/** JSON factory or {@code null} for none. */
private JsonFactory jsonFactory;
/**
* Returns the JSON factory or {@code null} for none.
*
* @since 1.6
*/
public final JsonFactory getFactory() {
return jsonFactory;
}
/**
* Sets the JSON factory or {@code null} for none.
*
* @since 1.6
*/
public final void setFactory(JsonFactory factory) {
this.jsonFactory = factory;
}
@Override
public String toString() {
if (jsonFactory != null) {
try {
return jsonFactory.toString(this);
} catch (IOException e) {
throw Throwables.propagate(e);
}
}
return super.toString();
}
/**
* Returns a pretty-printed serialized JSON string representation or {@link #toString()} if {@link
* #getFactory()} is {@code null}.
*
* @since 1.6
*/
public String toPrettyString() throws IOException {
if (jsonFactory != null) {
return jsonFactory.toPrettyString(this);
}
return super.toString();
}
@Override
public GenericJson clone() {
return (GenericJson) super.clone();
}
@Override
public GenericJson set(String fieldName, Object value) {
return (GenericJson) super.set(fieldName, value);
}
}