2 * This file is part of NixNote
\r
3 * Copyright 2009 Randy Baumgarte
\r
5 * This file may be licensed under the terms of of the
\r
6 * GNU General Public License Version 2 (the ``GPL'').
\r
8 * Software distributed under the License is distributed
\r
9 * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
\r
10 * express or implied. See the GPL for the specific language
\r
11 * governing rights and limitations.
\r
13 * You should have received a copy of the GPL along with this
\r
14 * program. If not, go to http://www.gnu.org/licenses/gpl.html
\r
15 * or write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
\r
20 package cx.fbn.nevernote.threads;
\r
22 import java.util.ArrayList;
\r
23 import java.util.List;
\r
24 import java.util.Vector;
\r
25 import java.util.concurrent.LinkedBlockingQueue;
\r
27 import com.evernote.edam.type.Note;
\r
28 import com.trolltech.qt.core.QMutex;
\r
29 import com.trolltech.qt.core.QObject;
\r
31 import cx.fbn.nevernote.filters.NotebookCounter;
\r
32 import cx.fbn.nevernote.filters.TagCounter;
\r
33 import cx.fbn.nevernote.signals.NotebookSignal;
\r
34 import cx.fbn.nevernote.signals.TagSignal;
\r
35 import cx.fbn.nevernote.signals.TrashSignal;
\r
36 import cx.fbn.nevernote.sql.DatabaseConnection;
\r
37 import cx.fbn.nevernote.utilities.ApplicationLogger;
\r
39 public class CounterRunner extends QObject implements Runnable {
\r
41 private class NoteRecord {
\r
42 public String notebookGuid;
\r
43 public Vector<String> tags;
\r
44 public boolean active;
\r
46 public NoteRecord() {
\r
47 tags = new Vector<String>();
\r
50 private final ApplicationLogger logger;
\r
51 private volatile boolean keepRunning;
\r
53 public volatile NotebookSignal notebookSignal;
\r
54 public volatile TrashSignal trashSignal;
\r
55 public volatile TagSignal tagSignal;
\r
56 private volatile Vector<NoteRecord> records;
\r
58 public QMutex threadLock;
\r
60 public static int EXIT=0;
\r
61 public static int NOTEBOOK=1;
\r
62 public static int TAG=2;
\r
63 public static int TRASH=3;
\r
65 public boolean ready = false;
\r
66 public boolean abortCount = false;
\r
67 private final DatabaseConnection conn;
\r
69 private volatile LinkedBlockingQueue<Integer> readyQueue = new LinkedBlockingQueue<Integer>();
\r
72 //*********************************************
\r
74 //*********************************************
\r
75 public CounterRunner(String logname, int t, String u, String i, String r, String uid, String pswd, String cpswd) {
\r
78 threadLock = new QMutex();
\r
79 logger = new ApplicationLogger(logname);
\r
80 // setAutoDelete(false);
\r
81 conn = new DatabaseConnection(logger, u, i, r, uid, pswd, cpswd, 300);
\r
83 notebookSignal = new NotebookSignal();
\r
84 tagSignal = new TagSignal();
\r
85 trashSignal = new TrashSignal();
\r
87 records = new Vector<NoteRecord>();
\r
92 //*********************************************
\r
94 //*********************************************
\r
97 boolean keepRunning = true;
\r
99 thread().setPriority(Thread.MIN_PRIORITY);
\r
100 while(keepRunning) {
\r
104 type = readyQueue.take();
\r
107 keepRunning = false;
\r
108 if (type == NOTEBOOK)
\r
109 countNotebookResults();
\r
113 countTrashResults();
\r
114 threadLock.unlock();
\r
115 } catch (InterruptedException e) {}
\r
122 public void setNoteIndex(List<Note> idx) {
\r
125 abortCount = false;
\r
128 for (int i=0; i<idx.size(); i++) {
\r
131 NoteRecord record = new NoteRecord();
\r
132 record.notebookGuid = new String(idx.get(i).getNotebookGuid());
\r
133 record.active = idx.get(i).isActive();
\r
134 for (int j=0; j<idx.get(i).getTagGuidsSize(); j++) {
\r
137 record.tags.add(new String(idx.get(i).getTagGuids().get(j)));
\r
139 records.add(record);
\r
142 threadLock.unlock();
\r
144 public void release(int type) {
\r
145 readyQueue.add(type);
\r
148 //*********************************************
\r
149 //* Getter & Setter method to tell the thread *
\r
150 //* to keep running. *
\r
151 //*********************************************
\r
152 public void setKeepRunning(boolean b) {
\r
155 public boolean keepRunning() {
\r
156 return keepRunning;
\r
160 //*********************************************
\r
161 //* Do the actual counting *
\r
162 //*********************************************
\r
163 private void countNotebookResults() {
\r
164 logger.log(logger.EXTREME, "Entering ListManager.countNotebookResults");
\r
167 List<NotebookCounter> nCounter = new ArrayList<NotebookCounter>();
\r
168 for (int i=0; i<records.size(); i++) {
\r
171 boolean found = false;
\r
172 for (int j=0; j<nCounter.size(); j++) {
\r
175 if (records.get(i).active && nCounter.get(j).getGuid().equals(records.get(i).notebookGuid)) {
\r
176 nCounter.get(j).setCount(nCounter.get(j).getCount()+1);
\r
181 if (!found && records.get(i).active) {
\r
182 NotebookCounter newCounter = new NotebookCounter();
\r
183 newCounter.setGuid(records.get(i).notebookGuid);
\r
184 newCounter.setCount(1);
\r
185 nCounter.add(newCounter);
\r
190 notebookSignal.countsChanged.emit(nCounter);
\r
191 logger.log(logger.EXTREME, "Leaving ListManager.countNotebookResults()");
\r
196 private void countTagResults() {
\r
197 logger.log(logger.EXTREME, "Entering ListManager.countTagResults");
\r
198 List<TagCounter> counter = new ArrayList<TagCounter>();
\r
199 List<Tag> allTags = conn.getTagTable().getAll();
\r
203 if (allTags == null)
\r
205 for (int k=0; k<allTags.size() && keepRunning; k++) {
\r
206 TagCounter newCounter = new TagCounter();
\r
207 newCounter.setGuid(allTags.get(k).getGuid());
\r
208 newCounter.setCount(0);
\r
209 counter.add(newCounter);
\r
212 if (type == TAG_ALL) {
\r
213 List<Pair<String, Integer>> tagCounts = conn.getNoteTable().noteTagsTable.getTagCounts();
\r
216 for (int i=0; tagCounts != null && i<tagCounts.size(); i++) {
\r
219 for (int j=0; j<counter.size(); j++) {
\r
222 if (tagCounts.get(i).getFirst().equals(counter.get(j).getGuid())) {
\r
225 counter.get(j).setCount(tagCounts.get(i).getSecond());
\r
232 tagSignal.countsChanged.emit(counter);
\r
239 List<cx.fbn.nevernote.sql.NoteTagsRecord> tags = conn.getNoteTable().noteTagsTable.getAllNoteTags();
\r
240 for (int i=noteIndex.size()-1; i>=0; i--) {
\r
243 String note = noteIndex.get(i);
\r
244 for (int x=0; tags!= null && x<tags.size() && keepRunning; x++) {
\r
247 String tag = tags.get(x).tagGuid;
\r
248 for (int j=0; j<counter.size() && keepRunning; j++) {
\r
251 if (counter.get(j).getGuid().equals(tag) && note.equals(tags.get(x).noteGuid)) {
\r
252 int c = counter.get(j).getCount()+1;
\r
253 counter.get(j).setCount(c);
\r
260 tagSignal.countsChanged.emit(counter);
\r
261 logger.log(logger.EXTREME, "Leaving ListManager.countTagResults()");
\r
263 private void countTagResults() {
\r
264 logger.log(logger.EXTREME, "Entering ListManager.countTagResults");
\r
267 List<TagCounter> tCounter = new ArrayList<TagCounter>();
\r
268 for (int i=0; i<records.size(); i++) {
\r
272 // Loop through the list of tags so we can count them
\r
273 Vector<String> tags = records.get(i).tags;
\r
274 for (int z=0; z<tags.size(); z++) {
\r
275 boolean found = false;
\r
276 for (int j=0; j<tCounter.size(); j++) {
\r
279 if (tCounter.get(j).getGuid().equals(tags.get(z))) {
\r
280 tCounter.get(j).setCount(tCounter.get(j).getCount()+1);
\r
286 TagCounter newCounter = new TagCounter();
\r
287 newCounter.setGuid(tags.get(z));
\r
288 newCounter.setCount(1);
\r
289 tCounter.add(newCounter);
\r
295 tagSignal.countsChanged.emit(tCounter);
\r
296 logger.log(logger.EXTREME, "Leaving ListManager.countTagResults");
\r
300 private void countTrashResults() {
\r
301 logger.log(logger.EXTREME, "Entering CounterRunner.countTrashResults()");
\r
306 for (int i=0; i<records.size(); i++) {
\r
309 if (!records.get(i).active)
\r
316 trashSignal.countChanged.emit(tCounter);
\r
317 logger.log(logger.EXTREME, "Leaving CounterRunner.countTrashResults()");
\r