X-Git-Url: http://git.sourceforge.jp/view?p=neighbornote%2FNeighborNote.git;a=blobdiff_plain;f=src%2Fcx%2Ffbn%2Fnevernote%2Fthreads%2FSyncRunner.java;h=1fcc42ae6bc9b63badc78d2e23d9dda745114b21;hp=29a2afbce16611e334c0e9b02c3d04d7f1611f9e;hb=ace5c30f5af3febc965296bff2ac83a4d5a0ad74;hpb=7c04d7784898cfec0165b3d1d02575854f878650 diff --git a/src/cx/fbn/nevernote/threads/SyncRunner.java b/src/cx/fbn/nevernote/threads/SyncRunner.java index 29a2afb..1fcc42a 100644 --- a/src/cx/fbn/nevernote/threads/SyncRunner.java +++ b/src/cx/fbn/nevernote/threads/SyncRunner.java @@ -30,6 +30,7 @@ import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; +import java.util.TreeSet; import java.util.Vector; import java.util.concurrent.LinkedBlockingQueue; @@ -120,6 +121,7 @@ public class SyncRunner extends QObject implements Runnable { private THttpClient userStoreTrans; private TBinaryProtocol userStoreProt; private AuthenticationResult authResult; + private AuthenticationResult linkedAuthResult; private User user; private long authTimeRemaining; public long authRefreshTime; @@ -131,12 +133,14 @@ public class SyncRunner extends QObject implements Runnable { public int updateSequenceNumber; private boolean refreshNeeded; private volatile LinkedBlockingQueue workQueue; -// private static int MAX_EMPTY_QUEUE_COUNT = 1; private static int MAX_QUEUED_WAITING = 1000; String dbuid; String dburl; String dbpswd; String dbcpswd; + private final TreeSet ignoreTags; + private final TreeSet ignoreNotebooks; + private final TreeSet ignoreLinkedNotebooks; @@ -167,6 +171,10 @@ public class SyncRunner extends QObject implements Runnable { userStore = null; authToken = null; disableUploads = false; + ignoreTags = new TreeSet(); + ignoreNotebooks = new TreeSet(); + ignoreLinkedNotebooks = new TreeSet(); + // setAutoDelete(false); workQueue=new LinkedBlockingQueue(MAX_QUEUED_WAITING); } @@ -182,7 +190,7 @@ public class SyncRunner extends QObject implements Runnable { return; idle=false; error=false; - if (authRefreshNeeded == true) { + if (authRefreshNeeded == true || !isConnected) { logger.log(logger.EXTREME, "Refreshing connection"); refreshConnection(); } @@ -203,6 +211,10 @@ public class SyncRunner extends QObject implements Runnable { idle=true; logger.log(logger.EXTREME, "Signaling refresh finished. refreshNeeded=" +refreshNeeded); syncSignal.finished.emit(refreshNeeded); + if (error) { + syncSignal.errorDisconnect.emit(); + status.message.emit(tr("Error synchronizing - see log for details.")); + } } } catch (InterruptedException e1) { @@ -251,7 +263,24 @@ public class SyncRunner extends QObject implements Runnable { @SuppressWarnings("unused") private void evernoteSync() throws java.net.UnknownHostException { logger.log(logger.HIGH, "Entering SyncRunner.evernoteSync"); + + // Rebuild list of tags & notebooks to ignore + ignoreNotebooks.clear(); + List ignore = conn.getSyncTable().getIgnoreRecords("NOTEBOOK"); + for (int i=0; i guids = conn.getNoteTable().noteResourceTable.findInkNotes(); for (int i=0; i notes = conn.getNoteTable().expungeIgnoreSynchronizedNotes(conn.getSyncTable().getIgnoreRecords("NOTEBOOK"), + conn.getSyncTable().getIgnoreRecords("TAG"), conn.getSyncTable().getIgnoreRecords("LINKEDNOTEBOOK")); + if (notes.size() > 0) + syncSignal.refreshLists.emit(); + + //***************************************** + //* End of synchronization + //***************************************** if (refreshNeeded) syncSignal.refreshLists.emit(); @@ -409,7 +458,8 @@ public class SyncRunner extends QObject implements Runnable { for (int i=0; i notes = conn.getNoteTable().getDirty(); // Sync the local notebooks with Evernote's for (int i=0; i 0) { - enNote = getNoteContent(enNote); - logger.log(logger.MEDIUM, "Updating note : "+ enNote.getGuid() +" " +enNote.getTitle()+""); - enNote = noteStore.updateNote(authToken, enNote); - } else { - logger.log(logger.EXTREME, "Active dirty found - new note"); - logger.log(logger.MEDIUM, "Creating note : "+ enNote.getGuid() +" " +enNote.getTitle()+""); - String oldGuid = enNote.getGuid(); - enNote = getNoteContent(enNote); - enNote = noteStore.createNote(authToken, enNote); - noteSignal.guidChanged.emit(oldGuid, enNote.getGuid()); - conn.getNoteTable().updateNoteGuid(oldGuid, enNote.getGuid()); - } - updateSequenceNumber = enNote.getUpdateSequenceNum(); - logger.log(logger.EXTREME, "Saving note"); - conn.getNoteTable().updateNoteSequence(enNote.getGuid(), enNote.getUpdateSequenceNum()); - List rl = enNote.getResources(); - logger.log(logger.EXTREME, "Getting note resources"); - for (int j=0; j 0) { + enNote = getNoteContent(enNote); + logger.log(logger.MEDIUM, "Updating note : "+ enNote.getGuid() +" " +enNote.getTitle()+""); + enNote = noteStore.updateNote(token, enNote); + } else { + logger.log(logger.EXTREME, "Active dirty found - new note"); + logger.log(logger.MEDIUM, "Creating note : "+ enNote.getGuid() +" " +enNote.getTitle()+""); + String oldGuid = enNote.getGuid(); + enNote = getNoteContent(enNote); + enNote = noteStore.createNote(token, enNote); + noteSignal.guidChanged.emit(oldGuid, enNote.getGuid()); + conn.getNoteTable().updateNoteGuid(oldGuid, enNote.getGuid()); + } + updateSequenceNumber = enNote.getUpdateSequenceNum(); + logger.log(logger.EXTREME, "Saving note"); + conn.getNoteTable().updateNoteSequence(enNote.getGuid(), enNote.getUpdateSequenceNum()); + List rl = enNote.getResources(); + logger.log(logger.EXTREME, "Getting note resources"); + for (int j=0; j 0) { @@ -775,7 +837,43 @@ public class SyncRunner extends QObject implements Runnable { } logger.log(logger.HIGH, "Leaving SyncRunner.syncLocalTags"); } - // Sync Tags with Evernote + private void syncLocalLinkedNotebooks() { + logger.log(logger.HIGH, "Entering SyncRunner.syncLocalLinkedNotebooks"); + + List list = conn.getLinkedNotebookTable().getDirtyGuids(); + for (int i=0; i remoteList = new ArrayList(); @@ -808,7 +906,8 @@ public class SyncRunner extends QObject implements Runnable { for (int i=0; i guid = chunk.getExpungedNotes(); - if (guid != null) { - for (int i=0; i guid = chunk.getExpungedNotes(); + if (guid != null) { + for (int i=0; i tags) { logger.log(logger.EXTREME, "Entering SyncRunner.syncRemoteTags"); @@ -1019,13 +1123,13 @@ public class SyncRunner extends QObject implements Runnable { } // Sync remote linked notebooks private void syncRemoteLinkedNotebooks(List books) { - logger.log(logger.EXTREME, "Entering SyncRunner.syncSavedSearches"); + logger.log(logger.EXTREME, "Entering SyncRunner.syncLinkedNotebooks"); if (books != null) { for (int i=0; i notebooks) { @@ -1037,99 +1141,132 @@ public class SyncRunner extends QObject implements Runnable { if (oldGuid != null && !conn.getNotebookTable().isNotebookLocal(oldGuid) && !notebooks.get(i).getGuid().equalsIgnoreCase(oldGuid)) conn.getNotebookTable().updateNotebookGuid(oldGuid, notebooks.get(i).getGuid()); conn.getNotebookTable().syncNotebook(notebooks.get(i), false); + + // Synchronize shared notebook information +// if (notebooks.get(i).getSharedNotebookIdsSize() > 0) { +// conn.getSharedNotebookTable().expungeNotebookByGuid(notebooks.get(i).getGuid(), false); +// for (int j=0; j books = noteStore.getSharedNotebookByAuth(authToken); +// } // Sync remote Resources private void syncRemoteResources(List resource) { + logger.log(logger.EXTREME, "Entering SyncRunner.syncRemoteResources"); + if (resource != null) { + for (int i=0; i note, boolean fullSync) { + // Sync remote notes + private void syncRemoteNotes(List note, boolean fullSync, String token) { logger.log(logger.EXTREME, "Entering SyncRunner.syncRemoteNotes"); if (note != null) { for (int i=0; i=5) { logger.log(logger.EXTREME, "Refresh attempts have failed. Disconnecting."); isConnected = false; - return; + status.message.emit(tr("Unable to synchronize - Authentication failed")); + return false; } // If this is the first time through, then we need to set this @@ -1430,31 +1567,33 @@ public class SyncRunner extends QObject implements Runnable { if (userStore != null && authToken != null) newAuth = userStore.refreshAuthentication(authToken); else - return; + return false; logger.log(logger.EXTREME, "UserStore.refreshAuthentication has succeeded."); } catch (EDAMUserException e) { e.printStackTrace(); syncSignal.authRefreshComplete.emit(false); failedRefreshes++; - return; + return false; } catch (EDAMSystemException e) { e.printStackTrace(); syncSignal.authRefreshComplete.emit(false); failedRefreshes++; - return; + return false; } catch (TException e) { e.printStackTrace(); syncSignal.authRefreshComplete.emit(false); failedRefreshes++; - return; + return false; } // If we didn't get a good auth, then we've failed if (newAuth == null) { failedRefreshes++; + status.message.emit(tr("Unable to synchronize - Authentication failed")); logger.log(logger.EXTREME, "Authentication failure #" +failedRefreshes); + status.message.emit(tr("Unable to synchronize - Authentication failed")); syncSignal.authRefreshComplete.emit(false); - return; + return false; } // We got a good token. Now we need to setup the time to renew it. @@ -1472,6 +1611,8 @@ public class SyncRunner extends QObject implements Runnable { // failedRefreshes++; // syncSignal.authRefreshComplete.emit(false); // } + + return true; } public synchronized boolean addWork(String request) { @@ -1575,7 +1716,7 @@ public class SyncRunner extends QObject implements Runnable { } - private void downloadInkNoteImage(String guid) { + private void downloadInkNoteImage(String guid, String authToken) { String urlBase = noteStoreUrl.replace("/edam/note/", "/shard/") + "/res/"+guid+".ink?slice="; // urlBase = "https://www.evernote.com/shard/s1/res/52b567a9-54ae-4a08-afc5-d5bae275b2a8.ink?slice="; Integer slice = 1; @@ -1641,4 +1782,180 @@ public class SyncRunner extends QObject implements Runnable { return data; } + + //****************************************** + //* Begin syncing shared notebooks + //****************************************** + private void syncLinkedNotebooks() { + logger.log(logger.MEDIUM, "Authenticating Shared Notebooks"); + status.message.emit(tr("Synchronizing shared notebooks.")); + List books = conn.getLinkedNotebookTable().getAll(); + for (int i=0; i lastSequenceNumber) { + if (lastSyncDate < linkedSyncState.getFullSyncBefore()) { + lastSequenceNumber = 0; + } + syncLinkedNotebook(books.get(i), lastSequenceNumber, linkedSyncState.getUpdateCount()); + } + + // Synchronize local changes + syncLocalLinkedNoteChanges(books.get(i)); + + } catch (EDAMUserException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (EDAMNotFoundException e) { + status.message.emit(tr("Error synchronizing \" " + + books.get(i).getShareName()+"\". Please verify you still have access to that shared notebook.")); + error = true; + e.printStackTrace(); + } catch (EDAMSystemException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (TException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + // Cleanup tags + conn.getTagTable().removeUnusedLinkedTags(); + conn.getTagTable().cleanupTags(); + tagSignal.listChanged.emit(); + } + + + //************************************************************** + //* Linked notebook contents (from someone else's account) + //************************************************************* + private void syncLinkedNotebook(LinkedNotebook book, int usn, int highSequence) { + boolean fullSync = false; + if (usn == 0) + fullSync = true; + while (usn < highSequence) { + try { + SyncChunk chunk = + noteStore.getLinkedNotebookSyncChunk(authToken, book, usn, 10, fullSync); + + if (!ignoreLinkedNotebooks.contains(book.getGuid())) + syncRemoteNotes(chunk.getNotes(), fullSync, linkedAuthResult.getAuthenticationToken()); + findNewLinkedTags(chunk.getNotes(), linkedAuthResult.getAuthenticationToken()); + for (int i=0; i tags, String notebookGuid) { + logger.log(logger.EXTREME, "Entering SyncRunner.syncRemoteTags"); + if (tags != null) { + for (int i=0; i notebooks, boolean readOnly, LinkedNotebook linked) { + logger.log(logger.EXTREME, "Entering SyncRunner.syncRemoteNotebooks"); + if (notebooks != null) { + for (int i=0; i newNotes, String token) { + if (newNotes == null) + return; + for (int i=0; i notes = conn.getNoteTable().getDirtyLinked(notebookGuid); + for (int i=0; i