![JAR search and dependency download from the Maven repository](/logo.png)
co.easimart.EasimartObjectCurrentCoder Maven / Gradle / Ivy
package co.easimart;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Date;
import java.util.Iterator;
/**
* Handles encoding/decoding EasimartObjects to/from /2 format JSON. /2 format json is only used for
* persisting current EasimartObject(currentInstallation, currentUser) to disk when LDS is not enabled.
*/
/** package */ class EasimartObjectCurrentCoder extends EasimartObjectCoder {
/*
/2 format JSON Keys
*/
private static final String KEY_OBJECT_ID = "objectId";
private static final String KEY_CLASS_NAME = "classname";
private static final String KEY_CREATED_AT = "createdAt";
private static final String KEY_UPDATED_AT = "updatedAt";
private static final String KEY_DATA = "data";
/*
Old serialized JSON keys
*/
private static final String KEY_OLD_OBJECT_ID = "id";
private static final String KEY_OLD_CREATED_AT = "created_at";
private static final String KEY_OLD_UPDATED_AT = "updated_at";
private static final String KEY_OLD_POINTERS = "pointers";
private static final EasimartObjectCurrentCoder INSTANCE =
new EasimartObjectCurrentCoder();
public static EasimartObjectCurrentCoder get() {
return INSTANCE;
}
/* package */ EasimartObjectCurrentCoder() {
// do nothing
}
/**
* Converts a {@code EasimartObject} to /2/ JSON representation suitable for saving to disk.
*
*
* {
* data: {
* // data fields, including objectId, createdAt, updatedAt
* },
* classname: class name for the object,
* operations: { } // operations per field
* }
*
*
* All keys are included, regardless of whether they are dirty.
*
* @see #decode(EasimartObject.State.Init, JSONObject, EasimartDecoder)
*/
@Override
public JSONObject encode(
T state, EasimartOperationSet operations, EasimartEncoder encoder) {
if (operations != null) {
throw new IllegalArgumentException("Parameter EasimartOperationSet is not null");
}
// Public data goes in dataJSON; special fields go in objectJSON.
JSONObject objectJSON = new JSONObject();
JSONObject dataJSON = new JSONObject();
try {
// Serialize the data
for (String key : state.keySet()) {
Object object = state.get(key);
dataJSON.put(key, encoder.encode(object));
// TODO(grantland): Use cached value from hashedObjects, but only if we're not dirty.
}
if (state.createdAt() > 0) {
dataJSON.put(KEY_CREATED_AT,
EasimartDateFormat.getInstance().format(new Date(state.createdAt())));
}
if (state.updatedAt() > 0) {
dataJSON.put(KEY_UPDATED_AT,
EasimartDateFormat.getInstance().format(new Date(state.updatedAt())));
}
if (state.objectId() != null) {
dataJSON.put(KEY_OBJECT_ID, state.objectId());
}
objectJSON.put(KEY_DATA, dataJSON);
objectJSON.put(KEY_CLASS_NAME, state.className());
} catch (JSONException e) {
throw new RuntimeException("could not serialize object to JSON");
}
return objectJSON;
}
/**
* Decodes from /2/ JSON.
*
* This is only used to read EasimartObjects stored on disk in JSON.
*
* @see #encode(EasimartObject.State, EasimartOperationSet, EasimartEncoder)
*/
@Override
public > T decode(
T builder, JSONObject json, EasimartDecoder decoder) {
try {
// The handlers for id, created_at, updated_at, and pointers are for
// backward compatibility with old serialized users.
if (json.has(KEY_OLD_OBJECT_ID)) {
String newObjectId = json.getString(KEY_OLD_OBJECT_ID);
builder.objectId(newObjectId);
}
if (json.has(KEY_OLD_CREATED_AT)) {
String createdAtString =
json.getString(KEY_OLD_CREATED_AT);
if (createdAtString != null) {
builder.createdAt(EasimartImpreciseDateFormat.getInstance().parse(createdAtString));
}
}
if (json.has(KEY_OLD_UPDATED_AT)) {
String updatedAtString =
json.getString(KEY_OLD_UPDATED_AT);
if (updatedAtString != null) {
builder.updatedAt(EasimartImpreciseDateFormat.getInstance().parse(updatedAtString));
}
}
if (json.has(KEY_OLD_POINTERS)) {
JSONObject newPointers =
json.getJSONObject(KEY_OLD_POINTERS);
Iterator> keys = newPointers.keys();
while (keys.hasNext()) {
String key = (String) keys.next();
JSONArray pointerArray = newPointers.getJSONArray(key);
builder.put(key, EasimartObject.createWithoutData(pointerArray.optString(0),
pointerArray.optString(1)));
}
}
JSONObject data = json.optJSONObject(KEY_DATA);
if (data != null) {
Iterator> keys = data.keys();
while (keys.hasNext()) {
String key = (String) keys.next();
if (key.equals(KEY_OBJECT_ID)) {
String newObjectId = data.getString(key);
builder.objectId(newObjectId);
continue;
}
if (key.equals(KEY_CREATED_AT)) {
builder.createdAt(EasimartDateFormat.getInstance().parse(data.getString(key)));
continue;
}
if (key.equals(KEY_UPDATED_AT)) {
builder.updatedAt(EasimartDateFormat.getInstance().parse(data.getString(key)));
continue;
}
Object value = data.get(key);
Object decodedObject = decoder.decode(value);
builder.put(key, decodedObject);
}
}
return builder;
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy