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;
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 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, SyncRunner syncRunner) {
- logger = new ApplicationLogger("rensoNoteList.log");
- logger.log(logger.HIGH, "Setting up rensoNoteList");
+ public RensoNoteList(DatabaseConnection c, NeverNote p, SyncRunner syncRunner, ApplicationLogger logger) {
+ this.logger = logger;
+ this.logger.log(this.logger.HIGH, "Setting up rensoNoteList");
allPointSum = 0;
this.conn = c;
this.parent = p;
this.syncRunner = syncRunner;
- this.ENRelatedNotesRunner = new ENRelatedNotesRunner(this.syncRunner);
- this.ENRelatedNotesRunner.ENRelatedNotesSignal.getENRelatedNotesFinished.connect(this, "ENRelatedNotesComplete()");
- this.ENRelatedNotesThread = new QThread(ENRelatedNotesRunner, "ENRelatedNotes Thread");
- this.ENRelatedNotesThread.start();
+ this.guid = new String();
+ mergedHistory = new HashMap<String, Integer>();
+ enRelatedNotesCache = new HashMap<String, List<String>>();
+ this.enRelatedNotesRunner = new ENRelatedNotesRunner(this.syncRunner, this.logger);
+ this.enRelatedNotesRunner.enRelatedNotesSignal.getENRelatedNotesFinished.connect(this, "enRelatedNotesComplete()");
+ this.enRelatedNotesThread = new QThread(enRelatedNotesRunner, "ENRelatedNotes Thread");
+ this.getEnRelatedNotesThread().start();
rensoNoteListItems = new HashMap<QListWidgetItem, String>();
rensoNoteListTrueItems = new ArrayList<RensoNoteListItem>();
menu.addAction(excludeNoteAction);
menu.aboutToHide.connect(this, "contextMenuHidden()");
- logger.log(logger.HIGH, "rensoNoteList setup complete");
+ this.logger.log(this.logger.HIGH, "rensoNoteList setup complete");
+ }
+
+ // オーバーロード
+ // 現在開いているノートの連想ノートリストをリフレッシュ
+ public void refreshRensoNoteList() {
+ refreshRensoNoteList(guid);
}
+ // 連想ノートリストをリフレッシュ
public void refreshRensoNoteList(String guid) {
- logger.log(logger.HIGH, "Entering RensoNoteList.refreshRensoNoteList");
+ logger.log(logger.HIGH, "Entering RensoNoteList.refreshRensoNoteList guid = " + guid);
this.clear();
rensoNoteListItems.clear();
rensoNoteListTrueItems.clear();
+ mergedHistory = new HashMap<String, Integer>();
if (!this.isEnabled()) {
return;
if (guid == null || guid.equals("")) {
return;
}
-
- HashMap<String, Integer> mergedHistory = new HashMap<String, Integer>();
- // Evernoteの関連ノートを別スレッドで取得
- ENRelatedNotesRunner.addGuid(guid);
-// ENRelatedNotesRunner.setGuid(guid);
-// ENRelatedNotesThread.finished.connect(this, "ENRelatedNotesComplete()");
-
-// RelatedResult result = getENRelatedNotes(guid);
-// List<Note> relatedNotes = new ArrayList<Note>();
-// if (result != null) {
-// relatedNotes = result.getNotes();
-// }
-// if (relatedNotes != null && !relatedNotes.isEmpty()) {
-// HashMap<String, Integer> ENRelatedNotes = new HashMap<String, Integer>();
-//
-// for (Note relatedNote : relatedNotes) {
-// String relatedGuid = relatedNote.getGuid();
-// ENRelatedNotes.put(relatedGuid, 1);
-// }
-// addWeight(ENRelatedNotes, 10);
-// mergedHistory = mergeHistory(ENRelatedNotes, mergedHistory);
-// }
+ 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) {
+ logger.log(logger.EXTREME, "Entering RensoNoteList.calculateHistory guid = " + 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);
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");
+ logger.log(logger.EXTREME, "Leaving RensoNoteList.calculateHistory");
}
-// private RelatedResult getENRelatedNotes(String guid) {
-// RelatedQuery rquery = new RelatedQuery();
-// rquery.setNoteGuid(guid);
-// RelatedResultSpec resultSpec = new RelatedResultSpec();
-// resultSpec.setMaxNotes(Constants.EDAM_RELATED_MAX_NOTES);
-// if (syncRunner != null && syncRunner.localNoteStore != null) {
-// try {
-// RelatedResult result = syncRunner.localNoteStore.findRelated(syncRunner.authToken, rquery, resultSpec);
-// return result;
-// } catch (EDAMUserException e) {
-// // TODO 自動生成された catch ブロック
-// e.printStackTrace();
-// } catch (EDAMSystemException e) {
-// // TODO 自動生成された catch ブロック
-// e.printStackTrace();
-// } catch (EDAMNotFoundException e) {
-// // TODO 自動生成された catch ブロック
-// e.printStackTrace();
-// } catch (TException e) {
-// // TODO 自動生成された catch ブロック
-// e.printStackTrace();
-// }
-// }
-// return null;
-// }
-
// 操作回数に重み付けする
private void addWeight(HashMap<String, Integer> history, int weight){
+ logger.log(logger.EXTREME, "Entering RensoNoteList.addWeight");
+
Set<String> keySet = history.keySet();
Iterator<String> hist_iterator = keySet.iterator();
while(hist_iterator.hasNext()){
String key = hist_iterator.next();
history.put(key, history.get(key) * weight);
}
+
+ logger.log(logger.EXTREME, "Leaving RensoNoteList.addWeight");
+ }
+
+ // 連想ノートリストを再描画
+ private void repaintRensoNoteList(boolean needClear) {
+ logger.log(logger.EXTREME, "Entering RensoNoteList.repaintRensoNoteList");
+
+ if (needClear) {
+ this.clear();
+ rensoNoteListItems.clear();
+ rensoNoteListTrueItems.clear();
+ }
+
+ if (!this.isEnabled()) {
+ return;
+ }
+
+ // すべての関連ポイントの合計を取得(関連度のパーセント算出に利用)
+ allPointSum = 0;
+ for (int p : mergedHistory.values()) {
+ allPointSum += p;
+ }
+
+ addRensoNoteList(mergedHistory);
+
+ logger.log(logger.EXTREME, "Leaving RensoNoteList.repaintRensoNoteList");
}
// 引数1と引数2をマージしたハッシュマップを返す
private HashMap<String, Integer> mergeHistory(HashMap<String, Integer> History1, HashMap<String, Integer> History2){
+ logger.log(logger.EXTREME, "Entering RensoNoteList.mergeHistory");
+
HashMap<String, Integer> mergedHistory = new HashMap<String, Integer>();
mergedHistory.putAll(History1);
mergedHistory.put(key, History2.get(key));
}
}
-
+
+ logger.log(logger.EXTREME, "Leaving RensoNoteList.mergeHistory");
return mergedHistory;
}
+ // 連想ノートリストにハッシュマップのデータを追加
private void addRensoNoteList(HashMap<String, Integer> History){
+ logger.log(logger.EXTREME, "Entering RensoNoteList.addRensoNoteList");
+
String currentNoteGuid = new String(parent.getCurrentNoteGuid());
// スター付きノートとスター無しノートを分ける
}
}
}
+ logger.log(logger.EXTREME, "Leaving RensoNoteList.addRensoNoteList");
}
// リストのアイテムから対象ノートのguidを取得
// 関連ノートリストの右クリックメニュー
@Override
public void contextMenuEvent(QContextMenuEvent event){
+ logger.log(logger.EXTREME, "Entering RensoNoteList.contextMenuEvent");
+
if (rensoNotePressedItemGuid == null || rensoNotePressedItemGuid.equals("")) {
return;
}
menu.exec(event.globalPos());
rensoNotePressedItemGuid = null;
+
+ logger.log(logger.EXTREME, "Leaving RensoNoteList.contextMenuEvent");
}
// コンテキストメニューが表示されているかどうか
// ユーザが連想ノートリストのアイテムを選択した時の処理
@SuppressWarnings("unused")
private void rensoNoteItemPressed(QListWidgetItem current) {
+ logger.log(logger.HIGH, "Entering RensoNoteList.rensoNoteItemPressed");
+
rensoNotePressedItemGuid = null;
// 右クリックだったときの処理
if (QApplication.mouseButtons().isSet(MouseButton.RightButton)) {
rensoNotePressedItemGuid = getNoteGuid(current);
}
+
+ logger.log(logger.HIGH, "Leaving RensoNoteList.rensoNoteItemPressed");
}
// Evernoteの関連ノートの取得が完了
@SuppressWarnings("unused")
- private void ENRelatedNotesComplete() {
-// List<String> relatedNoteGuids = ENRelatedNotesRunner.getRelatedGuids();
- List<String> relatedNoteGuids = ENRelatedNotesRunner.getENRelatedNoteGuids();
- System.out.println(relatedNoteGuids);
+ private void enRelatedNotesComplete() {
+ logger.log(logger.HIGH, "Entering RensoNoteList.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);
+ }
+ }
+ }
+
+ logger.log(logger.HIGH, "Leaving RensoNoteList.enRelatedNotesComplete");
+ }
+
+ // Evernote関連ノートの関連度情報をmergedHistoryに追加
+ private void addENRelatedNotes(List<String> relatedNoteGuids) {
+ logger.log(logger.EXTREME, "Entering RensoNoteList.addENRelatedNotes");
+
+ // Evernote関連ノート<guid, 関連ポイント>
+ HashMap<String, Integer> enRelatedNotes = new HashMap<String, Integer>();
+
+ for (String relatedGuid : relatedNoteGuids) {
+ enRelatedNotes.put(relatedGuid, Global.getENRelatedNotesWeight());
+ }
+
+ mergedHistory = mergeHistory(enRelatedNotes, mergedHistory);
+
+ logger.log(logger.EXTREME, "Leaving RensoNoteList.addENRelatedNotes");
}
// Evernoteの関連ノート取得スレッドを終了させる
- public void stopThread() {
- ENRelatedNotesRunner.setKeepRunning(false);
- // TODO keepRunningをfalseにしても、guidQueueが次のキューが来るまで待機するので終了できない。guidQueueに終了命令を処理できる仕組みを要追加。
+ public boolean stopThread() {
+ logger.log(logger.HIGH, "Entering RensoNoteList.stopThread");
+
+ if (enRelatedNotesRunner.addStop()) {
+ logger.log(logger.HIGH, "RensoNoteList.stopThread succeeded");
+ return true;
+ }
+ logger.log(logger.HIGH, "RensoNoteList.stopThread failed");
+ return false;
+ }
+
+ public QThread getEnRelatedNotesThread() {
+ return enRelatedNotesThread;
+ }
+
+ public String getGuid() {
+ return guid;
}
}