cx.fbn.nevernote.threads.ENThumbnailRunner.java Source code

Java tutorial

Introduction

Here is the source code for cx.fbn.nevernote.threads.ENThumbnailRunner.java

Source

/*
 * 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.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import com.evernote.edam.type.User;
import com.trolltech.qt.core.QByteArray;
import com.trolltech.qt.core.QMutex;
import com.trolltech.qt.core.QObject;
import com.trolltech.qt.gui.QPixmap;

import cx.fbn.nevernote.Global;
import cx.fbn.nevernote.oauth.OAuthTokenizer;
import cx.fbn.nevernote.signals.ENThumbnailSignal;
import cx.fbn.nevernote.signals.LimitSignal;
import cx.fbn.nevernote.sql.DatabaseConnection;
import cx.fbn.nevernote.utilities.AESEncrypter;
import cx.fbn.nevernote.utilities.ApplicationLogger;

public class ENThumbnailRunner extends QObject implements Runnable {

    private final ApplicationLogger logger;
    private final DatabaseConnection conn;
    public volatile ENThumbnailSignal enThumbnailSignal;
    public QMutex mutex;
    private volatile boolean keepRunning;
    private volatile LinkedBlockingQueue<String> workQueue;
    public volatile LimitSignal limitSignal;
    private volatile User user;
    private volatile String serverUrl;

    public ENThumbnailRunner(String logname, int t, String u, String i, String r, String b, String uid, String pswd,
            String cpswd) {
        this.logger = new ApplicationLogger(logname);
        this.conn = new DatabaseConnection(logger, u, i, r, b, uid, pswd, cpswd, 0);
        this.enThumbnailSignal = new ENThumbnailSignal();
        this.mutex = new QMutex();
        this.keepRunning = true;
        this.workQueue = new LinkedBlockingQueue<String>();
        this.limitSignal = new LimitSignal();
        this.user = new User();
        this.serverUrl = "";
    }

    @Override
    public void run() {
        thread().setPriority(Thread.MIN_PRIORITY);

        logger.log(logger.MEDIUM, "ENThumbnail");
        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);

                    QByteArray thumbnailData = getENThumbnailData(guid);
                    if (thumbnailData == null) { // ??
                        logger.log(logger.EXTREME, "Evernote????");
                    } else {
                        QPixmap thumbnail_p = new QPixmap();
                        thumbnail_p.loadFromData(thumbnailData);
                        logger.log(logger.EXTREME, "Evernote?????");
                        saveImage(thumbnail_p, guid);
                        registImage(thumbnailData, guid);
                    }

                    enThumbnailSignal.getENThumbnailFinished.emit(guid);
                    logger.log(logger.EXTREME, "Evernote?? guid = " + guid);
                } else if (work.startsWith("STOP")) {
                    logger.log(logger.MEDIUM, "ENThumbnail?");
                    keepRunning = false;
                }
                mutex.unlock();
            } catch (InterruptedException e) {
                // TODO ??? catch 
                e.printStackTrace();
            }
        }
    }

    // Evernote????
    private synchronized QByteArray getENThumbnailData(String guid) {
        // ?Evernote???
        String shardId = user.getShardId();
        if (shardId == null || shardId.equals("")) {
            return null;
        }

        OAuthTokenizer tokenizer = new OAuthTokenizer();
        AESEncrypter aes = new AESEncrypter();
        try {
            aes.decrypt(new FileInputStream(Global.getFileManager().getHomeDirFile("oauthkey.txt")));
        } catch (FileNotFoundException e) {
            logger.log(logger.HIGH, "Evernote???FileNotFoundException");
            e.printStackTrace();
            return null;
        }
        String authString = aes.getString();
        String oauthToken = new String();
        if (!authString.equals("")) {
            tokenizer.tokenize(authString);
            oauthToken = tokenizer.oauth_token;
        }

        HttpClient httpClient = new DefaultHttpClient();

        HttpPost httpPost = new HttpPost(
                "https://" + serverUrl + "/shard/" + user.getShardId() + "/thm/note/" + guid + ".png");
        httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
        httpPost.setHeader("Host", getServerUrl());

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("auth", oauthToken));
        nameValuePairs.add(new BasicNameValuePair("size", "80"));

        QByteArray data = new QByteArray();
        try {
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            // Web?????
            HttpResponse response = null;
            response = httpClient.execute(httpPost);
            byte[] bytes = EntityUtils.toByteArray(response.getEntity());
            data = new QByteArray(bytes);
        } catch (UnsupportedEncodingException e) {
            logger.log(logger.HIGH,
                    "Evernote???UnsupportedEncodingException");
            e.printStackTrace();
            return null;
        } catch (ClientProtocolException e) {
            logger.log(logger.HIGH, "Evernote???ClientProtocolException");
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            logger.log(logger.HIGH, "Evernote???IOException");
            e.printStackTrace();
            return null;
        } finally {
            httpClient.getConnectionManager().shutdown();
        }

        return data;
    }

    // ?png?????res??
    private synchronized void saveImage(QPixmap thumbnail, String guid) {
        String thumbnailName = Global.getFileManager().getResDirPath("enThumbnail-" + guid + ".png");
        thumbnail.save(thumbnailName, "PNG");
    }

    // ????
    private synchronized void registImage(QByteArray data, String guid) {
        conn.getNoteTable().setENThumbnail(guid, data);
    }

    public boolean isKeepRunning() {
        return keepRunning;
    }

    public void setKeepRunning(boolean keepRunning) {
        this.keepRunning = keepRunning;
    }

    public boolean addGuid(String guid) {
        if (workQueue.offer("GET " + guid)) {
            return true;
        }

        return false;
    }

    public boolean addStop() {
        if (workQueue.offer("STOP")) {
            return true;
        }
        return false;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getServerUrl() {
        return serverUrl;
    }

    public void setServerUrl(String serverUrl) {
        this.serverUrl = serverUrl;
    }
}