OSDN Git Service

- Added support for note linking. It is still feels a little clunky but it seems...
authorRandy Baumgarte <randy@fbn.cx>
Tue, 28 Jun 2011 01:34:49 +0000 (21:34 -0400)
committerRandy Baumgarte <randy@Centauri.(none)>
Tue, 28 Jun 2011 13:21:14 +0000 (09:21 -0400)
src/cx/fbn/nevernote/NeverNote.java
src/cx/fbn/nevernote/dialog/SharedNotebookSyncError.java [new file with mode: 0644]
src/cx/fbn/nevernote/sql/LinkedNotebookTable.java
src/cx/fbn/nevernote/sql/NoteResourceTable.java
src/cx/fbn/nevernote/sql/NoteTable.java
src/cx/fbn/nevernote/sql/NotebookTable.java
src/cx/fbn/nevernote/sql/SharedNotebookTable.java
src/cx/fbn/nevernote/sql/WordsTable.java
src/cx/fbn/nevernote/threads/IndexRunner.java
src/cx/fbn/nevernote/threads/SyncRunner.java

index 68db7ea..251620e 100644 (file)
@@ -156,6 +156,7 @@ import cx.fbn.nevernote.dialog.PublishNotebook;
 import cx.fbn.nevernote.dialog.SavedSearchEdit;
 import cx.fbn.nevernote.dialog.SetIcon;
 import cx.fbn.nevernote.dialog.ShareNotebook;
+import cx.fbn.nevernote.dialog.SharedNotebookSyncError;
 import cx.fbn.nevernote.dialog.StackNotebook;
 import cx.fbn.nevernote.dialog.SynchronizationRequiredWarning;
 import cx.fbn.nevernote.dialog.TagEdit;
