OSDN Git Service

loggerを修正した
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / threads / ENRelatedNotesRunner.java
index 0240b45..dab861a 100644 (file)
@@ -1,9 +1,29 @@
+/*
+ * 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.EDAMErrorCode;
 import com.evernote.edam.error.EDAMNotFoundException;
 import com.evernote.edam.error.EDAMSystemException;
 import com.evernote.edam.error.EDAMUserException;
@@ -16,48 +36,72 @@ 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.signals.LimitSignal;
+import cx.fbn.nevernote.utilities.ApplicationLogger;
+import cx.fbn.nevernote.utilities.Pair;
 
 public class ENRelatedNotesRunner extends QObject implements Runnable{
-       private final SyncRunner syncRunner;
-//     public volatile Signal0 getENRelatedNotesFinished;
-       public volatile ENRelatedNotesSignal ENRelatedNotesSignal;
-//     private List<String> relatedNoteGuids;
-       public QMutex mutex;
-       private volatile boolean keepRunning;
-       private volatile LinkedBlockingQueue<String> guidQueue;
-       private volatile LinkedBlockingQueue<List<String>> resultQueue;
        
-       public ENRelatedNotesRunner(SyncRunner syncRunner) {
+       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 volatile LimitSignal                                     limitSignal;
+       
+       public ENRelatedNotesRunner(SyncRunner syncRunner, String logname) {
+               this.logger = new ApplicationLogger(logname);
                this.syncRunner = syncRunner;
-//             this.relatedNoteGuids = new ArrayList<String>();
-//             this.getENRelatedNotesFinished = new Signal0();
-               this.ENRelatedNotesSignal = new ENRelatedNotesSignal();
+               this.enRelatedNotesSignal = new ENRelatedNotesSignal();
                this.mutex = new QMutex();
                this.keepRunning = true;
-               this.guidQueue = new LinkedBlockingQueue<String>();
-               this.resultQueue = new LinkedBlockingQueue<List<String>>();
+               this.workQueue = new LinkedBlockingQueue<String>();
+               this.resultQueue = new LinkedBlockingQueue<Pair<String, List<String>>>();
+               this.limitSignal = new LimitSignal();
        }
 
        @Override
        public void run() {
                thread().setPriority(Thread.MIN_PRIORITY);
                
+               logger.log(logger.MEDIUM, "ENRelatedNotesスレッド開始");
                while (keepRunning) {
                        try {
-                               String guid = guidQueue.take();
-                               List<String> relatedNoteGuids = new ArrayList<String>();
+                               String work = workQueue.take();
                                mutex.lock();
-                       
-                               List<Note> relatedNotes = getENRelatedNotes(guid);
-                               if (relatedNotes != null && !relatedNotes.isEmpty()) {
-                                       for (Note relatedNote : relatedNotes) {
-                                               relatedNoteGuids.add(relatedNote.getGuid());
+                               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;
                                }
-                               
-                               resultQueue.offer(relatedNoteGuids);
-                               ENRelatedNotesSignal.getENRelatedNotesFinished.emit();
                                mutex.unlock();
                        } catch (InterruptedException e) {
                                // TODO 自動生成された catch ブロック
@@ -72,12 +116,17 @@ public class ENRelatedNotesRunner extends QObject implements Runnable{
                
                if (result != null) {
                        relatedNotes = result.getNotes();
+                       return relatedNotes;
                }
                
-               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();
@@ -87,17 +136,16 @@ public class ENRelatedNotesRunner extends QObject implements Runnable{
                                RelatedResult result = syncRunner.localNoteStore.findRelated(syncRunner.authToken, rquery, resultSpec);
                                return result;
                        } catch (EDAMUserException e) {
-                               // TODO 自動生成された catch ブロック
-                               e.printStackTrace();
+                               logger.log(logger.HIGH, "Evernote関連ノート取得中に例外発生:EDAMUserException");
                        } catch (EDAMSystemException e) {
-                               // TODO 自動生成された catch ブロック
-                               e.printStackTrace();
+                               if (e.getErrorCode() == EDAMErrorCode.RATE_LIMIT_REACHED) {
+                                       limitSignal.rateLimitReached.emit(e.getRateLimitDuration());
+                               }
+                               logger.log(logger.HIGH, "Evernote関連ノート取得中に例外発生:EDAMSystemException");
                        } catch (EDAMNotFoundException e) {
-                               // TODO 自動生成された catch ブロック
-                               e.printStackTrace();
+                               logger.log(logger.HIGH, "Evernote関連ノート取得中に例外発生:EDAMnotFoundException guid = " + guid);
                        } catch (TException e) {
-                               // TODO 自動生成された catch ブロック
-                               e.printStackTrace();
+                               logger.log(logger.HIGH, "Evernote関連ノート取得中に例外発生:TException");
                        }
                }
                return null;
@@ -111,15 +159,22 @@ public class ENRelatedNotesRunner extends QObject implements Runnable{
                this.keepRunning = keepRunning;
        }
        
-       public synchronized boolean addGuid(String guid) {
-               if (guidQueue.offer(guid)) {
+       public boolean addGuid(String guid) {
+               if (workQueue.offer("GET " + guid)) {
                        return true;
                }
                
                return false;
        }
        
-       public synchronized List<String> getENRelatedNoteGuids() {
+       public boolean addStop() {
+               if (workQueue.offer("STOP")) {
+                       return true;
+               }
+               return false;
+       }
+       
+       public synchronized Pair<String, List<String>> getENRelatedNoteGuids() {
                try {
                        return resultQueue.take();
                } catch (InterruptedException e) {