// Handle autosynchronization between local and server journal
|
|
define(["settings","sugar-web/datastore"], function(preferences, datastore) {
|
|
var autosync = {};
|
|
|
|
// Load local journal
|
|
function loadJournal() {
|
|
var journal = datastore.find();
|
|
return journal
|
|
}
|
|
|
|
// Update action count
|
|
function nextAction(session) {
|
|
session.actionCount = session.actionCount - 1;
|
|
if (session.actionCount == 0) {
|
|
if (session.callback) {
|
|
console.log("Synchronized "+session.localCount+"D, "+session.remoteCount+"U");
|
|
session.callback(session.localCount, session.remoteCount, session.error);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Update/Create local entry with an existing remote entry
|
|
function updateLocalWith(entry, session) {
|
|
var objectId = entry.objectId;
|
|
myserver.getJournalEntry(preferences.getPrivateJournal(), objectId,
|
|
function(inSender, inResponse) {
|
|
var ds = new datastore.DatastoreObject(objectId);
|
|
ds.setMetadata(inResponse.entries[0].metadata);
|
|
ds.setDataAsText(inResponse.entries[0].text);
|
|
ds.save(null, true);
|
|
nextAction(session);
|
|
},
|
|
function(inResponse, error) {
|
|
datastore.remove(objectId);
|
|
console.log("WARNING: Error "+error+" loading entry "+objectId+" in remote journal to sync local");
|
|
session.error++;
|
|
nextAction(session);
|
|
}
|
|
);
|
|
}
|
|
|
|
// Update/Create remote entry with an existing local entry
|
|
function updateRemoteWith(entry, session) {
|
|
var newentry = new datastore.DatastoreObject(entry.objectId);
|
|
newentry.loadAsText(function(err, metadata, text) {
|
|
var dataentry = {metadata: metadata, text: text, objectId: newentry.objectId};
|
|
myserver.putJournalEntry(preferences.getPrivateJournal(), newentry.objectId, dataentry,
|
|
function() {
|
|
nextAction(session);
|
|
},
|
|
function(inResponse, error) {
|
|
console.log("WARNING: Error "+error+" writing "+newentry.objectId+" to sync remote journal ");
|
|
session.error++;
|
|
nextAction(session);
|
|
}
|
|
);
|
|
});
|
|
}
|
|
|
|
// Function process sync processSyncActions
|
|
function processSyncActions(updateToLocal, updateToRemote, callback) {
|
|
var session = {
|
|
callback: callback,
|
|
actionCount: updateToLocal.length + updateToRemote.length,
|
|
localCount: updateToLocal.length,
|
|
remoteCount: updateToRemote.length,
|
|
error: 0
|
|
};
|
|
|
|
// Update local entries from remote
|
|
for (var i = 0 ; i < updateToLocal.length ; i++) {
|
|
var entry = updateToLocal[i];
|
|
updateLocalWith(entry, session);
|
|
}
|
|
|
|
// Update remote entries from local
|
|
for (var i = 0 ; i < updateToRemote.length ; i++) {
|
|
var entry = updateToRemote[i];
|
|
updateRemoteWith(entry, session);
|
|
}
|
|
}
|
|
|
|
// Synchronize local and remote journal entries
|
|
function syncEntries(localJournal, remoteJournal, startCallback, endCallback) {
|
|
// Look for local not in remote
|
|
var updateToLocal = [];
|
|
var updateToRemote = [];
|
|
for (var i = 0 ; i < localJournal.length ; i++) {
|
|
var localEntry = localJournal[i];
|
|
var found = false;
|
|
for (var j = 0 ; j < remoteJournal.length ; j++) {
|
|
var remoteEntry = remoteJournal[j];
|
|
if (localEntry.objectId == remoteEntry.objectId) {
|
|
found = true;
|
|
remoteEntry.seen = true;
|
|
if (localEntry.metadata.timestamp == remoteEntry.metadata.timestamp) {
|
|
;
|
|
} else if (localEntry.metadata.timestamp > remoteEntry.metadata.timestamp) {
|
|
updateToRemote.push(localEntry);
|
|
} else {
|
|
updateToLocal.push(remoteEntry);
|
|
}
|
|
}
|
|
}
|
|
if (!found) {
|
|
updateToRemote.push(localEntry);
|
|
}
|
|
}
|
|
// Look for remote not in local
|
|
for (var i = 0 ; i < remoteJournal.length ; i++) {
|
|
var remoteEntry = remoteJournal[i];
|
|
if (!remoteEntry.seen) {
|
|
updateToLocal.push(remoteEntry);
|
|
}
|
|
}
|
|
|
|
// Signalize start callback
|
|
if (startCallback) {
|
|
startCallback(updateToLocal.length+updateToRemote.length);
|
|
}
|
|
|
|
// Process actions
|
|
processSyncActions(updateToLocal, updateToRemote, endCallback);
|
|
}
|
|
|
|
// Launch journal synchronization
|
|
autosync.synchronizeJournal = function(startCallback, endCallback) {
|
|
// User don't want to synchronize
|
|
if (!preferences.getOptions("sync")) {
|
|
return;
|
|
}
|
|
|
|
// Load local journal
|
|
var localJournal = loadJournal();
|
|
|
|
// Load remote journal
|
|
var that = this;
|
|
var request = {
|
|
field: constant.fieldMetadata,
|
|
limit: constant.syncJournalLimit
|
|
}
|
|
myserver.getJournal(preferences.getPrivateJournal(), request,
|
|
function(inSender, inResponse) {
|
|
var remoteJournal = inResponse.entries;
|
|
syncEntries(localJournal, remoteJournal, startCallback, endCallback);
|
|
},
|
|
function() {
|
|
console.log("WARNING: Error syncing remote journal ");
|
|
}
|
|
);
|
|
};
|
|
|
|
return autosync;
|
|
});
|