Fixed a bug when resolving uuid conflicts in make changes, refactored some JSON-to-model code into static helper methods for future use

pull/14/head
Sam Bosley 12 years ago
parent 2e8639d252
commit f6e33e38dd

@ -46,6 +46,36 @@ public class MakeChanges<TYPE extends RemoteModel> extends ServerToClientMessage
this.dao = dao;
}
public static <T extends RemoteModel> T changesToModel(RemoteModelDao<T> dao, JSONObject changes, String table) throws IllegalAccessException, InstantiationException {
T model = dao.getModelClass().newInstance();
JSONChangeToPropertyVisitor visitor = new JSONChangeToPropertyVisitor(model, changes);
Iterator<String> keys = changes.keys();
while (keys.hasNext()) {
String column = keys.next();
Property<?> property = NameMaps.serverColumnNameToLocalProperty(table, column);
if (property != null) { // Unsupported property
property.accept(visitor, column);
}
}
return model;
}
public static <T extends RemoteModel> void saveOrUpdateModelAfterChanges(RemoteModelDao<T> dao, T model, String oldUuid, String uuid) {
Criterion uuidCriterion;
if (oldUuid == null)
uuidCriterion = RemoteModel.UUID_PROPERTY.eq(uuid);
else
uuidCriterion = RemoteModel.UUID_PROPERTY.eq(oldUuid);
if (model.getSetValues() != null && model.getSetValues().size() > 0) {
model.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true);
if (dao.update(uuidCriterion, model) <= 0) { // If update doesn't update rows. create a new model
model.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true);
dao.createNew(model);
}
}
}
@Override
public void processMessage() {
JSONObject changes = json.optJSONObject("changes");
@ -53,16 +83,7 @@ public class MakeChanges<TYPE extends RemoteModel> extends ServerToClientMessage
if (changes != null && !TextUtils.isEmpty(uuid)) {
if (dao != null) {
try {
TYPE model = dao.getModelClass().newInstance();
JSONChangeToPropertyVisitor visitor = new JSONChangeToPropertyVisitor(model, changes);
Iterator<String> keys = changes.keys();
while (keys.hasNext()) {
String column = keys.next();
Property<?> property = NameMaps.serverColumnNameToLocalProperty(table, column);
if (property != null) { // Unsupported property
property.accept(visitor, column);
}
}
TYPE model = changesToModel(dao, changes, table);
StringProperty uuidProperty = (StringProperty) NameMaps.serverColumnNameToLocalProperty(table, "uuid");
String oldUuid = null; // For indicating that a uuid collision has occurred
@ -76,13 +97,7 @@ public class MakeChanges<TYPE extends RemoteModel> extends ServerToClientMessage
if (model.getSetValues() != null && !model.getSetValues().containsKey(uuidProperty.name))
model.setValue(uuidProperty, uuid);
if (model.getSetValues() != null && model.getSetValues().size() > 0) {
model.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true);
if (dao.update(RemoteModel.UUID_PROPERTY.eq(uuid), model) <= 0) { // If update doesn't update rows. create a new model
model.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true);
dao.createNew(model);
}
}
saveOrUpdateModelAfterChanges(dao, model, oldUuid, uuid);
afterSaveChanges(changes, model, uuid, oldUuid);
} catch (IllegalAccessException e) {

Loading…
Cancel
Save