package qa.qcri.aidr.trainer.api.service.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import qa.qcri.aidr.trainer.api.dao.ReportTemplateDao;
import qa.qcri.aidr.trainer.api.dao.TaskQueueResponseDao;
import qa.qcri.aidr.trainer.api.entity.ClientApp;
import qa.qcri.aidr.trainer.api.entity.ReportTemplate;
import qa.qcri.aidr.trainer.api.entity.TaskQueue;
import qa.qcri.aidr.trainer.api.entity.TaskQueueResponse;
import qa.qcri.aidr.trainer.api.service.ClientAppService;
import qa.qcri.aidr.trainer.api.service.GeoService;
import qa.qcri.aidr.trainer.api.service.TaskQueueService;
import qa.qcri.aidr.trainer.api.store.CodeLookUp;
import qa.qcri.aidr.trainer.api.store.StatusCodeType;
import qa.qcri.aidr.trainer.api.template.GeoJsonOutputModel;
/**
* Created with IntelliJ IDEA.
* User: jlucas
* Date: 1/18/14
* Time: 4:02 PM
* To change this template use File | Settings | File Templates.
*/
@Service("geoService")
@Transactional(readOnly = true)
public class GeoServiceImpl implements GeoService {
@Autowired
ClientAppService clientAppService;
@Autowired
TaskQueueService taskQueueService;
@Autowired
ReportTemplateDao reportTemplateDao;
@Autowired
TaskQueueResponseDao taskQueueResponseDao;
private JSONParser parser = new JSONParser();
@Override
public List<GeoJsonOutputModel> getGeoJsonOutput() throws Exception{
List<GeoJsonOutputModel> geoJsonOutputModels = new ArrayList<GeoJsonOutputModel>();
List<ClientApp> clientApps = clientAppService.findClientAppByAppType("appType",CodeLookUp.APP_MAP) ;
for(int i=0; i < clientApps.size(); i++){
ClientApp clientApp = clientApps.get(i);
List<TaskQueue> taskQueues = taskQueueService.getTaskQueueByClientAppStatus(clientApp.getClientAppID(), StatusCodeType.TASK_LIFECYCLE_COMPLETED);
geoJsonOutputModels = processTaskQueue(taskQueues, geoJsonOutputModels, null);
}
return geoJsonOutputModels; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public String getGeoJsonOuputJSONP(Date updated) throws Exception {
List<GeoJsonOutputModel> geoJsonOutputModels = new ArrayList<GeoJsonOutputModel>();
List<ClientApp> clientApps = clientAppService.findClientAppByAppType("appType",CodeLookUp.APP_MAP) ;
for(int i=0; i < clientApps.size(); i++){
ClientApp clientApp = clientApps.get(i);
List<TaskQueue> taskQueues = taskQueueService.getTaskQueueByClientAppStatus(clientApp.getClientAppID(), StatusCodeType.TASK_LIFECYCLE_COMPLETED);
geoJsonOutputModels = processTaskQueue(taskQueues, geoJsonOutputModels, updated);
}
JSONArray jsonArray = new JSONArray();
for(GeoJsonOutputModel item : geoJsonOutputModels) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("info", (JSONObject)parser.parse(item.getGeoJsonInfo()));
jsonObject.put("features", (JSONObject)parser.parse(item.getGeoJson()));
jsonArray.add(jsonObject);
}
String returnValue = "jsonp(" + jsonArray.toJSONString() + ");";
return returnValue;
}
@Override
public String getGeoJsonOuputJSON(Date updated) throws Exception {
List<GeoJsonOutputModel> geoJsonOutputModels = new ArrayList<GeoJsonOutputModel>();
List<ClientApp> clientApps = clientAppService.findClientAppByAppType("appType",CodeLookUp.APP_MAP) ;
for(int i=0; i < clientApps.size(); i++){
ClientApp clientApp = clientApps.get(i);
List<TaskQueue> taskQueues = taskQueueService.getTaskQueueByClientAppStatus(clientApp.getClientAppID(), StatusCodeType.TASK_LIFECYCLE_COMPLETED);
geoJsonOutputModels = processTaskQueue(taskQueues, geoJsonOutputModels, updated);
}
JSONArray jsonArray = new JSONArray();
for(GeoJsonOutputModel item : geoJsonOutputModels) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("info", (JSONObject)parser.parse(item.getGeoJsonInfo()));
jsonObject.put("features", (JSONObject)parser.parse(item.getGeoJson()));
jsonArray.add(jsonObject);
}
String returnValue = jsonArray.toJSONString() ;
return returnValue;
}
private List<GeoJsonOutputModel> processTaskQueue(List<TaskQueue> taskQueues, List<GeoJsonOutputModel> geoJsonOutputModels, Date updated) throws ParseException {
boolean isItOkToAdd = true;
for (TaskQueue element : taskQueues) {
isItOkToAdd = true;
List<TaskQueueResponse> taskQueueResponses = taskQueueResponseDao.getTaskQueueResponseByTaskQueueIDBasedOnLastUpdate(element.getTaskQueueID(), updated);
if(taskQueueResponses.size() > 0){
if(taskQueueResponses.get(0).getTaskInfo() != null){
if(!isEmptyGeoJson(taskQueueResponses.get(0).getResponse()) ){
List<ReportTemplate>templateList = reportTemplateDao.getReportTemplateSearchBy("tweetID", taskQueueResponses.get(0).getTaskInfo());
if(taskQueueResponses.size() > 0 && templateList.size() > 0 ){
GeoJsonOutputModel model = new GeoJsonOutputModel(templateList.get(0), taskQueueResponses.get(0));
if(model.getGeoJson().contains("No Location Information")){
JSONArray newFeatures = new JSONArray();
JSONArray features = (JSONArray)parser.parse(model.getGeoJson()) ;
for(int i =0; i < features.size(); i++){
if(!features.get(i).equals("No Location Information")){
newFeatures.add(features.get(i));
}
}
if(newFeatures.size() > 0){
model.setGeoJson(newFeatures.toJSONString());
}
else{
isItOkToAdd = false;
}
}
if(isItOkToAdd){
geoJsonOutputModels.add( model );
}
}
}
}
}
}
return geoJsonOutputModels;
}
private boolean isEmptyGeoJson(String jsonString){
boolean isEmpty = false;
//geometry
try{
JSONObject geometry = (JSONObject)parser.parse(jsonString) ;
if(geometry.size() == 0){
isEmpty = true;
}
JSONObject a = (JSONObject)geometry.get("geometry");
if(a.size() == 0){
isEmpty = true;
}
}
catch(Exception e){
isEmpty = true;
}
return isEmpty;
}
}