OSDN Git Service

Evernote関連ノート取得スレッドにLoggerを追加。
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / gui / RensoNoteList.java
index c5d97a6..9355541 100644 (file)
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Set;
 
 import com.evernote.edam.type.Note;
+import com.trolltech.qt.QThread;
 import com.trolltech.qt.core.QSize;
 import com.trolltech.qt.core.Qt.MouseButton;
 import com.trolltech.qt.gui.QAction;
@@ -39,7 +40,10 @@ import com.trolltech.qt.gui.QMenu;
 import cx.fbn.nevernote.Global;
 import cx.fbn.nevernote.NeverNote;
 import cx.fbn.nevernote.sql.DatabaseConnection;
+import cx.fbn.nevernote.threads.ENRelatedNotesRunner;
+import cx.fbn.nevernote.threads.SyncRunner;
 import cx.fbn.nevernote.utilities.ApplicationLogger;
+import cx.fbn.nevernote.utilities.Pair;
 
 public class RensoNoteList extends QListWidget {
        private final DatabaseConnection conn;
@@ -47,22 +51,37 @@ public class RensoNoteList extends QListWidget {
        private final HashMap<QListWidgetItem, String> rensoNoteListItems;
        private final List<RensoNoteListItem> rensoNoteListTrueItems;
        private String rensoNotePressedItemGuid;
-       
        private final QAction openNewTabAction;
        private final QAction starAction;
        private final QAction unstarAction;
        private final QAction excludeNoteAction;
        private final NeverNote parent;
        private final QMenu menu;
+       private HashMap<String, Integer> mergedHistory;                         // マージされた操作履歴
+       private final SyncRunner syncRunner;
+       private final ENRelatedNotesRunner enRelatedNotesRunner;
+       private final QThread enRelatedNotesThread;
+       private final HashMap<String, List<String>> enRelatedNotesCache;        // Evernote関連ノートのキャッシュ<guid, 関連ノートリスト>
+       private String guid;
        private int allPointSum;
 
-       public RensoNoteList(DatabaseConnection c, NeverNote p) {
+       public RensoNoteList(DatabaseConnection c, NeverNote p, SyncRunner syncRunner) {
                logger = new ApplicationLogger("rensoNoteList.log");
                logger.log(logger.HIGH, "Setting up rensoNoteList");
                allPointSum = 0;
 
-               conn = c;
+               this.conn = c;
                this.parent = p;
+               this.syncRunner = syncRunner;
+               
+               this.guid = new String();
+               mergedHistory = new HashMap<String, Integer>();
+               enRelatedNotesCache = new HashMap<String, List<String>>();
+               this.enRelatedNotesRunner = new ENRelatedNotesRunner(this.syncRunner, logger);
+               this.enRelatedNotesRunner.enRelatedNotesSignal.getENRelatedNotesFinished.connect(this, "enRelatedNotesComplete()");
+               this.enRelatedNotesThread = new QThread(enRelatedNotesRunner, "ENRelatedNotes Thread");
+               this.enRelatedNotesThread.start();
+               
                rensoNoteListItems = new HashMap<QListWidgetItem, String>();
                rensoNoteListTrueItems = new ArrayList<RensoNoteListItem>();
                
@@ -94,12 +113,14 @@ public class RensoNoteList extends QListWidget {
                logger.log(logger.HIGH, "rensoNoteList setup complete");
        }
 
+       // 連想ノートリストをリフレッシュ
        public void refreshRensoNoteList(String guid) {
                logger.log(logger.HIGH, "Entering RensoNoteList.refreshRensoNoteList");
 
                this.clear();
                rensoNoteListItems.clear();
                rensoNoteListTrueItems.clear();
+               mergedHistory = new HashMap<String, Integer>();
 
                if (!this.isEnabled()) {
                        return;
@@ -107,13 +128,31 @@ public class RensoNoteList extends QListWidget {
                if (guid == null || guid.equals("")) {
                        return;
                }
-
-               HashMap<String, Integer> mergedHistory = new HashMap<String, Integer>();
                
+               this.guid = guid;
+               // すでにEvernote関連ノートがキャッシュされているか確認
+               boolean isCached;
+               isCached = enRelatedNotesCache.containsKey(guid);
+               if (!isCached) {        // キャッシュ無し
+                       // Evernoteの関連ノートを別スレッドで取得させる
+                       enRelatedNotesRunner.addGuid(guid);
+               } else {                        // キャッシュ有り
+                       List<String> relatedNoteGuids = enRelatedNotesCache.get(guid);
+                       addENRelatedNotes(relatedNoteGuids);
+               }
+               
+               calculateHistory(guid);
+               repaintRensoNoteList(false);
+
+               logger.log(logger.HIGH, "Leaving RensoNoteList.refreshRensoNoteList");
+       }
+       
+       // 操作履歴をデータベースから取得してノートごとの関連度を算出、その後mergedHistoryに追加
+       private void calculateHistory(String guid) {
                // browseHistory<guid, 回数(ポイント)>
                HashMap<String, Integer> browseHistory = conn.getHistoryTable().getBehaviorHistory("browse", guid);
                addWeight(browseHistory, Global.getBrowseWeight());
-               mergedHistory = mergeHistory(browseHistory, new HashMap<String, Integer>());
+               mergedHistory = mergeHistory(browseHistory, mergedHistory);
                
                // copy&pasteHistory<guid, 回数(ポイント)>
                HashMap<String, Integer> copyAndPasteHistory = conn.getHistoryTable().getBehaviorHistory("copy & paste", guid);
@@ -139,16 +178,6 @@ public class RensoNoteList extends QListWidget {
                HashMap<String, Integer> sameNotebookHistory = conn.getHistoryTable().getBehaviorHistory("sameNotebook", guid);
                addWeight(sameNotebookHistory, Global.getSameNotebookWeight());
                mergedHistory = mergeHistory(sameNotebookHistory, mergedHistory);
-               
-               // すべての関連ポイントの合計を取得(関連度のパーセント算出に利用)
-               allPointSum = 0;
-               for (int p : mergedHistory.values()) {
-                       allPointSum += p;
-               }
-               
-               addRensoNoteList(mergedHistory);
-
-               logger.log(logger.HIGH, "Leaving RensoNoteList.refreshRensoNoteList");
        }
        
        // 操作回数に重み付けする
@@ -161,6 +190,27 @@ public class RensoNoteList extends QListWidget {
                }
        }
        
+       // 連想ノートリストを再描画
+       private void repaintRensoNoteList(boolean needClear) {
+               if (needClear) {
+                       this.clear();
+                       rensoNoteListItems.clear();
+                       rensoNoteListTrueItems.clear();
+               }
+               
+               if (!this.isEnabled()) {
+                       return;
+               }
+               
+               // すべての関連ポイントの合計を取得(関連度のパーセント算出に利用)
+               allPointSum = 0;
+               for (int p : mergedHistory.values()) {
+                       allPointSum += p;
+               }
+               
+               addRensoNoteList(mergedHistory);
+       }
+       
        // 引数1と引数2をマージしたハッシュマップを返す
        private HashMap<String, Integer> mergeHistory(HashMap<String, Integer> History1, HashMap<String, Integer> History2){
                HashMap<String, Integer> mergedHistory = new HashMap<String, Integer>();
@@ -181,6 +231,7 @@ public class RensoNoteList extends QListWidget {
                return mergedHistory;
        }
        
+       // 連想ノートリストにハッシュマップのデータを追加
        private void addRensoNoteList(HashMap<String, Integer> History){
                String currentNoteGuid = new String(parent.getCurrentNoteGuid());
                
@@ -311,4 +362,51 @@ public class RensoNoteList extends QListWidget {
                        rensoNotePressedItemGuid = getNoteGuid(current);
                }
        }
+       
+       // Evernoteの関連ノートの取得が完了
+       @SuppressWarnings("unused")
+       private void enRelatedNotesComplete() {
+               Pair<String, List<String>> enRelatedNoteGuidPair = enRelatedNotesRunner.getENRelatedNoteGuids();        // <元ノートguid, 関連ノートguidリスト>
+               
+               if (enRelatedNoteGuidPair == null) {
+                       return;
+               }
+               
+               String sourceGuid = enRelatedNoteGuidPair.getFirst();
+               List<String> enRelatedNoteGuids = enRelatedNoteGuidPair.getSecond();
+               
+               
+               if (sourceGuid != null && !sourceGuid.equals("") && enRelatedNoteGuids != null) {       // Evernote関連ノートがnullでなければ
+                       // まずキャッシュに追加
+                       enRelatedNotesCache.put(sourceGuid, enRelatedNoteGuids);
+                       
+                       if (!enRelatedNoteGuids.isEmpty()) {    // Evernote関連ノートが存在していて
+                               if (sourceGuid.equals(this.guid)) {     // 取得したデータが今開いているノートの関連ノートなら
+                                       // mergedHistoryにEvernote関連ノートを追加してから再描画
+                                       addENRelatedNotes(enRelatedNoteGuids);
+                                       repaintRensoNoteList(true);
+                               }
+                       }
+               }
+       }
+       
+       // Evernote関連ノートの関連度情報をmergedHistoryに追加
+       private void addENRelatedNotes(List<String> relatedNoteGuids) {
+               // Evernote関連ノート<guid, 関連ポイント>
+               HashMap<String, Integer> enRelatedNotes = new HashMap<String, Integer>();
+               
+               for (String relatedGuid : relatedNoteGuids) {
+                       enRelatedNotes.put(relatedGuid, Global.getENRelatedNotesWeight());
+               }
+               
+               mergedHistory = mergeHistory(enRelatedNotes, mergedHistory);
+       }
+       
+       // Evernoteの関連ノート取得スレッドを終了させる
+       public boolean stopThread() {
+               if (enRelatedNotesRunner.addStop()) {
+                       return true;
+               }
+               return false;
+       }
 }