OSDN Git Service

Added logic to download all linked & shared data structures.
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / threads / SyncRunner.java
index 5ed5137..2581725 100644 (file)
@@ -39,10 +39,12 @@ import com.evernote.edam.notestore.NoteStore;
 import com.evernote.edam.notestore.SyncChunk;\r
 import com.evernote.edam.notestore.SyncState;\r
 import com.evernote.edam.type.Data;\r
+import com.evernote.edam.type.LinkedNotebook;\r
 import com.evernote.edam.type.Note;\r
 import com.evernote.edam.type.Notebook;\r
 import com.evernote.edam.type.Resource;\r
 import com.evernote.edam.type.SavedSearch;\r
+import com.evernote.edam.type.SharedNotebook;\r
 import com.evernote.edam.type.Tag;\r
 import com.evernote.edam.type.User;\r
 import com.evernote.edam.userstore.AuthenticationResult;\r
@@ -67,7 +69,7 @@ public class SyncRunner extends QObject implements Runnable {
        private final ApplicationLogger logger;\r
                private DatabaseConnection              conn;\r
                private boolean                                 idle;\r
-               private boolean                                 error;\r
+               public boolean                                  error;\r
                public volatile boolean                 isConnected;\r
                public volatile boolean                 keepRunning;\r
                public volatile String                  authToken;\r
@@ -234,7 +236,7 @@ public class SyncRunner extends QObject implements Runnable {
                if (isConnected && keepRunning) {\r
                        error = false;\r
                        logger.log(logger.EXTREME, "Synchronizing with Evernote");\r
-                       status.message.emit("Synchronizing with Evernote");\r
+                       status.message.emit(tr("Synchronizing with Evernote"));\r
                        \r
                        // Get user information\r
                        try {\r
@@ -244,20 +246,20 @@ public class SyncRunner extends QObject implements Runnable {
                                syncSignal.saveUserInformation.emit(user);\r
                        } catch (EDAMUserException e1) {\r
                                e1.printStackTrace();\r
-                               status.message.emit("User exception getting user account information.  Aborting sync and disconnecting");\r
+                               status.message.emit(tr("User exception getting user account information.  Aborting sync and disconnecting"));\r
                                syncSignal.errorDisconnect.emit();\r
                                enDisconnect();\r
                                return;\r
                        } catch (EDAMSystemException e1) {\r
                                e1.printStackTrace();\r
-                               status.message.emit("System error user account information.  Aborting sync and disconnecting!");\r
+                               status.message.emit(tr("System error user account information.  Aborting sync and disconnecting!"));\r
                                syncSignal.errorDisconnect.emit();\r
                                enDisconnect();\r
                                return;\r
                        } catch (TException e1) {\r
                                e1.printStackTrace();\r
                                syncSignal.errorDisconnect.emit();\r
-                               status.message.emit("Transaction error getting user account information.  Aborting sync and disconnecting!");\r
+                               status.message.emit(tr("Transaction error getting user account information.  Aborting sync and disconnecting!"));\r
                                enDisconnect();\r
                                return;\r
                        }\r
@@ -272,19 +274,19 @@ public class SyncRunner extends QObject implements Runnable {
                                evernoteUpdateCount = syncState.getUpdateCount();\r
                        } catch (EDAMUserException e) {\r
                                e.printStackTrace();\r
-                               status.message.emit("Error getting sync state! Aborting sync and disconnecting!");\r
+                               status.message.emit(tr("Error getting sync state! Aborting sync and disconnecting!"));\r
                                syncSignal.errorDisconnect.emit();\r
                                enDisconnect();\r
                                return;\r
                        } catch (EDAMSystemException e) {\r
                                e.printStackTrace();\r
-                               status.message.emit("Error getting sync state! Aborting sync and disconnecting!");\r
+                               status.message.emit(tr("Error getting sync state! Aborting sync and disconnecting!"));\r
                                syncSignal.errorDisconnect.emit();\r
                                enDisconnect();\r
                                return;\r
                        } catch (TException e) {\r
                                e.printStackTrace();\r
-                               status.message.emit("Error getting sync state! Aborting sync and disconnecting!");\r
+                               status.message.emit(tr("Error getting sync state! Aborting sync and disconnecting!"));\r
                                syncSignal.errorDisconnect.emit();\r
                                enDisconnect();\r
                                return;\r
@@ -292,7 +294,7 @@ public class SyncRunner extends QObject implements Runnable {
                        \r
                        if (syncState == null) {\r
                                logger.log(logger.EXTREME, "Sync State is null");\r
-                               status.message.emit("Syncronization Error!");\r
+                               status.message.emit(tr("Syncronization Error!"));\r
                                return;\r
                        }\r
 \r
@@ -307,7 +309,16 @@ public class SyncRunner extends QObject implements Runnable {
                                updateSequenceNumber = 0;\r
                                conn.getSyncTable().setUpdateSequenceNumber(0);\r
                        }\r
-\r
+                       // Check for "special" sync instructions\r
+                       String syncLinked = conn.getSyncTable().getRecord("FullLinkedNotebookSync");\r
+                       String syncShared = conn.getSyncTable().getRecord("FullLinkedNotebookSync");\r
+                       if (syncLinked != null) {\r
+                               downloadAllLinkedNotebooks();\r
+                       }\r
+                       if (syncShared != null) {\r
+                               downloadAllSharedNotebooks();\r
+                       }\r
+                       \r
                        // If there are remote changes\r
                        logger.log(logger.LOW, "Update Count: " +syncState.getUpdateCount());\r
                        logger.log(logger.LOW, "Last Update Count: " +updateSequenceNumber);\r
@@ -339,10 +350,10 @@ public class SyncRunner extends QObject implements Runnable {
                                syncSignal.refreshLists.emit();\r
                        if (!error) {\r
                                logger.log(logger.EXTREME, "Sync completed.  Errors=" +error);\r
-                               if (!disableUploads)\r
-                                       status.message.emit("Synchronizing complete");\r
+                               if (!disableUploads) \r
+                                       status.message.emit(tr("Synchronizing complete"));\r
                                else\r
-                                       status.message.emit("Download syncronization complete.  Uploads have been disabled.");\r
+                                       status.message.emit(tr("Download syncronization complete.  Uploads have been disabled."));\r
                                \r
                                logger.log(logger.EXTREME, "Saving sync time");\r
                                if (syncState.getCurrentTime() > sequenceDate)\r
@@ -361,7 +372,7 @@ public class SyncRunner extends QObject implements Runnable {
                \r
                List<DeletedItemRecord> expunged = conn.getDeletedTable().getAllDeleted();\r
                boolean error = false;\r
-               for (int i=0; i<expunged.size(); i++) {\r
+               for (int i=0; i<expunged.size() && keepRunning; i++) {\r
                        \r
                        if (authRefreshNeeded)\r
                                refreshConnection();\r
@@ -416,7 +427,7 @@ public class SyncRunner extends QObject implements Runnable {
                if (syncDeletedContent)\r
                        return;\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncDeletedNotes");\r
-               status.message.emit("Synchronizing deleted notes.");\r
+               status.message.emit(tr("Synchronizing deleted notes."));\r
 \r
                List<Note> notes = conn.getNoteTable().getDirty();\r
                // Sync the local notebooks with Evernote's\r
@@ -454,7 +465,7 @@ public class SyncRunner extends QObject implements Runnable {
                                //error = true;\r
                        } catch (EDAMSystemException e) {\r
                                logger.log(logger.LOW, "*** EDAM System Excepton syncLocalNotes "+e);\r
-                               status.message.emit("Error: " +e);\r
+                               status.message.emit(tr("Error: ") +e);\r
                                logger.log(logger.LOW, e.toString());           \r
                                error = true;\r
                        } catch (EDAMNotFoundException e) {\r
@@ -464,7 +475,7 @@ public class SyncRunner extends QObject implements Runnable {
                                //error = true;\r
                        } catch (TException e) {\r
                                logger.log(logger.LOW, "*** EDAM TExcepton syncLocalNotes "+e);\r
-                               status.message.emit("Error sending local note: " +e);\r
+                               status.message.emit(tr("Error sending local note: ") +e);\r
                                logger.log(logger.LOW, e.toString());   \r
                                error = true;\r
                        }               \r
@@ -473,7 +484,7 @@ public class SyncRunner extends QObject implements Runnable {
        // Sync notes with Evernote\r
        private void syncLocalNotes() {\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncNotes");\r
-               status.message.emit("Sending local notes.");\r
+               status.message.emit(tr("Sending local notes."));\r
 \r
                List<Note> notes = conn.getNoteTable().getDirty();\r
                // Sync the local notebooks with Evernote's\r
@@ -488,9 +499,6 @@ public class SyncRunner extends QObject implements Runnable {
                                        logger.log(logger.EXTREME, "Active dirty note found - non new");\r
                                        if (enNote.getUpdateSequenceNum() > 0) {\r
                                                enNote = getNoteContent(enNote);\r
-                                               System.out.println("--------");\r
-                                               System.out.println("Note:" +enNote);\r
-                                               System.out.println("--------");\r
                                                logger.log(logger.MEDIUM, "Updating note : "+ enNote.getGuid() +" <title>" +enNote.getTitle()+"</title>");\r
                                                enNote = noteStore.updateNote(authToken, enNote);\r
                                        } else { \r
@@ -527,22 +535,22 @@ public class SyncRunner extends QObject implements Runnable {
 \r
                                } catch (EDAMUserException e) {\r
                                        logger.log(logger.LOW, "*** EDAM User Excepton syncLocalNotes "+e);\r
-                                       status.message.emit("Error sending local note: " +e.getParameter());\r
+                                       status.message.emit(tr("Error sending local note: ")     +e.getParameter());\r
                                        logger.log(logger.LOW, e.toString());   \r
                                        error = true;\r
                                } catch (EDAMSystemException e) {\r
                                        logger.log(logger.LOW, "*** EDAM System Excepton syncLocalNotes "+e);\r
-                                       status.message.emit("Error: " +e);\r
+                                       status.message.emit(tr("Error: ") +e);\r
                                        logger.log(logger.LOW, e.toString());           \r
                                        error = true;\r
                                } catch (EDAMNotFoundException e) {\r
                                        logger.log(logger.LOW, "*** EDAM Not Found Excepton syncLocalNotes " +e);\r
-                                       status.message.emit("Error sending local note: " +e);\r
+                                       status.message.emit(tr("Error sending local note: ") +e);\r
                                        logger.log(logger.LOW, e.toString());   \r
                                        error = true;\r
                                } catch (TException e) {\r
                                        logger.log(logger.LOW, "*** EDAM TExcepton syncLocalNotes "+e);\r
-                                       status.message.emit("Error sending local note: " +e);\r
+                                       status.message.emit(tr("Error sending local note: ") +e);\r
                                        logger.log(logger.LOW, e.toString());   \r
                                        error = true;\r
                                }\r
@@ -555,24 +563,24 @@ public class SyncRunner extends QObject implements Runnable {
        private void syncLocalNotebooks() {\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncLocalNotebooks");\r
                \r
-               status.message.emit("Sending local notebooks.");\r
+               status.message.emit(tr("Sending local notebooks."));\r
                List<Notebook> remoteList = new ArrayList<Notebook>();\r
                try {\r
                        logger.log(logger.EXTREME, "Getting remote notebooks to compare with local");\r
                        remoteList = noteStore.listNotebooks(authToken);\r
                } catch (EDAMUserException e1) {\r
                        logger.log(logger.LOW, "*** EDAM User Excepton syncLocalNotebooks getting remote Notebook List");\r
-                       status.message.emit("Error: " +e1);\r
+                       status.message.emit(tr("Error: ") +e1);\r
                        logger.log(logger.LOW, e1.toString());          \r
                        error = true;\r
                } catch (EDAMSystemException e1) {\r
                        logger.log(logger.LOW, "*** EDAM System Excepton syncLocalNotebooks getting remote Notebook List");\r
-                       status.message.emit("Error: " +e1);\r
+                       status.message.emit(tr("Error: ") +e1);\r
                        logger.log(logger.LOW, e1.toString());  \r
                        error = true;\r
                } catch (TException e1) {\r
                        logger.log(logger.LOW, "*** EDAM Transaction Excepton syncLocalNotebooks getting remote Notebook List");\r
-                       status.message.emit("Error: " +e1);\r
+                       status.message.emit(tr("Error: ") +e1);\r
                        logger.log(logger.LOW, e1.toString());  \r
                        error = true;\r
                }\r
@@ -644,24 +652,24 @@ public class SyncRunner extends QObject implements Runnable {
        private void syncLocalTags() {\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncLocalTags");\r
                List<Tag> remoteList = new ArrayList<Tag>();\r
-               status.message.emit("Sending local tags.");\r
+               status.message.emit(tr("Sending local tags."));\r
                \r
                try {\r
                        logger.log(logger.EXTREME, "Getting remote tags to compare names with the local tags");\r
                        remoteList = noteStore.listTags(authToken);\r
                } catch (EDAMUserException e1) {\r
                        logger.log(logger.LOW, "*** EDAM User Excepton syncLocalTags getting remote Tag List");\r
-                       status.message.emit("Error: " +e1);\r
+                       status.message.emit(tr("Error: ") +e1);\r
                        logger.log(logger.LOW, e1.toString());  \r
                        error = true;\r
                } catch (EDAMSystemException e1) {\r
                        logger.log(logger.LOW, "*** EDAM System Excepton syncLocalTags getting remote Tag List");\r
-                       status.message.emit("Error: " +e1);\r
+                       status.message.emit(tr("Error: ") +e1);\r
                        logger.log(logger.LOW, e1.toString());          \r
                        error = true;\r
                } catch (TException e1) {\r
                        logger.log(logger.LOW, "*** EDAM Transaction Excepton syncLocalTags getting remote Tag List");\r
-                       status.message.emit("Error: " +e1);\r
+                       status.message.emit(tr("Error: ") +e1);\r
                        logger.log(logger.LOW, e1.toString());  \r
                        error = true;\r
                }               \r
@@ -737,24 +745,24 @@ public class SyncRunner extends QObject implements Runnable {
        private void syncLocalSavedSearches() {\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncLocalSavedSearches");\r
                List<SavedSearch> remoteList = new ArrayList<SavedSearch>();\r
-               status.message.emit("Sending saved searches.");\r
+               status.message.emit(tr("Sending saved searches."));\r
        \r
                logger.log(logger.EXTREME, "Getting saved searches to compare with local");\r
                try {\r
                        remoteList = noteStore.listSearches(authToken);\r
                } catch (EDAMUserException e1) {\r
                        logger.log(logger.LOW, "*** EDAM User Excepton syncLocalTags getting remote saved search List");\r
-                       status.message.emit("Error: " +e1);\r
+                       status.message.emit(tr("Error: ") +e1);\r
                        logger.log(logger.LOW, e1.toString());  \r
                        error = true;\r
                } catch (EDAMSystemException e1) {\r
                        logger.log(logger.LOW, "*** EDAM System Excepton syncLocalTags getting remote saved search List");\r
-                       status.message.emit("Error: " +e1);\r
+                       status.message.emit(tr("Error: ") +e1);\r
                        logger.log(logger.LOW, e1.toString());          \r
                        error = true;\r
                } catch (TException e1) {\r
                        logger.log(logger.LOW, "*** EDAM Transaction Excepton syncLocalTags getting remote saved search List");\r
-                       status.message.emit("Error: " +e1);\r
+                       status.message.emit(tr("Error: ") +e1);\r
                        logger.log(logger.LOW, e1.toString());  \r
                        error = true;\r
                }               \r
@@ -840,7 +848,7 @@ public class SyncRunner extends QObject implements Runnable {
                if (updateSequenceNumber == 0)\r
                        fullSync = true;\r
                \r
-               status.message.emit("Downloading 0% complete.");\r
+               status.message.emit(tr("Downloading 0% complete."));\r
                \r
                while(more &&  keepRunning) {\r
                        \r
@@ -879,11 +887,20 @@ public class SyncRunner extends QObject implements Runnable {
                        // Do the local deletes\r
                        logger.log(logger.EXTREME, "Doing local deletes");\r
                        List<String> guid = chunk.getExpungedNotes();\r
-                       if (guid != null) \r
+                       if (guid != null) {\r
                                for (int i=0; i<guid.size() && keepRunning; i++) {\r
-                                       logger.log(logger.EXTREME, "Expunging local note from database");\r
-                                       conn.getNoteTable().expungeNote(guid.get(i), true, false);\r
+                                       String notebookGuid = "";\r
+                                       Note localNote = conn.getNoteTable().getNote(guid.get(i), false, false, false, false, false);\r
+                                       if (localNote != null) {\r
+                                               conn.getNoteTable().updateNoteSequence(guid.get(i), 0);\r
+                                               notebookGuid = localNote.getNotebookGuid();\r
+                                       }\r
+                                       if (!conn.getNotebookTable().isNotebookLocal(notebookGuid)) {\r
+                                               logger.log(logger.EXTREME, "Expunging local note from database");\r
+                                               conn.getNoteTable().expungeNote(guid.get(i), true, false);\r
+                                       }\r
                                }\r
+                       }\r
                        guid = chunk.getExpungedNotebooks();\r
                        if (guid != null)\r
                                for (int i=0; i<guid.size() && keepRunning; i++) {\r
@@ -925,7 +942,7 @@ public class SyncRunner extends QObject implements Runnable {
                                long pct = chunk.getChunkHighUSN() * 100;\r
                                conn.getSyncTable().setLastSequenceDate(chunk.getCurrentTime());\r
                                pct = pct/evernoteUpdateCount;\r
-                               status.message.emit("Downloading " +new Long(pct).toString()+"% complete.");\r
+                               status.message.emit(tr("Downloading ") +new Long(pct).toString()+tr("% complete."));\r
                        }\r
                }\r
 \r
@@ -1043,6 +1060,7 @@ public class SyncRunner extends QObject implements Runnable {
                                                logger.log(logger.EXTREME, "Saving Note");\r
                                                conn.getNoteTable().syncNote(n, false);\r
                                                noteSignal.noteChanged.emit(n.getGuid(), null);   // Signal to ivalidate note cache\r
+                                               noteSignal.noteDownloaded.emit(n, true);                // Signal to add note to index\r
                                                logger.log(logger.EXTREME, "Note Saved");\r
                                                if (fullSync && n.getResources() != null) {\r
                                                        for (int q=0; q<n.getResources().size() && keepRunning; q++) {\r
@@ -1404,7 +1422,7 @@ public class SyncRunner extends QObject implements Runnable {
 //                     syncSignal.authRefreshComplete.emit(false);\r
 //             }\r
     }\r
-       \r
+    \r
        public synchronized boolean addWork(String request) {\r
                if (workQueue.offer(request))\r
                        return true;\r
@@ -1415,4 +1433,68 @@ public class SyncRunner extends QObject implements Runnable {
        n.setContent(conn.getNoteTable().getNoteContentBinary(n.getGuid()));\r
        return n;\r
     }\r
+\r
+\r
+\r
+    //*********************************************************\r
+    //* Special download instructions.  Used for DB upgrades\r
+    //*********************************************************\r
+    private void downloadAllSharedNotebooks() {\r
+       try {\r
+                       List<SharedNotebook> books = noteStore.listSharedNotebooks(authToken);\r
+                       logger.log(logger.LOW, "Shared notebooks found = " +books.size());\r
+                       for (int i=0; i<books.size(); i++) {\r
+                               conn.getSharedNotebookTable().updateNotebook(books.get(i), false);\r
+                       }\r
+                       conn.getSyncTable().deleteRecord("FullSharedNotebookSync");\r
+               } catch (EDAMUserException e1) {\r
+                       e1.printStackTrace();\r
+                       status.message.emit(tr("User exception Listing shared notebooks."));\r
+                       logger.log(logger.LOW, e1.getMessage());\r
+                       return;\r
+               } catch (EDAMSystemException e1) {\r
+                       e1.printStackTrace();\r
+                       status.message.emit(tr("System exception Listing shared notebooks."));\r
+                       logger.log(logger.LOW, e1.getMessage());\r
+                       return;\r
+               } catch (TException e1) {\r
+                       e1.printStackTrace();\r
+                       status.message.emit(tr("Transaction exception Listing shared notebooks."));\r
+                       logger.log(logger.LOW, e1.getMessage());\r
+                       return;\r
+               } catch (EDAMNotFoundException e1) {\r
+                       e1.printStackTrace();\r
+                       status.message.emit(tr("EDAM Not Found exception Listing shared notebooks."));\r
+                       logger.log(logger.LOW, e1.getMessage());\r
+               }\r
+    }\r
+    private void downloadAllLinkedNotebooks() {\r
+       try {\r
+                       List<LinkedNotebook> books = noteStore.listLinkedNotebooks(authToken);\r
+                       logger.log(logger.LOW, "Linked notebooks found = " +books.size());\r
+                       for (int i=0; i<books.size(); i++) {\r
+                               conn.getLinkedNotebookTable().updateNotebook(books.get(i), false);\r
+                       }\r
+                       conn.getSyncTable().deleteRecord("FullLinkedNotebookSync");\r
+               } catch (EDAMUserException e1) {\r
+                       e1.printStackTrace();\r
+                       status.message.emit(tr("User exception Listing linked notebooks."));\r
+                       logger.log(logger.LOW, e1.getMessage());\r
+                       return;\r
+               } catch (EDAMSystemException e1) {\r
+                       e1.printStackTrace();\r
+                       status.message.emit(tr("System exception Listing linked notebooks."));\r
+                       logger.log(logger.LOW, e1.getMessage());\r
+                       return;\r
+               } catch (TException e1) {\r
+                       e1.printStackTrace();\r
+                       status.message.emit(tr("Transaction exception Listing lineked notebooks."));\r
+                       logger.log(logger.LOW, e1.getMessage());\r
+                       return;\r
+               } catch (EDAMNotFoundException e1) {\r
+                       e1.printStackTrace();\r
+                       status.message.emit(tr("EDAM Not Found exception Listing linked notebooks."));\r
+                       logger.log(logger.LOW, e1.getMessage());\r
+               }\r
+    }\r
 }\r