Bug 709403 - Part 1: refactor envelope/payload logic in Record. r=nalexander

This commit is contained in:
Richard Newman 2012-03-02 17:36:16 -08:00
parent 44438d865b
commit 9c7d1e80cd
8 changed files with 99 additions and 99 deletions

View File

@ -236,12 +236,22 @@ public class CryptoRecord extends Record {
}
@Override
public void initFromPayload(CryptoRecord payload) {
public void initFromEnvelope(CryptoRecord payload) {
throw new IllegalStateException("Can't do this with a CryptoRecord.");
}
@Override
public CryptoRecord getPayload() {
public CryptoRecord getEnvelope() {
throw new IllegalStateException("Can't do this with a CryptoRecord.");
}
@Override
protected void populatePayload(ExtendedJSONObject payload) {
throw new IllegalStateException("Can't do this with a CryptoRecord.");
}
@Override
protected void initFromPayload(ExtendedJSONObject payload) {
throw new IllegalStateException("Can't do this with a CryptoRecord.");
}

View File

@ -216,7 +216,7 @@ public class Crypto5MiddlewareRepositorySession extends RepositorySession {
if (delegate == null) {
throw new NoStoreDelegateException();
}
CryptoRecord rec = record.getPayload();
CryptoRecord rec = record.getEnvelope();
rec.keyBundle = this.keyBundle;
try {
rec.encrypt();

View File

@ -39,7 +39,6 @@
package org.mozilla.gecko.sync.repositories.domain;
import org.json.simple.JSONArray;
import org.mozilla.gecko.sync.CryptoRecord;
import org.mozilla.gecko.sync.ExtendedJSONObject;
import org.mozilla.gecko.sync.Logger;
import org.mozilla.gecko.sync.NonArrayJSONException;
@ -143,33 +142,19 @@ public class BookmarkRecord extends Record {
}
@Override
public void initFromPayload(CryptoRecord payload) {
ExtendedJSONObject p = payload.payload;
// All.
this.guid = payload.guid;
checkGUIDs(p);
final Object del = p.get("deleted");
if (del instanceof Boolean) {
this.deleted = (Boolean) del;
}
this.collection = payload.collection;
this.lastModified = payload.lastModified;
this.type = (String) p.get("type");
this.title = (String) p.get("title");
this.description = (String) p.get("description");
this.parentID = (String) p.get("parentid");
this.parentName = (String) p.get("parentName");
protected void initFromPayload(ExtendedJSONObject payload) {
this.type = (String) payload.get("type");
this.title = (String) payload.get("title");
this.description = (String) payload.get("description");
this.parentID = (String) payload.get("parentid");
this.parentName = (String) payload.get("parentName");
// Bookmark.
if (isBookmark()) {
this.bookmarkURI = (String) p.get("bmkUri");
this.keyword = (String) p.get("keyword");
this.bookmarkURI = (String) payload.get("bmkUri");
this.keyword = (String) payload.get("keyword");
try {
this.tags = p.getArray("tags");
this.tags = payload.getArray("tags");
} catch (NonArrayJSONException e) {
Log.e(LOG_TAG, "Got non-array tags in bookmark record " + this.guid, e);
this.tags = new JSONArray();
@ -179,7 +164,7 @@ public class BookmarkRecord extends Record {
// Folder.
if (isFolder()) {
try {
this.children = p.getArray("children");
this.children = payload.getArray("children");
} catch (NonArrayJSONException e) {
Log.e(LOG_TAG, "Got non-array children in bookmark record " + this.guid, e);
// Let's see if we can recover later by using the parentid pointers.
@ -200,6 +185,23 @@ public class BookmarkRecord extends Record {
*/
}
@Override
protected void populatePayload(ExtendedJSONObject payload) {
putPayload(payload, "type", this.type);
putPayload(payload, "title", this.title);
putPayload(payload, "description", this.description);
putPayload(payload, "parentid", this.parentID);
putPayload(payload, "parentName", this.parentName);
if (isBookmark()) {
payload.put("bmkUri", bookmarkURI);
payload.put("keyword", keyword);
payload.put("tags", this.tags);
} else if (isFolder()) {
payload.put("children", this.children);
}
}
public boolean isBookmark() {
return AndroidBrowserBookmarksDataAccessor.TYPE_BOOKMARK.equalsIgnoreCase(this.type);
}
@ -208,32 +210,6 @@ public class BookmarkRecord extends Record {
return AndroidBrowserBookmarksDataAccessor.TYPE_FOLDER.equalsIgnoreCase(this.type);
}
@Override
public CryptoRecord getPayload() {
CryptoRecord rec = new CryptoRecord(this);
rec.payload = new ExtendedJSONObject();
rec.payload.put("id", this.guid);
if (this.deleted) {
rec.payload.put("deleted", true);
} else {
putPayload(rec, "type", this.type);
putPayload(rec, "title", this.title);
putPayload(rec, "description", this.description);
putPayload(rec, "parentid", this.parentID);
putPayload(rec, "parentName", this.parentName);
if (isBookmark()) {
rec.payload.put("bmkUri", bookmarkURI);
rec.payload.put("keyword", keyword);
rec.payload.put("tags", this.tags);
} else if (isFolder()) {
rec.payload.put("children", this.children);
}
}
return rec;
}
private void trace(String s) {
Logger.trace(LOG_TAG, s);
}

View File

@ -51,7 +51,7 @@ public class BookmarkRecordFactory extends RecordFactory {
@Override
public Record createRecord(Record record) {
BookmarkRecord r = new BookmarkRecord();
r.initFromPayload((CryptoRecord) record);
r.initFromEnvelope((CryptoRecord) record);
return r;
}

View File

@ -41,7 +41,6 @@ import java.util.HashMap;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.mozilla.gecko.sync.CryptoRecord;
import org.mozilla.gecko.sync.ExtendedJSONObject;
import org.mozilla.gecko.sync.Logger;
import org.mozilla.gecko.sync.NonArrayJSONException;
@ -109,46 +108,25 @@ public class HistoryRecord extends Record {
}
@Override
public void initFromPayload(CryptoRecord payload) {
ExtendedJSONObject p = payload.payload;
protected void populatePayload(ExtendedJSONObject payload) {
putPayload(payload, "id", this.guid);
putPayload(payload, "title", this.title);
putPayload(payload, "histUri", this.histURI); // TODO: encoding?
payload.put("visits", this.visits);
}
this.guid = payload.guid;
this.checkGUIDs(p);
this.lastModified = payload.lastModified;
final Object del = p.get("deleted");
if (del instanceof Boolean) {
this.deleted = (Boolean) del;
}
this.histURI = (String) p.get("histUri");
this.title = (String) p.get("title");
@Override
protected void initFromPayload(ExtendedJSONObject payload) {
this.histURI = (String) payload.get("histUri");
this.title = (String) payload.get("title");
try {
this.visits = p.getArray("visits");
this.visits = payload.getArray("visits");
} catch (NonArrayJSONException e) {
Logger.error(LOG_TAG, "Got non-array visits in history record " + this.guid, e);
this.visits = new JSONArray();
}
}
@Override
public CryptoRecord getPayload() {
CryptoRecord rec = new CryptoRecord(this);
rec.payload = new ExtendedJSONObject();
Logger.debug(LOG_TAG, "Getting payload for history record " + this.guid + " (" + this.guid.length() + ").");
if (this.deleted) {
rec.payload.put("deleted", true);
} else {
putPayload(rec, "id", this.guid);
putPayload(rec, "title", this.title);
putPayload(rec, "histUri", this.histURI); // TODO: encoding?
rec.payload.put("visits", this.visits);
}
return rec;
}
/**
* We consider two history records to be congruent if they represent the
* same history record regardless of visits.

View File

@ -51,7 +51,7 @@ public class HistoryRecordFactory extends RecordFactory {
@Override
public Record createRecord(Record record) {
HistoryRecord r = new HistoryRecord();
r.initFromPayload((CryptoRecord) record);
r.initFromEnvelope((CryptoRecord) record);
return r;
}

View File

@ -37,7 +37,7 @@
package org.mozilla.gecko.sync.repositories.domain;
import org.mozilla.gecko.sync.CryptoRecord;
import org.mozilla.gecko.sync.ExtendedJSONObject;
import org.mozilla.gecko.sync.Utils;
import org.mozilla.gecko.sync.repositories.android.RepoUtils;
@ -98,15 +98,13 @@ public class PasswordRecord extends Record {
}
@Override
public void initFromPayload(CryptoRecord payload) {
// TODO Auto-generated method stub
public void initFromPayload(ExtendedJSONObject payload) {
// TODO: implement.
}
@Override
public CryptoRecord getPayload() {
// TODO Auto-generated method stub
// TODO: don't forget to set "id" to our GUID.
return null;
public void populatePayload(ExtendedJSONObject payload) {
// TODO: implement.
}
@Override

View File

@ -224,8 +224,39 @@ public abstract class Record {
return ((Record) o).lastModified == this.lastModified;
}
public abstract void initFromPayload(CryptoRecord payload);
public abstract CryptoRecord getPayload();
protected abstract void populatePayload(ExtendedJSONObject payload);
protected abstract void initFromPayload(ExtendedJSONObject payload);
public void initFromEnvelope(CryptoRecord envelope) {
ExtendedJSONObject p = envelope.payload;
this.guid = envelope.guid;
checkGUIDs(p);
this.collection = envelope.collection;
this.lastModified = envelope.lastModified;
final Object del = p.get("deleted");
if (del instanceof Boolean) {
this.deleted = (Boolean) del;
} else {
this.initFromPayload(p);
}
}
public CryptoRecord getEnvelope() {
CryptoRecord rec = new CryptoRecord(this);
ExtendedJSONObject payload = new ExtendedJSONObject();
payload.put("id", this.guid);
if (this.deleted) {
payload.put("deleted", true);
} else {
populatePayload(payload);
}
rec.payload = payload;
return rec;
}
public String toJSONString() {
throw new RuntimeException("Cannot JSONify non-CryptoRecord Records.");
@ -254,6 +285,13 @@ public abstract class Record {
rec.payload.put(key, value);
}
protected void putPayload(ExtendedJSONObject payload, String key, String value) {
if (value == null) {
return;
}
payload.put(key, value);
}
protected void checkGUIDs(ExtendedJSONObject payload) {
String payloadGUID = (String) payload.get("id");
if (this.guid == null ||