package com.hdweiss.morgand.synchronizer.writer;
import android.content.Context;
import android.util.Log;
import com.hdweiss.morgand.data.dao.OrgFile;
import com.hdweiss.morgand.data.dao.OrgNode;
import com.hdweiss.morgand.data.dao.OrgNodeRepository;
import com.hdweiss.morgand.events.SyncEvent;
import com.hdweiss.morgand.gui.SynchronizerNotification;
import com.hdweiss.morgand.settings.PreferenceUtils;
import com.hdweiss.morgand.synchronizer.git.SyncGitTask;
import com.hdweiss.morgand.utils.SafeAsyncTask;
import com.hdweiss.morgand.utils.Utils;
import java.util.List;
public class SyncWriterTask extends SafeAsyncTask<OrgFile, SyncEvent, Void> {
public SyncWriterTask(Context context) {
super(context, ReportMode.Log);
}
@Override
protected Void safeDoInBackground(OrgFile... files) throws Exception {
Log.d("Writer", "Started synchronization");
if (files.length > 0) {
for (OrgFile file : files)
writeChanges(file);
} else {
for(OrgFile file : OrgFile.getAllFiles())
writeChanges(file);
}
Log.d("Writer", "Ended synchronization");
return null;
}
private void writeChanges(OrgFile file) throws Exception {
OrgFileWriter writer = new OrgFileWriter(file);
List<OrgNode> dirtyNodes = OrgNodeRepository.getDirtyNodes(file);
if (dirtyNodes.isEmpty())
return;
Log.d("Writer", "Writing changes to " + file.path);
for(OrgNode node: dirtyNodes)
applyChanges(writer, node);
writer.write();
for(OrgNode node: dirtyNodes) {
node.state = OrgNode.State.Clean;
OrgNodeRepository.update(node);
}
}
private void applyChanges(OrgFileWriter writer, OrgNode node) {
if (node.isNodeWritable() == false) {
Log.d("Writer", "Node not writable " + node.getTitle());
return;
}
if (node.type == OrgNode.Type.File || node.type == OrgNode.Type.Directory)
return; // We don't handle deletion of files or directories
switch (node.state) {
case Added:
writer.add(node);
break;
case Deleted:
writer.delete(node);
break;
case Updated:
writer.overwrite(node);
break;
default:
break;
}
}
@Override
protected void onSuccess(Void aVoid) {
if (PreferenceUtils.syncMode().equals("git"))
new SyncGitTask(context).execute();
}
@Override
protected void onError() {
SynchronizerNotification notification = new SynchronizerNotification(context);
notification.errorNotification(exception.getMessage() + "\n" + Utils.ExceptionTraceToString(exception));
}
}