@@ -1212,6 +1213,7 @@ public class NeverNote extends QMainWindow{
         // Set special reloads
         if (settings.getDebugPage().reloadSharedNotebooksClicked()) {
                conn.executeSql("Delete from LinkedNotebook");
+               conn.executeSql("delete from SharedNotebook");
                conn.executeSql("Delete from Notebook where linked=true");
                conn.executeSql("Insert into Sync (key, value) values ('FullLinkedNotebookSync', 'true')");
                conn.executeSql("Insert into Sync (key, value) values ('FullSharedNotebookSync', 'true')");
@@ -4260,11 +4262,10 @@ public class NeverNote extends QMainWindow{
                saveNote(currentNoteGuid, browserWindow);
                thumbnailRunner.addWork("GENERATE "+ currentNoteGuid);
                noteDirty = false;
-       }
+       } 
     }
     private void saveNote(String guid, BrowserWindow window) {
                logger.log(logger.EXTREME, "Inside NeverNote.saveNote()");
-               logger.log(logger.EXTREME, "Note is dirty.");
                waitCursor(true);
                
                logger.log(logger.EXTREME, "Saving to cache");
@@ -4324,7 +4325,7 @@ public class NeverNote extends QMainWindow{
                formatter.setNote(note, Global.pdfPreview());
                formatter.setHighlight(listManager.getEnSearch());
                QByteArray js;
-               if (!noteCache.containsKey(guid) || conn.getNoteTable().isThumbnailNeeded(guid)) {
+               if (!noteCache.containsKey(guid)) {
                        js = new QByteArray();
                        // We need to prepend the note with <HEAD></HEAD> or encoded characters are ugly 
                        js.append("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");               
@@ -5434,6 +5435,42 @@ public class NeverNote extends QMainWindow{
                refreshEvernoteNote(false);
                scrollToGuid(currentNoteGuid);
                waitCursor(false);
+               
+               // Check to see if there were any shared notebook errors
+               if (syncRunner.error && syncRunner.errorSharedNotebooks.size() > 0) {
+                       String guid = syncRunner.errorSharedNotebooks.get(0);
+                       String notebookGuid = conn.getLinkedNotebookTable().getLocalNotebookGuid(guid);
+                       String localName = listManager.getNotebookNameByGuid(notebookGuid);
+                       SharedNotebookSyncError syncDialog = new SharedNotebookSyncError(localName);
+                       syncDialog.exec();
+                       if (syncDialog.okPressed()) {
+                               if (syncDialog.doNothing.isChecked()) {
+                                       syncRunner.errorSharedNotebooksIgnored.put(guid, guid);
+                                       evernoteSync();
+                               }
+                               if (syncDialog.deleteNotebook.isChecked()) {
+                                       conn.getNoteTable().expungeNotesByNotebook(notebookGuid, true, false);
+                                       conn.getNotebookTable().expungeNotebook(notebookGuid, false);
+                                       conn.getLinkedNotebookTable().expungeNotebook(guid, false);
+                                       conn.getLinkedNotebookTable().expungeNotebook(guid, false);
+                                       evernoteSync();
+                               }
+/*                             if (syncDialog.convertToLocal.isChecked()) {
+                                       conn.getNotebookTable().convertFromSharedNotebook(notebookGuid, true);
+                                       conn.getLinkedNotebookTable().expungeNotebook(guid, false);
+                                       evernoteSync();
+                               }
+                               if (syncDialog.convertToShared.isChecked()) {
+                                       conn.getLinkedNotebookTable().expungeNotebook(guid, false);
+                                       conn.getNotebookTable().convertFromSharedNotebook(notebookGuid, false);
+                                       evernoteSync();
+                               } */
+                               refreshLists();
+                               return;
+                       }
+               }
+               
+               // Finalize the synchronization
                if (!syncRunner.error)
                        setMessage(tr("Synchronization Complete"));
                else
@@ -5824,7 +5861,7 @@ public class NeverNote extends QMainWindow{
                                user.setId(0);
                        }       
                }
-               
+
                
                // Start building a list of URLs based upon the selected notes
        noteTableView.showColumn(Global.noteTableGuidPosition);
@@ -5832,7 +5869,24 @@ public class NeverNote extends QMainWindow{
        List<QModelIndex> selections = noteTableView.selectionModel().selectedRows();
        if (!Global.isColumnVisible("guid"))
                noteTableView.hideColumn(Global.noteTableGuidPosition);
-       
+
+               // Check that the note is either synchronized, or in a local notebook
+               for (int i=0; i<selections.size(); i++) {
+                       QModelIndex index;
+                       int row = selections.get(i).row();
+               index = noteTableView.proxyModel.index(row, Global.noteTableGuidPosition);
+               SortedMap<Integer, Object> ix = noteTableView.proxyModel.itemData(index);
+                       String selectedGuid = (String)ix.values().toArray()[0];
+                       
+                       Note n = conn.getNoteTable().getNote(selectedGuid, false, false, false, false, false);
+                       if (n.getUpdateSequenceNum() == 0 && !conn.getNotebookTable().isNotebookLocal(n.getNotebookGuid())) {
+                               QMessageBox.critical(this, tr("Please Synchronize") ,tr("Please either synchronize or move any " +
+                                               "new notes to a local notebook."));
+                               return; 
+                       }
+               }
+
+               // Start building the URLs
        for (int i=0; i<selections.size(); i++) {
                QModelIndex index;
                        int row = selections.get(i).row();
diff --git a/src/cx/fbn/nevernote/dialog/SharedNotebookSyncError.java b/src/cx/fbn/nevernote/dialog/SharedNotebookSyncError.java
new file mode 100644 (file)
index 0000000..98448eb
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * This file is part of NeverNote 
+ * Copyright 2009 Randy Baumgarte
+ * 
+ * This file may be licensed under the terms of of the
+ * GNU General Public License Version 2 (the ``GPL'').
+ *
+ * Software distributed under the License is distributed
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
+ * express or implied. See the GPL for the specific language
+ * governing rights and limitations.
+ *
+ * You should have received a copy of the GPL along with this
+ * program. If not, go to http://www.gnu.org/licenses/gpl.html
+ * or write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+package cx.fbn.nevernote.dialog;
+
+//**********************************************
+//**********************************************
+//* Create or edit a tag
+//**********************************************
+//**********************************************
+
+import com.trolltech.qt.gui.QDialog;
+import com.trolltech.qt.gui.QGridLayout;
+import com.trolltech.qt.gui.QGroupBox;
+import com.trolltech.qt.gui.QIcon;
+import com.trolltech.qt.gui.QPushButton;
+import com.trolltech.qt.gui.QRadioButton;
+import com.trolltech.qt.gui.QTextBrowser;
+import com.trolltech.qt.gui.QVBoxLayout;
+
+public class SharedNotebookSyncError extends QDialog {
+       private boolean         okPressed;
+       QPushButton ok;
+       public final QRadioButton doNothing;
+       public final QRadioButton deleteNotebook;
+       public final QRadioButton convertToLocal;
+       public final QRadioButton convertToShared;
+       private final QGroupBox choiceGroup;
+       private final String iconPath = new String("classpath:cx/fbn/nevernote/icons/");
+       
+       // Constructor
+       public SharedNotebookSyncError(String notebook) {
+               okPressed = false;
+               setWindowTitle(tr("Shared Notebook Synchronization Error"));
+               QGridLayout grid = new QGridLayout();
+               setWindowIcon(new QIcon(iconPath+"synchronize.png"));
+               QVBoxLayout vLayout = new QVBoxLayout();
+               setLayout(vLayout);
+
+               QTextBrowser msg1 = new QTextBrowser();
+               msg1.setText(tr("There was an error with notebook ") +notebook 
+                               +tr("\nThe most probable reason is that the owner of the notebook has revoked your authority to view it.\n\n")
+                               +tr("Below are the choices available to resolve this issue."));
+               vLayout.addWidget(msg1);
+               
+               choiceGroup = new QGroupBox(this);
+               doNothing = new QRadioButton(this);
+               doNothing.setChecked(true);
+               doNothing.setText(tr("Do nothing and ask me later."));
+               deleteNotebook = new QRadioButton(this);
+               deleteNotebook.setText(tr("Permanently delete this notebook & all notes"));
+               convertToLocal = new QRadioButton(this);
+               convertToLocal.setText(tr("Convert this notebook to a local notebook and keep all notes"));
+               convertToShared = new QRadioButton(this);
+               convertToShared.setText(tr("Convert this notebook to a shared notebook and keep all notes"));
+               
+               QVBoxLayout optionLayout = new QVBoxLayout();
+               optionLayout.addWidget(doNothing);
+               optionLayout.addWidget(deleteNotebook);
+//             optionLayout.addWidget(convertToLocal);
+//             optionLayout.addWidget(convertToShared);
+               choiceGroup.setLayout(optionLayout);
+               vLayout.addWidget(choiceGroup);
+               
+               QGridLayout buttonGrid = new QGridLayout();
+               ok = new QPushButton(tr("OK"));
+               ok.clicked.connect(this, "okButtonPressed()");
+               QPushButton cancel = new QPushButton(tr("Cancel"));
+               cancel.clicked.connect(this, "cancelButtonPressed()");
+               buttonGrid.addWidget(ok, 3, 1);
+               buttonGrid.addWidget(cancel, 3,2);
+               grid.addLayout(buttonGrid,3,1);
+               vLayout.addLayout(grid);
+       }
+       
+       // The OK button was pressed
+       @SuppressWarnings("unused")
+       private void okButtonPressed() {
+               okPressed = true;
+               close();
+       }
+       
+       // The CANCEL button was pressed
+       @SuppressWarnings("unused")
+       private void cancelButtonPressed() {
+               okPressed = false;
+               close();
+       }
+       
+       // Check if the OK button was pressed
+       public boolean okPressed() {
+               return okPressed;
+       }
+       
+       // Set the window title
+       public void setTitle(String s) {
+               setWindowTitle(s);
+       }
+}
index 937dca2..5c5fed9 100644 (file)
@@ -151,7 +151,7 @@ public class LinkedNotebookTable {
                \r
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
                check = query.prepare("Update LinkedNotebook set guid=:guid, shareName=:shareName, " +\r
-                               "username=:username, shardID=:shardID, shareKey=:shareKey, uri=:uri, updateSequenceNumber=:usn, isDirty=:isDirty "+\r
+                               "username=:username, shardID=:shardID, uri=:uri, updateSequenceNumber=:usn, isDirty=:isDirty "+\r
                                "where guid=:keyGuid");\r
                query.bindValue(":guid", tempNotebook.getGuid());\r
                query.bindValue(":keyGuid", tempNotebook.getGuid());\r
@@ -295,7 +295,25 @@ public class LinkedNotebookTable {
                        return query.valueInteger(0);\r
                }       \r
                return 0;\r
-       }                       \r
+       }               \r
+       \r
+       // get the "true" notebook guid and not the shared notebook guid\r
+       public String getLocalNotebookGuid(String guid) {\r
+               boolean check;\r
+                                       \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               check = query.prepare("Select notebookGuid " \r
+                               +"from LinkedNotebook where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               check = query.exec();\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
+               while (query.next()) {\r
+                       return query.valueString(0);\r
+               }       \r
+               return null;\r
+       }\r
 \r
        // does a record exist?\r
        public String findNotebookByShareName(String name) {\r
index b3a0806..69d1f63 100644 (file)
@@ -660,4 +660,17 @@ public class NoteResourceTable  {
                logger.log(logger.HIGH, "Leaving RNoteResourceTable.getNoteSourceUrl() - no value found");\r
                return null;\r
        }\r
+       \r
+       // Get note source\r
+       public List<String> getDistinctNoteGuids() {\r
+               logger.log(logger.HIGH, "Entering NoteResourceTable.getDistinctNoteGuids()");\r
+               List<String> guids = new ArrayList<String>();\r
+               NSqlQuery query = new NSqlQuery(db.getResourceConnection());\r
+               query.exec("select distinct noteguid from noteresources");\r
+               if (query.next()) {\r
+                       guids.add(query.valueString(0));\r
+               }\r
+               logger.log(logger.HIGH, "Leaving NoteResourceTable.getDistinctNoteGuids()");\r
+               return guids;\r
+       }\r
 }\r
index 97c4a8e..c76b0b9 100644 (file)
@@ -609,6 +609,7 @@ public class NoteTable {
                        logger.log(logger.MEDIUM, "Note tags delete failed.");\r
                        logger.log(logger.MEDIUM, tags.lastError());\r
                }\r
+\r
                if (!words.exec()) {\r
                        logger.log(logger.MEDIUM, "Word delete failed.");\r
                        logger.log(logger.MEDIUM, words.lastError());\r
@@ -619,6 +620,14 @@ public class NoteTable {
                }\r
 \r
        }\r
+       // Purge a bunch of notes based upon the notebook\r
+       public void expungeNotesByNotebook(String notebookGuid, boolean permanentExpunge, boolean needsSync) {\r
+               List<String> notes = getNotesByNotebook(notebookGuid);\r
+               for (int i=0; i<notes.size(); i++) {\r
+                       expungeNote(notes.get(i), permanentExpunge, needsSync);\r
+               }\r
+       }\r
+\r
        // Purge a note (actually delete it instead of just marking it deleted)\r
        public void hideExpungedNote(String guid, boolean needsSync) {\r
         NSqlQuery note = new NSqlQuery(db.getConnection());\r
@@ -629,7 +638,7 @@ public class NoteTable {
                note.prepare("Update Note set isExpunged=true where guid=:guid");\r
                resources.prepare("Delete from NoteResources where noteGuid=:guid");\r
                tags.prepare("Delete from NoteTags where noteGuid=:guid");\r
-               words.prepare("Delete from words where guid=:guid");\r
+//             words.prepare("Delete from words where guid=:guid");\r
 \r
                note.bindValue(":guid", guid);\r
                resources.bindValue(":guid", guid);\r
@@ -649,10 +658,11 @@ public class NoteTable {
                        logger.log(logger.MEDIUM, "Note tags delete failed.");\r
                        logger.log(logger.MEDIUM, tags.lastError());\r
                }\r
-               if (!words.exec()) {\r
-                       logger.log(logger.MEDIUM, "Word delete failed.");\r
-                       logger.log(logger.MEDIUM, words.lastError());\r
-               }\r
+//             System.out.println("Hiding Note: Deleting words");\r
+//             if (!words.exec()) {\r
+//                     logger.log(logger.MEDIUM, "Word delete failed.");\r
+//                     logger.log(logger.MEDIUM, words.lastError());\r
+//             }\r
                if (needsSync) {\r
                        DeletedTable deletedTable = new DeletedTable(logger, db);\r
                        deletedTable.addDeletedItem(guid, "Note");\r
@@ -664,9 +674,17 @@ public class NoteTable {
        public void expungeAllDeletedNotes() {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
                query.exec("select guid, updateSequenceNumber from note where active = false");\r
+               List<String> guids = new ArrayList<String>();\r
+               List<Integer> usns = new ArrayList<Integer>();\r
                while (query.next()) {\r
-                       String guid = query.valueString(0);\r
+                       guids.add(query.valueString(0));\r
                        Integer usn = new Integer(query.valueString(1));\r
+                       usns.add(usn);\r
+               }\r
+               \r
+               for (int i=0; i<guids.size(); i++) {\r
+                       Integer usn = usns.get(i);\r
+                       String guid = guids.get(i);\r
                        if (usn == 0)\r
                                expungeNote(guid, true, false);\r
                        else\r
index 3dd97a6..1c585fb 100644 (file)
@@ -869,5 +869,32 @@ public class NotebookTable {
                \r
                \r
        }\r
+       \r
+       // Given a notebook, what tags are valid for it?\r
+       public void convertFromSharedNotebook(String guid, boolean local) {\r
+               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());  \r
+        \r
+        query.prepare("Update Notebook set sequence=0, published=false, isdirty=true, local=:local, publishinguri=''"\r
+                               +" where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (local)\r
+                       query.bindValue(":local", true);\r
+               else\r
+                       query.bindValue(":local", false);\r
+               \r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "NotebookTable.convertToLocalNotebook error.");\r
+               \r
+        query.prepare("Update Note set updatesequencenumber=0, isdirty=true"\r
+                               +" where notebookguid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "NotebookTable.convertToLocalNotebook #2 error.");\r
+                       \r
+               return;\r
+               \r
+               \r
+       }\r
 }\r
 \r
index d14e34d..c74c2e2 100644 (file)
@@ -102,6 +102,7 @@ public class SharedNotebookTable {
        // Check if a notebook exists\r
        public boolean exists(long id) {\r
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
+        logger.log(logger.EXTREME, "Checking if shared notebook " +id +" exists");\r
                boolean check = query.prepare("Select id from sharednotebook where id=:id");\r
                query.bindValue(":id", id);\r
                check = query.exec();\r
@@ -111,6 +112,7 @@ public class SharedNotebookTable {
                }\r
                if (query.next())\r
                        return true;\r
+        logger.log(logger.EXTREME, "Shared notebook " +id +" does not exist");         \r
                return false;\r
        }\r
        // Delete the notebook based on a id\r
@@ -161,19 +163,41 @@ public class SharedNotebookTable {
        \r
        // Update a notebook\r
        public void updateNotebook(SharedNotebook tempNotebook, boolean isDirty) {\r
+\r
+               logger.log(logger.EXTREME, "*Updating Shared Notebook*");\r
+               logger.log(logger.EXTREME, "ID: " + tempNotebook.getId());\r
+               logger.log(logger.EXTREME, "Userid: " + tempNotebook.getUserId());\r
+               logger.log(logger.EXTREME, "Email: " + tempNotebook.getEmail());\r
+               logger.log(logger.EXTREME, "Notebook Guid: " + tempNotebook.getNotebookGuid());\r
+               logger.log(logger.EXTREME, "Share Key: " + tempNotebook.getShareKey());\r
+               logger.log(logger.EXTREME, "Username: " + tempNotebook.getUsername());\r
+\r
+               \r
                boolean check;\r
                if (!exists(tempNotebook.getId())) {\r
                        addNotebook(tempNotebook, isDirty);\r
                        return;\r
                }\r
                \r
+               List<SharedNotebook> list = getAll();\r
+        logger.log(logger.EXTREME, "Dumping shared notebooks");\r
+               for (int i=0; i<list.size(); i++) {\r
+                       logger.log(logger.EXTREME, "**************");\r
+                       logger.log(logger.EXTREME, "ID: " + list.get(i).getId());\r
+                       logger.log(logger.EXTREME, "Userid: " + list.get(i).getUserId());\r
+                       logger.log(logger.EXTREME, "Email: " + list.get(i).getEmail());\r
+                       logger.log(logger.EXTREME, "Notebook Guid: " + list.get(i).getNotebookGuid());\r
+                       logger.log(logger.EXTREME, "Share Key: " + list.get(i).getShareKey());\r
+                       logger.log(logger.EXTREME, "Username: " + list.get(i).getUsername());\r
+               }\r
+               \r
                SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
                \r
                StringBuilder serviceCreated = new StringBuilder(simple.format(tempNotebook.getServiceCreated()));                                              \r
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Update SharedNotebook set id=:id, userid=:userid, notebookGuid=:notebook, "\r
+               check = query.prepare("Update SharedNotebook set userid=:userid, notebookGuid=:notebook, "\r
                                + "email=:email, notebookModifiable=:mod, requireLogin=:rlogin, serviceCreated=:serviceCreated, "\r
-                               + "shareKey=:shareKey, username=:username, isDirty=:isdirty");\r
+                               + "shareKey=:shareKey, username=:username, isDirty=:isdirty where id=:id");\r
                query.bindValue(":id", tempNotebook.getId());\r
                query.bindValue(":userid", tempNotebook.getUserId());\r
                query.bindValue(":notebook", tempNotebook.getNotebookGuid());\r
index 66351c9..af8e60d 100644 (file)
@@ -20,6 +20,9 @@
 \r
 package cx.fbn.nevernote.sql;\r
 \r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
 import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 \r
@@ -83,6 +86,17 @@ public class WordsTable {
                deleteWords.exec();\r
 \r
        }\r
+       // Expunge words\r
+       public void expunge(String guid) {\r
+               NSqlQuery deleteWords = new NSqlQuery(db.getIndexConnection());\r
+               if (!deleteWords.prepare("delete from words where guid=:guid")) {\r
+                       logger.log(logger.EXTREME, "Word SQL select prepare expunge has failed.");\r
+                       logger.log(logger.MEDIUM, deleteWords.lastError());\r
+               }\r
+       \r
+               deleteWords.bindValue(":guid", guid);\r
+               deleteWords.exec();\r
+       }\r
        // Reindex a note\r
        public synchronized void addWordToNoteIndex(String guid, String word, String type, Integer weight) {\r
                NSqlQuery findWords = new NSqlQuery(db.getIndexConnection());\r
@@ -136,5 +150,20 @@ public class WordsTable {
                }\r
        }\r
 \r
+       // Get a list of GUIDs in the table\r
+       public List<String> getGuidList() {\r
+               NSqlQuery query = new NSqlQuery(db.getIndexConnection());\r
+        logger.log(logger.HIGH, "gedGuidList()");\r
+        \r
+        boolean check = query.exec("Select distinct guid from words");\r
+        if (!check)\r
+               logger.log(logger.HIGH, "Table WORDS select distinct guid has FAILED!!!");  \r
+        \r
+        List<String> guids = new ArrayList<String>();\r
+        while (query.next()) {\r
+               guids.add(query.valueString(0));\r
+        }\r
+        return guids;\r
+       }       \r
 \r
 }\r
index d5fb25c..d362f45 100644 (file)
@@ -680,6 +680,17 @@ public class IndexRunner extends QObject implements Runnable {
                                indexResource();\r
                        }\r
                }\r
+               \r
+               // Cleanup stuff that was deleted at some point\r
+               List<String> guids = conn.getWordsTable().getGuidList();\r
+               logger.log(logger.LOW, "GUIDS in index: " +guids.size());\r
+               for (int i=0; i<guids.size() && keepRunning; i++) {\r
+                       if (!conn.getNoteTable().exists(guids.get(i))) {\r
+                               logger.log(logger.LOW, "Old GUID found: " +guids.get(i));\r
+                               conn.getWordsTable().expunge(guids.get(i));\r
+                       }\r
+               }\r
+               \r
                if (started && keepRunning) \r
                        signal.indexFinished.emit();\r
        }\r
index 592b82a..70e2f7c 100644 (file)
@@ -92,6 +92,8 @@ public class SyncRunner extends QObject implements Runnable {
                private DatabaseConnection              conn;\r
                private boolean                                 idle;\r
                public boolean                                  error;\r
+               public volatile Vector<String>  errorSharedNotebooks;\r
+               public volatile HashMap<String,String>  errorSharedNotebooksIgnored;\r
                public volatile boolean                 isConnected;\r
                public volatile boolean                 keepRunning;\r
                public volatile String                  authToken;\r
@@ -187,10 +189,13 @@ public class SyncRunner extends QObject implements Runnable {
        }\r
        @Override\r
        public void run() {\r
+               errorSharedNotebooks = new Vector<String>();\r
+               errorSharedNotebooksIgnored = new HashMap<String,String>();\r
                try {\r
                        logger.log(logger.EXTREME, "Starting thread");\r
                        conn = new DatabaseConnection(logger, dburl, indexUrl, resourceUrl, dbuid, dbpswd, dbcpswd, 200);\r
                        while(keepRunning) {\r
+                               logger.log(logger.EXTREME, "Blocking until work is found");\r
                                String work = workQueue.take();\r
                                logger.log(logger.EXTREME, "Work found: " +work);\r
                                if (work.equalsIgnoreCase("stop")) {\r
@@ -370,7 +375,7 @@ public class SyncRunner extends QObject implements Runnable {
                        }\r
                        // Check for "special" sync instructions\r
                        String syncLinked = conn.getSyncTable().getRecord("FullLinkedNotebookSync");\r
-                       String syncShared = conn.getSyncTable().getRecord("FullLinkedNotebookSync");\r
+                       String syncShared = conn.getSyncTable().getRecord("FullSharedNotebookSync");\r
                        String syncNotebooks = conn.getSyncTable().getRecord("FullNotebookSync");\r
                        String syncInkNoteImages = conn.getSyncTable().getRecord("FullInkNoteImageSync");\r
                        if (syncLinked != null) {\r
@@ -439,7 +444,7 @@ public class SyncRunner extends QObject implements Runnable {
                                syncSignal.refreshLists.emit();\r
                        \r
                        if (!error) {\r
-                               logger.log(logger.EXTREME, "Sync completed.  Errors=" +error);\r
+                               logger.log(logger.LOW, "Sync completed.  Errors=" +error);\r
                                if (!disableUploads) \r
                                        status.message.emit(tr("Synchronizing complete"));\r
                                else\r
@@ -1834,22 +1839,32 @@ public class SyncRunner extends QObject implements Runnable {
        logger.log(logger.MEDIUM, "Authenticating Shared Notebooks");\r
        status.message.emit(tr("Synchronizing shared notebooks."));\r
        List<LinkedNotebook> books = conn.getLinkedNotebookTable().getAll();\r
-\r
+       \r
+       errorSharedNotebooks.clear();\r
+               \r
        for (int i=0; i<books.size(); i++) {\r
+               if (errorSharedNotebooksIgnored.containsKey(books.get(i).getGuid()))\r
+                       break;\r
                try {\r
                                long lastSyncDate = conn.getLinkedNotebookTable().getLastSequenceDate(books.get(i).getGuid());\r
                                int lastSequenceNumber = conn.getLinkedNotebookTable().getLastSequenceNumber(books.get(i).getGuid());\r
 \r
+                               logger.log(logger.EXTREME, "Last Sequence Number on file: " +lastSequenceNumber);\r
+                               \r
                                // Authenticate to the owner's shard\r
                                String linkedNoteStoreUrl       = noteStoreUrlBase + books.get(i).getShardId();\r
+                               logger.log(logger.EXTREME, "linkedNoteStoreURL: " +linkedNoteStoreUrl);\r
                                THttpClient linkedNoteStoreTrans        = new THttpClient(linkedNoteStoreUrl);\r
                                TBinaryProtocol linkedNoteStoreProt     = new TBinaryProtocol(linkedNoteStoreTrans);\r
-                               Client linkedNoteStore = new NoteStore.Client(linkedNoteStoreProt, linkedNoteStoreProt);                                \r
+                               Client linkedNoteStore = new NoteStore.Client(linkedNoteStoreProt, linkedNoteStoreProt);        \r
 \r
                                linkedAuthResult = null;\r
-                               if (books.get(i).getShareKey() != null)\r
+                               if (books.get(i).getShareKey() != null) {\r
+                                       logger.log(logger.EXTREME, "Share Key Not Null: " +books.get(i).getShareKey());\r
                                        linkedAuthResult = linkedNoteStore.authenticateToSharedNotebook(books.get(i).getShareKey(), authToken);\r
-                               else {\r
+                                       logger.log(logger.EXTREME, "Authentication Token" +linkedAuthResult.getAuthenticationToken());\r
+                               } else {\r
+                                       logger.log(logger.EXTREME, "Share key is null ");\r
                                        linkedAuthResult = new AuthenticationResult();\r
                                        linkedAuthResult.setAuthenticationToken("");\r
                                }\r
@@ -1860,7 +1875,8 @@ public class SyncRunner extends QObject implements Runnable {
                                                lastSequenceNumber = 0;\r
                                        } \r
                                        syncLinkedNotebook(linkedNoteStore, books.get(i), \r
-                                                       lastSequenceNumber, linkedSyncState.getUpdateCount(), linkedAuthResult.getAuthenticationToken());\r
+                                                       //lastSequenceNumber, linkedSyncState.getUpdateCount(), linkedAuthResult.getAuthenticationToken());\r
+                                                       lastSequenceNumber, linkedSyncState.getUpdateCount(), authToken);\r
                                }\r
                        \r
                        // Synchronize local changes\r
@@ -1871,13 +1887,19 @@ public class SyncRunner extends QObject implements Runnable {
                } catch (EDAMNotFoundException e) {\r
                        status.message.emit(tr("Error synchronizing \" " +\r
                                        books.get(i).getShareName()+"\". Please verify you still have access to that shared notebook."));\r
+                       errorSharedNotebooks.add(books.get(i).getGuid());\r
+                       errorSharedNotebooksIgnored.put(books.get(i).getGuid(), books.get(i).getGuid());\r
+                       logger.log(logger.LOW, "Error synchronizing shared notebook.  EDAMNotFound: "+e.getMessage());\r
+                       logger.log(logger.LOW, e.getStackTrace());\r
                        error = true;\r
                        e.printStackTrace();\r
                } catch (EDAMSystemException e) {\r
+                       error = true;\r
                        logger.log(logger.LOW, "System error authenticating against shared notebook. "+\r
                                        "Key: "+books.get(i).getShareKey() +" Error:" +e.getMessage());\r
                        e.printStackTrace();\r
                } catch (TException e) {\r
+                       error = true;\r
                        e.printStackTrace();\r
                }\r
        }\r
@@ -1886,6 +1908,7 @@ public class SyncRunner extends QObject implements Runnable {
        conn.getTagTable().removeUnusedLinkedTags();\r
        conn.getTagTable().cleanupTags();\r
        tagSignal.listChanged.emit();\r
+       return;\r
        }\r
 \r
     \r
@@ -1893,6 +1916,7 @@ public class SyncRunner extends QObject implements Runnable {
     //* Linked notebook contents (from someone else's account)\r
     //*************************************************************\r
        private void syncLinkedNotebook(Client linkedNoteStore, LinkedNotebook book, int usn, int highSequence, String token) {\r
+               logger.log(logger.EXTREME, "Entering syncLinkedNotebook");\r
                if (ignoreLinkedNotebooks.contains(book.getGuid()))\r
                        return;\r
                List<Note> dirtyNotes = conn.getNoteTable().getDirtyLinkedNotes();\r
@@ -1915,12 +1939,16 @@ public class SyncRunner extends QObject implements Runnable {
                                // Expunge notes\r
                                syncExpungedNotes(chunk);\r
 \r
+                               logger.log(logger.EXTREME, "Syncing remote notes: " +chunk.getNotesSize());\r
                                syncRemoteNotes(linkedNoteStore, chunk.getNotes(), fullSync, linkedAuthResult.getAuthenticationToken());\r
+                               logger.log(logger.EXTREME, "Finding new linked tags");\r
                                findNewLinkedTags(linkedNoteStore, chunk.getNotes(), linkedAuthResult.getAuthenticationToken());\r
                                // Sync resources\r
+                               logger.log(logger.EXTREME, "Synchronizing tags: " +chunk.getTagsSize());\r
                                for (int i=0; i<chunk.getResourcesSize(); i++) {\r
                                        syncRemoteResource(linkedNoteStore, chunk.getResources().get(i), linkedAuthResult.getAuthenticationToken());\r
                                }\r
+                               logger.log(logger.EXTREME, "Synchronizing linked notebooks: " +chunk.getNotebooksSize());\r
                                syncRemoteLinkedNotebooks(linkedNoteStore, chunk.getNotebooks(), false, book);\r
                                syncLinkedTags(chunk.getTags(), book.getGuid());\r
                                \r
@@ -1929,6 +1957,7 @@ public class SyncRunner extends QObject implements Runnable {
                                        noteSignal.noteChanged.emit(chunk.getNotes().get(i).getGuid(), null);\r
 \r
                                // Expunge Notebook records\r
+                               logger.log(logger.EXTREME, "Expunging linked notebooks: " +chunk.getExpungedLinkedNotebooksSize());\r
                                for (int i=0; i<chunk.getExpungedLinkedNotebooksSize(); i++) {\r
                                        conn.getLinkedNotebookTable().expungeNotebook(chunk.getExpungedLinkedNotebooks().get(i), false);\r
                                }\r
@@ -1939,25 +1968,26 @@ public class SyncRunner extends QObject implements Runnable {
                                syncError = true;\r
                                status.message.emit(tr("EDAM UserException synchronizing linked notbook.  See the log for datails."));\r
                                e.printStackTrace();\r
-                               logger.log(logger.LOW, e.getMessage());\r
+                               logger.log(logger.LOW, tr("EDAM UserException synchronizing linked notbook ")+ e.getMessage());\r
                        } catch (EDAMSystemException e) {\r
                                syncError = true;\r
                                status.message.emit(tr("EDAM SystemException synchronizing linked notbook.  See the log for datails."));\r
                                e.printStackTrace();\r
-                               logger.log(logger.LOW, e.getMessage());\r
+                               logger.log(logger.LOW, tr("EDAM SystemException synchronizing linked notbook.  See the log for datails") +e.getMessage());\r
                        } catch (EDAMNotFoundException e) {\r
                                syncError = true;\r
-                               status.message.emit(tr("Notebook URL not found. Removing notobook " +book.getShareName()));\r
+                               status.message.emit(tr("Notebook URL not found. Removing notobook ") +book.getShareName());\r
                                conn.getNotebookTable().deleteLinkedTags(book.getGuid());\r
                                conn.getLinkedNotebookTable().expungeNotebook(book.getGuid(), false);\r
-                               logger.log(logger.LOW, e.getMessage());\r
+                               logger.log(logger.LOW, tr("Notebook URL not found. Removing notobook ") +e.getMessage());\r
                        } catch (TException e) {\r
                                syncError = true;\r
                                status.message.emit(tr("EDAM TException synchronizing linked notbook.  See the log for datails."));\r
                                e.printStackTrace();\r
-                               logger.log(logger.LOW, e.getMessage());\r
+                               logger.log(logger.LOW, tr("EDAM TException synchronizing linked notbook.  See the log for datails." )+e.getMessage());\r
                        }\r
                }\r
+               logger.log(logger.EXTREME, "leaving syncLinkedNotebook");\r
        }\r
        // Sync remote tags\r
        private void syncLinkedTags(List<Tag> tags, String notebookGuid) {\r