/*
* Copyright 2014 Artem Chikin
* Copyright 2014 Artem Herasymchuk
* Copyright 2014 Tom Krywitsky
* Copyright 2014 Henry Pabst
* Copyright 2014 Bradley Simons
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ca.ualberta.cmput301w14t08.geochan.runnables;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import ca.ualberta.cmput301w14t08.geochan.helpers.ElasticSearchClient;
import ca.ualberta.cmput301w14t08.geochan.helpers.ElasticSearchQueries;
import ca.ualberta.cmput301w14t08.geochan.helpers.GsonHelper;
import ca.ualberta.cmput301w14t08.geochan.managers.CacheManager;
import ca.ualberta.cmput301w14t08.geochan.models.Comment;
import ca.ualberta.cmput301w14t08.geochan.models.CommentList;
import ca.ualberta.cmput301w14t08.geochan.models.ElasticSearchDocs;
import ca.ualberta.cmput301w14t08.geochan.models.ElasticSearchResponse;
import ca.ualberta.cmput301w14t08.geochan.models.ThreadComment;
import ca.ualberta.cmput301w14t08.geochan.models.ThreadList;
import ca.ualberta.cmput301w14t08.geochan.tasks.GetCommentsTask;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/**
* Runnable for retrieving a comment objects in a separate thread of execution
* from ElasticSearch.
*
* @author Artem Herasymchuk
*
*/
public class GetCommentsRunnable implements Runnable {
private GetCommentsTask task;
public static final int STATE_GET_COMMENTS_FAILED = -1;
public static final int STATE_GET_COMMENTS_RUNNING = 0;
public static final int STATE_GET_COMMENTS_COMPLETE = 1;
public GetCommentsRunnable(GetCommentsTask task) {
this.task = task;
}
/**
* Forms a query and sends a multi-Get request to ES, then processes the
* retrieved data into a CommentList object and saves it into an array.
* Then, puts the comment object in the right place in the corresponding
* commentList to be later reconstructed into a correct hierarchy of
* comments.
*/
@Override
public void run() {
task.setGetCommentsThread(Thread.currentThread());
android.os.Process
.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
HttpURLConnection connection = null;
try {
if (Thread.interrupted()) {
throw new InterruptedException();
}
task.handleGetCommentsState(STATE_GET_COMMENTS_RUNNING);
CommentList commentList = task.getCommentListCache();
ArrayList<String> idList = new ArrayList<String>();
commentList.getIdsFromList(commentList, idList);
if (Thread.interrupted()) {
throw new InterruptedException();
}
String json = ElasticSearchQueries.commentsScript(idList);
String server = ElasticSearchClient.URL + "/"
+ ElasticSearchClient.URL_INDEX + "/"
+ ElasticSearchClient.TYPE_COMMENT + "/_mget";
URL url = new URL(server);
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("GET");
DataOutputStream writeStream = new DataOutputStream(
connection.getOutputStream());
writeStream.writeBytes(json);
writeStream.flush();
writeStream.close();
if (Thread.interrupted()) {
throw new InterruptedException();
}
StringBuffer response = new StringBuffer();
BufferedReader in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
if (Thread.interrupted()) {
throw new InterruptedException();
}
String responseJson = response.toString();
Gson gson = GsonHelper.getOnlineGson();
Type elasticSearchDocsType = new TypeToken<ElasticSearchDocs<Comment>>() {
}.getType();
ElasticSearchDocs<Comment> esResponse = gson.fromJson(responseJson,
elasticSearchDocsType);
ArrayList<Comment> list = new ArrayList<Comment>();
for (ElasticSearchResponse<Comment> r : esResponse.getDocs()) {
Comment object = r.getSource();
list.add(object);
}
for (Comment comment : list) {
commentList.findCommentListById(commentList, comment.getId())
.setComment(comment);
}
ThreadComment threadComment = ThreadList.getThreads().get(
task.getThreadIndex());
Comment bodyComment = threadComment.getBodyComment();
threadComment.setBodyComment(commentList.reconsructFromCommentList(
commentList, bodyComment));
CacheManager.getInstance()
.serializeThreadCommentById(threadComment);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (connection == null || (connection.getResponseCode() != 200)) {
task.handleGetCommentsState(STATE_GET_COMMENTS_FAILED);
} else {
task.handleGetCommentsState(STATE_GET_COMMENTS_COMPLETE);
}
} catch (IOException e) {
task.handleGetCommentsState(STATE_GET_COMMENTS_FAILED);
}
connection.disconnect();
Thread.interrupted();
}
}
}