<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
- <classpathentry kind="lib" path="lib/evernote-api-1.20.jar"/>
+ <classpathentry kind="lib" path="lib/evernote-api-1.25.0.jar"/>
<classpathentry kind="lib" path="lib/h2-1.3.158.jar"/>
<classpathentry kind="lib" path="lib/libthrift.jar"/>
<classpathentry kind="lib" path="lib/log4j-1.2.14.jar"/>
<classpathentry kind="lib" path="lib/httpcore-4.1.jar"/>
<classpathentry kind="lib" path="lib/httpmime-4.1.1.jar"/>
<classpathentry kind="lib" path="lib/pdfbox-app-1.6.0.jar"/>
- <classpathentry kind="lib" path="/usr/local/Trolltech/qtjambi-linux32-lgpl-4.5.2_01/qtjambi-4.5.2_01.jar"/>
- <classpathentry kind="lib" path="/usr/local/Trolltech/qtjambi-linux32-lgpl-4.5.2_01/qtjambi-linux32-gcc-4.5.2_01.jar"/>
- <classpathentry kind="lib" path="/home/zigzag/workspace/NeighborNote/lib/scribe-1.3.0.jar"/>
+ <classpathentry kind="lib" path="C:/pleiades/scribe-1.3.0.jar"/>
+ <classpathentry kind="lib" path="C:/pleiades/qtjambi-win32-lgpl-4.5.2_01/qtjambi-4.5.2_01.jar"/>
+ <classpathentry kind="lib" path="C:/pleiades/qtjambi-win32-lgpl-4.5.2_01/qtjambi-win32-msvc2005-4.5.2_01.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
<pathelement location="${lib.dir}/commons-compress-1.2.jar"/>
<pathelement location="${lib.dir}/commons-lang3-3.0.jar"/>
<pathelement location="${lib.dir}/commons-logging-1.1.1.jar"/>
- <pathelement location="${lib.dir}/evernote-api-1.20.jar"/>
+ <pathelement location="${lib.dir}/evernote-api-1.25.0.jar"/>
<pathelement location="${lib.dir}/libthrift.jar"/>
<pathelement location="${lib.dir}/log4j-1.2.14.jar"/>
<pathelement location="${lib.dir}/h2-1.3.158.jar"/>
NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-compress-1.2.jar
NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-lang3-3.0.jar
NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-logging-1.1.1.jar
-NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/evernote-api-1.20.jar
+NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/evernote-api-1.25.0.jar
NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/h2-1.3.158.jar
NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/httpclient-4.1.1.jar
NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/httpcore-4.1.jar
set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\commons-compress-1.2.jar\r
set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\commons-lang3-3.0.jar\r
set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\commons-logging-1.1.1.jar\r
-set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\evernote-api-1.20.jar\r
+set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\evernote-api-1.25.0.jar\r
set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\h2-1.3.158.jar\r
set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\httpclient-4.1.1.jar\r
set NN_CLASSPATH=%NN_CLASSPATH%;%NEIGHBORNOTE%lib\httpcore-4.1.jar\r
NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-compress-1.2.jar
NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-lang3-3.0.jar
NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/commons-logging-1.1.1.jar
-NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/evernote-api-1.20.jar
+NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/evernote-api-1.25.0.jar
NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/h2-1.3.158.jar
NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/httpclient-4.1.1.jar
NN_CLASSPATH=$NN_CLASSPATH:$NEIGHBORNOTE/lib/httpcore-4.1.jar
settings.endGroup();
return value;
}
+
+ // Evernote関連ノート機能統合に対する重み付け
+ public static void setENRelatedNotesWeight(int weight) {
+ settings.beginGroup("RensoNoteList");
+ settings.setValue("enRelatedNotesWeight", weight);
+ settings.endGroup();
+ }
+ public static int getENRelatedNotesWeight() {
+ settings.beginGroup("RensoNoteList");
+ Integer value;
+ try {
+ String val = (String)settings.value("enRelatedNotesWeight", 10);
+ value = new Integer(val.trim());
+ } catch (Exception e) {
+ try {
+ value = (Integer)settings.value("enRelatedNotesWeight", 10);
+ } catch (Exception e1) {
+ value = 10;
+ }
+ }
+ settings.endGroup();
+ return value;
+ }
//*******************
// ノートのマージ・複製の関連ノートリストへの適用
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
-import org.apache.thrift.TException;
import org.h2.tools.ChangeFileEncryption;
import com.evernote.edam.error.EDAMNotFoundException;
import com.evernote.edam.type.SavedSearch;
import com.evernote.edam.type.Tag;
import com.evernote.edam.type.User;
+import com.evernote.thrift.TException;
import com.trolltech.qt.QThread;
import com.trolltech.qt.core.QByteArray;
import com.trolltech.qt.core.QDateTime;
import cx.fbn.nevernote.xml.ImportData;
import cx.fbn.nevernote.xml.ImportEnex;
import cx.fbn.nevernote.xml.NoteFormatter;
+//import org.apache.thrift.TException;
public class NeverNote extends QMainWindow{
// ICHANGED
// 連想ノートリストをセットアップ
- rensoNoteList = new RensoNoteList(conn, this);
+ rensoNoteList = new RensoNoteList(conn, this, syncRunner);
rensoNoteList.itemPressed.connect(this,
"rensoNoteItemPressed(QListWidgetItem)");
rensoNoteListDock = new QDockWidget(tr("Renso Note List"), this);
saveNote();
listManager.stop();
saveWindowState();
+
+ // 連想ノートリストのEvernote関連ノート取得スレッドを終了
+ rensoNoteList.stopThread();
if (tempFiles != null)
tempFiles.clear();
fromHistory.put(from, fromHistory.get(to));
fromHistory.put(to, fromHist);
}
+
+ // 連想ノートリストのgetter
+ public RensoNoteList getRensoNoteList() {
+ return rensoNoteList;
+ }
}
import com.trolltech.qt.gui.QPushButton;\r
import com.trolltech.qt.gui.QStackedWidget;\r
import com.trolltech.qt.gui.QVBoxLayout;\r
-import com.trolltech.qt.gui.QWidget;\r
\r
import cx.fbn.nevernote.Global;\r
+import cx.fbn.nevernote.NeverNote;\r
public class ConfigDialog extends QDialog {\r
private final QListWidget contentsWidget;\r
private final ConfigFontPage fontPage;\r
private final ConfigAppearancePage appearancePage;\r
private final ConfigSpellPage spellPage;\r
private final ConfigIndexPage indexPage;\r
- // ICHANGED\r
- private final ConfigRensoNoteListPage rensoNoteListPage;\r
+ private final ConfigRensoNoteListPage rensoNoteListPage;\r
+ private final NeverNote parent;\r
\r
private final String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
\r
- public ConfigDialog(QWidget parent) {\r
+ public ConfigDialog(NeverNote parent) {\r
+ this.parent = parent;\r
\r
contentsWidget = new QListWidget(this);\r
setWindowIcon(new QIcon(iconPath+"config.png"));\r
Global.setRensoItemClickWeight(rensoNoteListPage.getRensoItemClickWeight());
Global.setSameTagWeight(rensoNoteListPage.getSameTagWeight());
Global.setSameNotebookWeight(rensoNoteListPage.getSameNotebookWeight());\r
+ Global.setENRelatedNotesWeight(rensoNoteListPage.getENRelatedNotesWeight());\r
\r
// ICHANGED\r
Global.setMergeRensoNote(rensoNoteListPage.getMergeChecked());\r
Global.setVerifyExclude(rensoNoteListPage.getVerifyExcludeChecked());\r
Global.setRensoListItemMaximum(rensoNoteListPage.getRensoListItemMaximum());\r
\r
+ // 連想ノートリストをリフレッシュ\r
+ parent.getRensoNoteList().refreshRensoNoteList(parent.getCurrentNoteGuid());\r
+ \r
close();\r
}\r
\r
// Create icons used for navigating the page\r
public void createIcons() {\r
String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
-\r
\r
QListWidgetItem formatsButton = new QListWidgetItem(contentsWidget);\r
formatsButton.setText(tr("Appearance"));\r
private final QSlider rensoItemClickSlider;
private final QSlider sameTagSlider;
private final QSlider sameNotebookSlider;
+ private final QSlider enRelatedNotesSlider;
private final QSpinBox browseSpinner;
private final QSpinBox copyPasteSpinner;
private final QSpinBox sameTagSpinner;
private final QSpinBox sameNotebookSpinner;
private final QSpinBox rensoListItemMaximumSpinner;
+ private final QSpinBox enRelatedNotesSpinner;
private final QCheckBox mergeCheck;
private final QCheckBox duplicateCheck;
QHBoxLayout sameNotebookLayout = new QHBoxLayout();
sameNotebookLayout.addWidget(sameNotebookSlider);
- sameNotebookLayout.addWidget(sameNotebookSpinner);
+ sameNotebookLayout.addWidget(sameNotebookSpinner);
+ // enRelatedNotes
+ enRelatedNotesSlider = new QSlider();
+ enRelatedNotesSlider.setOrientation(Qt.Orientation.Horizontal);
+ enRelatedNotesSlider.setRange(0, 10);
+ enRelatedNotesSlider.setSingleStep(1);
+ enRelatedNotesSlider.setTickPosition(QSlider.TickPosition.TicksAbove);
+ enRelatedNotesSlider.setTickInterval(1);
+ enRelatedNotesSlider.setFocusPolicy(Qt.FocusPolicy.StrongFocus);
+
+ enRelatedNotesSpinner = new QSpinBox();
+ enRelatedNotesSpinner.setRange(0, 10);
+ enRelatedNotesSpinner.setSingleStep(1);
+
+ enRelatedNotesSlider.valueChanged.connect(enRelatedNotesSpinner, "setValue(int)");
+ enRelatedNotesSpinner.valueChanged.connect(enRelatedNotesSlider, "setValue(int)");
+ enRelatedNotesSpinner.setValue(Global.getENRelatedNotesWeight());
+
+ QHBoxLayout enRelatedNotesLayout = new QHBoxLayout();
+ enRelatedNotesLayout.addWidget(enRelatedNotesSlider);
+ enRelatedNotesLayout.addWidget(enRelatedNotesSpinner);
+
+ // 重み付け設定部分のレイアウト
QFormLayout styleLayout = new QFormLayout();
styleLayout.setHorizontalSpacing(10);
styleLayout.setVerticalSpacing(30);
styleLayout.addRow(tr("Renso Item Click Weight"), rensoItemClickLayout);
styleLayout.addRow(tr("Same Tag Weight"), sameTagLayout);
styleLayout.addRow(tr("Same Notebook Weight"), sameNotebookLayout);
+ styleLayout.addRow(tr("Evernote Related Notes Integration"), enRelatedNotesLayout);
QGroupBox weightingGroup = new QGroupBox(tr("Weighting"));
weightingGroup.setLayout(styleLayout);
public int getSameNotebookWeight() {
return sameNotebookSpinner.value();
}
+
+ //*****************************************
+ //* Evernote Related Notes Integration Weight
+ //*****************************************
+ public int getENRelatedNotesWeight() {
+ return enRelatedNotesSpinner.value();
+ }
//*****************************************
//* Merge Check
import java.util.ArrayList;\r
import java.util.List;\r
\r
-import org.apache.thrift.TException;\r
-\r
import com.evernote.edam.error.EDAMNotFoundException;\r
import com.evernote.edam.error.EDAMSystemException;\r
import com.evernote.edam.error.EDAMUserException;\r
import com.evernote.edam.type.Notebook;\r
import com.evernote.edam.type.SharedNotebook;\r
+import com.evernote.thrift.TException;\r
import com.trolltech.qt.core.QModelIndex;\r
import com.trolltech.qt.core.Qt.ItemFlag;\r
import com.trolltech.qt.core.Qt.ItemFlags;\r
\r
import cx.fbn.nevernote.sql.DatabaseConnection;\r
import cx.fbn.nevernote.threads.SyncRunner;\r
+//import org.apache.thrift.TException;\r
\r
public class ShareNotebook extends QDialog {\r
private final QPushButton okButton;\r
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;
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;
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>();
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;
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);
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");
}
// 操作回数に重み付けする
}
}
+ // 連想ノートリストを再描画
+ 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>();
return mergedHistory;
}
+ // 連想ノートリストにハッシュマップのデータを追加
private void addRensoNoteList(HashMap<String, Integer> History){
String currentNoteGuid = new String(parent.getCurrentNoteGuid());
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;
+ }
}
--- /dev/null
+/*
+ * This file is part of NeighborNote
+ * Copyright 2013 Yuki Takahashi
+ *
+ * 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.signals;
+
+import com.trolltech.qt.QSignalEmitter;
+
+public class ENRelatedNotesSignal extends QSignalEmitter {
+ public Signal0 getENRelatedNotesFinished = new Signal0();
+}
--- /dev/null
+/*
+ * This file is part of NeighborNote
+ * Copyright 2013 Yuki Takahashi
+ *
+ * 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.threads;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import com.evernote.edam.error.EDAMNotFoundException;
+import com.evernote.edam.error.EDAMSystemException;
+import com.evernote.edam.error.EDAMUserException;
+import com.evernote.edam.limits.Constants;
+import com.evernote.edam.notestore.RelatedQuery;
+import com.evernote.edam.notestore.RelatedResult;
+import com.evernote.edam.notestore.RelatedResultSpec;
+import com.evernote.edam.type.Note;
+import com.evernote.thrift.TException;
+import com.trolltech.qt.core.QMutex;
+import com.trolltech.qt.core.QObject;
+
+import cx.fbn.nevernote.Global;
+import cx.fbn.nevernote.signals.ENRelatedNotesSignal;
+import cx.fbn.nevernote.utilities.ApplicationLogger;
+import cx.fbn.nevernote.utilities.Pair;
+
+public class ENRelatedNotesRunner extends QObject implements Runnable{
+
+ private final ApplicationLogger logger;
+ private final SyncRunner syncRunner;
+ public volatile ENRelatedNotesSignal enRelatedNotesSignal;
+ public QMutex mutex;
+ private volatile boolean keepRunning;
+ private volatile LinkedBlockingQueue<String> workQueue;
+ private volatile LinkedBlockingQueue<Pair<String, List<String>>> resultQueue; // ペア<元ノートguid, 関連ノートguidリスト>を溜めておくキュー
+
+ public ENRelatedNotesRunner(SyncRunner syncRunner, ApplicationLogger logger) {
+ this.logger = logger;
+ this.syncRunner = syncRunner;
+ this.enRelatedNotesSignal = new ENRelatedNotesSignal();
+ this.mutex = new QMutex();
+ this.keepRunning = true;
+ this.workQueue = new LinkedBlockingQueue<String>();
+ this.resultQueue = new LinkedBlockingQueue<Pair<String, List<String>>>();
+ }
+
+ @Override
+ public void run() {
+ thread().setPriority(Thread.MIN_PRIORITY);
+
+ logger.log(logger.MEDIUM, "ENRelatedNotesスレッド開始");
+ while (keepRunning) {
+ try {
+ String work = workQueue.take();
+ mutex.lock();
+ if (work.startsWith("GET")) {
+ String guid = work.replace("GET ", "");
+ logger.log(logger.EXTREME, "Evernote関連ノート取得開始 guid = " + guid);
+
+ List<Note> relatedNotes = getENRelatedNotes(guid);
+
+ Pair<String, List<String>> resultPair = new Pair<String, List<String>>();
+ resultPair.setFirst(guid);
+ if (relatedNotes == null) { // 取得に失敗
+ logger.log(logger.EXTREME, "Evernote関連ノートの取得に失敗");
+ } else if (relatedNotes.isEmpty()) { // このノートにEvernote関連ノートは存在しない
+ logger.log(logger.EXTREME, "Evernote関連ノートの取得に成功 関連ノートは存在しなかった");
+ resultPair.setSecond(new ArrayList<String>());
+ } else { // Evernote関連ノートが存在する
+ logger.log(logger.EXTREME, "Evernote関連ノートの取得に成功 関連ノートは存在した");
+ List<String> relatedNoteGuids = new ArrayList<String>();
+ for (Note relatedNote : relatedNotes) {
+ relatedNoteGuids.add(relatedNote.getGuid());
+ }
+ resultPair.setSecond(relatedNoteGuids);
+ }
+
+ resultQueue.offer(resultPair);
+ enRelatedNotesSignal.getENRelatedNotesFinished.emit();
+ logger.log(logger.EXTREME, "Evernote関連ノート取得完了 guid = " + guid);
+ } else if (work.startsWith("STOP")) {
+ logger.log(logger.MEDIUM, "ENRelatedNotesスレッド停止");
+ keepRunning = false;
+ }
+ mutex.unlock();
+ } catch (InterruptedException e) {
+ // TODO 自動生成された catch ブロック
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private List<Note> getENRelatedNotes(String guid) {
+ RelatedResult result = getENRelatedResult(guid);
+ List<Note> relatedNotes = new ArrayList<Note>();
+
+ if (result != null) {
+ relatedNotes = result.getNotes();
+ return relatedNotes;
+ }
+
+ return null;
+ }
+
+ private RelatedResult getENRelatedResult(String guid) {
+ if (!Global.isConnected) {
+ return null;
+ }
+
+ 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) {
+ logger.log(logger.HIGH, "Evernote関連ノート取得中に例外発生:EDAMUserException");
+ } catch (EDAMSystemException e) {
+ logger.log(logger.HIGH, "Evernote関連ノート取得中に例外発生:EDAMSystemException");
+ } catch (EDAMNotFoundException e) {
+ logger.log(logger.HIGH, "Evernote関連ノート取得中に例外発生:EDAMnotFoundException guid = " + guid);
+ } catch (TException e) {
+ logger.log(logger.HIGH, "Evernote関連ノート取得中に例外発生:TException");
+ }
+ }
+ return null;
+ }
+
+ public boolean isKeepRunning() {
+ return keepRunning;
+ }
+
+ public void setKeepRunning(boolean keepRunning) {
+ this.keepRunning = keepRunning;
+ }
+
+ public synchronized boolean addGuid(String guid) {
+ if (workQueue.offer("GET " + guid)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ public synchronized boolean addStop() {
+ if (workQueue.offer("STOP")) {
+ return true;
+ }
+ return false;
+ }
+
+ public synchronized Pair<String, List<String>> getENRelatedNoteGuids() {
+ try {
+ return resultQueue.take();
+ } catch (InterruptedException e) {
+ // TODO 自動生成された catch ブロック
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+}
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
-import org.apache.thrift.TException;
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.transport.THttpClient;
-import org.apache.thrift.transport.TTransportException;
import com.evernote.edam.error.EDAMNotFoundException;
import com.evernote.edam.error.EDAMSystemException;
import com.evernote.edam.type.User;
import com.evernote.edam.userstore.AuthenticationResult;
import com.evernote.edam.userstore.UserStore;
+import com.evernote.thrift.TException;
+import com.evernote.thrift.protocol.TBinaryProtocol;
+import com.evernote.thrift.transport.THttpClient;
+import com.evernote.thrift.transport.TTransportException;
import com.trolltech.qt.core.QByteArray;
import com.trolltech.qt.core.QFile;
import com.trolltech.qt.core.QIODevice.OpenModeFlag;
import cx.fbn.nevernote.sql.DatabaseConnection;
import cx.fbn.nevernote.sql.DeletedItemRecord;
import cx.fbn.nevernote.utilities.ApplicationLogger;
+//import org.apache.thrift.transport.THttpClient;
+//import org.apache.thrift.transport.TTransportException;
+//import org.apache.thrift.protocol.TBinaryProtocol;
+//import org.apache.thrift.TException;
public class SyncRunner extends QObject implements Runnable {
public volatile String username = "";
public volatile String password = "";
public volatile String userStoreUrl;
-// private final static String consumerKey = "baumgarte";
-// private final static String consumerSecret = "eb8b5740e17cb55f";
public String noteStoreUrlBase;
private THttpClient userStoreTrans;
private TBinaryProtocol userStoreProt;
}
userStoreProt = new TBinaryProtocol(userStoreTrans);
userStore = new UserStore.Client(userStoreProt, userStoreProt);
+
syncSignal.saveUserStore.emit(userStore);
try {
//authResult = userStore.authenticate(username, password, consumerKey, consumerSecret);